2#ifndef LIBSBX_MATH_TESTS_VECTOR4_TESTS_HPP_
3#define LIBSBX_MATH_TESTS_VECTOR4_TESTS_HPP_
7#include <gtest/gtest.h>
9#include <libsbx/math/vector4.hpp>
11TEST(libsbx_math_vector4, zero) {
12 const auto vector = sbx::math::vector4::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);
17 EXPECT_FLOAT_EQ(vector.w(), 0.0f);
20TEST(libsbx_math_vector4, one) {
21 const auto vector = sbx::math::vector4::one;
23 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
24 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
25 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
26 EXPECT_FLOAT_EQ(vector.w(), 1.0f);
29TEST(libsbx_math_vector4, default_constructor) {
32 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
33 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
34 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
35 EXPECT_FLOAT_EQ(vector.w(), 0.0f);
38TEST(libsbx_math_vector4, base_constructor) {
42 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
43 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
44 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
45 EXPECT_FLOAT_EQ(vector.w(), 1.0f);
48TEST(libsbx_math_vector4, single_value_constructor) {
51 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
52 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
53 EXPECT_FLOAT_EQ(vector.z(), 1.0f);
54 EXPECT_FLOAT_EQ(vector.w(), 1.0f);
57TEST(libsbx_math_vector4, multi_value_constructor) {
60 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
61 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
62 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
63 EXPECT_FLOAT_EQ(vector.w(), 4.0f);
66TEST(libsbx_math_vector4, vector3_constructor) {
69 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
70 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
71 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
72 EXPECT_FLOAT_EQ(vector.w(), 0.0f);
76 EXPECT_FLOAT_EQ(other.x(), 1.0f);
77 EXPECT_FLOAT_EQ(other.y(), 2.0f);
78 EXPECT_FLOAT_EQ(other.z(), 3.0f);
79 EXPECT_FLOAT_EQ(other.w(), 4.0f);
82TEST(libsbx_math_vector4, dot_product) {
86 const auto result = sbx::math::vector4::dot(lhs, rhs);
88 EXPECT_FLOAT_EQ(result, 20.0f);
91TEST(libsbx_math_vector4, normalized) {
93 const auto result = sbx::math::vector4::normalized(vector);
95 EXPECT_FLOAT_EQ(result.x(), 0.1825741858350553711523232609336f);
96 EXPECT_FLOAT_EQ(result.y(), 0.3651483716701107423046465218672f);
97 EXPECT_FLOAT_EQ(result.z(), 0.5477225575051661134569697828008f);
98 EXPECT_FLOAT_EQ(result.w(), 0.7302967433402214846092930437344f);
99 EXPECT_FLOAT_EQ(result.length(), 1.0f);
102TEST(libsbx_math_vector4, conversion) {
107 EXPECT_FLOAT_EQ(result.x(), 1.0f);
108 EXPECT_FLOAT_EQ(result.y(), 2.0f);
109 EXPECT_FLOAT_EQ(result.z(), 3.0f);
112TEST(libsbx_math_vector4, copy_constructor) {
114 const auto other = vector;
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 EXPECT_FLOAT_EQ(other.w(), 4.0f);
122TEST(libsbx_math_vector4, move_constructor) {
124 const auto other = std::move(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);
129 EXPECT_FLOAT_EQ(other.w(), 4.0f);
132TEST(libsbx_math_vector4, copy_assignment) {
137 EXPECT_FLOAT_EQ(other.x(), 1.0f);
138 EXPECT_FLOAT_EQ(other.y(), 2.0f);
139 EXPECT_FLOAT_EQ(other.z(), 3.0f);
140 EXPECT_FLOAT_EQ(other.w(), 4.0f);
143TEST(libsbx_math_vector4, move_assignment) {
146 other = std::move(vector);
148 EXPECT_FLOAT_EQ(other.x(), 1.0f);
149 EXPECT_FLOAT_EQ(other.y(), 2.0f);
150 EXPECT_FLOAT_EQ(other.z(), 3.0f);
151 EXPECT_FLOAT_EQ(other.w(), 4.0f);
154TEST(libsbx_math_vector4, addition_assignment) {
160 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
161 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
162 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
163 EXPECT_FLOAT_EQ(vector.w(), 8.0f);
166TEST(libsbx_math_vector4, subtraction_assignment) {
172 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
173 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
174 EXPECT_FLOAT_EQ(vector.z(), 0.0f);
175 EXPECT_FLOAT_EQ(vector.w(), 0.0f);
178TEST(libsbx_math_vector4, multiplication_assignment) {
183 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
184 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
185 EXPECT_FLOAT_EQ(vector.z(), 6.0f);
186 EXPECT_FLOAT_EQ(vector.w(), 8.0f);
189TEST(libsbx_math_vector4, division_assignment) {
194 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
195 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
196 EXPECT_FLOAT_EQ(vector.z(), 3.0f);
197 EXPECT_FLOAT_EQ(vector.w(), 4.0f);
200TEST(libsbx_math_vector4, equality) {
204 EXPECT_TRUE(lhs == rhs);
205 EXPECT_FALSE(lhs != rhs);
208TEST(libsbx_math_vector4, inequality) {
212 EXPECT_TRUE(lhs != rhs);
213 EXPECT_FALSE(lhs == rhs);
216TEST(libsbx_math_vector4, addition) {
219 const auto result = lhs + rhs;
221 EXPECT_FLOAT_EQ(result.x(), 5.0f);
222 EXPECT_FLOAT_EQ(result.y(), 5.0f);
223 EXPECT_FLOAT_EQ(result.z(), 5.0f);
224 EXPECT_FLOAT_EQ(result.w(), 5.0f);
227TEST(libsbx_math_vector4, subtraction) {
230 const auto result = lhs - rhs;
232 EXPECT_FLOAT_EQ(result.x(), -3.0f);
233 EXPECT_FLOAT_EQ(result.y(), -1.0f);
234 EXPECT_FLOAT_EQ(result.z(), 1.0f);
235 EXPECT_FLOAT_EQ(result.w(), 3.0f);
238TEST(libsbx_math_vector4, negation) {
240 const auto result = -vector;
242 EXPECT_FLOAT_EQ(result.x(), -1.0f);
243 EXPECT_FLOAT_EQ(result.y(), -2.0f);
244 EXPECT_FLOAT_EQ(result.z(), -3.0f);
245 EXPECT_FLOAT_EQ(result.w(), -4.0f);
248TEST(libsbx_math_vector4, multiplication) {
251 const auto result = lhs * 2.0f;
253 EXPECT_FLOAT_EQ(result.x(), 2.0f);
254 EXPECT_FLOAT_EQ(result.y(), 4.0f);
255 EXPECT_FLOAT_EQ(result.z(), 6.0f);
256 EXPECT_FLOAT_EQ(result.w(), 8.0f);
259TEST(libsbx_math_vector4, division) {
262 const auto result = lhs / 2.0f;
264 EXPECT_FLOAT_EQ(result.x(), 2.0f);
265 EXPECT_FLOAT_EQ(result.y(), 3.0f);
266 EXPECT_FLOAT_EQ(result.z(), 3.0f);
267 EXPECT_FLOAT_EQ(result.w(), 2.0f);
270TEST(libsbx_math_vector4, length_squared) {
275 EXPECT_FLOAT_EQ(result, 120.0f);
278TEST(libsbx_math_vector4, length) {
281 const auto result = vector.
length();
283 EXPECT_FLOAT_EQ(result, 10.954451150103322f);
286TEST(libsbx_math_vector4, normalize) {
291 EXPECT_FLOAT_EQ(vector.x(), 0.1825741858350553711523232609336f);
292 EXPECT_FLOAT_EQ(vector.y(), 0.3651483716701107423046465218672f);
293 EXPECT_FLOAT_EQ(vector.z(), 0.5477225575051661134569697828008f);
294 EXPECT_FLOAT_EQ(vector.w(), 0.7302967433402214846092930437344f);
295 EXPECT_FLOAT_EQ(vector.length(), 1.0f);
298TEST(libsbx_math_vector4, get_x) {
301 const auto result = vector.x();
303 EXPECT_FLOAT_EQ(result, 1.0f);
306TEST(libsbx_math_vector4, set_x) {
311 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
314TEST(libsbx_math_vector4, get_y) {
317 const auto result = vector.y();
319 EXPECT_FLOAT_EQ(result, 2.0f);
322TEST(libsbx_math_vector4, set_y) {
327 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
330TEST(libsbx_math_vector4, get_z) {
333 const auto result = vector.z();
335 EXPECT_FLOAT_EQ(result, 3.0f);
338TEST(libsbx_math_vector4, set_z) {
343 EXPECT_FLOAT_EQ(vector.z(), 4.0f);
346TEST(libsbx_math_vector4, get_w) {
349 const auto result = vector.w();
351 EXPECT_FLOAT_EQ(result, 4.0f);
354TEST(libsbx_math_vector4, set_w) {
359 EXPECT_FLOAT_EQ(vector.w(), 5.0f);
362TEST(libsbx_math_vector4, hash) {
366 EXPECT_EQ(std::hash<sbx::math::vector4>{}(first), std::hash<sbx::math::vector4>{}(second));
369TEST(libsbx_math_vector4, formatting) {
372 auto formatted = fmt::format(
"{}", float_vector);
374 EXPECT_STREQ(formatted.c_str(),
"{x: 1.00, y: 2.00, z: 3.00, w: 4.00}");
378 formatted = fmt::format(
"{}", int_vector);
380 EXPECT_STREQ(formatted.c_str(),
"{x: 1, y: 2, z: 3, w: 4}");
383TEST(libsbx_math_vector4, serialize) {
386 const auto serialized = YAML::Node{vector};
388 EXPECT_FLOAT_EQ(serialized[
"x"].as<std::float_t>(), 1.0f);
389 EXPECT_FLOAT_EQ(serialized[
"y"].as<std::float_t>(), 2.0f);
390 EXPECT_FLOAT_EQ(serialized[
"z"].as<std::float_t>(), 3.0f);
391 EXPECT_FLOAT_EQ(serialized[
"w"].as<std::float_t>(), 4.0f);
393 auto steam = std::stringstream{};
397 EXPECT_STREQ(steam.str().c_str(),
"{x: 1, y: 2, z: 3, w: 4}");
400TEST(libsbx_math_vector4, deserialize) {
401 const auto node = YAML::Load(
"{x: 1, y: 2, z: 3, w: 4}");
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 EXPECT_FLOAT_EQ(vector.w(), 4.0f);
Definition: vector3.hpp:23
Definition: vector4.hpp:24
Fixed-size vector type.
Definition: vector.hpp:55
constexpr auto normalize() noexcept -> basic_vector &
Normalizes the vector in-place.
Definition: vector.ipp:208
constexpr auto length_squared() const noexcept -> length_type
Returns the squared length of the vector.
Definition: vector.ipp:190
constexpr auto length() const noexcept -> length_type
Returns the length of the vector.
Definition: vector.ipp:202