blob: 833d3178d662cffd2228efa550b303d343eb7941 [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")
53 self.check_suite("def f():\n"
Fred Drakecf580c72001-07-17 03:01:29 +000054 " for x in range(30):\n"
55 " yield x\n")
Phillip J. Eby0d6615f2005-08-02 00:46:46 +000056 self.check_suite("def f():\n"
57 " if (yield):\n"
58 " yield x\n")
Fred Drakecf580c72001-07-17 03:01:29 +000059
Fred Drake58422e52001-06-04 03:56:24 +000060 def test_expressions(self):
61 self.check_expr("foo(1)")
62 self.check_expr("[1, 2, 3]")
63 self.check_expr("[x**3 for x in range(20)]")
64 self.check_expr("[x**3 for x in range(20) if x % 3]")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +000065 self.check_expr("[x**3 for x in range(20) if x % 2 if x % 3]")
66 self.check_expr("list(x**3 for x in range(20))")
67 self.check_expr("list(x**3 for x in range(20) if x % 3)")
68 self.check_expr("list(x**3 for x in range(20) if x % 2 if x % 3)")
Fred Drake58422e52001-06-04 03:56:24 +000069 self.check_expr("foo(*args)")
70 self.check_expr("foo(*args, **kw)")
71 self.check_expr("foo(**kw)")
72 self.check_expr("foo(key=value)")
73 self.check_expr("foo(key=value, *args)")
74 self.check_expr("foo(key=value, *args, **kw)")
75 self.check_expr("foo(key=value, **kw)")
76 self.check_expr("foo(a, b, c, *args)")
77 self.check_expr("foo(a, b, c, *args, **kw)")
78 self.check_expr("foo(a, b, c, **kw)")
Benjamin Peterson3938a902008-08-20 02:33:00 +000079 self.check_expr("foo(a, *args, keyword=23)")
Fred Drake58422e52001-06-04 03:56:24 +000080 self.check_expr("foo + bar")
Michael W. Hudson5e83b7a2003-01-29 14:20:23 +000081 self.check_expr("foo - bar")
82 self.check_expr("foo * bar")
83 self.check_expr("foo / bar")
84 self.check_expr("foo // bar")
Fred Drake58422e52001-06-04 03:56:24 +000085 self.check_expr("lambda: 0")
86 self.check_expr("lambda x: 0")
87 self.check_expr("lambda *y: 0")
88 self.check_expr("lambda *y, **z: 0")
89 self.check_expr("lambda **z: 0")
90 self.check_expr("lambda x, y: 0")
91 self.check_expr("lambda foo=bar: 0")
92 self.check_expr("lambda foo=bar, spaz=nifty+spit: 0")
93 self.check_expr("lambda foo=bar, **z: 0")
94 self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0")
95 self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
96 self.check_expr("lambda x, *y, **z: 0")
Raymond Hettinger354433a2004-05-19 08:20:33 +000097 self.check_expr("(x for x in range(10))")
98 self.check_expr("foo(x for x in range(10))")
Fred Drake79ca79d2000-08-21 22:30:53 +000099
Fred Drake58422e52001-06-04 03:56:24 +0000100 def test_simple_expression(self):
101 # expr_stmt
102 self.check_suite("a")
Fred Drake79ca79d2000-08-21 22:30:53 +0000103
Fred Drake58422e52001-06-04 03:56:24 +0000104 def test_simple_assignments(self):
105 self.check_suite("a = b")
106 self.check_suite("a = b = c = d = e")
Fred Drake28f739a2000-08-25 22:42:40 +0000107
Fred Drake58422e52001-06-04 03:56:24 +0000108 def test_simple_augmented_assignments(self):
109 self.check_suite("a += b")
110 self.check_suite("a -= b")
111 self.check_suite("a *= b")
112 self.check_suite("a /= b")
Michael W. Hudson5e83b7a2003-01-29 14:20:23 +0000113 self.check_suite("a //= b")
Fred Drake58422e52001-06-04 03:56:24 +0000114 self.check_suite("a %= b")
115 self.check_suite("a &= b")
116 self.check_suite("a |= b")
117 self.check_suite("a ^= b")
118 self.check_suite("a <<= b")
119 self.check_suite("a >>= b")
120 self.check_suite("a **= b")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000121
Fred Drake58422e52001-06-04 03:56:24 +0000122 def test_function_defs(self):
123 self.check_suite("def f(): pass")
124 self.check_suite("def f(*args): pass")
125 self.check_suite("def f(*args, **kw): pass")
126 self.check_suite("def f(**kw): pass")
127 self.check_suite("def f(foo=bar): pass")
128 self.check_suite("def f(foo=bar, *args): pass")
129 self.check_suite("def f(foo=bar, *args, **kw): pass")
130 self.check_suite("def f(foo=bar, **kw): pass")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000131
Fred Drake58422e52001-06-04 03:56:24 +0000132 self.check_suite("def f(a, b): pass")
133 self.check_suite("def f(a, b, *args): pass")
134 self.check_suite("def f(a, b, *args, **kw): pass")
135 self.check_suite("def f(a, b, **kw): pass")
136 self.check_suite("def f(a, b, foo=bar): pass")
137 self.check_suite("def f(a, b, foo=bar, *args): pass")
138 self.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
139 self.check_suite("def f(a, b, foo=bar, **kw): pass")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000140
Anthony Baxterc2a5a632004-08-02 06:10:11 +0000141 self.check_suite("@staticmethod\n"
142 "def f(): pass")
143 self.check_suite("@staticmethod\n"
144 "@funcattrs(x, y)\n"
145 "def f(): pass")
146 self.check_suite("@funcattrs()\n"
147 "def f(): pass")
148
Mark Dickinsonea7e9f92012-04-29 18:34:40 +0100149 # keyword-only arguments
150 self.check_suite("def f(*, a): pass")
151 self.check_suite("def f(*, a = 5): pass")
152 self.check_suite("def f(*, a = 5, b): pass")
153 self.check_suite("def f(*, a, b = 5): pass")
154 self.check_suite("def f(*, a, b = 5, **kwds): pass")
155 self.check_suite("def f(*args, a): pass")
156 self.check_suite("def f(*args, a = 5): pass")
157 self.check_suite("def f(*args, a = 5, b): pass")
158 self.check_suite("def f(*args, a, b = 5): pass")
159 self.check_suite("def f(*args, a, b = 5, **kwds): pass")
160
161 # function annotations
162 self.check_suite("def f(a: int): pass")
163 self.check_suite("def f(a: int = 5): pass")
164 self.check_suite("def f(*args: list): pass")
165 self.check_suite("def f(**kwds: dict): pass")
166 self.check_suite("def f(*, a: int): pass")
167 self.check_suite("def f(*, a: int = 5): pass")
168 self.check_suite("def f() -> int: pass")
169
Brett Cannonf4189912005-04-09 02:30:16 +0000170 def test_class_defs(self):
171 self.check_suite("class foo():pass")
Guido van Rossumfc158e22007-11-15 19:17:28 +0000172 self.check_suite("class foo(object):pass")
Mark Dickinson2bd61a92010-07-04 16:37:31 +0000173 self.check_suite("@class_decorator\n"
174 "class foo():pass")
175 self.check_suite("@class_decorator(arg)\n"
176 "class foo():pass")
177 self.check_suite("@decorator1\n"
178 "@decorator2\n"
179 "class foo():pass")
Tim Peterse8906822005-04-20 17:45:13 +0000180
Fred Drake58422e52001-06-04 03:56:24 +0000181 def test_import_from_statement(self):
182 self.check_suite("from sys.path import *")
183 self.check_suite("from sys.path import dirname")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000184 self.check_suite("from sys.path import (dirname)")
185 self.check_suite("from sys.path import (dirname,)")
Fred Drake58422e52001-06-04 03:56:24 +0000186 self.check_suite("from sys.path import dirname as my_dirname")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000187 self.check_suite("from sys.path import (dirname as my_dirname)")
188 self.check_suite("from sys.path import (dirname as my_dirname,)")
Fred Drake58422e52001-06-04 03:56:24 +0000189 self.check_suite("from sys.path import dirname, basename")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000190 self.check_suite("from sys.path import (dirname, basename)")
191 self.check_suite("from sys.path import (dirname, basename,)")
Fred Drake58422e52001-06-04 03:56:24 +0000192 self.check_suite(
193 "from sys.path import dirname as my_dirname, basename")
194 self.check_suite(
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000195 "from sys.path import (dirname as my_dirname, basename)")
196 self.check_suite(
197 "from sys.path import (dirname as my_dirname, basename,)")
198 self.check_suite(
Fred Drake58422e52001-06-04 03:56:24 +0000199 "from sys.path import dirname, basename as my_basename")
Anthony Baxter1a4ddae2004-08-31 10:07:13 +0000200 self.check_suite(
201 "from sys.path import (dirname, basename as my_basename)")
202 self.check_suite(
203 "from sys.path import (dirname, basename as my_basename,)")
Benjamin Petersonc0747cf2008-11-03 20:31:38 +0000204 self.check_suite("from .bogus import x")
Fred Drakee3fb18c2001-01-07 06:02:19 +0000205
Fred Drake58422e52001-06-04 03:56:24 +0000206 def test_basic_import_statement(self):
207 self.check_suite("import sys")
208 self.check_suite("import sys as system")
209 self.check_suite("import sys, math")
210 self.check_suite("import sys as system, math")
211 self.check_suite("import sys, math as my_math")
Fred Drake79ca79d2000-08-21 22:30:53 +0000212
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000213 def test_relative_imports(self):
214 self.check_suite("from . import name")
215 self.check_suite("from .. import name")
Mark Dickinsonfeb3b752010-07-04 18:38:57 +0000216 # check all the way up to '....', since '...' is tokenized
217 # differently from '.' (it's an ellipsis token).
218 self.check_suite("from ... import name")
219 self.check_suite("from .... import name")
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000220 self.check_suite("from .pkg import name")
221 self.check_suite("from ..pkg import name")
Mark Dickinsonfeb3b752010-07-04 18:38:57 +0000222 self.check_suite("from ...pkg import name")
223 self.check_suite("from ....pkg import name")
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000224
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000225 def test_pep263(self):
226 self.check_suite("# -*- coding: iso-8859-1 -*-\n"
227 "pass\n")
228
229 def test_assert(self):
230 self.check_suite("assert alo < ahi and blo < bhi\n")
231
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000232 def test_with(self):
233 self.check_suite("with open('x'): pass\n")
234 self.check_suite("with open('x') as f: pass\n")
Georg Brandl0c315622009-05-25 21:10:36 +0000235 self.check_suite("with open('x') as f, open('y') as g: pass\n")
Benjamin Peterson4469d0c2008-11-30 22:46:23 +0000236
Georg Brandleee31162008-12-07 15:15:22 +0000237 def test_try_stmt(self):
238 self.check_suite("try: pass\nexcept: pass\n")
239 self.check_suite("try: pass\nfinally: pass\n")
240 self.check_suite("try: pass\nexcept A: pass\nfinally: pass\n")
241 self.check_suite("try: pass\nexcept A: pass\nexcept: pass\n"
242 "finally: pass\n")
243 self.check_suite("try: pass\nexcept: pass\nelse: pass\n")
244 self.check_suite("try: pass\nexcept: pass\nelse: pass\n"
245 "finally: pass\n")
246
Thomas Wouters89f507f2006-12-13 04:49:30 +0000247 def test_position(self):
248 # An absolutely minimal test of position information. Better
249 # tests would be a big project.
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000250 code = "def f(x):\n return x + 1"
Thomas Wouters89f507f2006-12-13 04:49:30 +0000251 st1 = parser.suite(code)
252 st2 = st1.totuple(line_info=1, col_info=1)
253
254 def walk(tree):
255 node_type = tree[0]
256 next = tree[1]
257 if isinstance(next, tuple):
258 for elt in tree[1:]:
259 for x in walk(elt):
260 yield x
261 else:
262 yield tree
263
264 terminals = list(walk(st2))
265 self.assertEqual([
266 (1, 'def', 1, 0),
267 (1, 'f', 1, 4),
268 (7, '(', 1, 5),
269 (1, 'x', 1, 6),
270 (8, ')', 1, 7),
271 (11, ':', 1, 8),
272 (4, '', 1, 9),
273 (5, '', 2, -1),
274 (1, 'return', 2, 4),
275 (1, 'x', 2, 11),
276 (14, '+', 2, 13),
277 (2, '1', 2, 15),
278 (4, '', 2, 16),
Benjamin Peterson8f326b22009-12-13 02:10:36 +0000279 (6, '', 2, -1),
280 (4, '', 2, -1),
281 (0, '', 2, -1)],
Thomas Wouters89f507f2006-12-13 04:49:30 +0000282 terminals)
283
Benjamin Peterson4905e802009-09-27 02:43:28 +0000284 def test_extended_unpacking(self):
285 self.check_suite("*a = y")
286 self.check_suite("x, *b, = m")
287 self.check_suite("[*a, *b] = y")
288 self.check_suite("for [*x, b] in x: pass")
289
Thomas Wouters89f507f2006-12-13 04:49:30 +0000290
Fred Drake79ca79d2000-08-21 22:30:53 +0000291#
292# Second, we take *invalid* trees and make sure we get ParserError
293# rejections for them.
294#
295
Fred Drake58422e52001-06-04 03:56:24 +0000296class IllegalSyntaxTestCase(unittest.TestCase):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000297
Fred Drake58422e52001-06-04 03:56:24 +0000298 def check_bad_tree(self, tree, label):
299 try:
Fred Drake6e4f2c02001-07-17 19:33:25 +0000300 parser.sequence2st(tree)
Fred Drake58422e52001-06-04 03:56:24 +0000301 except parser.ParserError:
302 pass
303 else:
304 self.fail("did not detect invalid tree for %r" % label)
Fred Drake79ca79d2000-08-21 22:30:53 +0000305
Fred Drake58422e52001-06-04 03:56:24 +0000306 def test_junk(self):
307 # not even remotely valid:
308 self.check_bad_tree((1, 2, 3), "<junk>")
309
Fred Drakecf580c72001-07-17 03:01:29 +0000310 def test_illegal_yield_1(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000311 # Illegal yield statement: def f(): return 1; yield 1
Fred Drakecf580c72001-07-17 03:01:29 +0000312 tree = \
313 (257,
314 (264,
315 (285,
316 (259,
317 (1, 'def'),
318 (1, 'f'),
319 (260, (7, '('), (8, ')')),
320 (11, ':'),
321 (291,
322 (4, ''),
323 (5, ''),
324 (264,
325 (265,
326 (266,
327 (272,
328 (275,
329 (1, 'return'),
330 (313,
331 (292,
332 (293,
333 (294,
334 (295,
335 (297,
336 (298,
337 (299,
338 (300,
339 (301,
340 (302, (303, (304, (305, (2, '1')))))))))))))))))),
341 (264,
342 (265,
343 (266,
344 (272,
345 (276,
346 (1, 'yield'),
347 (313,
348 (292,
349 (293,
350 (294,
351 (295,
352 (297,
353 (298,
354 (299,
355 (300,
356 (301,
357 (302,
358 (303, (304, (305, (2, '1')))))))))))))))))),
359 (4, ''))),
360 (6, ''))))),
361 (4, ''),
362 (0, ''))))
363 self.check_bad_tree(tree, "def f():\n return 1\n yield 1")
364
365 def test_illegal_yield_2(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000366 # Illegal return in generator: def f(): return 1; yield 1
Fred Drakecf580c72001-07-17 03:01:29 +0000367 tree = \
368 (257,
369 (264,
370 (265,
371 (266,
372 (278,
373 (1, 'from'),
374 (281, (1, '__future__')),
375 (1, 'import'),
376 (279, (1, 'generators')))),
377 (4, ''))),
378 (264,
379 (285,
380 (259,
381 (1, 'def'),
382 (1, 'f'),
383 (260, (7, '('), (8, ')')),
384 (11, ':'),
385 (291,
386 (4, ''),
387 (5, ''),
388 (264,
389 (265,
390 (266,
391 (272,
392 (275,
393 (1, 'return'),
394 (313,
395 (292,
396 (293,
397 (294,
398 (295,
399 (297,
400 (298,
401 (299,
402 (300,
403 (301,
404 (302, (303, (304, (305, (2, '1')))))))))))))))))),
405 (264,
406 (265,
407 (266,
408 (272,
409 (276,
410 (1, 'yield'),
411 (313,
412 (292,
413 (293,
414 (294,
415 (295,
416 (297,
417 (298,
418 (299,
419 (300,
420 (301,
421 (302,
422 (303, (304, (305, (2, '1')))))))))))))))))),
423 (4, ''))),
424 (6, ''))))),
425 (4, ''),
426 (0, ''))))
427 self.check_bad_tree(tree, "def f():\n return 1\n yield 1")
428
Fred Drake58422e52001-06-04 03:56:24 +0000429 def test_a_comma_comma_c(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000430 # Illegal input: a,,c
Fred Drake58422e52001-06-04 03:56:24 +0000431 tree = \
432 (258,
433 (311,
434 (290,
435 (291,
436 (292,
437 (293,
438 (295,
439 (296,
440 (297,
441 (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
442 (12, ','),
443 (12, ','),
444 (290,
445 (291,
446 (292,
447 (293,
448 (295,
449 (296,
450 (297,
451 (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
452 (4, ''),
453 (0, ''))
454 self.check_bad_tree(tree, "a,,c")
455
456 def test_illegal_operator(self):
Guido van Rossum32c2ae72002-08-22 19:45:32 +0000457 # Illegal input: a $= b
Fred Drake58422e52001-06-04 03:56:24 +0000458 tree = \
459 (257,
460 (264,
461 (265,
462 (266,
463 (267,
464 (312,
465 (291,
466 (292,
467 (293,
468 (294,
469 (296,
470 (297,
471 (298,
472 (299,
473 (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
474 (268, (37, '$=')),
475 (312,
476 (291,
477 (292,
478 (293,
479 (294,
480 (296,
481 (297,
482 (298,
483 (299,
484 (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
485 (4, ''))),
486 (0, ''))
487 self.check_bad_tree(tree, "a $= b")
Fred Drake79ca79d2000-08-21 22:30:53 +0000488
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000489 def test_malformed_global(self):
490 #doesn't have global keyword in ast
491 tree = (257,
492 (264,
493 (265,
494 (266,
495 (282, (1, 'foo'))), (4, ''))),
496 (4, ''),
Tim Petersf2715e02003-02-19 02:35:07 +0000497 (0, ''))
Neal Norwitz9caf9c02003-02-10 01:54:06 +0000498 self.check_bad_tree(tree, "malformed global ast")
Fred Drake79ca79d2000-08-21 22:30:53 +0000499
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000500 def test_missing_import_source(self):
Mark Dickinson3445b482010-07-04 18:15:26 +0000501 # from import fred
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000502 tree = \
503 (257,
Mark Dickinson3445b482010-07-04 18:15:26 +0000504 (268,
505 (269,
506 (270,
507 (282,
508 (284, (1, 'from'), (1, 'import'),
509 (287, (285, (1, 'fred')))))),
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000510 (4, ''))),
511 (4, ''), (0, ''))
Mark Dickinson3445b482010-07-04 18:15:26 +0000512 self.check_bad_tree(tree, "from import fred")
Mark Dickinson2cc8a5e2010-07-04 18:11:51 +0000513
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000514
515class CompileTestCase(unittest.TestCase):
516
517 # These tests are very minimal. :-(
518
519 def test_compile_expr(self):
520 st = parser.expr('2 + 3')
521 code = parser.compilest(st)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000522 self.assertEqual(eval(code), 5)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000523
524 def test_compile_suite(self):
525 st = parser.suite('x = 2; y = x + 3')
526 code = parser.compilest(st)
527 globs = {}
Georg Brandl7cae87c2006-09-06 06:51:57 +0000528 exec(code, globs)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000529 self.assertEqual(globs['y'], 5)
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000530
531 def test_compile_error(self):
532 st = parser.suite('1 = 3 + 4')
533 self.assertRaises(SyntaxError, parser.compilest, st)
534
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000535 def test_compile_badunicode(self):
Guido van Rossum7eb6ca52007-07-18 21:00:22 +0000536 st = parser.suite('a = "\\U12345678"')
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000537 self.assertRaises(SyntaxError, parser.compilest, st)
Guido van Rossum7eb6ca52007-07-18 21:00:22 +0000538 st = parser.suite('a = "\\u1"')
Guido van Rossumb5a755e2007-07-18 18:15:48 +0000539 self.assertRaises(SyntaxError, parser.compilest, st)
540
Mark Dickinsond35a32e2010-06-17 12:33:22 +0000541 def test_issue_9011(self):
542 # Issue 9011: compilation of an unary minus expression changed
543 # the meaning of the ST, so that a second compilation produced
544 # incorrect results.
545 st = parser.expr('-3')
546 code1 = parser.compilest(st)
547 self.assertEqual(eval(code1), -3)
548 code2 = parser.compilest(st)
549 self.assertEqual(eval(code2), -3)
550
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000551class ParserStackLimitTestCase(unittest.TestCase):
Mark Dickinsond35a32e2010-06-17 12:33:22 +0000552 """try to push the parser to/over its limits.
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000553 see http://bugs.python.org/issue1881 for a discussion
554 """
555 def _nested_expression(self, level):
556 return "["*level+"]"*level
557
558 def test_deeply_nested_list(self):
559 # XXX used to be 99 levels in 2.x
560 e = self._nested_expression(93)
561 st = parser.expr(e)
562 st.compile()
563
564 def test_trigger_memory_error(self):
565 e = self._nested_expression(100)
Christian Heimesb186d002008-03-18 15:15:01 +0000566 print("Expecting 's_push: parser stack overflow' in next line",
567 file=sys.stderr)
Antoine Pitrou88909542009-06-29 13:54:42 +0000568 sys.stderr.flush()
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000569 self.assertRaises(MemoryError, parser.expr, e)
570
Mark Dickinson211c6252009-02-01 10:28:51 +0000571class STObjectTestCase(unittest.TestCase):
572 """Test operations on ST objects themselves"""
573
574 def test_comparisons(self):
575 # ST objects should support order and equality comparisons
576 st1 = parser.expr('2 + 3')
577 st2 = parser.suite('x = 2; y = x + 3')
578 st3 = parser.expr('list(x**3 for x in range(20))')
579 st1_copy = parser.expr('2 + 3')
580 st2_copy = parser.suite('x = 2; y = x + 3')
581 st3_copy = parser.expr('list(x**3 for x in range(20))')
582
583 # exercise fast path for object identity
Ezio Melottib3aedd42010-11-20 19:04:17 +0000584 self.assertEqual(st1 == st1, True)
585 self.assertEqual(st2 == st2, True)
586 self.assertEqual(st3 == st3, True)
Mark Dickinson211c6252009-02-01 10:28:51 +0000587 # slow path equality
588 self.assertEqual(st1, st1_copy)
589 self.assertEqual(st2, st2_copy)
590 self.assertEqual(st3, st3_copy)
Ezio Melottib3aedd42010-11-20 19:04:17 +0000591 self.assertEqual(st1 == st2, False)
592 self.assertEqual(st1 == st3, False)
593 self.assertEqual(st2 == st3, False)
594 self.assertEqual(st1 != st1, False)
595 self.assertEqual(st2 != st2, False)
596 self.assertEqual(st3 != st3, False)
597 self.assertEqual(st1 != st1_copy, False)
598 self.assertEqual(st2 != st2_copy, False)
599 self.assertEqual(st3 != st3_copy, False)
600 self.assertEqual(st2 != st1, True)
601 self.assertEqual(st1 != st3, True)
602 self.assertEqual(st3 != st2, True)
Mark Dickinson211c6252009-02-01 10:28:51 +0000603 # we don't particularly care what the ordering is; just that
604 # it's usable and self-consistent
Ezio Melottib3aedd42010-11-20 19:04:17 +0000605 self.assertEqual(st1 < st2, not (st2 <= st1))
606 self.assertEqual(st1 < st3, not (st3 <= st1))
607 self.assertEqual(st2 < st3, not (st3 <= st2))
608 self.assertEqual(st1 < st2, st2 > st1)
609 self.assertEqual(st1 < st3, st3 > st1)
610 self.assertEqual(st2 < st3, st3 > st2)
611 self.assertEqual(st1 <= st2, st2 >= st1)
612 self.assertEqual(st3 <= st1, st1 >= st3)
613 self.assertEqual(st2 <= st3, st3 >= st2)
Mark Dickinson211c6252009-02-01 10:28:51 +0000614 # transitivity
615 bottom = min(st1, st2, st3)
616 top = max(st1, st2, st3)
617 mid = sorted([st1, st2, st3])[1]
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000618 self.assertTrue(bottom < mid)
619 self.assertTrue(bottom < top)
620 self.assertTrue(mid < top)
621 self.assertTrue(bottom <= mid)
622 self.assertTrue(bottom <= top)
623 self.assertTrue(mid <= top)
624 self.assertTrue(bottom <= bottom)
625 self.assertTrue(mid <= mid)
626 self.assertTrue(top <= top)
Mark Dickinson211c6252009-02-01 10:28:51 +0000627 # interaction with other types
Ezio Melottib3aedd42010-11-20 19:04:17 +0000628 self.assertEqual(st1 == 1588.602459, False)
629 self.assertEqual('spanish armada' != st2, True)
Mark Dickinson211c6252009-02-01 10:28:51 +0000630 self.assertRaises(TypeError, operator.ge, st3, None)
631 self.assertRaises(TypeError, operator.le, False, st1)
632 self.assertRaises(TypeError, operator.lt, st1, 1815)
633 self.assertRaises(TypeError, operator.gt, b'waterloo', st2)
634
635
636 # XXX tests for pickling and unpickling of ST objects should go here
637
638
Fred Drake2e2be372001-09-20 21:33:42 +0000639def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000640 support.run_unittest(
Walter Dörwald21d3a322003-05-01 17:45:56 +0000641 RoundtripLegalSyntaxTestCase,
Jeremy Hylton3e0055f2005-10-20 19:59:25 +0000642 IllegalSyntaxTestCase,
643 CompileTestCase,
Christian Heimes90c3d9b2008-02-23 13:18:03 +0000644 ParserStackLimitTestCase,
Mark Dickinson211c6252009-02-01 10:28:51 +0000645 STObjectTestCase,
Walter Dörwald21d3a322003-05-01 17:45:56 +0000646 )
Fred Drake2e2be372001-09-20 21:33:42 +0000647
648
649if __name__ == "__main__":
650 test_main()