import tempfile
import unittest
from pathlib import Path

from harness import grade, load_jsonl, run_cases, summarize


class HarnessTests(unittest.TestCase):
    def test_grade_combines_checks(self):
        case = {"expected": {"contains": ["source"], "forbidden": ["guess"], "pattern": "^Use"}}
        passed, score, checks = grade(case, "Use the source")
        self.assertTrue(passed)
        self.assertEqual(score, 1.0)
        self.assertTrue(all(checks.values()))

    def test_candidate_error_is_result(self):
        results = run_cases([{"id": "broken"}], lambda _: 1 / 0)
        self.assertFalse(results[0].passed)
        self.assertIn("ZeroDivisionError", results[0].error or "")

    def test_summary(self):
        cases = [
            {"id": "one", "candidate_output": "yes", "expected": {"exact": "yes"}},
            {"id": "two", "candidate_output": "no", "expected": {"exact": "yes"}},
        ]
        report = summarize(run_cases(cases, lambda case: case["candidate_output"]))
        self.assertEqual(report["cases"], 2)
        self.assertEqual(report["pass_rate"], 0.5)

    def test_load_jsonl_requires_id(self):
        with tempfile.TemporaryDirectory() as directory:
            path = Path(directory) / "cases.jsonl"
            path.write_text('{"input": "missing id"}\n', encoding="utf-8")
            with self.assertRaises(ValueError):
                load_jsonl(path)


if __name__ == "__main__":
    unittest.main()
