|
1 """This module tests SyntaxErrors. |
|
2 |
|
3 Here's an example of the sort of thing that is tested. |
|
4 |
|
5 >>> def f(x): |
|
6 ... global x |
|
7 Traceback (most recent call last): |
|
8 SyntaxError: name 'x' is local and global |
|
9 |
|
10 The tests are all raise SyntaxErrors. They were created by checking |
|
11 each C call that raises SyntaxError. There are several modules that |
|
12 raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and |
|
13 symtable.c. |
|
14 |
|
15 The parser itself outlaws a lot of invalid syntax. None of these |
|
16 errors are tested here at the moment. We should add some tests; since |
|
17 there are infinitely many programs with invalid syntax, we would need |
|
18 to be judicious in selecting some. |
|
19 |
|
20 The compiler generates a synthetic module name for code executed by |
|
21 doctest. Since all the code comes from the same module, a suffix like |
|
22 [1] is appended to the module name, As a consequence, changing the |
|
23 order of tests in this module means renumbering all the errors after |
|
24 it. (Maybe we should enable the ellipsis option for these tests.) |
|
25 |
|
26 In ast.c, syntax errors are raised by calling ast_error(). |
|
27 |
|
28 Errors from set_context(): |
|
29 |
|
30 TODO(jhylton): "assignment to None" is inconsistent with other messages |
|
31 |
|
32 >>> obj.None = 1 |
|
33 Traceback (most recent call last): |
|
34 SyntaxError: assignment to None (<doctest test.test_syntax[1]>, line 1) |
|
35 |
|
36 >>> None = 1 |
|
37 Traceback (most recent call last): |
|
38 SyntaxError: assignment to None (<doctest test.test_syntax[2]>, line 1) |
|
39 |
|
40 It's a syntax error to assign to the empty tuple. Why isn't it an |
|
41 error to assign to the empty list? It will always raise some error at |
|
42 runtime. |
|
43 |
|
44 >>> () = 1 |
|
45 Traceback (most recent call last): |
|
46 SyntaxError: can't assign to () (<doctest test.test_syntax[3]>, line 1) |
|
47 |
|
48 >>> f() = 1 |
|
49 Traceback (most recent call last): |
|
50 SyntaxError: can't assign to function call (<doctest test.test_syntax[4]>, line 1) |
|
51 |
|
52 >>> del f() |
|
53 Traceback (most recent call last): |
|
54 SyntaxError: can't delete function call (<doctest test.test_syntax[5]>, line 1) |
|
55 |
|
56 >>> a + 1 = 2 |
|
57 Traceback (most recent call last): |
|
58 SyntaxError: can't assign to operator (<doctest test.test_syntax[6]>, line 1) |
|
59 |
|
60 >>> (x for x in x) = 1 |
|
61 Traceback (most recent call last): |
|
62 SyntaxError: can't assign to generator expression (<doctest test.test_syntax[7]>, line 1) |
|
63 |
|
64 >>> 1 = 1 |
|
65 Traceback (most recent call last): |
|
66 SyntaxError: can't assign to literal (<doctest test.test_syntax[8]>, line 1) |
|
67 |
|
68 >>> "abc" = 1 |
|
69 Traceback (most recent call last): |
|
70 SyntaxError: can't assign to literal (<doctest test.test_syntax[9]>, line 1) |
|
71 |
|
72 >>> `1` = 1 |
|
73 Traceback (most recent call last): |
|
74 SyntaxError: can't assign to repr (<doctest test.test_syntax[10]>, line 1) |
|
75 |
|
76 If the left-hand side of an assignment is a list or tuple, an illegal |
|
77 expression inside that contain should still cause a syntax error. |
|
78 This test just checks a couple of cases rather than enumerating all of |
|
79 them. |
|
80 |
|
81 >>> (a, "b", c) = (1, 2, 3) |
|
82 Traceback (most recent call last): |
|
83 SyntaxError: can't assign to literal (<doctest test.test_syntax[11]>, line 1) |
|
84 |
|
85 >>> [a, b, c + 1] = [1, 2, 3] |
|
86 Traceback (most recent call last): |
|
87 SyntaxError: can't assign to operator (<doctest test.test_syntax[12]>, line 1) |
|
88 |
|
89 >>> a if 1 else b = 1 |
|
90 Traceback (most recent call last): |
|
91 SyntaxError: can't assign to conditional expression (<doctest test.test_syntax[13]>, line 1) |
|
92 |
|
93 From compiler_complex_args(): |
|
94 |
|
95 >>> def f(None=1): |
|
96 ... pass |
|
97 Traceback (most recent call last): |
|
98 SyntaxError: assignment to None (<doctest test.test_syntax[14]>, line 1) |
|
99 |
|
100 |
|
101 From ast_for_arguments(): |
|
102 |
|
103 >>> def f(x, y=1, z): |
|
104 ... pass |
|
105 Traceback (most recent call last): |
|
106 SyntaxError: non-default argument follows default argument (<doctest test.test_syntax[15]>, line 1) |
|
107 |
|
108 >>> def f(x, None): |
|
109 ... pass |
|
110 Traceback (most recent call last): |
|
111 SyntaxError: assignment to None (<doctest test.test_syntax[16]>, line 1) |
|
112 |
|
113 >>> def f(*None): |
|
114 ... pass |
|
115 Traceback (most recent call last): |
|
116 SyntaxError: assignment to None (<doctest test.test_syntax[17]>, line 1) |
|
117 |
|
118 >>> def f(**None): |
|
119 ... pass |
|
120 Traceback (most recent call last): |
|
121 SyntaxError: assignment to None (<doctest test.test_syntax[18]>, line 1) |
|
122 |
|
123 |
|
124 From ast_for_funcdef(): |
|
125 |
|
126 >>> def None(x): |
|
127 ... pass |
|
128 Traceback (most recent call last): |
|
129 SyntaxError: assignment to None (<doctest test.test_syntax[19]>, line 1) |
|
130 |
|
131 |
|
132 From ast_for_call(): |
|
133 |
|
134 >>> def f(it, *varargs): |
|
135 ... return list(it) |
|
136 >>> L = range(10) |
|
137 >>> f(x for x in L) |
|
138 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
|
139 >>> f(x for x in L, 1) |
|
140 Traceback (most recent call last): |
|
141 SyntaxError: Generator expression must be parenthesized if not sole argument (<doctest test.test_syntax[23]>, line 1) |
|
142 >>> f((x for x in L), 1) |
|
143 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] |
|
144 |
|
145 >>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, |
|
146 ... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, |
|
147 ... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, |
|
148 ... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, |
|
149 ... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, |
|
150 ... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66, |
|
151 ... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77, |
|
152 ... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88, |
|
153 ... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99, |
|
154 ... i100, i101, i102, i103, i104, i105, i106, i107, i108, |
|
155 ... i109, i110, i111, i112, i113, i114, i115, i116, i117, |
|
156 ... i118, i119, i120, i121, i122, i123, i124, i125, i126, |
|
157 ... i127, i128, i129, i130, i131, i132, i133, i134, i135, |
|
158 ... i136, i137, i138, i139, i140, i141, i142, i143, i144, |
|
159 ... i145, i146, i147, i148, i149, i150, i151, i152, i153, |
|
160 ... i154, i155, i156, i157, i158, i159, i160, i161, i162, |
|
161 ... i163, i164, i165, i166, i167, i168, i169, i170, i171, |
|
162 ... i172, i173, i174, i175, i176, i177, i178, i179, i180, |
|
163 ... i181, i182, i183, i184, i185, i186, i187, i188, i189, |
|
164 ... i190, i191, i192, i193, i194, i195, i196, i197, i198, |
|
165 ... i199, i200, i201, i202, i203, i204, i205, i206, i207, |
|
166 ... i208, i209, i210, i211, i212, i213, i214, i215, i216, |
|
167 ... i217, i218, i219, i220, i221, i222, i223, i224, i225, |
|
168 ... i226, i227, i228, i229, i230, i231, i232, i233, i234, |
|
169 ... i235, i236, i237, i238, i239, i240, i241, i242, i243, |
|
170 ... i244, i245, i246, i247, i248, i249, i250, i251, i252, |
|
171 ... i253, i254, i255) |
|
172 Traceback (most recent call last): |
|
173 SyntaxError: more than 255 arguments (<doctest test.test_syntax[25]>, line 1) |
|
174 |
|
175 The actual error cases counts positional arguments, keyword arguments, |
|
176 and generator expression arguments separately. This test combines the |
|
177 three. |
|
178 |
|
179 >>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, |
|
180 ... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22, |
|
181 ... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33, |
|
182 ... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44, |
|
183 ... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55, |
|
184 ... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66, |
|
185 ... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77, |
|
186 ... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88, |
|
187 ... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99, |
|
188 ... i100, i101, i102, i103, i104, i105, i106, i107, i108, |
|
189 ... i109, i110, i111, i112, i113, i114, i115, i116, i117, |
|
190 ... i118, i119, i120, i121, i122, i123, i124, i125, i126, |
|
191 ... i127, i128, i129, i130, i131, i132, i133, i134, i135, |
|
192 ... i136, i137, i138, i139, i140, i141, i142, i143, i144, |
|
193 ... i145, i146, i147, i148, i149, i150, i151, i152, i153, |
|
194 ... i154, i155, i156, i157, i158, i159, i160, i161, i162, |
|
195 ... i163, i164, i165, i166, i167, i168, i169, i170, i171, |
|
196 ... i172, i173, i174, i175, i176, i177, i178, i179, i180, |
|
197 ... i181, i182, i183, i184, i185, i186, i187, i188, i189, |
|
198 ... i190, i191, i192, i193, i194, i195, i196, i197, i198, |
|
199 ... i199, i200, i201, i202, i203, i204, i205, i206, i207, |
|
200 ... i208, i209, i210, i211, i212, i213, i214, i215, i216, |
|
201 ... i217, i218, i219, i220, i221, i222, i223, i224, i225, |
|
202 ... i226, i227, i228, i229, i230, i231, i232, i233, i234, |
|
203 ... i235, i236, i237, i238, i239, i240, i241, i242, i243, |
|
204 ... (x for x in i244), i245, i246, i247, i248, i249, i250, i251, |
|
205 ... i252=1, i253=1, i254=1, i255=1) |
|
206 Traceback (most recent call last): |
|
207 SyntaxError: more than 255 arguments (<doctest test.test_syntax[26]>, line 1) |
|
208 |
|
209 >>> f(lambda x: x[0] = 3) |
|
210 Traceback (most recent call last): |
|
211 SyntaxError: lambda cannot contain assignment (<doctest test.test_syntax[27]>, line 1) |
|
212 |
|
213 The grammar accepts any test (basically, any expression) in the |
|
214 keyword slot of a call site. Test a few different options. |
|
215 |
|
216 >>> f(x()=2) |
|
217 Traceback (most recent call last): |
|
218 SyntaxError: keyword can't be an expression (<doctest test.test_syntax[28]>, line 1) |
|
219 >>> f(a or b=1) |
|
220 Traceback (most recent call last): |
|
221 SyntaxError: keyword can't be an expression (<doctest test.test_syntax[29]>, line 1) |
|
222 >>> f(x.y=1) |
|
223 Traceback (most recent call last): |
|
224 SyntaxError: keyword can't be an expression (<doctest test.test_syntax[30]>, line 1) |
|
225 |
|
226 |
|
227 From ast_for_expr_stmt(): |
|
228 |
|
229 >>> (x for x in x) += 1 |
|
230 Traceback (most recent call last): |
|
231 SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_syntax[31]>, line 1) |
|
232 >>> None += 1 |
|
233 Traceback (most recent call last): |
|
234 SyntaxError: assignment to None (<doctest test.test_syntax[32]>, line 1) |
|
235 >>> f() += 1 |
|
236 Traceback (most recent call last): |
|
237 SyntaxError: illegal expression for augmented assignment (<doctest test.test_syntax[33]>, line 1) |
|
238 |
|
239 |
|
240 Test continue in finally in weird combinations. |
|
241 |
|
242 continue in for loop under finally shouuld be ok. |
|
243 |
|
244 >>> def test(): |
|
245 ... try: |
|
246 ... pass |
|
247 ... finally: |
|
248 ... for abc in range(10): |
|
249 ... continue |
|
250 ... print abc |
|
251 >>> test() |
|
252 9 |
|
253 |
|
254 Start simple, a continue in a finally should not be allowed. |
|
255 |
|
256 >>> def test(): |
|
257 ... for abc in range(10): |
|
258 ... try: |
|
259 ... pass |
|
260 ... finally: |
|
261 ... continue |
|
262 ... |
|
263 Traceback (most recent call last): |
|
264 ... |
|
265 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[36]>, line 6) |
|
266 |
|
267 This is essentially a continue in a finally which should not be allowed. |
|
268 |
|
269 >>> def test(): |
|
270 ... for abc in range(10): |
|
271 ... try: |
|
272 ... pass |
|
273 ... finally: |
|
274 ... try: |
|
275 ... continue |
|
276 ... except: |
|
277 ... pass |
|
278 Traceback (most recent call last): |
|
279 ... |
|
280 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[37]>, line 7) |
|
281 |
|
282 >>> def foo(): |
|
283 ... try: |
|
284 ... pass |
|
285 ... finally: |
|
286 ... continue |
|
287 Traceback (most recent call last): |
|
288 ... |
|
289 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[38]>, line 5) |
|
290 |
|
291 >>> def foo(): |
|
292 ... for a in (): |
|
293 ... try: pass |
|
294 ... finally: continue |
|
295 Traceback (most recent call last): |
|
296 ... |
|
297 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[39]>, line 4) |
|
298 |
|
299 >>> def foo(): |
|
300 ... for a in (): |
|
301 ... try: pass |
|
302 ... finally: |
|
303 ... try: |
|
304 ... continue |
|
305 ... finally: pass |
|
306 Traceback (most recent call last): |
|
307 ... |
|
308 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[40]>, line 6) |
|
309 |
|
310 >>> def foo(): |
|
311 ... for a in (): |
|
312 ... try: pass |
|
313 ... finally: |
|
314 ... try: |
|
315 ... pass |
|
316 ... except: |
|
317 ... continue |
|
318 Traceback (most recent call last): |
|
319 ... |
|
320 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[41]>, line 8) |
|
321 |
|
322 There is one test for a break that is not in a loop. The compiler |
|
323 uses a single data structure to keep track of try-finally and loops, |
|
324 so we need to be sure that a break is actually inside a loop. If it |
|
325 isn't, there should be a syntax error. |
|
326 |
|
327 >>> try: |
|
328 ... print 1 |
|
329 ... break |
|
330 ... print 2 |
|
331 ... finally: |
|
332 ... print 3 |
|
333 Traceback (most recent call last): |
|
334 ... |
|
335 SyntaxError: 'break' outside loop (<doctest test.test_syntax[42]>, line 3) |
|
336 |
|
337 This should probably raise a better error than a SystemError (or none at all). |
|
338 In 2.5 there was a missing exception and an assert was triggered in a debug |
|
339 build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514 |
|
340 |
|
341 >>> while 1: |
|
342 ... while 2: |
|
343 ... while 3: |
|
344 ... while 4: |
|
345 ... while 5: |
|
346 ... while 6: |
|
347 ... while 8: |
|
348 ... while 9: |
|
349 ... while 10: |
|
350 ... while 11: |
|
351 ... while 12: |
|
352 ... while 13: |
|
353 ... while 14: |
|
354 ... while 15: |
|
355 ... while 16: |
|
356 ... while 17: |
|
357 ... while 18: |
|
358 ... while 19: |
|
359 ... while 20: |
|
360 ... while 21: |
|
361 ... while 22: |
|
362 ... break |
|
363 Traceback (most recent call last): |
|
364 ... |
|
365 SystemError: too many statically nested blocks |
|
366 |
|
367 This tests assignment-context; there was a bug in Python 2.5 where compiling |
|
368 a complex 'if' (one with 'elif') would fail to notice an invalid suite, |
|
369 leading to spurious errors. |
|
370 |
|
371 >>> if 1: |
|
372 ... x() = 1 |
|
373 ... elif 1: |
|
374 ... pass |
|
375 Traceback (most recent call last): |
|
376 ... |
|
377 SyntaxError: can't assign to function call (<doctest test.test_syntax[44]>, line 2) |
|
378 |
|
379 >>> if 1: |
|
380 ... pass |
|
381 ... elif 1: |
|
382 ... x() = 1 |
|
383 Traceback (most recent call last): |
|
384 ... |
|
385 SyntaxError: can't assign to function call (<doctest test.test_syntax[45]>, line 4) |
|
386 |
|
387 >>> if 1: |
|
388 ... x() = 1 |
|
389 ... elif 1: |
|
390 ... pass |
|
391 ... else: |
|
392 ... pass |
|
393 Traceback (most recent call last): |
|
394 ... |
|
395 SyntaxError: can't assign to function call (<doctest test.test_syntax[46]>, line 2) |
|
396 |
|
397 >>> if 1: |
|
398 ... pass |
|
399 ... elif 1: |
|
400 ... x() = 1 |
|
401 ... else: |
|
402 ... pass |
|
403 Traceback (most recent call last): |
|
404 ... |
|
405 SyntaxError: can't assign to function call (<doctest test.test_syntax[47]>, line 4) |
|
406 |
|
407 >>> if 1: |
|
408 ... pass |
|
409 ... elif 1: |
|
410 ... pass |
|
411 ... else: |
|
412 ... x() = 1 |
|
413 Traceback (most recent call last): |
|
414 ... |
|
415 SyntaxError: can't assign to function call (<doctest test.test_syntax[48]>, line 6) |
|
416 |
|
417 """ |
|
418 |
|
419 import re |
|
420 import unittest |
|
421 import warnings |
|
422 |
|
423 from test import test_support |
|
424 |
|
425 class SyntaxTestCase(unittest.TestCase): |
|
426 |
|
427 def _check_error(self, code, errtext, |
|
428 filename="<testcase>", mode="exec", subclass=None): |
|
429 """Check that compiling code raises SyntaxError with errtext. |
|
430 |
|
431 errtest is a regular expression that must be present in the |
|
432 test of the exception raised. If subclass is specified it |
|
433 is the expected subclass of SyntaxError (e.g. IndentationError). |
|
434 """ |
|
435 try: |
|
436 compile(code, filename, mode) |
|
437 except SyntaxError, err: |
|
438 if subclass and not isinstance(err, subclass): |
|
439 self.fail("SyntaxError is not a %s" % subclass.__name__) |
|
440 mo = re.search(errtext, str(err)) |
|
441 if mo is None: |
|
442 self.fail("SyntaxError did not contain '%r'" % (errtext,)) |
|
443 else: |
|
444 self.fail("compile() did not raise SyntaxError") |
|
445 |
|
446 def test_assign_call(self): |
|
447 self._check_error("f() = 1", "assign") |
|
448 |
|
449 def test_assign_del(self): |
|
450 self._check_error("del f()", "delete") |
|
451 |
|
452 def test_global_err_then_warn(self): |
|
453 # Bug tickler: The SyntaxError raised for one global statement |
|
454 # shouldn't be clobbered by a SyntaxWarning issued for a later one. |
|
455 source = re.sub('(?m)^ *:', '', """\ |
|
456 :def error(a): |
|
457 : global a # SyntaxError |
|
458 :def warning(): |
|
459 : b = 1 |
|
460 : global b # SyntaxWarning |
|
461 :""") |
|
462 warnings.filterwarnings(action='ignore', category=SyntaxWarning) |
|
463 self._check_error(source, "global") |
|
464 warnings.filters.pop(0) |
|
465 |
|
466 def test_break_outside_loop(self): |
|
467 self._check_error("break", "outside loop") |
|
468 |
|
469 def test_delete_deref(self): |
|
470 source = re.sub('(?m)^ *:', '', """\ |
|
471 :def foo(x): |
|
472 : def bar(): |
|
473 : print x |
|
474 : del x |
|
475 :""") |
|
476 self._check_error(source, "nested scope") |
|
477 |
|
478 def test_unexpected_indent(self): |
|
479 self._check_error("foo()\n bar()\n", "unexpected indent", |
|
480 subclass=IndentationError) |
|
481 |
|
482 def test_no_indent(self): |
|
483 self._check_error("if 1:\nfoo()", "expected an indented block", |
|
484 subclass=IndentationError) |
|
485 |
|
486 def test_bad_outdent(self): |
|
487 self._check_error("if 1:\n foo()\n bar()", |
|
488 "unindent does not match .* level", |
|
489 subclass=IndentationError) |
|
490 |
|
491 def test_kwargs_last(self): |
|
492 self._check_error("int(base=10, '2')", "non-keyword arg") |
|
493 |
|
494 def test_main(): |
|
495 test_support.run_unittest(SyntaxTestCase) |
|
496 from test import test_syntax |
|
497 test_support.run_doctest(test_syntax, verbosity=True) |
|
498 |
|
499 if __name__ == "__main__": |
|
500 test_main() |