blob: cd6b9a57f95aaf650c70abc5b790014a10aa734e [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
Benjamin Peterson78565b22009-06-28 19:19:51 +0000479>>> del ()
480Traceback (most recent call last):
Benjamin Peterson78565b22009-06-28 19:19:51 +0000481SyntaxError: can't delete ()
482
Benjamin Peterson1b1a1a42010-06-24 00:17:03 +0000483>>> {1, 2, 3} = 42
484Traceback (most recent call last):
485SyntaxError: can't assign to literal
486
Amaury Forgeot d'Arc12844e62010-08-19 21:32:38 +0000487Corner-cases that used to fail to raise the correct error:
488
489 >>> def f(*, x=lambda __debug__:0): pass
490 Traceback (most recent call last):
491 SyntaxError: assignment to keyword
492
493 >>> def f(*args:(lambda __debug__:0)): pass
494 Traceback (most recent call last):
495 SyntaxError: assignment to keyword
496
497 >>> def f(**kwargs:(lambda __debug__:0)): pass
498 Traceback (most recent call last):
499 SyntaxError: assignment to keyword
500
501 >>> with (lambda *:0): pass
502 Traceback (most recent call last):
503 SyntaxError: named arguments must follow bare *
504
505Corner-cases that used to crash:
506
507 >>> def f(**__debug__): pass
508 Traceback (most recent call last):
509 SyntaxError: assignment to keyword
510
511 >>> def f(*xx, __debug__): pass
512 Traceback (most recent call last):
513 SyntaxError: assignment to keyword
514
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000515"""
516
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000517import re
518import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000519import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000520
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000521from test import support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000522
523class SyntaxTestCase(unittest.TestCase):
524
525 def _check_error(self, code, errtext,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000526 filename="<testcase>", mode="exec", subclass=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000527 """Check that compiling code raises SyntaxError with errtext.
528
529 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000530 test of the exception raised. If subclass is specified it
531 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000532 """
533 try:
534 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000535 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000536 if subclass and not isinstance(err, subclass):
537 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000538 mo = re.search(errtext, str(err))
539 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000540 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000541 else:
542 self.fail("compile() did not raise SyntaxError")
543
544 def test_assign_call(self):
545 self._check_error("f() = 1", "assign")
546
547 def test_assign_del(self):
548 self._check_error("del f()", "delete")
549
Jeremy Hylton42d90162003-07-15 20:24:27 +0000550 def test_global_err_then_warn(self):
551 # Bug tickler: The SyntaxError raised for one global statement
552 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
Amaury Forgeot d'Arcfe7b4052010-09-10 19:47:43 +0000553 source = """if 1:
554 def error(a):
555 global a # SyntaxError
556 def warning():
557 b = 1
558 global b # SyntaxWarning
559 """
Jeremy Hylton42d90162003-07-15 20:24:27 +0000560 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
561 self._check_error(source, "global")
562 warnings.filters.pop(0)
563
Neal Norwitzfcf44352005-11-27 20:37:43 +0000564 def test_break_outside_loop(self):
565 self._check_error("break", "outside loop")
566
Thomas Wouters477c8d52006-05-27 19:21:47 +0000567 def test_unexpected_indent(self):
568 self._check_error("foo()\n bar()\n", "unexpected indent",
569 subclass=IndentationError)
570
571 def test_no_indent(self):
572 self._check_error("if 1:\nfoo()", "expected an indented block",
573 subclass=IndentationError)
574
575 def test_bad_outdent(self):
576 self._check_error("if 1:\n foo()\n bar()",
577 "unindent does not match .* level",
578 subclass=IndentationError)
579
580 def test_kwargs_last(self):
581 self._check_error("int(base=10, '2')", "non-keyword arg")
582
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000583def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000584 support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000585 from test import test_syntax
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000586 support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000587
588if __name__ == "__main__":
589 test_main()