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