@@ -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