Skip to content

Commit

Permalink
🧪 unit tests [#7]
Browse files Browse the repository at this point in the history
  • Loading branch information
selyunin committed Nov 30, 2024
1 parent 98087f0 commit 12ca7bc
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 0 deletions.
18 changes: 18 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
StreamingPollingCmd,
)
from umrx_app_v3.mcu_board.commands.timer import TimerCmd
from umrx_app_v3.sensors.bmi088 import BMI088
from umrx_app_v3.sensors.bmi323 import BMI323
from umrx_app_v3.shuttle_board.bmi088.bmi088_shuttle import BMI088Shuttle
from umrx_app_v3.shuttle_board.bmi323.bmi323_shuttle import BMI323Shuttle

handler = logging.StreamHandler(sys.stdout)
handler.setFormatter(logging.Formatter("[%(asctime)s][%(levelname)-8s][%(name)s]: %(message)s"))
Expand Down Expand Up @@ -145,3 +148,18 @@ def app_board_v3_rev1(bst_protocol_serial: BstProtocol) -> ApplicationBoardV3Rev
@pytest.fixture(scope="session", autouse=True)
def bmi088_shuttle(app_board_v3_rev0: ApplicationBoardV3Rev0) -> BMI088Shuttle:
return BMI088Shuttle(board=app_board_v3_rev0)


@pytest.fixture(scope="session", autouse=True)
def bmi088() -> BMI088:
return BMI088()


@pytest.fixture(scope="session", autouse=True)
def bmi323_shuttle(app_board_v3_rev1: ApplicationBoardV3Rev1) -> BMI323Shuttle:
return BMI323Shuttle(board=app_board_v3_rev1)


@pytest.fixture(scope="session", autouse=True)
def bmi323() -> BMI323:
return BMI323()
Empty file added tests/sensors/__init__.py
Empty file.
48 changes: 48 additions & 0 deletions tests/sensors/test_bmi088.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import struct
from unittest.mock import patch

from umrx_app_v3.sensors.bmi088 import BMI088


def test_bmi088_read_properties(bmi088: BMI088) -> None:
all_properties = {key: value for key, value in bmi088.__class__.__dict__.items() if isinstance(value, property)}
write_only_properties = [
key for key, value in all_properties.items() if (value.fset is not None) and (value.fget is None)
]
readable_properties = all_properties.keys() - write_only_properties

for readable_property in readable_properties:
with (
patch.object(
bmi088,
"read_gyro",
side_effect=lambda *vals: tuple(range(vals[1])) if (isinstance(vals, tuple) and len(vals) > 1) else 1,
) as mocked_gyro_read,
patch.object(
bmi088,
"read_accel",
side_effect=lambda *vals: tuple(range(vals[1])) if (isinstance(vals, tuple) and len(vals) > 1) else 1,
) as mocked_acc_read,
patch.object(struct, "unpack", return_value=(1, 2, 3)),
):
getattr(bmi088, readable_property)
if readable_property.startswith("gyro_"):
mocked_gyro_read.assert_called_once()
elif readable_property.startswith("acc_"):
mocked_acc_read.assert_called_once()


def test_bmi088_write_properties(bmi088: BMI088) -> None:
all_properties = {key: value for key, value in bmi088.__class__.__dict__.items() if isinstance(value, property)}
writable_properties = [key for key, value in all_properties.items() if value.fset is not None]

for writable_property in writable_properties:
with (
patch.object(bmi088, "write_gyro") as mocked_gyro_write,
patch.object(bmi088, "write_accel") as mocked_accel_write,
):
setattr(bmi088, writable_property, 123)
if writable_property.startswith("gyro_"):
mocked_gyro_write.assert_called_once()
elif writable_property.startswith("acc_"):
mocked_accel_write.assert_called_once()
30 changes: 30 additions & 0 deletions tests/sensors/test_bmi323.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import struct
from unittest.mock import patch

from umrx_app_v3.sensors.bmi323 import BMI323


def test_bmi323_read_properties(bmi323: BMI323) -> None:
all_properties = {key: value for key, value in bmi323.__class__.__dict__.items() if isinstance(value, property)}
write_only_properties = [
key for key, value in all_properties.items() if (value.fset is not None) and (value.fget is None)
]
readable_properties = all_properties.keys() - write_only_properties

for readable_property in readable_properties:
with patch.object(bmi323, "read") as mocked_read, patch.object(struct, "unpack", return_value=(1, 2, 3)):
getattr(bmi323, readable_property)
if readable_property == "sensor_time":
assert mocked_read.call_count == 2
else:
mocked_read.assert_called_once()


def test_bmi323_write_properties(bmi323: BMI323) -> None:
all_properties = {key: value for key, value in bmi323.__class__.__dict__.items() if isinstance(value, property)}
writable_properties = [key for key, value in all_properties.items() if value.fset is not None]

for writable_property in writable_properties:
with patch.object(bmi323, "write") as mocked_write:
setattr(bmi323, writable_property, 123)
mocked_write.assert_called_once()

0 comments on commit 12ca7bc

Please sign in to comment.