|
1 """ |
|
2 Test cases for codeop.py |
|
3 Nick Mathewson |
|
4 """ |
|
5 import unittest |
|
6 from test.test_support import run_unittest, is_jython |
|
7 |
|
8 from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT |
|
9 |
|
10 if is_jython: |
|
11 import sys |
|
12 import cStringIO |
|
13 |
|
14 def unify_callables(d): |
|
15 for n,v in d.items(): |
|
16 if callable(v): |
|
17 d[n] = callable |
|
18 return d |
|
19 |
|
20 class CodeopTests(unittest.TestCase): |
|
21 |
|
22 def assertValid(self, str, symbol='single'): |
|
23 '''succeed iff str is a valid piece of code''' |
|
24 if is_jython: |
|
25 code = compile_command(str, "<input>", symbol) |
|
26 self.assert_(code) |
|
27 if symbol == "single": |
|
28 d,r = {},{} |
|
29 saved_stdout = sys.stdout |
|
30 sys.stdout = cStringIO.StringIO() |
|
31 try: |
|
32 exec code in d |
|
33 exec compile(str,"<input>","single") in r |
|
34 finally: |
|
35 sys.stdout = saved_stdout |
|
36 elif symbol == 'eval': |
|
37 ctx = {'a': 2} |
|
38 d = { 'value': eval(code,ctx) } |
|
39 r = { 'value': eval(str,ctx) } |
|
40 self.assertEquals(unify_callables(r),unify_callables(d)) |
|
41 else: |
|
42 expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT) |
|
43 self.assertEquals( compile_command(str, "<input>", symbol), expected) |
|
44 |
|
45 def assertIncomplete(self, str, symbol='single'): |
|
46 '''succeed iff str is the start of a valid piece of code''' |
|
47 self.assertEquals( compile_command(str, symbol=symbol), None) |
|
48 |
|
49 def assertInvalid(self, str, symbol='single', is_syntax=1): |
|
50 '''succeed iff str is the start of an invalid piece of code''' |
|
51 try: |
|
52 compile_command(str,symbol=symbol) |
|
53 self.fail("No exception thrown for invalid code") |
|
54 except SyntaxError: |
|
55 self.assert_(is_syntax) |
|
56 except OverflowError: |
|
57 self.assert_(not is_syntax) |
|
58 |
|
59 def test_valid(self): |
|
60 av = self.assertValid |
|
61 |
|
62 # special case |
|
63 if not is_jython: |
|
64 self.assertEquals(compile_command(""), |
|
65 compile("pass", "<input>", 'single', |
|
66 PyCF_DONT_IMPLY_DEDENT)) |
|
67 self.assertEquals(compile_command("\n"), |
|
68 compile("pass", "<input>", 'single', |
|
69 PyCF_DONT_IMPLY_DEDENT)) |
|
70 else: |
|
71 av("") |
|
72 av("\n") |
|
73 |
|
74 av("a = 1") |
|
75 av("\na = 1") |
|
76 av("a = 1\n") |
|
77 av("a = 1\n\n") |
|
78 av("\n\na = 1\n\n") |
|
79 |
|
80 av("def x():\n pass\n") |
|
81 av("if 1:\n pass\n") |
|
82 |
|
83 av("\n\nif 1: pass\n") |
|
84 av("\n\nif 1: pass\n\n") |
|
85 |
|
86 av("def x():\n\n pass\n") |
|
87 av("def x():\n pass\n \n") |
|
88 av("def x():\n pass\n \n") |
|
89 |
|
90 av("pass\n") |
|
91 av("3**3\n") |
|
92 |
|
93 av("if 9==3:\n pass\nelse:\n pass\n") |
|
94 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n") |
|
95 |
|
96 av("#a\n#b\na = 3\n") |
|
97 av("#a\n\n \na=3\n") |
|
98 av("a=3\n\n") |
|
99 av("a = 9+ \\\n3") |
|
100 |
|
101 av("3**3","eval") |
|
102 av("(lambda z: \n z**3)","eval") |
|
103 |
|
104 av("9+ \\\n3","eval") |
|
105 av("9+ \\\n3\n","eval") |
|
106 |
|
107 av("\n\na**3","eval") |
|
108 av("\n \na**3","eval") |
|
109 av("#a\n#b\na**3","eval") |
|
110 |
|
111 def test_incomplete(self): |
|
112 ai = self.assertIncomplete |
|
113 |
|
114 ai("(a **") |
|
115 ai("(a,b,") |
|
116 ai("(a,b,(") |
|
117 ai("(a,b,(") |
|
118 ai("a = (") |
|
119 ai("a = {") |
|
120 ai("b + {") |
|
121 |
|
122 ai("if 9==3:\n pass\nelse:") |
|
123 ai("if 9==3:\n pass\nelse:\n") |
|
124 ai("if 9==3:\n pass\nelse:\n pass") |
|
125 ai("if 1:") |
|
126 ai("if 1:\n") |
|
127 ai("if 1:\n pass\n if 1:\n pass\n else:") |
|
128 ai("if 1:\n pass\n if 1:\n pass\n else:\n") |
|
129 ai("if 1:\n pass\n if 1:\n pass\n else:\n pass") |
|
130 |
|
131 ai("def x():") |
|
132 ai("def x():\n") |
|
133 ai("def x():\n\n") |
|
134 |
|
135 ai("def x():\n pass") |
|
136 ai("def x():\n pass\n ") |
|
137 ai("def x():\n pass\n ") |
|
138 ai("\n\ndef x():\n pass") |
|
139 |
|
140 ai("a = 9+ \\") |
|
141 ai("a = 'a\\") |
|
142 ai("a = '''xy") |
|
143 |
|
144 ai("","eval") |
|
145 ai("\n","eval") |
|
146 ai("(","eval") |
|
147 ai("(\n\n\n","eval") |
|
148 ai("(9+","eval") |
|
149 ai("9+ \\","eval") |
|
150 ai("lambda z: \\","eval") |
|
151 |
|
152 def test_invalid(self): |
|
153 ai = self.assertInvalid |
|
154 ai("a b") |
|
155 |
|
156 ai("a @") |
|
157 ai("a b @") |
|
158 ai("a ** @") |
|
159 |
|
160 ai("a = ") |
|
161 ai("a = 9 +") |
|
162 |
|
163 ai("def x():\n\npass\n") |
|
164 |
|
165 ai("\n\n if 1: pass\n\npass") |
|
166 |
|
167 ai("a = 9+ \\\n") |
|
168 ai("a = 'a\\ ") |
|
169 ai("a = 'a\\\n") |
|
170 |
|
171 ai("a = 1","eval") |
|
172 ai("a = (","eval") |
|
173 ai("]","eval") |
|
174 ai("())","eval") |
|
175 ai("[}","eval") |
|
176 ai("9+","eval") |
|
177 ai("lambda z:","eval") |
|
178 ai("a b","eval") |
|
179 |
|
180 def test_filename(self): |
|
181 self.assertEquals(compile_command("a = 1\n", "abc").co_filename, |
|
182 compile("a = 1\n", "abc", 'single').co_filename) |
|
183 self.assertNotEquals(compile_command("a = 1\n", "abc").co_filename, |
|
184 compile("a = 1\n", "def", 'single').co_filename) |
|
185 |
|
186 |
|
187 def test_main(): |
|
188 run_unittest(CodeopTests) |
|
189 |
|
190 |
|
191 if __name__ == "__main__": |
|
192 test_main() |