blob: 521789f34641b045ad22f642f9d4152d5ac7b591 [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):
8SyntaxError: name 'x' is local and global
9
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
30TODO(jhylton): "assignment to None" is inconsistent with other messages
31
32>>> obj.None = 1
33Traceback (most recent call last):
34SyntaxError: assignment to None (<doctest test.test_syntax[1]>, line 1)
35
36>>> None = 1
37Traceback (most recent call last):
38SyntaxError: assignment to None (<doctest test.test_syntax[2]>, line 1)
39
40It's a syntax error to assign to the empty tuple. Why isn't it an
41error to assign to the empty list? It will always raise some error at
42runtime.
43
44>>> () = 1
45Traceback (most recent call last):
46SyntaxError: can't assign to () (<doctest test.test_syntax[3]>, line 1)
47
48>>> f() = 1
49Traceback (most recent call last):
50SyntaxError: can't assign to function call (<doctest test.test_syntax[4]>, line 1)
51
52>>> del f()
53Traceback (most recent call last):
54SyntaxError: can't delete function call (<doctest test.test_syntax[5]>, line 1)
55
56>>> a + 1 = 2
57Traceback (most recent call last):
58SyntaxError: can't assign to operator (<doctest test.test_syntax[6]>, line 1)
59
60>>> (x for x in x) = 1
61Traceback (most recent call last):
62SyntaxError: can't assign to generator expression (<doctest test.test_syntax[7]>, line 1)
63
64>>> 1 = 1
65Traceback (most recent call last):
66SyntaxError: can't assign to literal (<doctest test.test_syntax[8]>, line 1)
67
68>>> "abc" = 1
69Traceback (most recent call last):
70SyntaxError: can't assign to literal (<doctest test.test_syntax[9]>, line 1)
71
72>>> `1` = 1
73Traceback (most recent call last):
74SyntaxError: can't assign to repr (<doctest test.test_syntax[10]>, line 1)
75
76If the left-hand side of an assignment is a list or tuple, an illegal
77expression inside that contain should still cause a syntax error.
78This test just checks a couple of cases rather than enumerating all of
79them.
80
81>>> (a, "b", c) = (1, 2, 3)
82Traceback (most recent call last):
83SyntaxError: can't assign to literal (<doctest test.test_syntax[11]>, line 1)
84
85>>> [a, b, c + 1] = [1, 2, 3]
86Traceback (most recent call last):
87SyntaxError: can't assign to operator (<doctest test.test_syntax[12]>, line 1)
88
Neal Norwitz373f0a72006-05-15 07:04:36 +000089>>> a if 1 else b = 1
90Traceback (most recent call last):
91SyntaxError: can't assign to conditional expression (<doctest test.test_syntax[13]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +000092
93From compiler_complex_args():
94
95>>> def f(None=1):
96... pass
97Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +000098SyntaxError: assignment to None (<doctest test.test_syntax[14]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +000099
100
101From ast_for_arguments():
102
103>>> def f(x, y=1, z):
104... pass
105Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000106SyntaxError: non-default argument follows default argument (<doctest test.test_syntax[15]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000107
108>>> def f(x, None):
109... pass
110Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000111SyntaxError: assignment to None (<doctest test.test_syntax[16]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000112
113>>> def f(*None):
114... pass
115Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000116SyntaxError: assignment to None (<doctest test.test_syntax[17]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000117
118>>> def f(**None):
119... pass
120Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000121SyntaxError: assignment to None (<doctest test.test_syntax[18]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000122
123
124From ast_for_funcdef():
125
126>>> def None(x):
127... pass
128Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000129SyntaxError: assignment to None (<doctest test.test_syntax[19]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000130
131
132From ast_for_call():
133
134>>> def f(it, *varargs):
135... return list(it)
136>>> L = range(10)
137>>> f(x for x in L)
138[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
139>>> f(x for x in L, 1)
140Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000141SyntaxError: Generator expression must be parenthesized if not sole argument (<doctest test.test_syntax[23]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000142>>> f((x for x in L), 1)
143[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
144
145>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
146... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
147... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
148... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
149... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
150... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
151... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
152... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
153... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
154... i100, i101, i102, i103, i104, i105, i106, i107, i108,
155... i109, i110, i111, i112, i113, i114, i115, i116, i117,
156... i118, i119, i120, i121, i122, i123, i124, i125, i126,
157... i127, i128, i129, i130, i131, i132, i133, i134, i135,
158... i136, i137, i138, i139, i140, i141, i142, i143, i144,
159... i145, i146, i147, i148, i149, i150, i151, i152, i153,
160... i154, i155, i156, i157, i158, i159, i160, i161, i162,
161... i163, i164, i165, i166, i167, i168, i169, i170, i171,
162... i172, i173, i174, i175, i176, i177, i178, i179, i180,
163... i181, i182, i183, i184, i185, i186, i187, i188, i189,
164... i190, i191, i192, i193, i194, i195, i196, i197, i198,
165... i199, i200, i201, i202, i203, i204, i205, i206, i207,
166... i208, i209, i210, i211, i212, i213, i214, i215, i216,
167... i217, i218, i219, i220, i221, i222, i223, i224, i225,
168... i226, i227, i228, i229, i230, i231, i232, i233, i234,
169... i235, i236, i237, i238, i239, i240, i241, i242, i243,
170... i244, i245, i246, i247, i248, i249, i250, i251, i252,
171... i253, i254, i255)
172Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000173SyntaxError: more than 255 arguments (<doctest test.test_syntax[25]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000174
175The actual error cases counts positional arguments, keyword arguments,
176and generator expression arguments separately. This test combines the
177three.
178
179>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
180... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
181... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
182... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
183... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
184... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
185... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
186... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
187... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
188... i100, i101, i102, i103, i104, i105, i106, i107, i108,
189... i109, i110, i111, i112, i113, i114, i115, i116, i117,
190... i118, i119, i120, i121, i122, i123, i124, i125, i126,
191... i127, i128, i129, i130, i131, i132, i133, i134, i135,
192... i136, i137, i138, i139, i140, i141, i142, i143, i144,
193... i145, i146, i147, i148, i149, i150, i151, i152, i153,
194... i154, i155, i156, i157, i158, i159, i160, i161, i162,
195... i163, i164, i165, i166, i167, i168, i169, i170, i171,
196... i172, i173, i174, i175, i176, i177, i178, i179, i180,
197... i181, i182, i183, i184, i185, i186, i187, i188, i189,
198... i190, i191, i192, i193, i194, i195, i196, i197, i198,
199... i199, i200, i201, i202, i203, i204, i205, i206, i207,
200... i208, i209, i210, i211, i212, i213, i214, i215, i216,
201... i217, i218, i219, i220, i221, i222, i223, i224, i225,
202... i226, i227, i228, i229, i230, i231, i232, i233, i234,
203... i235, i236, i237, i238, i239, i240, i241, i242, i243,
204... (x for x in i244), i245, i246, i247, i248, i249, i250, i251,
205... i252=1, i253=1, i254=1, i255=1)
206Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000207SyntaxError: more than 255 arguments (<doctest test.test_syntax[26]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000208
209>>> f(lambda x: x[0] = 3)
210Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000211SyntaxError: lambda cannot contain assignment (<doctest test.test_syntax[27]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000212
213The grammar accepts any test (basically, any expression) in the
214keyword slot of a call site. Test a few different options.
215
216>>> f(x()=2)
217Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000218SyntaxError: keyword can't be an expression (<doctest test.test_syntax[28]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000219>>> f(a or b=1)
220Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000221SyntaxError: keyword can't be an expression (<doctest test.test_syntax[29]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000222>>> f(x.y=1)
223Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000224SyntaxError: keyword can't be an expression (<doctest test.test_syntax[30]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000225
226
227From ast_for_expr_stmt():
228
229>>> (x for x in x) += 1
230Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000231SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_syntax[31]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000232>>> None += 1
233Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000234SyntaxError: assignment to None (<doctest test.test_syntax[32]>, line 1)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000235>>> f() += 1
236Traceback (most recent call last):
Neal Norwitz373f0a72006-05-15 07:04:36 +0000237SyntaxError: illegal expression for augmented assignment (<doctest test.test_syntax[33]>, line 1)
Georg Brandl74284b92006-10-08 07:06:29 +0000238
239
240Test continue in finally in weird combinations.
241
242continue in for loop under finally shouuld be ok.
243
244 >>> def test():
245 ... try:
246 ... pass
247 ... finally:
248 ... for abc in range(10):
249 ... continue
250 ... print abc
251 >>> test()
252 9
253
254Start simple, a continue in a finally should not be allowed.
255
256 >>> def test():
257 ... for abc in range(10):
258 ... try:
259 ... pass
260 ... finally:
261 ... continue
262 ...
263 Traceback (most recent call last):
264 ...
265 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[36]>, line 6)
266
267This is essentially a continue in a finally which should not be allowed.
268
269 >>> def test():
270 ... for abc in range(10):
271 ... try:
272 ... pass
273 ... finally:
274 ... try:
275 ... continue
276 ... except:
277 ... pass
278 Traceback (most recent call last):
279 ...
280 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[37]>, line 7)
281
282 >>> def foo():
283 ... try:
284 ... pass
285 ... finally:
286 ... continue
287 Traceback (most recent call last):
288 ...
289 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[38]>, line 5)
290
291 >>> def foo():
292 ... for a in ():
293 ... try: pass
294 ... finally: continue
295 Traceback (most recent call last):
296 ...
297 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[39]>, line 4)
298
299 >>> def foo():
300 ... for a in ():
301 ... try: pass
302 ... finally:
303 ... try:
304 ... continue
305 ... finally: pass
306 Traceback (most recent call last):
307 ...
308 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[40]>, line 6)
309
310 >>> def foo():
311 ... for a in ():
312 ... try: pass
313 ... finally:
314 ... try:
315 ... pass
316 ... except:
317 ... continue
318 Traceback (most recent call last):
319 ...
320 SyntaxError: 'continue' not supported inside 'finally' clause (<doctest test.test_syntax[41]>, line 8)
321
Georg Brandla5fe3ef2006-10-08 07:12:23 +0000322There is one test for a break that is not in a loop. The compiler
323uses a single data structure to keep track of try-finally and loops,
324so we need to be sure that a break is actually inside a loop. If it
325isn't, there should be a syntax error.
326
327 >>> try:
328 ... print 1
329 ... break
330 ... print 2
331 ... finally:
332 ... print 3
333 Traceback (most recent call last):
334 ...
335 SyntaxError: 'break' outside loop (<doctest test.test_syntax[42]>, line 3)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000336"""
337
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000338import re
339import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000340import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000341
Barry Warsaw04f357c2002-07-23 19:04:11 +0000342from test import test_support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000343
344class SyntaxTestCase(unittest.TestCase):
345
346 def _check_error(self, code, errtext,
Martin v. Löwis77736712006-05-04 05:51:03 +0000347 filename="<testcase>", mode="exec", subclass=None):
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000348 """Check that compiling code raises SyntaxError with errtext.
349
350 errtest is a regular expression that must be present in the
Martin v. Löwis77736712006-05-04 05:51:03 +0000351 test of the exception raised. If subclass is specified it
352 is the expected subclass of SyntaxError (e.g. IndentationError).
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000353 """
354 try:
355 compile(code, filename, mode)
356 except SyntaxError, err:
Martin v. Löwis77736712006-05-04 05:51:03 +0000357 if subclass and not isinstance(err, subclass):
358 self.fail("SyntaxError is not a %s" % subclass.__name__)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000359 mo = re.search(errtext, str(err))
360 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000361 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000362 else:
363 self.fail("compile() did not raise SyntaxError")
364
365 def test_assign_call(self):
366 self._check_error("f() = 1", "assign")
367
368 def test_assign_del(self):
369 self._check_error("del f()", "delete")
370
Jeremy Hylton42d90162003-07-15 20:24:27 +0000371 def test_global_err_then_warn(self):
372 # Bug tickler: The SyntaxError raised for one global statement
373 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
374 source = re.sub('(?m)^ *:', '', """\
375 :def error(a):
376 : global a # SyntaxError
377 :def warning():
378 : b = 1
379 : global b # SyntaxWarning
380 :""")
381 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
382 self._check_error(source, "global")
383 warnings.filters.pop(0)
384
Neal Norwitzfcf44352005-11-27 20:37:43 +0000385 def test_break_outside_loop(self):
386 self._check_error("break", "outside loop")
387
388 def test_delete_deref(self):
389 source = re.sub('(?m)^ *:', '', """\
390 :def foo(x):
391 : def bar():
392 : print x
393 : del x
394 :""")
395 self._check_error(source, "nested scope")
396
Martin v. Löwis77736712006-05-04 05:51:03 +0000397 def test_unexpected_indent(self):
398 self._check_error("foo()\n bar()\n", "unexpected indent",
399 subclass=IndentationError)
400
401 def test_no_indent(self):
402 self._check_error("if 1:\nfoo()", "expected an indented block",
403 subclass=IndentationError)
404
405 def test_bad_outdent(self):
406 self._check_error("if 1:\n foo()\n bar()",
407 "unindent does not match .* level",
408 subclass=IndentationError)
409
Neal Norwitz5ef92242006-05-19 06:43:50 +0000410 def test_kwargs_last(self):
411 self._check_error("int(base=10, '2')", "non-keyword arg")
412
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000413def test_main():
414 test_support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000415 from test import test_syntax
416 test_support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000417
418if __name__ == "__main__":
419 test_main()