5 from test
import test_support
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.
13 class RoundtripLegalSyntaxTestCase(unittest
.TestCase
):
15 def roundtrip(self
, f
, s
):
19 st2
= parser
.sequence2st(t
)
20 except parser
.ParserError
, why
:
21 self
.fail("could not roundtrip %r: %s" % (s
, why
))
23 self
.assertEquals(t
, st2
.totuple(),
24 "could not re-generate syntax tree")
26 def check_expr(self
, s
):
27 self
.roundtrip(parser
.expr
, s
)
29 def test_flags_passed(self
):
30 # The unicode literals flags has to be passed from the paser to AST
32 suite
= parser
.suite("from __future__ import unicode_literals; x = ''")
33 code
= suite
.compile()
36 self
.assertTrue(isinstance(scope
["x"], unicode))
38 def check_suite(self
, s
):
39 self
.roundtrip(parser
.suite
, s
)
41 def test_yield_statement(self
):
42 self
.check_suite("def f(): yield 1")
43 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")
51 self
.check_suite("def f(): return; yield 1")
52 self
.check_suite("def f(): yield 1; return")
53 self
.check_suite("def f():\n"
54 " for x in range(30):\n"
56 self
.check_suite("def f():\n"
60 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]")
65 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)")
69 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)")
79 self
.check_expr("foo(a, *args, keyword=23)")
80 self
.check_expr("foo + bar")
81 self
.check_expr("foo - bar")
82 self
.check_expr("foo * bar")
83 self
.check_expr("foo / bar")
84 self
.check_expr("foo // bar")
85 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")
97 self
.check_expr("(x for x in range(10))")
98 self
.check_expr("foo(x for x in range(10))")
100 def test_print(self
):
101 self
.check_suite("print")
102 self
.check_suite("print 1")
103 self
.check_suite("print 1,")
104 self
.check_suite("print >>fp")
105 self
.check_suite("print >>fp, 1")
106 self
.check_suite("print >>fp, 1,")
108 def test_simple_expression(self
):
110 self
.check_suite("a")
112 def test_simple_assignments(self
):
113 self
.check_suite("a = b")
114 self
.check_suite("a = b = c = d = e")
116 def test_simple_augmented_assignments(self
):
117 self
.check_suite("a += b")
118 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")
125 self
.check_suite("a ^= b")
126 self
.check_suite("a <<= b")
127 self
.check_suite("a >>= b")
128 self
.check_suite("a **= b")
130 def test_function_defs(self
):
131 self
.check_suite("def f(): pass")
132 self
.check_suite("def f(*args): pass")
133 self
.check_suite("def f(*args, **kw): pass")
134 self
.check_suite("def f(**kw): pass")
135 self
.check_suite("def f(foo=bar): pass")
136 self
.check_suite("def f(foo=bar, *args): pass")
137 self
.check_suite("def f(foo=bar, *args, **kw): pass")
138 self
.check_suite("def f(foo=bar, **kw): pass")
140 self
.check_suite("def f(a, b): pass")
141 self
.check_suite("def f(a, b, *args): pass")
142 self
.check_suite("def f(a, b, *args, **kw): pass")
143 self
.check_suite("def f(a, b, **kw): pass")
144 self
.check_suite("def f(a, b, foo=bar): pass")
145 self
.check_suite("def f(a, b, foo=bar, *args): pass")
146 self
.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
147 self
.check_suite("def f(a, b, foo=bar, **kw): pass")
149 self
.check_suite("@staticmethod\n"
151 self
.check_suite("@staticmethod\n"
154 self
.check_suite("@funcattrs()\n"
157 def test_class_defs(self
):
158 self
.check_suite("class foo():pass")
160 def test_import_from_statement(self
):
161 self
.check_suite("from sys.path import *")
162 self
.check_suite("from sys.path import dirname")
163 self
.check_suite("from sys.path import (dirname)")
164 self
.check_suite("from sys.path import (dirname,)")
165 self
.check_suite("from sys.path import dirname as my_dirname")
166 self
.check_suite("from sys.path import (dirname as my_dirname)")
167 self
.check_suite("from sys.path import (dirname as my_dirname,)")
168 self
.check_suite("from sys.path import dirname, basename")
169 self
.check_suite("from sys.path import (dirname, basename)")
170 self
.check_suite("from sys.path import (dirname, basename,)")
172 "from sys.path import dirname as my_dirname, basename")
174 "from sys.path import (dirname as my_dirname, basename)")
176 "from sys.path import (dirname as my_dirname, basename,)")
178 "from sys.path import dirname, basename as my_basename")
180 "from sys.path import (dirname, basename as my_basename)")
182 "from sys.path import (dirname, basename as my_basename,)")
183 self
.check_suite("from .bogus import x")
185 def test_basic_import_statement(self
):
186 self
.check_suite("import sys")
187 self
.check_suite("import sys as system")
188 self
.check_suite("import sys, math")
189 self
.check_suite("import sys as system, math")
190 self
.check_suite("import sys, math as my_math")
192 def test_pep263(self
):
193 self
.check_suite("# -*- coding: iso-8859-1 -*-\n"
196 def test_assert(self
):
197 self
.check_suite("assert alo < ahi and blo < bhi\n")
200 self
.check_suite("with open('x'): pass\n")
201 self
.check_suite("with open('x') as f: pass\n")
202 self
.check_suite("with open('x') as f, open('y') as g: pass\n")
204 def test_try_stmt(self
):
205 self
.check_suite("try: pass\nexcept: pass\n")
206 self
.check_suite("try: pass\nfinally: pass\n")
207 self
.check_suite("try: pass\nexcept A: pass\nfinally: pass\n")
208 self
.check_suite("try: pass\nexcept A: pass\nexcept: pass\n"
210 self
.check_suite("try: pass\nexcept: pass\nelse: pass\n")
211 self
.check_suite("try: pass\nexcept: pass\nelse: pass\n"
214 def test_position(self
):
215 # An absolutely minimal test of position information. Better
216 # tests would be a big project.
217 code
= "def f(x):\n return x + 1"
218 st1
= parser
.suite(code
)
219 st2
= st1
.totuple(line_info
=1, col_info
=1)
224 if isinstance(next
, tuple):
231 terminals
= list(walk(st2
))
253 # Second, we take *invalid* trees and make sure we get ParserError
254 # rejections for them.
257 class IllegalSyntaxTestCase(unittest
.TestCase
):
259 def check_bad_tree(self
, tree
, label
):
261 parser
.sequence2st(tree
)
262 except parser
.ParserError
:
265 self
.fail("did not detect invalid tree for %r" % label
)
268 # not even remotely valid:
269 self
.check_bad_tree((1, 2, 3), "<junk>")
271 def test_illegal_yield_1(self
):
272 # Illegal yield statement: def f(): return 1; yield 1
280 (260, (7, '('), (8, ')')),
301 (302, (303, (304, (305, (2, '1')))))))))))))))))),
319 (303, (304, (305, (2, '1')))))))))))))))))),
324 self
.check_bad_tree(tree
, "def f():\n return 1\n yield 1")
326 def test_illegal_yield_2(self
):
327 # Illegal return in generator: def f(): return 1; yield 1
335 (281, (1, '__future__')),
337 (279, (1, 'generators')))),
344 (260, (7, '('), (8, ')')),
365 (302, (303, (304, (305, (2, '1')))))))))))))))))),
383 (303, (304, (305, (2, '1')))))))))))))))))),
388 self
.check_bad_tree(tree
, "def f():\n return 1\n yield 1")
390 def test_print_chevron_comma(self
):
391 # Illegal input: print >>fp,
407 (298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))),
411 self
.check_bad_tree(tree
, "print >>fp,")
413 def test_a_comma_comma_c(self
):
414 # Illegal input: a,,c
425 (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
435 (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
438 self
.check_bad_tree(tree
, "a,,c")
440 def test_illegal_operator(self
):
441 # Illegal input: a $= b
457 (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
468 (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
471 self
.check_bad_tree(tree
, "a $= b")
473 def test_malformed_global(self
):
474 #doesn't have global keyword in ast
479 (282, (1, 'foo'))), (4, ''))),
482 self
.check_bad_tree(tree
, "malformed global ast")
485 class CompileTestCase(unittest
.TestCase
):
487 # These tests are very minimal. :-(
489 def test_compile_expr(self
):
490 st
= parser
.expr('2 + 3')
491 code
= parser
.compilest(st
)
492 self
.assertEquals(eval(code
), 5)
494 def test_compile_suite(self
):
495 st
= parser
.suite('x = 2; y = x + 3')
496 code
= parser
.compilest(st
)
499 self
.assertEquals(globs
['y'], 5)
501 def test_compile_error(self
):
502 st
= parser
.suite('1 = 3 + 4')
503 self
.assertRaises(SyntaxError, parser
.compilest
, st
)
505 def test_compile_badunicode(self
):
506 st
= parser
.suite('a = u"\U12345678"')
507 self
.assertRaises(SyntaxError, parser
.compilest
, st
)
508 st
= parser
.suite('a = u"\u1"')
509 self
.assertRaises(SyntaxError, parser
.compilest
, st
)
511 class ParserStackLimitTestCase(unittest
.TestCase
):
512 """try to push the parser to/over it's limits.
513 see http://bugs.python.org/issue1881 for a discussion
515 def _nested_expression(self
, level
):
516 return "["*level
+"]"*level
518 def test_deeply_nested_list(self
):
519 e
= self
._nested
_expression
(99)
523 def test_trigger_memory_error(self
):
524 e
= self
._nested
_expression
(100)
525 print >>sys
.stderr
, "Expecting 's_push: parser stack overflow' in next line"
526 self
.assertRaises(MemoryError, parser
.expr
, e
)
529 test_support
.run_unittest(
530 RoundtripLegalSyntaxTestCase
,
531 IllegalSyntaxTestCase
,
533 ParserStackLimitTestCase
,
537 if __name__
== "__main__":