Files
linuxcncWebWASM/scripts/test_source_symbols.py

60 lines
2.7 KiB
Python

#!/usr/bin/env python3
import sys
import unittest
from pathlib import Path
from tempfile import TemporaryDirectory
sys.path.insert(0, str(Path(__file__).resolve().parent))
from generate_source_symbols import generate, parse_file
class SourceSymbolsTests(unittest.TestCase):
def test_parses_c_python_and_comp_entries(self):
with TemporaryDirectory() as directory:
root = Path(directory)
for sub in ("linuxcnc/src/emc", "linuxcnc/src/hal", "linuxcnc/lib/python"):
(root / sub).mkdir(parents=True, exist_ok=True)
c = root / "linuxcnc/src/emc/demo.c"
c.write_text("#define DEMO 1\nint demo(int x) { return x; }\n", encoding="utf-8")
py = root / "linuxcnc/lib/python/demo.py"
py.write_text("class Demo:\n async def run(self):\n pass\n", encoding="utf-8")
comp = root / "linuxcnc/src/hal/demo.comp"
comp.write_text("component demo;\npin in bit enable;\nfunction update;\n", encoding="utf-8")
rows, report = parse_file(root, c)
self.assertEqual({row["symbol"] for row in rows}, {"DEMO", "demo"})
self.assertEqual(report["parse_status"], "parsed")
rows, _ = parse_file(root, py)
self.assertEqual({row["symbol_kind"] for row in rows}, {"class", "async_function"})
rows, _ = parse_file(root, comp)
self.assertEqual({row["symbol_kind"] for row in rows}, {"component", "pin", "function"})
def test_generation_is_deterministic(self):
with TemporaryDirectory() as directory:
root = Path(directory)
for sub in ("linuxcnc/src/emc", "linuxcnc/src/hal", "linuxcnc/lib/python"):
(root / sub).mkdir(parents=True, exist_ok=True)
(root / "linuxcnc/src/emc/demo.c").write_text("void z(void) {}\n", encoding="utf-8")
first = root / "one.jsonl"
second = root / "two.jsonl"
report = root / "report.json"
_, digest_one = generate(root, first, report)
_, digest_two = generate(root, second, report)
self.assertEqual(digest_one, digest_two)
self.assertEqual(first.read_bytes(), second.read_bytes())
def test_decode_error_is_reported(self):
with TemporaryDirectory() as directory:
root = Path(directory)
path = root / "linuxcnc/src/emc"
path.mkdir(parents=True)
bad = path / "bad.c"
bad.write_bytes(b"\xff\xfe")
rows, report = parse_file(root, bad)
self.assertEqual(rows, [])
self.assertEqual(report["parse_status"], "decode_error")
if __name__ == "__main__":
unittest.main()