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