summaryrefslogtreecommitdiff
path: root/tests/unit/resolution_resolvelib/test_resolver.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/resolution_resolvelib/test_resolver.py')
-rw-r--r--tests/unit/resolution_resolvelib/test_resolver.py118
1 files changed, 90 insertions, 28 deletions
diff --git a/tests/unit/resolution_resolvelib/test_resolver.py b/tests/unit/resolution_resolvelib/test_resolver.py
index b9772fb17..87c2b5f35 100644
--- a/tests/unit/resolution_resolvelib/test_resolver.py
+++ b/tests/unit/resolution_resolvelib/test_resolver.py
@@ -1,3 +1,4 @@
+from typing import Dict, List, Optional, Set, Tuple, cast
from unittest import mock
import pytest
@@ -5,6 +6,8 @@ from pip._vendor.packaging.utils import canonicalize_name
from pip._vendor.resolvelib.resolvers import Result
from pip._vendor.resolvelib.structs import DirectedGraph
+from pip._internal.index.package_finder import PackageFinder
+from pip._internal.operations.prepare import RequirementPreparer
from pip._internal.req.constructors import install_req_from_line
from pip._internal.req.req_set import RequirementSet
from pip._internal.resolution.resolvelib.resolver import (
@@ -14,30 +17,31 @@ from pip._internal.resolution.resolvelib.resolver import (
@pytest.fixture()
-def resolver(preparer, finder):
+def resolver(preparer: RequirementPreparer, finder: PackageFinder) -> Resolver:
resolver = Resolver(
preparer=preparer,
finder=finder,
wheel_cache=None,
make_install_req=mock.Mock(),
- use_user_site="not-used",
- ignore_dependencies="not-used",
- ignore_installed="not-used",
- ignore_requires_python="not-used",
- force_reinstall="not-used",
+ use_user_site=False,
+ ignore_dependencies=False,
+ ignore_installed=False,
+ ignore_requires_python=False,
+ force_reinstall=False,
upgrade_strategy="to-satisfy-only",
)
return resolver
-def _make_graph(edges):
- """Build graph from edge declarations.
- """
+def _make_graph(
+ edges: List[Tuple[Optional[str], Optional[str]]]
+) -> "DirectedGraph[Optional[str]]":
+ """Build graph from edge declarations."""
- graph = DirectedGraph()
+ graph: "DirectedGraph[Optional[str]]" = DirectedGraph()
for parent, child in edges:
- parent = canonicalize_name(parent) if parent else None
- child = canonicalize_name(child) if child else None
+ parent = cast(str, canonicalize_name(parent)) if parent else None
+ child = cast(str, canonicalize_name(child)) if child else None
for v in (parent, child):
if v not in graph:
graph.add(v)
@@ -77,12 +81,16 @@ def _make_graph(edges):
),
],
)
-def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
+def test_new_resolver_get_installation_order(
+ resolver: Resolver,
+ edges: List[Tuple[Optional[str], Optional[str]]],
+ ordered_reqs: List[str],
+) -> None:
graph = _make_graph(edges)
# Mapping values and criteria are not used in test, so we stub them out.
mapping = {vertex: None for vertex in graph if vertex is not None}
- resolver._result = Result(mapping, graph, criteria=None)
+ resolver._result = Result(mapping, graph, criteria=None) # type: ignore
reqset = RequirementSet()
for r in ordered_reqs:
@@ -94,7 +102,7 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
@pytest.mark.parametrize(
- "name, edges, expected_weights",
+ "name, edges, requirement_keys, expected_weights",
[
(
# From https://github.com/pypa/pip/pull/8127#discussion_r414564664
@@ -107,7 +115,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("three", "four"),
("four", "five"),
],
- {None: 0, "one": 1, "two": 1, "three": 2, "four": 3, "five": 4},
+ {"one", "two", "three", "four", "five"},
+ {"five": 5, "four": 4, "one": 4, "three": 2, "two": 1},
),
(
"linear",
@@ -118,7 +127,20 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("three", "four"),
("four", "five"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ ),
+ (
+ "linear AND restricted",
+ [
+ (None, "one"),
+ ("one", "two"),
+ ("two", "three"),
+ ("three", "four"),
+ ("four", "five"),
+ ],
+ {"one", "three", "five"},
+ {"one": 1, "three": 3, "five": 5},
),
(
"linear AND root -> two",
@@ -130,7 +152,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
(None, "two"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND root -> three",
@@ -142,7 +165,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
(None, "three"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND root -> four",
@@ -154,7 +178,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
(None, "four"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND root -> five",
@@ -166,7 +191,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
(None, "five"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND one -> four",
@@ -178,7 +204,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
("one", "four"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND two -> four",
@@ -190,7 +217,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
("two", "four"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND four -> one (cycle)",
@@ -202,7 +230,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
("four", "one"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND four -> two (cycle)",
@@ -214,7 +243,8 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
("four", "two"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
),
(
"linear AND four -> three (cycle)",
@@ -226,12 +256,44 @@ def test_new_resolver_get_installation_order(resolver, edges, ordered_reqs):
("four", "five"),
("four", "three"),
],
- {None: 0, "one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ {"one", "two", "three", "four", "five"},
+ {"one": 1, "two": 2, "three": 3, "four": 4, "five": 5},
+ ),
+ (
+ "linear AND four -> three (cycle) AND restricted 1-2-3",
+ [
+ (None, "one"),
+ ("one", "two"),
+ ("two", "three"),
+ ("three", "four"),
+ ("four", "five"),
+ ("four", "three"),
+ ],
+ {"one", "two", "three"},
+ {"one": 1, "two": 2, "three": 3},
+ ),
+ (
+ "linear AND four -> three (cycle) AND restricted 4-5",
+ [
+ (None, "one"),
+ ("one", "two"),
+ ("two", "three"),
+ ("three", "four"),
+ ("four", "five"),
+ ("four", "three"),
+ ],
+ {"four", "five"},
+ {"four": 4, "five": 5},
),
],
)
-def test_new_resolver_topological_weights(name, edges, expected_weights):
+def test_new_resolver_topological_weights(
+ name: str,
+ edges: List[Tuple[Optional[str], Optional[str]]],
+ requirement_keys: Set[str],
+ expected_weights: Dict[Optional[str], int],
+) -> None:
graph = _make_graph(edges)
- weights = get_topological_weights(graph, len(expected_weights))
+ weights = get_topological_weights(graph, requirement_keys)
assert weights == expected_weights