from __future__ import annotations import pytest from pydantic import ValidationError from gap_pipeline.models import JudgeVerdict, KernelCandidate, KernelPlan def test_valid_plan_and_candidate(plan_dict: dict, candidate_dict: dict) -> None: plan = KernelPlan.model_validate(plan_dict) candidate = KernelCandidate.model_validate(candidate_dict) assert len(plan.core_steps) == 2 assert candidate.question.startswith("Let x") def test_plan_requires_slots(plan_dict: dict) -> None: plan_dict["mutable_slots"] = {} with pytest.raises(ValidationError, match="mutable slot"): KernelPlan.model_validate(plan_dict) def test_plan_rejects_more_than_five_core_steps(plan_dict: dict) -> None: plan_dict["core_steps"] = [f"step {index}" for index in range(6)] with pytest.raises(ValidationError): KernelPlan.model_validate(plan_dict) def test_candidate_requires_question_and_solution(candidate_dict: dict) -> None: candidate_dict["solution"] = "" with pytest.raises(ValidationError, match="non-empty"): KernelCandidate.model_validate(candidate_dict) def test_accept_verdict_cannot_report_blocking_issue() -> None: with pytest.raises(ValidationError, match="cannot contain"): JudgeVerdict( verdict="accept", step_by_step_check="checked", blocking_issues="an error", )