blob: a22cebb828b3d40975bf07f093360a7f8f01a137 [file] [log] [blame]
Jeremy Hyltonc960f262006-01-27 15:18:39 +00001"""This module tests SyntaxErrors.
2
3Here's an example of the sort of thing that is tested.
4
5>>> def f(x):
6... global x
7Traceback (most recent call last):
Nick Coghlan650f0d02007-04-15 12:05:43 +00008SyntaxError: name 'x' is parameter and global
Jeremy Hyltonc960f262006-01-27 15:18:39 +00009
10The tests are all raise SyntaxErrors. They were created by checking
11each C call that raises SyntaxError. There are several modules that
12raise these exceptions-- ast.c, compile.c, future.c, pythonrun.c, and
13symtable.c.
14
15The parser itself outlaws a lot of invalid syntax. None of these
16errors are tested here at the moment. We should add some tests; since
17there are infinitely many programs with invalid syntax, we would need
18to be judicious in selecting some.
19
20The compiler generates a synthetic module name for code executed by
21doctest. 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
23order of tests in this module means renumbering all the errors after
24it. (Maybe we should enable the ellipsis option for these tests.)
25
26In ast.c, syntax errors are raised by calling ast_error().
27
28Errors from set_context():
29
Jeremy Hyltonc960f262006-01-27 15:18:39 +000030>>> obj.None = 1
31Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +000032SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000033
34>>> None = 1
35Traceback (most recent call last):
Benjamin Peterson442f2092012-12-06 17:41:04 -050036SyntaxError: can't assign to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +000037
38It's a syntax error to assign to the empty tuple. Why isn't it an
39error to assign to the empty list? It will always raise some error at
40runtime.
41
42>>> () = 1
43Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000044SyntaxError: can't assign to ()
Jeremy Hyltonc960f262006-01-27 15:18:39 +000045
46>>> f() = 1
47Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000048SyntaxError: can't assign to function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000049
50>>> del f()
51Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000052SyntaxError: can't delete function call
Jeremy Hyltonc960f262006-01-27 15:18:39 +000053
54>>> a + 1 = 2
55Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000056SyntaxError: can't assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000057
58>>> (x for x in x) = 1
59Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000060SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000061
62>>> 1 = 1
63Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000064SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000065
66>>> "abc" = 1
67Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000068SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000069
Benjamin Petersonbd3e3622011-04-12 18:33:28 -050070>>> b"" = 1
71Traceback (most recent call last):
72SyntaxError: can't assign to literal
73
Jeremy Hyltonc960f262006-01-27 15:18:39 +000074>>> `1` = 1
75Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +000076SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000077
78If the left-hand side of an assignment is a list or tuple, an illegal
79expression inside that contain should still cause a syntax error.
80This test just checks a couple of cases rather than enumerating all of
81them.
82
83>>> (a, "b", c) = (1, 2, 3)
84Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000085SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000086
87>>> [a, b, c + 1] = [1, 2, 3]
88Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000089SyntaxError: can't assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000090
Thomas Wouters477c8d52006-05-27 19:21:47 +000091>>> a if 1 else b = 1
92Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000093SyntaxError: can't assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000094
95From compiler_complex_args():
96
97>>> def f(None=1):
98... pass
99Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000100SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000101
102
103From ast_for_arguments():
104
105>>> def f(x, y=1, z):
106... pass
107Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000108SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000109
110>>> def f(x, None):
111... pass
112Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000113SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000114
115>>> def f(*None):
116... pass
117Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000118SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000119
120>>> def f(**None):
121... pass
122Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000123SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000124
125
126From ast_for_funcdef():
127
128>>> def None(x):
129... pass
130Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000131SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000132
133
134From ast_for_call():
135
136>>> def f(it, *varargs):
137... return list(it)
138>>> L = range(10)
139>>> f(x for x in L)
140[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
141>>> f(x for x in L, 1)
142Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000143SyntaxError: Generator expression must be parenthesized if not sole argument
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400144>>> f(x for x in L, y for y in L)
145Traceback (most recent call last):
146SyntaxError: Generator expression must be parenthesized if not sole argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000147>>> f((x for x in L), 1)
148[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
149
150>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
151... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
152... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
153... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
154... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
155... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
156... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
157... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
158... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
159... i100, i101, i102, i103, i104, i105, i106, i107, i108,
160... i109, i110, i111, i112, i113, i114, i115, i116, i117,
161... i118, i119, i120, i121, i122, i123, i124, i125, i126,
162... i127, i128, i129, i130, i131, i132, i133, i134, i135,
163... i136, i137, i138, i139, i140, i141, i142, i143, i144,
164... i145, i146, i147, i148, i149, i150, i151, i152, i153,
165... i154, i155, i156, i157, i158, i159, i160, i161, i162,
166... i163, i164, i165, i166, i167, i168, i169, i170, i171,
167... i172, i173, i174, i175, i176, i177, i178, i179, i180,
168... i181, i182, i183, i184, i185, i186, i187, i188, i189,
169... i190, i191, i192, i193, i194, i195, i196, i197, i198,
170... i199, i200, i201, i202, i203, i204, i205, i206, i207,
171... i208, i209, i210, i211, i212, i213, i214, i215, i216,
172... i217, i218, i219, i220, i221, i222, i223, i224, i225,
173... i226, i227, i228, i229, i230, i231, i232, i233, i234,
174... i235, i236, i237, i238, i239, i240, i241, i242, i243,
175... i244, i245, i246, i247, i248, i249, i250, i251, i252,
176... i253, i254, i255)
177Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000178SyntaxError: more than 255 arguments
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000179
180The actual error cases counts positional arguments, keyword arguments,
181and generator expression arguments separately. This test combines the
182three.
183
184>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
185... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
186... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
187... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
188... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
189... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
190... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
191... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
192... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
193... i100, i101, i102, i103, i104, i105, i106, i107, i108,
194... i109, i110, i111, i112, i113, i114, i115, i116, i117,
195... i118, i119, i120, i121, i122, i123, i124, i125, i126,
196... i127, i128, i129, i130, i131, i132, i133, i134, i135,
197... i136, i137, i138, i139, i140, i141, i142, i143, i144,
198... i145, i146, i147, i148, i149, i150, i151, i152, i153,
199... i154, i155, i156, i157, i158, i159, i160, i161, i162,
200... i163, i164, i165, i166, i167, i168, i169, i170, i171,
201... i172, i173, i174, i175, i176, i177, i178, i179, i180,
202... i181, i182, i183, i184, i185, i186, i187, i188, i189,
203... i190, i191, i192, i193, i194, i195, i196, i197, i198,
204... i199, i200, i201, i202, i203, i204, i205, i206, i207,
205... i208, i209, i210, i211, i212, i213, i214, i215, i216,
206... i217, i218, i219, i220, i221, i222, i223, i224, i225,
207... i226, i227, i228, i229, i230, i231, i232, i233, i234,
208... i235, i236, i237, i238, i239, i240, i241, i242, i243,
209... (x for x in i244), i245, i246, i247, i248, i249, i250, i251,
210... i252=1, i253=1, i254=1, i255=1)
211Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000212SyntaxError: more than 255 arguments
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000213
214>>> f(lambda x: x[0] = 3)
215Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000216SyntaxError: lambda cannot contain assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000217
218The grammar accepts any test (basically, any expression) in the
219keyword slot of a call site. Test a few different options.
220
221>>> f(x()=2)
222Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000223SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000224>>> f(a or b=1)
225Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000226SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000227>>> f(x.y=1)
228Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000229SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000230
231
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000232More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000233
234>>> (x for x in x) += 1
235Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000236SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000237>>> None += 1
238Traceback (most recent call last):
Benjamin Peterson442f2092012-12-06 17:41:04 -0500239SyntaxError: can't assign to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000240>>> f() += 1
241Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000242SyntaxError: can't assign to function call
Thomas Wouters89f507f2006-12-13 04:49:30 +0000243
244
245Test continue in finally in weird combinations.
246
Ezio Melotti13925002011-03-16 11:05:33 +0200247continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000248
249 >>> def test():
250 ... try:
251 ... pass
252 ... finally:
253 ... for abc in range(10):
254 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000255 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000256 >>> test()
257 9
258
259Start simple, a continue in a finally should not be allowed.
260
261 >>> def test():
262 ... for abc in range(10):
263 ... try:
264 ... pass
265 ... finally:
266 ... continue
267 Traceback (most recent call last):
268 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000269 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000270
271This is essentially a continue in a finally which should not be allowed.
272
273 >>> def test():
274 ... for abc in range(10):
275 ... try:
276 ... pass
277 ... finally:
278 ... try:
279 ... continue
280 ... except:
281 ... pass
282 Traceback (most recent call last):
283 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000284 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000285
286 >>> def foo():
287 ... try:
288 ... pass
289 ... finally:
290 ... continue
291 Traceback (most recent call last):
292 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000293 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000294
295 >>> def foo():
296 ... for a in ():
297 ... try:
298 ... pass
299 ... finally:
300 ... continue
301 Traceback (most recent call last):
302 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000303 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000304
305 >>> def foo():
306 ... for a in ():
307 ... try:
308 ... pass
309 ... finally:
310 ... try:
311 ... continue
312 ... finally:
313 ... pass
314 Traceback (most recent call last):
315 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000316 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000317
318 >>> def foo():
319 ... for a in ():
320 ... try: pass
321 ... finally:
322 ... try:
323 ... pass
324 ... except:
325 ... continue
326 Traceback (most recent call last):
327 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000328 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000329
330There is one test for a break that is not in a loop. The compiler
331uses a single data structure to keep track of try-finally and loops,
332so we need to be sure that a break is actually inside a loop. If it
333isn't, there should be a syntax error.
334
335 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000336 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000337 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000338 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000339 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000340 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000341 Traceback (most recent call last):
342 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000343 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000344
345This should probably raise a better error than a SystemError (or none at all).
346In 2.5 there was a missing exception and an assert was triggered in a debug
347build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
348
349 >>> while 1:
350 ... while 2:
351 ... while 3:
352 ... while 4:
353 ... while 5:
354 ... while 6:
355 ... while 8:
356 ... while 9:
357 ... while 10:
358 ... while 11:
359 ... while 12:
360 ... while 13:
361 ... while 14:
362 ... while 15:
363 ... while 16:
364 ... while 17:
365 ... while 18:
366 ... while 19:
367 ... while 20:
368 ... while 21:
369 ... while 22:
370 ... break
371 Traceback (most recent call last):
372 ...
373 SystemError: too many statically nested blocks
374
Jeremy Hylton81e95022007-02-27 06:50:52 +0000375Misuse of the nonlocal statement can lead to a few unique syntax errors.
376
377 >>> def f(x):
378 ... nonlocal x
379 Traceback (most recent call last):
380 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000381 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000382
Jeremy Hylton81e95022007-02-27 06:50:52 +0000383 >>> def f():
384 ... global x
385 ... nonlocal x
386 Traceback (most recent call last):
387 ...
388 SyntaxError: name 'x' is nonlocal and global
389
390 >>> def f():
391 ... nonlocal x
392 Traceback (most recent call last):
393 ...
394 SyntaxError: no binding for nonlocal 'x' found
395
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000396From SF bug #1705365
397 >>> nonlocal x
398 Traceback (most recent call last):
399 ...
400 SyntaxError: nonlocal declaration not allowed at module level
401
Jeremy Hylton81e95022007-02-27 06:50:52 +0000402TODO(jhylton): Figure out how to test SyntaxWarning with doctest.
403
404## >>> def f(x):
405## ... def f():
406## ... print(x)
407## ... nonlocal x
408## Traceback (most recent call last):
409## ...
410## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
Guido van Rossumd8faa362007-04-27 19:54:29 +0000411
Jeremy Hylton81e95022007-02-27 06:50:52 +0000412## >>> def f():
413## ... x = 1
414## ... nonlocal x
415## Traceback (most recent call last):
416## ...
417## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
418
Guido van Rossumd8faa362007-04-27 19:54:29 +0000419
420This tests assignment-context; there was a bug in Python 2.5 where compiling
421a complex 'if' (one with 'elif') would fail to notice an invalid suite,
422leading to spurious errors.
423
424 >>> if 1:
425 ... x() = 1
426 ... elif 1:
427 ... pass
428 Traceback (most recent call last):
429 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000430 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000431
432 >>> if 1:
433 ... pass
434 ... elif 1:
435 ... x() = 1
436 Traceback (most recent call last):
437 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000438 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000439
440 >>> if 1:
441 ... x() = 1
442 ... elif 1:
443 ... pass
444 ... else:
445 ... pass
446 Traceback (most recent call last):
447 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000448 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000449
450 >>> if 1:
451 ... pass
452 ... elif 1:
453 ... x() = 1
454 ... else:
455 ... pass
456 Traceback (most recent call last):
457 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000458 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000459
460 >>> if 1:
461 ... pass
462 ... elif 1:
463 ... pass
464 ... else:
465 ... x() = 1
466 Traceback (most recent call last):
467 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000468 SyntaxError: can't assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000469
Collin Winter828f04a2007-08-31 00:04:24 +0000470Make sure that the old "raise X, Y[, Z]" form is gone:
471 >>> raise X, Y
472 Traceback (most recent call last):
473 ...
474 SyntaxError: invalid syntax
475 >>> raise X, Y, Z
476 Traceback (most recent call last):
477 ...
478 SyntaxError: invalid syntax
479
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000480
481>>> f(a=23, a=234)
482Traceback (most recent call last):
483 ...
484SyntaxError: keyword argument repeated
485
Benjamin Peterson78565b22009-06-28 19:19:51 +0000486>>> del ()
487Traceback (most recent call last):
Benjamin Peterson78565b22009-06-28 19:19:51 +0000488SyntaxError: can't delete ()
489
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000490>>> {1, 2, 3} = 42
491Traceback (most recent call last):
492SyntaxError: can't assign to literal
493
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000494Corner-cases that used to fail to raise the correct error:
495
496 >>> def f(*, x=lambda __debug__:0): pass
497 Traceback (most recent call last):
498 SyntaxError: assignment to keyword
499
500 >>> def f(*args:(lambda __debug__:0)): pass
501 Traceback (most recent call last):
502 SyntaxError: assignment to keyword
503
504 >>> def f(**kwargs:(lambda __debug__:0)): pass
505 Traceback (most recent call last):
506 SyntaxError: assignment to keyword
507
508 >>> with (lambda *:0): pass
509 Traceback (most recent call last):
510 SyntaxError: named arguments must follow bare *
511
512Corner-cases that used to crash:
513
514 >>> def f(**__debug__): pass
515 Traceback (most recent call last):
516 SyntaxError: assignment to keyword
517
518 >>> def f(*xx, __debug__): pass
519 Traceback (most recent call last):
520 SyntaxError: assignment to keyword
521
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000522"""
523
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000524import re
525import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000526import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000527
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000528from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000529
530class SyntaxTestCase(unittest.TestCase):
531
532 def _check_error(self, code, errtext,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000533 filename="<testcase>", mode="exec", subclass=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000534 """Check that compiling code raises SyntaxError with errtext.
535
536 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000537 test of the exception raised. If subclass is specified it
538 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000539 """
540 try:
541 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000542 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000543 if subclass and not isinstance(err, subclass):
544 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000545 mo = re.search(errtext, str(err))
546 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000547 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000548 else:
549 self.fail("compile() did not raise SyntaxError")
550
551 def test_assign_call(self):
552 self._check_error("f() = 1", "assign")
553
554 def test_assign_del(self):
555 self._check_error("del f()", "delete")
556
Jeremy Hylton42d90162003-07-15 20:24:27 +0000557 def test_global_err_then_warn(self):
558 # Bug tickler: The SyntaxError raised for one global statement
559 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000560 source = """if 1:
561 def error(a):
562 global a # SyntaxError
563 def warning():
564 b = 1
565 global b # SyntaxWarning
566 """
Jeremy Hylton42d90162003-07-15 20:24:27 +0000567 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
568 self._check_error(source, "global")
569 warnings.filters.pop(0)
570
Neal Norwitzfcf44352005-11-27 20:37:43 +0000571 def test_break_outside_loop(self):
572 self._check_error("break", "outside loop")
573
Thomas Wouters477c8d52006-05-27 19:21:47 +0000574 def test_unexpected_indent(self):
575 self._check_error("foo()\n bar()\n", "unexpected indent",
576 subclass=IndentationError)
577
578 def test_no_indent(self):
579 self._check_error("if 1:\nfoo()", "expected an indented block",
580 subclass=IndentationError)
581
582 def test_bad_outdent(self):
583 self._check_error("if 1:\n foo()\n bar()",
584 "unindent does not match .* level",
585 subclass=IndentationError)
586
587 def test_kwargs_last(self):
Benjamin Peterson025e9eb2015-05-05 20:16:41 -0400588 self._check_error("int(base=10, '2')",
589 "positional argument follows keyword argument")
590
591 def test_kwargs_last2(self):
592 self._check_error("int(**{base: 10}, '2')",
593 "positional argument follows "
594 "keyword argument unpacking")
595
596 def test_kwargs_last3(self):
597 self._check_error("int(**{base: 10}, *['2'])",
598 "iterable argument unpacking follows "
599 "keyword argument unpacking")
Thomas Wouters477c8d52006-05-27 19:21:47 +0000600
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000601def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000602 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000603 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000604 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000605
606if __name__ == "__main__":
607 test_main()