"""Tests for benchmark summary pass coercion normalization."""

from __future__ import annotations

import json
from pathlib import Path

from ai_research.benchmarks.normalize_benchmark_summary import (
    _coerce_pass,
    normalize_summary,
)


@pytest.mark.parametrize(
    "raw, status, expected",
    [
        (True, "passed", 1),
        (False, "failed", 0),
        (1, "unknown", 1),
        (0, "unknown", 0),
        ("1", "unknown", 1),
        ("0", "unknown", 0),
        ("pass", "unknown", 1),
        ("fail", "unknown", 0),
        ("False", "unknown", 0),
        ("0", "passed", 0),
        ("", "passed", 0),
    ],
)
def test_coerce_pass_variants(raw, status, expected):
    assert _coerce_pass(raw, status=status) == expected


def test_normalize_summary_fixtures_run(tmp_path: Path):
    fixture = {
        "benchmarks": [
            {"name": "truthy-string", "pass": "pass", "status": "done"},
            {"name": "false-string", "pass": "false", "status": "done"},
            {"name": "true-bool", "pass": True, "status": "done"},
            {"name": "false-bool", "pass": False, "status": "done"},
            {"name": "numeric-one", "pass": 1, "status": "done"},
            {"name": "numeric-zero", "pass": 0, "status": "done"},
            {"name": "status-pass", "status": "passed"},
            {"name": "missing", "status": "failed"},
        ]
    }

    normalized = normalize_summary(fixture)
    assert [b["pass"] for b in normalized["benchmarks"]] == [1, 0, 1, 0, 1, 0, 1, 0]
    assert len(normalized["benchmarks"]) == 8
    assert sum(b["pass"] for b in normalized["benchmarks"]) == 4

    output_path = tmp_path / "normalized_summary.json"
    output_path.write_text(json.dumps(normalized, indent=2), encoding="utf-8")
    loaded = json.loads(output_path.read_text(encoding="utf-8"))
    pass_rate = sum(item["pass"] for item in loaded["benchmarks"]) / len(loaded["benchmarks"])
    assert pass_rate == 0.5
