blob: 6e821df6b0e7071487c89024f308259552232973 [file] [log] [blame]
Martin v. Löwis3bd071e2001-07-30 12:30:08 +00001"""
2 Test cases for codeop.py
3 Nick Mathewson
4"""
Pablo Galindoc5fc1562020-04-22 23:29:27 +01005import sys
Martin v. Löwis3bd071e2001-07-30 12:30:08 +00006import unittest
Victor Stinner1def7752020-04-23 03:03:24 +02007from test import support
Hai Shi96a6a6d2020-07-09 21:25:10 +08008from test.support import warnings_helper
Martin v. Löwis3bd071e2001-07-30 12:30:08 +00009
Guido van Rossum4b499dd32003-02-13 22:07:59 +000010from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
Guido van Rossum34d19282007-08-09 01:03:29 +000011import io
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000012
Victor Stinner1def7752020-04-23 03:03:24 +020013if support.is_jython:
Samuele Pedronide9a0d32003-05-17 02:39:52 +000014
15 def unify_callables(d):
16 for n,v in d.items():
Guido van Rossumd59da4b2007-05-22 18:11:13 +000017 if hasattr(v, '__call__'):
18 d[n] = True
Samuele Pedronide9a0d32003-05-17 02:39:52 +000019 return d
20
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000021class CodeopTests(unittest.TestCase):
22
23 def assertValid(self, str, symbol='single'):
24 '''succeed iff str is a valid piece of code'''
Victor Stinner1def7752020-04-23 03:03:24 +020025 if support.is_jython:
Samuele Pedronide9a0d32003-05-17 02:39:52 +000026 code = compile_command(str, "<input>", symbol)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000027 self.assertTrue(code)
Samuele Pedronide9a0d32003-05-17 02:39:52 +000028 if symbol == "single":
29 d,r = {},{}
Samuele Pedroni72c5c772003-05-17 12:51:10 +000030 saved_stdout = sys.stdout
Guido van Rossum34d19282007-08-09 01:03:29 +000031 sys.stdout = io.StringIO()
Samuele Pedronide9a0d32003-05-17 02:39:52 +000032 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000033 exec(code, d)
34 exec(compile(str,"<input>","single"), r)
Samuele Pedronide9a0d32003-05-17 02:39:52 +000035 finally:
Samuele Pedroni72c5c772003-05-17 12:51:10 +000036 sys.stdout = saved_stdout
Samuele Pedronide9a0d32003-05-17 02:39:52 +000037 elif symbol == 'eval':
38 ctx = {'a': 2}
39 d = { 'value': eval(code,ctx) }
40 r = { 'value': eval(str,ctx) }
Ezio Melottib3aedd42010-11-20 19:04:17 +000041 self.assertEqual(unify_callables(r),unify_callables(d))
Samuele Pedronide9a0d32003-05-17 02:39:52 +000042 else:
43 expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT)
Ezio Melottib3aedd42010-11-20 19:04:17 +000044 self.assertEqual(compile_command(str, "<input>", symbol), expected)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000045
46 def assertIncomplete(self, str, symbol='single'):
47 '''succeed iff str is the start of a valid piece of code'''
Ezio Melottib3aedd42010-11-20 19:04:17 +000048 self.assertEqual(compile_command(str, symbol=symbol), None)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000049
50 def assertInvalid(self, str, symbol='single', is_syntax=1):
51 '''succeed iff str is the start of an invalid piece of code'''
52 try:
53 compile_command(str,symbol=symbol)
Andrew Svetlov737fb892012-12-18 21:14:22 +020054 self.fail("No exception raised for invalid code")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000055 except SyntaxError:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000056 self.assertTrue(is_syntax)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000057 except OverflowError:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000058 self.assertTrue(not is_syntax)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000059
60 def test_valid(self):
61 av = self.assertValid
Samuele Pedronide9a0d32003-05-17 02:39:52 +000062
63 # special case
Victor Stinner1def7752020-04-23 03:03:24 +020064 if not support.is_jython:
Ezio Melottib3aedd42010-11-20 19:04:17 +000065 self.assertEqual(compile_command(""),
66 compile("pass", "<input>", 'single',
67 PyCF_DONT_IMPLY_DEDENT))
68 self.assertEqual(compile_command("\n"),
69 compile("pass", "<input>", 'single',
70 PyCF_DONT_IMPLY_DEDENT))
Samuele Pedronide9a0d32003-05-17 02:39:52 +000071 else:
72 av("")
73 av("\n")
Tim Petersf545baa2003-06-15 23:26:30 +000074
Samuele Pedronide9a0d32003-05-17 02:39:52 +000075 av("a = 1")
76 av("\na = 1")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000077 av("a = 1\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000078 av("a = 1\n\n")
79 av("\n\na = 1\n\n")
80
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000081 av("def x():\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000082 av("if 1:\n pass\n")
83
84 av("\n\nif 1: pass\n")
85 av("\n\nif 1: pass\n\n")
86
87 av("def x():\n\n pass\n")
88 av("def x():\n pass\n \n")
89 av("def x():\n pass\n \n")
90
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000091 av("pass\n")
92 av("3**3\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000093
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000094 av("if 9==3:\n pass\nelse:\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000095 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
96
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000097 av("#a\n#b\na = 3\n")
98 av("#a\n\n \na=3\n")
99 av("a=3\n\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000100 av("a = 9+ \\\n3")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000101
102 av("3**3","eval")
103 av("(lambda z: \n z**3)","eval")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000104
105 av("9+ \\\n3","eval")
106 av("9+ \\\n3\n","eval")
107
108 av("\n\na**3","eval")
109 av("\n \na**3","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000110 av("#a\n#b\na**3","eval")
Tim Petersab9ba272001-08-09 21:40:30 +0000111
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000112 av("\n\na = 1\n\n")
113 av("\n\nif 1: a=1\n\n")
114
115 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
116 av("#a\n\n \na=3\n\n")
117
118 av("\n\na**3","eval")
119 av("\n \na**3","eval")
120 av("#a\n#b\na**3","eval")
121
122 av("def f():\n try: pass\n finally: [x for x in (1,2)]\n")
123 av("def f():\n pass\n#foo\n")
124 av("@a.b.c\ndef f():\n pass\n")
125
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000126 def test_incomplete(self):
127 ai = self.assertIncomplete
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000128
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000129 ai("(a **")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000130 ai("(a,b,")
131 ai("(a,b,(")
132 ai("(a,b,(")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000133 ai("a = (")
134 ai("a = {")
135 ai("b + {")
136
137 ai("if 9==3:\n pass\nelse:")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000138 ai("if 9==3:\n pass\nelse:\n")
139 ai("if 9==3:\n pass\nelse:\n pass")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000140 ai("if 1:")
141 ai("if 1:\n")
142 ai("if 1:\n pass\n if 1:\n pass\n else:")
Tim Petersf545baa2003-06-15 23:26:30 +0000143 ai("if 1:\n pass\n if 1:\n pass\n else:\n")
144 ai("if 1:\n pass\n if 1:\n pass\n else:\n pass")
145
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000146 ai("def x():")
147 ai("def x():\n")
148 ai("def x():\n\n")
Tim Petersab9ba272001-08-09 21:40:30 +0000149
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000150 ai("def x():\n pass")
151 ai("def x():\n pass\n ")
152 ai("def x():\n pass\n ")
153 ai("\n\ndef x():\n pass")
154
155 ai("a = 9+ \\")
156 ai("a = 'a\\")
157 ai("a = '''xy")
158
159 ai("","eval")
160 ai("\n","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000161 ai("(","eval")
162 ai("(\n\n\n","eval")
163 ai("(9+","eval")
164 ai("9+ \\","eval")
165 ai("lambda z: \\","eval")
166
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000167 ai("if True:\n if True:\n if True: \n")
168
169 ai("@a(")
170 ai("@a(b")
171 ai("@a(b,")
172 ai("@a(b,c")
173 ai("@a(b,c,")
174
175 ai("from a import (")
176 ai("from a import (b")
177 ai("from a import (b,")
178 ai("from a import (b,c")
179 ai("from a import (b,c,")
180
181 ai("[");
182 ai("[a");
183 ai("[a,");
184 ai("[a,b");
185 ai("[a,b,");
186
187 ai("{");
188 ai("{a");
189 ai("{a:");
190 ai("{a:b");
191 ai("{a:b,");
192 ai("{a:b,c");
193 ai("{a:b,c:");
194 ai("{a:b,c:d");
195 ai("{a:b,c:d,");
196
197 ai("a(")
198 ai("a(b")
199 ai("a(b,")
200 ai("a(b,c")
201 ai("a(b,c,")
202
203 ai("a[")
204 ai("a[b")
205 ai("a[b,")
206 ai("a[b:")
207 ai("a[b:c")
208 ai("a[b:c:")
209 ai("a[b:c:d")
210
211 ai("def a(")
212 ai("def a(b")
213 ai("def a(b,")
214 ai("def a(b,c")
215 ai("def a(b,c,")
216
217 ai("(")
218 ai("(a")
219 ai("(a,")
220 ai("(a,b")
221 ai("(a,b,")
222
223 ai("if a:\n pass\nelif b:")
224 ai("if a:\n pass\nelif b:\n pass\nelse:")
225
226 ai("while a:")
227 ai("while a:\n pass\nelse:")
228
229 ai("for a in b:")
230 ai("for a in b:\n pass\nelse:")
231
232 ai("try:")
233 ai("try:\n pass\nexcept:")
234 ai("try:\n pass\nfinally:")
235 ai("try:\n pass\nexcept:\n pass\nfinally:")
236
237 ai("with a:")
238 ai("with a as b:")
239
240 ai("class a:")
241 ai("class a(")
242 ai("class a(b")
243 ai("class a(b,")
244 ai("class a():")
245
246 ai("[x for")
247 ai("[x for x in")
248 ai("[x for x in (")
249
250 ai("(x for")
251 ai("(x for x in")
252 ai("(x for x in (")
253
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000254 def test_invalid(self):
255 ai = self.assertInvalid
256 ai("a b")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000257
258 ai("a @")
259 ai("a b @")
260 ai("a ** @")
Tim Petersf545baa2003-06-15 23:26:30 +0000261
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000262 ai("a = ")
263 ai("a = 9 +")
264
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000265 ai("def x():\n\npass\n")
266
267 ai("\n\n if 1: pass\n\npass")
268
269 ai("a = 9+ \\\n")
270 ai("a = 'a\\ ")
271 ai("a = 'a\\\n")
272
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000273 ai("a = 1","eval")
274 ai("a = (","eval")
275 ai("]","eval")
276 ai("())","eval")
277 ai("[}","eval")
278 ai("9+","eval")
279 ai("lambda z:","eval")
280 ai("a b","eval")
281
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000282 ai("return 2.3")
283 ai("if (a == 1 and b = 2): pass")
284
285 ai("del 1")
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000286 ai("del (1,)")
287 ai("del [1]")
288 ai("del '1'")
289
290 ai("[i for i in range(10)] = (1, 2, 3)")
291
Pablo Galindo5b956ca2020-05-11 01:41:26 +0100292 def test_invalid_exec(self):
293 ai = self.assertInvalid
294 ai("raise = 4", symbol="exec")
295 ai('def a-b', symbol='exec')
296 ai('await?', symbol='exec')
297 ai('=!=', symbol='exec')
298 ai('a await raise b', symbol='exec')
299 ai('a await raise b?+1', symbol='exec')
300
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000301 def test_filename(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000302 self.assertEqual(compile_command("a = 1\n", "abc").co_filename,
303 compile("a = 1\n", "abc", 'single').co_filename)
304 self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename,
305 compile("a = 1\n", "def", 'single').co_filename)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000306
Cheryl Sabella052d3fc2020-06-04 19:40:24 -0400307 def test_warning(self):
308 # Test that the warning is only returned once.
Hai Shi96a6a6d2020-07-09 21:25:10 +0800309 with warnings_helper.check_warnings((".*literal", SyntaxWarning)) as w:
Cheryl Sabella052d3fc2020-06-04 19:40:24 -0400310 compile_command("0 is 0")
311 self.assertEqual(len(w.warnings), 1)
Fred Drake2e2be372001-09-20 21:33:42 +0000312
Fred Drake2e2be372001-09-20 21:33:42 +0000313if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500314 unittest.main()