Example #1
0
 def test_empty_input(self):
     input_stream = io.StringIO("")
     with pytest.raises(ParserError) as e:
         _parse_asm_code(input_stream, "proc_name")
     assert str(e.value) == "missing procedure"
     assert e.value.line_number == 0
     del e  # explicitly break reference cycle
Example #2
0
 def test_no_proc_start(self, proc_name, proc_start):
     input_stream = io.StringIO(proc_start + "\n")
     with pytest.raises(ParserError) as e:
         _parse_asm_code(input_stream, proc_name)
     assert str(e.value) == "missing procedure"
     assert e.value.line_number == 1
     del e  # explicitly break reference cycle
Example #3
0
 def test_multiple_procedure_start(self, expected_error_line, input):
     proc_name = "my_proc"
     input_stream = io.StringIO(input.format(proc_name))
     with pytest.raises(ParserError) as e:
         _parse_asm_code(input_stream, proc_name)
     assert str(e.value) == "multiple procedure start"
     assert e.value.line_number == expected_error_line
     del e  # explicitly break reference cycle
Example #4
0
    def test_code_offset(self, code_line, next_offset):
        proc_name = "my_proc"
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  {1}
  {2}\tff\t inst\t args
{0} ENDP\t; {0}
""".format(proc_name, code_line, next_offset))
        _parse_asm_code(input_stream, proc_name)
Example #5
0
 def test_broken_code_line_continuation(self, expected_error_line,
         expected_error_message, input):
     proc_name = "my_proc"
     input_stream = io.StringIO(input.format(proc_name))
     with pytest.raises(ParserError) as e:
         _parse_asm_code(input_stream, proc_name)
     assert str(e.value) == expected_error_message
     assert e.value.line_number == expected_error_line
     del e  # explicitly break reference cycle
Example #6
0
    def test_code_offset_after_comment(self):
        proc_name = "my_proc"
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  00100\t11 22 33 44 55 66 77 88 99 aa\t inst\t args
a commento!
  0010a\tff\t inst\t args
{0} ENDP\t; {0}
""".format(proc_name))
        _parse_asm_code(input_stream, proc_name)
Example #7
0
    def test_no_proc_end(self, proc_name, proc_end):
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  00005\tc3\t ret\t 0
{1}
""".format(proc_name, proc_end))
        with pytest.raises(ParserError) as e:
            _parse_asm_code(input_stream, proc_name)
        assert str(e.value) == "procedure incomplete"
        assert e.value.line_number == 3
        del e  # explicitly break reference cycle
Example #8
0
    def test_no_proc_code(self):
        proc_name = "mandula"
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
humpty-dumpty hang by a hose
humpty-dumpty had a flat nose
{0} ENDP\t; {0}
""".format(proc_name))
        with pytest.raises(ParserError) as e:
            _parse_asm_code(input_stream, proc_name)
        assert str(e.value) == "missing procedure code"
        assert e.value.line_number == 4
        del e  # explicitly break reference cycle
Example #9
0
    def test_decorated_proc_name_mismatch(self):
        proc_name = "my_proc"
        input_stream = io.StringIO("""\
??1287fafa{0}lo@@lo! PROC\t; {0}
  00100\t11 22 33 44 55 66 77 88 99 aa\t inst\t args
  0010a\tff\t inst\t args
--1287fafa{0}lo@@lo! ENDP\t; {0}
""".format(proc_name))
        with pytest.raises(ParserError) as e:
            _parse_asm_code(input_stream, proc_name)
        assert str(e.value) == "decorated PROC/ENDP proc name mismatch"
        assert e.value.line_number == 4
        del e  # explicitly break reference cycle
Example #10
0
    def test_code_offset_after_comment__bad(self):
        proc_name = "my_proc"
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  00100\t11 22 33 44 55 66 77 88 99 aa\t inst\t args
a commento!
  0010b\tff\t inst\t args
{0} ENDP\t; {0}
""".format(proc_name))
        with pytest.raises(ParserError) as e:
            _parse_asm_code(input_stream, proc_name)
        assert str(e.value) == "bad code offset"
        assert e.value.line_number == 4
        del e  # explicitly break reference cycle
Example #11
0
    def test_code_offset__bad(self, code_line_1, code_line_2):
        proc_name = "my_proc"
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  {1}
  {2}
{0} ENDP\t; {0}
""".format(proc_name, code_line_1, code_line_2))
        expected_error_line_number = 3 + code_line_1.count("\n")
        with pytest.raises(ParserError) as e:
            _parse_asm_code(input_stream, proc_name)
        assert str(e.value) == "bad code offset"
        assert e.value.line_number == expected_error_line_number
        del e  # explicitly break reference cycle
Example #12
0
    def test_asm_parsing__error(self, multi_line, asm):
        proc_name = "my_proc"
        line_splitter = "\n\t" if multi_line else " "
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  00000\tb8 2a 00{1}00 00 ff fe{2}
{0} ENDP\t; {0}
""".format(proc_name, line_splitter, asm))
        expected_error_line_number = 3 if multi_line else 2
        with pytest.raises(ParserError) as e:
            _parse_asm_code(input_stream, proc_name)
        assert str(e.value) == "could not parse code line comment"
        assert e.value.line_number == expected_error_line_number
        del e  # explicitly break reference cycle
Example #13
0
    def test_asm_parsing(self, multi_line, asm, expected):
        proc_name = "my_proc"
        line_splitter = "\n\t" if multi_line else " "
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
  00000\tb8 2a 00{1}00 00 ff fe{2}
{0} ENDP\t; {0}
""".format(proc_name, line_splitter, asm))
        parsed = _parse_asm_code(input_stream, proc_name)
        assert parsed == [
            "{0} PROC; {0}".format(proc_name),
            ["00000", ["b8", "2a", "00", "00", "00", "ff", "fe"]] + expected,
            "{0} ENDP; {0}".format(proc_name)]
Example #14
0
    def test_comment_looking_like_code(self, input):
        proc_name = "my_proc"
        input_stream = io.StringIO("""\
{0} PROC\t; {0}
{1}
  00000\taa\t inst\t args
{0} ENDP\t; {0}
""".format(proc_name, input))
        parsed = _parse_asm_code(input_stream, proc_name)
        assert parsed == [
            "{0} PROC; {0}".format(proc_name),
            input,
            ["00000", ["aa"], "inst", "args"],
            "{0} ENDP; {0}".format(proc_name)]
Example #15
0
 def test_parse_asm_code(self, proc_name, input, expected):
     input_stream = io.StringIO(input)
     parsed = _parse_asm_code(input_stream, proc_name)
     assert parsed == expected