blob: b6f81fbf38e030559c19b1c7a5e58f34056f9cab [file] [log] [blame]
Fred Drake79ca79d2000-08-21 22:30:53 +00001import parser
Fred Drake58422e52001-06-04 03:56:24 +00002import unittest
Christian Heimesb186d002008-03-18 15:15:01 +00003import sys
Mark Dickinson211c6252009-02-01 10:28:51 +00004import operator
Benjamin Petersonee8712c2008-05-20 21:35:26 +00005from test import support
Fred Drake79ca79d2000-08-21 22:30:53 +00006
7#
8# First, we test that we can generate trees from valid source fragments,
9# and that these valid trees are indeed allowed by the tree-loading side
10# of the parser module.
11#
12
Fred Drake58422e52001-06-04 03:56:24 +000013class RoundtripLegalSyntaxTestCase(unittest.TestCase):
Guido van Rossum32c2ae72002-08-22 19:45:32 +000014
Fred Drake58422e52001-06-04 03:56:24 +000015 def roundtrip(self, f, s):
16 st1 = f(s)
17 t = st1.totuple()
18 try:
Fred Drake6e4f2c02001-07-17 19:33:25 +000019 st2 = parser.sequence2st(t)
Guido van Rossumb940e112007-01-10 16:19:56 +000020 except parser.ParserError as why:
Anthony Baxterc2a5a632004-08-02 06:10:11 +000021 self.fail("could not roundtrip %r: %s" % (s, why))
Fred Drake79ca79d2000-08-21 22:30:53 +000022
Ezio Melottib3aedd42010-11-20 19:04:17 +000023 self.assertEqual(t, st2.totuple(),
24 "could not re-generate syntax tree")
Fred Drake28f739a2000-08-25 22:42:40 +000025
Fred Drake58422e52001-06-04 03:56:24 +000026 def check_expr(self, s):
27 self.roundtrip(parser.expr, s)
Fred Drake28f739a2000-08-25 22:42:40 +000028
Benjamin Petersonf216c942008-10-31 02:28:05 +000029 def test_flags_passed(self):
30 # The unicode literals flags has to be passed from the paser to AST
31 # generation.
32 suite = parser.suite("from __future__ import unicode_literals; x = ''")
33 code = suite.compile()
34 scope = {}
35 exec(code, {}, scope)
Ezio Melottie9615932010-01-24 19:26:24 +000036 self.assertIsInstance(scope["x"], str)
Benjamin Petersonf216c942008-10-31 02:28:05 +000037
Fred Drake58422e52001-06-04 03:56:24 +000038 def check_suite(self, s):
39 self.roundtrip(parser.suite, s)
Fred Drake28f739a2000-08-25 22:42:40 +000040
Fred Drakecf580c72001-07-17 03:01:29 +000041 def test_yield_statement(self):
Tim Peters496563a2002-04-01 00:28:59 +000042 self.check_suite("def f(): yield 1")
Phillip J. Eby0d6615f2005-08-02 00:46:46 +000043 self.check_suite("def f(): yield")
44 self.check_suite("def f(): x += yield")
45 self.check_suite("def f(): x = yield 1")
46 self.check_suite("def f(): x = y = yield 1")
47 self.check_suite("def f(): x = yield")
48 self.check_suite("def f(): x = y = yield")
49 self.check_suite("def f(): 1 + (yield)*2")
50 self.check_suite("def f(): (yield 1)*2")
Tim Peters496563a2002-04-01 00:28:59 +000051 self.check_suite("def f(): return; yield 1")
52 self.check_suite("def f(): yield 1; return")
Nick Coghlan1f7ce622012-01-13 21:43:40 +100053 self.check_suite("def f(): yield from 1")
54 self.check_suite("def f(): x = yield from 1")
55 self.check_suite("def f(): f((yield from 1))")
56 self.check_suite("def f(): yield 1; return 1")
Tim Peters496563a2002-04-01 00:28:59 +000057 self.check_suite("def f():\n"
Fred Drakecf580c72001-07-17 03:01:29 +000058 " for x in range(30):\n"
59 " yield x\n")
Phillip J. Eby0d6615f2005-08-02 00:46:46 +000060 self.check_suite("def f():\n"
61 " if (yield):\n"
62 " yield x\n")
Fred Drakecf580c72001-07-17 03:01:29 +000063
Fred Drake58422e52001-06-04 03:56:24 +000064 def test_expressions(self):
65 self.check_expr("foo(1)")
66 self.check_expr("[1, 2, 3]")
67 self.check_expr("[x**3 for x in range(20)]")
68 self.check_expr("[x**3 for x in range(20) if x % 3]")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000069 self.check_expr("[x**3 for x in range(20) if x % 2 if x % 3]")
70 self.check_expr("list(x**3 for x in range(20))")
71 self.check_expr("list(x**3 for x in range(20) if x % 3)")
72 self.check_expr("list(x**3 for x in range(20) if x % 2 if x % 3)")
Fred Drake58422e52001-06-04 03:56:24 +000073 self.check_expr("foo(*args)")
74 self.check_expr("foo(*args, **kw)")
75 self.check_expr("foo(**kw)")
76 self.check_expr("foo(key=value)")
77 self.check_expr("foo(key=value, *args)")
78 self.check_expr("foo(key=value, *args, **kw)")
79 self.check_expr("foo(key=value, **kw)")
80 self.check_expr("foo(a, b, c, *args)")
81 self.check_expr("foo(a, b, c, *args, **kw)")
82 self.check_expr("foo(a, b, c, **kw)")
Benjamin Peterson3938a902008-08-20 02:33:00 +000083 self.check_expr("foo(a, *args, keyword=23)")
Fred Drake58422e52001-06-04 03:56:24 +000084 self.check_expr("foo + bar")
Michael W. Hudson5e83b7a2003-01-29 14:20:23 +000085 self.check_expr("foo - bar")
86 self.check_expr("foo * bar")
87 self.check_expr("foo / bar")
88 self.check_expr("foo // bar")
Fred Drake58422e52001-06-04 03:56:24 +000089 self.check_expr("lambda: 0")
90 self.check_expr("lambda x: 0")
91 self.check_expr("lambda *y: 0")
92 self.check_expr("lambda *y, **z: 0")
93 self.check_expr("lambda **z: 0")
94 self.check_expr("lambda x, y: 0")
95 self.check_expr("lambda foo=bar: 0")
96 self.check_expr("lambda foo=bar, spaz=nifty+spit: 0")
97 self.check_expr("lambda foo=bar, **z: 0")
98 self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0")
99 self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
100 self.check_expr("lambda x, *y, **z: 0")
Raymond Hettinger354433a2004-05-19 08:20:33 +0000101 self.check_expr("(x for x in range(10))")
102 self.check_expr("foo(x for x in range(10))")
Fred Drake79ca79d2000-08-21 22:30:53 +0000103
Fred Drake58422e52001-06-04 03:56:24 +0000104 def test_simple_expression(self):
105 # expr_stmt
106 self.check_suite("a")
Fred Drake79ca79d2000-08-21 22:30:53 +0000107
Fred Drake58422e52001-06-04 03:56:24 +0000108 def test_simple_assignments(self):
109 self.check_suite("a = b")
110 self.check_suite("a = b = c = d = e")
Fred Drake28f739a2000-08-25 22:42:40 +0000111
Fred Drake58422e52001-06-04 03:56:24 +0000112 def test_simple_augmented_assignments(self):
113 self.check_suite("a += b")
114 self.check_suite("a -= b")
115 self.check_suite("a *= b")
116 self.check_suite("a /= b")
Michael W. Hudson5e83b7a2003-01-29 14:20:23 +0000117 self.check_suite("a //= b")
Fred Drake58422e52001-06-04 03:56:24 +0000118 self.check_suite("a %= b")
119 self.check_suite("a &= b")
120 self.check_suite("a |= b")
121 self.check_suite("a ^= b")
122 self.check_suite("a <<= b")
123 self.check_suite("a >>= b")
124 self.check_suite("a **= b")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000125
Fred Drake58422e52001-06-04 03:56:24 +0000126 def test_function_defs(self):
127 self.check_suite("def f(): pass")
128 self.check_suite("def f(*args): pass")
129 self.check_suite("def f(*args, **kw): pass")
130 self.check_suite("def f(**kw): pass")
131 self.check_suite("def f(foo=bar): pass")
132 self.check_suite("def f(foo=bar, *args): pass")
133 self.check_suite("def f(foo=bar, *args, **kw): pass")
134 self.check_suite("def f(foo=bar, **kw): pass")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000135
Fred Drake58422e52001-06-04 03:56:24 +0000136 self.check_suite("def f(a, b): pass")
137 self.check_suite("def f(a, b, *args): pass")
138 self.check_suite("def f(a, b, *args, **kw): pass")
139 self.check_suite("def f(a, b, **kw): pass")
140 self.check_suite("def f(a, b, foo=bar): pass")
141 self.check_suite("def f(a, b, foo=bar, *args): pass")
142 self.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
143 self.check_suite("def f(a, b, foo=bar, **kw): pass")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000144
Anthony Baxterc2a5a632004-08-02 06:10:11 +0000145 self.check_suite("@staticmethod\n"
146 "def f(): pass")
147 self.check_suite("@staticmethod\n"
148 "@funcattrs(x, y)\n"
149 "def f(): pass")
150 self.check_suite("@funcattrs()\n"
151 "def f(): pass")
152
Brett Cannonf4189912005-04-09 02:30:16 +0000153 def test_class_defs(self):
154 self.check_suite("class foo():pass")
Guido van Rossumfc158e22007-11-15 19:17:28 +0000155 self.check_suite("class foo(object):pass")
Mark Dickinson2bd61a92010-07-04 16:37:31 +0000156 self.check_suite("@class_decorator\n"
157 "class foo():pass")
158 self.check_suite("@class_decorator(arg)\n"
159 "class foo():pass")
160 self.check_suite("@decorator1\n"
161 "@decorator2\n"
162 "class foo():pass")
Tim Peterse8906822005-04-20 17:45:13 +0000163
Fred Drake58422e52001-06-04 03:56:24 +0000164 def test_import_from_statement(self):
165 self.check_suite("from sys.path import *")
166 self.check_suite("from sys.path import dirname")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000167 self.check_suite("from sys.path import (dirname)")
168 self.check_suite("from sys.path import (dirname,)")
Fred Drake58422e52001-06-04 03:56:24 +0000169 self.check_suite("from sys.path import dirname as my_dirname")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000170 self.check_suite("from sys.path import (dirname as my_dirname)")
171 self.check_suite("from sys.path import (dirname as my_dirname,)")
Fred Drake58422e52001-06-04 03:56:24 +0000172 self.check_suite("from sys.path import dirname, basename")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000173 self.check_suite("from sys.path import (dirname, basename)")
174 self.check_suite("from sys.path import (dirname, basename,)")
Fred Drake58422e52001-06-04 03:56:24 +0000175 self.check_suite(
176 "from sys.path import dirname as my_dirname, basename")
177 self.check_suite(
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000178 "from sys.path import (dirname as my_dirname, basename)")
179 self.check_suite(
180 "from sys.path import (dirname as my_dirname, basename,)")
181 self.check_suite(
Fred Drake58422e52001-06-04 03:56:24 +0000182 "from sys.path import dirname, basename as my_basename")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000183 self.check_suite(
184 "from sys.path import (dirname, basename as my_basename)")
185 self.check_suite(
186 "from sys.path import (dirname, basename as my_basename,)")
Benjamin Petersonc0747cf2008-11-03 20:31:38 +0000187 self.check_suite("from .bogus import x")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000188
Fred Drake58422e52001-06-04 03:56:24 +0000189 def test_basic_import_statement(self):
190 self.check_suite("import sys")
191 self.check_suite("import sys as system")
192 self.check_suite("import sys, math")
193 self.check_suite("import sys as system, math")
194 self.check_suite("import sys, math as my_math")
Fred Drake79ca79d2000-08-21 22:30:53 +0000195
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000196 def test_relative_imports(self):
197 self.check_suite("from . import name")
198 self.check_suite("from .. import name")
Mark Dickinsonfeb3b752010-07-04 18:38:57 +0000199 # check all the way up to '....', since '...' is tokenized
200 # differently from '.' (it's an ellipsis token).
201 self.check_suite("from ... import name")
202 self.check_suite("from .... import name")
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000203 self.check_suite("from .pkg import name")
204 self.check_suite("from ..pkg import name")
Mark Dickinsonfeb3b752010-07-04 18:38:57 +0000205 self.check_suite("from ...pkg import name")
206 self.check_suite("from ....pkg import name")
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000207
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000208 def test_pep263(self):
209 self.check_suite("# -*- coding: iso-8859-1 -*-\n"
210 "pass\n")
211
212 def test_assert(self):
213 self.check_suite("assert alo < ahi and blo < bhi\n")
214
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000215 def test_with(self):
216 self.check_suite("with open('x'): pass\n")
217 self.check_suite("with open('x') as f: pass\n")
Georg Brandl0c315622009-05-25 21:10:36 +0000218 self.check_suite("with open('x') as f, open('y') as g: pass\n")
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000219
Georg Brandleee31162008-12-07 15:15:22 +0000220 def test_try_stmt(self):
221 self.check_suite("try: pass\nexcept: pass\n")
222 self.check_suite("try: pass\nfinally: pass\n")
223 self.check_suite("try: pass\nexcept A: pass\nfinally: pass\n")
224 self.check_suite("try: pass\nexcept A: pass\nexcept: pass\n"
225 "finally: pass\n")
226 self.check_suite("try: pass\nexcept: pass\nelse: pass\n")
227 self.check_suite("try: pass\nexcept: pass\nelse: pass\n"
228 "finally: pass\n")
229
Thomas Wouters89f507f2006-12-13 04:49:30 +0000230 def test_position(self):
231 # An absolutely minimal test of position information. Better
232 # tests would be a big project.
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000233 code = "def f(x):\n return x + 1"
Thomas Wouters89f507f2006-12-13 04:49:30 +0000234 st1 = parser.suite(code)
235 st2 = st1.totuple(line_info=1, col_info=1)
236
237 def walk(tree):
238 node_type = tree[0]
239 next = tree[1]
240 if isinstance(next, tuple):
241 for elt in tree[1:]:
242 for x in walk(elt):
243 yield x
244 else:
245 yield tree
246
247 terminals = list(walk(st2))
248 self.assertEqual([
249 (1, 'def', 1, 0),
250 (1, 'f', 1, 4),
251 (7, '(', 1, 5),
252 (1, 'x', 1, 6),
253 (8, ')', 1, 7),
254 (11, ':', 1, 8),
255 (4, '', 1, 9),
256 (5, '', 2, -1),
257 (1, 'return', 2, 4),
258 (1, 'x', 2, 11),
259 (14, '+', 2, 13),
260 (2, '1', 2, 15),
261 (4, '', 2, 16),
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000262 (6, '', 2, -1),
263 (4, '', 2, -1),
264 (0, '', 2, -1)],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000265 terminals)
266
Benjamin Peterson4905e802009-09-27 02:43:28 +0000267 def test_extended_unpacking(self):
268 self.check_suite("*a = y")
269 self.check_suite("x, *b, = m")
270 self.check_suite("[*a, *b] = y")
271 self.check_suite("for [*x, b] in x: pass")
272
Thomas Wouters89f507f2006-12-13 04:49:30 +0000273
Fred Drake79ca79d2000-08-21 22:30:53 +0000274#
275# Second, we take *invalid* trees and make sure we get ParserError
276# rejections for them.
277#
278
Fred Drake58422e52001-06-04 03:56:24 +0000279class IllegalSyntaxTestCase(unittest.TestCase):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000280
Fred Drake58422e52001-06-04 03:56:24 +0000281 def check_bad_tree(self, tree, label):
282 try:
Fred Drake6e4f2c02001-07-17 19:33:25 +0000283 parser.sequence2st(tree)
Fred Drake58422e52001-06-04 03:56:24 +0000284 except parser.ParserError:
285 pass
286 else:
287 self.fail("did not detect invalid tree for %r" % label)
Fred Drake79ca79d2000-08-21 22:30:53 +0000288
Fred Drake58422e52001-06-04 03:56:24 +0000289 def test_junk(self):
290 # not even remotely valid:
291 self.check_bad_tree((1, 2, 3), "<junk>")
292
Fred Drakecf580c72001-07-17 03:01:29 +0000293 def test_illegal_yield_1(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000294 # Illegal yield statement: def f(): return 1; yield 1
Fred Drakecf580c72001-07-17 03:01:29 +0000295 tree = \
296 (257,
297 (264,
298 (285,
299 (259,
300 (1, 'def'),
301 (1, 'f'),
302 (260, (7, '('), (8, ')')),
303 (11, ':'),
304 (291,
305 (4, ''),
306 (5, ''),
307 (264,
308 (265,
309 (266,
310 (272,
311 (275,
312 (1, 'return'),
313 (313,
314 (292,
315 (293,
316 (294,
317 (295,
318 (297,
319 (298,
320 (299,
321 (300,
322 (301,
323 (302, (303, (304, (305, (2, '1')))))))))))))))))),
324 (264,
325 (265,
326 (266,
327 (272,
328 (276,
329 (1, 'yield'),
330 (313,
331 (292,
332 (293,
333 (294,
334 (295,
335 (297,
336 (298,
337 (299,
338 (300,
339 (301,
340 (302,
341 (303, (304, (305, (2, '1')))))))))))))))))),
342 (4, ''))),
343 (6, ''))))),
344 (4, ''),
345 (0, ''))))
346 self.check_bad_tree(tree, "def f():\n return 1\n yield 1")
347
348 def test_illegal_yield_2(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000349 # Illegal return in generator: def f(): return 1; yield 1
Fred Drakecf580c72001-07-17 03:01:29 +0000350 tree = \
351 (257,
352 (264,
353 (265,
354 (266,
355 (278,
356 (1, 'from'),
357 (281, (1, '__future__')),
358 (1, 'import'),
359 (279, (1, 'generators')))),
360 (4, ''))),
361 (264,
362 (285,
363 (259,
364 (1, 'def'),
365 (1, 'f'),
366 (260, (7, '('), (8, ')')),
367 (11, ':'),
368 (291,
369 (4, ''),
370 (5, ''),
371 (264,
372 (265,
373 (266,
374 (272,
375 (275,
376 (1, 'return'),
377 (313,
378 (292,
379 (293,
380 (294,
381 (295,
382 (297,
383 (298,
384 (299,
385 (300,
386 (301,
387 (302, (303, (304, (305, (2, '1')))))))))))))))))),
388 (264,
389 (265,
390 (266,
391 (272,
392 (276,
393 (1, 'yield'),
394 (313,
395 (292,
396 (293,
397 (294,
398 (295,
399 (297,
400 (298,
401 (299,
402 (300,
403 (301,
404 (302,
405 (303, (304, (305, (2, '1')))))))))))))))))),
406 (4, ''))),
407 (6, ''))))),
408 (4, ''),
409 (0, ''))))
410 self.check_bad_tree(tree, "def f():\n return 1\n yield 1")
411
Fred Drake58422e52001-06-04 03:56:24 +0000412 def test_a_comma_comma_c(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000413 # Illegal input: a,,c
Fred Drake58422e52001-06-04 03:56:24 +0000414 tree = \
415 (258,
416 (311,
417 (290,
418 (291,
419 (292,
420 (293,
421 (295,
422 (296,
423 (297,
424 (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
425 (12, ','),
426 (12, ','),
427 (290,
428 (291,
429 (292,
430 (293,
431 (295,
432 (296,
433 (297,
434 (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
435 (4, ''),
436 (0, ''))
437 self.check_bad_tree(tree, "a,,c")
438
439 def test_illegal_operator(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000440 # Illegal input: a $= b
Fred Drake58422e52001-06-04 03:56:24 +0000441 tree = \
442 (257,
443 (264,
444 (265,
445 (266,
446 (267,
447 (312,
448 (291,
449 (292,
450 (293,
451 (294,
452 (296,
453 (297,
454 (298,
455 (299,
456 (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
457 (268, (37, '$=')),
458 (312,
459 (291,
460 (292,
461 (293,
462 (294,
463 (296,
464 (297,
465 (298,
466 (299,
467 (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
468 (4, ''))),
469 (0, ''))
470 self.check_bad_tree(tree, "a $= b")
Fred Drake79ca79d2000-08-21 22:30:53 +0000471
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000472 def test_malformed_global(self):
473 #doesn't have global keyword in ast
474 tree = (257,
475 (264,
476 (265,
477 (266,
478 (282, (1, 'foo'))), (4, ''))),
479 (4, ''),
Tim Petersf2715e02003-02-19 02:35:07 +0000480 (0, ''))
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000481 self.check_bad_tree(tree, "malformed global ast")
Fred Drake79ca79d2000-08-21 22:30:53 +0000482
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000483 def test_missing_import_source(self):
Mark Dickinson3445b482010-07-04 18:15:26 +0000484 # from import fred
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000485 tree = \
486 (257,
Mark Dickinson3445b482010-07-04 18:15:26 +0000487 (268,
488 (269,
489 (270,
490 (282,
491 (284, (1, 'from'), (1, 'import'),
492 (287, (285, (1, 'fred')))))),
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000493 (4, ''))),
494 (4, ''), (0, ''))
Mark Dickinson3445b482010-07-04 18:15:26 +0000495 self.check_bad_tree(tree, "from import fred")
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000496
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000497
498class CompileTestCase(unittest.TestCase):
499
500 # These tests are very minimal. :-(
501
502 def test_compile_expr(self):
503 st = parser.expr('2 + 3')
504 code = parser.compilest(st)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000505 self.assertEqual(eval(code), 5)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000506
507 def test_compile_suite(self):
508 st = parser.suite('x = 2; y = x + 3')
509 code = parser.compilest(st)
510 globs = {}
Georg Brandl7cae87c2006-09-06 06:51:57 +0000511 exec(code, globs)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000512 self.assertEqual(globs['y'], 5)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000513
514 def test_compile_error(self):
515 st = parser.suite('1 = 3 + 4')
516 self.assertRaises(SyntaxError, parser.compilest, st)
517
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000518 def test_compile_badunicode(self):
Guido van Rossum7eb6ca52007-07-18 21:00:22 +0000519 st = parser.suite('a = "\\U12345678"')
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000520 self.assertRaises(SyntaxError, parser.compilest, st)
Guido van Rossum7eb6ca52007-07-18 21:00:22 +0000521 st = parser.suite('a = "\\u1"')
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000522 self.assertRaises(SyntaxError, parser.compilest, st)
523
Mark Dickinsond35a32e2010-06-17 12:33:22 +0000524 def test_issue_9011(self):
525 # Issue 9011: compilation of an unary minus expression changed
526 # the meaning of the ST, so that a second compilation produced
527 # incorrect results.
528 st = parser.expr('-3')
529 code1 = parser.compilest(st)
530 self.assertEqual(eval(code1), -3)
531 code2 = parser.compilest(st)
532 self.assertEqual(eval(code2), -3)
533
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000534class ParserStackLimitTestCase(unittest.TestCase):
Mark Dickinsond35a32e2010-06-17 12:33:22 +0000535 """try to push the parser to/over its limits.
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000536 see http://bugs.python.org/issue1881 for a discussion
537 """
538 def _nested_expression(self, level):
539 return "["*level+"]"*level
540
541 def test_deeply_nested_list(self):
542 # XXX used to be 99 levels in 2.x
543 e = self._nested_expression(93)
544 st = parser.expr(e)
545 st.compile()
546
547 def test_trigger_memory_error(self):
548 e = self._nested_expression(100)
Christian Heimesb186d002008-03-18 15:15:01 +0000549 print("Expecting 's_push: parser stack overflow' in next line",
550 file=sys.stderr)
Antoine Pitrou88909542009-06-29 13:54:42 +0000551 sys.stderr.flush()
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000552 self.assertRaises(MemoryError, parser.expr, e)
553
Mark Dickinson211c6252009-02-01 10:28:51 +0000554class STObjectTestCase(unittest.TestCase):
555 """Test operations on ST objects themselves"""
556
557 def test_comparisons(self):
558 # ST objects should support order and equality comparisons
559 st1 = parser.expr('2 + 3')
560 st2 = parser.suite('x = 2; y = x + 3')
561 st3 = parser.expr('list(x**3 for x in range(20))')
562 st1_copy = parser.expr('2 + 3')
563 st2_copy = parser.suite('x = 2; y = x + 3')
564 st3_copy = parser.expr('list(x**3 for x in range(20))')
565
566 # exercise fast path for object identity
Ezio Melottib3aedd42010-11-20 19:04:17 +0000567 self.assertEqual(st1 == st1, True)
568 self.assertEqual(st2 == st2, True)
569 self.assertEqual(st3 == st3, True)
Mark Dickinson211c6252009-02-01 10:28:51 +0000570 # slow path equality
571 self.assertEqual(st1, st1_copy)
572 self.assertEqual(st2, st2_copy)
573 self.assertEqual(st3, st3_copy)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000574 self.assertEqual(st1 == st2, False)
575 self.assertEqual(st1 == st3, False)
576 self.assertEqual(st2 == st3, False)
577 self.assertEqual(st1 != st1, False)
578 self.assertEqual(st2 != st2, False)
579 self.assertEqual(st3 != st3, False)
580 self.assertEqual(st1 != st1_copy, False)
581 self.assertEqual(st2 != st2_copy, False)
582 self.assertEqual(st3 != st3_copy, False)
583 self.assertEqual(st2 != st1, True)
584 self.assertEqual(st1 != st3, True)
585 self.assertEqual(st3 != st2, True)
Mark Dickinson211c6252009-02-01 10:28:51 +0000586 # we don't particularly care what the ordering is; just that
587 # it's usable and self-consistent
Ezio Melottib3aedd42010-11-20 19:04:17 +0000588 self.assertEqual(st1 < st2, not (st2 <= st1))
589 self.assertEqual(st1 < st3, not (st3 <= st1))
590 self.assertEqual(st2 < st3, not (st3 <= st2))
591 self.assertEqual(st1 < st2, st2 > st1)
592 self.assertEqual(st1 < st3, st3 > st1)
593 self.assertEqual(st2 < st3, st3 > st2)
594 self.assertEqual(st1 <= st2, st2 >= st1)
595 self.assertEqual(st3 <= st1, st1 >= st3)
596 self.assertEqual(st2 <= st3, st3 >= st2)
Mark Dickinson211c6252009-02-01 10:28:51 +0000597 # transitivity
598 bottom = min(st1, st2, st3)
599 top = max(st1, st2, st3)
600 mid = sorted([st1, st2, st3])[1]
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000601 self.assertTrue(bottom < mid)
602 self.assertTrue(bottom < top)
603 self.assertTrue(mid < top)
604 self.assertTrue(bottom <= mid)
605 self.assertTrue(bottom <= top)
606 self.assertTrue(mid <= top)
607 self.assertTrue(bottom <= bottom)
608 self.assertTrue(mid <= mid)
609 self.assertTrue(top <= top)
Mark Dickinson211c6252009-02-01 10:28:51 +0000610 # interaction with other types
Ezio Melottib3aedd42010-11-20 19:04:17 +0000611 self.assertEqual(st1 == 1588.602459, False)
612 self.assertEqual('spanish armada' != st2, True)
Mark Dickinson211c6252009-02-01 10:28:51 +0000613 self.assertRaises(TypeError, operator.ge, st3, None)
614 self.assertRaises(TypeError, operator.le, False, st1)
615 self.assertRaises(TypeError, operator.lt, st1, 1815)
616 self.assertRaises(TypeError, operator.gt, b'waterloo', st2)
617
618
619 # XXX tests for pickling and unpickling of ST objects should go here
620
Benjamin Petersonf719957d2011-06-04 22:06:42 -0500621class OtherParserCase(unittest.TestCase):
622
623 def test_two_args_to_expr(self):
624 # See bug #12264
625 with self.assertRaises(TypeError):
626 parser.expr("a", "b")
627
Fred Drake2e2be372001-09-20 21:33:42 +0000628def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000629 support.run_unittest(
Walter Dörwald21d3a322003-05-01 17:45:56 +0000630 RoundtripLegalSyntaxTestCase,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000631 IllegalSyntaxTestCase,
632 CompileTestCase,
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000633 ParserStackLimitTestCase,
Mark Dickinson211c6252009-02-01 10:28:51 +0000634 STObjectTestCase,
Benjamin Petersonf719957d2011-06-04 22:06:42 -0500635 OtherParserCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000636 )
Fred Drake2e2be372001-09-20 21:33:42 +0000637
638
639if __name__ == "__main__":
640 test_main()