import unittest from ccu_emulator.frames import ACTIVE_SEED_COMMAND0, NEUTRAL_ACK_FRAME, build_frame, frame_checksum_ok from ccu_emulator.policy import AckPolicy from ccu_emulator.refresh import PeriodicRefresh class CcuEmulatorFrameTests(unittest.TestCase): def test_build_frame_adds_checksum(self): self.assertEqual(build_frame(0x00, 0x0000, 0x8080), ACTIVE_SEED_COMMAND0) self.assertTrue(frame_checksum_ok(build_frame(0x06, 0x0015, 0x0001))) def test_ack_policy_acknowledges_reports_with_neutral_ack(self): decision = AckPolicy().decide(bytes.fromhex("02000200005A"), "connect_ok_path_response_candidate") self.assertTrue(decision.should_ack) self.assertEqual(decision.frame, NEUTRAL_ACK_FRAME) def test_ack_policy_skips_table_readback(self): decision = AckPolicy().decide(bytes.fromhex("04000080805E"), "table_readback_candidate") self.assertFalse(decision.should_ack) class PeriodicRefreshTests(unittest.TestCase): def test_periodic_refresh_returns_due_frames(self): refresh = PeriodicRefresh(frames=[ACTIVE_SEED_COMMAND0], interval=0.5) refresh.start(now=10.0) self.assertEqual(refresh.due_frames(now=10.4), []) self.assertEqual(refresh.due_frames(now=10.5), [ACTIVE_SEED_COMMAND0]) self.assertEqual(refresh.due_frames(now=10.6), []) if __name__ == "__main__": unittest.main()