|
12 | 12 | from pytest_mock import MockerFixture |
13 | 13 |
|
14 | 14 | from frequenz.sdk import microgrid |
15 | | -from frequenz.sdk.timeseries._quantities import Power |
| 15 | +from frequenz.sdk.timeseries import Power, Sample |
16 | 16 |
|
17 | 17 | from ..mock_microgrid import MockMicrogrid |
18 | 18 | from .utils import get_resampled_stream |
@@ -303,7 +303,10 @@ async def test_formula_composition_min_max_const( |
303 | 303 | max_pow = await engine_max_rx.receive() |
304 | 304 | assert max_pow and max_pow.value and max_pow.value.isclose(Power.zero()) |
305 | 305 |
|
306 | | - async def test_formula_composition_constant(self, mocker: MockerFixture) -> None: |
| 306 | + async def test_formula_composition_constant( # pylint: disable=too-many-locals |
| 307 | + self, |
| 308 | + mocker: MockerFixture, |
| 309 | + ) -> None: |
307 | 310 | """Test the composition of formulas with constant values.""" |
308 | 311 | async with ( |
309 | 312 | MockMicrogrid(grid_meter=True, mocker=mocker) as mockgrid, |
@@ -334,40 +337,64 @@ async def test_formula_composition_constant(self, mocker: MockerFixture) -> None |
334 | 337 | engine_div._stop # pylint: disable=protected-access |
335 | 338 | ) |
336 | 339 |
|
| 340 | + engine_composite = ( |
| 341 | + ( |
| 342 | + (grid.power + Power.from_watts(50.0)) / 2.0 |
| 343 | + + grid.power |
| 344 | + - Power.from_watts(20.0) |
| 345 | + ) |
| 346 | + * 2.0 |
| 347 | + ).build("grid_power_composite") |
| 348 | + |
337 | 349 | await mockgrid.mock_resampler.send_meter_power([100.0]) |
338 | 350 |
|
339 | 351 | # Test addition |
340 | | - grid_power_addition = await engine_add.new_receiver().receive() |
| 352 | + grid_power_addition: Sample[Power] = ( |
| 353 | + await engine_add.new_receiver().receive() |
| 354 | + ) |
341 | 355 | assert grid_power_addition.value is not None |
342 | 356 | assert math.isclose( |
343 | 357 | grid_power_addition.value.as_watts(), |
344 | 358 | 150.0, |
345 | 359 | ) |
346 | 360 |
|
347 | 361 | # Test subtraction |
348 | | - grid_power_subtraction = await engine_sub.new_receiver().receive() |
| 362 | + grid_power_subtraction: Sample[Power] = ( |
| 363 | + await engine_sub.new_receiver().receive() |
| 364 | + ) |
349 | 365 | assert grid_power_subtraction.value is not None |
350 | 366 | assert math.isclose( |
351 | 367 | grid_power_subtraction.value.as_watts(), |
352 | 368 | 0.0, |
353 | 369 | ) |
354 | 370 |
|
355 | 371 | # Test multiplication |
356 | | - grid_power_multiplication = await engine_mul.new_receiver().receive() |
| 372 | + grid_power_multiplication: Sample[Power] = ( |
| 373 | + await engine_mul.new_receiver().receive() |
| 374 | + ) |
357 | 375 | assert grid_power_multiplication.value is not None |
358 | 376 | assert math.isclose( |
359 | 377 | grid_power_multiplication.value.as_watts(), |
360 | 378 | 200.0, |
361 | 379 | ) |
362 | 380 |
|
363 | 381 | # Test division |
364 | | - grid_power_division = await engine_div.new_receiver().receive() |
| 382 | + grid_power_division: Sample[Power] = ( |
| 383 | + await engine_div.new_receiver().receive() |
| 384 | + ) |
365 | 385 | assert grid_power_division.value is not None |
366 | 386 | assert math.isclose( |
367 | 387 | grid_power_division.value.as_watts(), |
368 | 388 | 50.0, |
369 | 389 | ) |
370 | 390 |
|
| 391 | + # Test composite formula |
| 392 | + grid_power_composite: Sample[Power] = ( |
| 393 | + await engine_composite.new_receiver().receive() |
| 394 | + ) |
| 395 | + assert grid_power_composite.value is not None |
| 396 | + assert math.isclose(grid_power_composite.value.as_watts(), 310.0) |
| 397 | + |
371 | 398 | # Test multiplication with a Quantity |
372 | 399 | with pytest.raises(RuntimeError): |
373 | 400 | engine_assert = (grid.power * Power.from_watts(2.0)).build( # type: ignore |
|
0 commit comments