40 auto elevation_profile_nodes = road_node.children(
"elevationProfile");
42 for (
pugi::xml_node elevation_profile_node : elevation_profile_nodes) {
43 auto total_elevations = 0;
44 auto elevation_nodes = elevation_profile_node.children(
"elevation");
45 auto total_elevation_parser = std::distance(elevation_nodes.begin(), elevation_nodes.end());
48 float s = elevation_node.attribute(
"s").as_float();
53 ASSERT_EQ(total_elevations, total_elevation_parser);
65 for (
pugi::xml_node plan_view_nodes : road_node.children(
"planView")) {
66 auto geometries_parser = plan_view_nodes.children(
"geometry");
67 auto total_geometries_parser = std::distance(geometries_parser.begin(), geometries_parser.end());
68 auto total_geometries = 0;
69 for (
pugi::xml_node geometry_node : plan_view_nodes.children(
"geometry")){
70 float s = geometry_node.attribute(
"s").as_float();
72 if (geometry !=
nullptr)
75 ASSERT_EQ(total_geometries, total_geometries_parser);
84 constexpr auto error = 1e-5;
85 auto total_road_mark = 0;
86 auto total_road_mark_parser = 0;
89 auto road_mark_nodes = lane_node.children(
"roadMark");
90 total_road_mark_parser += std::distance(road_mark_nodes.begin(), road_mark_nodes.end());
92 const int lane_id = lane_node.attribute(
"id").as_int();
94 lane = lane_section.
GetLane(lane_id);
95 EXPECT_NE(lane,
nullptr);
99 const auto s_offset = road_mark_node.attribute(
"sOffset").as_double();
100 const auto type = road_mark_node.attribute(
"type").as_string();
101 const auto material = road_mark_node.attribute(
"material").as_string();
102 const auto color = road_mark_node.attribute(
"color").as_string();
104 if (road_mark !=
nullptr) {
105 EXPECT_NEAR(lane->
GetDistance() + s_offset, road_mark->GetDistance(), error);
106 EXPECT_EQ(type, road_mark->GetType());
107 EXPECT_EQ(material, road_mark->GetMaterial());
108 EXPECT_EQ(color, road_mark->GetColor());
113 return std::make_pair(total_road_mark, total_road_mark_parser);
120 auto roads_parser = open_drive_node.
children(
"road");
121 auto total_roads_parser = std::distance(roads_parser.begin(), roads_parser.end());
122 auto total_roads = map->GetMap().GetRoads().size();
123 ASSERT_EQ(total_roads, total_roads_parser);
131 auto lane_sections_parser = lanes_node.children(
"laneSection");
132 auto total_lane_sections_parser = std::distance(lane_sections_parser.begin(), lane_sections_parser.end());
133 auto total_lane_sections = map->GetMap().GetRoad(
road_id).GetLaneSections().size();
134 ASSERT_EQ(total_lane_sections, total_lane_sections_parser);
139 const double s = lane_section_node.attribute(
"s").as_double();
140 auto lane_section = map->GetMap().GetRoad(
road_id).GetLaneSectionsAt(s);
141 size_t total_lanes = 0u;
142 for (
auto it = lane_section.begin(); it != lane_section.end(); ++it) {
143 total_lanes = it->GetLanes().size();
145 auto left_nodes = lane_section_node.child(
"left").children(
"lane");
146 auto center_nodes = lane_section_node.child(
"center").children(
"lane");
147 auto right_nodes = lane_section_node.child(
"right").children(
"lane");
148 auto total_lanes_parser = std::distance(left_nodes.begin(), left_nodes.end());
149 total_lanes_parser += std::distance(right_nodes.begin(), right_nodes.end());
150 total_lanes_parser += std::distance(center_nodes.begin(), center_nodes.end());
152 ASSERT_EQ(total_lanes, total_lanes_parser);
155 auto total_road_mark = 0;
156 auto total_road_mark_parser = 0;
157 for (
auto it = lane_section.begin(); it != lane_section.end(); ++it) {
161 total_road_mark = total_left.first + total_center.first + total_right.first;
162 total_road_mark_parser = total_left.first + total_center.first + total_right.first;
164 ASSERT_EQ(total_road_mark, total_road_mark_parser);
175 auto& junctions = map->GetMap().GetJunctions();
176 auto total_junctions_parser = std::distance(open_drive_node.
children(
"junction").begin(), open_drive_node.
children(
"junction").end());
178 ASSERT_EQ(junctions.size(), total_junctions_parser);
182 auto total_connections_parser = std::distance(junction_node.children(
"connection").begin(), junction_node.children(
"connection").end());
184 JuncId junction_id = junction_node.attribute(
"id").as_int();
185 auto&
junction = junctions.find(junction_id)->second;
187 auto& connections =
junction.GetConnections();
189 ASSERT_EQ(connections.size(), total_connections_parser);
191 for (
pugi::xml_node connection_node : junction_node.children(
"connection")) {
192 auto total_lane_links_parser = std::distance(connection_node.children(
"laneLink").begin(), connection_node.children(
"laneLink").end());
194 ConId connection_id = connection_node.attribute(
"id").as_uint();
195 auto& connection = connections.find(connection_id)->second;
197 auto& lane_links = connection.lane_links;
199 ASSERT_EQ(lane_links.size(), total_lane_links_parser);
208 for (
auto &
road : map->GetMap().GetRoads()) {
209 for (
auto §ion :
road.second.GetLaneSections()) {
210 for (
auto &lane : section.GetLanes()) {
212 for (
auto link : lane.second.GetNextLanes()) {
213 ASSERT_TRUE(link !=
nullptr);
216 for (
auto link : lane.second.GetPreviousLanes()) {
217 ASSERT_TRUE(link !=
nullptr);
315 ASSERT_TRUE(m.has_value());
321 const auto topology = map.GenerateTopology();
322 ASSERT_FALSE(topology.empty());
324 auto waypoints = map.GenerateWaypoints(0.5);
325 ASSERT_FALSE(waypoints.empty());
327 const auto number_of_waypoints_to_explore =
328 std::min<size_t>(2000u, waypoints.size());
329 for (
auto i = 0u; i < number_of_waypoints_to_explore; ++i) {
330 auto wp = waypoints[i];
331 map.ComputeTransform(wp);
333 ASSERT_NE(wp, waypoints[0u]);
335 for (
auto &&successor : map.GetSuccessors(wp)) {
337 successor.road_id != wp.road_id ||
338 successor.section_id != wp.section_id ||
339 successor.lane_id != wp.lane_id ||
340 successor.s != wp.s);
343 for (
auto j = 0u; j < 200u; ++j) {
345 if (next_wps.empty()) {
348 const auto number_of_next_wps_to_explore =
349 std::min<size_t>(10u, next_wps.size());
351 for (
auto k = 0u; k < number_of_next_wps_to_explore; ++k) {
352 auto next = next_wps[k];
355 next.road_id != wp.road_id ||
356 next.section_id != wp.section_id ||
357 next.lane_id != wp.lane_id ||
359 auto right = map.GetRight(next);
360 if (right.has_value()) {
361 ASSERT_EQ(right->road_id, next.road_id);
362 ASSERT_EQ(right->section_id, next.section_id);
363 ASSERT_NE(right->lane_id, next.lane_id);
364 ASSERT_EQ(right->s, next.s);
366 auto left = map.GetLeft(next);
367 if (left.has_value()) {
368 ASSERT_EQ(left->road_id, next.road_id);
369 ASSERT_EQ(left->section_id, next.section_id);
370 ASSERT_NE(left->lane_id, next.lane_id);
371 ASSERT_EQ(left->s, next.s);
374 origin = next_wps[0u];
377 ASSERT_GT(count, 0u);
378 float seconds = 1e-3f *
static_cast<float>(stop_watch.
GetElapsedTime());
388 ASSERT_TRUE(m.has_value());
394 for (
auto i = 0u; i < 10'000u; ++i) {
396 auto owp = map.GetClosestWaypointOnRoad(location);
397 ASSERT_TRUE(owp.has_value());
399 for (
auto &next : map.GetNext(wp, 0.5)) {
401 next.road_id != wp.road_id ||
402 next.section_id != wp.section_id ||
403 next.lane_id != wp.lane_id ||
406 auto left = map.GetLeft(wp);
407 if (left.has_value()) {
408 ASSERT_EQ(left->road_id, wp.road_id);
409 ASSERT_EQ(left->section_id, wp.section_id);
410 ASSERT_NE(left->lane_id, wp.lane_id);
411 ASSERT_EQ(left->s, wp.s);
413 auto right = map.GetRight(wp);
414 if (right.has_value()) {
415 ASSERT_EQ(right->road_id, wp.road_id);
416 ASSERT_EQ(right->section_id, wp.section_id);
417 ASSERT_NE(right->lane_id, wp.lane_id);
418 ASSERT_EQ(right->s, wp.s);
421 float seconds = 1e-3f *
static_cast<float>(stop_watch.
GetElapsedTime());
472 ASSERT_TRUE(map.has_value());
473 auto stencils = map->GetAllStencilReferences();
474 ASSERT_EQ(stencils.size(), 1u);
475 EXPECT_EQ(stencils[0]->GetRoadId(), 1u);
479 const auto &map_stencils = map->GetStencils();
480 ASSERT_EQ(map_stencils.size(), 1u);
481 const auto stencil_id = stencils[0]->GetStencilId();
482 auto it = map_stencils.find(stencil_id);
483 ASSERT_NE(it, map_stencils.end());
484 EXPECT_EQ(stencils[0]->GetStencil(), it->second.get());
488 const Waypoint start{1u, 0u, -1, 0.0};
489 auto found = map->GetStencilsInDistance(start, 30.0,
false);
490 ASSERT_EQ(found.size(), 1u);
491 EXPECT_DOUBLE_EQ(found[0].accumulated_s, 5.0);