# Tokenwerk: festes Offline-Testpaket, keine Modell-/API-Anfrage.
import json, pathlib, sys
from basis_pruefen import matches, EXPECTED
ROOT = pathlib.Path(__file__).resolve().parent
def parse(raw):
    return json.loads(raw, parse_constant=lambda s: (_ for _ in ()).throw(ValueError(s)))
def check(raw, strict=False):
    try:
        data = parse(raw)
    except ValueError:
        return False
    return matches(data, EXPECTED) and (not strict or set(data) == set(EXPECTED))
def main():
    if len(sys.argv) == 2 and sys.argv[1] == '--self-test':
        cases = json.loads((ROOT/'testfaelle.json').read_text(encoding='utf8'))
        rows = []
        for case in cases:
            row = {'id': case['id'], 'title': case['title']}
            for mode in ['baseline', 'strict']:
                actual = check(case['raw'], strict=mode == 'strict')
                if actual is not case['expected_'+mode]:
                    raise SystemExit('Abweichung: '+case['id']+' '+mode)
                row[mode] = actual
            rows.append(row)
        print(json.dumps(rows,ensure_ascii=False,indent=2))
        return
    if len(sys.argv) not in (2,3) or (len(sys.argv) == 3 and sys.argv[2] != '--strict'):
        raise SystemExit('python pruefen.py --self-test ODER python pruefen.py antwort.json [--strict]')
    with open(sys.argv[1],encoding='utf-8-sig') as f:
        raw=f.read(1000001)
    if len(raw)>1000000:
        raise SystemExit('Datei fuer diese Uebung zu gross.')
    ok=check(raw,strict=len(sys.argv)==3)
    print('Soll erfuellt.' if ok else 'Abweichung vom Soll.')
    raise SystemExit(0 if ok else 1)
if __name__ == '__main__': main()
