2#ifndef LIBSBX_MATH_VECTOR3_TESTS_HPP_
3#define LIBSBX_MATH_VECTOR3_TESTS_HPP_
7#include <gtest/gtest.h>
9#include <libsbx/math/vector3.hpp>
11TEST(libsbx_math_vector3, zero) {
12 const auto vector = sbx::math::vector3::zero;
14 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
15 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
16 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
19TEST(libsbx_math_vector3, one) {
20 const auto vector = sbx::math::vector3::one;
22 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
23 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
24 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
27TEST(libsbx_math_vector3, right) {
28 const auto vector = sbx::math::vector3::right;
30 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
31 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
32 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
35TEST(libsbx_math_vector3, left) {
36 const auto vector = sbx::math::vector3::left;
38 EXPECT_FLOAT_EQ(vector.x(), -1.0f);
39 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
40 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
43TEST(libsbx_math_vector3, up) {
44 const auto vector = sbx::math::vector3::up;
46 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
47 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
48 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
51TEST(libsbx_math_vector3, down) {
52 const auto vector = sbx::math::vector3::down;
54 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
55 EXPECT_FLOAT_EQ(vector.y(), -1.0f);
56 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
59TEST(libsbx_math_vector3, forward) {
60 const auto vector = sbx::math::vector3::forward;
62 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
63 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
64 EXPECT_FLOAT_EQ(vector.z(), -1.0f);
67TEST(libsbx_math_vector3, backward) {
68 const auto vector = sbx::math::vector3::backward;
70 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
71 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
72 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
75TEST(libsbx_math_vector3, default_constructor) {
78 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
79 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
80 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
83TEST(libsbx_math_vector3, base_constructor) {
87 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
88 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
89 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
92TEST(libsbx_math_vector3, single_value_constructor) {
95 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
96 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
97 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
100TEST(libsbx_math_vector3, multi_value_constructor) {
103 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
104 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
105 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
108TEST(libsbx_math_vector3, vector2_constructor) {
111 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
112 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
113 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
117 EXPECT_FLOAT_EQ(other.x(), 1.0f);
118 EXPECT_FLOAT_EQ(other.y(), 2.0f);
119 EXPECT_FLOAT_EQ(other.z(), 3.0f);
122TEST(libsbx_math_vector3, copy_constructor) {
124 const auto other = vector;
126 EXPECT_FLOAT_EQ(other.x(), 1.0f);
127 EXPECT_FLOAT_EQ(other.y(), 2.0f);
128 EXPECT_FLOAT_EQ(other.z(), 3.0f);
131TEST(libsbx_math_vector3, move_constructor) {
133 const auto other = std::move(vector);
135 EXPECT_FLOAT_EQ(other.x(), 1.0f);
136 EXPECT_FLOAT_EQ(other.y(), 2.0f);
137 EXPECT_FLOAT_EQ(other.z(), 3.0f);
140TEST(libsbx_math_vector3, cross_product) {
144 const auto result = sbx::math::vector3::cross(lhs, rhs);
146 EXPECT_FLOAT_EQ(result.x(), -3.0f);
147 EXPECT_FLOAT_EQ(result.y(), 6.0f);
148 EXPECT_FLOAT_EQ(result.z(), -3.0f);
151TEST(libsbx_math_vector3, dot_product) {
155 const auto result = sbx::math::vector3::dot(lhs, rhs);
157 EXPECT_FLOAT_EQ(result, 32.0f);
160TEST(libsbx_math_vector3, normalized) {
163 const auto result = sbx::math::vector3::normalized(vector);
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);
171TEST(libsbx_math_vector3, conversion) {
176 EXPECT_FLOAT_EQ(result.x(), 1.0f);
177 EXPECT_FLOAT_EQ(result.y(), 2.0f);
180TEST(libsbx_math_vector3, copy_assignment) {
186 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
187 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
188 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
191TEST(libsbx_math_vector3, move_assignment) {
195 vector = std::move(other);
197 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
198 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
199 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
202TEST(libsbx_math_vector3, addition_assignment) {
208 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
209 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
210 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
213TEST(libsbx_math_vector3, subtraction_assignment) {
219 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
220 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
221 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
224TEST(libsbx_math_vector3, multiplication_assignment) {
229 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
230 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
231 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
234TEST(libsbx_math_vector3, division_assignment) {
239 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
240 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
241 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
244TEST(libsbx_math_vector3, equality) {
248 EXPECT_TRUE(vector == other);
251TEST(libsbx_math_vector3, inequality) {
255 EXPECT_TRUE(vector != other);
258TEST(libsbx_math_vector3, addition) {
262 const auto result = vector + other;
264 EXPECT_FLOAT_EQ(result.x(), 2.0f);
265 EXPECT_FLOAT_EQ(result.y(), 4.0f);
266 EXPECT_FLOAT_EQ(result.z(), 6.0f);
269TEST(libsbx_math_vector3, subtraction) {
273 const auto result = vector - other;
275 EXPECT_FLOAT_EQ(result.x(), 0.0f);
276 EXPECT_FLOAT_EQ(result.y(), 0.0f);
277 EXPECT_FLOAT_EQ(result.z(), 0.0f);
280TEST(libsbx_math_vector3, negation) {
283 const auto result = -vector;
285 EXPECT_FLOAT_EQ(result.x(), -1.0f);
286 EXPECT_FLOAT_EQ(result.y(), -2.0f);
287 EXPECT_FLOAT_EQ(result.z(), -3.0f);
290TEST(libsbx_math_vector3, multiplication) {
293 const auto result = vector * 2;
295 EXPECT_FLOAT_EQ(result.x(), 2.0f);
296 EXPECT_FLOAT_EQ(result.y(), 4.0f);
297 EXPECT_FLOAT_EQ(result.z(), 6.0f);
300TEST(libsbx_math_vector3, division) {
303 const auto result = vector / 2;
305 EXPECT_FLOAT_EQ(result.x(), 1.0f);
306 EXPECT_FLOAT_EQ(result.y(), 2.0f);
307 EXPECT_FLOAT_EQ(result.z(), 3.0f);
310TEST(libsbx_math_vector3, length_squared) {
313 EXPECT_FLOAT_EQ(vector.length_squared(), 56.0f);
316TEST(libsbx_math_vector3, length) {
319 EXPECT_FLOAT_EQ(vector.length(), 7.4833147735478831617390654696346f);
322TEST(libsbx_math_vector3, get_x) {
325 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
328TEST(libsbx_math_vector3, set_x) {
333 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
336TEST(libsbx_math_vector3, get_y) {
339 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
342TEST(libsbx_math_vector3, set_y) {
347 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
350TEST(libsbx_math_vector3, get_z) {
353 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
356TEST(libsbx_math_vector3, set_z) {
361 EXPECT_FLOAT_EQ(vector.z(), 4.0f);
364TEST(libsbx_math_vector3, hash) {
368 EXPECT_EQ(std::hash<sbx::math::vector3>{}(first), std::hash<sbx::math::vector3>{}(second));
371TEST(libsbx_math_vector3, formatting) {
374 auto formatted = fmt::format(
"{}", float_vector);
376 EXPECT_STREQ(formatted.c_str(),
"{x: 1.00, y: 2.00, z: 3.00}");
380 formatted = fmt::format(
"{}", int_vector);
382 EXPECT_STREQ(formatted.c_str(),
"{x: 1, y: 2, z: 3}");
385TEST(libsbx_math_vector3, serialize) {
388 const auto serialized = YAML::Node{vector};
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);
394 auto steam = std::stringstream{};
398 EXPECT_STREQ(steam.str().c_str(),
"{x: 1, y: 2, z: 3}");
401TEST(libsbx_math_vector3, deserialize) {
402 const auto node = YAML::Load(
"{x: 1, y: 2, z: 3}");
406 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
407 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
408 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
A vector in two-dimensional space.
Definition: vector2.hpp:28
Definition: vector3.hpp:23
Fixed-size vector type.
Definition: vector.hpp:55