1
0
Files
h8-536-decoder/tests/test_render_analysis.py

60 lines
2.0 KiB
Python

import json
import tempfile
import unittest
from pathlib import Path
from h8536.dataflow import analyze_dataflow
from h8536.model import Instruction
from h8536.render import format_listing, write_json
from h8536.rom import Rom
from h8536.symbols import discover_symbols
class RenderAnalysisIntegrationTest(unittest.TestCase):
def test_listing_and_json_include_symbols_and_compact_dataflow(self):
instructions = {
0x0100: Instruction(0x0100, b"\x58\x12\x34", "MOV:I.W", "#H'1234, R0"),
0x0103: Instruction(
0x0103,
b"\x1D\xF6\x80\x90",
"MOV:G.W",
"R0, @H'F680",
references=[0xF680],
),
}
dataflow = analyze_dataflow(instructions)
symbols = discover_symbols(instructions)
rom = Rom(bytes([0xFF] * 0x200))
listing = format_listing(
Path("rom.bin"),
rom,
instructions,
{},
{},
"min",
traced=True,
dataflow=dataflow,
symbols=symbols,
)
self.assertIn("; Symbols", listing)
self.assertIn("ram_F680", listing)
self.assertIn("dataflow R0=H'1234", listing)
with tempfile.TemporaryDirectory() as tmp:
path = Path(tmp) / "out.json"
write_json(path, instructions, {}, {}, dataflow=dataflow, symbols=symbols)
payload = json.loads(path.read_text(encoding="utf-8"))
self.assertEqual(payload["symbols"]["symbols"][0]["name"], "ram_F680")
self.assertEqual(payload["instructions"][1]["references"][0]["symbol"], "ram_F680")
dataflow_payload = payload["instructions"][0]["dataflow"]
self.assertEqual(dataflow_payload["changes"][0]["name"], "R0")
self.assertEqual(dataflow_payload["known_after"]["registers"]["R0"]["value"], 0x1234)
self.assertNotIn("before", dataflow_payload)
if __name__ == "__main__":
unittest.main()