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
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
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
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)
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
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)
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
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
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
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
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
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
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)]
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)]
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