from pathlib import Path
import json, sys
from gate_rules import evaluate
ROOT=Path(__file__).parent
cases=[]
for p in sorted((ROOT/'fixtures').glob('*.json')): cases.append((p.stem,p))
for p in sorted((ROOT/'transfer').glob('*.json')): cases.append((p.stem,p))
EXPECT={'baseline': 'LOOP_REVIEW_READY', 'correct_prestep_wrong_artifact': 'HOLD_ARTIFACT_CONTRADICTS_PRESTEP', 'milestone_activity_no_evidence': 'HOLD_COMPLETION_AS_MASTERY', 'missing_support_reason': 'HOLD_SUPPORT_REASON_MISSING', 'jit_after_independent_evidence': 'HOLD_UNNECESSARY_JIT_SUPPORT', 'support_completion_as_mastery': 'HOLD_SUPPORT_AS_MASTERY', 'missing_revision_history': 'HOLD_REVISION_HISTORY_MISSING', 'missing_reviewable_output': 'HOLD_REVIEWABLE_OUTPUT_MISSING', 'missing_exit_evidence': 'HOLD_EXIT_EVIDENCE_MISSING', 'missing_response_ref': 'HOLD_RESPONSE_REF_MISSING', 'missing_signal': 'HOLD_SIGNAL_NOT_TRACEABLE', 'missing_prestep': 'HOLD_PRESTEP_PROMPT_MISSING', 'missing_project_id': 'HOLD_CORE_PROJECT_FIELD_MISSING', 'missing_driving_problem': 'HOLD_CORE_PROJECT_FIELD_MISSING', 'missing_competency': 'HOLD_CORE_PROJECT_FIELD_MISSING', 'missing_milestone': 'HOLD_CORE_PROJECT_FIELD_MISSING', 'checkpoint_artifact_missing': 'HOLD_CHECKPOINT_UNSUPPORTED', 'no_jit_independent_ready': 'NO_JIT_REQUIRED_EVIDENCE_ALREADY_INDEPENDENT', 'hold_unknown_exit': 'HOLD_EXIT_EVIDENCE_MISSING', 'transfer_recomputed': 'TRANSFER_REVIEW_READY', 'transfer_baseline_oracle_reuse': 'HOLD_TRANSFER_BASELINE_ORACLE_REUSE', 'transfer_not_recomputed': 'HOLD_TRANSFER_NOT_RECOMPUTED', 'transfer_missing_context_output': 'HOLD_REVIEWABLE_OUTPUT_MISSING'}
passed=0
for name,p in cases:
    state=evaluate(json.loads(p.read_text(encoding='utf-8')))
    ok=state==EXPECT[name]
    print(('PASS' if ok else 'FAIL'), name, '=>', state, 'expected', EXPECT[name])
    passed+=int(ok)
# extra invariant tests make the suite 27 checks total
from copy import deepcopy
b=json.loads((ROOT/'fixtures/baseline.json').read_text())
extra=[]
x=deepcopy(b); x['evidence_opportunity']='UNKNOWN'; extra.append(('unknown_evidence', evaluate(x)=='HOLD_COMPLETION_AS_MASTERY'))
x=deepcopy(b); x['jit_instruction_id']='JIT-X'; x['support_reason']=''; extra.append(('blank_support_reason', evaluate(x)=='HOLD_SUPPORT_REASON_MISSING'))
x=deepcopy(b); x['transfer_variant']='NEW_DOMAIN'; x['transfer_recomputed']=True; x['baseline_decision_reused']=False; extra.append(('changed_domain_recomputed', evaluate(x)=='TRANSFER_REVIEW_READY'))
x=deepcopy(b); x['checkpoint_state']='MASTERED_FROM_JIT'; extra.append(('jit_mastery_forbidden', evaluate(x)=='HOLD_SUPPORT_AS_MASTERY'))
for name,ok in extra:
    print(('PASS' if ok else 'FAIL'), name); passed+=int(ok)
total=len(cases)+len(extra)
print(f'RESULT {passed}/{total} PASS')
sys.exit(0 if passed==total else 1)
