Branch data Line data Source code
1 : : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 : : //
3 : : // Copyright (C) 2018-2021 Intel Corporation
4 : : //
5 : : // SPDX-License-Identifier: MIT
6 : : //
7 : : // ----------------- END LICENSE BLOCK -----------------------------------
8 : :
9 : : #include <ad/map/access/Factory.hpp>
10 : : #include <ad/map/access/Operation.hpp>
11 : : #include <ad/map/lane/BorderOperation.hpp>
12 : : #include <ad/map/lane/LaneOperation.hpp>
13 : : #include <ad/map/match/AdMapMatching.hpp>
14 : : #include <ad/map/point/Operation.hpp>
15 : : #include <ad/map/route/LaneIntervalOperation.hpp>
16 : : #include <ad/map/serialize/SerializerFileCRC32.hpp>
17 : : #include <ad/map/test_support/NoLogTestMacros.hpp>
18 : : #include <gtest/gtest.h>
19 : : #include "../../src/lane/LaneOperationPrivate.hpp"
20 : : #include "../point/RandomGeometry.hpp"
21 : :
22 : : using namespace ::ad;
23 : : using namespace ::ad::map;
24 : : using namespace ::ad::map::point;
25 : : using namespace ::ad::map::lane;
26 : :
27 : : struct LaneOperationTest : ::testing::Test
28 : : {
29 : 8 : LaneOperationTest()
30 : 8 : {
31 : 8 : }
32 : :
33 : 8 : virtual void SetUp()
34 : : {
35 : 8 : }
36 : 8 : virtual void TearDown()
37 : : {
38 : 8 : access::cleanup();
39 : 8 : }
40 : 4 : void setupSingleLongLane()
41 : : {
42 [ + - + - : 4 : mStorePtr.reset(new access::Store());
+ - ]
43 [ + - + - ]: 4 : pFactory.reset(new access::Factory(*mStorePtr));
44 : : // setup one single long lane
45 : : point::GeoPoint bottomRight
46 : 4 : = point::createGeoPoint(point::Longitude(8.44937788), point::Latitude(49.00736837), point::Altitude(0.));
47 : : point::GeoPoint upRight
48 : 4 : = point::createGeoPoint(point::Longitude(8.45010064), point::Latitude(49.00884320), point::Altitude(0.));
49 : : point::GeoPoint bottomLeft
50 : 4 : = point::createGeoPoint(point::Longitude(8.44933898), point::Latitude(49.00737633), point::Altitude(0.));
51 : : point::GeoPoint upLeft
52 : 4 : = point::createGeoPoint(point::Longitude(8.45006151), point::Latitude(49.00885163), point::Altitude(0.));
53 : :
54 : 8 : point::ECEFEdge rightPoints;
55 [ + - + - ]: 4 : rightPoints.push_back(point::toECEF(bottomRight));
56 [ + - + - ]: 4 : rightPoints.push_back(point::toECEF(upRight));
57 [ + - ]: 4 : rightEdge = point::createGeometry(rightPoints, false);
58 : 4 : point::ECEFEdge leftPoints;
59 [ + - + - ]: 4 : leftPoints.push_back(point::toECEF(bottomLeft));
60 [ + - + - ]: 4 : leftPoints.push_back(point::toECEF(upLeft));
61 [ + - ]: 4 : leftEdge = point::createGeometry(leftPoints, false);
62 [ + - ]: 4 : pFactory->set(access::TrafficType::RIGHT_HAND_TRAFFIC);
63 : :
64 [ + - ]: 4 : pFactory->add(access::PartitionId(0), laneId, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
65 : :
66 [ + - ]: 4 : pFactory->set(laneId, leftEdge, rightEdge);
67 [ + - ]: 4 : access::init(mStorePtr);
68 : 4 : }
69 : : lane::LaneId laneId{4711};
70 : : point::Geometry leftEdge;
71 : : point::Geometry rightEdge;
72 : : access::Store::Ptr mStorePtr;
73 : : std::shared_ptr<access::Factory> pFactory;
74 : : };
75 : :
76 : 2 : TEST_F(LaneOperationTest, getLane)
77 : : {
78 [ + - + - : 1 : ASSERT_TRUE(access::init("test_files/TPK.adm.txt"));
- + - - -
- - - -
- ]
79 : 1 : auto pos = point::createGeoPoint(point::Longitude(8.4398011), point::Latitude(49.0188015), point::Altitude(0.));
80 : 1 : auto bad = point::createGeoPoint(point::Longitude(9.), point::Latitude(9.), point::Altitude(0.));
81 [ + - + - : 2 : EXPECT_THROW(lane::uniqueLaneId(bad), std::runtime_error);
+ - - + -
+ - - - -
- - - - ]
82 [ + - ]: 1 : lane::LaneId id = lane::uniqueLaneId(pos);
83 [ + - + - ]: 2 : auto lane = lane::getLane(id);
84 [ + - - + : 1 : EXPECT_EQ(id, lane.id);
- - - - -
- ]
85 : : }
86 : :
87 : 2 : TEST_F(LaneOperationTest, getPointsOfInterest)
88 : : {
89 [ + - + - : 1 : ASSERT_TRUE(access::init("test_files/Town01.txt"));
- + - - -
- - - -
- ]
90 : 1 : auto pos = point::createGeoPoint(point::Longitude(0.00193915337), point::Latitude(-0.00295), point::Altitude(0.));
91 : 1 : std::vector<config::PointOfInterest> poI;
92 [ + - ]: 1 : poI = access::getPointsOfInterest(pos, physics::Distance(1.0));
93 [ + - - + : 1 : ASSERT_EQ(poI.size(), 0u);
- - - - -
- ]
94 [ + - ]: 1 : poI = access::getPointsOfInterest(pos, physics::Distance(5.0));
95 [ + - - + : 1 : ASSERT_EQ(poI.size(), 1u);
- - - - -
- ]
96 [ + - + - : 2 : ASSERT_EQ(poI.front().name, std::string("T1"));
- + - - -
- - - ]
97 : : }
98 : :
99 : 2 : TEST_F(LaneOperationTest, getLaneHeading)
100 : : {
101 [ + - + - : 1 : ASSERT_TRUE(access::init("test_files/TPK.adm.txt"));
- + - - -
- - - -
- ]
102 : :
103 : 1 : std::vector<::point::ENUHeading> headings;
104 : 1 : std::vector<match::MapMatchedPosition> mapMatchedPositions;
105 : 1 : match::MapMatchedPosition position;
106 : : position.lanePoint.paraPoint.laneId = lane::uniqueLaneId(
107 [ + - ]: 1 : point::createGeoPoint(point::Longitude(8.4398011), point::Latitude(49.0188015), point::Altitude(0.)));
108 : 1 : position.lanePoint.paraPoint.parametricOffset = physics::ParametricValue(0.5);
109 : 1 : position.lanePoint.lateralT = physics::RatioValue(0.5);
110 : : position.matchedPoint = point::toECEF(
111 [ + - ]: 1 : point::createGeoPoint(point::Longitude(8.4401510), point::Latitude(49.0191792), point::Altitude(0.)));
112 [ + - ]: 1 : mapMatchedPositions.push_back(position);
113 : : position.lanePoint.paraPoint.laneId = lane::uniqueLaneId(
114 [ + - ]: 1 : point::createGeoPoint(point::Longitude(8.4398226), point::Latitude(49.0187687), point::Altitude(0.)));
115 [ + - ]: 1 : mapMatchedPositions.push_back(position);
116 : :
117 [ + + ]: 3 : for (auto mapMatchedPosition : mapMatchedPositions)
118 : : {
119 [ + - + - ]: 2 : headings.push_back(lane::getLaneENUHeading(mapMatchedPosition));
120 : : }
121 [ + - - + : 1 : ASSERT_EQ(2u, headings.size());
- - - - -
- ]
122 : : // since the two lanes are in opposite direction, the heading should differ by PI
123 [ + - - + : 1 : ASSERT_NEAR(static_cast<double>(headings[0]) + M_PI, static_cast<double>(headings[1]), 0.1);
- - - - -
- ]
124 : 1 : headings.clear();
125 : : }
126 : :
127 : 2 : TEST_F(LaneOperationTest, findNearestPointOnEdge)
128 : : {
129 [ + - ]: 1 : setupSingleLongLane();
130 [ + - + - ]: 2 : auto lane = lane::getLane(laneId);
131 : : // perform query
132 : : point::GeoPoint requestPoint
133 : 1 : = point::createGeoPoint(point::Longitude(8.4493674), point::Latitude(49.0073880), point::Altitude(0.));
134 : :
135 : 1 : match::MapMatchedPosition mmpos;
136 [ + - + - : 1 : EXPECT_TRUE(lane::findNearestPointOnLane(lane, point::toECEF(requestPoint), mmpos));
- + - - -
- - - -
- ]
137 [ + - - + : 1 : EXPECT_EQ(mmpos.type, match::MapMatchedPositionType::LANE_IN);
- - - - -
- ]
138 : : point::GeoPoint requestPointVeryClose
139 : 1 : = point::createGeoPoint(point::Longitude(8.4493662), point::Latitude(49.0073866), point::Altitude(0.));
140 [ + - + - : 1 : EXPECT_TRUE(lane::findNearestPointOnLane(lane, point::toECEF(requestPointVeryClose), mmpos));
- + - - -
- - - -
- ]
141 [ + - - + : 1 : EXPECT_EQ(mmpos.type, match::MapMatchedPositionType::LANE_IN);
- - - - -
- ]
142 : : point::GeoPoint requestPointVeryFar
143 : 1 : = point::createGeoPoint(point::Longitude(9.4493662), point::Latitude(49.0073866), point::Altitude(0.));
144 [ + - + - : 1 : EXPECT_TRUE(lane::findNearestPointOnLane(lane, point::toECEF(requestPointVeryFar), mmpos));
- + - - -
- - - -
- ]
145 [ + - - + : 1 : EXPECT_EQ(mmpos.type, match::MapMatchedPositionType::LANE_RIGHT);
- - - - -
- ]
146 : : // write map for convenience
147 [ + - ]: 2 : serialize::SerializerFileCRC32 serializer(true);
148 : 1 : size_t versionMajorWrite = ::ad::map::serialize::SerializerFileCRC32::VERSION_MAJOR;
149 : 1 : size_t versionMinorWrite = ::ad::map::serialize::SerializerFileCRC32::VERSION_MINOR;
150 [ + - + - ]: 1 : serializer.open("test_files/test_straight.adm", versionMajorWrite, versionMinorWrite);
151 [ + - + - ]: 1 : access::getStore().save(serializer);
152 [ + - ]: 1 : serializer.close();
153 : 1 : }
154 : :
155 : 2 : TEST_F(LaneOperationTest, LaneRelation)
156 : : {
157 [ + - ]: 1 : setupSingleLongLane();
158 : 1 : ECEFEdge edge_ecef1, edge_ecef2, edge_ecef3, edge_ecef4;
159 : 1 : Geometry geo1, geo2, geo3, geo4;
160 [ + - ]: 1 : ECEFPoint basePoint = randECEFPoint();
161 : 1 : lane::LaneId x11, x12;
162 : 1 : access::PartitionId p(0);
163 : 1 : uint32_t i = 100;
164 : 1 : x11 = lane::LaneId(i++);
165 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
166 [ + - - + : 1 : ASSERT_TRUE(pFactory->set(x11, geo3, geo4));
- - - - -
- - - ]
167 : :
168 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(1, 4, 0));
169 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
170 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(1, 2, 0));
171 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 0));
172 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
173 : 1 : x11 = lane::LaneId(i++);
174 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
175 [ + - - + : 1 : ASSERT_TRUE(pFactory->set(x11, geo1, geo4));
- - - - -
- - - ]
176 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
177 : 1 : x11 = lane::LaneId(i++);
178 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
179 [ + - - + : 1 : ASSERT_TRUE(pFactory->set(x11, geo3, geo1));
- - - - -
- - - ]
180 : :
181 : 1 : edge_ecef1.clear();
182 : 1 : edge_ecef2.clear();
183 : 1 : x11 = lane::LaneId(i++);
184 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
185 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(1, 4, 0));
186 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
187 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(1, 2, 0));
188 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 0));
189 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
190 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
191 [ + - ]: 1 : pFactory->set(x11, geo1, geo2);
192 : 1 : edge_ecef1.clear();
193 : 1 : edge_ecef2.clear();
194 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
195 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(7, 4, 0));
196 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 0));
197 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(7, 2, 0));
198 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
199 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
200 : 1 : x12 = lane::LaneId(i++);
201 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
202 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
203 [ + - + - : 1 : ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
+ - - + -
- - - - -
- - ]
204 [ + - + - : 1 : ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
+ - - + -
- - - - -
- - ]
205 [ + - ]: 1 : geo1 = createGeometry(edge_ecef2, false);
206 [ + - ]: 1 : geo2 = createGeometry(edge_ecef1, false);
207 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
208 [ + - + - : 1 : ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
+ - - + -
- - - - -
- - ]
209 [ + - + - : 1 : ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
+ - - + -
- - - - -
- - ]
210 : :
211 : 1 : edge_ecef1.clear();
212 : 1 : edge_ecef2.clear();
213 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 0));
214 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(7, 4, 0));
215 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 4, 0));
216 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 7, 0));
217 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
218 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
219 : 1 : x12 = lane::LaneId(i++);
220 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
221 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
222 [ + - + - : 1 : ASSERT_TRUE(isVanishingLaneStart(*(lane::getLanePtr(x12))));
- + - - -
- - - -
- ]
223 : :
224 : 1 : edge_ecef1.clear();
225 : 1 : edge_ecef2.clear();
226 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(2, 4, 0));
227 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(8, 8, 0));
228 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 4, 0));
229 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(8, 8, 0));
230 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
231 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
232 : 1 : x12 = lane::LaneId(i++);
233 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
234 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
235 [ + - + - : 1 : ASSERT_TRUE(isVanishingLaneEnd(*(lane::getLanePtr(x12))));
- + - - -
- - - -
- ]
236 : :
237 : 1 : edge_ecef1.clear();
238 : 1 : edge_ecef2.clear();
239 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(1, 4, 1));
240 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(4, 4, 1));
241 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(1, 2, 1));
242 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(4, 2, 1));
243 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
244 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
245 : 1 : x12 = lane::LaneId(i++);
246 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
247 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
248 : :
249 : 1 : point::ParaPoint para1;
250 : 1 : para1.laneId = x12;
251 : 1 : para1.parametricOffset = physics::ParametricValue(0.5);
252 [ + - + - : 1 : ASSERT_EQ(calcWidth(x12, physics::ParametricValue(0.5)), physics::Distance(2.));
- + - - -
- - - ]
253 [ + - + - : 1 : ASSERT_EQ(calcWidth(para1), physics::Distance(2.));
- + - - -
- - - ]
254 : :
255 : 1 : match::LaneOccupiedRegion occupiedRegion;
256 : 1 : occupiedRegion.laneId = x12;
257 : 1 : occupiedRegion.longitudinalRange.minimum = physics::ParametricValue(0.2);
258 : 1 : occupiedRegion.longitudinalRange.maximum = physics::ParametricValue(0.8);
259 : 1 : occupiedRegion.lateralRange.minimum = physics::ParametricValue(0.3);
260 : 1 : occupiedRegion.lateralRange.maximum = physics::ParametricValue(0.7);
261 [ + - + - : 1 : ASSERT_EQ(calcWidth(occupiedRegion), physics::Distance(2.) * 0.4);
+ - - + -
- - - -
- ]
262 [ + - + - : 1 : ASSERT_EQ(calcLength(occupiedRegion), calcLength(x12) * 0.6);
+ - + - -
+ - - - -
- - ]
263 : :
264 : 1 : ECEFPoint ecef_pt1;
265 : : ecef_pt1 = getProjectedParametricPoint(
266 [ + - + - ]: 1 : *(lane::getLanePtr(x12)), physics::ParametricValue(0.5), physics::ParametricValue(0.5));
267 [ + - + - : 1 : ASSERT_EQ(ecef_pt1, basePoint + createECEFPoint(2.5, 3, 1));
- + - - -
- - - ]
268 [ + - - + : 1 : ASSERT_FALSE(isSuccessorOrPredecessor(x11, x12));
- - - - -
- - - ]
269 : :
270 : 1 : edge_ecef1.clear();
271 : 1 : edge_ecef2.clear();
272 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10, 4, 1));
273 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10, 8, 1));
274 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
275 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 4, 1));
276 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(14, 8, 1));
277 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
278 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
279 : 1 : x11 = lane::LaneId(i++);
280 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
281 [ + - ]: 1 : pFactory->set(x11, geo1, geo2);
282 : :
283 : 1 : edge_ecef1.clear();
284 : 1 : edge_ecef2.clear();
285 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10, 8, 1));
286 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
287 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 12, 1));
288 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(14, 12, 1));
289 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
290 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
291 : 1 : x12 = lane::LaneId(i++);
292 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
293 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
294 [ + - + - : 1 : ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
+ - - + -
- - - - -
- - ]
295 : :
296 : 1 : edge_ecef1.clear();
297 : 1 : edge_ecef2.clear();
298 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 8, 1));
299 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(14, 8, 1));
300 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10, 12, 1));
301 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 12, 1));
302 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
303 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
304 : 1 : x12 = lane::LaneId(i++);
305 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
306 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
307 [ + - + - : 1 : ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
+ - - + -
- - - - -
- - ]
308 : :
309 : 1 : edge_ecef1.clear();
310 : 1 : edge_ecef2.clear();
311 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 8, 1));
312 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 12, 1));
313 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
314 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10, 8, 1));
315 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 8, 1));
316 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
317 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
318 : 1 : x12 = lane::LaneId(i++);
319 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
320 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
321 [ + - + - : 1 : ASSERT_TRUE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
+ - - + -
- - - - -
- - ]
322 : :
323 : 1 : edge_ecef1.clear();
324 : 1 : edge_ecef2.clear();
325 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 6, 1));
326 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10, 12, 1));
327 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 7, 1));
328 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10, 6, 1));
329 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(14, 7, 1));
330 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
331 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
332 : 1 : x12 = lane::LaneId(i++);
333 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
334 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
335 [ + - + - : 1 : ASSERT_FALSE(isPyhsicalSuccessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
+ - - + -
- - - - -
- - ]
336 : :
337 : 1 : edge_ecef1.clear();
338 : 1 : edge_ecef2.clear();
339 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20, 4, 1));
340 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20, 8, 1));
341 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(24, 8, 1));
342 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(20, 4, 1));
343 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(24, 8, 1));
344 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
345 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
346 : 1 : x11 = lane::LaneId(i++);
347 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
348 [ + - ]: 1 : pFactory->set(x11, geo1, geo2);
349 : :
350 : 1 : edge_ecef1.clear();
351 : 1 : edge_ecef2.clear();
352 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20, 4, 1));
353 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(24, 8, 1));
354 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(20, 8, 1));
355 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(24, 12, 1));
356 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
357 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
358 : 1 : x12 = lane::LaneId(i++);
359 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
360 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
361 [ + - + - : 1 : ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
+ - - + -
- - - - -
- - ]
362 : :
363 : 1 : edge_ecef1.clear();
364 : 1 : edge_ecef2.clear();
365 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(20, 4, 1));
366 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(24, 8, 1));
367 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20, 8, 1));
368 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(24, 12, 1));
369 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
370 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
371 : 1 : x12 = lane::LaneId(i++);
372 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
373 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
374 [ + - + - : 1 : ASSERT_TRUE(isPhysicalPredecessor(*(lane::getLanePtr(x11)), *(lane::getLanePtr(x12))));
+ - - + -
- - - - -
- - ]
375 : :
376 : 1 : edge_ecef1.clear();
377 : 1 : edge_ecef2.clear();
378 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(24, 8, 1));
379 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(24, 4, 1));
380 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20, 8, 1));
381 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(24, 8, 1));
382 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(20, 8, 1));
383 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
384 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
385 : 1 : x12 = lane::LaneId(i++);
386 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
387 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
388 [ + - + - : 1 : ASSERT_FALSE(isPhysicalPredecessor(*(lane::getLanePtr(x12)), *(lane::getLanePtr(x11))));
+ - - + -
- - - - -
- - ]
389 : : }
390 : :
391 : 2 : TEST_F(LaneOperationTest, LanePoint)
392 : : {
393 [ + - ]: 1 : setupSingleLongLane();
394 [ + - + - : 2 : EXPECT_THROW_NO_LOG(lane::getLane(lane::LaneId(3811)), std::invalid_argument);
+ - + - +
- + - - +
- + - - -
- - - + -
- - ]
395 : :
396 : 1 : lane::Lane badLane;
397 : 1 : physics::ParametricValue leftPara(0.1);
398 : 1 : physics::ParametricValue rightPara(0.1);
399 [ + - + - : 1 : ASSERT_FALSE(isValid(getParametricPoint(badLane, leftPara, rightPara)));
- + - - -
- - - -
- ]
400 [ + - + - ]: 1 : auto lane = lane::getLane(laneId);
401 : :
402 : 1 : ECEFEdge edge_ecef1, edge_ecef2, edge_ecef3, edge_ecef4;
403 : 1 : Geometry geo1, geo2, geo3, geo4;
404 [ + - ]: 1 : ECEFPoint basePoint = randECEFPoint();
405 : 1 : lane::LaneId x11, x12, x13;
406 : 1 : access::PartitionId p(0);
407 : 1 : uint32_t i = 100;
408 : 1 : ECEFPoint ecef_pt1;
409 : 1 : point::ParaPoint para1;
410 : :
411 [ + - ]: 1 : CoordinateTransform mCoordinateTransform;
412 : 1 : edge_ecef1.clear();
413 : 1 : edge_ecef2.clear();
414 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(10., 200., 300.));
415 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20., 200., 300.));
416 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(10., 300., 300.));
417 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(20., 300., 300.));
418 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
419 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
420 : 1 : x11 = lane::LaneId(i++);
421 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
422 [ + - ]: 1 : pFactory->set(x11, geo1, geo2);
423 [ + - + - ]: 1 : ecef_pt1 = getParametricPoint(*(lane::getLanePtr(x11)), physics::ParametricValue(0.5), physics::ParametricValue(0.5));
424 [ + - + - : 1 : ASSERT_EQ(ecef_pt1, basePoint + createECEFPoint(15., 250., 300.));
- + - - -
- - - ]
425 : :
426 [ + - ]: 1 : GeoPoint geo_pt1 = toGeo(basePoint);
427 : 1 : ENUPoint enu1, enu2;
428 [ + - ]: 1 : access::setENUReferencePoint(geo_pt1);
429 : 1 : para1.laneId = x11;
430 : 1 : para1.parametricOffset = physics::ParametricValue(0.5);
431 [ + - ]: 1 : enu2 = map::lane::getENULanePoint(para1, physics::ParametricValue(0.5));
432 [ + - + - ]: 1 : mCoordinateTransform.setENUReferencePoint(access::getENUReferencePoint());
433 [ + - ]: 1 : enu1 = mCoordinateTransform.ECEF2ENU(ecef_pt1);
434 [ + - - + : 1 : ASSERT_EQ(enu1, enu2);
- - - - -
- ]
435 : :
436 : 1 : point::ParaPoint para2;
437 : 1 : point::ENUHeading laneHeading;
438 : 1 : point::ENUHeading inverseLaneHeading;
439 [ + - ]: 1 : laneHeading = lane::getLaneENUHeading(para1);
440 [ + - ]: 1 : inverseLaneHeading = point::createENUHeading(M_PI_2);
441 : 1 : edge_ecef1.clear();
442 : 1 : edge_ecef2.clear();
443 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(20., 200., 300.));
444 [ + - + - ]: 1 : edge_ecef1.push_back(basePoint + createECEFPoint(30., 200., 300.));
445 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(20., 300., 300.));
446 [ + - + - ]: 1 : edge_ecef2.push_back(basePoint + createECEFPoint(30., 300., 300.));
447 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
448 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
449 : 1 : x12 = lane::LaneId(i++);
450 [ + - ]: 1 : pFactory->add(p, x12, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
451 [ + - ]: 1 : pFactory->set(x12, geo1, geo2);
452 : 1 : lane::ContactLocation left(lane::ContactLocation::LEFT);
453 [ + - ]: 1 : lane::ContactTypeList free({lane::ContactType::FREE});
454 : 1 : restriction::Restriction all_vehicles;
455 : : all_vehicles.roadUserTypes
456 [ + - ]: 1 : = {restriction::RoadUserType::CAR, restriction::RoadUserType::BUS, restriction::RoadUserType::TRUCK};
457 : 1 : restriction::RestrictionList all_vehicles_list;
458 [ + - ]: 1 : all_vehicles_list.push_back(all_vehicles);
459 : 1 : restriction::Restrictions all_vehicle_restrs;
460 [ + - ]: 1 : all_vehicle_restrs.conjunctions = all_vehicles_list;
461 [ + - - + : 1 : ASSERT_TRUE(pFactory->add(x11, x12, left, free, all_vehicle_restrs));
- - - - -
- - - ]
462 [ + - - + : 1 : ASSERT_TRUE(projectPositionToLaneInHeadingDirection(para1, inverseLaneHeading, para2));
- - - - -
- - - ]
463 : :
464 [ + - + - : 1 : ASSERT_FALSE(satisfiesFilter(*(lane::getLanePtr(x11)), std::string("abc"), false));
+ - - + -
- - - - -
- - ]
465 : :
466 [ + - - + : 1 : ASSERT_FALSE(access::isLeftHandedTraffic());
- - - - -
- - - ]
467 [ + - ]: 1 : pFactory->set(access::TrafficType::LEFT_HAND_TRAFFIC);
468 [ + - - + : 1 : ASSERT_TRUE(access::isLeftHandedTraffic());
- - - - -
- - - ]
469 : : }
470 : :
471 : 2 : TEST_F(LaneOperationTest, LaneOperation)
472 : : {
473 [ + - ]: 1 : setupSingleLongLane();
474 [ + - + - ]: 1 : auto lane = lane::getLane(laneId);
475 : 1 : restriction::SpeedLimit speedLimit;
476 : 1 : speedLimit.speedLimit = physics::Speed(0.);
477 [ + - - + : 1 : ASSERT_TRUE(pFactory->add(laneId, speedLimit));
- - - - -
- - - ]
478 : :
479 : 1 : physics::ParametricRange trange;
480 : 1 : trange.minimum = physics::ParametricValue(0.2);
481 : 1 : trange.maximum = physics::ParametricValue(0.7);
482 [ + - ]: 1 : auto ptrLane = lane::getLanePtr(laneId);
483 : 1 : physics::Speed maxSpeed(0);
484 [ + - ]: 1 : maxSpeed = getMaxSpeed(*ptrLane, trange);
485 [ + - - + : 1 : ASSERT_EQ(std::numeric_limits<physics::Speed>::max(), maxSpeed);
- - - - -
- ]
486 : :
487 : 1 : ECEFEdge edge_ecef1, edge_ecef2, edge_ecef3, edge_ecef4;
488 : 1 : Geometry geo1, geo2, geo3, geo4;
489 : 1 : lane::LaneId x11, x12;
490 : 1 : access::PartitionId p(0);
491 : 1 : uint32_t i = 100;
492 : 1 : x11 = lane::LaneId(i++);
493 [ + - ]: 1 : pFactory->add(p, x11, lane::LaneType::NORMAL, lane::LaneDirection::POSITIVE);
494 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 4, 0));
495 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(401, 4, 0));
496 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(1, 2, 0));
497 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(401, 2, 0));
498 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
499 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
500 [ + - ]: 1 : pFactory->set(x11, geo1, geo2);
501 : 1 : speedLimit.speedLimit = physics::Speed(100.);
502 [ + - - + : 1 : ASSERT_TRUE(pFactory->add(x11, speedLimit));
- - - - -
- - - ]
503 : :
504 : 1 : physics::Duration duration;
505 [ + - + - ]: 1 : duration = getDuration(*(lane::getLanePtr(x11)), trange);
506 [ + - - + : 1 : ASSERT_EQ(duration, physics::Duration(2.));
- - - - -
- ]
507 : 1 : route::LaneInterval laneInt1;
508 : 1 : laneInt1.laneId = x11;
509 : 1 : laneInt1.start = ::ad::physics::ParametricValue(0.2);
510 : 1 : laneInt1.end = ::ad::physics::ParametricValue(0.7);
511 [ + - + - : 1 : ASSERT_EQ(calcDuration(laneInt1), physics::Duration(2.));
- + - - -
- - - ]
512 : : }
513 : :
514 : 2 : TEST_F(LaneOperationTest, BorderOperation)
515 : : {
516 : 1 : ENUEdge edge_enu1, edge_enu2, edge_enu3, edge_enu4;
517 : 1 : ENUBorder border_enu1, border_enu2, border_enu3;
518 : :
519 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1, 4, 0));
520 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(4, 4, 0));
521 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1, 2, 0));
522 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(4, 2, 0));
523 [ + - ]: 1 : border_enu1.left = edge_enu1;
524 [ + - ]: 1 : border_enu1.right = edge_enu2;
525 [ + - ]: 1 : normalizeBorder(border_enu1, &border_enu2);
526 [ + - - + : 1 : ASSERT_EQ(border_enu1.right[1], createENUPoint(4, 2, 0));
- - - - -
- ]
527 : :
528 : 1 : edge_enu1.clear();
529 : 1 : edge_enu2.clear();
530 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 4., 0));
531 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 4., 0));
532 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(701., 4., 0));
533 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1., 2., 0));
534 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(701., 2., 0));
535 [ + - ]: 1 : border_enu1.left = edge_enu1;
536 [ + - ]: 1 : border_enu1.right = edge_enu2;
537 [ + - ]: 1 : normalizeBorder(border_enu1, &border_enu2);
538 [ + - - + : 1 : ASSERT_EQ(border_enu1.right.size(), 3u);
- - - - -
- ]
539 [ + - - + : 1 : ASSERT_EQ(border_enu1.right[2], createENUPoint(701., 2., 0));
- - - - -
- ]
540 : :
541 : 1 : edge_enu1.clear();
542 : 1 : edge_enu2.clear();
543 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(201., 4., 0));
544 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 4., 0));
545 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(701., 4., 0));
546 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(201., 2., 0));
547 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(701., 2., 0));
548 [ + - ]: 1 : border_enu1.left = edge_enu1;
549 [ + - ]: 1 : border_enu1.right = edge_enu2;
550 : 1 : edge_enu1.clear();
551 : 1 : edge_enu2.clear();
552 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1, 4, 0));
553 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(101, 4, 0));
554 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1, 2, 0));
555 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(101, 2, 0));
556 [ + - ]: 1 : border_enu2.left = edge_enu1;
557 [ + - ]: 1 : border_enu2.right = edge_enu2;
558 [ + - ]: 1 : normalizeBorder(border_enu1, &border_enu2);
559 [ + - - + : 1 : ASSERT_EQ(border_enu1.right.size(), 3u);
- - - - -
- ]
560 [ + - - + : 1 : ASSERT_EQ(border_enu1.right[2], createENUPoint(701., 2., 0));
- - - - -
- ]
561 : :
562 : 1 : edge_enu1.clear();
563 : 1 : edge_enu2.clear();
564 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1, 4, 1));
565 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(4, 4, 1));
566 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1, 2, 1));
567 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(4, 2, 1));
568 [ + - ]: 1 : border_enu1.left = edge_enu1;
569 [ + - ]: 1 : border_enu1.right = edge_enu2;
570 [ + - ]: 1 : edge_enu3 = getLateralAlignmentEdge(border_enu1, physics::ParametricValue(0.5));
571 : 1 : edge_enu4.clear();
572 [ + - ]: 1 : edge_enu4.push_back(createENUPoint(1, 3, 1));
573 [ + - ]: 1 : edge_enu4.push_back(createENUPoint(4, 3, 1));
574 [ + - - + : 1 : ASSERT_EQ(edge_enu3, edge_enu4);
- - - - -
- ]
575 : :
576 : 1 : edge_enu3.clear();
577 [ + - ]: 1 : edge_enu3.push_back(createENUPoint(1, 2, 1));
578 [ + - ]: 1 : edge_enu3.push_back(createENUPoint(101, 2, 1));
579 [ + - ]: 1 : physics::Distance dis = getDistanceEnuPointToLateralAlignmentEdge(createENUPoint(101, 202, 1), edge_enu3);
580 [ + - - + : 1 : ASSERT_EQ(dis, physics::Distance(200));
- - - - -
- ]
581 : :
582 : 1 : edge_enu1.clear();
583 : 1 : edge_enu2.clear();
584 : 1 : edge_enu3.clear();
585 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 4, 1));
586 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 4, 1));
587 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(501., 401, 1));
588 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(901., 401, 1));
589 [ + - ]: 1 : edge_enu3 = edge_enu1;
590 [ + - ]: 1 : makeTransitionFromFirstEdgeContinuous(edge_enu1, edge_enu2);
591 [ + - - + : 1 : ASSERT_EQ(edge_enu1.size(), 3u);
- - - - -
- ]
592 [ + - - + : 1 : ASSERT_EQ(edge_enu1[0], edge_enu3[0]);
- - - - -
- ]
593 [ + - - + : 1 : ASSERT_NE(edge_enu1[1], edge_enu3[1]);
- - - - -
- ]
594 [ + - + - : 1 : ASSERT_GT(calcLength(edge_enu1), calcLength(edge_enu3));
+ - - + -
- - - -
- ]
595 [ + - ]: 1 : dis = calcLength(edge_enu3);
596 : :
597 : 1 : edge_enu1.clear();
598 : 1 : edge_enu2.clear();
599 : 1 : edge_enu3.clear();
600 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 4, 1));
601 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 4, 1));
602 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(501., 901, 1));
603 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(901., 901, 1));
604 [ + - ]: 1 : makeTransitionFromFirstEdgeContinuous(edge_enu1, edge_enu2);
605 [ + - + - : 1 : ASSERT_GT(calcLength(edge_enu1), dis);
- + - - -
- - - ]
606 : :
607 : 1 : edge_enu1.clear();
608 : 1 : edge_enu2.clear();
609 : 1 : edge_enu3.clear();
610 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 4, 1));
611 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 4, 1));
612 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(501., 401, 1));
613 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(901., 401, 1));
614 [ + - ]: 1 : edge_enu3 = edge_enu2;
615 [ + - ]: 1 : makeTransitionToSecondEdgeContinuous(edge_enu1, edge_enu2);
616 [ + - - + : 1 : ASSERT_EQ(edge_enu2.size(), 3u);
- - - - -
- ]
617 [ + - - + : 1 : ASSERT_EQ(edge_enu2[0], edge_enu1[1]);
- - - - -
- ]
618 [ + - - + : 1 : ASSERT_NE(edge_enu2[1], edge_enu3[0]);
- - - - -
- ]
619 [ + - - + : 1 : ASSERT_EQ(edge_enu2[2], edge_enu3[1]);
- - - - -
- ]
620 [ + - + - : 1 : ASSERT_GT(calcLength(edge_enu2), calcLength(edge_enu3));
+ - - + -
- - - -
- ]
621 [ + - ]: 1 : dis = calcLength(edge_enu2);
622 : :
623 : 1 : edge_enu1.clear();
624 : 1 : edge_enu2.clear();
625 : 1 : edge_enu3.clear();
626 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 4, 1));
627 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 4, 1));
628 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(501., 901, 1));
629 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(901., 901, 1));
630 [ + - ]: 1 : makeTransitionToSecondEdgeContinuous(edge_enu1, edge_enu2);
631 [ + - + - : 1 : ASSERT_GT(calcLength(edge_enu2), dis);
- + - - -
- - - ]
632 : :
633 : 1 : edge_enu1.clear();
634 : 1 : edge_enu2.clear();
635 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 404., 1));
636 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 404., 1));
637 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1., 4., 1));
638 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(401., 4., 1));
639 [ + - ]: 1 : border_enu1.left = edge_enu1;
640 [ + - ]: 1 : border_enu1.right = edge_enu2;
641 : 1 : edge_enu1.clear();
642 : 1 : edge_enu2.clear();
643 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(801., 604., 1));
644 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1201., 604., 1));
645 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(801., 204., 1));
646 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1201., 204., 1));
647 [ + - ]: 1 : border_enu2.left = edge_enu1;
648 [ + - ]: 1 : border_enu2.right = edge_enu2;
649 [ + - ]: 1 : border_enu3 = border_enu1;
650 [ + - ]: 1 : makeTransitionFromFirstBorderContinuous(border_enu1, border_enu2);
651 [ + - - + : 1 : ASSERT_NE(border_enu1, border_enu3);
- - - - -
- ]
652 [ + - - + : 1 : ASSERT_EQ(border_enu1.left.size(), 4u);
- - - - -
- ]
653 [ + - - + : 1 : ASSERT_EQ(border_enu1.right.size(), 4u);
- - - - -
- ]
654 [ + - - + : 1 : ASSERT_EQ(border_enu1.left[0], border_enu3.left[0]);
- - - - -
- ]
655 [ + - - + : 1 : ASSERT_EQ(border_enu1.left[3], border_enu2.left[0]);
- - - - -
- ]
656 [ + - - + : 1 : ASSERT_EQ(border_enu1.right[0], border_enu3.right[0]);
- - - - -
- ]
657 [ + - - + : 1 : ASSERT_EQ(border_enu1.right[3], border_enu2.right[0]);
- - - - -
- ]
658 [ + - + - : 1 : ASSERT_GT(calcLength(border_enu1.left), calcLength(border_enu3.left));
+ - - + -
- - - -
- ]
659 [ + - + - : 1 : ASSERT_GT(calcLength(border_enu1.right), calcLength(border_enu3.right));
+ - - + -
- - - -
- ]
660 [ + - ]: 1 : physics::Distance leftedge_length = calcLength(border_enu1.left);
661 [ + - ]: 1 : physics::Distance rightedge_length = calcLength(border_enu1.right);
662 : :
663 [ + - ]: 1 : auto borderLength = calcLength(border_enu1);
664 [ + - + - : 1 : ASSERT_EQ(0.5 * (leftedge_length + rightedge_length), borderLength);
+ - - + -
- - - -
- ]
665 : :
666 [ + - + - : 5 : lane::ENUBorderList enuBorderList{border_enu1, border_enu1, border_enu1};
+ - + - ]
667 [ + - + - : 1 : ASSERT_EQ(3.0 * borderLength, calcLength(enuBorderList));
+ - - + -
- - - -
- ]
668 : :
669 : 1 : edge_enu1.clear();
670 : 1 : edge_enu2.clear();
671 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 404., 1));
672 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 404., 1));
673 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1., 4., 1));
674 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(401., 4., 1));
675 [ + - ]: 1 : border_enu1.left = edge_enu1;
676 [ + - ]: 1 : border_enu1.right = edge_enu2;
677 : 1 : edge_enu1.clear();
678 : 1 : edge_enu2.clear();
679 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(801., 1004., 1));
680 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1201., 1004., 1));
681 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(801., 604., 1));
682 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1201., 604., 1));
683 [ + - ]: 1 : border_enu2.left = edge_enu1;
684 [ + - ]: 1 : border_enu2.right = edge_enu2;
685 [ + - ]: 1 : border_enu3 = border_enu1;
686 [ + - ]: 1 : makeTransitionFromFirstBorderContinuous(border_enu1, border_enu2);
687 [ + - + - : 1 : ASSERT_GT(calcLength(border_enu1.left), leftedge_length);
- + - - -
- - - ]
688 [ + - + - : 1 : ASSERT_GT(calcLength(border_enu1.right), rightedge_length);
- + - - -
- - - ]
689 : :
690 [ + - ]: 1 : struct IndexPairs indexPairs = getIndexPairs(edge_enu1, edge_enu2);
691 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices.size(), 2u);
- - - - -
- ]
692 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices[0], 0u);
- - - - -
- ]
693 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices[1], 1u);
- - - - -
- ]
694 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices, indexPairs.rightEdgeIndices);
- - - - -
- ]
695 : :
696 : 1 : edge_enu1.clear();
697 : 1 : edge_enu2.clear();
698 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(1., 404., 1));
699 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(401., 404., 1));
700 [ + - ]: 1 : edge_enu1.push_back(createENUPoint(801., 404., 1));
701 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(1., 4., 1));
702 [ + - ]: 1 : edge_enu2.push_back(createENUPoint(401., 4., 1));
703 [ + - ]: 1 : indexPairs = getIndexPairs(edge_enu1, edge_enu2);
704 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices.size(), 3u);
- - - - -
- ]
705 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices[0], 0u);
- - - - -
- ]
706 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices[1], 1u);
- - - - -
- ]
707 [ + - - + : 1 : ASSERT_EQ(indexPairs.leftEdgeIndices[2], 2u);
- - - - -
- ]
708 [ + - - + : 1 : ASSERT_EQ(indexPairs.rightEdgeIndices.size(), 3u);
- - - - -
- ]
709 [ + - - + : 1 : ASSERT_EQ(indexPairs.rightEdgeIndices[0], 0u);
- - - - -
- ]
710 [ + - - + : 1 : ASSERT_EQ(indexPairs.rightEdgeIndices[1], 1u);
- - - - -
- ]
711 [ + - - + : 1 : ASSERT_EQ(indexPairs.rightEdgeIndices[2], 1u);
- - - - -
- ]
712 : : }
|