Tipragot
628be439b8
Cela permet de ne pas avoir de problèmes de compatibilité car python est dans le git.
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
|