Branch data Line data Source code
1 : : // ----------------- BEGIN LICENSE BLOCK ---------------------------------
2 : : //
3 : : // Copyright (C) 2018-2021 Intel Corporation
4 : : //
5 : : // SPDX-License-Identifier: LGPL-2.1-only
6 : : //
7 : : // ----------------- END LICENSE BLOCK -----------------------------------
8 : :
9 : : #include "RssCheckTestBaseT.hpp"
10 : :
11 : : namespace ad {
12 : : namespace rss {
13 : : namespace core {
14 : :
15 : : template <class TESTBASE> class RssCheckSameDirectionOtherLeadingTestBase : public TESTBASE
16 : : {
17 : : protected:
18 : 55 : world::Object &getEgoObject() override
19 : : {
20 : 55 : return TESTBASE::objectOnSegment1;
21 : : }
22 : :
23 : 55 : world::Object &getSceneObject(uint32_t) override
24 : : {
25 : 55 : return TESTBASE::objectOnSegment7;
26 : : }
27 : :
28 : 621 : Distance getMiddleRoadSegmentLength() override
29 : : {
30 : 621 : return Distance(2);
31 : : }
32 : : };
33 : :
34 : : template <class TESTBASE> class RssCheckSameDirectionEgoLeadingTestBase : public TESTBASE
35 : : {
36 : : protected:
37 : 54 : world::Object &getEgoObject() override
38 : : {
39 : 54 : return TESTBASE::objectOnSegment7;
40 : : }
41 : :
42 : 54 : world::Object &getSceneObject(uint32_t) override
43 : : {
44 : 54 : return TESTBASE::objectOnSegment1;
45 : : }
46 : :
47 : 324 : Distance getMiddleRoadSegmentLength() override
48 : : {
49 : 324 : return Distance(2);
50 : : }
51 : : };
52 : :
53 : : using RssCheckSameDirectionOtherLeadingTest = RssCheckSameDirectionOtherLeadingTestBase<RssCheckTestBase>;
54 : :
55 : 2 : TEST_F(RssCheckSameDirectionOtherLeadingTest, DifferentDistances)
56 : : {
57 : 1 : performDifferentDistancesTest(state::LongitudinalResponse::BrakeMin);
58 : 1 : }
59 : :
60 : 2 : TEST_F(RssCheckSameDirectionOtherLeadingTest, DifferentVelocities)
61 : : {
62 : 1 : performDifferentVelocitiesTest(state::LongitudinalResponse::BrakeMin);
63 : 1 : }
64 : :
65 : 2 : TEST_F(RssCheckSameDirectionOtherLeadingTest, DifferentVelocities_DifferentLaneSegements)
66 : : {
67 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].segmentId = 2;
68 : 1 : performDifferentVelocitiesTest(state::LongitudinalResponse::BrakeMin);
69 : 1 : }
70 : :
71 : 2 : TEST_F(RssCheckSameDirectionOtherLeadingTest, DifferentVelocities_NoLateralConflict)
72 : : {
73 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].segmentId = 0;
74 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.minimum = ParametricValue(0.0);
75 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.maximum = ParametricValue(0.1);
76 : :
77 : 1 : worldModel.scenes[0].object.occupiedRegions[0].segmentId = 8;
78 : :
79 : 1 : state::ProperResponse properResponse;
80 [ + - ]: 1 : core::RssCheck rssCheck;
81 : :
82 [ + + ]: 101 : for (uint32_t i = 0; i < 100; i++)
83 : : {
84 : 100 : worldModel.scenes[0].egoVehicle.velocity.speedLonMin = kmhToMeterPerSec(i);
85 : 100 : worldModel.scenes[0].egoVehicle.velocity.speedLonMax = kmhToMeterPerSec(i);
86 : 100 : worldModel.timeIndex++;
87 : :
88 [ + - - + : 100 : ASSERT_TRUE(rssCheck.calculateProperResponse(worldModel, properResponse));
- - - - -
- - - ]
89 : :
90 [ + - ]: 100 : testRestrictions(properResponse.accelerationRestrictions);
91 : : }
92 : : }
93 : :
94 : 2 : TEST_F(RssCheckSameDirectionOtherLeadingTest, _DifferentVelocities_NoLateralConflict_2Objects)
95 : : {
96 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].segmentId = 0;
97 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.minimum = ParametricValue(0.0);
98 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.maximum = ParametricValue(0.1);
99 : :
100 [ + - ]: 1 : worldModel.scenes.push_back(worldModel.scenes.front());
101 : 1 : worldModel.scenes[0].object.occupiedRegions[0].segmentId = 8;
102 : 1 : worldModel.scenes[1].object.occupiedRegions[0].segmentId = 8;
103 : 1 : worldModel.scenes[1].object.objectId = 2;
104 : :
105 : 1 : state::ProperResponse properResponse;
106 [ + - ]: 1 : core::RssCheck rssCheck;
107 : :
108 [ + + ]: 101 : for (uint32_t i = 0; i < 100; i++)
109 : : {
110 : 100 : worldModel.scenes[0].egoVehicle.velocity.speedLonMin = kmhToMeterPerSec(i);
111 : 100 : worldModel.scenes[0].egoVehicle.velocity.speedLonMax = kmhToMeterPerSec(i);
112 : 100 : worldModel.timeIndex++;
113 : :
114 [ + - - + : 100 : ASSERT_TRUE(rssCheck.calculateProperResponse(worldModel, properResponse));
- - - - -
- - - ]
115 : :
116 [ + - ]: 100 : testRestrictions(properResponse.accelerationRestrictions);
117 : : }
118 : : }
119 : :
120 : : using RssCheckSameDirectionEgoLeadingTest = RssCheckSameDirectionEgoLeadingTestBase<RssCheckTestBase>;
121 : :
122 : 2 : TEST_F(RssCheckSameDirectionEgoLeadingTest, DifferentVelocities)
123 : : {
124 : 1 : state::ProperResponse properResponse;
125 [ + - ]: 1 : core::RssCheck rssCheck;
126 : :
127 [ + + ]: 101 : for (uint32_t i = 0; i < 100; i++)
128 : : {
129 : 100 : worldModel.scenes[0].object.velocity.speedLonMin = kmhToMeterPerSec(i);
130 : 100 : worldModel.scenes[0].object.velocity.speedLonMax = kmhToMeterPerSec(i);
131 : 100 : worldModel.timeIndex++;
132 : :
133 [ + - - + : 100 : ASSERT_TRUE(rssCheck.calculateProperResponse(worldModel, properResponse));
- - - - -
- - - ]
134 : :
135 : : // no matter how fast the following vehicle is, the ego must never brake as it leads
136 [ + - ]: 100 : testRestrictions(properResponse.accelerationRestrictions);
137 : : }
138 : : }
139 : :
140 : 2 : TEST_F(RssCheckSameDirectionEgoLeadingTest, Overlap_Front)
141 : : {
142 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].segmentId = 8;
143 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].lonRange.maximum = ParametricValue(0.5);
144 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].lonRange.minimum = ParametricValue(0.4);
145 : :
146 : 1 : worldModel.scenes[0].object.occupiedRegions[0].segmentId = 6;
147 : 1 : worldModel.scenes[0].object.occupiedRegions[0].lonRange.maximum = ParametricValue(0.45);
148 : 1 : worldModel.scenes[0].object.occupiedRegions[0].lonRange.minimum = ParametricValue(0.35);
149 : :
150 : 1 : state::ProperResponse properResponse;
151 [ + - ]: 1 : core::RssCheck rssCheck;
152 : :
153 [ + + ]: 101 : for (uint32_t i = 0; i < 100; i++)
154 : : {
155 : 100 : worldModel.scenes[0].object.velocity.speedLonMin = kmhToMeterPerSec(i);
156 : 100 : worldModel.scenes[0].object.velocity.speedLonMax = kmhToMeterPerSec(i);
157 : 100 : worldModel.timeIndex++;
158 : :
159 [ + - - + : 100 : ASSERT_TRUE(rssCheck.calculateProperResponse(worldModel, properResponse));
- - - - -
- - - ]
160 : :
161 : : // no matter how fast the following vehicle is, the ego must never brake as it leads
162 [ + - ]: 100 : testRestrictions(properResponse.accelerationRestrictions);
163 : : }
164 : : }
165 : :
166 : 2 : TEST_F(RssCheckSameDirectionEgoLeadingTest, Overlap_Right)
167 : : {
168 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].segmentId = 5;
169 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.maximum = ParametricValue(0.5);
170 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.minimum = ParametricValue(0.4);
171 : :
172 : 1 : worldModel.scenes[0].object.occupiedRegions[0].segmentId = 2;
173 : 1 : worldModel.scenes[0].object.occupiedRegions[0].latRange.maximum = ParametricValue(0.45);
174 : 1 : worldModel.scenes[0].object.occupiedRegions[0].latRange.minimum = ParametricValue(0.35);
175 : :
176 : 1 : state::ProperResponse properResponse;
177 [ + - ]: 1 : core::RssCheck rssCheck;
178 : :
179 [ + + ]: 101 : for (uint32_t i = 0; i < 100; i++)
180 : : {
181 : 100 : worldModel.scenes[0].object.velocity.speedLonMin = kmhToMeterPerSec(i);
182 : 100 : worldModel.scenes[0].object.velocity.speedLonMax = kmhToMeterPerSec(i);
183 : 100 : worldModel.timeIndex++;
184 : :
185 [ + - - + : 100 : ASSERT_TRUE(rssCheck.calculateProperResponse(worldModel, properResponse));
- - - - -
- - - ]
186 : :
187 : : // no matter how fast the following vehicle is, the ego must never brake as it leads
188 [ + - ]: 100 : testRestrictions(properResponse.accelerationRestrictions);
189 : : }
190 : : }
191 : :
192 : 2 : TEST_F(RssCheckSameDirectionEgoLeadingTest, Overlap_Left)
193 : : {
194 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].segmentId = 5;
195 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.maximum = ParametricValue(0.4);
196 : 1 : worldModel.scenes[0].egoVehicle.occupiedRegions[0].latRange.minimum = ParametricValue(0.3);
197 : :
198 : 1 : worldModel.scenes[0].object.occupiedRegions[0].segmentId = 2;
199 : 1 : worldModel.scenes[0].object.occupiedRegions[0].latRange.maximum = ParametricValue(0.45);
200 : 1 : worldModel.scenes[0].object.occupiedRegions[0].latRange.minimum = ParametricValue(0.35);
201 : :
202 : 1 : state::ProperResponse properResponse;
203 [ + - ]: 1 : core::RssCheck rssCheck;
204 : :
205 [ + + ]: 101 : for (uint32_t i = 0; i < 100; i++)
206 : : {
207 : 100 : worldModel.scenes[0].object.velocity.speedLonMin = kmhToMeterPerSec(i);
208 : 100 : worldModel.scenes[0].object.velocity.speedLonMax = kmhToMeterPerSec(i);
209 : 100 : worldModel.timeIndex++;
210 : :
211 [ + - - + : 100 : ASSERT_TRUE(rssCheck.calculateProperResponse(worldModel, properResponse));
- - - - -
- - - ]
212 : :
213 : : // no matter how fast the following vehicle is, the ego must never brake as it leads
214 [ + - ]: 100 : testRestrictions(properResponse.accelerationRestrictions);
215 : : }
216 : : }
217 : :
218 : : template <class TESTBASE> class RssCheckSameDirectionEgoInTheMiddleTestBase : public TESTBASE
219 : : {
220 : : protected:
221 : : using TESTBASE::worldModel;
222 : 52 : void SetUp() override
223 : : {
224 : 52 : TESTBASE::SetUp();
225 : : // now we have to shorten the road areas for the two scenes otherwhise
226 : : // the area is too big which restricts too much to handle in our test code
227 [ + - ]: 52 : worldModel.scenes[0].egoVehicleRoad.erase(worldModel.scenes[0].egoVehicleRoad.begin() + 2);
228 [ + - ]: 52 : worldModel.scenes[1].egoVehicleRoad.erase(worldModel.scenes[1].egoVehicleRoad.begin());
229 : 52 : }
230 : :
231 : 104 : world::Object &getEgoObject() override
232 : : {
233 : 104 : TESTBASE::objectOnSegment3.occupiedRegions[0].latRange.minimum = ParametricValue(0.8);
234 : 104 : TESTBASE::objectOnSegment3.occupiedRegions[0].latRange.maximum = ParametricValue(0.9);
235 : 104 : return TESTBASE::objectOnSegment3;
236 : : }
237 : :
238 : 156 : uint32_t getNumberOfSceneObjects() override
239 : : {
240 : 156 : return 2u;
241 : : }
242 : :
243 : 104 : world::Object &getSceneObject(uint32_t index) override
244 : : {
245 [ + + ]: 104 : if (index == 0u)
246 : : {
247 : 52 : return TESTBASE::objectOnSegment0;
248 : : }
249 : : else
250 : : {
251 : 52 : return TESTBASE::objectOnSegment6;
252 : : }
253 : : }
254 : : };
255 : :
256 : : using RssCheckSameDirectionEgoInTheMiddleTest = RssCheckSameDirectionEgoInTheMiddleTestBase<RssCheckTestBase>;
257 : :
258 : 2 : TEST_F(RssCheckSameDirectionEgoInTheMiddleTest, DifferentDistances)
259 : : {
260 : 1 : performDifferentDistancesTest(state::LongitudinalResponse::BrakeMin);
261 : 1 : }
262 : :
263 : 2 : TEST_F(RssCheckSameDirectionEgoInTheMiddleTest, DifferentVelocities)
264 : : {
265 : 1 : performDifferentVelocitiesTest(state::LongitudinalResponse::BrakeMin);
266 : 1 : }
267 : :
268 : : using RssCheckSameDirectionOtherLeadingOutOfMemoryTest
269 : : = RssCheckSameDirectionOtherLeadingTestBase<RssCheckOutOfMemoryTestBase>;
270 [ + - + - : 101 : TEST_P(RssCheckSameDirectionOtherLeadingOutOfMemoryTest, outOfMemoryAnyTime)
+ - + - +
- ]
271 : : {
272 [ + - ]: 50 : performOutOfMemoryTest();
273 : 50 : }
274 [ - + - - : 51 : INSTANTIATE_TEST_CASE_P(Range,
- - ]
275 : : RssCheckSameDirectionOtherLeadingOutOfMemoryTest,
276 : : ::testing::Range(uint64_t(0u), uint64_t(50u), 1u));
277 : :
278 : : using RssCheckSameDirectionEgoLeadingOutOfMemoryTest
279 : : = RssCheckSameDirectionEgoLeadingTestBase<RssCheckOutOfMemoryTestBase>;
280 [ + - + - : 101 : TEST_P(RssCheckSameDirectionEgoLeadingOutOfMemoryTest, outOfMemoryAnyTime)
+ - + - +
- ]
281 : : {
282 [ + - ]: 50 : performOutOfMemoryTest();
283 : 50 : }
284 [ - + - - : 51 : INSTANTIATE_TEST_CASE_P(Range,
- - ]
285 : : RssCheckSameDirectionEgoLeadingOutOfMemoryTest,
286 : : ::testing::Range(uint64_t(0u), uint64_t(50u), 1u));
287 : :
288 : : using RssCheckSameDirectionEgoInTheMiddleOutOfMemoryTest
289 : : = RssCheckSameDirectionEgoInTheMiddleTestBase<RssCheckOutOfMemoryTestBase>;
290 [ + - + - : 101 : TEST_P(RssCheckSameDirectionEgoInTheMiddleOutOfMemoryTest, outOfMemoryAnyTime)
+ - + - +
- ]
291 : : {
292 [ + - ]: 50 : performOutOfMemoryTest();
293 : 50 : }
294 [ - + - - : 51 : INSTANTIATE_TEST_CASE_P(Range,
- - ]
295 : : RssCheckSameDirectionEgoInTheMiddleOutOfMemoryTest,
296 : : ::testing::Range(uint64_t(0u), uint64_t(50u), 1u));
297 : :
298 : : } // namespace core
299 : : } // namespace rss
300 : : } // namespace ad
|