from pathlib import Path
import json
from gate_rules import evaluate,inspect_transfer
R=Path(__file__).parent
def load(p): return json.loads((R/p).read_text())
checks=[
('baseline.json','FORECAST_REVIEW_REQUIRED'),
('single_point_durations.json','HOLD_UNCERTAINTY_MODEL'),
('missing_distribution_basis.json','HOLD_DISTRIBUTION_BASIS'),
('broken_dependency.json','HOLD_DEPENDENCY'),
('risk_certain_without_revision.json','REFORECAST_REQUIRED'),
('missing_risk_impact.json','HOLD_RISK_MODEL'),
('deterministic_date_only.json','HOLD_OUTPUT_CONTRACT'),
('missing_sensitivity.json','HOLD_SENSITIVITY'),
('missing_model_ref.json','HOLD_MODEL_EVIDENCE'),
('missing_audit_provenance.json','HOLD_AUDIT_PROVENANCE'),
('actuals_changed_stale_revision.json','REFORECAST_REQUIRED')]
base=None
for i,(n,e) in enumerate(checks,1):
 out=evaluate(load('fixtures/'+n)); assert out['state']==e,(n,out,e); print('PASS',i,n,out['state']);
 if n=='baseline.json': base=out
tr=load('transfer/transfer_fixture.json'); tout=evaluate(tr); assert tout['state']=='FORECAST_REVIEW_REQUIRED'; assert tout['p80_date']!=base['p80_date']; print('PASS 12 transfer',tout['state'],base['p80_date'],'->',tout['p80_date'])
bad=load('transfer/transfer_baseline_oracle_reuse.json'); assert evaluate(bad)['state']=='HOLD_BASELINE_ORACLE_REUSE'; assert 'BASELINE_ORACLE_REUSE_FORBIDDEN' in inspect_transfer(bad)
print('12/12 PASS')
