Line data Source code
1 : /******************************************************************************
2 : * Project: GDAL Vector abstraction
3 : * Purpose: Tests for the VectorX class
4 : * Author: Javier Jimenez Shaw
5 : *
6 : ******************************************************************************
7 : * Copyright (c) 2024, Javier Jimenez Shaw
8 : *
9 : * SPDX-License-Identifier: MIT
10 : ****************************************************************************/
11 :
12 : #include "gdal_unit_test.h"
13 :
14 : #include "gdal_vectorx.h"
15 :
16 : #include <cmath>
17 : #include <complex>
18 : #include <limits>
19 : #include <type_traits>
20 :
21 : #include "gtest_include.h"
22 :
23 : namespace
24 : {
25 :
26 : // Common fixture with test data
27 : struct test_vectorx : public ::testing::Test
28 : {
29 : };
30 :
31 : // Dummy test
32 4 : TEST_F(test_vectorx, simple_int)
33 : {
34 1 : gdal::Vector2i a;
35 1 : EXPECT_EQ(0, a.x());
36 1 : EXPECT_EQ(0, a.y());
37 : static_assert(std::is_same_v<decltype(a)::value_type, int> == true);
38 :
39 1 : gdal::Vector2i p2(2, 3);
40 1 : EXPECT_EQ(2, p2.x());
41 1 : EXPECT_EQ(3, p2.y());
42 :
43 1 : gdal::Vector3i p3(12, 13, 14);
44 1 : EXPECT_EQ(12, p3.x());
45 1 : EXPECT_EQ(13, p3.y());
46 1 : EXPECT_EQ(14, p3.z());
47 :
48 1 : gdal::VectorX<int, 1> p1{2};
49 1 : EXPECT_EQ(2, p1.x());
50 :
51 1 : gdal::VectorX<int, 4> p4(12, 13, -14, 150);
52 1 : EXPECT_EQ(12, p4.x());
53 1 : EXPECT_EQ(13, p4.y());
54 1 : EXPECT_EQ(-14, p4.z());
55 1 : EXPECT_EQ(150, p4[3]);
56 1 : }
57 :
58 4 : TEST_F(test_vectorx, simple_double)
59 : {
60 1 : gdal::Vector2d a;
61 1 : EXPECT_EQ(0.0, a.x());
62 1 : EXPECT_EQ(0.0, a.y());
63 1 : EXPECT_EQ(2, a.size());
64 : static_assert(std::is_same_v<decltype(a)::value_type, double> == true);
65 :
66 1 : gdal::Vector2d p2(2.1, 3.6);
67 1 : EXPECT_EQ(2.1, p2.x());
68 1 : EXPECT_EQ(3.6, p2.y());
69 1 : EXPECT_EQ(2, p2.size());
70 :
71 1 : gdal::Vector3d p3(12e-2, -13.0, 14e3);
72 1 : EXPECT_EQ(12e-2, p3.x());
73 1 : EXPECT_EQ(-13.0, p3.y());
74 1 : EXPECT_EQ(14e3, p3.z());
75 1 : EXPECT_EQ(3, p3.size());
76 :
77 1 : gdal::VectorX<double, 1> p1{2.1};
78 1 : EXPECT_EQ(2.1, p1.x());
79 1 : EXPECT_EQ(1, p1.size());
80 :
81 1 : gdal::VectorX<double, 4> p4(12.0, 13.1, -14.2, 150.0);
82 1 : EXPECT_EQ(12.0, p4.x());
83 1 : EXPECT_EQ(13.1, p4.y());
84 1 : EXPECT_EQ(-14.2, p4.z());
85 1 : EXPECT_EQ(150.0, p4[3]);
86 1 : EXPECT_EQ(4, p4.size());
87 1 : }
88 :
89 4 : TEST_F(test_vectorx, simple_float)
90 : {
91 1 : gdal::VectorX<float, 1> p1{2.1f};
92 1 : EXPECT_EQ(2.1f, p1.x());
93 : static_assert(std::is_same_v<decltype(p1)::value_type, float> == true);
94 :
95 1 : gdal::VectorX<float, 4> p4(12.0f, 13.1f, -14.2f, 150.0f);
96 1 : EXPECT_EQ(12.0f, p4.x());
97 1 : EXPECT_EQ(13.1f, p4.y());
98 1 : EXPECT_EQ(-14.2f, p4.z());
99 1 : EXPECT_EQ(150.0f, p4[3]);
100 1 : }
101 :
102 4 : TEST_F(test_vectorx, simple_complex)
103 : {
104 : using namespace std::complex_literals;
105 1 : gdal::VectorX<std::complex<double>, 2> p2{2.1 + 3.0i, -9.0 + -7.0i};
106 1 : EXPECT_EQ(2.1 + 3.0i, p2.x());
107 1 : EXPECT_EQ(-9.0 + -7.0i, p2.y());
108 : static_assert(
109 : std::is_same_v<decltype(p2)::value_type, std::complex<double>> == true);
110 1 : }
111 :
112 4 : TEST_F(test_vectorx, array)
113 : {
114 1 : gdal::Vector2d p2(2.1, 3.6);
115 1 : const std::array<double, 2> arr = p2.array();
116 1 : EXPECT_EQ(2.1, arr[0]);
117 1 : EXPECT_EQ(3.6, arr[1]);
118 1 : }
119 :
120 4 : TEST_F(test_vectorx, fill)
121 : {
122 1 : const gdal::Vector3d a = gdal::Vector3d().fill(42.0);
123 1 : EXPECT_EQ(3, a.size());
124 1 : EXPECT_EQ(42.0, a[0]);
125 1 : EXPECT_EQ(42.0, a[1]);
126 1 : EXPECT_EQ(42.0, a[2]);
127 1 : }
128 :
129 4 : TEST_F(test_vectorx, fill_nan)
130 : {
131 : const gdal::Vector3d a =
132 1 : gdal::Vector3d().fill(std::numeric_limits<double>::quiet_NaN());
133 1 : EXPECT_EQ(3, a.size());
134 1 : EXPECT_TRUE(std::isnan(a[0]));
135 1 : EXPECT_TRUE(std::isnan(a[1]));
136 1 : EXPECT_TRUE(std::isnan(a[2]));
137 1 : }
138 :
139 4 : TEST_F(test_vectorx, change)
140 : {
141 1 : gdal::Vector2d p2(2.1, 3.6);
142 1 : p2[0] = 7;
143 1 : EXPECT_EQ(7, p2.x());
144 1 : p2[1] = 10.5;
145 1 : EXPECT_EQ(10.5, p2.y());
146 :
147 1 : gdal::Vector3d p3(12.1, 13.6, -9.0);
148 1 : p3.x() = 79;
149 1 : EXPECT_EQ(79, p3[0]);
150 1 : p3.y() = 10.4;
151 1 : EXPECT_EQ(10.4, p3[1]);
152 1 : p3.z() = 1.5;
153 1 : EXPECT_EQ(1.5, p3[2]);
154 1 : }
155 :
156 4 : TEST_F(test_vectorx, scalar_prod)
157 : {
158 1 : gdal::Vector2d a(2.1, 3.6);
159 1 : gdal::Vector2d b(-2.0, 10.0);
160 1 : EXPECT_NEAR(2.1 * -2.0 + 3.6 * 10.0, a.scalarProd(b), 1e-10);
161 1 : }
162 :
163 4 : TEST_F(test_vectorx, norm2)
164 : {
165 1 : gdal::Vector2d a(2.1, 3.6);
166 1 : EXPECT_NEAR(2.1 * 2.1 + 3.6 * 3.6, a.norm2(), 1e-10);
167 1 : }
168 :
169 4 : TEST_F(test_vectorx, cast)
170 : {
171 1 : gdal::Vector2d a(2.1, -3.6);
172 1 : auto b = a.cast<int>();
173 : static_assert(std::is_same_v<decltype(b)::value_type, int> == true);
174 1 : EXPECT_EQ(2, b.x());
175 1 : EXPECT_EQ(-3, b.y());
176 :
177 1 : gdal::Vector2d c = b.cast<double>();
178 : static_assert(std::is_same_v<decltype(c)::value_type, double> == true);
179 1 : EXPECT_EQ(2.0, c.x());
180 1 : EXPECT_EQ(-3.0, c.y());
181 1 : }
182 :
183 4 : TEST_F(test_vectorx, floor)
184 : {
185 1 : const gdal::Vector2d a(2.1, -3.6);
186 1 : const gdal::Vector2d d = a.floor();
187 1 : EXPECT_EQ(2.0, d.x());
188 1 : EXPECT_EQ(-4.0, d.y());
189 :
190 : // just to show how to use the template keyword.
191 1 : const gdal::Vector2i i = a.floor().template cast<int>();
192 1 : EXPECT_EQ(2, i.x());
193 1 : EXPECT_EQ(-4, i.y());
194 1 : }
195 :
196 4 : TEST_F(test_vectorx, ceil)
197 : {
198 1 : const gdal::Vector2d a(2.1, -3.6);
199 1 : const gdal::Vector2d d = a.ceil();
200 1 : EXPECT_EQ(3.0, d.x());
201 1 : EXPECT_EQ(-3.0, d.y());
202 1 : }
203 :
204 4 : TEST_F(test_vectorx, apply)
205 : {
206 1 : const gdal::Vector2d a(2.1, -3.6);
207 : const gdal::Vector2d d =
208 3 : a.apply([](const gdal::Vector2d::value_type v) { return v + 1.0; });
209 1 : EXPECT_NEAR(3.1, d.x(), 1e-10);
210 1 : EXPECT_NEAR(-2.6, d.y(), 1e-10);
211 1 : }
212 :
213 4 : TEST_F(test_vectorx, sum)
214 : {
215 1 : const gdal::Vector2d a(2.1, -3.6);
216 1 : const gdal::Vector2d b = a + 2.2;
217 1 : EXPECT_NEAR(4.3, b.x(), 1e-10);
218 1 : EXPECT_NEAR(-1.4, b.y(), 1e-10);
219 1 : }
220 :
221 4 : TEST_F(test_vectorx, sum_eq)
222 : {
223 1 : gdal::Vector2d a(2.1, -3.6);
224 1 : a += 2.0;
225 1 : EXPECT_NEAR(4.1, a.x(), 1e-10);
226 1 : EXPECT_NEAR(-1.6, a.y(), 1e-10);
227 1 : }
228 :
229 4 : TEST_F(test_vectorx, sum_eq_int)
230 : {
231 1 : gdal::Vector2i a(2, -3);
232 1 : a += 1;
233 1 : EXPECT_EQ(3, a.x());
234 1 : EXPECT_EQ(-2, a.y());
235 1 : }
236 :
237 4 : TEST_F(test_vectorx, minus)
238 : {
239 1 : const gdal::Vector2d a(2.1, -3.6);
240 1 : const gdal::Vector2d b = a - 2.2;
241 1 : EXPECT_NEAR(-0.1, b.x(), 1e-10);
242 1 : EXPECT_NEAR(-5.8, b.y(), 1e-10);
243 1 : }
244 :
245 4 : TEST_F(test_vectorx, minus_eq)
246 : {
247 1 : gdal::Vector2d a(2.1, -3.6);
248 1 : a -= 2.0;
249 1 : EXPECT_NEAR(0.1, a.x(), 1e-10);
250 1 : EXPECT_NEAR(-5.6, a.y(), 1e-10);
251 1 : }
252 :
253 4 : TEST_F(test_vectorx, minus_eq_int)
254 : {
255 1 : gdal::Vector2i a(2, -3);
256 1 : a -= 1;
257 1 : EXPECT_EQ(1, a.x());
258 1 : EXPECT_EQ(-4, a.y());
259 1 : }
260 :
261 4 : TEST_F(test_vectorx, minus_op)
262 : {
263 1 : gdal::Vector2d a(2.1, -3.6);
264 1 : const auto b = -a;
265 1 : EXPECT_NEAR(-2.1, b.x(), 1e-10);
266 1 : EXPECT_NEAR(3.6, b.y(), 1e-10);
267 1 : }
268 :
269 4 : TEST_F(test_vectorx, multiply_int_double)
270 : {
271 1 : gdal::Vector2i a(2, -3);
272 1 : const auto b = a * 2.6;
273 : static_assert(std::is_same_v<decltype(b)::value_type, int> == true);
274 1 : EXPECT_EQ(5, b.x());
275 1 : EXPECT_EQ(-7, b.y());
276 1 : }
277 :
278 4 : TEST_F(test_vectorx, multiply_double)
279 : {
280 1 : gdal::Vector2d a(2.1, -3.2);
281 1 : const auto b = a * 2.6;
282 1 : EXPECT_NEAR(5.46, b.x(), 1e-10);
283 1 : EXPECT_NEAR(-8.32, b.y(), 1e-10);
284 1 : }
285 :
286 4 : TEST_F(test_vectorx, divide_int_double)
287 : {
288 1 : gdal::Vector2i a(4, -3);
289 1 : const auto b = a / 2.2;
290 : static_assert(std::is_same_v<decltype(b)::value_type, int> == true);
291 1 : EXPECT_EQ(1, b.x());
292 1 : EXPECT_EQ(-1, b.y());
293 1 : }
294 :
295 4 : TEST_F(test_vectorx, divide_double)
296 : {
297 1 : gdal::Vector2d a(2.1, -3.2);
298 1 : const auto b = a / 2.5;
299 1 : EXPECT_NEAR(0.84, b.x(), 1e-10);
300 1 : EXPECT_NEAR(-1.28, b.y(), 1e-10);
301 1 : }
302 :
303 4 : TEST_F(test_vectorx, plus_vectorx)
304 : {
305 1 : const gdal::Vector2d a(2.1, -3.6);
306 1 : const gdal::Vector2d b(10.0, 1.1);
307 1 : const auto c = a + b;
308 1 : EXPECT_NEAR(12.1, c.x(), 1e-10);
309 1 : EXPECT_NEAR(-2.5, c.y(), 1e-10);
310 1 : }
311 :
312 4 : TEST_F(test_vectorx, minus_vectorx)
313 : {
314 1 : const gdal::Vector2d a(2.1, -3.6);
315 1 : const gdal::Vector2d b(10.0, 1.1);
316 1 : const auto c = a - b;
317 1 : EXPECT_NEAR(-7.9, c.x(), 1e-10);
318 1 : EXPECT_NEAR(-4.7, c.y(), 1e-10);
319 1 : }
320 :
321 4 : TEST_F(test_vectorx, plus_scalar_vectorx)
322 : {
323 1 : const gdal::Vector2d a(2.1, -3.6);
324 1 : const auto b = 2.5 + a;
325 1 : EXPECT_NEAR(4.6, b.x(), 1e-10);
326 1 : EXPECT_NEAR(-1.1, b.y(), 1e-10);
327 1 : }
328 :
329 4 : TEST_F(test_vectorx, minus_scalar_vectorx)
330 : {
331 1 : const gdal::Vector2d a(2.1, -3.6);
332 1 : const auto b = 2.5 - a;
333 1 : EXPECT_NEAR(0.4, b.x(), 1e-10);
334 1 : EXPECT_NEAR(6.1, b.y(), 1e-10);
335 1 : }
336 :
337 : } // namespace
|