"""独立离线核验；Python 3.12 标准库，无网络或设备访问。"""
from pathlib import Path
import json
import struct
import datetime as dt
import math
import re
import uuid

def parse(d):
    objects={}; last=-1
    for page_index,h in enumerate(d['pages']):
        b=bytes.fromhex(h)
        if len(b)<7 or b[:2]!=bytes([43,14]): raise ValueError('识别头错误')
        more,nxt,count=b[4:7]; i=7
        for _ in range(count):
            if i+2>len(b): raise ValueError('对象长度越界')
            oid,size=b[i:i+2]; i+=2
            if i+size>len(b): raise ValueError('对象长度越界')
            if str(oid) in objects: raise ValueError('重复对象号')
            objects[str(oid)]=b[i:i+size].decode('ascii'); i+=size; last=max(last,oid)
        if i!=len(b): raise ValueError('多余对象数据')
        if more not in (0,255): raise ValueError('More Follows非法')
        if more==255 and nxt<=last: raise ValueError('下一对象号未前进')
        if more==0 and page_index!=len(d['pages'])-1: raise ValueError('结束后仍有页')
        if more==255 and page_index==len(d['pages'])-1: raise ValueError('分页未收齐')
    return {'objects':objects,'pages':len(d['pages'])}


def main():
    root = Path(__file__).resolve().parent
    fixture = json.loads((root / "fixture.json").read_text(encoding="utf-8"))
    rows = []
    for item in fixture["cases"]:
        try:
            result = parse(item["input"])
        except ValueError as exc:
            assert "expected_error" in item, (item["case_id"], str(exc))
            assert str(exc) == item["expected_error"], (item["case_id"], str(exc))
            rows.append({"case_id": item["case_id"], "kind": item["kind"], "rejected": str(exc)})
        else:
            assert "expected_error" not in item, item["case_id"]
            assert result == item["expected"], (item["case_id"], result, item["expected"])
            rows.append({"case_id": item["case_id"], "kind": item["kind"], "result": result})
    report = {"fixture": fixture["topic"], "cases": rows, "assertions_passed": len(rows), "scope": "合成输入离线演算；未接真实设备"}
    (root / "report.json").write_text(json.dumps(report, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
    print(json.dumps({"assertions_passed": len(rows), "all_passed": True}, ensure_ascii=True))

if __name__ == "__main__":
    main()
