blob: 6d5e054f5b6b5786dddf4e7551565f19916a9eec [file] [log] [blame]
Skip Montanaroadd0ccc2003-02-27 21:27:07 +00001from test.test_support import verify, verbose, TestFailed, run_unittest
2import sys
3import dis
4import StringIO
5
6# Minimal tests for dis module
7
8import unittest
9
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000010def _f(a):
Tim Peterseabafeb2003-03-07 15:55:36 +000011 print a
12 return 1
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000013
14dis_f = """\
Michael W. Hudson26848a32003-04-29 17:07:36 +000015 %-4d 0 LOAD_FAST 0 (a)
Tim Peterseabafeb2003-03-07 15:55:36 +000016 3 PRINT_ITEM
17 4 PRINT_NEWLINE
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000018
Michael W. Hudson26848a32003-04-29 17:07:36 +000019 %-4d 5 LOAD_CONST 1 (1)
Tim Peterseabafeb2003-03-07 15:55:36 +000020 8 RETURN_VALUE
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000021 9 LOAD_CONST 0 (None)
Tim Peterseabafeb2003-03-07 15:55:36 +000022 12 RETURN_VALUE
Michael W. Hudson26848a32003-04-29 17:07:36 +000023"""%(_f.func_code.co_firstlineno + 1,
24 _f.func_code.co_firstlineno + 2)
25
26
27def bug708901():
28 for res in range(1,
29 10):
30 pass
31
32dis_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 Montanaroadd0ccc2003-02-27 21:27:07 +000050
51class DisTests(unittest.TestCase):
Michael W. Hudson26848a32003-04-29 17:07:36 +000052 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 Montanaroadd0ccc2003-02-27 21:27:07 +000070 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. Hudson26848a32003-04-29 17:07:36 +000083 self.do_disassembly_test(_f, dis_f)
84
85 def test_bug_708901(self):
86 self.do_disassembly_test(bug708901, dis_bug708901)
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000087
88def test_main():
89 run_unittest(DisTests)
90
91
92if __name__ == "__main__":
93 test_main()