test: add big-endian round-trip coverage for FIT field patching
This commit is contained in:
@@ -30,6 +30,17 @@ def _build_fixture() -> bytes:
|
|||||||
return make_fit(records)
|
return make_fit(records)
|
||||||
|
|
||||||
|
|
||||||
|
def _build_big_endian_fixture() -> bytes:
|
||||||
|
"""Big-endian (architecture=1) file_id definition/data pair. Closes the
|
||||||
|
big-endian coverage gap deferred from Task 2: no fixture anywhere in the FIT
|
||||||
|
test suite previously passed endian=">" to definition()/struct.pack, so the
|
||||||
|
architecture-byte branch in _read_definition (and the endian format string it
|
||||||
|
threads into every field read/write) was never actually exercised."""
|
||||||
|
file_def = definition(0, FILE_ID_MESG_NUM, [(1, 2, 0x84), (2, 2, 0x84)], endian=">")
|
||||||
|
file_data = data(0, struct.pack(">HH", 255, 999))
|
||||||
|
return make_fit(file_def + file_data)
|
||||||
|
|
||||||
|
|
||||||
def _build_no_device_index_fixture() -> bytes:
|
def _build_no_device_index_fixture() -> bytes:
|
||||||
"""device_info record entirely missing field 0 (device_index) must be left untouched."""
|
"""device_info record entirely missing field 0 (device_index) must be left untouched."""
|
||||||
file_def = definition(0, FILE_ID_MESG_NUM, [(1, 2, 0x84), (2, 2, 0x84)])
|
file_def = definition(0, FILE_ID_MESG_NUM, [(1, 2, 0x84), (2, 2, 0x84)])
|
||||||
@@ -161,6 +172,24 @@ def test_convert_fit_device_patches_product_name_string_fields(tmp_path: Path) -
|
|||||||
assert values_by_key[(DEVICE_INFO_MESG_NUM, 27)] == "Edge 1030 Plus"
|
assert values_by_key[(DEVICE_INFO_MESG_NUM, 27)] == "Edge 1030 Plus"
|
||||||
|
|
||||||
|
|
||||||
|
def test_convert_fit_device_round_trips_big_endian_fields(tmp_path: Path) -> None:
|
||||||
|
"""Proves both the read side (parsing manufacturer/product under architecture=1)
|
||||||
|
and the write side (patching them back in big-endian byte order) are correct --
|
||||||
|
a byte-order bug on either side would flip 255/999 or the patched 1/3570 into an
|
||||||
|
unrelated value once read back with the (still big-endian) definition."""
|
||||||
|
source = tmp_path / "source.fit"
|
||||||
|
source.write_bytes(_build_big_endian_fixture())
|
||||||
|
output = tmp_path / "output.fit"
|
||||||
|
|
||||||
|
convert_fit_device(source, output)
|
||||||
|
|
||||||
|
values = read_device_field_values(output)
|
||||||
|
values_by_key = {(v.global_message_num, v.field_num): v.value for v in values}
|
||||||
|
|
||||||
|
assert values_by_key[(FILE_ID_MESG_NUM, 1)] == 1
|
||||||
|
assert values_by_key[(FILE_ID_MESG_NUM, 2)] == 3570
|
||||||
|
|
||||||
|
|
||||||
def test_convert_fit_device_defaults_to_edge_1030_plus() -> None:
|
def test_convert_fit_device_defaults_to_edge_1030_plus() -> None:
|
||||||
device = GarminDevice()
|
device = GarminDevice()
|
||||||
assert device.manufacturer_id == 1
|
assert device.manufacturer_id == 1
|
||||||
|
|||||||
Reference in New Issue
Block a user