Skip to content

Commit 4d25245

Browse files
authored
Fix inheritance for problematic electrical components (#236)
Make problematic battery, EV charger and inverter classes inherit from `ProblematicElectricalComponent`.
2 parents 436141f + afb3a12 commit 4d25245

6 files changed

Lines changed: 168 additions & 6 deletions

File tree

src/frequenz/client/common/microgrid/electrical_components/_battery.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import Any, Self, TypeAlias
88

99
from ._electrical_component import ElectricalComponent
10+
from ._problematic import ProblematicElectricalComponent
1011

1112

1213
@dataclasses.dataclass(frozen=True, kw_only=True)
@@ -22,7 +23,7 @@ def __new__(cls, *args: Any, **kwargs: Any) -> Self:
2223

2324

2425
@dataclasses.dataclass(frozen=True, kw_only=True)
25-
class UnspecifiedBattery(Battery):
26+
class UnspecifiedBattery(Battery, ProblematicElectricalComponent):
2627
"""A battery of an unspecified type."""
2728

2829

@@ -37,7 +38,7 @@ class NaIonBattery(Battery):
3738

3839

3940
@dataclasses.dataclass(frozen=True, kw_only=True)
40-
class UnrecognizedBattery(Battery):
41+
class UnrecognizedBattery(Battery, ProblematicElectricalComponent):
4142
"""A battery of an unrecognized type."""
4243

4344
type: int

src/frequenz/client/common/microgrid/electrical_components/_ev_charger.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import Any, Self, TypeAlias
88

99
from ._electrical_component import ElectricalComponent
10+
from ._problematic import ProblematicElectricalComponent
1011

1112

1213
@dataclasses.dataclass(frozen=True, kw_only=True)
@@ -22,7 +23,7 @@ def __new__(cls, *args: Any, **kwargs: Any) -> Self:
2223

2324

2425
@dataclasses.dataclass(frozen=True, kw_only=True)
25-
class UnspecifiedEvCharger(EvCharger):
26+
class UnspecifiedEvCharger(EvCharger, ProblematicElectricalComponent):
2627
"""An EV charger of an unspecified type."""
2728

2829

@@ -42,7 +43,7 @@ class HybridEvCharger(EvCharger):
4243

4344

4445
@dataclasses.dataclass(frozen=True, kw_only=True)
45-
class UnrecognizedEvCharger(EvCharger):
46+
class UnrecognizedEvCharger(EvCharger, ProblematicElectricalComponent):
4647
"""An EV charger of an unrecognized type."""
4748

4849
type: int

src/frequenz/client/common/microgrid/electrical_components/_inverter.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from typing import Any, Self, TypeAlias
88

99
from ._electrical_component import ElectricalComponent
10+
from ._problematic import ProblematicElectricalComponent
1011

1112

1213
@dataclasses.dataclass(frozen=True, kw_only=True)
@@ -22,7 +23,7 @@ def __new__(cls, *args: Any, **kwargs: Any) -> Self:
2223

2324

2425
@dataclasses.dataclass(frozen=True, kw_only=True)
25-
class UnspecifiedInverter(Inverter):
26+
class UnspecifiedInverter(Inverter, ProblematicElectricalComponent):
2627
"""An inverter of an unspecified type."""
2728

2829

@@ -42,7 +43,7 @@ class HybridInverter(Inverter):
4243

4344

4445
@dataclasses.dataclass(frozen=True, kw_only=True)
45-
class UnrecognizedInverter(Inverter):
46+
class UnrecognizedInverter(Inverter, ProblematicElectricalComponent):
4647
"""An inverter of an unrecognized type."""
4748

4849
type: int

tests/microgrid/electrical_components/test_battery.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
ElectricalComponentId,
1212
LiIonBattery,
1313
NaIonBattery,
14+
ProblematicElectricalComponent,
1415
UnrecognizedBattery,
1516
UnspecifiedBattery,
1617
)
@@ -85,3 +86,55 @@ def test_unrecognized_battery_type(
8586
assert battery.microgrid_id == microgrid_id
8687
assert battery.name == "unrecognized_battery"
8788
assert battery.type == 999
89+
90+
91+
def test_unspecified_battery_is_problematic(
92+
component_id: ElectricalComponentId, microgrid_id: MicrogridId
93+
) -> None:
94+
"""Test that `UnspecifiedBattery` is a `ProblematicElectricalComponent`."""
95+
battery = UnspecifiedBattery(
96+
id=component_id,
97+
microgrid_id=microgrid_id,
98+
_provides_telemetry=True,
99+
_accepts_control=True,
100+
_allow_construction=True,
101+
)
102+
103+
assert isinstance(battery, ProblematicElectricalComponent)
104+
assert isinstance(battery, Battery)
105+
106+
107+
def test_unrecognized_battery_is_problematic(
108+
component_id: ElectricalComponentId, microgrid_id: MicrogridId
109+
) -> None:
110+
"""Test that `UnrecognizedBattery` is a `ProblematicElectricalComponent`."""
111+
battery = UnrecognizedBattery(
112+
id=component_id,
113+
microgrid_id=microgrid_id,
114+
type=999,
115+
_provides_telemetry=True,
116+
_accepts_control=True,
117+
_allow_construction=True,
118+
)
119+
120+
assert isinstance(battery, ProblematicElectricalComponent)
121+
assert isinstance(battery, Battery)
122+
123+
124+
@pytest.mark.parametrize("cls", [LiIonBattery, NaIonBattery])
125+
def test_recognized_battery_types_are_not_problematic(
126+
cls: type[LiIonBattery | NaIonBattery],
127+
component_id: ElectricalComponentId,
128+
microgrid_id: MicrogridId,
129+
) -> None:
130+
"""Test that recognized battery types are NOT `ProblematicElectricalComponent`."""
131+
battery = cls(
132+
id=component_id,
133+
microgrid_id=microgrid_id,
134+
_provides_telemetry=True,
135+
_accepts_control=True,
136+
_allow_construction=True,
137+
)
138+
139+
assert not isinstance(battery, ProblematicElectricalComponent)
140+
assert isinstance(battery, Battery)

tests/microgrid/electrical_components/test_ev_charger.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
ElectricalComponentId,
1313
EvCharger,
1414
HybridEvCharger,
15+
ProblematicElectricalComponent,
1516
UnrecognizedEvCharger,
1617
UnspecifiedEvCharger,
1718
)
@@ -86,3 +87,55 @@ def test_unrecognized_ev_charger_type(
8687
assert charger.microgrid_id == microgrid_id
8788
assert charger.name == "unrecognized_charger"
8889
assert charger.type == 999
90+
91+
92+
def test_unspecified_ev_charger_is_problematic(
93+
component_id: ElectricalComponentId, microgrid_id: MicrogridId
94+
) -> None:
95+
"""Test that `UnspecifiedEvCharger` is a `ProblematicElectricalComponent`."""
96+
charger = UnspecifiedEvCharger(
97+
id=component_id,
98+
microgrid_id=microgrid_id,
99+
_provides_telemetry=True,
100+
_accepts_control=True,
101+
_allow_construction=True,
102+
)
103+
104+
assert isinstance(charger, ProblematicElectricalComponent)
105+
assert isinstance(charger, EvCharger)
106+
107+
108+
def test_unrecognized_ev_charger_is_problematic(
109+
component_id: ElectricalComponentId, microgrid_id: MicrogridId
110+
) -> None:
111+
"""Test that `UnrecognizedEvCharger` is a `ProblematicElectricalComponent`."""
112+
charger = UnrecognizedEvCharger(
113+
id=component_id,
114+
microgrid_id=microgrid_id,
115+
type=999,
116+
_provides_telemetry=True,
117+
_accepts_control=True,
118+
_allow_construction=True,
119+
)
120+
121+
assert isinstance(charger, ProblematicElectricalComponent)
122+
assert isinstance(charger, EvCharger)
123+
124+
125+
@pytest.mark.parametrize("cls", [AcEvCharger, DcEvCharger, HybridEvCharger])
126+
def test_recognized_ev_charger_types_are_not_problematic(
127+
cls: type[AcEvCharger | DcEvCharger | HybridEvCharger],
128+
component_id: ElectricalComponentId,
129+
microgrid_id: MicrogridId,
130+
) -> None:
131+
"""Test that recognized EV charger types are NOT `ProblematicElectricalComponent`."""
132+
charger = cls(
133+
id=component_id,
134+
microgrid_id=microgrid_id,
135+
_provides_telemetry=True,
136+
_accepts_control=True,
137+
_allow_construction=True,
138+
)
139+
140+
assert not isinstance(charger, ProblematicElectricalComponent)
141+
assert isinstance(charger, EvCharger)

tests/microgrid/electrical_components/test_inverter.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
ElectricalComponentId,
1212
HybridInverter,
1313
Inverter,
14+
ProblematicElectricalComponent,
1415
PvInverter,
1516
UnrecognizedInverter,
1617
UnspecifiedInverter,
@@ -86,3 +87,55 @@ def test_unrecognized_inverter_type(
8687
assert inverter.microgrid_id == microgrid_id
8788
assert inverter.name == "unrecognized_inverter"
8889
assert inverter.type == 999
90+
91+
92+
def test_unspecified_inverter_is_problematic(
93+
component_id: ElectricalComponentId, microgrid_id: MicrogridId
94+
) -> None:
95+
"""Test that `UnspecifiedInverter` is a `ProblematicElectricalComponent`."""
96+
inverter = UnspecifiedInverter(
97+
id=component_id,
98+
microgrid_id=microgrid_id,
99+
_provides_telemetry=True,
100+
_accepts_control=True,
101+
_allow_construction=True,
102+
)
103+
104+
assert isinstance(inverter, ProblematicElectricalComponent)
105+
assert isinstance(inverter, Inverter)
106+
107+
108+
def test_unrecognized_inverter_is_problematic(
109+
component_id: ElectricalComponentId, microgrid_id: MicrogridId
110+
) -> None:
111+
"""Test that `UnrecognizedInverter` is a `ProblematicElectricalComponent`."""
112+
inverter = UnrecognizedInverter(
113+
id=component_id,
114+
microgrid_id=microgrid_id,
115+
type=999,
116+
_provides_telemetry=True,
117+
_accepts_control=True,
118+
_allow_construction=True,
119+
)
120+
121+
assert isinstance(inverter, ProblematicElectricalComponent)
122+
assert isinstance(inverter, Inverter)
123+
124+
125+
@pytest.mark.parametrize("cls", [BatteryInverter, PvInverter, HybridInverter])
126+
def test_recognized_inverter_types_are_not_problematic(
127+
cls: type[BatteryInverter | PvInverter | HybridInverter],
128+
component_id: ElectricalComponentId,
129+
microgrid_id: MicrogridId,
130+
) -> None:
131+
"""Test that recognized inverter types are NOT `ProblematicElectricalComponent`."""
132+
inverter = cls(
133+
id=component_id,
134+
microgrid_id=microgrid_id,
135+
_provides_telemetry=True,
136+
_accepts_control=True,
137+
_allow_construction=True,
138+
)
139+
140+
assert not isinstance(inverter, ProblematicElectricalComponent)
141+
assert isinstance(inverter, Inverter)

0 commit comments

Comments
 (0)