blob: b61debfcb07f39c71af2f7d3c53636d64701255a [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
89
90From compiler_complex_args():
91
92>>> def f(None=1):
93... pass
94Traceback (most recent call last):
95SyntaxError: assignment to None (<doctest test.test_syntax[13]>, line 1)
96
97
98From ast_for_arguments():
99
100>>> def f(x, y=1, z):
101... pass
102Traceback (most recent call last):
103SyntaxError: non-default argument follows default argument (<doctest test.test_syntax[14]>, line 1)
104
105>>> def f(x, None):
106... pass
107Traceback (most recent call last):
108SyntaxError: assignment to None (<doctest test.test_syntax[15]>, line 1)
109
110>>> def f(*None):
111... pass
112Traceback (most recent call last):
113SyntaxError: assignment to None (<doctest test.test_syntax[16]>, line 1)
114
115>>> def f(**None):
116... pass
117Traceback (most recent call last):
118SyntaxError: assignment to None (<doctest test.test_syntax[17]>, line 1)
119
120
121From ast_for_funcdef():
122
123>>> def None(x):
124... pass
125Traceback (most recent call last):
126SyntaxError: assignment to None (<doctest test.test_syntax[18]>, line 1)
127
128
129From ast_for_call():
130
131>>> def f(it, *varargs):
132... return list(it)
133>>> L = range(10)
134>>> f(x for x in L)
135[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
136>>> f(x for x in L, 1)
137Traceback (most recent call last):
138SyntaxError: Generator expression must be parenthesized if not sole argument (<doctest test.test_syntax[22]>, line 1)
139>>> f((x for x in L), 1)
140[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
141
142>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
143... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
144... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
145... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
146... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
147... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
148... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
149... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
150... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
151... i100, i101, i102, i103, i104, i105, i106, i107, i108,
152... i109, i110, i111, i112, i113, i114, i115, i116, i117,
153... i118, i119, i120, i121, i122, i123, i124, i125, i126,
154... i127, i128, i129, i130, i131, i132, i133, i134, i135,
155... i136, i137, i138, i139, i140, i141, i142, i143, i144,
156... i145, i146, i147, i148, i149, i150, i151, i152, i153,
157... i154, i155, i156, i157, i158, i159, i160, i161, i162,
158... i163, i164, i165, i166, i167, i168, i169, i170, i171,
159... i172, i173, i174, i175, i176, i177, i178, i179, i180,
160... i181, i182, i183, i184, i185, i186, i187, i188, i189,
161... i190, i191, i192, i193, i194, i195, i196, i197, i198,
162... i199, i200, i201, i202, i203, i204, i205, i206, i207,
163... i208, i209, i210, i211, i212, i213, i214, i215, i216,
164... i217, i218, i219, i220, i221, i222, i223, i224, i225,
165... i226, i227, i228, i229, i230, i231, i232, i233, i234,
166... i235, i236, i237, i238, i239, i240, i241, i242, i243,
167... i244, i245, i246, i247, i248, i249, i250, i251, i252,
168... i253, i254, i255)
169Traceback (most recent call last):
170SyntaxError: more than 255 arguments (<doctest test.test_syntax[24]>, line 1)
171
172The actual error cases counts positional arguments, keyword arguments,
173and generator expression arguments separately. This test combines the
174three.
175
176>>> f(i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11,
177... i12, i13, i14, i15, i16, i17, i18, i19, i20, i21, i22,
178... i23, i24, i25, i26, i27, i28, i29, i30, i31, i32, i33,
179... i34, i35, i36, i37, i38, i39, i40, i41, i42, i43, i44,
180... i45, i46, i47, i48, i49, i50, i51, i52, i53, i54, i55,
181... i56, i57, i58, i59, i60, i61, i62, i63, i64, i65, i66,
182... i67, i68, i69, i70, i71, i72, i73, i74, i75, i76, i77,
183... i78, i79, i80, i81, i82, i83, i84, i85, i86, i87, i88,
184... i89, i90, i91, i92, i93, i94, i95, i96, i97, i98, i99,
185... i100, i101, i102, i103, i104, i105, i106, i107, i108,
186... i109, i110, i111, i112, i113, i114, i115, i116, i117,
187... i118, i119, i120, i121, i122, i123, i124, i125, i126,
188... i127, i128, i129, i130, i131, i132, i133, i134, i135,
189... i136, i137, i138, i139, i140, i141, i142, i143, i144,
190... i145, i146, i147, i148, i149, i150, i151, i152, i153,
191... i154, i155, i156, i157, i158, i159, i160, i161, i162,
192... i163, i164, i165, i166, i167, i168, i169, i170, i171,
193... i172, i173, i174, i175, i176, i177, i178, i179, i180,
194... i181, i182, i183, i184, i185, i186, i187, i188, i189,
195... i190, i191, i192, i193, i194, i195, i196, i197, i198,
196... i199, i200, i201, i202, i203, i204, i205, i206, i207,
197... i208, i209, i210, i211, i212, i213, i214, i215, i216,
198... i217, i218, i219, i220, i221, i222, i223, i224, i225,
199... i226, i227, i228, i229, i230, i231, i232, i233, i234,
200... i235, i236, i237, i238, i239, i240, i241, i242, i243,
201... (x for x in i244), i245, i246, i247, i248, i249, i250, i251,
202... i252=1, i253=1, i254=1, i255=1)
203Traceback (most recent call last):
204SyntaxError: more than 255 arguments (<doctest test.test_syntax[25]>, line 1)
205
206>>> f(lambda x: x[0] = 3)
207Traceback (most recent call last):
208SyntaxError: lambda cannot contain assignment (<doctest test.test_syntax[26]>, line 1)
209
210The grammar accepts any test (basically, any expression) in the
211keyword slot of a call site. Test a few different options.
212
213>>> f(x()=2)
214Traceback (most recent call last):
215SyntaxError: keyword can't be an expression (<doctest test.test_syntax[27]>, line 1)
216>>> f(a or b=1)
217Traceback (most recent call last):
218SyntaxError: keyword can't be an expression (<doctest test.test_syntax[28]>, line 1)
219>>> f(x.y=1)
220Traceback (most recent call last):
221SyntaxError: keyword can't be an expression (<doctest test.test_syntax[29]>, line 1)
222
223
224From ast_for_expr_stmt():
225
226>>> (x for x in x) += 1
227Traceback (most recent call last):
228SyntaxError: augmented assignment to generator expression not possible (<doctest test.test_syntax[30]>, line 1)
229>>> None += 1
230Traceback (most recent call last):
231SyntaxError: assignment to None (<doctest test.test_syntax[31]>, line 1)
232>>> f() += 1
233Traceback (most recent call last):
234SyntaxError: illegal expression for augmented assignment (<doctest test.test_syntax[32]>, line 1)
235"""
236
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000237import re
238import unittest
Jeremy Hylton42d90162003-07-15 20:24:27 +0000239import warnings
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000240
Barry Warsaw04f357c2002-07-23 19:04:11 +0000241from test import test_support
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000242
243class SyntaxTestCase(unittest.TestCase):
244
245 def _check_error(self, code, errtext,
246 filename="<testcase>", mode="exec"):
247 """Check that compiling code raises SyntaxError with errtext.
248
249 errtest is a regular expression that must be present in the
250 test of the exception raised.
251 """
252 try:
253 compile(code, filename, mode)
254 except SyntaxError, err:
255 mo = re.search(errtext, str(err))
256 if mo is None:
Walter Dörwald70a6b492004-02-12 17:35:32 +0000257 self.fail("SyntaxError did not contain '%r'" % (errtext,))
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000258 else:
259 self.fail("compile() did not raise SyntaxError")
260
261 def test_assign_call(self):
262 self._check_error("f() = 1", "assign")
263
264 def test_assign_del(self):
265 self._check_error("del f()", "delete")
266
Jeremy Hylton42d90162003-07-15 20:24:27 +0000267 def test_global_err_then_warn(self):
268 # Bug tickler: The SyntaxError raised for one global statement
269 # shouldn't be clobbered by a SyntaxWarning issued for a later one.
270 source = re.sub('(?m)^ *:', '', """\
271 :def error(a):
272 : global a # SyntaxError
273 :def warning():
274 : b = 1
275 : global b # SyntaxWarning
276 :""")
277 warnings.filterwarnings(action='ignore', category=SyntaxWarning)
278 self._check_error(source, "global")
279 warnings.filters.pop(0)
280
Neal Norwitzfcf44352005-11-27 20:37:43 +0000281 def test_break_outside_loop(self):
282 self._check_error("break", "outside loop")
283
284 def test_delete_deref(self):
285 source = re.sub('(?m)^ *:', '', """\
286 :def foo(x):
287 : def bar():
288 : print x
289 : del x
290 :""")
291 self._check_error(source, "nested scope")
292
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000293def test_main():
294 test_support.run_unittest(SyntaxTestCase)
Jeremy Hyltonc960f262006-01-27 15:18:39 +0000295 from test import test_syntax
296 test_support.run_doctest(test_syntax, verbosity=True)
Jeremy Hylton05ab2e62002-05-31 14:08:29 +0000297
298if __name__ == "__main__":
299 test_main()