Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 1 | from test.test_support import verify, verbose, TestFailed, run_unittest |
| 2 | import sys |
| 3 | import dis |
| 4 | import StringIO |
| 5 | |
| 6 | # Minimal tests for dis module |
| 7 | |
| 8 | import unittest |
| 9 | |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 10 | def _f(a): |
Tim Peters | eabafeb | 2003-03-07 15:55:36 +0000 | [diff] [blame] | 11 | print a |
| 12 | return 1 |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 13 | |
| 14 | dis_f = """\ |
Michael W. Hudson | 26848a3 | 2003-04-29 17:07:36 +0000 | [diff] [blame] | 15 | %-4d 0 LOAD_FAST 0 (a) |
Tim Peters | eabafeb | 2003-03-07 15:55:36 +0000 | [diff] [blame] | 16 | 3 PRINT_ITEM |
| 17 | 4 PRINT_NEWLINE |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 18 | |
Michael W. Hudson | 26848a3 | 2003-04-29 17:07:36 +0000 | [diff] [blame] | 19 | %-4d 5 LOAD_CONST 1 (1) |
Tim Peters | eabafeb | 2003-03-07 15:55:36 +0000 | [diff] [blame] | 20 | 8 RETURN_VALUE |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 21 | 9 LOAD_CONST 0 (None) |
Tim Peters | eabafeb | 2003-03-07 15:55:36 +0000 | [diff] [blame] | 22 | 12 RETURN_VALUE |
Michael W. Hudson | 26848a3 | 2003-04-29 17:07:36 +0000 | [diff] [blame] | 23 | """%(_f.func_code.co_firstlineno + 1, |
| 24 | _f.func_code.co_firstlineno + 2) |
| 25 | |
| 26 | |
| 27 | def bug708901(): |
| 28 | for res in range(1, |
| 29 | 10): |
| 30 | pass |
| 31 | |
| 32 | dis_bug708901 = """\ |
| 33 | %-4d 0 SETUP_LOOP 23 (to 26) |
| 34 | 3 LOAD_GLOBAL 0 (range) |
| 35 | 6 LOAD_CONST 1 (1) |
| 36 | |
| 37 | %-4d 9 LOAD_CONST 2 (10) |
| 38 | 12 CALL_FUNCTION 2 |
| 39 | 15 GET_ITER |
| 40 | >> 16 FOR_ITER 6 (to 25) |
| 41 | 19 STORE_FAST 0 (res) |
| 42 | |
| 43 | %-4d 22 JUMP_ABSOLUTE 16 |
| 44 | >> 25 POP_BLOCK |
| 45 | >> 26 LOAD_CONST 0 (None) |
| 46 | 29 RETURN_VALUE |
| 47 | """%(bug708901.func_code.co_firstlineno + 1, |
| 48 | bug708901.func_code.co_firstlineno + 2, |
| 49 | bug708901.func_code.co_firstlineno + 3) |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 50 | |
| 51 | class DisTests(unittest.TestCase): |
Michael W. Hudson | 26848a3 | 2003-04-29 17:07:36 +0000 | [diff] [blame] | 52 | def do_disassembly_test(self, func, expected): |
| 53 | s = StringIO.StringIO() |
| 54 | save_stdout = sys.stdout |
| 55 | sys.stdout = s |
| 56 | dis.dis(func) |
| 57 | sys.stdout = save_stdout |
| 58 | got = s.getvalue() |
| 59 | # Trim trailing blanks (if any). |
| 60 | lines = got.split('\n') |
| 61 | lines = [line.rstrip() for line in lines] |
| 62 | expected = expected.split("\n") |
| 63 | import difflib |
| 64 | if expected != lines: |
| 65 | self.fail( |
| 66 | "events did not match expectation:\n" + |
| 67 | "\n".join(difflib.ndiff(expected, |
| 68 | lines))) |
| 69 | |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 70 | def test_opmap(self): |
| 71 | self.assertEqual(dis.opmap["STOP_CODE"], 0) |
| 72 | self.assertEqual(dis.opmap["LOAD_CONST"] in dis.hasconst, True) |
| 73 | self.assertEqual(dis.opmap["STORE_NAME"] in dis.hasname, True) |
| 74 | |
| 75 | def test_opname(self): |
| 76 | self.assertEqual(dis.opname[dis.opmap["LOAD_FAST"]], "LOAD_FAST") |
| 77 | |
| 78 | def test_boundaries(self): |
| 79 | self.assertEqual(dis.opmap["EXTENDED_ARG"], dis.EXTENDED_ARG) |
| 80 | self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT) |
| 81 | |
| 82 | def test_dis(self): |
Michael W. Hudson | 26848a3 | 2003-04-29 17:07:36 +0000 | [diff] [blame] | 83 | self.do_disassembly_test(_f, dis_f) |
| 84 | |
| 85 | def test_bug_708901(self): |
| 86 | self.do_disassembly_test(bug708901, dis_bug708901) |
Skip Montanaro | add0ccc | 2003-02-27 21:27:07 +0000 | [diff] [blame] | 87 | |
| 88 | def test_main(): |
| 89 | run_unittest(DisTests) |
| 90 | |
| 91 | |
| 92 | if __name__ == "__main__": |
| 93 | test_main() |