rushabhcodes/fidget-counter

A tscircuit package created by rushabhcodes.

Version
1.0.31
License
unset
Stars
0

firmware/tests/test_tools.py

import importlib.util, struct, sys, tempfile, types, unittest
from pathlib import Path
from unittest.mock import patch
TOOLS = Path(__file__).resolve().parents[1] / "tools"
sys.path.insert(0, str(TOOLS))
from verify_build import check_hex
with patch.dict(sys.modules, {"bleak":types.SimpleNamespace(BleakClient=None,BleakScanner=None)}):
    from client import decode

def record(kind, address=0, data=b""):
    body = bytes([len(data)]) + address.to_bytes(2,"big") + bytes([kind]) + data
    return ":" + (body + bytes([-sum(body) & 255])).hex().upper()
def image(stack=0x20005800, reset=0x101, extra=()):
    return [record(0,0,struct.pack("<II",stack,reset)),record(0,0x100,b"\x70\x47"),*extra,record(1)]

class Tools(unittest.TestCase):
    def check(self, lines):
        with tempfile.TemporaryDirectory() as d:
            p = Path(d) / "test.hex"
            p.write_text("\n".join(lines)+"\n")
            return check_hex(p)
    def test_real_vectors(self):
        self.assertEqual(self.check(image())["initial_stack"],"0x20005800")
    def test_bad_checksum(self):
        lines = image(); lines[0] = lines[0][:-2]+"00"
        with self.assertRaises(ValueError): self.check(lines)
    def test_reserved_storage(self):
        with self.assertRaises(ValueError):
            self.check(image(extra=[record(4,data=b"\x00\x02"),record(0,0xe000,b"\x01")]))
    def test_uicr_write(self):
        with self.assertRaises(ValueError):
            self.check(image(extra=[record(4,data=b"\x10\x00"),record(0,0x1208,b"\x00")]))
    def test_wrong_ram_and_reset(self):
        for stack,reset in [(0x20008000,0x101),(0x20005804,0x101),(0x20005800,0x100),(0x20005800,0x2e001)]:
            with self.subTest(stack=stack,reset=reset),self.assertRaises(ValueError):
                self.check(image(stack,reset))
    def test_segment_records(self):
        self.check(image(extra=[record(2,data=b"\x10\x00"),record(0,0,b"\x01"),record(3,data=b"\x00\x00\x01\x01")]))
    def test_segment_into_storage(self):
        with self.assertRaises(ValueError):
            self.check(image(extra=[record(2,data=b"\x2e\x00"),record(0,0,b"\x01")]))
    def test_malformed_segment(self):
        with self.assertRaises(ValueError): self.check(image(extra=[record(2,data=b"\x01")]))
    def test_missing_entry_code(self):
        with self.assertRaises(ValueError): self.check(image(reset=0x201))
    def test_missing_eof(self):
        with self.assertRaises(ValueError): self.check(image()[:-1])
    def test_conflicting_data(self):
        with self.assertRaises(ValueError): self.check(image(extra=[record(0,0x100,b"\x00")]))
    def test_data_after_eof(self):
        with self.assertRaises(ValueError): self.check(image()+[record(0,0x101,b"\x00")])
    def test_ble_wire_format(self):
        data = struct.pack("<BBHIIII",1,31,4320,7,5,12,1234)
        state = decode(data)
        self.assertEqual((state["angle_degrees"],state["total"],state["forward"],state["reverse"],state["sequence"]),(270,12,7,5,1234))
        self.assertTrue(all(state[k] for k in ["sensor_fault","storage_fault","unsaved","sample_gap","saturated"]))
    def test_bad_ble_payload(self):
        for data in [b"",b"x"*19,bytes([2])+bytes(19)]:
            with self.subTest(data=data),self.assertRaises(ValueError): decode(data)
if __name__ == "__main__": unittest.main()