"""独立离线核验；Python 3.12 标准库，无网络或设备访问。"""
from pathlib import Path
import json
import struct
import datetime as dt
import math
import re
import uuid

def parse(d):
    b=bytes.fromhex(d['hex'])
    if not b: raise ValueError('空标签')
    tag=b[0]>>4; context=bool(b[0]&8); lvt=b[0]&7; i=1
    if tag==15:
        if i>=len(b): raise ValueError('扩展标签号缺失')
        tag=b[i]; i+=1
    if lvt in (6,7):
        if not context or i!=len(b): raise ValueError('构造标签错误')
        return {'tag':tag,'context':True,'kind':'opening' if lvt==6 else 'closing','length':0,'payload_hex':''}
    if not context and tag==1: raise ValueError('Boolean需专用解析')
    size=lvt
    if lvt==5:
        if i>=len(b): raise ValueError('扩展长度缺失')
        size=b[i]; i+=1
        if size in (254,255):
            width=2 if size==254 else 4
            if i+width>len(b): raise ValueError('扩展长度缺失')
            size=int.from_bytes(b[i:i+width],'big'); i+=width
    if i+size!=len(b): raise ValueError('负载长度不匹配')
    return {'tag':tag,'context':context,'kind':'value','length':size,'payload_hex':b[i:].hex()}


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()
