14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest
24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support
34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport cStringIO
44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys
54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport os
64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport tokenize
74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport ast
84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unparse
94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef read_pyfile(filename):
114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Read and return the contents of a Python source file (as a
124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    string), taking into account the file encoding."""
134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    with open(filename, "r") as pyfile:
144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        source = pyfile.read()
154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    return source
164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfor_else = """\
184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef f():
194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    for x in range(10):
204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break
214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = 2
234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z = 3
244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmwhile_else = """\
274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef g():
284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    while True:
294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        break
304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    else:
314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        y = 2
324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    z = 3
334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmrelative_import = """\
364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom . import fred
374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom .. import barney
384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom .australia import shrimp as prawns
394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass_decorator = """\
424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm@f1(arg)
434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm@f2
444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Foo: pass
454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelif1 = """\
484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif cond1:
494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite1
504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelif cond2:
514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite2
524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelse:
534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite3
544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelif2 = """\
574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif cond1:
584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite1
594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelif cond2:
604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite2
614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry_except_finally = """\
644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry:
654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite1
664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ex1:
674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite2
684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ex2:
694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite3
704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmelse:
714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite4
724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfinally:
734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    suite5
744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm"""
754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass ASTTestCase(unittest.TestCase):
774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def assertASTEqual(self, ast1, ast2):
784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dump1 = ast.dump(ast1)
794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dump2 = ast.dump(ast2)
804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertEqual(ast.dump(ast1), ast.dump(ast2))
814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def check_roundtrip(self, code1, filename="internal"):
834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST)
844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unparse_buffer = cStringIO.StringIO()
854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        unparse.Unparser(ast1, unparse_buffer)
864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        code2 = unparse_buffer.getvalue()
874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST)
884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.assertASTEqual(ast1, ast2)
894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass UnparseTestCase(ASTTestCase):
914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # Tests for specific bugs found in earlier versions of unparse
924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_del_statement(self):
944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("del x, y, z")
954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_shifts(self):
974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("45 << 2")
984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("13 >> 7")
994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_for_else(self):
1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(for_else)
1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_while_else(self):
1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(while_else)
1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_unary_parens(self):
1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("(-1)**7")
1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("(-1.)**8")
1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("(-1j)**6")
1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("not True or False")
1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("True or not False")
1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_integer_parens(self):
1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("3 .__abs__()")
1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_huge_float(self):
1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("1e1000")
1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-1e1000")
1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("1e1000j")
1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-1e1000j")
1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_min_int(self):
1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(str(-sys.maxint-1))
1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(%s)" % (sys.maxint + 1))
1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_imaginary_literals(self):
1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("7j")
1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-7j")
1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(7j)")
1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("0j")
1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-0j")
1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(0j)")
1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_negative_zero(self):
1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-0")
1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(0)")
1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-0b0")
1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(0b0)")
1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-0o0")
1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(0o0)")
1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-0x0")
1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("-(0x0)")
1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_lambda_parentheses(self):
1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("(lambda: int)()")
1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_chained_comparisons(self):
1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("1 < 4 <= 5")
1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("a is b is c is not d")
1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_function_arguments(self):
1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(): pass")
1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(a): pass")
1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(b = 2): pass")
1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(a, b): pass")
1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(a, b = 2): pass")
1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(a = 5, b = 2): pass")
1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("def f(*args, **kwargs): pass")
1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_relative_import(self):
1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(relative_import)
1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_bytes(self):
1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("b'123'")
1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_literal(self):
1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("{'a', 'b', 'c'}")
1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_set_comprehension(self):
1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("{x for x in range(5)}")
1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_dict_comprehension(self):
1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip("{x: x*x for x in range(10)}")
1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_class_decorators(self):
1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(class_decorator)
1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_elifs(self):
1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(elif1)
1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(elif2)
1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_try_except_finally(self):
1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        self.check_roundtrip(try_except_finally)
1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass DirectoryTestCase(ASTTestCase):
1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    """Test roundtrip behaviour on all files in Lib and Lib/test."""
1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    # test directories, relative to the root of the distribution
1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_directories = 'Lib', os.path.join('Lib', 'test')
1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    def test_files(self):
1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        # get names of files to test
1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        dist_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        names = []
1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for d in self.test_directories:
1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            test_dir = os.path.join(dist_dir, d)
1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            for n in os.listdir(test_dir):
1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                if n.endswith('.py') and not n.startswith('bad'):
2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                    names.append(os.path.join(test_dir, n))
2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm        for filename in names:
2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            if test_support.verbose:
2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm                print('Testing %s' % filename)
2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            source = read_pyfile(filename)
2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm            self.check_roundtrip(source)
2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main():
2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_support.run_unittest(UnparseTestCase, DirectoryTestCase)
2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm
2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == '__main__':
2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm    test_main()
214