blob: 2afbb6176402d410d3332b5837fc7aaa0152d533 [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
70>>> `1` = 1
71Traceback (most recent call last):
Brett Cannon8933cb42006-08-25 04:12:10 +000072SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000073
74If the left-hand side of an assignment is a list or tuple, an illegal
75expression inside that contain should still cause a syntax error.
76This test just checks a couple of cases rather than enumerating all of
77them.
78
79>>> (a, "b", c) = (1, 2, 3)
80Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000081SyntaxError: can't assign to literal
Jeremy Hyltonc960f262006-01-27 15:18:39 +000082
83>>> [a, b, c + 1] = [1, 2, 3]
84Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000085SyntaxError: can't assign to operator
Jeremy Hyltonc960f262006-01-27 15:18:39 +000086
Thomas Wouters477c8d52006-05-27 19:21:47 +000087>>> a if 1 else b = 1
88Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +000089SyntaxError: can't assign to conditional expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +000090
91From compiler_complex_args():
92
93>>> def f(None=1):
94... pass
95Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +000096SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +000097
98
99From ast_for_arguments():
100
101>>> def f(x, y=1, z):
102... pass
103Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000104SyntaxError: non-default argument follows default argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000105
106>>> def f(x, None):
107... pass
108Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000109SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000110
111>>> def f(*None):
112... pass
113Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000114SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000115
116>>> def f(**None):
117... pass
118Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000119SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000120
121
122From ast_for_funcdef():
123
124>>> def None(x):
125... pass
126Traceback (most recent call last):
Guido van Rossume7ba4952007-06-06 23:52:48 +0000127SyntaxError: invalid syntax
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000128
129
130From ast_for_call():
131
132>>> def f(it, *varargs):
133... return list(it)
134>>> L = range(10)
135>>> f(x for x in L)
136[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
137>>> f(x for x in L, 1)
138Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000139SyntaxError: Generator expression must be parenthesized if not sole argument
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000140>>> f((x for x in L), 1)
141[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
142
143>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
144... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
145... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
146... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
147... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
148... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
149... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
150... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
151... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
152... i100, i101, i102, i103, i104, i105, i106, i107, i108,
153... i109, i110, i111, i112, i113, i114, i115, i116, i117,
154... i118, i119, i120, i121, i122, i123, i124, i125, i126,
155... i127, i128, i129, i130, i131, i132, i133, i134, i135,
156... i136, i137, i138, i139, i140, i141, i142, i143, i144,
157... i145, i146, i147, i148, i149, i150, i151, i152, i153,
158... i154, i155, i156, i157, i158, i159, i160, i161, i162,
159... i163, i164, i165, i166, i167, i168, i169, i170, i171,
160... i172, i173, i174, i175, i176, i177, i178, i179, i180,
161... i181, i182, i183, i184, i185, i186, i187, i188, i189,
162... i190, i191, i192, i193, i194, i195, i196, i197, i198,
163... i199, i200, i201, i202, i203, i204, i205, i206, i207,
164... i208, i209, i210, i211, i212, i213, i214, i215, i216,
165... i217, i218, i219, i220, i221, i222, i223, i224, i225,
166... i226, i227, i228, i229, i230, i231, i232, i233, i234,
167... i235, i236, i237, i238, i239, i240, i241, i242, i243,
168... i244, i245, i246, i247, i248, i249, i250, i251, i252,
169... i253, i254, i255)
170Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000171SyntaxError: more than 255 arguments
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000172
173The actual error cases counts positional arguments, keyword arguments,
174and generator expression arguments separately. This test combines the
175three.
176
177>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
178... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
179... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
180... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
181... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
182... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
183... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
184... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
185... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
186... i100, i101, i102, i103, i104, i105, i106, i107, i108,
187... i109, i110, i111, i112, i113, i114, i115, i116, i117,
188... i118, i119, i120, i121, i122, i123, i124, i125, i126,
189... i127, i128, i129, i130, i131, i132, i133, i134, i135,
190... i136, i137, i138, i139, i140, i141, i142, i143, i144,
191... i145, i146, i147, i148, i149, i150, i151, i152, i153,
192... i154, i155, i156, i157, i158, i159, i160, i161, i162,
193... i163, i164, i165, i166, i167, i168, i169, i170, i171,
194... i172, i173, i174, i175, i176, i177, i178, i179, i180,
195... i181, i182, i183, i184, i185, i186, i187, i188, i189,
196... i190, i191, i192, i193, i194, i195, i196, i197, i198,
197... i199, i200, i201, i202, i203, i204, i205, i206, i207,
198... i208, i209, i210, i211, i212, i213, i214, i215, i216,
199... i217, i218, i219, i220, i221, i222, i223, i224, i225,
200... i226, i227, i228, i229, i230, i231, i232, i233, i234,
201... i235, i236, i237, i238, i239, i240, i241, i242, i243,
202... (x for x in i244), i245, i246, i247, i248, i249, i250, i251,
203... i252=1, i253=1, i254=1, i255=1)
204Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000205SyntaxError: more than 255 arguments
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000206
207>>> f(lambda x: x[0] = 3)
208Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000209SyntaxError: lambda cannot contain assignment
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000210
211The grammar accepts any test (basically, any expression) in the
212keyword slot of a call site. Test a few different options.
213
214>>> f(x()=2)
215Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000216SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000217>>> f(a or b=1)
218Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000219SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000220>>> f(x.y=1)
221Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000222SyntaxError: keyword can't be an expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000223
224
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000225More set_context():
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000226
227>>> (x for x in x) += 1
228Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000229SyntaxError: can't assign to generator expression
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000230>>> None += 1
231Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000232SyntaxError: assignment to keyword
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000233>>> f() += 1
234Traceback (most recent call last):
Benjamin Peterson87c8d872009-06-11 22:54:11 +0000235SyntaxError: can't assign to function call
Thomas Wouters89f507f2006-12-13 04:49:30 +0000236
237
238Test continue in finally in weird combinations.
239
240continue in for loop under finally shouuld be ok.
241
242 >>> def test():
243 ... try:
244 ... pass
245 ... finally:
246 ... for abc in range(10):
247 ... continue
Guido van Rossum7131f842007-02-09 20:13:25 +0000248 ... print(abc)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000249 >>> test()
250 9
251
252Start simple, a continue in a finally should not be allowed.
253
254 >>> def test():
255 ... for abc in range(10):
256 ... try:
257 ... pass
258 ... finally:
259 ... continue
260 Traceback (most recent call last):
261 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000262 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000263
264This is essentially a continue in a finally which should not be allowed.
265
266 >>> def test():
267 ... for abc in range(10):
268 ... try:
269 ... pass
270 ... finally:
271 ... try:
272 ... continue
273 ... except:
274 ... pass
275 Traceback (most recent call last):
276 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000277 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000278
279 >>> def foo():
280 ... try:
281 ... pass
282 ... finally:
283 ... continue
284 Traceback (most recent call last):
285 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000286 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000287
288 >>> def foo():
289 ... for a in ():
290 ... try:
291 ... pass
292 ... finally:
293 ... continue
294 Traceback (most recent call last):
295 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000296 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000297
298 >>> def foo():
299 ... for a in ():
300 ... try:
301 ... pass
302 ... finally:
303 ... try:
304 ... continue
305 ... finally:
306 ... pass
307 Traceback (most recent call last):
308 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000309 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000310
311 >>> def foo():
312 ... for a in ():
313 ... try: pass
314 ... finally:
315 ... try:
316 ... pass
317 ... except:
318 ... continue
319 Traceback (most recent call last):
320 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000321 SyntaxError: 'continue' not supported inside 'finally' clause
Thomas Wouters89f507f2006-12-13 04:49:30 +0000322
323There is one test for a break that is not in a loop. The compiler
324uses a single data structure to keep track of try-finally and loops,
325so we need to be sure that a break is actually inside a loop. If it
326isn't, there should be a syntax error.
327
328 >>> try:
Guido van Rossum7131f842007-02-09 20:13:25 +0000329 ... print(1)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000330 ... break
Guido van Rossum7131f842007-02-09 20:13:25 +0000331 ... print(2)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000332 ... finally:
Guido van Rossum7131f842007-02-09 20:13:25 +0000333 ... print(3)
Thomas Wouters89f507f2006-12-13 04:49:30 +0000334 Traceback (most recent call last):
335 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000336 SyntaxError: 'break' outside loop
Thomas Wouters89f507f2006-12-13 04:49:30 +0000337
338This should probably raise a better error than a SystemError (or none at all).
339In 2.5 there was a missing exception and an assert was triggered in a debug
340build. The number of blocks must be greater than CO_MAXBLOCKS. SF #1565514
341
342 >>> while 1:
343 ... while 2:
344 ... while 3:
345 ... while 4:
346 ... while 5:
347 ... while 6:
348 ... while 8:
349 ... while 9:
350 ... while 10:
351 ... while 11:
352 ... while 12:
353 ... while 13:
354 ... while 14:
355 ... while 15:
356 ... while 16:
357 ... while 17:
358 ... while 18:
359 ... while 19:
360 ... while 20:
361 ... while 21:
362 ... while 22:
363 ... break
364 Traceback (most recent call last):
365 ...
366 SystemError: too many statically nested blocks
367
Jeremy Hylton81e95022007-02-27 06:50:52 +0000368Misuse of the nonlocal statement can lead to a few unique syntax errors.
369
370 >>> def f(x):
371 ... nonlocal x
372 Traceback (most recent call last):
373 ...
Nick Coghlan650f0d02007-04-15 12:05:43 +0000374 SyntaxError: name 'x' is parameter and nonlocal
Guido van Rossumd8faa362007-04-27 19:54:29 +0000375
Jeremy Hylton81e95022007-02-27 06:50:52 +0000376 >>> def f():
377 ... global x
378 ... nonlocal x
379 Traceback (most recent call last):
380 ...
381 SyntaxError: name 'x' is nonlocal and global
382
383 >>> def f():
384 ... nonlocal x
385 Traceback (most recent call last):
386 ...
387 SyntaxError: no binding for nonlocal 'x' found
388
Nick Coghlan4138bfe2007-04-23 10:14:27 +0000389From SF bug #1705365
390 >>> nonlocal x
391 Traceback (most recent call last):
392 ...
393 SyntaxError: nonlocal declaration not allowed at module level
394
Jeremy Hylton81e95022007-02-27 06:50:52 +0000395TODO(jhylton): Figure out how to test SyntaxWarning with doctest.
396
397## >>> def f(x):
398## ... def f():
399## ... print(x)
400## ... nonlocal x
401## Traceback (most recent call last):
402## ...
403## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
Guido van Rossumd8faa362007-04-27 19:54:29 +0000404
Jeremy Hylton81e95022007-02-27 06:50:52 +0000405## >>> def f():
406## ... x = 1
407## ... nonlocal x
408## Traceback (most recent call last):
409## ...
410## SyntaxWarning: name 'x' is assigned to before nonlocal declaration
411
Guido van Rossumd8faa362007-04-27 19:54:29 +0000412
413This tests assignment-context; there was a bug in Python 2.5 where compiling
414a complex 'if' (one with 'elif') would fail to notice an invalid suite,
415leading to spurious errors.
416
417 >>> if 1:
418 ... x() = 1
419 ... elif 1:
420 ... pass
421 Traceback (most recent call last):
422 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000423 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000424
425 >>> if 1:
426 ... pass
427 ... elif 1:
428 ... x() = 1
429 Traceback (most recent call last):
430 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000431 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000432
433 >>> if 1:
434 ... x() = 1
435 ... elif 1:
436 ... pass
437 ... else:
438 ... pass
439 Traceback (most recent call last):
440 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000441 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000442
443 >>> if 1:
444 ... pass
445 ... elif 1:
446 ... x() = 1
447 ... else:
448 ... pass
449 Traceback (most recent call last):
450 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000451 SyntaxError: can't assign to function call
Guido van Rossumd8faa362007-04-27 19:54:29 +0000452
453 >>> if 1:
454 ... pass
455 ... elif 1:
456 ... pass
457 ... else:
458 ... x() = 1
459 Traceback (most recent call last):
460 ...
Guido van Rossum33d26892007-08-05 15:29:28 +0000461 SyntaxError: can't assign to function call
Jeremy Hylton81e95022007-02-27 06:50:52 +0000462
Collin Winter828f04a2007-08-31 00:04:24 +0000463Make sure that the old "raise X, Y[, Z]" form is gone:
464 >>> raise X, Y
465 Traceback (most recent call last):
466 ...
467 SyntaxError: invalid syntax
468 >>> raise X, Y, Z
469 Traceback (most recent call last):
470 ...
471 SyntaxError: invalid syntax
472
Benjamin Peterson07a1f942008-07-01 20:03:27 +0000473
474>>> f(a=23, a=234)
475Traceback (most recent call last):
476 ...
477SyntaxError: keyword argument repeated
478
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000479Corner-cases that used to fail to raise the correct error:
480
Amaury Forgeot d'Arc72356332010-08-19 22:29:49 +0000481 >>> def f(*, x=lambda *:0): pass
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000482 Traceback (most recent call last):
Amaury Forgeot d'Arc72356332010-08-19 22:29:49 +0000483 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000484
Amaury Forgeot d'Arc72356332010-08-19 22:29:49 +0000485 >>> def f(*args:(lambda *:0)): pass
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000486 Traceback (most recent call last):
Amaury Forgeot d'Arc72356332010-08-19 22:29:49 +0000487 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000488
Amaury Forgeot d'Arc72356332010-08-19 22:29:49 +0000489 >>> def f(**kwargs:(lambda *:0)): pass
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000490 Traceback (most recent call last):
Amaury Forgeot d'Arc72356332010-08-19 22:29:49 +0000491 SyntaxError: named arguments must follow bare *
Amaury Forgeot d'Arca1e5c692010-08-19 21:35:59 +0000492
493 >>> with (lambda *:0): pass
494 Traceback (most recent call last):
495 SyntaxError: named arguments must follow bare *
496
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000497"""
498
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000499import re
500import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000501import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000502
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000503from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000504
505class SyntaxTestCase(unittest.TestCase):
506
507 def _check_error(self, code, errtext,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000508 filename="<testcase>", mode="exec", subclass=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000509 """Check that compiling code raises SyntaxError with errtext.
510
511 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000512 test of the exception raised. If subclass is specified it
513 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000514 """
515 try:
516 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000517 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000518 if subclass and not isinstance(err, subclass):
519 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000520 mo = re.search(errtext, str(err))
521 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000522 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000523 else:
524 self.fail("compile() did not raise SyntaxError")
525
526 def test_assign_call(self):
527 self._check_error("f() = 1", "assign")
528
529 def test_assign_del(self):
530 self._check_error("del f()", "delete")
531
Jeremy Hylton42d90162003-07-15 20:24:27 +0000532 def test_global_err_then_warn(self):
533 # Bug tickler: The SyntaxError raised for one global statement
534 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
535 source = re.sub('(?m)^ *:', '', """\
536 :def error(a):
537 : global a # SyntaxError
538 :def warning():
539 : b = 1
540 : global b # SyntaxWarning
541 :""")
542 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
543 self._check_error(source, "global")
544 warnings.filters.pop(0)
545
Neal Norwitzfcf44352005-11-27 20:37:43 +0000546 def test_break_outside_loop(self):
547 self._check_error("break", "outside loop")
548
549 def test_delete_deref(self):
550 source = re.sub('(?m)^ *:', '', """\
551 :def foo(x):
552 : def bar():
Georg Brandl88fc6642007-02-09 21:28:07 +0000553 : print(x)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000554 : del x
555 :""")
556 self._check_error(source, "nested scope")
557
Thomas Wouters477c8d52006-05-27 19:21:47 +0000558 def test_unexpected_indent(self):
559 self._check_error("foo()\n bar()\n", "unexpected indent",
560 subclass=IndentationError)
561
562 def test_no_indent(self):
563 self._check_error("if 1:\nfoo()", "expected an indented block",
564 subclass=IndentationError)
565
566 def test_bad_outdent(self):
567 self._check_error("if 1:\n foo()\n bar()",
568 "unindent does not match .* level",
569 subclass=IndentationError)
570
571 def test_kwargs_last(self):
572 self._check_error("int(base=10, '2')", "non-keyword arg")
573
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000574def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000575 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000576 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000577 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000578
579if __name__ == "__main__":
580 test_main()