catch infinite loops
This commit is contained in:
parent
47a6cd5462
commit
5d79e0ac2f
35
features/guidance/bugs.feature
Normal file
35
features/guidance/bugs.feature
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
@routing @guidance
|
||||||
|
Feature: Features related to bugs
|
||||||
|
|
||||||
|
Background:
|
||||||
|
Given the profile "car"
|
||||||
|
Given a grid size of 5 meters
|
||||||
|
|
||||||
|
@2852
|
||||||
|
Scenario: Loop
|
||||||
|
Given the node map
|
||||||
|
| a | 1 | | g | | | b |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | |
|
||||||
|
| e | | | | | | f |
|
||||||
|
| | | | | | | |
|
||||||
|
| | | | | | | 2 |
|
||||||
|
| d | | | h | | | c |
|
||||||
|
|
||||||
|
And the ways
|
||||||
|
| nodes | name | oneway |
|
||||||
|
| agb | top | yes |
|
||||||
|
| bfc | right | yes |
|
||||||
|
| chd | bottom | yes |
|
||||||
|
| dea | left | yes |
|
||||||
|
|
||||||
|
And the nodes
|
||||||
|
| node | highway |
|
||||||
|
| g | traffic_signals |
|
||||||
|
| f | traffic_signals |
|
||||||
|
| h | traffic_signals |
|
||||||
|
| e | traffic_signals |
|
||||||
|
|
||||||
|
When I route I should get
|
||||||
|
| waypoints | route | turns |
|
||||||
|
| 1,2 | top,right,right | depart,new name right,arrive |
|
@ -1158,7 +1158,6 @@ std::vector<RouteStep> buildIntersections(std::vector<RouteStep> steps)
|
|||||||
std::size_t last_valid_instruction = 0;
|
std::size_t last_valid_instruction = 0;
|
||||||
for (std::size_t step_index = 0; step_index < steps.size(); ++step_index)
|
for (std::size_t step_index = 0; step_index < steps.size(); ++step_index)
|
||||||
{
|
{
|
||||||
const auto next_step_index = step_index + 1;
|
|
||||||
auto &step = steps[step_index];
|
auto &step = steps[step_index];
|
||||||
const auto instruction = step.maneuver.instruction;
|
const auto instruction = step.maneuver.instruction;
|
||||||
if (instruction.type == TurnType::Suppressed)
|
if (instruction.type == TurnType::Suppressed)
|
||||||
|
@ -574,6 +574,9 @@ IntersectionGenerator::GetActualNextIntersection(const NodeID starting_node,
|
|||||||
NodeID node_at_intersection = starting_node;
|
NodeID node_at_intersection = starting_node;
|
||||||
EdgeID incoming_edge = via_edge;
|
EdgeID incoming_edge = via_edge;
|
||||||
|
|
||||||
|
// to prevent endless loops
|
||||||
|
const auto termination_node = node_based_graph.GetTarget(via_edge);
|
||||||
|
|
||||||
while (result.size() == 2 &&
|
while (result.size() == 2 &&
|
||||||
node_based_graph.GetEdgeData(via_edge).IsCompatibleTo(
|
node_based_graph.GetEdgeData(via_edge).IsCompatibleTo(
|
||||||
node_based_graph.GetEdgeData(result[1].turn.eid)))
|
node_based_graph.GetEdgeData(result[1].turn.eid)))
|
||||||
@ -581,6 +584,10 @@ IntersectionGenerator::GetActualNextIntersection(const NodeID starting_node,
|
|||||||
node_at_intersection = node_based_graph.GetTarget(incoming_edge);
|
node_at_intersection = node_based_graph.GetTarget(incoming_edge);
|
||||||
incoming_edge = result[1].turn.eid;
|
incoming_edge = result[1].turn.eid;
|
||||||
result = GetConnectedRoads(node_at_intersection, incoming_edge);
|
result = GetConnectedRoads(node_at_intersection, incoming_edge);
|
||||||
|
|
||||||
|
// When looping back to the original node, we obviously are in a loop. Stop there.
|
||||||
|
if (termination_node == node_based_graph.GetTarget(incoming_edge))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return output if requested
|
// return output if requested
|
||||||
|
Loading…
Reference in New Issue
Block a user