import unittest from h8536.panel_selectors import ( CURRENT_TABLE_BASE, describe_selector_value, known_panel_selector, panel_selector_semantics_payload, selector_word_address, ) class PanelSelectorSemanticsTest(unittest.TestCase): def test_selector_0013_maps_to_current_table_word_and_lamp_bits(self): item = known_panel_selector(0x0013) self.assertIsNotNone(item) assert item is not None self.assertEqual(item["current_word_address_hex"], "H'E826") self.assertEqual(selector_word_address(CURRENT_TABLE_BASE, 0x0013), 0xE826) text = " ".join(describe_selector_value(0x0013, 0x4000)) self.assertIn("IRIS/M.BLACK LINK", text) self.assertIn("F791.5", text) self.assertIn("F716.7", text) def test_selector_payload_includes_local_panel_toggle_source(self): by_selector = { int(item["selector"]): item for item in panel_selector_semantics_payload() } selector_0013 = by_selector[0x0013] trigger_text = " ".join( str(trigger.get("summary", "")) for trigger in selector_0013.get("local_triggers", []) ) self.assertIn("F6DB.7", trigger_text) self.assertIn("H'E826", trigger_text) trigger_names = " ".join( str(trigger.get("name_candidate", "")) for trigger in selector_0013.get("local_triggers", []) ) self.assertIn("provisional_iris_mblack_link_button_toggle_report", trigger_names) def test_selector_payload_includes_closed_loop_state_machine(self): item = known_panel_selector(0x0013) self.assertIsNotNone(item) assert item is not None state_machine = item["state_machine"] self.assertEqual(state_machine["name_candidate"], "iris_mblack_link_closed_loop_state_candidate") self.assertEqual(state_machine["ack_frame"], "05 00 13 00 00 4C") self.assertEqual(state_machine["active_mirror_frame"], "00 00 13 40 00 09") self.assertEqual(state_machine["clear_mirror_frame"], "00 00 13 00 00 49") if __name__ == "__main__": unittest.main()