| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- """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
|