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/Operation.hpp>
10 : : #include <ad/map/point/Operation.hpp>
11 : : #include <gtest/gtest.h>
12 : :
13 : : using namespace ::ad;
14 : : using namespace ::ad::map;
15 : : using namespace ::ad::map::point;
16 : :
17 : : struct GeometryOperationTest : ::testing::Test
18 : : {
19 : 4 : GeometryOperationTest()
20 : 4 : {
21 : 4 : }
22 : :
23 : 4 : virtual ~GeometryOperationTest() = default;
24 : :
25 : 4 : virtual void SetUp()
26 : : {
27 : 4 : }
28 : :
29 : 4 : virtual void TearDown()
30 : : {
31 : 4 : access::cleanup();
32 : 4 : }
33 : : };
34 : :
35 : 2 : TEST_F(GeometryOperationTest, NearestPointOnEdge)
36 : : {
37 : 1 : ECEFEdge pts;
38 [ + - ]: 1 : pts.push_back(createECEFPoint(2, 1, 0));
39 [ + - ]: 1 : pts.push_back(createECEFPoint(4, 1, 0));
40 [ + - ]: 1 : pts.push_back(createECEFPoint(6, 3, 0));
41 [ + - ]: 1 : pts.push_back(createECEFPoint(6, 5, 0));
42 [ + - ]: 1 : Geometry geo = createGeometry(pts, false);
43 : : {
44 : 1 : ECEFPoint pt = createECEFPoint(6.5, 3.5, 0);
45 [ + - ]: 1 : auto t_geo = findNearestPointOnEdge(geo, pt);
46 [ + - ]: 1 : ECEFPoint pt_geo = getParametricPoint(geo, t_geo);
47 [ + - ]: 1 : auto t_seg = findNearestPointOnSegment(pt, pts[2], pts[3]);
48 [ + - ]: 1 : ECEFPoint pt_seg = vectorInterpolate(pts[2], pts[3], t_seg);
49 [ + - - + : 1 : ASSERT_EQ(pt_geo, pt_seg);
- - - - -
- ]
50 : : }
51 : : {
52 : 1 : ECEFPoint pt = createECEFPoint(1, 1, 1);
53 [ + - ]: 1 : auto t = findNearestPointOnEdge(geo, pt);
54 [ + - - + : 1 : ASSERT_EQ(t, physics::ParametricValue(0.));
- - - - -
- ]
55 : : }
56 : : {
57 : 1 : ECEFPoint pt = createECEFPoint(2, 7, 0);
58 [ + - ]: 1 : auto t = findNearestPointOnEdge(geo, pt);
59 [ + - - + : 1 : ASSERT_EQ(t, physics::ParametricValue(1.));
- - - - -
- ]
60 : : }
61 : : }
62 : :
63 : 2 : TEST_F(GeometryOperationTest, Position)
64 : : {
65 : 1 : ECEFEdge edge_ecef1;
66 : 1 : ECEFEdge edge_ecef2;
67 : 1 : Geometry geo1;
68 : 1 : Geometry geo2;
69 : :
70 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
71 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
72 : :
73 [ + - - + : 1 : ASSERT_FALSE(isSuccessor(geo1, geo2));
- - - - -
- - - ]
74 [ + - - + : 1 : ASSERT_FALSE(isPredecessor(geo1, geo2));
- - - - -
- - - ]
75 [ + - - + : 1 : ASSERT_FALSE(haveSameStart(geo1, geo2));
- - - - -
- - - ]
76 [ + - - + : 1 : ASSERT_FALSE(haveSameEnd(geo1, geo2));
- - - - -
- - - ]
77 : :
78 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 2, 0));
79 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(3, 4, 0));
80 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
81 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
82 [ + - - + : 1 : ASSERT_FALSE(isSuccessor(geo1, geo2));
- - - - -
- - - ]
83 [ + - - + : 1 : ASSERT_FALSE(isPredecessor(geo1, geo2));
- - - - -
- - - ]
84 [ + - - + : 1 : ASSERT_FALSE(haveSameStart(geo1, geo2));
- - - - -
- - - ]
85 [ + - - + : 1 : ASSERT_FALSE(haveSameEnd(geo1, geo2));
- - - - -
- - - ]
86 : :
87 : 1 : edge_ecef1.clear();
88 : 1 : edge_ecef2.clear();
89 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 2, 0));
90 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(3, 4, 0));
91 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(1, 2, 0));
92 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(4, 5, 0));
93 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
94 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
95 [ + - - + : 1 : ASSERT_TRUE(isPredecessor(geo1, geo2));
- - - - -
- - - ]
96 [ + - - + : 1 : ASSERT_TRUE(haveSameStart(geo1, geo2));
- - - - -
- - - ]
97 : :
98 : 1 : edge_ecef1.clear();
99 : 1 : edge_ecef2.clear();
100 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 2, 0));
101 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(3, 4, 0));
102 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(1, 2, 1));
103 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(3, 4, 0));
104 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
105 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
106 [ + - - + : 1 : ASSERT_TRUE(isSuccessor(geo1, geo2));
- - - - -
- - - ]
107 [ + - - + : 1 : ASSERT_TRUE(haveSameEnd(geo1, geo2));
- - - - -
- - - ]
108 : :
109 : 1 : edge_ecef1.clear();
110 : 1 : edge_ecef2.clear();
111 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 2, 0));
112 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(3, 4, 0));
113 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(3, 4, 0));
114 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(1, 2, 0));
115 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
116 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
117 [ + - - + : 1 : ASSERT_TRUE(isSuccessor(geo1, geo2));
- - - - -
- - - ]
118 [ + - - + : 1 : ASSERT_TRUE(isPredecessor(geo1, geo2));
- - - - -
- - - ]
119 : : }
120 : :
121 : 2 : TEST_F(GeometryOperationTest, ParametricRange)
122 : : {
123 : 1 : physics::ParametricRange trange;
124 : 1 : trange.minimum = physics::ParametricValue(0.2);
125 : 1 : trange.maximum = physics::ParametricValue(0.8);
126 : 1 : ECEFEdge edge_ecef1;
127 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 2, 3));
128 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(2, 2, 3));
129 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(3, 2, 3));
130 : 1 : ECEFEdge edge_ecef2;
131 : 1 : Geometry geo1, geo2;
132 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
133 : :
134 : 1 : ECEFEdge edge_ecef3;
135 [ + - ]: 1 : getParametricRange(geo1, trange, edge_ecef3, false);
136 [ + - - + : 1 : ASSERT_EQ(edge_ecef3.size(), 3u);
- - - - -
- ]
137 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[0], createECEFPoint(1.4, 2, 3));
- - - - -
- ]
138 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[1], createECEFPoint(2, 2, 3));
- - - - -
- ]
139 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[2], createECEFPoint(2.6, 2, 3));
- - - - -
- ]
140 : :
141 : 1 : edge_ecef3.clear();
142 [ + - ]: 1 : getParametricRange(geo1, trange, edge_ecef3, true);
143 [ + - - + : 1 : ASSERT_EQ(edge_ecef3.size(), 3u);
- - - - -
- ]
144 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[0], createECEFPoint(2.6, 2, 3));
- - - - -
- ]
145 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[1], createECEFPoint(2, 2, 3));
- - - - -
- ]
146 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[2], createECEFPoint(1.4, 2, 3));
- - - - -
- ]
147 : :
148 : 1 : edge_ecef1.clear();
149 : 1 : edge_ecef2.clear();
150 : 1 : edge_ecef3.clear();
151 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(10000, 200000, 300000));
152 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(20000, 200000, 300000));
153 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(30000, 200000, 300000));
154 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
155 [ + - ]: 1 : getParametricRange(geo1, trange, edge_ecef3, false);
156 : 1 : GeoEdge edge_geo1;
157 [ + - ]: 1 : getParametricRange(geo1, trange, edge_geo1, false);
158 [ + - - + : 1 : ASSERT_EQ(edge_geo1.size(), 3u);
- - - - -
- ]
159 : 1 : GeoEdge edge_geo2;
160 [ + - ]: 1 : edge_geo2 = toGeo(edge_ecef3);
161 [ + - - + : 1 : ASSERT_EQ(edge_geo1[0], edge_geo2[0]);
- - - - -
- ]
162 [ + - - + : 1 : ASSERT_EQ(edge_geo1[1], edge_geo2[1]);
- - - - -
- ]
163 [ + - - + : 1 : ASSERT_EQ(edge_geo1[2], edge_geo2[2]);
- - - - -
- ]
164 : :
165 : 1 : edge_ecef1.clear();
166 : 1 : edge_ecef2.clear();
167 : 1 : edge_ecef3.clear();
168 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(10000, 200000, 300000));
169 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(20000, 200000, 300000));
170 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(30000, 200000, 300000));
171 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
172 [ + - ]: 1 : getParametricRange(geo1, trange, edge_ecef3, true);
173 [ + - ]: 1 : getParametricRange(geo1, trange, edge_geo1, true);
174 [ + - - + : 1 : ASSERT_EQ(edge_geo1.size(), 3u);
- - - - -
- ]
175 [ + - ]: 1 : edge_geo2 = toGeo(edge_ecef3);
176 [ + - - + : 1 : ASSERT_EQ(edge_geo1[0], edge_geo2[0]);
- - - - -
- ]
177 [ + - - + : 1 : ASSERT_EQ(edge_geo1[1], edge_geo2[1]);
- - - - -
- ]
178 [ + - - + : 1 : ASSERT_EQ(edge_geo1[2], edge_geo2[2]);
- - - - -
- ]
179 : :
180 : 1 : edge_ecef1.clear();
181 : 1 : edge_ecef2.clear();
182 : 1 : edge_ecef3.clear();
183 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(1, 2, 3));
184 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(2, 2, 3));
185 [ + - ]: 1 : edge_ecef1.push_back(createECEFPoint(3, 2, 3));
186 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(6, 6, 6));
187 [ + - ]: 1 : edge_ecef2.push_back(createECEFPoint(8, 6, 6));
188 [ + - ]: 1 : geo1 = createGeometry(edge_ecef1, false);
189 [ + - ]: 1 : geo2 = createGeometry(edge_ecef2, false);
190 [ + - ]: 1 : edge_ecef3 = getMiddleEdge(geo1, geo2);
191 [ + - - + : 1 : ASSERT_EQ(edge_ecef3.size(), 3u);
- - - - -
- ]
192 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[0], createECEFPoint(3.5, 4, 4.5));
- - - - -
- ]
193 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[1], createECEFPoint(4.5, 4, 4.5));
- - - - -
- ]
194 [ + - - + : 1 : ASSERT_EQ(edge_ecef3[2], createECEFPoint(5.5, 4, 4.5));
- - - - -
- ]
195 : : }
196 : :
197 : 2 : TEST_F(GeometryOperationTest, ParametricRangeENU)
198 : : {
199 : 1 : physics::ParametricRange trange;
200 : 1 : ECEFEdge edge_ecef1, edge_ecef2;
201 : 1 : Geometry geome;
202 : 1 : ENUEdge edge_enu;
203 : :
204 : 1 : trange.minimum = physics::ParametricValue(0.2);
205 : 1 : trange.maximum = physics::ParametricValue(0.8);
206 : :
207 [ + - ]: 1 : CoordinateTransform mCoordinateTransform;
208 : 1 : const Altitude h(123.456); // Invented altitude.
209 : 1 : const Altitude dh(100.123); // Invented altitude difference.
210 : 1 : GeoPoint geo0, geo1, geo2, geo3;
211 : : // Position of Intel Office
212 : 1 : geo1 = createGeoPoint(Longitude(-121.935549), Latitude(37.401336), h);
213 : : // Position of San Jose Fire Department Station 29
214 : 1 : geo2 = createGeoPoint(Longitude(-121.933886), Latitude(37.401112), h);
215 : : // Position of San Jose Fire Department Station 29 + altitude difference
216 [ + - ]: 1 : geo3 = createGeoPoint(Longitude(-121.933886), Latitude(37.401112), h + dh);
217 : :
218 : 1 : ECEFPoint ecef1, ecef2, ecef3;
219 [ + - ]: 1 : ecef1 = mCoordinateTransform.Geo2ECEF(geo1);
220 [ + - ]: 1 : ecef2 = mCoordinateTransform.Geo2ECEF(geo2);
221 [ + - ]: 1 : ecef3 = mCoordinateTransform.Geo2ECEF(geo3);
222 : :
223 [ + - ]: 1 : edge_ecef1.push_back(ecef1);
224 [ + - ]: 1 : edge_ecef1.push_back(ecef2);
225 [ + - ]: 1 : edge_ecef1.push_back(ecef3);
226 [ + - ]: 1 : geome = createGeometry(edge_ecef1, false);
227 : :
228 [ + - ]: 1 : mCoordinateTransform.setENUReferencePoint(geo1);
229 : 1 : ENUPoint enu1, enu2, enu3;
230 [ + - ]: 1 : enu1 = mCoordinateTransform.ECEF2ENU(ecef1);
231 [ + - ]: 1 : enu2 = mCoordinateTransform.ECEF2ENU(ecef2);
232 [ + - ]: 1 : enu3 = mCoordinateTransform.ECEF2ENU(ecef3);
233 : :
234 : : #if SAFE_DATAYPES_THROW
235 : : //@todo: recheck when generator supports some compiler define to make feature visible to the outside
236 : : EXPECT_THROW(getParametricRange(geome, trange, edge_enu, false), std::out_of_range);
237 : : #endif
238 [ + - + - : 1 : ASSERT_TRUE(access::init("test_files/TPK.adm.txt"));
- + - - -
- - - -
- ]
239 : : #if SAFE_DATAYPES_THROW
240 : : //@todo: recheck when generator supports some compiler define to make feature visible to the outside
241 : : EXPECT_THROW(getParametricRange(geome, trange, edge_enu, false), std::out_of_range);
242 : : #endif
243 [ + - ]: 1 : access::setENUReferencePoint(geo1);
244 : :
245 : 1 : edge_enu.clear();
246 [ + - ]: 1 : getParametricRange(geome, trange, edge_ecef2, false);
247 [ + - ]: 1 : getParametricRange(geome, trange, edge_enu, false);
248 [ + - ]: 1 : physics::Distance ecef_edge_length = calcLength(edge_ecef2);
249 [ + - ]: 1 : physics::Distance enu_edge_length = calcLength(edge_enu);
250 [ + - - + : 1 : EXPECT_EQ(ecef_edge_length, enu_edge_length);
- - - - -
- ]
251 : :
252 : 1 : edge_enu.clear();
253 [ + - ]: 1 : getParametricRange(geome, trange, edge_ecef2, true);
254 [ + - ]: 1 : getParametricRange(geome, trange, edge_enu, true);
255 [ + - ]: 1 : ecef_edge_length = calcLength(edge_ecef2);
256 [ + - ]: 1 : enu_edge_length = calcLength(edge_enu);
257 [ + - - + : 1 : EXPECT_EQ(ecef_edge_length, enu_edge_length);
- - - - -
- ]
258 : : }
|