Skip to content

Commit d8a2829

Browse files
committed
test(grid-optimizer): add regression test for _break_long_link chain
Covers N=1,2,3 intermediate poles and both to_from directions. Catches the missing pole-to-pole link that left disconnected subgraphs when breaking long distribution links.
1 parent 708aeb1 commit d8a2829

1 file changed

Lines changed: 42 additions & 0 deletions

File tree

tests/test_grid_optimizer.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,3 +623,45 @@ def test_connect_grid_consumers_links_each_consumer_to_cluster_pole(
623623
assert set(optimizer.links["link_type"]) == {"connection"}
624624
assert optimizer.nodes.loc["0", "parent"] == "p-0"
625625
assert optimizer.nodes.loc["1", "parent"] == "p-0"
626+
627+
628+
def _has_link(opt: GridOptimizer, a: str, b: str) -> bool:
629+
"""Check a link between poles a and b exists in either direction."""
630+
return f"({a}, {b})" in opt.links.index or f"({b}, {a})" in opt.links.index
631+
632+
633+
@pytest.mark.parametrize("to_from", [False, True])
634+
@pytest.mark.parametrize("n_intermediate", [1, 2, 3])
635+
def test_break_long_link_creates_complete_chain(
636+
optimizer: GridOptimizer, n_intermediate: int, to_from: bool
637+
) -> None:
638+
"""Regression: _break_long_link must form an unbroken chain for any N.
639+
"""
640+
optimizer._add_node("p-from", node_type="pole", x=0.0, y=0.0)
641+
optimizer._add_node("p-to", node_type="pole", x=100.0, y=0.0)
642+
643+
inter_ids = [f"p-mid-{i}" for i in range(n_intermediate)]
644+
for i, idx in enumerate(inter_ids):
645+
x = (i + 1) * 100.0 / (n_intermediate + 1)
646+
optimizer._add_node(idx, node_type="pole", type_fixed=True, x=x, y=0.0)
647+
648+
added_poles_df = optimizer._poles().loc[inter_ids]
649+
added_poles = (added_poles_df, to_from)
650+
651+
optimizer._break_long_link("p-from", "p-to", added_poles)
652+
653+
assert len(optimizer.links) == n_intermediate + 1, (
654+
f"Expected {n_intermediate + 1} links, got {len(optimizer.links)}: "
655+
f"{list(optimizer.links.index)}"
656+
)
657+
658+
# to_from=True: poles added from mst_to direction, so chain runs in reverse.
659+
ordered_inter = list(reversed(inter_ids)) if to_from else inter_ids
660+
chain = ["p-from"] + ordered_inter + ["p-to"]
661+
for a, b in zip(chain, chain[1:]):
662+
assert _has_link(optimizer, a, b), (
663+
f"Missing link between {a} and {b}. Links present: {list(optimizer.links.index)}"
664+
)
665+
666+
for idx in inter_ids:
667+
assert optimizer.nodes.loc[idx, "how_added"] == "long-distance"

0 commit comments

Comments
 (0)