From 95d8b69c68a17cf3fbcfb6d9f4752c9a90e9da69 Mon Sep 17 00:00:00 2001 From: s-ol Date: Thu, 28 May 2020 14:42:14 +0200 Subject: tests, cleanup, verify.py --- subx.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 78 insertions(+), 24 deletions(-) (limited to 'subx.py') diff --git a/subx.py b/subx.py index 53f72ce..ed3b184 100644 --- a/subx.py +++ b/subx.py @@ -1,40 +1,94 @@ import re white = re.compile('[ \t\.\n]+') -hex = re.compile('^(0x)?[0-9a-f]+$') +hex = re.compile(r'^\-?(0x)?[0-9a-f]+$') def parse_part(part): - part = part.split('/') - if hex.match(part[0]): - part[0] = int(part[0], 16) - return tuple(part) + part = part.split('/') + if hex.match(part[0]): + part[0] = int(part[0], 16) + return tuple(part) def parse_instr(line): - parts = white.split(line) - parts = [parse_part(part) for part in parts if part != ''] - return parts + parts = white.split(line) + parts = [parse_part(part) for part in parts if part != ''] + return parts def parse_segment(line): - parts = white.split(line) - return (parts[1], int(parts[2], 16)) + parts = white.split(line) + return (parts[1], int(parts[2], 16)) + +def is_lref(part): + return isinstance(part[0], str) + +def unlabel(part, expect=None): + if expect and part[1] != expect: + raise ValueError("expected {} to be labelled {}", part, expect) + return part[0] def format_part(part): - if not isinstance(part[0], str): - part = ('{:02x}'.format(part[0]),) + part[1:] - return '/'.join(part) + if not is_lref(part): + first = '{:02x}'.format(part[0]) + part = (first,) + part[1:] + return '/'.join([str(p) for p in part]) def format_instr(inst, comment=None): - packed = ' '.join(format_part(part) for part in inst) - if comment: - packed = packed + ' # ' + comment - return packed + packed = ' '.join(format_part(part) for part in inst) + if comment: + packed = packed + ' # ' + comment + return packed def clean(line): - return line.strip().split('#')[0] + return line.strip().split('#')[0] def classify(line): - if line.startswith('=='): # segment - return 'segment' - elif line.endswith(':'): # label - return 'label' - else: - return 'instr' + if line.startswith('=='): # segment + return 'segment' + elif line.endswith(':'): # label + return 'label' + else: + return 'instr' + +import unittest +class TestParsing(unittest.TestCase): + def test_parse_part(self): + self.assertEqual(parse_part('0'), (0,)) + self.assertEqual(parse_part('00'), (0,)) + self.assertEqual(parse_part('0x00'), (0,)) + + self.assertEqual(parse_part('12'), (0x12,)) + self.assertEqual(parse_part('0x12'), (0x12,)) + + self.assertEqual(parse_part('-12'), (-0x12,)) + self.assertEqual(parse_part('-0x12'), (-0x12,)) + + self.assertEqual(parse_part('00/with/tag'), (0, 'with', 'tag')) + self.assertEqual(parse_part('-12/and<