sandbox
Loading...
Searching...
No Matches
vector3_tests.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MATH_VECTOR3_TESTS_HPP_
3#define LIBSBX_MATH_VECTOR3_TESTS_HPP_
4
5#include <sstream>
6
7#include <gtest/gtest.h>
8
9#include <libsbx/math/vector3.hpp>
10
11TEST(libsbx_math_vector3, zero) {
12 const auto vector = sbx::math::vector3::zero;
13
14 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
15 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
16 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
17}
18
19TEST(libsbx_math_vector3, one) {
20 const auto vector = sbx::math::vector3::one;
21
22 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
23 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
24 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
25}
26
27TEST(libsbx_math_vector3, right) {
28 const auto vector = sbx::math::vector3::right;
29
30 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
31 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
32 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
33}
34
35TEST(libsbx_math_vector3, left) {
36 const auto vector = sbx::math::vector3::left;
37
38 EXPECT_FLOAT_EQ(vector.x(), -1.0f);
39 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
40 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
41}
42
43TEST(libsbx_math_vector3, up) {
44 const auto vector = sbx::math::vector3::up;
45
46 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
47 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
48 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
49}
50
51TEST(libsbx_math_vector3, down) {
52 const auto vector = sbx::math::vector3::down;
53
54 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
55 EXPECT_FLOAT_EQ(vector.y(), -1.0f);
56 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
57}
58
59TEST(libsbx_math_vector3, forward) {
60 const auto vector = sbx::math::vector3::forward;
61
62 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
63 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
64 EXPECT_FLOAT_EQ(vector.z(), -1.0f);
65}
66
67TEST(libsbx_math_vector3, backward) {
68 const auto vector = sbx::math::vector3::backward;
69
70 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
71 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
72 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
73}
74
75TEST(libsbx_math_vector3, default_constructor) {
76 const auto vector = sbx::math::vector3{};
77
78 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
79 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
80 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
81}
82
83TEST(libsbx_math_vector3, base_constructor) {
85 const auto vector = sbx::math::vector3{base};
86
87 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
88 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
89 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
90}
91
92TEST(libsbx_math_vector3, single_value_constructor) {
93 const auto vector = sbx::math::vector3{1};
94
95 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
96 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
97 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
98}
99
100TEST(libsbx_math_vector3, multi_value_constructor) {
101 const auto vector = sbx::math::vector3{1, 2, 3};
102
103 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
104 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
105 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
106}
107
108TEST(libsbx_math_vector3, vector2_constructor) {
109 const auto vector = sbx::math::vector3{sbx::math::vector2{1, 2}};
110
111 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
112 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
113 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
114
115 const auto other = sbx::math::vector3{sbx::math::vector2{1, 2}, 3};
116
117 EXPECT_FLOAT_EQ(other.x(), 1.0f);
118 EXPECT_FLOAT_EQ(other.y(), 2.0f);
119 EXPECT_FLOAT_EQ(other.z(), 3.0f);
120}
121
122TEST(libsbx_math_vector3, copy_constructor) {
123 const auto vector = sbx::math::vector3{1, 2, 3};
124 const auto other = vector;
125
126 EXPECT_FLOAT_EQ(other.x(), 1.0f);
127 EXPECT_FLOAT_EQ(other.y(), 2.0f);
128 EXPECT_FLOAT_EQ(other.z(), 3.0f);
129}
130
131TEST(libsbx_math_vector3, move_constructor) {
132 auto vector = sbx::math::vector3{1, 2, 3};
133 const auto other = std::move(vector);
134
135 EXPECT_FLOAT_EQ(other.x(), 1.0f);
136 EXPECT_FLOAT_EQ(other.y(), 2.0f);
137 EXPECT_FLOAT_EQ(other.z(), 3.0f);
138}
139
140TEST(libsbx_math_vector3, cross_product) {
141 const auto lhs = sbx::math::vector3{1, 2, 3};
142 const auto rhs = sbx::math::vector3{4, 5, 6};
143
144 const auto result = sbx::math::vector3::cross(lhs, rhs);
145
146 EXPECT_FLOAT_EQ(result.x(), -3.0f);
147 EXPECT_FLOAT_EQ(result.y(), 6.0f);
148 EXPECT_FLOAT_EQ(result.z(), -3.0f);
149}
150
151TEST(libsbx_math_vector3, dot_product) {
152 const auto lhs = sbx::math::vector3{1, 2, 3};
153 const auto rhs = sbx::math::vector3{4, 5, 6};
154
155 const auto result = sbx::math::vector3::dot(lhs, rhs);
156
157 EXPECT_FLOAT_EQ(result, 32.0f);
158}
159
160TEST(libsbx_math_vector3, normalized) {
161 const auto vector = sbx::math::vector3{1, 2, 3};
162
163 const auto result = sbx::math::vector3::normalized(vector);
164
165 EXPECT_FLOAT_EQ(result.x(), 0.26726124191242438468455348087975f);
166 EXPECT_FLOAT_EQ(result.y(), 0.5345224838248487693691069617595f);
167 EXPECT_FLOAT_EQ(result.z(), 0.80178372573727315405366044263925f);
168 EXPECT_FLOAT_EQ(result.length(), 1.0f);
169}
170
171TEST(libsbx_math_vector3, conversion) {
172 const auto vector = sbx::math::vector3{1, 2, 3};
173
174 const auto result = sbx::math::vector2{vector};
175
176 EXPECT_FLOAT_EQ(result.x(), 1.0f);
177 EXPECT_FLOAT_EQ(result.y(), 2.0f);
178}
179
180TEST(libsbx_math_vector3, copy_assignment) {
181 auto vector = sbx::math::vector3{1, 2, 3};
182 const auto other = sbx::math::vector3{1, 2, 3};
183
184 vector = other;
185
186 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
187 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
188 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
189}
190
191TEST(libsbx_math_vector3, move_assignment) {
192 auto vector = sbx::math::vector3{1, 2, 3};
193 const auto other = sbx::math::vector3{1, 2, 3};
194
195 vector = std::move(other);
196
197 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
198 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
199 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
200}
201
202TEST(libsbx_math_vector3, addition_assignment) {
203 auto vector = sbx::math::vector3{1, 2, 3};
204 const auto other = sbx::math::vector3{1, 2, 3};
205
206 vector += other;
207
208 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
209 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
210 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
211}
212
213TEST(libsbx_math_vector3, subtraction_assignment) {
214 auto vector = sbx::math::vector3{1, 2, 3};
215 const auto other = sbx::math::vector3{1, 2, 3};
216
217 vector -= other;
218
219 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
220 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
221 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
222}
223
224TEST(libsbx_math_vector3, multiplication_assignment) {
225 auto vector = sbx::math::vector3{1, 2, 3};
226
227 vector *= 2;
228
229 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
230 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
231 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
232}
233
234TEST(libsbx_math_vector3, division_assignment) {
235 auto vector = sbx::math::vector3{2, 4, 6};
236
237 vector /= 2;
238
239 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
240 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
241 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
242}
243
244TEST(libsbx_math_vector3, equality) {
245 const auto vector = sbx::math::vector3{1, 2, 3};
246 const auto other = sbx::math::vector3{1, 2, 3};
247
248 EXPECT_TRUE(vector == other);
249}
250
251TEST(libsbx_math_vector3, inequality) {
252 const auto vector = sbx::math::vector3{1, 2, 3};
253 const auto other = sbx::math::vector3{3, 2, 1};
254
255 EXPECT_TRUE(vector != other);
256}
257
258TEST(libsbx_math_vector3, addition) {
259 const auto vector = sbx::math::vector3{1, 2, 3};
260 const auto other = sbx::math::vector3{1, 2, 3};
261
262 const auto result = vector + other;
263
264 EXPECT_FLOAT_EQ(result.x(), 2.0f);
265 EXPECT_FLOAT_EQ(result.y(), 4.0f);
266 EXPECT_FLOAT_EQ(result.z(), 6.0f);
267}
268
269TEST(libsbx_math_vector3, subtraction) {
270 const auto vector = sbx::math::vector3{1, 2, 3};
271 const auto other = sbx::math::vector3{1, 2, 3};
272
273 const auto result = vector - other;
274
275 EXPECT_FLOAT_EQ(result.x(), 0.0f);
276 EXPECT_FLOAT_EQ(result.y(), 0.0f);
277 EXPECT_FLOAT_EQ(result.z(), 0.0f);
278}
279
280TEST(libsbx_math_vector3, negation) {
281 const auto vector = sbx::math::vector3{1, 2, 3};
282
283 const auto result = -vector;
284
285 EXPECT_FLOAT_EQ(result.x(), -1.0f);
286 EXPECT_FLOAT_EQ(result.y(), -2.0f);
287 EXPECT_FLOAT_EQ(result.z(), -3.0f);
288}
289
290TEST(libsbx_math_vector3, multiplication) {
291 const auto vector = sbx::math::vector3{1, 2, 3};
292
293 const auto result = vector * 2;
294
295 EXPECT_FLOAT_EQ(result.x(), 2.0f);
296 EXPECT_FLOAT_EQ(result.y(), 4.0f);
297 EXPECT_FLOAT_EQ(result.z(), 6.0f);
298}
299
300TEST(libsbx_math_vector3, division) {
301 const auto vector = sbx::math::vector3{2, 4, 6};
302
303 const auto result = vector / 2;
304
305 EXPECT_FLOAT_EQ(result.x(), 1.0f);
306 EXPECT_FLOAT_EQ(result.y(), 2.0f);
307 EXPECT_FLOAT_EQ(result.z(), 3.0f);
308}
309
310TEST(libsbx_math_vector3, length_squared) {
311 const auto vector = sbx::math::vector3{2, 4, 6};
312
313 EXPECT_FLOAT_EQ(vector.length_squared(), 56.0f);
314}
315
316TEST(libsbx_math_vector3, length) {
317 const auto vector = sbx::math::vector3{2, 4, 6};
318
319 EXPECT_FLOAT_EQ(vector.length(), 7.4833147735478831617390654696346f);
320}
321
322TEST(libsbx_math_vector3, get_x) {
323 const auto vector = sbx::math::vector3{1, 2, 3};
324
325 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
326}
327
328TEST(libsbx_math_vector3, set_x) {
329 auto vector = sbx::math::vector3{1, 2, 3};
330
331 vector.x() = 2;
332
333 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
334}
335
336TEST(libsbx_math_vector3, get_y) {
337 const auto vector = sbx::math::vector3{1, 2, 3};
338
339 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
340}
341
342TEST(libsbx_math_vector3, set_y) {
343 auto vector = sbx::math::vector3{1, 2, 3};
344
345 vector.y() = 3;
346
347 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
348}
349
350TEST(libsbx_math_vector3, get_z) {
351 const auto vector = sbx::math::vector3{1, 2, 3};
352
353 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
354}
355
356TEST(libsbx_math_vector3, set_z) {
357 auto vector = sbx::math::vector3{1, 2, 3};
358
359 vector.z() = 4;
360
361 EXPECT_FLOAT_EQ(vector.z(), 4.0f);
362}
363
364TEST(libsbx_math_vector3, hash) {
365 const auto first = sbx::math::vector3{1, 2, 3};
366 const auto second = sbx::math::vector3{1, 2, 3};
367
368 EXPECT_EQ(std::hash<sbx::math::vector3>{}(first), std::hash<sbx::math::vector3>{}(second));
369}
370
371TEST(libsbx_math_vector3, formatting) {
372 const auto float_vector = sbx::math::vector3f{1, 2, 3};
373
374 auto formatted = fmt::format("{}", float_vector);
375
376 EXPECT_STREQ(formatted.c_str(), "{x: 1.00, y: 2.00, z: 3.00}");
377
378 const auto int_vector = sbx::math::vector3i{1, 2, 3};
379
380 formatted = fmt::format("{}", int_vector);
381
382 EXPECT_STREQ(formatted.c_str(), "{x: 1, y: 2, z: 3}");
383}
384
385TEST(libsbx_math_vector3, serialize) {
386 const auto vector = sbx::math::vector3{1, 2, 3};
387
388 const auto serialized = YAML::Node{vector};
389
390 EXPECT_FLOAT_EQ(serialized["x"].as<std::float_t>(), 1.0f);
391 EXPECT_FLOAT_EQ(serialized["y"].as<std::float_t>(), 2.0f);
392 EXPECT_FLOAT_EQ(serialized["z"].as<std::float_t>(), 3.0f);
393
394 auto steam = std::stringstream{};
395
396 steam << serialized;
397
398 EXPECT_STREQ(steam.str().c_str(), "{x: 1, y: 2, z: 3}");
399}
400
401TEST(libsbx_math_vector3, deserialize) {
402 const auto node = YAML::Load("{x: 1, y: 2, z: 3}");
403
404 const auto vector = node.as<sbx::math::vector3>();
405
406 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
407 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
408 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
409}
410
411#endif // LIBSBX_MATH_VECTOR3_TESTS_HPP_
Definition: tests.cpp:6
A vector in two-dimensional space.
Definition: vector2.hpp:28
Definition: vector3.hpp:23
Fixed-size vector type.
Definition: vector.hpp:55