83 lines
3.0 KiB
Python
83 lines
3.0 KiB
Python
|
"""Test cases for graph processing code in build.py."""
|
||
|
|
||
|
import sys
|
||
|
from typing import AbstractSet, Dict, Set, List
|
||
|
|
||
|
from mypy.test.helpers import assert_equal, Suite
|
||
|
from mypy.build import BuildManager, State, BuildSourceSet
|
||
|
from mypy.modulefinder import SearchPaths
|
||
|
from mypy.build import topsort, strongly_connected_components, sorted_components, order_ascc
|
||
|
from mypy.version import __version__
|
||
|
from mypy.options import Options
|
||
|
from mypy.report import Reports
|
||
|
from mypy.plugin import Plugin
|
||
|
from mypy.errors import Errors
|
||
|
from mypy.fscache import FileSystemCache
|
||
|
|
||
|
|
||
|
class GraphSuite(Suite):
|
||
|
|
||
|
def test_topsort(self) -> None:
|
||
|
a = frozenset({'A'})
|
||
|
b = frozenset({'B'})
|
||
|
c = frozenset({'C'})
|
||
|
d = frozenset({'D'})
|
||
|
data: Dict[AbstractSet[str], Set[AbstractSet[str]]] = {a: {b, c}, b: {d}, c: {d}}
|
||
|
res = list(topsort(data))
|
||
|
assert_equal(res, [{d}, {b, c}, {a}])
|
||
|
|
||
|
def test_scc(self) -> None:
|
||
|
vertices = {"A", "B", "C", "D"}
|
||
|
edges: Dict[str, List[str]] = {"A": ["B", "C"], "B": ["C"], "C": ["B", "D"], "D": []}
|
||
|
sccs = {frozenset(x) for x in strongly_connected_components(vertices, edges)}
|
||
|
assert_equal(sccs,
|
||
|
{frozenset({'A'}),
|
||
|
frozenset({'B', 'C'}),
|
||
|
frozenset({'D'})})
|
||
|
|
||
|
def _make_manager(self) -> BuildManager:
|
||
|
errors = Errors()
|
||
|
options = Options()
|
||
|
fscache = FileSystemCache()
|
||
|
search_paths = SearchPaths((), (), (), ())
|
||
|
manager = BuildManager(
|
||
|
data_dir='',
|
||
|
search_paths=search_paths,
|
||
|
ignore_prefix='',
|
||
|
source_set=BuildSourceSet([]),
|
||
|
reports=Reports('', {}),
|
||
|
options=options,
|
||
|
version_id=__version__,
|
||
|
plugin=Plugin(options),
|
||
|
plugins_snapshot={},
|
||
|
errors=errors,
|
||
|
flush_errors=lambda msgs, serious: None,
|
||
|
fscache=fscache,
|
||
|
stdout=sys.stdout,
|
||
|
stderr=sys.stderr,
|
||
|
)
|
||
|
return manager
|
||
|
|
||
|
def test_sorted_components(self) -> None:
|
||
|
manager = self._make_manager()
|
||
|
graph = {'a': State('a', None, 'import b, c', manager),
|
||
|
'd': State('d', None, 'pass', manager),
|
||
|
'b': State('b', None, 'import c', manager),
|
||
|
'c': State('c', None, 'import b, d', manager),
|
||
|
}
|
||
|
res = sorted_components(graph)
|
||
|
assert_equal(res, [frozenset({'d'}), frozenset({'c', 'b'}), frozenset({'a'})])
|
||
|
|
||
|
def test_order_ascc(self) -> None:
|
||
|
manager = self._make_manager()
|
||
|
graph = {'a': State('a', None, 'import b, c', manager),
|
||
|
'd': State('d', None, 'def f(): import a', manager),
|
||
|
'b': State('b', None, 'import c', manager),
|
||
|
'c': State('c', None, 'import b, d', manager),
|
||
|
}
|
||
|
res = sorted_components(graph)
|
||
|
assert_equal(res, [frozenset({'a', 'd', 'c', 'b'})])
|
||
|
ascc = res[0]
|
||
|
scc = order_ascc(graph, ascc)
|
||
|
assert_equal(scc, ['d', 'c', 'b', 'a'])
|