Files

24 lines
1.4 KiB
Python

import pathlib,sys,tempfile,unittest
sys.path.insert(0,str(pathlib.Path(__file__).parents[1]/'plugins'))
import node_extract
def record(kind,address=0,data=b''):
raw=bytes([len(data)])+address.to_bytes(2,'big')+bytes([kind])+data
return ':'+(raw+bytes([-sum(raw)&255])).hex().upper()
class NodeTests(unittest.TestCase):
def parse(self,lines):
with tempfile.TemporaryDirectory() as d:
p=pathlib.Path(d)/'node.hex';p.write_text('\n'.join(lines));return node_extract.address_inventory(p)
def test_addresses_and_checksum(self):
lines=[record(4,data=b'\x00\x01'),record(0,16,b'ab'),record(1)]
self.assertEqual(self.parse(lines)['minimum_address'],65552)
with self.assertRaises(ValueError):self.parse([lines[0],lines[1][:-2]+'00',lines[2]])
def test_segment_and_entry_point_metadata(self):
result=self.parse([record(2,data=b'\x00\x10'),record(0,2,b'ab'),record(5,data=(258).to_bytes(4,'big')),record(1)])
self.assertEqual(result['minimum_address'],258)
self.assertEqual(result['entry_points'][0]['address'],258)
def test_truncated_overlap_and_address_bounds(self):
for lines in [[record(0,0,b'a')],[record(0,0,b'abc'),record(0,1,b'ab'),record(1)],[record(4,data=b'\xff\xff'),record(0,0,b'a'),record(1)],[record(0,0,b'a'),record(1),record(0,10,b'a')]]:
with self.assertRaises(ValueError):self.parse(lines)
if __name__=='__main__':unittest.main()