Files
Button/collector/tests/test_protocol.py
T
2026-11-02 16:46:20 +03:00

80 lines
2.5 KiB
Python

#!/usr/bin/env python3
import os
import sys
import unittest
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from protocol import ( # noqa: E402
charge_percent,
pack_interval_min,
pack_report,
pack_slot_config,
unpack_interval_min,
unpack_report,
unpack_slot_config,
voltage_v,
)
class ProtocolTests(unittest.TestCase):
def test_report_roundtrip(self):
raw = pack_report(85, 0x05, 1234)
self.assertEqual(len(raw), 4)
r = unpack_report(raw)
self.assertIsNotNone(r)
self.assertEqual(r.battery, 85)
self.assertEqual(r.flags, 0x05)
self.assertEqual(r.dist, 1234)
def test_report_le_dist(self):
raw = pack_report(0, 0, 0xABCD)
self.assertEqual(raw[2], 0xCD)
self.assertEqual(raw[3], 0xAB)
def test_bad_length(self):
self.assertIsNone(unpack_report(b""))
self.assertIsNone(unpack_report(b"\x00\x00\x00"))
self.assertIsNone(unpack_report(b"\x00" * 5))
def test_slot_config_roundtrip(self):
raw = pack_slot_config(2, 0x03, 30)
c = unpack_slot_config(raw)
self.assertIsNotNone(c)
self.assertEqual(c.slot, 2)
self.assertEqual(c.flags, 0x03)
self.assertEqual(c.period_s, 30)
def test_interval_min_roundtrip(self):
raw = pack_interval_min(30)
self.assertEqual(len(raw), 2)
self.assertEqual(raw, bytes((30, 0)))
self.assertEqual(unpack_interval_min(raw), 30)
raw2 = pack_interval_min(0x1234)
self.assertEqual(raw2[0], 0x34)
self.assertEqual(raw2[1], 0x12)
self.assertEqual(unpack_interval_min(raw2), 0x1234)
def test_voltage_is_tenths(self):
self.assertIsNone(voltage_v(255))
self.assertAlmostEqual(voltage_v(32), 3.2)
self.assertAlmostEqual(voltage_v(17), 1.7)
self.assertEqual(charge_percent(voltage_v(32)), 100)
self.assertEqual(charge_percent(1.5), 0)
self.assertEqual(charge_percent(1.7), 0)
self.assertEqual(charge_percent(2.0), 8)
self.assertEqual(charge_percent(2.3), 28)
self.assertEqual(charge_percent(3.0), 90)
self.assertEqual(charge_percent(3.2), 100)
self.assertEqual(charge_percent(3.4), 100)
def test_interval_min_bad_length(self):
self.assertIsNone(unpack_interval_min(b""))
self.assertIsNone(unpack_interval_min(b"\x00"))
self.assertIsNone(unpack_interval_min(b"\x00\x00\x00"))
if __name__ == "__main__":
unittest.main()