Files
linuxcncWebWASM/scripts/test_normalize_sources.py

70 lines
4.1 KiB
Python

#!/usr/bin/env python3
import json
import sys
import unittest
from pathlib import Path
from tempfile import TemporaryDirectory
sys.path.insert(0, str(Path(__file__).resolve().parent))
from normalize_sources import generate
class NormalizeSourcesTests(unittest.TestCase):
def create_tree(self):
directory = TemporaryDirectory()
root = Path(directory.name)
(root / "coverage").mkdir()
(root / "linuxcnc/src").mkdir(parents=True)
(root / "docs").mkdir()
(root / "linuxcnc/configs/sim/demo").mkdir(parents=True)
(root / "linuxcnc/tests/demo").mkdir(parents=True)
(root / "linuxcnc/src/demo.c").write_text("int main(void) { return 0; }\n", encoding="utf-8")
(root / "docs/demo.md").write_text("# Demo\n", encoding="utf-8")
(root / "linuxcnc/configs/sim/demo/main.ini").write_text("[EMC]\n", encoding="utf-8")
(root / "linuxcnc/tests/demo/test.sh").write_text("#!/bin/sh\n", encoding="utf-8")
indexes = {
"source-index.jsonl": [{"bytes": 1, "kind": "source", "path": "linuxcnc/src/demo.c", "sha256": "a", "source_id": "build:demo"}],
"document-capabilities.jsonl": [{"anchor": "demo", "capability_source_id": "doc:demo#demo", "document": "docs/demo.md", "domain": "demo", "source_sha": "b", "title": "Demo"}],
"source-symbols.jsonl": [{"language": "c", "line": 1, "parse_status": "parsed", "path": "linuxcnc/src/demo.c", "source_sha": "a", "symbol": "main", "symbol_kind": "function", "symbol_source_id": "symbol:demo"}],
"config-resources.jsonl": [{"edge_kind": "ini:EMC", "entrypoint": "linuxcnc/configs/sim/demo/main.ini", "line": 1, "origin_path": "linuxcnc/configs/sim/demo/main.ini", "parse_status": "resolved_file", "path": "linuxcnc/configs/sim/demo/main.ini", "resource_kind": "ini", "resource_source_id": "resource:demo", "source_sha": "c", "target_sha256": "c"}],
"test-entries.jsonl": [{"command": "bash linuxcnc/tests/demo/test.sh", "config_refs": [], "expected": [], "inputs": [], "parse_status": "parsed", "path": "linuxcnc/tests/demo/test.sh", "portability": "portable_candidate", "source_sha": "d", "test_kind": "shell_test", "test_source_id": "test:demo"}],
}
for name, rows in indexes.items():
(root / "coverage" / name).write_text("".join(json.dumps(row) + "\n" for row in rows), encoding="utf-8")
return directory, root
def test_normalized_ids_are_unique_and_link_files(self):
directory, root = self.create_tree()
self.addCleanup(directory.cleanup)
output = root / "coverage/normalized.jsonl"
count, _ = generate(root, output, root / "coverage/report.json")
rows = [json.loads(line) for line in output.read_text(encoding="utf-8").splitlines()]
self.assertEqual(count, 5)
self.assertEqual(len(rows), len({row["source_id"] for row in rows}))
symbol = next(row for row in rows if row["origin_index"] == "symbol")
self.assertIn("src:file:linuxcnc/src/demo.c", symbol["related_source_ids"])
def test_missing_and_hash_conflicts_are_reported(self):
directory, root = self.create_tree()
self.addCleanup(directory.cleanup)
source = root / "coverage/source-index.jsonl"
source.write_text(json.dumps({"bytes": 1, "kind": "source", "path": "linuxcnc/src/demo.c", "sha256": "different", "source_id": "build:demo"}) + "\n", encoding="utf-8")
report_path = root / "coverage/report.json"
generate(root, root / "out.jsonl", report_path)
report = json.loads(report_path.read_text(encoding="utf-8"))
self.assertTrue(report["hash_conflicts"])
self.assertFalse(report["missing_paths"])
def test_generation_is_deterministic(self):
directory, root = self.create_tree()
self.addCleanup(directory.cleanup)
_, first = generate(root, root / "one.jsonl", root / "report.json")
_, second = generate(root, root / "two.jsonl", root / "report.json")
self.assertEqual(first, second)
self.assertEqual((root / "one.jsonl").read_bytes(), (root / "two.jsonl").read_bytes())
if __name__ == "__main__":
unittest.main()