"""Tests de Bus, CardInstance, Topology.""" from __future__ import annotations import pytest from pydantic import ValidationError from vmssailor.core import ( Bus, BusRole, CardInstance, Protocol, Topology, ) def test_bus_modbus_rtu_ok() -> None: Bus(id="b", name="b", protocol=Protocol.MODBUS_RTU, physical_port="COM3") def test_bus_invalid_protocol_rejected() -> None: with pytest.raises(ValidationError): Bus(id="b", name="b", protocol=Protocol.J1939, physical_port="COM3") def test_card_slave_requires_modbus_addr() -> None: with pytest.raises(ValidationError): CardInstance( id="c", slot_number=1, bus_id="bm", bus_role=BusRole.MODBUS_SLAVE ) def test_card_n2k_node_no_modbus_addr() -> None: CardInstance( id="c", slot_number=1, bus_id="bm", bus_role=BusRole.NMEA2000_NODE ) with pytest.raises(ValidationError): CardInstance( id="c", slot_number=1, bus_id="bm", bus_role=BusRole.NMEA2000_NODE, modbus_address=5, ) def test_topology_unique_slots_per_bus() -> None: b = Bus(id="bm", name="bm", protocol=Protocol.MODBUS_RTU, physical_port="COM3") c1 = CardInstance( id="c1", slot_number=1, bus_id="bm", bus_role=BusRole.MODBUS_SLAVE, modbus_address=1, ) c2 = CardInstance( id="c2", slot_number=1, bus_id="bm", bus_role=BusRole.MODBUS_SLAVE, modbus_address=2, ) with pytest.raises(ValidationError): Topology(buses=[b], cards=[c1, c2]) def test_topology_unique_modbus_addresses_per_bus() -> None: b = Bus(id="bm", name="bm", protocol=Protocol.MODBUS_RTU, physical_port="COM3") c1 = CardInstance( id="c1", slot_number=1, bus_id="bm", bus_role=BusRole.MODBUS_SLAVE, modbus_address=5, ) c2 = CardInstance( id="c2", slot_number=2, bus_id="bm", bus_role=BusRole.MODBUS_SLAVE, modbus_address=5, ) with pytest.raises(ValidationError): Topology(buses=[b], cards=[c1, c2]) def test_topology_card_references_existing_bus() -> None: b = Bus(id="bm", name="bm", protocol=Protocol.MODBUS_RTU, physical_port="COM3") c = CardInstance( id="c", slot_number=1, bus_id="other_bus", bus_role=BusRole.MODBUS_SLAVE, modbus_address=1, ) with pytest.raises(ValidationError): Topology(buses=[b], cards=[c]) def test_topology_helpers(sample_topology: Topology) -> None: assert sample_topology.bus_by_id("bus_main") is not None assert sample_topology.bus_by_id("nope") is None assert sample_topology.card_by_id("card_001") is not None assert sample_topology.card_by_id("nope") is None