[Port / PortList] raise PortError on missing port name
This commit is contained in:
parent
b44c962e07
commit
ffbe15c465
2 changed files with 49 additions and 0 deletions
|
|
@ -328,6 +328,9 @@ class PortList(metaclass=ABCMeta):
|
||||||
duplicates = (set(self.ports.keys()) - set(mapping.keys())) & set(mapping.values())
|
duplicates = (set(self.ports.keys()) - set(mapping.keys())) & set(mapping.values())
|
||||||
if duplicates:
|
if duplicates:
|
||||||
raise PortError(f'Unrenamed ports would be overwritten: {duplicates}')
|
raise PortError(f'Unrenamed ports would be overwritten: {duplicates}')
|
||||||
|
missing = set(mapping) - set(self.ports)
|
||||||
|
if missing:
|
||||||
|
raise PortError(f'Ports to rename were not found: {missing}')
|
||||||
|
|
||||||
for kk, vv in mapping.items():
|
for kk, vv in mapping.items():
|
||||||
if vv is None or vv != kk:
|
if vv is None or vv != kk:
|
||||||
|
|
@ -395,6 +398,14 @@ class PortList(metaclass=ABCMeta):
|
||||||
Raises:
|
Raises:
|
||||||
`PortError` if the ports are not properly aligned.
|
`PortError` if the ports are not properly aligned.
|
||||||
"""
|
"""
|
||||||
|
if not connections:
|
||||||
|
raise PortError('Must provide at least one port connection')
|
||||||
|
missing_a = set(connections) - set(self.ports)
|
||||||
|
if missing_a:
|
||||||
|
raise PortError(f'Connection source ports were not found: {missing_a}')
|
||||||
|
missing_b = set(connections.values()) - set(self.ports)
|
||||||
|
if missing_b:
|
||||||
|
raise PortError(f'Connection destination ports were not found: {missing_b}')
|
||||||
a_names, b_names = list(zip(*connections.items(), strict=True))
|
a_names, b_names = list(zip(*connections.items(), strict=True))
|
||||||
a_ports = [self.ports[pp] for pp in a_names]
|
a_ports = [self.ports[pp] for pp in a_names]
|
||||||
b_ports = [self.ports[pp] for pp in b_names]
|
b_ports = [self.ports[pp] for pp in b_names]
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,25 @@ def test_port_list_rename() -> None:
|
||||||
assert "B" in pl.ports
|
assert "B" in pl.ports
|
||||||
|
|
||||||
|
|
||||||
|
def test_port_list_rename_missing_port_raises() -> None:
|
||||||
|
class MyPorts(PortList):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self._ports = {"A": Port((0, 0), 0)}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ports(self) -> dict[str, Port]:
|
||||||
|
return self._ports
|
||||||
|
|
||||||
|
@ports.setter
|
||||||
|
def ports(self, val: dict[str, Port]) -> None:
|
||||||
|
self._ports = val
|
||||||
|
|
||||||
|
pl = MyPorts()
|
||||||
|
with pytest.raises(PortError, match="Ports to rename were not found"):
|
||||||
|
pl.rename_ports({"missing": "B"})
|
||||||
|
assert set(pl.ports) == {"A"}
|
||||||
|
|
||||||
|
|
||||||
def test_port_list_plugged() -> None:
|
def test_port_list_plugged() -> None:
|
||||||
class MyPorts(PortList):
|
class MyPorts(PortList):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
@ -88,6 +107,25 @@ def test_port_list_plugged() -> None:
|
||||||
assert not pl.ports # Both should be removed
|
assert not pl.ports # Both should be removed
|
||||||
|
|
||||||
|
|
||||||
|
def test_port_list_plugged_empty_raises() -> None:
|
||||||
|
class MyPorts(PortList):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self._ports = {"A": Port((10, 10), 0), "B": Port((10, 10), pi)}
|
||||||
|
|
||||||
|
@property
|
||||||
|
def ports(self) -> dict[str, Port]:
|
||||||
|
return self._ports
|
||||||
|
|
||||||
|
@ports.setter
|
||||||
|
def ports(self, val: dict[str, Port]) -> None:
|
||||||
|
self._ports = val
|
||||||
|
|
||||||
|
pl = MyPorts()
|
||||||
|
with pytest.raises(PortError, match="Must provide at least one port connection"):
|
||||||
|
pl.plugged({})
|
||||||
|
assert set(pl.ports) == {"A", "B"}
|
||||||
|
|
||||||
|
|
||||||
def test_port_list_plugged_mismatch() -> None:
|
def test_port_list_plugged_mismatch() -> None:
|
||||||
class MyPorts(PortList):
|
class MyPorts(PortList):
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue