import parser import pprint import sys from parser import expr, suite, sequence2ast from test_support import verbose # # 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): print s st1 = f(s) t = st1.totuple() st2 = parser.sequence2ast(t) print "Expressions:" roundtrip(expr, "foo(1)") roundtrip(expr, "[1, 2, 3]") roundtrip(expr, "[x**3 for x in range(20)]") roundtrip(expr, "[x**3 for x in range(20) if x % 3]") roundtrip(expr, "foo(*args)") roundtrip(expr, "foo(*args, **kw)") roundtrip(expr, "foo(**kw)") roundtrip(expr, "foo(key=value)") roundtrip(expr, "foo(key=value, *args)") roundtrip(expr, "foo(key=value, *args, **kw)") roundtrip(expr, "foo(key=value, **kw)") roundtrip(expr, "foo(a, b, c, *args)") roundtrip(expr, "foo(a, b, c, *args, **kw)") roundtrip(expr, "foo(a, b, c, **kw)") roundtrip(expr, "foo + bar") print print "Statements:" roundtrip(suite, "print") roundtrip(suite, "print 1") roundtrip(suite, "print 1,") roundtrip(suite, "print >>fp") roundtrip(suite, "print >>fp, 1") roundtrip(suite, "print >>fp, 1,") # # 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: sequence2ast(tree) except parser.ParserError: print "caught expected exception for invalid tree" pass else: print "test failed: did not properly detect invalid tree:" pprint.pprint(tree) # not even remotely valid: check_bad_tree((1, 2, 3), "") # 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")