"""独立离线核验；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']); i=0
    def need(n):
        nonlocal i
        if i+n>len(b): raise ValueError('嵌套值截短')
        v=b[i:i+n]; i+=n; return v
    if need(1)!=bytes([0x0c]): raise ValueError('对象上下文错误')
    oid=int.from_bytes(need(4),'big')
    if need(1)!=bytes([0x1e]): raise ValueError('属性列表开始错误')
    props=[]
    while i<len(b) and b[i]!=0x1f:
        if need(1)!=bytes([0x29]): raise ValueError('属性号标签错误')
        pid=need(1)[0]; choice=need(1)[0]
        if choice==0x4e:
            tag=need(1)[0]
            if tag==0x44: row={'id':pid,'value_type':'REAL','value':struct.unpack('>f',need(4))[0]}
            elif tag==0x91: row={'id':pid,'value_type':'Enumerated','value':need(1)[0]}
            else: raise ValueError('值类型超出子集')
            if need(1)!=bytes([0x4f]): raise ValueError('值关闭标签错误')
        elif choice==0x5e:
            if need(1)!=bytes([0x91]): raise ValueError('错误类别标签错误')
            ec=need(1)[0]
            if need(1)!=bytes([0x91]): raise ValueError('错误码标签错误')
            row={'id':pid,'error_class':ec,'error_code':need(1)[0]}
            if need(1)!=bytes([0x5f]): raise ValueError('错误关闭标签错误')
        else: raise ValueError('结果分支错误')
        props.append(row)
    if need(1)!=bytes([0x1f]) or i!=len(b): raise ValueError('属性列表关闭错误')
    return {'object_type':oid>>22,'instance':oid&0x3fffff,'properties':props}


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()
