|
12 | 12 | from unittest.mock import AsyncMock, MagicMock |
13 | 13 |
|
14 | 14 | from frequenz.channels import Broadcast |
15 | | -from pytest import approx |
16 | 15 | from pytest_mock import MockerFixture |
17 | 16 |
|
18 | 17 | from frequenz.sdk import microgrid |
|
31 | 30 | Success, |
32 | 31 | ) |
33 | 32 | from frequenz.sdk.microgrid.component import ComponentCategory |
| 33 | +from frequenz.sdk.timeseries._quantities import Power |
34 | 34 | from tests.timeseries.mock_microgrid import MockMicrogrid |
35 | 35 |
|
36 | 36 | from ...conftest import SAFETY_TIMEOUT |
@@ -143,8 +143,8 @@ async def test_power_distributor_one_user(self, mocker: MockerFixture) -> None: |
143 | 143 |
|
144 | 144 | result: Result = done.pop().result() |
145 | 145 | assert isinstance(result, Success) |
146 | | - assert result.succeeded_power == approx(1000.0) |
147 | | - assert result.excess_power == approx(200.0) |
| 146 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.0)) |
| 147 | + assert result.excess_power.isclose(Power.from_watts(200.0)) |
148 | 148 | assert result.request == request |
149 | 149 |
|
150 | 150 | async def test_power_distributor_exclusion_bounds( |
@@ -212,8 +212,8 @@ async def test_power_distributor_exclusion_bounds( |
212 | 212 |
|
213 | 213 | result: Result = done.pop().result() |
214 | 214 | assert isinstance(result, Success) |
215 | | - assert result.succeeded_power == approx(0.0) |
216 | | - assert result.excess_power == approx(0.0) |
| 215 | + assert result.succeeded_power.isclose(Power.zero(), abs_tol=1e-9) |
| 216 | + assert result.excess_power.isclose(Power.zero(), abs_tol=1e-9) |
217 | 217 | assert result.request == request |
218 | 218 |
|
219 | 219 | ## non-zero power requests that fall within the exclusion bounds should be |
@@ -300,8 +300,8 @@ async def test_battery_soc_nan(self, mocker: MockerFixture) -> None: |
300 | 300 | result: Result = done.pop().result() |
301 | 301 | assert isinstance(result, Success) |
302 | 302 | assert result.succeeded_batteries == {19} |
303 | | - assert result.succeeded_power == approx(500.0) |
304 | | - assert result.excess_power == approx(700.0) |
| 303 | + assert result.succeeded_power.isclose(Power.from_watts(500.0)) |
| 304 | + assert result.excess_power.isclose(Power.from_watts(700.0)) |
305 | 305 | assert result.request == request |
306 | 306 |
|
307 | 307 | async def test_battery_capacity_nan(self, mocker: MockerFixture) -> None: |
@@ -356,8 +356,8 @@ async def test_battery_capacity_nan(self, mocker: MockerFixture) -> None: |
356 | 356 | result: Result = done.pop().result() |
357 | 357 | assert isinstance(result, Success) |
358 | 358 | assert result.succeeded_batteries == {19} |
359 | | - assert result.succeeded_power == approx(500.0) |
360 | | - assert result.excess_power == approx(700.0) |
| 359 | + assert result.succeeded_power.isclose(Power.from_watts(500.0)) |
| 360 | + assert result.excess_power.isclose(Power.from_watts(700.0)) |
361 | 361 | assert result.request == request |
362 | 362 |
|
363 | 363 | async def test_battery_power_bounds_nan(self, mocker: MockerFixture) -> None: |
@@ -428,8 +428,8 @@ async def test_battery_power_bounds_nan(self, mocker: MockerFixture) -> None: |
428 | 428 | result: Result = done.pop().result() |
429 | 429 | assert isinstance(result, Success) |
430 | 430 | assert result.succeeded_batteries == {19} |
431 | | - assert result.succeeded_power == approx(1000.0) |
432 | | - assert result.excess_power == approx(200.0) |
| 431 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.0)) |
| 432 | + assert result.excess_power.isclose(Power.from_watts(200.0)) |
433 | 433 | assert result.request == request |
434 | 434 |
|
435 | 435 | async def test_power_distributor_invalid_battery_id( |
@@ -627,8 +627,8 @@ async def test_power_distributor_one_user_adjust_power_success( |
627 | 627 |
|
628 | 628 | result = done.pop().result() |
629 | 629 | assert isinstance(result, Success) |
630 | | - assert result.succeeded_power == approx(1000.0) |
631 | | - assert result.excess_power == approx(0.0) |
| 630 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.0)) |
| 631 | + assert result.excess_power.isclose(Power.zero(), abs_tol=1e-9) |
632 | 632 | assert result.request == request |
633 | 633 |
|
634 | 634 | async def test_not_all_batteries_are_working(self, mocker: MockerFixture) -> None: |
@@ -676,8 +676,8 @@ async def test_not_all_batteries_are_working(self, mocker: MockerFixture) -> Non |
676 | 676 | result = done.pop().result() |
677 | 677 | assert isinstance(result, Success) |
678 | 678 | assert result.succeeded_batteries == {19} |
679 | | - assert result.excess_power == approx(700.0) |
680 | | - assert result.succeeded_power == approx(500.0) |
| 679 | + assert result.excess_power.isclose(Power.from_watts(700.0)) |
| 680 | + assert result.succeeded_power.isclose(Power.from_watts(500.0)) |
681 | 681 | assert result.request == request |
682 | 682 |
|
683 | 683 | async def test_use_all_batteries_none_is_working( |
@@ -726,8 +726,8 @@ async def test_use_all_batteries_none_is_working( |
726 | 726 | result = done.pop().result() |
727 | 727 | assert isinstance(result, Success) |
728 | 728 | assert result.succeeded_batteries == {9, 19} |
729 | | - assert result.excess_power == approx(200.0) |
730 | | - assert result.succeeded_power == approx(1000.0) |
| 729 | + assert result.excess_power.isclose(Power.from_watts(200.0)) |
| 730 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.0)) |
731 | 731 | assert result.request == request |
732 | 732 |
|
733 | 733 | async def test_force_request_a_battery_is_not_working( |
@@ -778,8 +778,8 @@ async def test_force_request_a_battery_is_not_working( |
778 | 778 | result = done.pop().result() |
779 | 779 | assert isinstance(result, Success) |
780 | 780 | assert result.succeeded_batteries == {9, 19} |
781 | | - assert result.excess_power == approx(200.0) |
782 | | - assert result.succeeded_power == approx(1000.0) |
| 781 | + assert result.excess_power.isclose(Power.from_watts(200.0)) |
| 782 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.0)) |
783 | 783 | assert result.request == request |
784 | 784 |
|
785 | 785 | async def test_force_request_battery_nan_value_non_cached( |
@@ -849,8 +849,8 @@ async def test_force_request_battery_nan_value_non_cached( |
849 | 849 | result: Result = done.pop().result() |
850 | 850 | assert isinstance(result, Success) |
851 | 851 | assert result.succeeded_batteries == batteries |
852 | | - assert result.succeeded_power == approx(1199.9999) |
853 | | - assert result.excess_power == approx(0.0) |
| 852 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.2)) |
| 853 | + assert result.excess_power.isclose(Power.zero(), abs_tol=1e-9) |
854 | 854 | assert result.request == request |
855 | 855 |
|
856 | 856 | async def test_force_request_batteries_nan_values_cached( |
@@ -900,8 +900,8 @@ async def test_result() -> None: |
900 | 900 | result: Result = done.pop().result() |
901 | 901 | assert isinstance(result, Success) |
902 | 902 | assert result.succeeded_batteries == batteries |
903 | | - assert result.succeeded_power == approx(1199.9999) |
904 | | - assert result.excess_power == approx(0.0) |
| 903 | + assert result.succeeded_power.isclose(Power.from_kilowatts(1.2)) |
| 904 | + assert result.excess_power.isclose(Power.zero(), abs_tol=1e-9) |
905 | 905 | assert result.request == request |
906 | 906 |
|
907 | 907 | batteries_data = ( |
|
0 commit comments