import json import tempfile import unittest from pathlib import Path from h8536.emulator.eeprom_image import build_eeprom_snapshot, format_eeprom_snapshot, write_eeprom_snapshot from h8536.emulator.memory import MemoryMap from h8536.emulator.peripherals.x24164 import X24164_LOGICAL_SIZE def rom_bytes() -> bytes: rom = bytearray([0xFF] * 0xCB00) rom[0xC564 : 0xC564 + 0x400] = b"\x00" * 0x400 rom[0xC564 + 0x18 * 2 : 0xC564 + 0x18 * 2 + 2] = b"\x60\x10" rom[0xC964 : 0xC964 + 0x100] = b"\x00" * 0x100 rom[0xC966:0xC968] = b"\x6B\x6F" rom[0xC974:0xC976] = b"\x80\x00" return bytes(rom) class EmulatorEepromImageTest(unittest.TestCase): def test_load_dump_and_write_log_cover_full_logical_image(self): memory = MemoryMap(rom_bytes()) image = bytes([index & 0xFF for index in range(X24164_LOGICAL_SIZE)]) memory.load_eeprom_image(image) self.assertEqual(memory.dump_eeprom_image(), image) self.assertEqual(memory.external[0xF400], 0x00) self.assertEqual(memory.external[0xF402], 0x02) self.assertTrue(memory.p9_bus.fast_write_word(0x0810, 0x1234)) self.assertEqual(memory.p9_bus.fast_read_word(0x0810), (True, 0x1234)) self.assertEqual(len(memory.p9_bus.x24164_bus.write_events), 2) self.assertIn("addr=810", memory.p9_bus.x24164_bus.write_log_lines()[-2]) def test_snapshot_reports_records_factory_diffs_and_mapped_writes(self): memory = MemoryMap(rom_bytes()) memory.seed_factory_eeprom_and_shadow() memory.p9_bus.fast_write_word(0x0110, 0x1234) report = build_eeprom_snapshot(memory, rom_bytes=rom_bytes()) text = format_eeprom_snapshot(report) self.assertEqual(report["summary"]["write_word_count"], 1) self.assertEqual(report["write_word_events"][0]["new_word_hex"], "0x1234") self.assertEqual(report["write_word_events"][0]["mapped_selectors_hex"], ["0x018"]) self.assertEqual(report["factory_diffs"][0]["address_hex"], "0x110") self.assertIn("EEPROM Word Writes", text) self.assertIn("selector", text) def test_write_snapshot_json(self): memory = MemoryMap(rom_bytes()) memory.seed_factory_eeprom_and_shadow() with tempfile.TemporaryDirectory() as tmp: output = Path(tmp) / "eeprom.json" write_eeprom_snapshot(memory, output, rom_bytes=rom_bytes(), as_json=True, include_image_hex=True) payload = json.loads(output.read_text(encoding="utf-8")) self.assertEqual(payload["kind"], "emulator_eeprom_snapshot") self.assertEqual(len(payload["image_hex"]), X24164_LOGICAL_SIZE * 2) if __name__ == "__main__": unittest.main()