blob: 5926b69c93bc3dd6198d3b9131b445c8e09537b9 [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):
Guido van Rossum33d26892007-08-05 15:29:28 +000036SyntaxError: assignment 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
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000144>>> f((x for x in L), 1)
145[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
146
147>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
148... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
149... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
150... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
151... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
152... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
153... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
154... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
155... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
156... i100, i101, i102, i103, i104, i105, i106, i107, i108,
157... i109, i110, i111, i112, i113, i114, i115, i116, i117,
158... i118, i119, i120, i121, i122, i123, i124, i125, i126,
159... i127, i128, i129, i130, i131, i132, i133, i134, i135,
160... i136, i137, i138, i139, i140, i141, i142, i143, i144,
161... i145, i146, i147, i148, i149, i150, i151, i152, i153,
162... i154, i155, i156, i157, i158, i159, i160, i161, i162,
163... i163, i164, i165, i166, i167, i168, i169, i170, i171,
164... i172, i173, i174, i175, i176, i177, i178, i179, i180,
165... i181, i182, i183, i184, i185, i186, i187, i188, i189,
166... i190, i191, i192, i193, i194, i195, i196, i197, i198,
167... i199, i200, i201, i202, i203, i204, i205, i206, i207,
168... i208, i209, i210, i211, i212, i213, i214, i215, i216,
169... i217, i218, i219, i220, i221, i222, i223, i224, i225,
170... i226, i227, i228, i229, i230, i231, i232, i233, i234,
171... i235, i236, i237, i238, i239, i240, i241, i242, i243,
172... i244, i245, i246, i247, i248, i249, i250, i251, i252,
173... i253, i254, i255)
174Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000175SyntaxError: more than 255 arguments
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000176
177The actual error cases counts positional arguments, keyword arguments,
178and generator expression arguments separately. This test combines the
179three.
180
181>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
182... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
183... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
184... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
185... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
186... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
187... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
188... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
189... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
190... i100, i101, i102, i103, i104, i105, i106, i107, i108,
191... i109, i110, i111, i112, i113, i114, i115, i116, i117,
192... i118, i119, i120, i121, i122, i123, i124, i125, i126,
193... i127, i128, i129, i130, i131, i132, i133, i134, i135,
194... i136, i137, i138, i139, i140, i141, i142, i143, i144,
195... i145, i146, i147, i148, i149, i150, i151, i152, i153,
196... i154, i155, i156, i157, i158, i159, i160, i161, i162,
197... i163, i164, i165, i166, i167, i168, i169, i170, i171,
198... i172, i173, i174, i175, i176, i177, i178, i179, i180,
199... i181, i182, i183, i184, i185, i186, i187, i188, i189,
200... i190, i191, i192, i193, i194, i195, i196, i197, i198,
201... i199, i200, i201, i202, i203, i204, i205, i206, i207,
202... i208, i209, i210, i211, i212, i213, i214, i215, i216,
203... i217, i218, i219, i220, i221, i222, i223, i224, i225,
204... i226, i227, i228, i229, i230, i231, i232, i233, i234,
205... i235, i236, i237, i238, i239, i240, i241, i242, i243,
206... (x for x in i244), i245, i246, i247, i248, i249, i250, i251,
207... i252=1, i253=1, i254=1, i255=1)
208Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000209SyntaxError: more than 255 arguments
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000210
211>>> f(lambda x: x[0] = 3)
212Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000213SyntaxError: lambda cannot contain assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000214
215The grammar accepts any test (basically, any expression) in the
216keyword slot of a call site. Test a few different options.
217
218>>> f(x()=2)
219Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000220SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000221>>> f(a or b=1)
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(x.y=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
228
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000229More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000230
231>>> (x for x in x) += 1
232Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000233SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000234>>> None += 1
235Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000236SyntaxError: assignment to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000237>>> f() += 1
238Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000239SyntaxError: can't assign to function call
Thomas Wouters89f507f2006-12-13 04:49:30 +0000240
241
242Test continue in finally in weird combinations.
243
Ezio Melotti13925002011-03-16 11:05:33 +0200244continue in for loop under finally should be ok.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000245
246 >>> def test():
247 ... try:
248 ... pass
249 ... finally:
250 ... for abc in range(10):
251 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000252 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000253 >>> test()
254 9
255
256Start simple, a continue in a finally should not be allowed.
257
258 >>> def test():
259 ... for abc in range(10):
260 ... try:
261 ... pass
262 ... finally:
263 ... continue
264 Traceback (most recent call last):
265 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000266 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000267
268This is essentially a continue in a finally which should not be allowed.
269
270 >>> def test():
271 ... for abc in range(10):
272 ... try:
273 ... pass
274 ... finally:
275 ... try:
276 ... continue
277 ... except:
278 ... pass
279 Traceback (most recent call last):
280 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000281 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000282
283 >>> def foo():
284 ... try:
285 ... pass
286 ... finally:
287 ... continue
288 Traceback (most recent call last):
289 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000290 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000291
292 >>> def foo():
293 ... for a in ():
294 ... try:
295 ... pass
296 ... finally:
297 ... continue
298 Traceback (most recent call last):
299 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000300 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000301
302 >>> def foo():
303 ... for a in ():
304 ... try:
305 ... pass
306 ... finally:
307 ... try:
308 ... continue
309 ... finally:
310 ... pass
311 Traceback (most recent call last):
312 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000313 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000314
315 >>> def foo():
316 ... for a in ():
317 ... try: pass
318 ... finally:
319 ... try:
320 ... pass
321 ... except:
322 ... continue
323 Traceback (most recent call last):
324 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000325 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000326
327There is one test for a break that is not in a loop. The compiler
328uses a single data structure to keep track of try-finally and loops,
329so we need to be sure that a break is actually inside a loop. If it
330isn't, there should be a syntax error.
331
332 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000333 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000334 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000335 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000336 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000337 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000338 Traceback (most recent call last):
339 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000340 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000341
342This should probably raise a better error than a SystemError (or none at all).
343In 2.5 there was a missing exception and an assert was triggered in a debug
344build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
345
346 >>> while 1:
347 ... while 2:
348 ... while 3:
349 ... while 4:
350 ... while 5:
351 ... while 6:
352 ... while 8:
353 ... while 9:
354 ... while 10:
355 ... while 11:
356 ... while 12:
357 ... while 13:
358 ... while 14:
359 ... while 15:
360 ... while 16:
361 ... while 17:
362 ... while 18:
363 ... while 19:
364 ... while 20:
365 ... while 21:
366 ... while 22:
367 ... break
368 Traceback (most recent call last):
369 ...
370 SystemError: too many statically nested blocks
371
Jeremy Hylton81e95022007-02-27 06:50:52 +0000372Misuse of the nonlocal statement can lead to a few unique syntax errors.
373
374 >>> def f(x):
375 ... nonlocal x
376 Traceback (most recent call last):
377 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000378 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000379
Jeremy Hylton81e95022007-02-27 06:50:52 +0000380 >>> def f():
381 ... global x
382 ... nonlocal x
383 Traceback (most recent call last):
384 ...
385 SyntaxError: name 'x' is nonlocal and global
386
387 >>> def f():
388 ... nonlocal x
389 Traceback (most recent call last):
390 ...
391 SyntaxError: no binding for nonlocal 'x' found
392
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000393From SF bug #1705365
394 >>> nonlocal x
395 Traceback (most recent call last):
396 ...
397 SyntaxError: nonlocal declaration not allowed at module level
398
Jeremy Hylton81e95022007-02-27 06:50:52 +0000399TODO(jhylton): Figure out how to test SyntaxWarning with doctest.
400
401## >>> def f(x):
402## ... def f():
403## ... print(x)
404## ... nonlocal x
405## Traceback (most recent call last):
406## ...
407## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
Guido van Rossumd8faa362007-04-27 19:54:29 +0000408
Jeremy Hylton81e95022007-02-27 06:50:52 +0000409## >>> def f():
410## ... x = 1
411## ... nonlocal x
412## Traceback (most recent call last):
413## ...
414## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
415
Guido van Rossumd8faa362007-04-27 19:54:29 +0000416
417This tests assignment-context; there was a bug in Python 2.5 where compiling
418a complex 'if' (one with 'elif') would fail to notice an invalid suite,
419leading to spurious errors.
420
421 >>> if 1:
422 ... x() = 1
423 ... elif 1:
424 ... pass
425 Traceback (most recent call last):
426 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000427 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000428
429 >>> if 1:
430 ... pass
431 ... elif 1:
432 ... x() = 1
433 Traceback (most recent call last):
434 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000435 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436
437 >>> if 1:
438 ... x() = 1
439 ... elif 1:
440 ... pass
441 ... else:
442 ... pass
443 Traceback (most recent call last):
444 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000445 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000446
447 >>> if 1:
448 ... pass
449 ... elif 1:
450 ... x() = 1
451 ... else:
452 ... pass
453 Traceback (most recent call last):
454 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000455 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000456
457 >>> if 1:
458 ... pass
459 ... elif 1:
460 ... pass
461 ... else:
462 ... x() = 1
463 Traceback (most recent call last):
464 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000465 SyntaxError: can't assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000466
Collin Winter828f04a2007-08-31 00:04:24 +0000467Make sure that the old "raise X, Y[, Z]" form is gone:
468 >>> raise X, Y
469 Traceback (most recent call last):
470 ...
471 SyntaxError: invalid syntax
472 >>> raise X, Y, Z
473 Traceback (most recent call last):
474 ...
475 SyntaxError: invalid syntax
476
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000477
478>>> f(a=23, a=234)
479Traceback (most recent call last):
480 ...
481SyntaxError: keyword argument repeated
482
Benjamin Peterson78565b22009-06-28 19:19:51 +0000483>>> del ()
484Traceback (most recent call last):
Benjamin Peterson78565b22009-06-28 19:19:51 +0000485SyntaxError: can't delete ()
486
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000487>>> {1, 2, 3} = 42
488Traceback (most recent call last):
489SyntaxError: can't assign to literal
490
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000491Corner-cases that used to fail to raise the correct error:
492
493 >>> def f(*, x=lambda __debug__:0): pass
494 Traceback (most recent call last):
495 SyntaxError: assignment to keyword
496
497 >>> def f(*args:(lambda __debug__:0)): pass
498 Traceback (most recent call last):
499 SyntaxError: assignment to keyword
500
501 >>> def f(**kwargs:(lambda __debug__:0)): pass
502 Traceback (most recent call last):
503 SyntaxError: assignment to keyword
504
505 >>> with (lambda *:0): pass
506 Traceback (most recent call last):
507 SyntaxError: named arguments must follow bare *
508
509Corner-cases that used to crash:
510
511 >>> def f(**__debug__): pass
512 Traceback (most recent call last):
513 SyntaxError: assignment to keyword
514
515 >>> def f(*xx, __debug__): pass
516 Traceback (most recent call last):
517 SyntaxError: assignment to keyword
518
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000519"""
520
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000521import re
522import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000523import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000524
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000525from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000526
527class SyntaxTestCase(unittest.TestCase):
528
529 def _check_error(self, code, errtext,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000530 filename="<testcase>", mode="exec", subclass=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000531 """Check that compiling code raises SyntaxError with errtext.
532
533 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000534 test of the exception raised. If subclass is specified it
535 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000536 """
537 try:
538 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000539 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000540 if subclass and not isinstance(err, subclass):
541 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000542 mo = re.search(errtext, str(err))
543 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000544 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000545 else:
546 self.fail("compile() did not raise SyntaxError")
547
548 def test_assign_call(self):
549 self._check_error("f() = 1", "assign")
550
551 def test_assign_del(self):
552 self._check_error("del f()", "delete")
553
Jeremy Hylton42d90162003-07-15 20:24:27 +0000554 def test_global_err_then_warn(self):
555 # Bug tickler: The SyntaxError raised for one global statement
556 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000557 source = """if 1:
558 def error(a):
559 global a # SyntaxError
560 def warning():
561 b = 1
562 global b # SyntaxWarning
563 """
Jeremy Hylton42d90162003-07-15 20:24:27 +0000564 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
565 self._check_error(source, "global")
566 warnings.filters.pop(0)
567
Neal Norwitzfcf44352005-11-27 20:37:43 +0000568 def test_break_outside_loop(self):
569 self._check_error("break", "outside loop")
570
Thomas Wouters477c8d52006-05-27 19:21:47 +0000571 def test_unexpected_indent(self):
572 self._check_error("foo()\n bar()\n", "unexpected indent",
573 subclass=IndentationError)
574
575 def test_no_indent(self):
576 self._check_error("if 1:\nfoo()", "expected an indented block",
577 subclass=IndentationError)
578
579 def test_bad_outdent(self):
580 self._check_error("if 1:\n foo()\n bar()",
581 "unindent does not match .* level",
582 subclass=IndentationError)
583
584 def test_kwargs_last(self):
585 self._check_error("int(base=10, '2')", "non-keyword arg")
586
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000587def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000588 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000589 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000590 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000591
592if __name__ == "__main__":
593 test_main()