| import os.path | 
 | import parser | 
 | import pprint | 
 | import sys | 
 |  | 
 | from test_support import TestFailed | 
 |  | 
 | # | 
 | #  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. | 
 | # | 
 |  | 
 | def roundtrip(f, s): | 
 |     st1 = f(s) | 
 |     t = st1.totuple() | 
 |     try: | 
 |         st2 = parser.sequence2ast(t) | 
 |     except parser.ParserError: | 
 |         raise TestFailed, s | 
 |  | 
 | def roundtrip_fromfile(filename): | 
 |     roundtrip(parser.suite, open(filename).read()) | 
 |  | 
 | def test_expr(s): | 
 |     print "expr:", s | 
 |     roundtrip(parser.expr, s) | 
 |  | 
 | def test_suite(s): | 
 |     print "suite:", s | 
 |     roundtrip(parser.suite, s) | 
 |  | 
 |  | 
 | print "Expressions:" | 
 |  | 
 | test_expr("foo(1)") | 
 | test_expr("[1, 2, 3]") | 
 | test_expr("[x**3 for x in range(20)]") | 
 | test_expr("[x**3 for x in range(20) if x % 3]") | 
 | test_expr("foo(*args)") | 
 | test_expr("foo(*args, **kw)") | 
 | test_expr("foo(**kw)") | 
 | test_expr("foo(key=value)") | 
 | test_expr("foo(key=value, *args)") | 
 | test_expr("foo(key=value, *args, **kw)") | 
 | test_expr("foo(key=value, **kw)") | 
 | test_expr("foo(a, b, c, *args)") | 
 | test_expr("foo(a, b, c, *args, **kw)") | 
 | test_expr("foo(a, b, c, **kw)") | 
 | test_expr("foo + bar") | 
 | test_expr("lambda: 0") | 
 | test_expr("lambda x: 0") | 
 | test_expr("lambda *y: 0") | 
 | test_expr("lambda *y, **z: 0") | 
 | test_expr("lambda **z: 0") | 
 | test_expr("lambda x, y: 0") | 
 | test_expr("lambda foo=bar: 0") | 
 | test_expr("lambda foo=bar, spaz=nifty+spit: 0") | 
 | test_expr("lambda foo=bar, **z: 0") | 
 | test_expr("lambda foo=bar, blaz=blat+2, **z: 0") | 
 | test_expr("lambda foo=bar, blaz=blat+2, *y, **z: 0") | 
 | test_expr("lambda x, *y, **z: 0") | 
 |  | 
 | print | 
 | print "Statements:" | 
 | test_suite("print") | 
 | test_suite("print 1") | 
 | test_suite("print 1,") | 
 | test_suite("print >>fp") | 
 | test_suite("print >>fp, 1") | 
 | test_suite("print >>fp, 1,") | 
 |  | 
 | # expr_stmt | 
 | test_suite("a") | 
 | test_suite("a = b") | 
 | test_suite("a = b = c = d = e") | 
 | test_suite("a += b") | 
 | test_suite("a -= b") | 
 | test_suite("a *= b") | 
 | test_suite("a /= b") | 
 | test_suite("a %= b") | 
 | test_suite("a &= b") | 
 | test_suite("a |= b") | 
 | test_suite("a ^= b") | 
 | test_suite("a <<= b") | 
 | test_suite("a >>= b") | 
 | test_suite("a **= b") | 
 |  | 
 | test_suite("def f(): pass") | 
 | test_suite("def f(*args): pass") | 
 | test_suite("def f(*args, **kw): pass") | 
 | test_suite("def f(**kw): pass") | 
 | test_suite("def f(foo=bar): pass") | 
 | test_suite("def f(foo=bar, *args): pass") | 
 | test_suite("def f(foo=bar, *args, **kw): pass") | 
 | test_suite("def f(foo=bar, **kw): pass") | 
 |  | 
 | test_suite("def f(a, b): pass") | 
 | test_suite("def f(a, b, *args): pass") | 
 | test_suite("def f(a, b, *args, **kw): pass") | 
 | test_suite("def f(a, b, **kw): pass") | 
 | test_suite("def f(a, b, foo=bar): pass") | 
 | test_suite("def f(a, b, foo=bar, *args): pass") | 
 | test_suite("def f(a, b, foo=bar, *args, **kw): pass") | 
 | test_suite("def f(a, b, foo=bar, **kw): pass") | 
 |  | 
 | test_suite("from sys.path import *") | 
 | test_suite("from sys.path import dirname") | 
 | test_suite("from sys.path import dirname as my_dirname") | 
 | test_suite("from sys.path import dirname, basename") | 
 | test_suite("from sys.path import dirname as my_dirname, basename") | 
 | test_suite("from sys.path import dirname, basename as my_basename") | 
 |  | 
 | test_suite("import sys") | 
 | test_suite("import sys as system") | 
 | test_suite("import sys, math") | 
 | test_suite("import sys as system, math") | 
 | test_suite("import sys, math as my_math") | 
 |  | 
 | #d = os.path.dirname(os.__file__) | 
 | #roundtrip_fromfile(os.path.join(d, "os.py")) | 
 | #roundtrip_fromfile(os.path.join(d, "test", "test_parser.py")) | 
 |  | 
 | # | 
 | #  Second, we take *invalid* trees and make sure we get ParserError | 
 | #  rejections for them. | 
 | # | 
 |  | 
 | print | 
 | print "Invalid parse trees:" | 
 |  | 
 | def check_bad_tree(tree, label): | 
 |     print | 
 |     print label | 
 |     try: | 
 |         parser.sequence2ast(tree) | 
 |     except parser.ParserError: | 
 |         print "caught expected exception for invalid tree" | 
 |     else: | 
 |         print "test failed: did not properly detect invalid tree:" | 
 |         pprint.pprint(tree) | 
 |  | 
 |  | 
 | # not even remotely valid: | 
 | check_bad_tree((1, 2, 3), "<junk>") | 
 |  | 
 | # 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, '')) | 
 |  | 
 | check_bad_tree(tree, "print >>fp,") | 
 |  | 
 | # 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, '')) | 
 |  | 
 | check_bad_tree(tree, "a,,c") | 
 |  | 
 | # 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, '')) | 
 |  | 
 | check_bad_tree(tree, "a $= b") |