#!/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()