from pathlib import Path
import json,ast
P=Path(__file__).resolve().parent
cases=json.loads((P/'fixtures/cases.json').read_text(encoding='utf-8'))['cases']
assert len(cases)==8 and len({c['id'] for c in cases})==8
ast.parse((P/'starter.py').read_text(encoding='utf-8'))
required=['window_label','webview_label','target_platform','capability_membership','capabilities','csp','required_permissions','required_origins','remote_content']
for c in cases:
    for k in required: assert k in c,(c['id'],k)
assert any(len(c['capability_membership'])>1 for c in cases)
assert any('*' in c['csp'].get('connect-src',[]) or 'https:' in c['csp'].get('script-src',[]) for c in cases)
assert any(any('*' in str(s) for s in cap.get('allow_scope',[])) for c in cases for cap in c['capabilities'].values())
assert any(c.get('transfer') for c in cases)
print('PASS learner structural checks: 8 synthetic cases, overlap risk, broad CSP negative, broad native scope negative, transfer fixture')
