diff --git a/tests/test_benchmark_chart.py b/tests/test_benchmark_chart.py new file mode 100644 index 0000000..04f5ae6 --- /dev/null +++ b/tests/test_benchmark_chart.py @@ -0,0 +1,66 @@ +import json +from pathlib import Path +from typing import Any, Callable + +import pytest + + +ROOT = Path(__file__).resolve().parents[1] +DATA_PATH = ROOT / "benchmarks" / "source_review.json" + + +def _renderer_api() -> tuple[Callable[[Path], dict[str, Any]], Callable[..., None]]: + try: + from benchmarks.render_chart import load_benchmark, render_chart + except ModuleNotFoundError: + pytest.fail("benchmarks.render_chart is not implemented") + return load_benchmark, render_chart + + +def test_source_review_contract_is_complete() -> None: + load_benchmark, _ = _renderer_api() + raw = json.loads(DATA_PATH.read_text(encoding="utf-8")) + data = load_benchmark(DATA_PATH) + + assert data == raw + assert data["schema_version"] == "1.0" + assert sum(item["weight"] for item in data["rubric"]) == 100 + assert data["evidence_boundary"] == "source_review_not_shared_live_run" + + projects = data["projects"] + repositories = [item["repository"] for item in projects] + assert len(repositories) == len(set(repositories)) + assert "U-C4N/Autocad-MCP" in repositories + assert "varavista/autocad-mcp" in repositories + assert "beiming183-cloud/AutoCAD-MCP" in repositories + assert "AnCode666/multiCAD-mcp" in repositories + assert "puran-water/autocad-mcp" in repositories + assert "NCO-1986/AutoCAD_mcp" in repositories + assert all(0 <= item["score"] <= 100 for item in projects) + assert all(item["evidence_grade"] in {"A", "B", "C"} for item in projects) + + +def test_load_benchmark_rejects_duplicate_repositories(tmp_path: Path) -> None: + load_benchmark, _ = _renderer_api() + payload = json.loads(DATA_PATH.read_text(encoding="utf-8")) + payload["projects"].append(payload["projects"][0].copy()) + invalid = tmp_path / "duplicate.json" + invalid.write_text(json.dumps(payload), encoding="utf-8") + + with pytest.raises(ValueError, match="duplicate repository"): + load_benchmark(invalid) + + +def test_render_chart_writes_readable_svg(tmp_path: Path) -> None: + load_benchmark, render_chart = _renderer_api() + pytest.importorskip("matplotlib") + data = load_benchmark(DATA_PATH) + output = tmp_path / "benchmark.svg" + + render_chart(data, output) + + svg = output.read_text(encoding="utf-8") + assert svg.lstrip().startswith("