mirror of
https://github.com/python/cpython.git
synced 2025-11-01 06:01:29 +00:00
test_unparse.py: Do roundtrip testing for all Python files in Lib and Lib/test.
This commit is contained in:
parent
8042e28192
commit
d751c2eafc
1 changed files with 46 additions and 8 deletions
|
|
@ -1,11 +1,20 @@
|
|||
import unittest
|
||||
import test.support
|
||||
|
||||
import io
|
||||
import os
|
||||
import tokenize
|
||||
import ast
|
||||
import _ast
|
||||
import unparse
|
||||
|
||||
def read_pyfile(filename):
|
||||
"""Read and return the contents of a Python source file (as a
|
||||
string), taking into account the file encoding."""
|
||||
with open(filename, "rb") as pyfile:
|
||||
encoding = tokenize.detect_encoding(pyfile.readline)[0]
|
||||
with open(filename, "r", encoding=encoding) as pyfile:
|
||||
source = pyfile.read()
|
||||
return source
|
||||
|
||||
for_else = """\
|
||||
def f():
|
||||
for x in range(10):
|
||||
|
|
@ -55,16 +64,20 @@ def h():
|
|||
class Foo: pass
|
||||
"""
|
||||
|
||||
class UnparseTestCase(unittest.TestCase):
|
||||
# Tests for specific bugs found in earlier versions of unparse
|
||||
class ASTTestCase(unittest.TestCase):
|
||||
def assertASTEqual(self, ast1, ast2):
|
||||
self.assertEqual(ast.dump(ast1), ast.dump(ast2))
|
||||
|
||||
def check_roundtrip(self, code1, filename="internal"):
|
||||
ast1 = compile(code1, filename, "exec", _ast.PyCF_ONLY_AST)
|
||||
ast1 = compile(code1, filename, "exec", ast.PyCF_ONLY_AST)
|
||||
unparse_buffer = io.StringIO()
|
||||
unparse.Unparser(ast1, unparse_buffer)
|
||||
code2 = unparse_buffer.getvalue()
|
||||
ast2 = compile(code2, filename, "exec", _ast.PyCF_ONLY_AST)
|
||||
self.assertEqual(ast.dump(ast1), ast.dump(ast2))
|
||||
ast2 = compile(code2, filename, "exec", ast.PyCF_ONLY_AST)
|
||||
self.assertASTEqual(ast1, ast2)
|
||||
|
||||
class UnparseTestCase(ASTTestCase):
|
||||
# Tests for specific bugs found in earlier versions of unparse
|
||||
|
||||
def test_del_statement(self):
|
||||
self.check_roundtrip("del x, y, z")
|
||||
|
|
@ -143,8 +156,33 @@ def test_dict_comprehension(self):
|
|||
def test_class_decorators(self):
|
||||
self.check_roundtrip(class_decorator)
|
||||
|
||||
|
||||
class DirectoryTestCase(ASTTestCase):
|
||||
"""Test roundtrip behaviour on all files in Lib and Lib/test."""
|
||||
|
||||
# test directories, relative to the root of the distribution
|
||||
test_directories = 'Lib', os.path.join('Lib', 'test')
|
||||
|
||||
def test_files(self):
|
||||
# get names of files to test
|
||||
dist_dir = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir)
|
||||
|
||||
names = []
|
||||
for d in self.test_directories:
|
||||
test_dir = os.path.join(dist_dir, d)
|
||||
for n in os.listdir(test_dir):
|
||||
if n.endswith('.py') and not n.startswith('bad'):
|
||||
names.append(os.path.join(test_dir, n))
|
||||
|
||||
for filename in names:
|
||||
if test.support.verbose:
|
||||
print('Testing %s' % filename)
|
||||
source = read_pyfile(filename)
|
||||
self.check_roundtrip(source)
|
||||
|
||||
|
||||
def test_main():
|
||||
test.support.run_unittest(UnparseTestCase)
|
||||
test.support.run_unittest(UnparseTestCase, DirectoryTestCase)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_main()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue