Preserve settled route budgets and paths during edge previews

This commit is contained in:
2026-09-05 20:41:00 +03:00
parent 68b1efff70
commit 30c7db105a
2 changed files with 91 additions and 0 deletions
+57
View File
@@ -614,6 +614,63 @@ fn single_edge_preview_matches_settled_geometry_and_preserves_other_routes() {
assert_eq!(preview.bounds, complete.bounds);
}
#[test]
fn exhausted_search_budget_survives_label_and_pin_previews() {
let (mut p, d, original) = maze();
// Valid reuse of one typed port pair: many distinct exchanges through the
// same multi-turn corridor exhaust the shared per-view search budget.
let template = p.relations.remove(&original).unwrap();
for i in 0..1500 {
let mut edge = template.clone();
edge.id = Id::from_u128(100 + i);
edge.alias = format!("budget_flow_{i}");
p.relations.insert(edge.id, edge);
}
validate_candidate(&p).unwrap();
let view = projected(&p, d);
let baseline = route_diagram(&p, &p.diagrams[&d], &view);
let exhausted = baseline
.edges
.values()
.find(|edge| edge.warnings.contains(&RouteWarning::SearchBudgetExhausted))
.expect("Fixture must exhaust the cumulative budget");
let id = exhausted.id;
set_route(
&mut p,
d,
id,
vec![],
Some(EdgeLabel {
fraction: exhausted.label.fraction,
offset: point(0., -40.),
}),
);
let label_preview = route_edge_preview(&p, &p.diagrams[&d], &view, &baseline, id);
assert_eq!(label_preview.edges[&id].points, exhausted.points);
assert_eq!(
label_preview.edges[&id].pin_fractions,
exhausted.pin_fractions
);
assert_eq!(label_preview.edges[&id].warnings, exhausted.warnings);
assert_ne!(
label_preview.edges[&id].label.center,
exhausted.label.center
);
assert_eq!(
label_preview.edges[&id],
route_diagram(&p, &p.diagrams[&d], &view).edges[&id]
);
// Adding a pin requires actual rerouting. Its inherited pre-edge budget
// must agree with the full solve, rather than obtaining a fresh view budget.
p.diagrams.get_mut(&d).unwrap().routes[0]
.waypoints
.push(point(650., 400.));
let pin_preview = route_edge_preview(&p, &p.diagrams[&d], &view, &baseline, id);
let full = route_diagram(&p, &p.diagrams[&d], &view);
assert_eq!(pin_preview.edges[&id], full.edges[&id]);
assert!(pin_preview.edges[&id].points.contains(&point(650., 400.)));
}
#[test]
fn interpolation_projection_empty_and_repeated_points_are_well_defined() {
assert_eq!(point_along_polyline(&[], 0.5), None);