from decode_timing import decode
import struct
v=[0x544d3830,1,2,1,1,2000,2000,16,16,0,0,0,128000000,3840,30,3]
sample=struct.pack('<HHH2xIIIB3x4I',0x123,0x456,200,60,80,1,0,9,5,1,2)
pack=lambda vals:struct.pack('<16I',*vals)
cases=0
assert decode(pack(v))['completed_window_within_supplied_limits'];cases+=1
assert decode(pack(v)+sample,2,2)['coherence_values_consistent'];cases+=1
for field,value in [(0,0),(1,2),(2,3),(3,0),(4,2),(5,0),(5,3841),(6,3841),(7,31),(8,31),(10,31),(11,5),(11,3),(12,16000000),(13,3841),(14,31),(15,7)]:
 w=v.copy();w[field]=value
 try:decode(pack(w));raise AssertionError('bad record accepted')
 except ValueError:cases+=1
for epochs in [(None,None),(1,1),(2,4)]:
 try:decode(pack(v)+sample,*epochs);raise AssertionError('bad coherence accepted')
 except ValueError:cases+=1
for length in [0,63,65,103,105]:
 try:decode(bytes(length));raise AssertionError('bad length accepted')
 except ValueError:cases+=1
w=v.copy();w[11]=3;w[15]=1;assert not decode(pack(w))['completed_window_within_supplied_limits'];cases+=1
w=v.copy();w[3]=w[4]=0;w[15]=1;assert not decode(pack(w))['completed_window_within_supplied_limits'];cases+=1
for result in [decode(pack(v)),decode(pack(v)+sample,2,2)]:assert result['physical_validation'] is False and result['actual_hardware_source_proven'] is False and result['continuous_20kHz_qualified'] is False;cases+=1
print(f'{cases} TIMING DECODE / INVALID CAPTURE / UNVERIFIED STATUS CASES PASS')
