Files
linuxcncWebWASM/scripts/test_hal_component_manifest.py

50 lines
2.1 KiB
Python

import json
import sys
import unittest
from pathlib import Path
from tempfile import TemporaryDirectory
sys.path.insert(0, str(Path(__file__).resolve().parent))
from generate_hal_component_manifest import OUTPUT, generate, parse_comp, parse_hal
ROOT = Path(__file__).resolve().parents[1]
class HalComponentManifestTests(unittest.TestCase):
def test_parse_component_contract(self):
with TemporaryDirectory() as directory:
root = Path(directory)
path = root / "linuxcnc/src/hal/components/demo.comp"
path.parent.mkdir(parents=True)
path.write_text("component demo;\npin in float input;\npin out bit output;\nparam rw float gain = 1.0;\nfunction update;\n", encoding="utf-8")
report = parse_comp(root, path)
self.assertEqual(report["status"], "verified")
self.assertEqual(report["component"], "demo")
self.assertEqual(len(report["pins"]), 2)
self.assertEqual(report["params"][0]["default"], "1.0")
self.assertEqual(report["functions"][0]["name"], "update")
def test_hal_unknown_and_dynamic_loaders_block(self):
with TemporaryDirectory() as directory:
root = Path(directory)
path = root / "linuxcnc/lib/hallib/demo.hal"
path.parent.mkdir(parents=True)
path.write_text("loadrt demo names=d0\nloadrt [KINS]KINEMATICS\nloadusr -W external\naddf d0 servo-thread\n", encoding="utf-8")
records = parse_hal(root, path, {"demo"}, "resource:demo")
self.assertEqual(records[0]["status"], "declared")
self.assertEqual(records[1]["code"], "undeclared_or_variable_component")
self.assertEqual(records[2]["code"], "host_dynamic_loader")
self.assertEqual(records[3]["status"], "checked")
def test_generation_is_deterministic(self):
before = (ROOT / OUTPUT).read_bytes()
first = generate(ROOT, ROOT / OUTPUT)
after = (ROOT / OUTPUT).read_bytes()
self.assertEqual(before, after)
self.assertEqual(first["report_sha256"], json.loads(after.decode())["report_sha256"])
if __name__ == "__main__":
unittest.main()