60 lines
2.7 KiB
Python
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()
|