1#ifndef LIBSBX_MATH_VECTOR3_TESTS_HPP_
2#define LIBSBX_MATH_VECTOR3_TESTS_HPP_
6#include <gtest/gtest.h>
8#include <libsbx/math/vector3.hpp>
10TEST(libsbx_math_vector3, zero) {
11 const auto vector = sbx::math::vector3::zero;
13 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
14 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
15 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
18TEST(libsbx_math_vector3, one) {
19 const auto vector = sbx::math::vector3::one;
21 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
22 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
23 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
26TEST(libsbx_math_vector3, right) {
27 const auto vector = sbx::math::vector3::right;
29 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
30 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
31 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
34TEST(libsbx_math_vector3, left) {
35 const auto vector = sbx::math::vector3::left;
37 EXPECT_FLOAT_EQ(vector.x(), -1.0f);
38 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
39 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
42TEST(libsbx_math_vector3, up) {
43 const auto vector = sbx::math::vector3::up;
45 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
46 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
47 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
50TEST(libsbx_math_vector3, down) {
51 const auto vector = sbx::math::vector3::down;
53 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
54 EXPECT_FLOAT_EQ(vector.y(), -1.0f);
55 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
58TEST(libsbx_math_vector3, forward) {
59 const auto vector = sbx::math::vector3::forward;
61 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
62 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
63 EXPECT_FLOAT_EQ(vector.z(), -1.0f);
66TEST(libsbx_math_vector3, backward) {
67 const auto vector = sbx::math::vector3::backward;
69 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
70 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
71 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
74TEST(libsbx_math_vector3, default_constructor) {
77 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
78 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
79 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
82TEST(libsbx_math_vector3, base_constructor) {
86 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
87 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
88 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
91TEST(libsbx_math_vector3, single_value_constructor) {
94 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
95 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
96 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
99TEST(libsbx_math_vector3, multi_value_constructor) {
102 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
103 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
104 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
107TEST(libsbx_math_vector3, vector2_constructor) {
110 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
111 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
112 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
116 EXPECT_FLOAT_EQ(other.x(), 1.0f);
117 EXPECT_FLOAT_EQ(other.y(), 2.0f);
118 EXPECT_FLOAT_EQ(other.z(), 3.0f);
121TEST(libsbx_math_vector3, copy_constructor) {
123 const auto other = vector;
125 EXPECT_FLOAT_EQ(other.x(), 1.0f);
126 EXPECT_FLOAT_EQ(other.y(), 2.0f);
127 EXPECT_FLOAT_EQ(other.z(), 3.0f);
130TEST(libsbx_math_vector3, move_constructor) {
132 const auto other = std::move(vector);
134 EXPECT_FLOAT_EQ(other.x(), 1.0f);
135 EXPECT_FLOAT_EQ(other.y(), 2.0f);
136 EXPECT_FLOAT_EQ(other.z(), 3.0f);
139TEST(libsbx_math_vector3, cross_product) {
143 const auto result = sbx::math::vector3::cross(lhs, rhs);
145 EXPECT_FLOAT_EQ(result.x(), -3.0f);
146 EXPECT_FLOAT_EQ(result.y(), 6.0f);
147 EXPECT_FLOAT_EQ(result.z(), -3.0f);
150TEST(libsbx_math_vector3, dot_product) {
154 const auto result = sbx::math::vector3::dot(lhs, rhs);
156 EXPECT_FLOAT_EQ(result, 32.0f);
159TEST(libsbx_math_vector3, normalized) {
162 const auto result = sbx::math::vector3::normalized(vector);
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);
170TEST(libsbx_math_vector3, conversion) {
175 EXPECT_FLOAT_EQ(result.x(), 1.0f);
176 EXPECT_FLOAT_EQ(result.y(), 2.0f);
179TEST(libsbx_math_vector3, copy_assignment) {
185 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
186 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
187 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
190TEST(libsbx_math_vector3, move_assignment) {
194 vector = std::move(other);
196 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
197 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
198 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
201TEST(libsbx_math_vector3, addition_assignment) {
207 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
208 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
209 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
212TEST(libsbx_math_vector3, subtraction_assignment) {
218 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
219 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
220 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
223TEST(libsbx_math_vector3, multiplication_assignment) {
228 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
229 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
230 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
233TEST(libsbx_math_vector3, division_assignment) {
238 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
239 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
240 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
243TEST(libsbx_math_vector3, equality) {
247 EXPECT_TRUE(vector == other);
250TEST(libsbx_math_vector3, inequality) {
254 EXPECT_TRUE(vector != other);
257TEST(libsbx_math_vector3, addition) {
261 const auto result = vector + other;
263 EXPECT_FLOAT_EQ(result.x(), 2.0f);
264 EXPECT_FLOAT_EQ(result.y(), 4.0f);
265 EXPECT_FLOAT_EQ(result.z(), 6.0f);
268TEST(libsbx_math_vector3, subtraction) {
272 const auto result = vector - other;
274 EXPECT_FLOAT_EQ(result.x(), 0.0f);
275 EXPECT_FLOAT_EQ(result.y(), 0.0f);
276 EXPECT_FLOAT_EQ(result.z(), 0.0f);
279TEST(libsbx_math_vector3, negation) {
282 const auto result = -vector;
284 EXPECT_FLOAT_EQ(result.x(), -1.0f);
285 EXPECT_FLOAT_EQ(result.y(), -2.0f);
286 EXPECT_FLOAT_EQ(result.z(), -3.0f);
289TEST(libsbx_math_vector3, multiplication) {
292 const auto result = vector * 2;
294 EXPECT_FLOAT_EQ(result.x(), 2.0f);
295 EXPECT_FLOAT_EQ(result.y(), 4.0f);
296 EXPECT_FLOAT_EQ(result.z(), 6.0f);
299TEST(libsbx_math_vector3, division) {
302 const auto result = vector / 2;
304 EXPECT_FLOAT_EQ(result.x(), 1.0f);
305 EXPECT_FLOAT_EQ(result.y(), 2.0f);
306 EXPECT_FLOAT_EQ(result.z(), 3.0f);
309TEST(libsbx_math_vector3, length_squared) {
312 EXPECT_FLOAT_EQ(vector.length_squared(), 56.0f);
315TEST(libsbx_math_vector3, length) {
318 EXPECT_FLOAT_EQ(vector.length(), 7.4833147735478831617390654696346f);
321TEST(libsbx_math_vector3, get_x) {
324 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
327TEST(libsbx_math_vector3, set_x) {
332 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
335TEST(libsbx_math_vector3, get_y) {
338 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
341TEST(libsbx_math_vector3, set_y) {
346 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
349TEST(libsbx_math_vector3, get_z) {
352 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
355TEST(libsbx_math_vector3, set_z) {
360 EXPECT_FLOAT_EQ(vector.z(), 4.0f);
363TEST(libsbx_math_vector3, hash) {
367 EXPECT_EQ(std::hash<sbx::math::vector3>{}(first), std::hash<sbx::math::vector3>{}(second));
370TEST(libsbx_math_vector3, formatting) {
373 auto formatted = fmt::format(
"{}", float_vector);
375 EXPECT_STREQ(formatted.c_str(),
"{x: 1.00, y: 2.00, z: 3.00}");
379 formatted = fmt::format(
"{}", int_vector);
381 EXPECT_STREQ(formatted.c_str(),
"{x: 1, y: 2, z: 3}");
384TEST(libsbx_math_vector3, serialize) {
387 const auto serialized = YAML::Node{vector};
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);
393 auto steam = std::stringstream{};
397 EXPECT_STREQ(steam.str().c_str(),
"{x: 1, y: 2, z: 3}");
400TEST(libsbx_math_vector3, deserialize) {
401 const auto node = YAML::Load(
"{x: 1, y: 2, z: 3}");
405 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
406 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
407 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
A vector in two-dimensional space.
Definition: vector2.hpp:27
Definition: vector3.hpp:22
Definition: vector.hpp:19