blob: d88ea4556bf6af8f832b25d148767639a45f2811 [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
10# placement is crucial!!! move the start of _f and you have to adjust the
11# line numbers in dis_f
12def _f(a):
Tim Peterseabafeb2003-03-07 15:55:36 +000013 print a
14 return 1
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000015
16dis_f = """\
Michael W. Hudson26848a32003-04-29 17:07:36 +000017 %-4d 0 LOAD_FAST 0 (a)
Tim Peterseabafeb2003-03-07 15:55:36 +000018 3 PRINT_ITEM
19 4 PRINT_NEWLINE
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000020
Michael W. Hudson26848a32003-04-29 17:07:36 +000021 %-4d 5 LOAD_CONST 1 (1)
Tim Peterseabafeb2003-03-07 15:55:36 +000022 8 RETURN_VALUE
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000023 9 LOAD_CONST 0 (None)
Tim Peterseabafeb2003-03-07 15:55:36 +000024 12 RETURN_VALUE
Michael W. Hudson26848a32003-04-29 17:07:36 +000025"""%(_f.func_code.co_firstlineno + 1,
26 _f.func_code.co_firstlineno + 2)
27
28
29def bug708901():
30 for res in range(1,
31 10):
32 pass
33
34dis_bug708901 = """\
35 %-4d 0 SETUP_LOOP 23 (to 26)
36 3 LOAD_GLOBAL 0 (range)
37 6 LOAD_CONST 1 (1)
38
39 %-4d 9 LOAD_CONST 2 (10)
40 12 CALL_FUNCTION 2
41 15 GET_ITER
42 >> 16 FOR_ITER 6 (to 25)
43 19 STORE_FAST 0 (res)
44
45 %-4d 22 JUMP_ABSOLUTE 16
46 >> 25 POP_BLOCK
47 >> 26 LOAD_CONST 0 (None)
48 29 RETURN_VALUE
49"""%(bug708901.func_code.co_firstlineno + 1,
50 bug708901.func_code.co_firstlineno + 2,
51 bug708901.func_code.co_firstlineno + 3)
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000052
53class DisTests(unittest.TestCase):
Michael W. Hudson26848a32003-04-29 17:07:36 +000054 def do_disassembly_test(self, func, expected):
55 s = StringIO.StringIO()
56 save_stdout = sys.stdout
57 sys.stdout = s
58 dis.dis(func)
59 sys.stdout = save_stdout
60 got = s.getvalue()
61 # Trim trailing blanks (if any).
62 lines = got.split('\n')
63 lines = [line.rstrip() for line in lines]
64 expected = expected.split("\n")
65 import difflib
66 if expected != lines:
67 self.fail(
68 "events did not match expectation:\n" +
69 "\n".join(difflib.ndiff(expected,
70 lines)))
71
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000072 def test_opmap(self):
73 self.assertEqual(dis.opmap["STOP_CODE"], 0)
74 self.assertEqual(dis.opmap["LOAD_CONST"] in dis.hasconst, True)
75 self.assertEqual(dis.opmap["STORE_NAME"] in dis.hasname, True)
76
77 def test_opname(self):
78 self.assertEqual(dis.opname[dis.opmap["LOAD_FAST"]], "LOAD_FAST")
79
80 def test_boundaries(self):
81 self.assertEqual(dis.opmap["EXTENDED_ARG"], dis.EXTENDED_ARG)
82 self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT)
83
84 def test_dis(self):
Michael W. Hudson26848a32003-04-29 17:07:36 +000085 self.do_disassembly_test(_f, dis_f)
86
87 def test_bug_708901(self):
88 self.do_disassembly_test(bug708901, dis_bug708901)
Skip Montanaroadd0ccc2003-02-27 21:27:07 +000089
90def test_main():
91 run_unittest(DisTests)
92
93
94if __name__ == "__main__":
95 test_main()