64 lines
1.8 KiB
Python
64 lines
1.8 KiB
Python
import sys
|
|
sys.path.insert(0, "/root/.hermes/wizard-outputs/beam")
|
|
from topo_levels import topo_levels, flatten, CycleError
|
|
|
|
def test_basic():
|
|
nodes = ["a","b","c","d"]
|
|
edges = [("a","c"),("b","c"),("c","d")]
|
|
levels = topo_levels(nodes, edges)
|
|
assert levels == [["a","b"],["c"],["d"]], levels
|
|
|
|
def test_disconnected():
|
|
nodes = [1,2,3]
|
|
assert topo_levels(nodes, []) == [[1,2,3]]
|
|
|
|
def test_cycle():
|
|
nodes = ["a","b","c"]
|
|
edges = [("a","b"),("b","c"),("c","a")]
|
|
try:
|
|
topo_levels(nodes, edges)
|
|
except CycleError as e:
|
|
assert set(e.remaining) == {"a","b","c"}
|
|
else:
|
|
raise AssertionError("expected CycleError")
|
|
|
|
def test_unknown_node():
|
|
try:
|
|
topo_levels(["a"], [("a","z")])
|
|
except KeyError:
|
|
pass
|
|
else:
|
|
raise AssertionError("expected KeyError")
|
|
|
|
def test_single_node_no_edges():
|
|
assert topo_levels(["x"], []) == [["x"]]
|
|
|
|
def test_diamond():
|
|
nodes = ["a","b","c","d"]
|
|
edges = [("a","b"),("a","c"),("b","d"),("c","d")]
|
|
levels = topo_levels(nodes, edges)
|
|
assert levels == [["a"],["b","c"],["d"]], levels
|
|
|
|
def test_determinism():
|
|
nodes = list("zyxwv")
|
|
edges = [("z","w"),("y","w")]
|
|
r1 = topo_levels(nodes, edges)
|
|
r2 = topo_levels(list(reversed(nodes)), edges)
|
|
assert r1 == r2, (r1, r2)
|
|
|
|
def test_flatten_roundtrip():
|
|
nodes = ["a","b","c","d","e"]
|
|
edges = [("a","c"),("b","c"),("c","d"),("c","e")]
|
|
levels = topo_levels(nodes, edges)
|
|
flat = flatten(levels)
|
|
assert sorted(flat) == sorted(nodes)
|
|
# every edge prerequisite before dependent
|
|
pos = {n:i for i,n in enumerate(flat)}
|
|
for u,v in edges:
|
|
assert pos[u] < pos[v]
|
|
|
|
if __name__ == "__main__":
|
|
for name in [n for n in globals() if n.startswith("test_")]:
|
|
globals()[name]()
|
|
print("ALL TESTS PASSED")
|