Files
linuxcncWebWASM/scripts/test_kinematics_closure_report.py

61 lines
3.0 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_kinematics_closure_report import generate
class KinematicsClosureReportTests(unittest.TestCase):
def make_tree(self):
directory = TemporaryDirectory()
root = Path(directory.name)
(root / "context-lock.json").write_text('{"context_id":"test-context"}\n', encoding="utf-8")
source = root / "linuxcnc/src/emc/kinematics"
source.mkdir(parents=True)
(source / "trivkins.c").write_text("int kinematicsForward(void) { return 0; }\n", encoding="utf-8")
(source / "kinematics.h").write_text("typedef int KINEMATICS_TYPE;\n", encoding="utf-8")
config = root / "linuxcnc/configs/sim/demo"
config.mkdir(parents=True)
(config / "demo.ini").write_text("[KINS]\nKINEMATICS = trivkins coordinates=XYZ\n", encoding="utf-8")
(config / "demo.hal").write_text("loadrt trivkins\n", encoding="utf-8")
(root / "linuxcnc/tests/matrixkins").mkdir(parents=True)
(root / "linuxcnc/tests/matrixkins/test.ini").write_text("[KINS]\nKINEMATICS = matrixkins\n", encoding="utf-8")
return directory, root
def test_report_is_deterministic_and_retains_missing_required_root(self):
directory, root = self.make_tree()
self.addCleanup(directory.cleanup)
first = root / "one.json"
second = root / "two.json"
report_one = generate(root, first)
report_two = generate(root, second)
self.assertEqual(report_one["status"], "blocked")
self.assertIn("linuxcnc/unit_tests/kinematics", report_one["missing_required_test_roots"])
self.assertEqual(first.read_bytes(), second.read_bytes())
self.assertEqual(report_one["source"]["file_count"], 2)
self.assertEqual(report_one["configuration"]["entry_count"], 2)
self.assertEqual(report_one["hal"]["entry_count"], 1)
self.assertTrue(report_one["configuration"]["entries"][0]["config_id"].startswith("config:"))
self.assertEqual(report_one["source"]["files"][0]["source_id"], "source:linuxcnc/src/emc/kinematics/kinematics.h")
self.assertTrue(all(row["oracle"]["status"] == "blocked" for row in report_one["families"]))
self.assertEqual(json.loads(first.read_text(encoding="utf-8")), report_two)
def test_hal_transform_and_switchkins_entries_are_registered(self):
directory, root = self.make_tree()
self.addCleanup(directory.cleanup)
hal = root / "linuxcnc/configs/sim/demo/demo.hal"
hal.write_text("loadrt corexy_by_hal names=corexy\nnet select => motion.switchkins-type\n", encoding="utf-8")
report = generate(root, root / "report.json")
kinds = {row["kind"] for row in report["hal"]["entries"]}
self.assertIn("loadrt", kinds)
self.assertIn("hal_transform", kinds)
self.assertIn("switchkins", kinds)
if __name__ == "__main__":
unittest.main()