from pathlib import Path
import json,sys
R=Path(__file__).resolve().parent
sys.path.insert(0,str(R))
from gate_rules import evaluate
CASES={'fixtures/baseline.json': 'MASTERY_REOPEN_CONTRADICTION', 'fixtures/review_ready.json': 'MASTERY_EVIDENCE_REVIEW_READY', 'fixtures/activity_only.json': 'MASTERY_DEVELOPING', 'fixtures/activity_promotes.json': 'HOLD_ACTIVITY_ONLY_PROMOTION', 'fixtures/contradiction_erased.json': 'HOLD_CONTRADICTION_ERASURE', 'fixtures/stale_review.json': 'MASTERY_REVIEW_STALE', 'fixtures/stale_preserve_mastery.json': 'HOLD_STALE_MASTERY', 'fixtures/sparse_strong_mastery.json': 'HOLD_SPARSE_DIMENSIONS', 'fixtures/mastery_overclaim_guided.json': 'HOLD_MASTERY_OVERCLAIM', 'fixtures/bad_time.json': 'HOLD_EVENT_TIME', 'fixtures/unknown_type.json': 'HOLD_EVIDENCE_TYPE', 'fixtures/unknown_independence.json': 'HOLD_INDEPENDENCE', 'fixtures/unknown_quality.json': 'HOLD_QUALITY', 'fixtures/invalid_state.json': 'HOLD_MASTERY_STATE', 'fixtures/missing_rule.json': 'HOLD_TRANSITION_RULE', 'fixtures/unknown_confidence.json': 'HOLD_CONFIDENCE', 'fixtures/unknown_contradiction.json': 'HOLD_CONTRADICTION_STATE', 'fixtures/unknown_staleness.json': 'HOLD_STALENESS', 'fixtures/bad_review_due.json': 'HOLD_REVIEW_DUE', 'fixtures/missing_provenance.json': 'HOLD_PROVENANCE', 'fixtures/missing_required_field.json': 'HOLD_INSUFFICIENT_EVIDENCE', 'fixtures/mixed_core_stale.json': 'MASTERY_REVIEW_STALE', 'transfer/transfer_recomputed.json': 'MASTERY_DEVELOPING', 'transfer/transfer_not_recomputed.json': 'HOLD_TRANSFER_NOT_RECOMPUTED', 'transfer/transfer_baseline_oracle_reuse.json': 'HOLD_BASELINE_ORACLE_REUSE'}
fail=[]
for rel,expected in CASES.items():
 x=json.loads((R/rel).read_text()); got=evaluate(x)['state']; print(rel,got,'PASS' if got==expected else 'FAIL')
 if got!=expected: fail.append((rel,expected,got))
print(f'passed={len(CASES)-len(fail)}/{len(CASES)}')
if fail: print(fail); sys.exit(1)
