92 lines
3.4 KiB
Python
92 lines
3.4 KiB
Python
import unittest
|
|
|
|
from h8536.bench_connect_lcd import (
|
|
CONNECT_LCD_SEQUENCE,
|
|
FrameDetector,
|
|
format_frame,
|
|
frame_checksum,
|
|
frame_checksum_ok,
|
|
label_frame,
|
|
parse_frame,
|
|
)
|
|
|
|
|
|
class BenchConnectLcdTest(unittest.TestCase):
|
|
def test_connect_sequence_matches_emulator_preset(self):
|
|
self.assertEqual(
|
|
[format_frame(frame) for frame in CONNECT_LCD_SEQUENCE],
|
|
[
|
|
"04 00 00 40 00 1E",
|
|
"04 00 00 80 00 DE",
|
|
"04 00 00 C0 00 9E",
|
|
],
|
|
)
|
|
|
|
def test_parse_frame_appends_xor_checksum(self):
|
|
frame = parse_frame("04 00 00 80 00")
|
|
|
|
self.assertEqual(frame, bytes.fromhex("0400008000DE"))
|
|
self.assertEqual(frame_checksum(frame), 0xDE)
|
|
self.assertTrue(frame_checksum_ok(frame))
|
|
|
|
def test_detector_recombines_split_rx_chunks(self):
|
|
detector = FrameDetector()
|
|
|
|
self.assertEqual(detector.feed(bytes.fromhex("000000")), [])
|
|
detected = detector.feed(bytes.fromhex("0080DA02000200005A"))
|
|
|
|
self.assertEqual(
|
|
[(format_frame(frame), label) for frame, label in detected],
|
|
[
|
|
("00 00 00 00 80 DA", "heartbeat"),
|
|
("02 00 02 00 00 5A", "connect_ok_path_response_candidate"),
|
|
],
|
|
)
|
|
|
|
def test_detector_resyncs_to_checksum_valid_frame(self):
|
|
detector = FrameDetector()
|
|
|
|
detected = detector.feed(bytes.fromhex("FF0000000080DA"))
|
|
|
|
self.assertEqual([(format_frame(frame), label) for frame, label in detected], [
|
|
("00 00 00 00 80 DA", "heartbeat")
|
|
])
|
|
self.assertEqual(detector.dropped_bytes, 1)
|
|
self.assertEqual(detector.resync_events, 1)
|
|
|
|
def test_detector_prefers_labeled_heartbeat_over_shifted_valid_window(self):
|
|
detector = FrameDetector()
|
|
heartbeat = bytes.fromhex("0000000080DA")
|
|
|
|
detected = detector.feed(heartbeat[1:] + heartbeat)
|
|
|
|
self.assertEqual([(format_frame(frame), label) for frame, label in detected], [
|
|
("00 00 00 00 80 DA", "heartbeat")
|
|
])
|
|
self.assertEqual(detector.dropped_bytes, 5)
|
|
|
|
def test_label_frame_marks_unlabeled_checksum_ok_frame(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("01000000005B")), "checksum_ok_unlabeled")
|
|
|
|
def test_label_frame_marks_table_readback_candidate(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("04001280804C")), "table_readback_candidate")
|
|
|
|
def test_label_frame_marks_real_bench_c0_6020_response(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("0780C060205D")), "visible_C0_6020_family_candidate")
|
|
|
|
def test_label_frame_marks_visible_retry_ack_target(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("07804020902D")), "visible_retry_0040_2090_candidate")
|
|
|
|
def test_label_frame_marks_active_selector0_keepalive_report(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("00000080805A")), "active_selector0_keepalive_report")
|
|
|
|
def test_label_frame_marks_copy_completion_exit_selector_006c_candidate(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("00006C000036")), "copy_completion_exit_selector_006c_candidate")
|
|
|
|
def test_label_frame_marks_copy_in_progress_selector_006d_candidate(self):
|
|
self.assertEqual(label_frame(bytes.fromhex("00006D000037")), "copy_in_progress_selector_006d_candidate")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|