traverse: pass key correctly (#44460)
Fixes a bug where custom keys to identify nodes were not passed correctly.
This commit is contained in:
@@ -272,6 +272,29 @@ def test_breadth_first_versus_depth_first_tree(abstract_specs_chain):
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize("cover", ["nodes", "edges"])
|
||||||
|
@pytest.mark.parametrize("depth_first", [True, False])
|
||||||
|
def test_tree_traversal_with_key(cover, depth_first, abstract_specs_chain):
|
||||||
|
"""Compare two multisource traversals of the same DAG. In one case the DAG consists of unique
|
||||||
|
Spec instances, in the second case there are identical copies of nodes and edges. Traversal
|
||||||
|
should be equivalent when nodes are identified by dag_hash."""
|
||||||
|
a = abstract_specs_chain["chain-a"]
|
||||||
|
c = abstract_specs_chain["chain-c"]
|
||||||
|
kwargs = {"cover": cover, "depth_first": depth_first}
|
||||||
|
dag_hash = lambda s: s.dag_hash()
|
||||||
|
|
||||||
|
# Traverse DAG spanned by a unique set of Spec instances
|
||||||
|
first = traverse.traverse_tree([a, c], key=id, **kwargs)
|
||||||
|
|
||||||
|
# Traverse equivalent DAG with copies of Spec instances included, keyed by dag hash.
|
||||||
|
second = traverse.traverse_tree([a, c.copy()], key=dag_hash, **kwargs)
|
||||||
|
|
||||||
|
# Check that the same nodes are discovered at the same depth
|
||||||
|
node_at_depth_first = [(depth, dag_hash(edge.spec)) for (depth, edge) in first]
|
||||||
|
node_at_depth_second = [(depth, dag_hash(edge.spec)) for (depth, edge) in second]
|
||||||
|
assert node_at_depth_first == node_at_depth_second
|
||||||
|
|
||||||
|
|
||||||
def test_breadth_first_versus_depth_first_printing(abstract_specs_chain):
|
def test_breadth_first_versus_depth_first_printing(abstract_specs_chain):
|
||||||
"""Test breadth-first versus depth-first tree printing."""
|
"""Test breadth-first versus depth-first tree printing."""
|
||||||
s = abstract_specs_chain["chain-a"]
|
s = abstract_specs_chain["chain-a"]
|
||||||
|
@@ -563,10 +563,10 @@ def traverse_tree(
|
|||||||
# identical to DFS, which is much more efficient then.
|
# identical to DFS, which is much more efficient then.
|
||||||
if not depth_first and cover == "edges":
|
if not depth_first and cover == "edges":
|
||||||
edges, parents = breadth_first_to_tree_edges(specs, deptype, key)
|
edges, parents = breadth_first_to_tree_edges(specs, deptype, key)
|
||||||
return traverse_breadth_first_tree_edges(None, edges, parents)
|
return traverse_breadth_first_tree_edges(None, edges, parents, key)
|
||||||
elif not depth_first and cover == "nodes":
|
elif not depth_first and cover == "nodes":
|
||||||
edges = breadth_first_to_tree_nodes(specs, deptype, key)
|
edges = breadth_first_to_tree_nodes(specs, deptype, key)
|
||||||
return traverse_breadth_first_tree_nodes(None, edges)
|
return traverse_breadth_first_tree_nodes(None, edges, key)
|
||||||
|
|
||||||
return traverse_edges(specs, order="pre", cover=cover, deptype=deptype, key=key, depth=True)
|
return traverse_edges(specs, order="pre", cover=cover, deptype=deptype, key=key, depth=True)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user