Spaces:
Sleeping
Sleeping
| """Versioned expectations for kink merge / normalization (see tests/fixtures/normalization_benchmark_v1.json). | |
| The fixture includes two hand-authored clusters (Snuggles, FMF vs MFM) plus **20** reproducible | |
| case-only duplicates sampled with ``random_seed`` from ``scripts/generate_normalization_benchmark_fixture.py``. | |
| Metrics: each case is a cluster-level check (canonical id + duplicate set vs ``propose_merge_clusters``). | |
| Regenerate the random block only when merge rules change intentionally: run the generator and review the diff. | |
| """ | |
| from __future__ import annotations | |
| import json | |
| from pathlib import Path | |
| from backend.kink_merge import propose_merge_clusters | |
| _FIXTURE = Path(__file__).resolve().parent / "fixtures" / "normalization_benchmark_v1.json" | |
| def _fixture() -> dict: | |
| return json.loads(_FIXTURE.read_text(encoding="utf-8")) | |
| def _cases() -> list[dict]: | |
| return _fixture()["merge_cluster_cases"] | |
| def test_normalization_benchmark_fixture_has_twenty_seeded_random_cases() -> None: | |
| data = _fixture() | |
| assert data.get("random_case_only_count") == 20 | |
| assert data.get("random_seed") == 42 | |
| assert len(data["merge_cluster_cases"]) == 22 | |
| def test_normalization_benchmark_merge_clusters() -> None: | |
| """Each benchmark case must match propose_merge_clusters output (golden + ≥20 seeded samples).""" | |
| for case in _cases(): | |
| rows = [tuple(r) for r in case["rows"]] | |
| clusters = propose_merge_clusters(rows) | |
| canon = case["expect_canonical_id"] | |
| matched = [c for c in clusters if c["canonical_id"] == canon] | |
| assert len(matched) == 1, (case, clusters) | |
| c0 = matched[0] | |
| assert set(c0["duplicate_ids"]) == set(case["expect_duplicate_ids"]) | |
| for eid in case.get("expect_excluded_ids", []): | |
| assert eid not in c0["duplicate_ids"], c0 | |
| assert eid != c0["canonical_id"], c0 | |