test_parser.py revision bd6a05fe81fe1573f0517ce8982d62341f3b0f85
1fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisseimport parser
2fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisseimport unittest
3fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisseimport sys
4fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glissefrom test import test_support
5fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse
6fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#
7fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#  First, we test that we can generate trees from valid source fragments,
8fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#  and that these valid trees are indeed allowed by the tree-loading side
9fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#  of the parser module.
10fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse#
11fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse
12fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisseclass RoundtripLegalSyntaxTestCase(unittest.TestCase):
13fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse
14fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse    def roundtrip(self, f, s):
15fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse        st1 = f(s)
16fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse        t = st1.totuple()
17fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse        try:
18fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse            st2 = parser.sequence2st(t)
19fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse        except parser.ParserError, why:
20fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse            self.fail("could not roundtrip %r: %s" % (s, why))
21fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse
22fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse        self.assertEquals(t, st2.totuple(),
23330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák                          "could not re-generate syntax tree")
24330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák
25fd266ec62ca772a8551d2d7922d718d9d84bdf07Jerome Glisse    def check_expr(self, s):
26330b6c85c961b32f704ce8ec7dbf8cb7fc0b80a8Marek Olšák        self.roundtrip(parser.expr, s)
278fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch
288fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch    def check_suite(self, s):
298fb7f1a8a4cbab5365491b4b41e50ff3f03306c8Kai Wasserbäch        self.roundtrip(parser.suite, s)
30d1cc87c0b64c2221b079015a6c3b593af83f0758Dave Airlie
313fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_yield_statement(self):
323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): yield 1")
333fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): yield")
343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): x += yield")
353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): x = yield 1")
363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): x = y = yield 1")
373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): x = yield")
383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): x = y = yield")
393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): 1 + (yield)*2")
403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): (yield 1)*2")
413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): return; yield 1")
423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): yield 1; return")
433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f():\n"
443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "    for x in range(30):\n"
453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "        yield x\n")
463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f():\n"
473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "    if (yield):\n"
483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "        yield x\n")
493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_expressions(self):
513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(1)")
523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("[1, 2, 3]")
533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("[x**3 for x in range(20)]")
543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("[x**3 for x in range(20) if x % 3]")
553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("[x**3 for x in range(20) if x % 2 if x % 3]")
563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("list(x**3 for x in range(20))")
573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("list(x**3 for x in range(20) if x % 3)")
583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("list(x**3 for x in range(20) if x % 2 if x % 3)")
593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(*args)")
603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(*args, **kw)")
613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(**kw)")
623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(key=value)")
633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(key=value, *args)")
643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(key=value, *args, **kw)")
653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(key=value, **kw)")
663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(a, b, c, *args)")
673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(a, b, c, *args, **kw)")
683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(a, b, c, **kw)")
693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(a, *args, keyword=23)")
703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo + bar")
713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo - bar")
723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo * bar")
733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo / bar")
743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo // bar")
753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda: 0")
763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda x: 0")
773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda *y: 0")
783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda *y, **z: 0")
793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda **z: 0")
803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda x, y: 0")
813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda foo=bar: 0")
823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda foo=bar, spaz=nifty+spit: 0")
833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda foo=bar, **z: 0")
843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0")
853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("lambda x, *y, **z: 0")
873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("(x for x in range(10))")
883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_expr("foo(x for x in range(10))")
893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_print(self):
913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("print")
923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("print 1")
933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("print 1,")
943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("print >>fp")
953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("print >>fp, 1")
963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("print >>fp, 1,")
973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_simple_expression(self):
993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # expr_stmt
1003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a")
1013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1028698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák    def test_simple_assignments(self):
1033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a = b")
1043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a = b = c = d = e")
1053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_simple_augmented_assignments(self):
1073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a += b")
1083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a -= b")
1093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a *= b")
1103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a /= b")
1113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a //= b")
1128698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák        self.check_suite("a %= b")
1138698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák        self.check_suite("a &= b")
1143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a |= b")
1158698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák        self.check_suite("a ^= b")
1168698a3b85dd89c5d2fa473e7942b7dc8d25f3c8fMarek Olšák        self.check_suite("a <<= b")
1173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a >>= b")
1183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("a **= b")
1193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_function_defs(self):
1213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(): pass")
1223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(*args): pass")
1233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(*args, **kw): pass")
1243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(**kw): pass")
1253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(foo=bar): pass")
1263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(foo=bar, *args): pass")
1273fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(foo=bar, *args, **kw): pass")
1283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(foo=bar, **kw): pass")
1293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(a, b): pass")
131866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        self.check_suite("def f(a, b, *args): pass")
1323fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(a, b, *args, **kw): pass")
13389954723bfeef59d055d2332ff112f0204b48130Marek Olšák        self.check_suite("def f(a, b, **kw): pass")
13489954723bfeef59d055d2332ff112f0204b48130Marek Olšák        self.check_suite("def f(a, b, foo=bar): pass")
135866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        self.check_suite("def f(a, b, foo=bar, *args): pass")
13689954723bfeef59d055d2332ff112f0204b48130Marek Olšák        self.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
1373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("def f(a, b, foo=bar, **kw): pass")
1383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("@staticmethod\n"
1403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "def f(): pass")
1413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("@staticmethod\n"
1423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "@funcattrs(x, y)\n"
1433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "def f(): pass")
1443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("@funcattrs()\n"
1453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         "def f(): pass")
1463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
147914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    def test_class_defs(self):
1488d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        self.check_suite("class foo():pass")
1498d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie
150914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    def test_import_from_statement(self):
151914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import *")
152914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import dirname")
153914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import (dirname)")
154914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import (dirname,)")
155914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import dirname as my_dirname")
156914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import (dirname as my_dirname)")
157914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("from sys.path import (dirname as my_dirname,)")
1580d0285ba916d9e25871354441c09b0a8c7c9b844Christian König        self.check_suite("from sys.path import dirname, basename")
1593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("from sys.path import (dirname, basename)")
1603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("from sys.path import (dirname, basename,)")
161914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite(
1628d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            "from sys.path import dirname as my_dirname, basename")
1638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        self.check_suite(
164914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            "from sys.path import (dirname as my_dirname, basename)")
165914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite(
1668d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            "from sys.path import (dirname as my_dirname, basename,)")
1678d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        self.check_suite(
1683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            "from sys.path import dirname, basename as my_basename")
169914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite(
170914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            "from sys.path import (dirname, basename as my_basename)")
171914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite(
172914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            "from sys.path import (dirname, basename as my_basename,)")
173914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
174914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    def test_basic_import_statement(self):
175914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("import sys")
176914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("import sys as system")
177914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("import sys, math")
178914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("import sys as system, math")
179914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("import sys, math as my_math")
180914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
181914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    def test_pep263(self):
182914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_suite("# -*- coding: iso-8859-1 -*-\n"
183914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                         "pass\n")
184914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
1853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_assert(self):
1863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_suite("assert alo < ahi and blo < bhi\n")
18777058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie
18877058335ebc9a1c2a81ec2cf98a8a157065e69d0Dave Airlie    def test_position(self):
1893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # An absolutely minimal test of position information.  Better
1903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # tests would be a big project.
1913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        code = "def f(x):\n    return x + 1\n"
1920d0285ba916d9e25871354441c09b0a8c7c9b844Christian König        st1 = parser.suite(code)
1933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st2 = st1.totuple(line_info=1, col_info=1)
1943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
1953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        def walk(tree):
1963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            node_type = tree[0]
1973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            next = tree[1]
1983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            if isinstance(next, tuple):
1993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                for elt in tree[1:]:
2003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                    for x in walk(elt):
2013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                        yield x
2023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            else:
2033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                yield tree
2043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        terminals = list(walk(st2))
2063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.assertEqual([
2073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'def', 1, 0),
2083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'f', 1, 4),
2093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (7, '(', 1, 5),
2103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'x', 1, 6),
211914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (8, ')', 1, 7),
2128d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            (11, ':', 1, 8),
2138d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            (4, '', 1, 9),
2143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (5, '', 2, -1),
215914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (1, 'return', 2, 4),
216914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (1, 'x', 2, 11),
217914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (14, '+', 2, 13),
218914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (2, '1', 2, 15),
219914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (4, '', 2, 16),
220914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (6, '', 2, -1),
221914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (4, '', 2, -1),
222914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák            (0, '', 2, -1)],
2233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         terminals)
2243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
225914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
2268d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie#
2278d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie#  Second, we take *invalid* trees and make sure we get ParserError
2283fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#  rejections for them.
2293fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet#
2303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
231914b4bb80c28c81101941d5533361ae0108eb771Marek Olšákclass IllegalSyntaxTestCase(unittest.TestCase):
2328d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie
2338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie    def check_bad_tree(self, tree, label):
2343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        try:
2353fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            parser.sequence2st(tree)
2363fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        except parser.ParserError:
2373fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            pass
2383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        else:
2393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            self.fail("did not detect invalid tree for %r" % label)
2403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2413fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_junk(self):
2423fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # not even remotely valid:
2433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_bad_tree((1, 2, 3), "<junk>")
2443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
2453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_illegal_yield_1(self):
2463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # Illegal yield statement: def f(): return 1; yield 1
2473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        tree = \
2483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        (257,
2493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet         (264,
2503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (285,
2513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (259,
2523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'def'),
2533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'f'),
2548d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            (260, (7, '('), (8, ')')),
2558d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            (11, ':'),
2563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (291,
2573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (4, ''),
2583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (5, ''),
2593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (264,
2603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet              (265,
2613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (266,
2623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                (272,
2633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                 (275,
264866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                  (1, 'return'),
2653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                  (313,
2663fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                   (292,
2673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                    (293,
268866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                     (294,
2693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                      (295,
2703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                       (297,
2713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                        (298,
2723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         (299,
2733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                          (300,
2743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                           (301,
2753fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                            (302, (303, (304, (305, (2, '1')))))))))))))))))),
2763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (264,
2779608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie                (265,
2783fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                 (266,
2793fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                  (272,
2803fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                   (276,
2813fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                    (1, 'yield'),
282914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                    (313,
2833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                     (292,
2848d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                      (293,
2858d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                       (294,
2868d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                        (295,
2878d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                         (297,
2883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                          (298,
28989954723bfeef59d055d2332ff112f0204b48130Marek Olšák                           (299,
2903fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                            (300,
2913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                             (301,
2923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                              (302,
2933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                               (303, (304, (305, (2, '1')))))))))))))))))),
2948d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                 (4, ''))),
2958d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie               (6, ''))))),
2963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (4, ''),
2973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (0, ''))))
2988d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        self.check_bad_tree(tree, "def f():\n  return 1\n  yield 1")
2998d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie
3003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_illegal_yield_2(self):
301866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie        # Illegal return in generator: def f(): return 1; yield 1
3023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        tree = \
3033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        (257,
3043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet         (264,
3053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (265,
3063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (266,
3078d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie            (278,
3088d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie             (1, 'from'),
3093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (281, (1, '__future__')),
3103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (1, 'import'),
3113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (279, (1, 'generators')))),
3123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (4, ''))),
3133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet         (264,
3143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (285,
3153fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (259,
3163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'def'),
3173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (1, 'f'),
3183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (260, (7, '('), (8, ')')),
3193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (11, ':'),
3203fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (291,
3210d0285ba916d9e25871354441c09b0a8c7c9b844Christian König             (4, ''),
3220d0285ba916d9e25871354441c09b0a8c7c9b844Christian König             (5, ''),
3233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (264,
3243fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet              (265,
3253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (266,
3263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                (272,
327914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                 (275,
3288d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                  (1, 'return'),
3298d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                  (313,
3303fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                   (292,
331914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                    (293,
3328d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                     (294,
3338d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                      (295,
3343fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                       (297,
335914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                        (298,
3368d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                         (299,
3378d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                          (300,
3383fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                           (301,
3393fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                            (302, (303, (304, (305, (2, '1')))))))))))))))))),
3403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (264,
3418d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                (265,
3428d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                 (266,
3433fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                  (272,
3443fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                   (276,
3453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                    (1, 'yield'),
3463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                    (313,
3473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                     (292,
3483fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                      (293,
3493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                       (294,
3503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                        (295,
3513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                         (297,
3523fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                          (298,
3533fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                           (299,
3543fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                            (300,
3553fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                             (301,
3563fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                              (302,
3573fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                               (303, (304, (305, (2, '1')))))))))))))))))),
3583fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                 (4, ''))),
3593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (6, ''))))),
3603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (4, ''),
361914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák           (0, ''))))
3628d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        self.check_bad_tree(tree, "def f():\n  return 1\n  yield 1")
3638d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie
3643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_print_chevron_comma(self):
3653fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # Illegal input: print >>fp,
366914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        tree = \
3678d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        (257,
3688d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie         (264,
3693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (265,
3703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (266,
3713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (268,
372914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák             (1, 'print'),
3738d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie             (35, '>>'),
3748d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie             (290,
375914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák              (291,
376914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák               (292,
377914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                (293,
378914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                 (295,
379914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                  (296,
380914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                   (297,
381914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                    (298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))),
382914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák             (12, ','))),
383914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák           (4, ''))),
384914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák         (0, ''))
385914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_bad_tree(tree, "print >>fp,")
386914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
3873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_a_comma_comma_c(self):
3883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        # Illegal input: a,,c
3893fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        tree = \
390914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        (258,
391914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák         (311,
392914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák          (290,
3933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (291,
3943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (292,
3953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (293,
3963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet              (295,
3973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (296,
3983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                (297,
3993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                 (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
4003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (12, ','),
4013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (12, ','),
4023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (290,
4033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet           (291,
4043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (292,
4053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (293,
4063fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet              (295,
4073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet               (296,
4088d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                (297,
4098d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                 (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
4103fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet         (4, ''),
4113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet         (0, ''))
4123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_bad_tree(tree, "a,,c")
4133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4143fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_illegal_operator(self):
4159608ef5dec4d70024e68a49c64faed9ec7e4d2e0Dave Airlie        # Illegal input: a $= b
4163fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        tree = \
4173fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        (257,
4183fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet         (264,
4193fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet          (265,
420866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie           (266,
4213fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet            (267,
4223fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet             (312,
4233fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet              (291,
424866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie               (292,
4253fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                (293,
4263fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                 (294,
427866f9b18c68ede63c00917ec9c3dae3524ca8826Dave Airlie                  (296,
42889954723bfeef59d055d2332ff112f0204b48130Marek Olšák                   (297,
42989954723bfeef59d055d2332ff112f0204b48130Marek Olšák                    (298,
4305250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie                     (299,
4315250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie                      (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
432914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák             (268, (37, '$=')),
433914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák             (312,
434914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák              (291,
435914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák               (292,
436914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                (293,
437914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                 (294,
4385250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie                  (296,
4395250bd00c00ac8470320f4fae1d74425132f2083Dave Airlie                   (297,
4403fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                    (298,
441914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                     (299,
442914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                      (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
443914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák           (4, ''))),
44489954723bfeef59d055d2332ff112f0204b48130Marek Olšák         (0, ''))
4453fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.check_bad_tree(tree, "a $= b")
4463fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4473fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_malformed_global(self):
448914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        #doesn't have global keyword in ast
4493fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        tree = (257,
4503fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                (264,
4513fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet                 (265,
452914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                  (266,
4538d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                   (282, (1, 'foo'))), (4, ''))),
4548d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie                (4, ''),
455914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák                (0, ''))
456914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.check_bad_tree(tree, "malformed global ast")
457914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
458914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák
4593fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetclass CompileTestCase(unittest.TestCase):
4603fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4613fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    # These tests are very minimal. :-(
4623fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4633fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_compile_expr(self):
4643fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st = parser.expr('2 + 3')
4658d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        code = parser.compilest(st)
4668d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        self.assertEquals(eval(code), 5)
4673fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4683fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_compile_suite(self):
4693fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st = parser.suite('x = 2; y = x + 3')
4703fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        code = parser.compilest(st)
4713fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        globs = {}
4723fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        exec code in globs
4733fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.assertEquals(globs['y'], 5)
4743fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
475914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák    def test_compile_error(self):
4763fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st = parser.suite('1 = 3 + 4')
4773fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.assertRaises(SyntaxError, parser.compilest, st)
4788d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie
4798d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie    def test_compile_badunicode(self):
480914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        st = parser.suite('a = u"\U12345678"')
481914b4bb80c28c81101941d5533361ae0108eb771Marek Olšák        self.assertRaises(SyntaxError, parser.compilest, st)
4823fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st = parser.suite('a = u"\u1"')
4833fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.assertRaises(SyntaxError, parser.compilest, st)
4843fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4853fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetclass ParserStackLimitTestCase(unittest.TestCase):
4863fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    """try to push the parser to/over it's limits.
4873fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    see http://bugs.python.org/issue1881 for a discussion
4883fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    """
4898d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie    def _nested_expression(self, level):
4908d3e505ed66cbaa93782acdd5b296704392fcb06Dave Airlie        return "["*level+"]"*level
4913fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4923fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_deeply_nested_list(self):
4933fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        e = self._nested_expression(99)
4943fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st = parser.expr(e)
4953fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        st.compile()
4963fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
4973fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    def test_trigger_memory_error(self):
4983fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        e = self._nested_expression(100)
4993fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        print >>sys.stderr, "Expecting 's_push: parser stack overflow' in next line"
5003fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        self.assertRaises(MemoryError, parser.expr, e)
5013fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5023fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetdef test_main():
5033fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    test_support.run_unittest(
5043fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        RoundtripLegalSyntaxTestCase,
5053fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        IllegalSyntaxTestCase,
5067e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet        CompileTestCase,
5073fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet        ParserStackLimitTestCase,
5083fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    )
5093fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet
5107e591111bf783d94ee6034287cde2f4c9214e810Henri Verbeet
5113fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeetif __name__ == "__main__":
5123fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet    test_main()
5133fccc14b2fb35aef95bc04dee46e280a48679299Henri Verbeet