import struct
from decode_current import decode
base=[0x43513833,1,4,2,0,256,524288,524288,100,-200,100,257,12910,7,2000,3300000,3300000,0,0,176043]
def blob(v):return struct.pack('<8I3i9I',*v)
d=decode(blob(base),4,4);assert d['software_candidate_valid'] and not d['physical_calibration_verified'] and not d['actual_hardware_source_proven'] and not d['motor_run_permission'] and not d['third_phase_independently_measured'];cases=1
for index,value in [(0,0),(1,2),(2,3),(3,0),(4,8),(5,255),(5,257),(6,0),(7,0),(10,99),(13,15),(13,3),(14,0),(14,2001),(15,0),(16,1550000),(17,17),(18,17),(19,176044),(8,2001)]:
 v=base.copy();v[index]=value
 try:decode(blob(v),4,4)
 except ValueError:cases+=1
 else:raise AssertionError((index,value))
for before,after in [(2,4),(4,6),(3,3),(0,0)]:
 try:decode(blob(base),before,after)
 except ValueError:cases+=1
 else:raise AssertionError('bad epoch accepted')
for data in [b'',blob(base)[:-1],blob(base)+b'\x00']:
 try:decode(data,4,4)
 except ValueError:cases+=1
 else:raise AssertionError('bad size accepted')
v=base.copy();v[3]=1;v[5]=255;v[13]=0;assert not decode(blob(v),4,4)['software_candidate_valid'];cases+=1
for fault in range(1,9):
 v=base.copy();v[3]=3;v[4]=fault;v[13]=5;assert not decode(blob(v),4,4)['software_candidate_valid'];cases+=1
v=[0x43513833,1,2,3,1]+[0]*15;assert not decode(blob(v),2,2)['software_candidate_valid'];cases+=1
print(f'{cases} CURRENT DECODE / EPOCH / INVALID RECORD / UNVERIFIED SOURCE CASES PASS')
