76 lines
2.7 KiB
Python
76 lines
2.7 KiB
Python
"""Identity AST transform test cases"""
|
|
|
|
import os.path
|
|
|
|
from mypy import build
|
|
from mypy.modulefinder import BuildSource
|
|
from mypy.test.helpers import (
|
|
assert_string_arrays_equal, normalize_error_messages, parse_options
|
|
)
|
|
from mypy.test.data import DataDrivenTestCase, DataSuite
|
|
from mypy.test.config import test_temp_dir
|
|
from mypy.test.visitors import TypeAssertTransformVisitor
|
|
from mypy.errors import CompileError
|
|
|
|
|
|
class TransformSuite(DataSuite):
|
|
required_out_section = True
|
|
# Reuse semantic analysis test cases.
|
|
files = ['semanal-basic.test',
|
|
'semanal-expressions.test',
|
|
'semanal-classes.test',
|
|
'semanal-types.test',
|
|
'semanal-modules.test',
|
|
'semanal-statements.test',
|
|
'semanal-abstractclasses.test',
|
|
'semanal-python2.test']
|
|
native_sep = True
|
|
|
|
def run_case(self, testcase: DataDrivenTestCase) -> None:
|
|
test_transform(testcase)
|
|
|
|
|
|
def test_transform(testcase: DataDrivenTestCase) -> None:
|
|
"""Perform an identity transform test case."""
|
|
|
|
try:
|
|
src = '\n'.join(testcase.input)
|
|
options = parse_options(src, testcase, 1)
|
|
options.use_builtins_fixtures = True
|
|
options.semantic_analysis_only = True
|
|
options.enable_incomplete_features = True
|
|
options.show_traceback = True
|
|
result = build.build(sources=[BuildSource('main', None, src)],
|
|
options=options,
|
|
alt_lib_path=test_temp_dir)
|
|
a = result.errors
|
|
if a:
|
|
raise CompileError(a)
|
|
# Include string representations of the source files in the actual
|
|
# output.
|
|
for fnam in sorted(result.files.keys()):
|
|
f = result.files[fnam]
|
|
|
|
# Omit the builtins module and files with a special marker in the
|
|
# path.
|
|
# TODO the test is not reliable
|
|
if (not f.path.endswith((os.sep + 'builtins.pyi',
|
|
'typing_extensions.pyi',
|
|
'typing.pyi',
|
|
'abc.pyi',
|
|
'sys.pyi'))
|
|
and not os.path.basename(f.path).startswith('_')
|
|
and not os.path.splitext(
|
|
os.path.basename(f.path))[0].endswith('_')):
|
|
t = TypeAssertTransformVisitor()
|
|
t.test_only = True
|
|
f = t.mypyfile(f)
|
|
a += str(f).split('\n')
|
|
except CompileError as e:
|
|
a = e.messages
|
|
if testcase.normalize_output:
|
|
a = normalize_error_messages(a)
|
|
assert_string_arrays_equal(
|
|
testcase.output, a,
|
|
f'Invalid semantic analyzer output ({testcase.file}, line {testcase.line})')
|