Skip to content

Commit 3b78660

Browse files
committed
Move frequency() tests into own file
As they are no longer part of the logical_meter. Signed-off-by: Mathias L. Baumann <[email protected]>
1 parent f89c53b commit 3b78660

File tree

2 files changed

+162
-147
lines changed

2 files changed

+162
-147
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
# License: MIT
2+
# Copyright © 2022 Frequenz Energy-as-a-Service GmbH
3+
4+
"""Tests for the logical meter."""
5+
6+
7+
import asyncio
8+
from datetime import datetime, timezone
9+
10+
from pytest_mock import MockerFixture
11+
12+
from frequenz.sdk import microgrid
13+
from frequenz.sdk.timeseries._quantities import Frequency
14+
from tests.utils import component_data_wrapper
15+
16+
from ._formula_engine.utils import equal_float_lists
17+
from .mock_microgrid import MockMicrogrid
18+
19+
# pylint: disable=protected-access
20+
21+
22+
async def test_grid_frequency_1(mocker: MockerFixture) -> None:
23+
"""Test the grid frequency formula."""
24+
mockgrid = MockMicrogrid(grid_meter=True)
25+
mockgrid.add_batteries(2)
26+
mockgrid.add_solar_inverters(1)
27+
await mockgrid.start(mocker)
28+
29+
grid_freq = microgrid.frequency()
30+
grid_freq_recv = grid_freq.new_receiver()
31+
32+
assert grid_freq._task is not None
33+
# We have to wait for the metric request to be sent
34+
await grid_freq._task
35+
# And consumed
36+
await asyncio.sleep(0)
37+
38+
results = []
39+
grid_meter_data = []
40+
for count in range(10):
41+
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
42+
await mockgrid.mock_client.send(
43+
component_data_wrapper.MeterDataWrapper(
44+
mockgrid.meter_ids[0], datetime.now(tz=timezone.utc), frequency=freq
45+
)
46+
)
47+
48+
grid_meter_data.append(Frequency.from_hertz(freq))
49+
val = await grid_freq_recv.receive()
50+
assert val is not None and val.value is not None
51+
results.append(val.value)
52+
await mockgrid.cleanup()
53+
assert equal_float_lists(results, grid_meter_data)
54+
55+
56+
async def test_grid_frequency_no_grid_meter_no_consumer_meter(
57+
mocker: MockerFixture,
58+
) -> None:
59+
"""Test the grid frequency formula without a grid side meter."""
60+
mockgrid = MockMicrogrid(grid_meter=False)
61+
mockgrid.add_consumer_meters()
62+
mockgrid.add_batteries(1, no_meter=False)
63+
mockgrid.add_batteries(1, no_meter=False)
64+
await mockgrid.start(mocker)
65+
grid_freq = microgrid.frequency()
66+
67+
grid_freq_recv = grid_freq.new_receiver()
68+
# We have to wait for the metric request to be sent
69+
assert grid_freq._task is not None
70+
await grid_freq._task
71+
# And consumed
72+
await asyncio.sleep(0)
73+
74+
results = []
75+
meter_data = []
76+
for count in range(10):
77+
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
78+
await mockgrid.mock_client.send(
79+
component_data_wrapper.MeterDataWrapper(
80+
mockgrid.meter_ids[0], datetime.now(tz=timezone.utc), frequency=freq
81+
)
82+
)
83+
meter_data.append(Frequency.from_hertz(freq))
84+
85+
val = await grid_freq_recv.receive()
86+
assert val is not None and val.value is not None
87+
results.append(val.value)
88+
await mockgrid.cleanup()
89+
assert equal_float_lists(results, meter_data)
90+
91+
92+
async def test_grid_frequency_no_grid_meter(
93+
mocker: MockerFixture,
94+
) -> None:
95+
"""Test the grid frequency formula without a grid side meter."""
96+
mockgrid = MockMicrogrid(grid_meter=False)
97+
mockgrid.add_batteries(1, no_meter=False)
98+
mockgrid.add_batteries(1, no_meter=True)
99+
await mockgrid.start(mocker)
100+
grid_freq = microgrid.frequency()
101+
102+
grid_freq_recv = grid_freq.new_receiver()
103+
# We have to wait for the metric request to be sent
104+
assert grid_freq._task is not None
105+
await grid_freq._task
106+
# And consumed
107+
await asyncio.sleep(0)
108+
109+
results = []
110+
meter_data = []
111+
for count in range(10):
112+
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
113+
await mockgrid.mock_client.send(
114+
component_data_wrapper.MeterDataWrapper(
115+
mockgrid.meter_ids[0], datetime.now(tz=timezone.utc), frequency=freq
116+
)
117+
)
118+
meter_data.append(Frequency.from_hertz(freq))
119+
120+
val = await grid_freq_recv.receive()
121+
assert val is not None and val.value is not None
122+
results.append(val.value)
123+
await mockgrid.cleanup()
124+
assert equal_float_lists(results, meter_data)
125+
126+
127+
async def test_grid_frequency_only_inverter(
128+
mocker: MockerFixture,
129+
) -> None:
130+
"""Test the grid frequency formula without any meter but only inverters."""
131+
mockgrid = MockMicrogrid(grid_meter=False)
132+
mockgrid.add_batteries(2, no_meter=True)
133+
await mockgrid.start(mocker)
134+
135+
grid_freq = microgrid.frequency()
136+
grid_freq_recv = grid_freq.new_receiver()
137+
# We have to wait for the metric request to be sent
138+
assert grid_freq._task is not None
139+
await grid_freq._task
140+
# And consumed
141+
await asyncio.sleep(0)
142+
143+
results = []
144+
meter_data = []
145+
for count in range(10):
146+
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
147+
148+
await mockgrid.mock_client.send(
149+
component_data_wrapper.InverterDataWrapper(
150+
mockgrid.battery_inverter_ids[0],
151+
datetime.now(tz=timezone.utc),
152+
frequency=freq,
153+
)
154+
)
155+
156+
meter_data.append(Frequency.from_hertz(freq))
157+
val = await grid_freq_recv.receive()
158+
assert val is not None and val.value is not None
159+
results.append(val.value)
160+
await mockgrid.cleanup()
161+
assert equal_float_lists(results, meter_data)

tests/timeseries/test_logical_meter.py

Lines changed: 1 addition & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,11 @@
44
"""Tests for the logical meter."""
55

66

7-
import asyncio
8-
from datetime import datetime, timezone
9-
107
from pytest_mock import MockerFixture
118

129
from frequenz.sdk import microgrid
13-
from frequenz.sdk.timeseries._quantities import Frequency, Power
14-
from tests.utils import component_data_wrapper
10+
from frequenz.sdk.timeseries._quantities import Power
1511

16-
from ._formula_engine.utils import equal_float_lists
1712
from .mock_microgrid import MockMicrogrid
1813

1914
# pylint: disable=too-many-locals
@@ -23,147 +18,6 @@
2318
class TestLogicalMeter: # pylint: disable=too-many-public-methods
2419
"""Tests for the logical meter."""
2520

26-
async def test_grid_frequency_1(self, mocker: MockerFixture) -> None:
27-
"""Test the grid frequency formula."""
28-
mockgrid = MockMicrogrid(grid_meter=True)
29-
mockgrid.add_batteries(2)
30-
mockgrid.add_solar_inverters(1)
31-
await mockgrid.start(mocker)
32-
33-
grid_freq = microgrid.frequency()
34-
grid_freq_recv = grid_freq.new_receiver()
35-
36-
assert grid_freq._task is not None
37-
# We have to wait for the metric request to be sent
38-
await grid_freq._task
39-
# And consumed
40-
await asyncio.sleep(0)
41-
42-
results = []
43-
grid_meter_data = []
44-
for count in range(10):
45-
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
46-
await mockgrid.mock_client.send(
47-
component_data_wrapper.MeterDataWrapper(
48-
mockgrid.meter_ids[0], datetime.now(tz=timezone.utc), frequency=freq
49-
)
50-
)
51-
52-
grid_meter_data.append(Frequency.from_hertz(freq))
53-
val = await grid_freq_recv.receive()
54-
assert val is not None and val.value is not None
55-
results.append(val.value)
56-
await mockgrid.cleanup()
57-
assert equal_float_lists(results, grid_meter_data)
58-
59-
async def test_grid_frequency_no_grid_meter_no_consumer_meter(
60-
self,
61-
mocker: MockerFixture,
62-
) -> None:
63-
"""Test the grid frequency formula without a grid side meter."""
64-
mockgrid = MockMicrogrid(grid_meter=False)
65-
mockgrid.add_consumer_meters()
66-
mockgrid.add_batteries(1, no_meter=False)
67-
mockgrid.add_batteries(1, no_meter=False)
68-
await mockgrid.start(mocker)
69-
grid_freq = microgrid.frequency()
70-
71-
grid_freq_recv = grid_freq.new_receiver()
72-
# We have to wait for the metric request to be sent
73-
assert grid_freq._task is not None
74-
await grid_freq._task
75-
# And consumed
76-
await asyncio.sleep(0)
77-
78-
results = []
79-
meter_data = []
80-
for count in range(10):
81-
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
82-
await mockgrid.mock_client.send(
83-
component_data_wrapper.MeterDataWrapper(
84-
mockgrid.meter_ids[0], datetime.now(tz=timezone.utc), frequency=freq
85-
)
86-
)
87-
meter_data.append(Frequency.from_hertz(freq))
88-
89-
val = await grid_freq_recv.receive()
90-
assert val is not None and val.value is not None
91-
results.append(val.value)
92-
await mockgrid.cleanup()
93-
assert equal_float_lists(results, meter_data)
94-
95-
async def test_grid_frequency_no_grid_meter(
96-
self,
97-
mocker: MockerFixture,
98-
) -> None:
99-
"""Test the grid frequency formula without a grid side meter."""
100-
mockgrid = MockMicrogrid(grid_meter=False)
101-
mockgrid.add_batteries(1, no_meter=False)
102-
mockgrid.add_batteries(1, no_meter=True)
103-
await mockgrid.start(mocker)
104-
grid_freq = microgrid.frequency()
105-
106-
grid_freq_recv = grid_freq.new_receiver()
107-
# We have to wait for the metric request to be sent
108-
assert grid_freq._task is not None
109-
await grid_freq._task
110-
# And consumed
111-
await asyncio.sleep(0)
112-
113-
results = []
114-
meter_data = []
115-
for count in range(10):
116-
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
117-
await mockgrid.mock_client.send(
118-
component_data_wrapper.MeterDataWrapper(
119-
mockgrid.meter_ids[0], datetime.now(tz=timezone.utc), frequency=freq
120-
)
121-
)
122-
meter_data.append(Frequency.from_hertz(freq))
123-
124-
val = await grid_freq_recv.receive()
125-
assert val is not None and val.value is not None
126-
results.append(val.value)
127-
await mockgrid.cleanup()
128-
assert equal_float_lists(results, meter_data)
129-
130-
async def test_grid_frequency_only_inverter(
131-
self,
132-
mocker: MockerFixture,
133-
) -> None:
134-
"""Test the grid frequency formula without any meter but only inverters."""
135-
mockgrid = MockMicrogrid(grid_meter=False)
136-
mockgrid.add_batteries(2, no_meter=True)
137-
await mockgrid.start(mocker)
138-
139-
grid_freq = microgrid.frequency()
140-
grid_freq_recv = grid_freq.new_receiver()
141-
# We have to wait for the metric request to be sent
142-
assert grid_freq._task is not None
143-
await grid_freq._task
144-
# And consumed
145-
await asyncio.sleep(0)
146-
147-
results = []
148-
meter_data = []
149-
for count in range(10):
150-
freq = float(50.0 + (1 if count % 2 == 0 else -1) * 0.01)
151-
152-
await mockgrid.mock_client.send(
153-
component_data_wrapper.InverterDataWrapper(
154-
mockgrid.battery_inverter_ids[0],
155-
datetime.now(tz=timezone.utc),
156-
frequency=freq,
157-
)
158-
)
159-
160-
meter_data.append(Frequency.from_hertz(freq))
161-
val = await grid_freq_recv.receive()
162-
assert val is not None and val.value is not None
163-
results.append(val.value)
164-
await mockgrid.cleanup()
165-
assert equal_float_lists(results, meter_data)
166-
16721
async def test_chp_power(self, mocker: MockerFixture) -> None:
16822
"""Test the chp power formula."""
16923
mockgrid = MockMicrogrid(grid_meter=False)

0 commit comments

Comments
 (0)