blob: 4297d22c3c356f49866753e776f2febaba886247 [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
225From ast_for_expr_stmt():
226
227>>> (x for x in x) += 1
228Traceback (most recent call last):
Guido van Rossum33d26892007-08-05 15:29:28 +0000229SyntaxError: augmented assignment to generator expression not possible
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):
Guido van Rossum33d26892007-08-05 15:29:28 +0000235SyntaxError: illegal expression for augmented assignment
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
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000463"""
464
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000465import re
466import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000467import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000468
Barry Warsaw04f357c2002-07-23 19:04:11 +0000469from test import test_support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000470
471class SyntaxTestCase(unittest.TestCase):
472
473 def _check_error(self, code, errtext,
Thomas Wouters477c8d52006-05-27 19:21:47 +0000474 filename="<testcase>", mode="exec", subclass=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000475 """Check that compiling code raises SyntaxError with errtext.
476
477 errtest is a regular expression that must be present in the
Thomas Wouters477c8d52006-05-27 19:21:47 +0000478 test of the exception raised. If subclass is specified it
479 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000480 """
481 try:
482 compile(code, filename, mode)
Guido van Rossumb940e112007-01-10 16:19:56 +0000483 except SyntaxError as err:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000484 if subclass and not isinstance(err, subclass):
485 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000486 mo = re.search(errtext, str(err))
487 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000488 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000489 else:
490 self.fail("compile() did not raise SyntaxError")
491
492 def test_assign_call(self):
493 self._check_error("f() = 1", "assign")
494
495 def test_assign_del(self):
496 self._check_error("del f()", "delete")
497
Jeremy Hylton42d90162003-07-15 20:24:27 +0000498 def test_global_err_then_warn(self):
499 # Bug tickler: The SyntaxError raised for one global statement
500 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
501 source = re.sub('(?m)^ *:', '', """\
502 :def error(a):
503 : global a # SyntaxError
504 :def warning():
505 : b = 1
506 : global b # SyntaxWarning
507 :""")
508 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
509 self._check_error(source, "global")
510 warnings.filters.pop(0)
511
Neal Norwitzfcf44352005-11-27 20:37:43 +0000512 def test_break_outside_loop(self):
513 self._check_error("break", "outside loop")
514
515 def test_delete_deref(self):
516 source = re.sub('(?m)^ *:', '', """\
517 :def foo(x):
518 : def bar():
Georg Brandl88fc6642007-02-09 21:28:07 +0000519 : print(x)
Neal Norwitzfcf44352005-11-27 20:37:43 +0000520 : del x
521 :""")
522 self._check_error(source, "nested scope")
523
Thomas Wouters477c8d52006-05-27 19:21:47 +0000524 def test_unexpected_indent(self):
525 self._check_error("foo()\n bar()\n", "unexpected indent",
526 subclass=IndentationError)
527
528 def test_no_indent(self):
529 self._check_error("if 1:\nfoo()", "expected an indented block",
530 subclass=IndentationError)
531
532 def test_bad_outdent(self):
533 self._check_error("if 1:\n foo()\n bar()",
534 "unindent does not match .* level",
535 subclass=IndentationError)
536
537 def test_kwargs_last(self):
538 self._check_error("int(base=10, '2')", "non-keyword arg")
539
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000540def test_main():
541 test_support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000542 from test import test_syntax
543 test_support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000544
545if __name__ == "__main__":
546 test_main()