68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
|
"""Test cases for AST diff (used for fine-grained incremental checking)"""
|
||
|
|
||
|
from __future__ import annotations
|
||
|
|
||
|
import os
|
||
|
|
||
|
from mypy import build
|
||
|
from mypy.defaults import PYTHON3_VERSION
|
||
|
from mypy.errors import CompileError
|
||
|
from mypy.modulefinder import BuildSource
|
||
|
from mypy.nodes import MypyFile
|
||
|
from mypy.options import Options
|
||
|
from mypy.server.astdiff import compare_symbol_table_snapshots, snapshot_symbol_table
|
||
|
from mypy.test.config import test_temp_dir
|
||
|
from mypy.test.data import DataDrivenTestCase, DataSuite
|
||
|
from mypy.test.helpers import assert_string_arrays_equal, parse_options
|
||
|
|
||
|
|
||
|
class ASTDiffSuite(DataSuite):
|
||
|
files = ["diff.test"]
|
||
|
|
||
|
def run_case(self, testcase: DataDrivenTestCase) -> None:
|
||
|
first_src = "\n".join(testcase.input)
|
||
|
files_dict = dict(testcase.files)
|
||
|
second_src = files_dict["tmp/next.py"]
|
||
|
options = parse_options(first_src, testcase, 1)
|
||
|
|
||
|
messages1, files1 = self.build(first_src, options)
|
||
|
messages2, files2 = self.build(second_src, options)
|
||
|
|
||
|
a = []
|
||
|
if messages1:
|
||
|
a.extend(messages1)
|
||
|
if messages2:
|
||
|
a.append("== next ==")
|
||
|
a.extend(messages2)
|
||
|
|
||
|
assert (
|
||
|
files1 is not None and files2 is not None
|
||
|
), "cases where CompileError occurred should not be run"
|
||
|
prefix = "__main__"
|
||
|
snapshot1 = snapshot_symbol_table(prefix, files1["__main__"].names)
|
||
|
snapshot2 = snapshot_symbol_table(prefix, files2["__main__"].names)
|
||
|
diff = compare_symbol_table_snapshots(prefix, snapshot1, snapshot2)
|
||
|
for trigger in sorted(diff):
|
||
|
a.append(trigger)
|
||
|
|
||
|
assert_string_arrays_equal(
|
||
|
testcase.output, a, f"Invalid output ({testcase.file}, line {testcase.line})"
|
||
|
)
|
||
|
|
||
|
def build(self, source: str, options: Options) -> tuple[list[str], dict[str, MypyFile] | None]:
|
||
|
options.use_builtins_fixtures = True
|
||
|
options.show_traceback = True
|
||
|
options.cache_dir = os.devnull
|
||
|
options.python_version = PYTHON3_VERSION
|
||
|
options.allow_empty_bodies = True
|
||
|
try:
|
||
|
result = build.build(
|
||
|
sources=[BuildSource("main", None, source)],
|
||
|
options=options,
|
||
|
alt_lib_path=test_temp_dir,
|
||
|
)
|
||
|
except CompileError as e:
|
||
|
# TODO: Is it okay to return None?
|
||
|
return e.messages, None
|
||
|
return result.errors, result.files
|