2#ifndef LIBSBX_MATH_TESTS_VECTOR2_TESTS_HPP_
3#define LIBSBX_MATH_TESTS_VECTOR2_TESTS_HPP_
7#include <gtest/gtest.h>
9#include <libsbx/math/vector2.hpp>
11TEST(libsbx_math_vector2, zero) {
12 const auto vector = sbx::math::vector2::zero;
14 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
15 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
18TEST(libsbx_math_vector2, one) {
19 const auto vector = sbx::math::vector2::one;
21 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
22 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
25TEST(libsbx_math_vector2, default_constructor) {
28 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
29 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
32TEST(libsbx_math_vector2, base_constructor) {
36 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
37 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
40TEST(libsbx_math_vector2, single_value_constructor) {
43 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
44 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
47TEST(libsbx_math_vector2, multi_value_constructor) {
50 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
51 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
54TEST(libsbx_math_vector2, copy_constructor) {
56 const auto other = vector;
58 EXPECT_FLOAT_EQ(other.x(), 1.0f);
59 EXPECT_FLOAT_EQ(other.y(), 2.0f);
62TEST(libsbx_math_vector2, move_constructor) {
64 const auto other = std::move(vector);
66 EXPECT_FLOAT_EQ(other.x(), 1.0f);
67 EXPECT_FLOAT_EQ(other.y(), 2.0f);
70TEST(libsbx_math_vector2, copy_assignment) {
75 EXPECT_FLOAT_EQ(other.x(), 1.0f);
76 EXPECT_FLOAT_EQ(other.y(), 2.0f);
79TEST(libsbx_math_vector2, move_assignment) {
82 other = std::move(vector);
84 EXPECT_FLOAT_EQ(other.x(), 1.0f);
85 EXPECT_FLOAT_EQ(other.y(), 2.0f);
88TEST(libsbx_math_vector2, equality) {
92 EXPECT_TRUE(lhs == rhs);
93 EXPECT_FALSE(lhs != rhs);
96TEST(libsbx_math_vector2, inequality) {
100 EXPECT_TRUE(lhs != rhs);
101 EXPECT_FALSE(lhs == rhs);
104TEST(libsbx_math_vector2, addition_assignment) {
108 EXPECT_FLOAT_EQ(vector.x(), 3.0f);
109 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
112TEST(libsbx_math_vector2, subtraction_assignment) {
116 EXPECT_FLOAT_EQ(vector.x(), -1.0f);
117 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
120TEST(libsbx_math_vector2, multiplication_assignment) {
124 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
125 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
128TEST(libsbx_math_vector2, division_assignment) {
132 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
133 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
136TEST(libsbx_math_vector2, addition) {
139 const auto result = lhs + rhs;
141 EXPECT_FLOAT_EQ(result.x(), 3.0f);
142 EXPECT_FLOAT_EQ(result.y(), 3.0f);
145TEST(libsbx_math_vector2, subtraction) {
148 const auto result = lhs - rhs;
150 EXPECT_FLOAT_EQ(result.x(), -1.0f);
151 EXPECT_FLOAT_EQ(result.y(), 1.0f);
154TEST(libsbx_math_vector2, multiplication) {
157 const auto result = lhs * rhs;
159 EXPECT_FLOAT_EQ(result.x(), 2.0f);
160 EXPECT_FLOAT_EQ(result.y(), 4.0f);
163TEST(libsbx_math_vector2, division) {
166 const auto result = lhs / rhs;
168 EXPECT_FLOAT_EQ(result.x(), 1.0f);
169 EXPECT_FLOAT_EQ(result.y(), 2.0f);
172TEST(libsbx_math_vector2, negation) {
174 const auto result = -vector;
176 EXPECT_FLOAT_EQ(result.x(), -1.0f);
177 EXPECT_FLOAT_EQ(result.y(), -2.0f);
180TEST(libsbx_math_vector2, dot) {
183 const auto result = sbx::math::vector2::dot(lhs, rhs);
185 EXPECT_FLOAT_EQ(result, 4.0f);
188TEST(libsbx_math_vector2, normalized) {
190 const auto result = sbx::math::vector2::normalized(vector);
192 EXPECT_FLOAT_EQ(result.x(), 1.0f / std::sqrt(5.0f));
193 EXPECT_FLOAT_EQ(result.y(), 2.0f / std::sqrt(5.0f));
196TEST(libsbx_math_vector2, length_squared) {
200 EXPECT_FLOAT_EQ(result, 5.0f);
203TEST(libsbx_math_vector2, length) {
205 const auto result = vector.
length();
207 EXPECT_FLOAT_EQ(result, std::sqrt(5.0f));
210TEST(libsbx_math_vector2, normalize) {
214 EXPECT_FLOAT_EQ(vector.x(), 1.0f / std::sqrt(5.0f));
215 EXPECT_FLOAT_EQ(vector.y(), 2.0f / std::sqrt(5.0f));
218TEST(libsbx_math_vector2, get_x) {
220 const auto result = vector.x();
222 EXPECT_FLOAT_EQ(result, 1.0f);
225TEST(libsbx_math_vector2, set_x) {
229 EXPECT_FLOAT_EQ(vector.x(), 3.0f);
230 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
233TEST(libsbx_math_vector2, get_y) {
235 const auto result = vector.y();
237 EXPECT_FLOAT_EQ(result, 2.0f);
240TEST(libsbx_math_vector2, set_y) {
244 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
245 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
248TEST(libsbx_math_vector2, hash) {
252 EXPECT_EQ(std::hash<sbx::math::vector2>{}(first), std::hash<sbx::math::vector2>{}(second));
255TEST(libsbx_math_vector2, formatting) {
258 auto formatted = fmt::format(
"{}", float_vector);
260 EXPECT_STREQ(formatted.c_str(),
"{x: 1.00, y: 2.00}");
264 formatted = fmt::format(
"{}", int_vector);
266 EXPECT_STREQ(formatted.c_str(),
"{x: 1, y: 2}");
269TEST(libsbx_math_vector2, serialize) {
272 const auto serialized = YAML::Node{vector};
274 EXPECT_FLOAT_EQ(serialized[
"x"].as<std::float_t>(), 1.0f);
275 EXPECT_FLOAT_EQ(serialized[
"y"].as<std::float_t>(), 2.0f);
277 auto steam = std::stringstream{};
281 EXPECT_STREQ(steam.str().c_str(),
"{x: 1, y: 2}");
284TEST(libsbx_math_vector2, deserialize) {
285 const auto node = YAML::Load(
"{x: 1, y: 2}");
289 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
290 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
A vector in two-dimensional space.
Definition: vector2.hpp:28
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