Skip to content

Commit 824bb0c

Browse files
committed
Update tests to work with new formula engine interface
Signed-off-by: Sahas Subramanian <[email protected]>
1 parent b9e3d79 commit 824bb0c

File tree

6 files changed

+64
-58
lines changed

6 files changed

+64
-58
lines changed

examples/power_distribution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ async def run() -> None:
230230

231231
client_actor = DataCollectingActor(
232232
request_channel=power_dist_req_chan.new_sender(),
233-
active_power_data=await logical_meter.grid_power(),
233+
active_power_data=logical_meter.grid_power().new_receiver(),
234234
)
235235

236236
await actor.run(service_actor, client_actor, power_distributor)

tests/timeseries/_formula_engine/test_formula_composition.py

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ async def test_formula_composition( # pylint: disable=too-many-locals
2929
await mockgrid.start(mocker)
3030
logical_meter = microgrid.logical_meter()
3131

32-
main_meter_recv = await get_resampled_stream(
32+
main_meter_recv = get_resampled_stream(
3333
4,
3434
ComponentMetricId.ACTIVE_POWER,
3535
)
36-
grid_power_recv = await logical_meter.grid_power()
37-
battery_power_recv = await logical_meter.battery_power()
38-
pv_power_recv = await logical_meter.pv_power()
36+
grid_power_recv = logical_meter.grid_power().new_receiver()
37+
battery_power_recv = logical_meter.battery_power().new_receiver()
38+
pv_power_recv = logical_meter.pv_power().new_receiver()
3939

40-
engine = (pv_power_recv.clone() + battery_power_recv.clone()).build("inv_power")
40+
engine = (logical_meter.pv_power() + logical_meter.battery_power()).build(
41+
"inv_power"
42+
)
4143
inv_calc_recv = engine.new_receiver()
4244

4345
count = 0
@@ -69,9 +71,11 @@ async def test_formula_composition_missing_pv(self, mocker: MockerFixture) -> No
6971
await mockgrid.start(mocker)
7072
logical_meter = microgrid.logical_meter()
7173

72-
battery_power_recv = await logical_meter.battery_power()
73-
pv_power_recv = await logical_meter.pv_power()
74-
engine = (pv_power_recv.clone() + battery_power_recv.clone()).build("inv_power")
74+
battery_power_recv = logical_meter.battery_power().new_receiver()
75+
pv_power_recv = logical_meter.pv_power().new_receiver()
76+
engine = (logical_meter.pv_power() + logical_meter.battery_power()).build(
77+
"inv_power"
78+
)
7579
inv_calc_recv = engine.new_receiver()
7680

7781
count = 0
@@ -96,9 +100,11 @@ async def test_formula_composition_missing_bat(self, mocker: MockerFixture) -> N
96100
await mockgrid.start(mocker)
97101
logical_meter = microgrid.logical_meter()
98102

99-
battery_power_recv = await logical_meter.battery_power()
100-
pv_power_recv = await logical_meter.pv_power()
101-
engine = (pv_power_recv.clone() + battery_power_recv.clone()).build("inv_power")
103+
battery_power_recv = logical_meter.battery_power().new_receiver()
104+
pv_power_recv = logical_meter.pv_power().new_receiver()
105+
engine = (logical_meter.pv_power() + logical_meter.battery_power()).build(
106+
"inv_power"
107+
)
102108
inv_calc_recv = engine.new_receiver()
103109

104110
count = 0
@@ -125,12 +131,10 @@ async def test_3_phase_formulas(self, mocker: MockerFixture) -> None:
125131
logical_meter = microgrid.logical_meter()
126132
ev_pool = microgrid.ev_charger_pool()
127133

128-
grid_current_recv = await logical_meter.grid_current()
129-
ev_current_recv = await ev_pool.current()
134+
grid_current_recv = logical_meter.grid_current().new_receiver()
135+
ev_current_recv = ev_pool.current().new_receiver()
130136

131-
engine = (grid_current_recv.clone() - ev_current_recv.clone()).build(
132-
"net_current"
133-
)
137+
engine = (logical_meter.grid_current() - ev_pool.current()).build("net_current")
134138
net_current_recv = engine.new_receiver()
135139

136140
await synchronize_receivers(

tests/timeseries/_formula_engine/utils.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,17 @@
77

88
from datetime import datetime
99
from math import isclose
10+
from typing import overload
1011

1112
from frequenz.channels import Receiver
1213

1314
from frequenz.sdk.microgrid import _data_pipeline
1415
from frequenz.sdk.microgrid.component import ComponentMetricId
1516
from frequenz.sdk.timeseries import Sample, Sample3Phase
16-
from frequenz.sdk.timeseries._formula_engine import (
17-
FormulaReceiver,
18-
FormulaReceiver3Phase,
19-
ResampledFormulaBuilder,
20-
)
17+
from frequenz.sdk.timeseries._formula_engine import ResampledFormulaBuilder
2118

2219

23-
async def get_resampled_stream( # pylint: disable=too-many-arguments
20+
def get_resampled_stream( # pylint: disable=too-many-arguments
2421
comp_id: int,
2522
metric_id: ComponentMetricId,
2623
) -> Receiver[Sample]:
@@ -36,7 +33,7 @@ async def get_resampled_stream( # pylint: disable=too-many-arguments
3633
_data_pipeline._get()._resampling_request_sender(),
3734
metric_id,
3835
)
39-
return await builder._get_resampled_receiver(
36+
return builder._get_resampled_receiver(
4037
comp_id,
4138
metric_id,
4239
)
@@ -52,16 +49,28 @@ def equal_float_lists(list1: list[float], list2: list[float]) -> bool:
5249
)
5350

5451

52+
@overload
5553
async def synchronize_receivers(
56-
receivers: list[FormulaReceiver | FormulaReceiver3Phase | Receiver[Sample]],
54+
receivers: list[Receiver[Sample]],
55+
) -> None:
56+
...
57+
58+
59+
@overload
60+
async def synchronize_receivers(
61+
receivers: list[Receiver[Sample3Phase]],
62+
) -> None:
63+
...
64+
65+
66+
async def synchronize_receivers(
67+
receivers: list[Receiver[Sample]] | list[Receiver[Sample3Phase]],
5768
) -> None:
5869
"""Check if given receivers are all returning the same timestamp.
5970
6071
If not, try to synchronize them.
6172
"""
62-
by_ts: dict[
63-
datetime, list[FormulaReceiver | FormulaReceiver3Phase | Receiver[Sample]]
64-
] = {}
73+
by_ts: dict[datetime, list[Receiver[Sample] | Receiver[Sample3Phase]]] = {}
6574
for recv in receivers:
6675
while True:
6776
sample = await recv.receive()

tests/timeseries/test_ev_charger_pool.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,12 @@ async def test_ev_power( # pylint: disable=too-many-locals
9292

9393
ev_pool = microgrid.ev_charger_pool()
9494

95-
main_meter_recv = await get_resampled_stream(
95+
main_meter_recv = get_resampled_stream(
9696
mockgrid.main_meter_id,
9797
ComponentMetricId.ACTIVE_POWER,
9898
)
99-
grid_power_recv = await logical_meter.grid_power()
100-
ev_power_recv = await ev_pool.power()
99+
grid_power_recv = logical_meter.grid_power().new_receiver()
100+
ev_power_recv = ev_pool.power().new_receiver()
101101

102102
await synchronize_receivers([grid_power_recv, main_meter_recv, ev_power_recv])
103103

@@ -158,7 +158,7 @@ async def mock_current_streams(
158158
mock_current_streams,
159159
)
160160

161-
recv = await ev_pool.component_data(evc_id)
161+
recv = ev_pool.component_data(evc_id)
162162

163163
await send_resampled_current(2, 3, 5)
164164
await asyncio.sleep(0.02)

tests/timeseries/test_formula_engine.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
from frequenz.sdk.timeseries._formula_engine._formula_engine import (
1414
FormulaBuilder,
1515
FormulaEngine,
16-
FormulaReceiver,
1716
HigherOrderFormulaBuilder,
1817
)
1918
from frequenz.sdk.timeseries._formula_engine._tokenizer import (
@@ -48,7 +47,7 @@ def test_1(self) -> None:
4847
class TestFormulaEngine:
4948
"""Tests for the FormulaEngine."""
5049

51-
async def run_test(
50+
async def run_test( # pylint: disable=too-many-locals
5251
self,
5352
formula: str,
5453
postfix: str,
@@ -70,11 +69,9 @@ async def run_test(
7069
elif token.type == TokenType.OPER:
7170
builder.push_oper(token.value)
7271
engine = builder.build()
72+
results_rx = engine.new_receiver()
7373

74-
assert (
75-
repr(engine._evaluator._steps) # pylint: disable=protected-access
76-
== postfix
77-
)
74+
assert repr(builder._steps) == postfix # pylint: disable=protected-access
7875

7976
now = datetime.now()
8077
tests_passed = 0
@@ -86,9 +83,7 @@ async def run_test(
8683
for chan, value in zip(channels.values(), io_input)
8784
]
8885
)
89-
next_val = (
90-
await engine._evaluator.apply() # pylint: disable=protected-access
91-
)
86+
next_val = await results_rx.receive()
9287
assert (next_val).value == io_output
9388
tests_passed += 1
9489
await engine._stop() # pylint: disable=protected-access
@@ -293,7 +288,7 @@ async def test_nones_are_not_zeros(self) -> None:
293288
)
294289

295290

296-
class TestFormulaChannel:
291+
class TestFormulaEngineComposition:
297292
"""Tests for formula channels."""
298293

299294
def make_engine(self, stream_id: int, data: Receiver[Sample]) -> FormulaEngine:
@@ -305,18 +300,18 @@ def make_engine(self, stream_id: int, data: Receiver[Sample]) -> FormulaEngine:
305300
data,
306301
nones_are_zeros=False,
307302
)
308-
return builder.build()
303+
return FormulaEngine(builder)
309304

310305
async def run_test( # pylint: disable=too-many-locals
311306
self,
312307
num_items: int,
313308
make_builder: Union[
314309
Callable[
315-
[FormulaReceiver, FormulaReceiver, FormulaReceiver],
310+
[FormulaEngine, FormulaEngine, FormulaEngine],
316311
HigherOrderFormulaBuilder,
317312
],
318313
Callable[
319-
[FormulaReceiver, FormulaReceiver, FormulaReceiver, FormulaReceiver],
314+
[FormulaEngine, FormulaEngine, FormulaEngine, FormulaEngine],
320315
HigherOrderFormulaBuilder,
321316
],
322317
],
@@ -329,7 +324,7 @@ async def run_test( # pylint: disable=too-many-locals
329324
self.make_engine(ctr, channels[ctr].new_receiver())
330325
for ctr in range(num_items)
331326
]
332-
builder = make_builder(*[e.new_receiver() for e in l1_engines])
327+
builder = make_builder(*l1_engines)
333328
engine = builder.build("l2 formula", nones_are_zeros)
334329
result_chan = engine.new_receiver()
335330

@@ -567,7 +562,7 @@ async def run_test(
567562

568563
builder.push_average(streams)
569564
engine = builder.build()
570-
565+
results_rx = engine.new_receiver()
571566
now = datetime.now()
572567
tests_passed = 0
573568
for io_pair in io_pairs:
@@ -578,9 +573,7 @@ async def run_test(
578573
for chan, value in zip(channels.values(), io_input)
579574
]
580575
)
581-
next_val = (
582-
await engine._evaluator.apply() # pylint: disable=protected-access
583-
)
576+
next_val = await results_rx.receive()
584577
assert (next_val).value == io_output
585578
tests_passed += 1
586579
await engine._stop() # pylint: disable=protected-access

tests/timeseries/test_logical_meter.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ async def test_grid_power_1(self, mocker: MockerFixture) -> None:
3131
await mockgrid.start(mocker)
3232
logical_meter = microgrid.logical_meter()
3333

34-
grid_power_recv = await logical_meter.grid_power()
34+
grid_power_recv = logical_meter.grid_power().new_receiver()
3535

36-
main_meter_recv = await get_resampled_stream(
36+
main_meter_recv = get_resampled_stream(
3737
mockgrid.main_meter_id,
3838
ComponentMetricId.ACTIVE_POWER,
3939
)
@@ -63,10 +63,10 @@ async def test_grid_power_2(
6363
await mockgrid.start(mocker)
6464
logical_meter = microgrid.logical_meter()
6565

66-
grid_power_recv = await logical_meter.grid_power()
66+
grid_power_recv = logical_meter.grid_power().new_receiver()
6767

6868
meter_receivers = [
69-
await get_resampled_stream(
69+
get_resampled_stream(
7070
meter_id,
7171
ComponentMetricId.ACTIVE_POWER,
7272
)
@@ -105,19 +105,19 @@ async def test_battery_and_pv_power( # pylint: disable=too-many-locals
105105
await mockgrid.start(mocker)
106106
logical_meter = microgrid.logical_meter()
107107

108-
battery_power_recv = await logical_meter.battery_power()
109-
pv_power_recv = await logical_meter.pv_power()
108+
battery_power_recv = logical_meter.battery_power().new_receiver()
109+
pv_power_recv = logical_meter.pv_power().new_receiver()
110110

111111
bat_inv_receivers = [
112-
await get_resampled_stream(
112+
get_resampled_stream(
113113
meter_id,
114114
ComponentMetricId.ACTIVE_POWER,
115115
)
116116
for meter_id in mockgrid.battery_inverter_ids
117117
]
118118

119119
pv_inv_receivers = [
120-
await get_resampled_stream(
120+
get_resampled_stream(
121121
meter_id,
122122
ComponentMetricId.ACTIVE_POWER,
123123
)

0 commit comments

Comments
 (0)