python-2.5.2/win32/Lib/test/test_parser.py
changeset 0 ae805ac0140d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/python-2.5.2/win32/Lib/test/test_parser.py	Fri Apr 03 17:19:34 2009 +0100
@@ -0,0 +1,448 @@
+import parser
+import unittest
+from test import test_support
+
+#
+#  First, we test that we can generate trees from valid source fragments,
+#  and that these valid trees are indeed allowed by the tree-loading side
+#  of the parser module.
+#
+
+class RoundtripLegalSyntaxTestCase(unittest.TestCase):
+
+    def roundtrip(self, f, s):
+        st1 = f(s)
+        t = st1.totuple()
+        try:
+            st2 = parser.sequence2st(t)
+        except parser.ParserError, why:
+            self.fail("could not roundtrip %r: %s" % (s, why))
+
+        self.assertEquals(t, st2.totuple(),
+                          "could not re-generate syntax tree")
+
+    def check_expr(self, s):
+        self.roundtrip(parser.expr, s)
+
+    def check_suite(self, s):
+        self.roundtrip(parser.suite, s)
+
+    def test_yield_statement(self):
+        self.check_suite("def f(): yield 1")
+        self.check_suite("def f(): yield")
+        self.check_suite("def f(): x += yield")
+        self.check_suite("def f(): x = yield 1")
+        self.check_suite("def f(): x = y = yield 1")
+        self.check_suite("def f(): x = yield")
+        self.check_suite("def f(): x = y = yield")
+        self.check_suite("def f(): 1 + (yield)*2")
+        self.check_suite("def f(): (yield 1)*2")
+        self.check_suite("def f(): return; yield 1")
+        self.check_suite("def f(): yield 1; return")
+        self.check_suite("def f():\n"
+                         "    for x in range(30):\n"
+                         "        yield x\n")
+        self.check_suite("def f():\n"
+                         "    if (yield):\n"
+                         "        yield x\n")
+
+    def test_expressions(self):
+        self.check_expr("foo(1)")
+        self.check_expr("[1, 2, 3]")
+        self.check_expr("[x**3 for x in range(20)]")
+        self.check_expr("[x**3 for x in range(20) if x % 3]")
+        self.check_expr("[x**3 for x in range(20) if x % 2 if x % 3]")
+        self.check_expr("list(x**3 for x in range(20))")
+        self.check_expr("list(x**3 for x in range(20) if x % 3)")
+        self.check_expr("list(x**3 for x in range(20) if x % 2 if x % 3)")
+        self.check_expr("foo(*args)")
+        self.check_expr("foo(*args, **kw)")
+        self.check_expr("foo(**kw)")
+        self.check_expr("foo(key=value)")
+        self.check_expr("foo(key=value, *args)")
+        self.check_expr("foo(key=value, *args, **kw)")
+        self.check_expr("foo(key=value, **kw)")
+        self.check_expr("foo(a, b, c, *args)")
+        self.check_expr("foo(a, b, c, *args, **kw)")
+        self.check_expr("foo(a, b, c, **kw)")
+        self.check_expr("foo + bar")
+        self.check_expr("foo - bar")
+        self.check_expr("foo * bar")
+        self.check_expr("foo / bar")
+        self.check_expr("foo // bar")
+        self.check_expr("lambda: 0")
+        self.check_expr("lambda x: 0")
+        self.check_expr("lambda *y: 0")
+        self.check_expr("lambda *y, **z: 0")
+        self.check_expr("lambda **z: 0")
+        self.check_expr("lambda x, y: 0")
+        self.check_expr("lambda foo=bar: 0")
+        self.check_expr("lambda foo=bar, spaz=nifty+spit: 0")
+        self.check_expr("lambda foo=bar, **z: 0")
+        self.check_expr("lambda foo=bar, blaz=blat+2, **z: 0")
+        self.check_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0")
+        self.check_expr("lambda x, *y, **z: 0")
+        self.check_expr("(x for x in range(10))")
+        self.check_expr("foo(x for x in range(10))")
+
+    def test_print(self):
+        self.check_suite("print")
+        self.check_suite("print 1")
+        self.check_suite("print 1,")
+        self.check_suite("print >>fp")
+        self.check_suite("print >>fp, 1")
+        self.check_suite("print >>fp, 1,")
+
+    def test_simple_expression(self):
+        # expr_stmt
+        self.check_suite("a")
+
+    def test_simple_assignments(self):
+        self.check_suite("a = b")
+        self.check_suite("a = b = c = d = e")
+
+    def test_simple_augmented_assignments(self):
+        self.check_suite("a += b")
+        self.check_suite("a -= b")
+        self.check_suite("a *= b")
+        self.check_suite("a /= b")
+        self.check_suite("a //= b")
+        self.check_suite("a %= b")
+        self.check_suite("a &= b")
+        self.check_suite("a |= b")
+        self.check_suite("a ^= b")
+        self.check_suite("a <<= b")
+        self.check_suite("a >>= b")
+        self.check_suite("a **= b")
+
+    def test_function_defs(self):
+        self.check_suite("def f(): pass")
+        self.check_suite("def f(*args): pass")
+        self.check_suite("def f(*args, **kw): pass")
+        self.check_suite("def f(**kw): pass")
+        self.check_suite("def f(foo=bar): pass")
+        self.check_suite("def f(foo=bar, *args): pass")
+        self.check_suite("def f(foo=bar, *args, **kw): pass")
+        self.check_suite("def f(foo=bar, **kw): pass")
+
+        self.check_suite("def f(a, b): pass")
+        self.check_suite("def f(a, b, *args): pass")
+        self.check_suite("def f(a, b, *args, **kw): pass")
+        self.check_suite("def f(a, b, **kw): pass")
+        self.check_suite("def f(a, b, foo=bar): pass")
+        self.check_suite("def f(a, b, foo=bar, *args): pass")
+        self.check_suite("def f(a, b, foo=bar, *args, **kw): pass")
+        self.check_suite("def f(a, b, foo=bar, **kw): pass")
+
+        self.check_suite("@staticmethod\n"
+                         "def f(): pass")
+        self.check_suite("@staticmethod\n"
+                         "@funcattrs(x, y)\n"
+                         "def f(): pass")
+        self.check_suite("@funcattrs()\n"
+                         "def f(): pass")
+
+    def test_class_defs(self):
+        self.check_suite("class foo():pass")
+
+    def test_import_from_statement(self):
+        self.check_suite("from sys.path import *")
+        self.check_suite("from sys.path import dirname")
+        self.check_suite("from sys.path import (dirname)")
+        self.check_suite("from sys.path import (dirname,)")
+        self.check_suite("from sys.path import dirname as my_dirname")
+        self.check_suite("from sys.path import (dirname as my_dirname)")
+        self.check_suite("from sys.path import (dirname as my_dirname,)")
+        self.check_suite("from sys.path import dirname, basename")
+        self.check_suite("from sys.path import (dirname, basename)")
+        self.check_suite("from sys.path import (dirname, basename,)")
+        self.check_suite(
+            "from sys.path import dirname as my_dirname, basename")
+        self.check_suite(
+            "from sys.path import (dirname as my_dirname, basename)")
+        self.check_suite(
+            "from sys.path import (dirname as my_dirname, basename,)")
+        self.check_suite(
+            "from sys.path import dirname, basename as my_basename")
+        self.check_suite(
+            "from sys.path import (dirname, basename as my_basename)")
+        self.check_suite(
+            "from sys.path import (dirname, basename as my_basename,)")
+
+    def test_basic_import_statement(self):
+        self.check_suite("import sys")
+        self.check_suite("import sys as system")
+        self.check_suite("import sys, math")
+        self.check_suite("import sys as system, math")
+        self.check_suite("import sys, math as my_math")
+
+    def test_pep263(self):
+        self.check_suite("# -*- coding: iso-8859-1 -*-\n"
+                         "pass\n")
+
+    def test_assert(self):
+        self.check_suite("assert alo < ahi and blo < bhi\n")
+
+#
+#  Second, we take *invalid* trees and make sure we get ParserError
+#  rejections for them.
+#
+
+class IllegalSyntaxTestCase(unittest.TestCase):
+
+    def check_bad_tree(self, tree, label):
+        try:
+            parser.sequence2st(tree)
+        except parser.ParserError:
+            pass
+        else:
+            self.fail("did not detect invalid tree for %r" % label)
+
+    def test_junk(self):
+        # not even remotely valid:
+        self.check_bad_tree((1, 2, 3), "<junk>")
+
+    def test_illegal_yield_1(self):
+        # Illegal yield statement: def f(): return 1; yield 1
+        tree = \
+        (257,
+         (264,
+          (285,
+           (259,
+            (1, 'def'),
+            (1, 'f'),
+            (260, (7, '('), (8, ')')),
+            (11, ':'),
+            (291,
+             (4, ''),
+             (5, ''),
+             (264,
+              (265,
+               (266,
+                (272,
+                 (275,
+                  (1, 'return'),
+                  (313,
+                   (292,
+                    (293,
+                     (294,
+                      (295,
+                       (297,
+                        (298,
+                         (299,
+                          (300,
+                           (301,
+                            (302, (303, (304, (305, (2, '1')))))))))))))))))),
+               (264,
+                (265,
+                 (266,
+                  (272,
+                   (276,
+                    (1, 'yield'),
+                    (313,
+                     (292,
+                      (293,
+                       (294,
+                        (295,
+                         (297,
+                          (298,
+                           (299,
+                            (300,
+                             (301,
+                              (302,
+                               (303, (304, (305, (2, '1')))))))))))))))))),
+                 (4, ''))),
+               (6, ''))))),
+           (4, ''),
+           (0, ''))))
+        self.check_bad_tree(tree, "def f():\n  return 1\n  yield 1")
+
+    def test_illegal_yield_2(self):
+        # Illegal return in generator: def f(): return 1; yield 1
+        tree = \
+        (257,
+         (264,
+          (265,
+           (266,
+            (278,
+             (1, 'from'),
+             (281, (1, '__future__')),
+             (1, 'import'),
+             (279, (1, 'generators')))),
+           (4, ''))),
+         (264,
+          (285,
+           (259,
+            (1, 'def'),
+            (1, 'f'),
+            (260, (7, '('), (8, ')')),
+            (11, ':'),
+            (291,
+             (4, ''),
+             (5, ''),
+             (264,
+              (265,
+               (266,
+                (272,
+                 (275,
+                  (1, 'return'),
+                  (313,
+                   (292,
+                    (293,
+                     (294,
+                      (295,
+                       (297,
+                        (298,
+                         (299,
+                          (300,
+                           (301,
+                            (302, (303, (304, (305, (2, '1')))))))))))))))))),
+               (264,
+                (265,
+                 (266,
+                  (272,
+                   (276,
+                    (1, 'yield'),
+                    (313,
+                     (292,
+                      (293,
+                       (294,
+                        (295,
+                         (297,
+                          (298,
+                           (299,
+                            (300,
+                             (301,
+                              (302,
+                               (303, (304, (305, (2, '1')))))))))))))))))),
+                 (4, ''))),
+               (6, ''))))),
+           (4, ''),
+           (0, ''))))
+        self.check_bad_tree(tree, "def f():\n  return 1\n  yield 1")
+
+    def test_print_chevron_comma(self):
+        # Illegal input: print >>fp,
+        tree = \
+        (257,
+         (264,
+          (265,
+           (266,
+            (268,
+             (1, 'print'),
+             (35, '>>'),
+             (290,
+              (291,
+               (292,
+                (293,
+                 (295,
+                  (296,
+                   (297,
+                    (298, (299, (300, (301, (302, (303, (1, 'fp')))))))))))))),
+             (12, ','))),
+           (4, ''))),
+         (0, ''))
+        self.check_bad_tree(tree, "print >>fp,")
+
+    def test_a_comma_comma_c(self):
+        # Illegal input: a,,c
+        tree = \
+        (258,
+         (311,
+          (290,
+           (291,
+            (292,
+             (293,
+              (295,
+               (296,
+                (297,
+                 (298, (299, (300, (301, (302, (303, (1, 'a')))))))))))))),
+          (12, ','),
+          (12, ','),
+          (290,
+           (291,
+            (292,
+             (293,
+              (295,
+               (296,
+                (297,
+                 (298, (299, (300, (301, (302, (303, (1, 'c'))))))))))))))),
+         (4, ''),
+         (0, ''))
+        self.check_bad_tree(tree, "a,,c")
+
+    def test_illegal_operator(self):
+        # Illegal input: a $= b
+        tree = \
+        (257,
+         (264,
+          (265,
+           (266,
+            (267,
+             (312,
+              (291,
+               (292,
+                (293,
+                 (294,
+                  (296,
+                   (297,
+                    (298,
+                     (299,
+                      (300, (301, (302, (303, (304, (1, 'a'))))))))))))))),
+             (268, (37, '$=')),
+             (312,
+              (291,
+               (292,
+                (293,
+                 (294,
+                  (296,
+                   (297,
+                    (298,
+                     (299,
+                      (300, (301, (302, (303, (304, (1, 'b'))))))))))))))))),
+           (4, ''))),
+         (0, ''))
+        self.check_bad_tree(tree, "a $= b")
+
+    def test_malformed_global(self):
+        #doesn't have global keyword in ast
+        tree = (257,
+                (264,
+                 (265,
+                  (266,
+                   (282, (1, 'foo'))), (4, ''))),
+                (4, ''),
+                (0, ''))
+        self.check_bad_tree(tree, "malformed global ast")
+
+
+class CompileTestCase(unittest.TestCase):
+
+    # These tests are very minimal. :-(
+
+    def test_compile_expr(self):
+        st = parser.expr('2 + 3')
+        code = parser.compilest(st)
+        self.assertEquals(eval(code), 5)
+
+    def test_compile_suite(self):
+        st = parser.suite('x = 2; y = x + 3')
+        code = parser.compilest(st)
+        globs = {}
+        exec code in globs
+        self.assertEquals(globs['y'], 5)
+
+    def test_compile_error(self):
+        st = parser.suite('1 = 3 + 4')
+        self.assertRaises(SyntaxError, parser.compilest, st)
+
+def test_main():
+    test_support.run_unittest(
+        RoundtripLegalSyntaxTestCase,
+        IllegalSyntaxTestCase,
+        CompileTestCase,
+    )
+
+
+if __name__ == "__main__":
+    test_main()