blob: ecc46affea262955c36c4fb3f567d543f0e5a436 [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 Stinner369a1cb2020-08-12 14:53:28 +02007import warnings
Victor Stinner1def7752020-04-23 03:03:24 +02008from test import support
Hai Shi96a6a6d2020-07-09 21:25:10 +08009from test.support import warnings_helper
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000010
Guido van Rossum4b499dd32003-02-13 22:07:59 +000011from codeop import compile_command, PyCF_DONT_IMPLY_DEDENT
Guido van Rossum34d19282007-08-09 01:03:29 +000012import io
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000013
Victor Stinner1def7752020-04-23 03:03:24 +020014if support.is_jython:
Samuele Pedronide9a0d32003-05-17 02:39:52 +000015
16 def unify_callables(d):
17 for n,v in d.items():
Guido van Rossumd59da4b2007-05-22 18:11:13 +000018 if hasattr(v, '__call__'):
19 d[n] = True
Samuele Pedronide9a0d32003-05-17 02:39:52 +000020 return d
21
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000022class CodeopTests(unittest.TestCase):
23
24 def assertValid(self, str, symbol='single'):
25 '''succeed iff str is a valid piece of code'''
Victor Stinner1def7752020-04-23 03:03:24 +020026 if support.is_jython:
Samuele Pedronide9a0d32003-05-17 02:39:52 +000027 code = compile_command(str, "<input>", symbol)
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000028 self.assertTrue(code)
Samuele Pedronide9a0d32003-05-17 02:39:52 +000029 if symbol == "single":
30 d,r = {},{}
Samuele Pedroni72c5c772003-05-17 12:51:10 +000031 saved_stdout = sys.stdout
Guido van Rossum34d19282007-08-09 01:03:29 +000032 sys.stdout = io.StringIO()
Samuele Pedronide9a0d32003-05-17 02:39:52 +000033 try:
Georg Brandl7cae87c2006-09-06 06:51:57 +000034 exec(code, d)
35 exec(compile(str,"<input>","single"), r)
Samuele Pedronide9a0d32003-05-17 02:39:52 +000036 finally:
Samuele Pedroni72c5c772003-05-17 12:51:10 +000037 sys.stdout = saved_stdout
Samuele Pedronide9a0d32003-05-17 02:39:52 +000038 elif symbol == 'eval':
39 ctx = {'a': 2}
40 d = { 'value': eval(code,ctx) }
41 r = { 'value': eval(str,ctx) }
Ezio Melottib3aedd42010-11-20 19:04:17 +000042 self.assertEqual(unify_callables(r),unify_callables(d))
Samuele Pedronide9a0d32003-05-17 02:39:52 +000043 else:
44 expected = compile(str, "<input>", symbol, PyCF_DONT_IMPLY_DEDENT)
Ezio Melottib3aedd42010-11-20 19:04:17 +000045 self.assertEqual(compile_command(str, "<input>", symbol), expected)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000046
47 def assertIncomplete(self, str, symbol='single'):
48 '''succeed iff str is the start of a valid piece of code'''
Ezio Melottib3aedd42010-11-20 19:04:17 +000049 self.assertEqual(compile_command(str, symbol=symbol), None)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000050
51 def assertInvalid(self, str, symbol='single', is_syntax=1):
52 '''succeed iff str is the start of an invalid piece of code'''
53 try:
54 compile_command(str,symbol=symbol)
Andrew Svetlov737fb892012-12-18 21:14:22 +020055 self.fail("No exception raised for invalid code")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000056 except SyntaxError:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000057 self.assertTrue(is_syntax)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000058 except OverflowError:
Benjamin Petersonc9c0f202009-06-30 23:06:06 +000059 self.assertTrue(not is_syntax)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000060
61 def test_valid(self):
62 av = self.assertValid
Samuele Pedronide9a0d32003-05-17 02:39:52 +000063
64 # special case
Victor Stinner1def7752020-04-23 03:03:24 +020065 if not support.is_jython:
Ezio Melottib3aedd42010-11-20 19:04:17 +000066 self.assertEqual(compile_command(""),
67 compile("pass", "<input>", 'single',
68 PyCF_DONT_IMPLY_DEDENT))
69 self.assertEqual(compile_command("\n"),
70 compile("pass", "<input>", 'single',
71 PyCF_DONT_IMPLY_DEDENT))
Samuele Pedronide9a0d32003-05-17 02:39:52 +000072 else:
73 av("")
74 av("\n")
Tim Petersf545baa2003-06-15 23:26:30 +000075
Samuele Pedronide9a0d32003-05-17 02:39:52 +000076 av("a = 1")
77 av("\na = 1")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000078 av("a = 1\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000079 av("a = 1\n\n")
80 av("\n\na = 1\n\n")
81
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000082 av("def x():\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000083 av("if 1:\n pass\n")
84
85 av("\n\nif 1: pass\n")
86 av("\n\nif 1: pass\n\n")
87
88 av("def x():\n\n pass\n")
89 av("def x():\n pass\n \n")
90 av("def x():\n pass\n \n")
91
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000092 av("pass\n")
93 av("3**3\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000094
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000095 av("if 9==3:\n pass\nelse:\n pass\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +000096 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
97
Martin v. Löwis3bd071e2001-07-30 12:30:08 +000098 av("#a\n#b\na = 3\n")
99 av("#a\n\n \na=3\n")
100 av("a=3\n\n")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000101 av("a = 9+ \\\n3")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000102
103 av("3**3","eval")
104 av("(lambda z: \n z**3)","eval")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000105
106 av("9+ \\\n3","eval")
107 av("9+ \\\n3\n","eval")
108
109 av("\n\na**3","eval")
110 av("\n \na**3","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000111 av("#a\n#b\na**3","eval")
Tim Petersab9ba272001-08-09 21:40:30 +0000112
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000113 av("\n\na = 1\n\n")
114 av("\n\nif 1: a=1\n\n")
115
116 av("if 1:\n pass\n if 1:\n pass\n else:\n pass\n")
117 av("#a\n\n \na=3\n\n")
118
119 av("\n\na**3","eval")
120 av("\n \na**3","eval")
121 av("#a\n#b\na**3","eval")
122
123 av("def f():\n try: pass\n finally: [x for x in (1,2)]\n")
124 av("def f():\n pass\n#foo\n")
125 av("@a.b.c\ndef f():\n pass\n")
126
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000127 def test_incomplete(self):
128 ai = self.assertIncomplete
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000129
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000130 ai("(a **")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000131 ai("(a,b,")
132 ai("(a,b,(")
133 ai("(a,b,(")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000134 ai("a = (")
135 ai("a = {")
136 ai("b + {")
137
Pablo Galindodbb22812021-02-09 20:07:38 +0000138 ai("print([1,\n2,")
139 ai("print({1:1,\n2:3,")
140 ai("print((1,\n2,")
141
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000142 ai("if 9==3:\n pass\nelse:")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000143 ai("if 9==3:\n pass\nelse:\n")
144 ai("if 9==3:\n pass\nelse:\n pass")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000145 ai("if 1:")
146 ai("if 1:\n")
147 ai("if 1:\n pass\n if 1:\n pass\n else:")
Tim Petersf545baa2003-06-15 23:26:30 +0000148 ai("if 1:\n pass\n if 1:\n pass\n else:\n")
149 ai("if 1:\n pass\n if 1:\n pass\n else:\n pass")
150
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000151 ai("def x():")
152 ai("def x():\n")
153 ai("def x():\n\n")
Tim Petersab9ba272001-08-09 21:40:30 +0000154
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000155 ai("def x():\n pass")
156 ai("def x():\n pass\n ")
157 ai("def x():\n pass\n ")
158 ai("\n\ndef x():\n pass")
159
160 ai("a = 9+ \\")
161 ai("a = 'a\\")
162 ai("a = '''xy")
163
164 ai("","eval")
165 ai("\n","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000166 ai("(","eval")
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000167 ai("(9+","eval")
168 ai("9+ \\","eval")
169 ai("lambda z: \\","eval")
170
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000171 ai("if True:\n if True:\n if True: \n")
172
173 ai("@a(")
174 ai("@a(b")
175 ai("@a(b,")
176 ai("@a(b,c")
177 ai("@a(b,c,")
178
179 ai("from a import (")
180 ai("from a import (b")
181 ai("from a import (b,")
182 ai("from a import (b,c")
183 ai("from a import (b,c,")
184
185 ai("[");
186 ai("[a");
187 ai("[a,");
188 ai("[a,b");
189 ai("[a,b,");
190
191 ai("{");
192 ai("{a");
193 ai("{a:");
194 ai("{a:b");
195 ai("{a:b,");
196 ai("{a:b,c");
197 ai("{a:b,c:");
198 ai("{a:b,c:d");
199 ai("{a:b,c:d,");
200
201 ai("a(")
202 ai("a(b")
203 ai("a(b,")
204 ai("a(b,c")
205 ai("a(b,c,")
206
207 ai("a[")
208 ai("a[b")
209 ai("a[b,")
210 ai("a[b:")
211 ai("a[b:c")
212 ai("a[b:c:")
213 ai("a[b:c:d")
214
215 ai("def a(")
216 ai("def a(b")
217 ai("def a(b,")
218 ai("def a(b,c")
219 ai("def a(b,c,")
220
221 ai("(")
222 ai("(a")
223 ai("(a,")
224 ai("(a,b")
225 ai("(a,b,")
226
227 ai("if a:\n pass\nelif b:")
228 ai("if a:\n pass\nelif b:\n pass\nelse:")
229
230 ai("while a:")
231 ai("while a:\n pass\nelse:")
232
233 ai("for a in b:")
234 ai("for a in b:\n pass\nelse:")
235
236 ai("try:")
237 ai("try:\n pass\nexcept:")
238 ai("try:\n pass\nfinally:")
239 ai("try:\n pass\nexcept:\n pass\nfinally:")
240
241 ai("with a:")
242 ai("with a as b:")
243
244 ai("class a:")
245 ai("class a(")
246 ai("class a(b")
247 ai("class a(b,")
248 ai("class a():")
249
250 ai("[x for")
251 ai("[x for x in")
252 ai("[x for x in (")
253
254 ai("(x for")
255 ai("(x for x in")
256 ai("(x for x in (")
257
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000258 def test_invalid(self):
259 ai = self.assertInvalid
260 ai("a b")
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000261
262 ai("a @")
263 ai("a b @")
264 ai("a ** @")
Tim Petersf545baa2003-06-15 23:26:30 +0000265
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000266 ai("a = ")
267 ai("a = 9 +")
268
Samuele Pedronide9a0d32003-05-17 02:39:52 +0000269 ai("def x():\n\npass\n")
270
271 ai("\n\n if 1: pass\n\npass")
272
273 ai("a = 9+ \\\n")
274 ai("a = 'a\\ ")
275 ai("a = 'a\\\n")
276
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000277 ai("a = 1","eval")
278 ai("a = (","eval")
279 ai("]","eval")
280 ai("())","eval")
281 ai("[}","eval")
282 ai("9+","eval")
283 ai("lambda z:","eval")
284 ai("a b","eval")
285
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000286 ai("return 2.3")
287 ai("if (a == 1 and b = 2): pass")
288
289 ai("del 1")
Frank Wierzbicki0d0367f2009-08-02 22:19:05 +0000290 ai("del (1,)")
291 ai("del [1]")
292 ai("del '1'")
293
294 ai("[i for i in range(10)] = (1, 2, 3)")
295
Pablo Galindo5b956ca2020-05-11 01:41:26 +0100296 def test_invalid_exec(self):
297 ai = self.assertInvalid
298 ai("raise = 4", symbol="exec")
299 ai('def a-b', symbol='exec')
300 ai('await?', symbol='exec')
301 ai('=!=', symbol='exec')
302 ai('a await raise b', symbol='exec')
303 ai('a await raise b?+1', symbol='exec')
304
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000305 def test_filename(self):
Ezio Melottib3aedd42010-11-20 19:04:17 +0000306 self.assertEqual(compile_command("a = 1\n", "abc").co_filename,
307 compile("a = 1\n", "abc", 'single').co_filename)
308 self.assertNotEqual(compile_command("a = 1\n", "abc").co_filename,
309 compile("a = 1\n", "def", 'single').co_filename)
Martin v. Löwis3bd071e2001-07-30 12:30:08 +0000310
Cheryl Sabella052d3fc2020-06-04 19:40:24 -0400311 def test_warning(self):
312 # Test that the warning is only returned once.
Terry Jan Reedyc818b152020-08-13 13:18:49 -0400313 with warnings_helper.check_warnings(
314 (".*literal", SyntaxWarning),
315 (".*invalid", DeprecationWarning),
316 ) as w:
317 compile_command(r"'\e' is 0")
318 self.assertEqual(len(w.warnings), 2)
Fred Drake2e2be372001-09-20 21:33:42 +0000319
Victor Stinner369a1cb2020-08-12 14:53:28 +0200320 # bpo-41520: check SyntaxWarning treated as an SyntaxError
Terry Jan Reedyc818b152020-08-13 13:18:49 -0400321 with warnings.catch_warnings(), self.assertRaises(SyntaxError):
Victor Stinner369a1cb2020-08-12 14:53:28 +0200322 warnings.simplefilter('error', SyntaxWarning)
Terry Jan Reedyc818b152020-08-13 13:18:49 -0400323 compile_command('1 is 1', symbol='exec')
Victor Stinner369a1cb2020-08-12 14:53:28 +0200324
325
Fred Drake2e2be372001-09-20 21:33:42 +0000326if __name__ == "__main__":
Zachary Ware38c707e2015-04-13 15:00:43 -0500327 unittest.main()