"""独立离线核验；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=1
    if not b or b[0]&0xc0: raise ValueError('DataValue掩码错误')
    mask=b[0]; out={'value':None,'status':0,'source_ticks':None,'server_ticks':None,'source_pico':None,'server_pico':None}; present=[]
    def read(n,signed=False):
        nonlocal i
        if i+n>len(b): raise ValueError('DataValue字段截短')
        v=int.from_bytes(b[i:i+n],'little',signed=signed); i+=n; return v
    if mask&1:
        if read(1)!=6: raise ValueError('只支持Int32 Variant值')
        out['value']=read(4,True); present.append('value')
    if mask&2: out['status']=read(4); present.append('status')
    for bit,name,size in ((4,'source_ticks',8),(16,'source_pico',2),(8,'server_ticks',8),(32,'server_pico',2)):
        if mask&bit:
            v=read(size,name.endswith('ticks')); out[name]=min(v,9999) if name.endswith('pico') else v; present.append(name)
    if not mask&4: out['source_pico']=None
    if not mask&8: out['server_pico']=None
    if i!=len(b): raise ValueError('DataValue有多余字段')
    out['present']=present
    return out


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()
