mirror of
https://github.com/hansjone/netx.git
synced 2026-10-19 06:53:19 +08:00
Fix the 5 failing netx-topology-mcp tests.
Stale tests (behavior changed intentionally on 2026-08-12): - Tool count is 16: suggestSinkHubs and classifyTopologyFabricNodes are documented public tools; assert them by name. - compose_views is no longer a public layout action; assert it is rejected, and cover the background-job path via orbit_sweep instead. - Dual-unit petals are nested ellipse bands with a hollow eye, not parallel lanes; assert side split, ordering inside the portals and zero crossings instead of portal-aligned lane ends. Real bug (test failed since it was added on 2026-08-09): press_hot_edges could never reel a long spoke in to its r_use target, because max_disp (r0*0.55) is smaller than r0 - r_use. Inward pulls along the spoke cannot fling a leaf across the bbox, so give them a cap of r0 - r_use. On a 1483-node dev view crossings after the op drop 25501 -> 25346; a 500-node view is unchanged; runtime unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
f301544b99
commit
ed820126df
4 changed files with 63 additions and 23 deletions
|
|
@ -80,7 +80,7 @@ def test_classify_petal_and_straight() -> None:
|
|||
assert classify_dual_unit(short) == "straight"
|
||||
|
||||
|
||||
def test_beautify_parallel_lanes() -> None:
|
||||
def test_beautify_petal_ellipse_bands() -> None:
|
||||
nodes, edges = _two_eye_graph()
|
||||
st = build_state_from_nodes_edges(nodes, edges)
|
||||
unit = DualUnit(
|
||||
|
|
@ -89,15 +89,18 @@ def test_beautify_parallel_lanes() -> None:
|
|||
paths=[["p1", "a1", "a2", "p2"], ["p1", "b1", "b2", "p2"]],
|
||||
)
|
||||
pos = beautify_dual_unit_positions(st, unit, LayoutParams())
|
||||
# Parallel H/V lanes: same y in a corridor; first/last share portal x.
|
||||
assert abs(pos["a1"][1] - pos["a2"][1]) < 1e-6
|
||||
assert abs(pos["b1"][1] - pos["b2"][1]) < 1e-6
|
||||
assert abs(pos["a1"][1]) > 1.0 and abs(pos["b1"][1]) > 1.0
|
||||
# Portals sit on the x-axis, a left of b (the eye's chord).
|
||||
assert abs(pos["p1"][1]) < 1e-6 and abs(pos["p2"][1]) < 1e-6
|
||||
assert pos["p1"][0] < pos["p2"][0]
|
||||
# Each corridor is one band on its own side of the chord.
|
||||
assert pos["a1"][1] * pos["b1"][1] < 0
|
||||
assert abs(pos["a1"][0] - pos["p1"][0]) < 1e-6
|
||||
assert abs(pos["a2"][0] - pos["p2"][0]) < 1e-6
|
||||
assert abs(pos["b1"][0] - pos["p1"][0]) < 1e-6
|
||||
assert abs(pos["b2"][0] - pos["p2"][0]) < 1e-6
|
||||
for x, y in (("a1", "a2"), ("b1", "b2")):
|
||||
assert pos[x][1] * pos[y][1] > 0
|
||||
assert abs(pos[x][1]) > 1.0
|
||||
# Runs a→b, strictly inside the portals (hollow eye, no node on the chord ends).
|
||||
assert pos["p1"][0] < pos[x][0] < pos[y][0] < pos["p2"][0]
|
||||
links = [(e["a_node_id"], e["b_node_id"]) for e in edges if e["a_node_id"] in pos and e["b_node_id"] in pos]
|
||||
assert count_edge_crossings(pos, links) == 0
|
||||
|
||||
|
||||
def test_dual_mass_refine_reports_drift() -> None:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue