sandbox
Loading...
Searching...
No Matches
vector2_tests.hpp
1// SPDX-License-Identifier: MIT
2#ifndef LIBSBX_MATH_TESTS_VECTOR2_TESTS_HPP_
3#define LIBSBX_MATH_TESTS_VECTOR2_TESTS_HPP_
4
5#include <sstream>
6
7#include <gtest/gtest.h>
8
9#include <libsbx/math/vector2.hpp>
10
11TEST(libsbx_math_vector2, zero) {
12 const auto vector = sbx::math::vector2::zero;
13
14 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
15 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
16}
17
18TEST(libsbx_math_vector2, one) {
19 const auto vector = sbx::math::vector2::one;
20
21 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
22 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
23}
24
25TEST(libsbx_math_vector2, default_constructor) {
26 const auto vector = sbx::math::vector2{};
27
28 EXPECT_FLOAT_EQ(vector.x(), 0.0f);
29 EXPECT_FLOAT_EQ(vector.y(), 0.0f);
30}
31
32TEST(libsbx_math_vector2, base_constructor) {
34 const auto vector = sbx::math::vector2{base};
35
36 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
37 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
38}
39
40TEST(libsbx_math_vector2, single_value_constructor) {
41 const auto vector = sbx::math::vector2{1};
42
43 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
44 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
45}
46
47TEST(libsbx_math_vector2, multi_value_constructor) {
48 const auto vector = sbx::math::vector2{1, 2};
49
50 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
51 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
52}
53
54TEST(libsbx_math_vector2, copy_constructor) {
55 const auto vector = sbx::math::vector2{1, 2};
56 const auto other = vector;
57
58 EXPECT_FLOAT_EQ(other.x(), 1.0f);
59 EXPECT_FLOAT_EQ(other.y(), 2.0f);
60}
61
62TEST(libsbx_math_vector2, move_constructor) {
63 auto vector = sbx::math::vector2{1, 2};
64 const auto other = std::move(vector);
65
66 EXPECT_FLOAT_EQ(other.x(), 1.0f);
67 EXPECT_FLOAT_EQ(other.y(), 2.0f);
68}
69
70TEST(libsbx_math_vector2, copy_assignment) {
71 const auto vector = sbx::math::vector2{1, 2};
72 auto other = sbx::math::vector2{};
73 other = vector;
74
75 EXPECT_FLOAT_EQ(other.x(), 1.0f);
76 EXPECT_FLOAT_EQ(other.y(), 2.0f);
77}
78
79TEST(libsbx_math_vector2, move_assignment) {
80 auto vector = sbx::math::vector2{1, 2};
81 auto other = sbx::math::vector2{};
82 other = std::move(vector);
83
84 EXPECT_FLOAT_EQ(other.x(), 1.0f);
85 EXPECT_FLOAT_EQ(other.y(), 2.0f);
86}
87
88TEST(libsbx_math_vector2, equality) {
89 const auto lhs = sbx::math::vector2{1, 2};
90 const auto rhs = sbx::math::vector2{1, 2};
91
92 EXPECT_TRUE(lhs == rhs);
93 EXPECT_FALSE(lhs != rhs);
94}
95
96TEST(libsbx_math_vector2, inequality) {
97 const auto lhs = sbx::math::vector2{1, 2};
98 const auto rhs = sbx::math::vector2{2, 1};
99
100 EXPECT_TRUE(lhs != rhs);
101 EXPECT_FALSE(lhs == rhs);
102}
103
104TEST(libsbx_math_vector2, addition_assignment) {
105 auto vector = sbx::math::vector2{1, 2};
106 vector += sbx::math::vector2{2, 1};
107
108 EXPECT_FLOAT_EQ(vector.x(), 3.0f);
109 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
110}
111
112TEST(libsbx_math_vector2, subtraction_assignment) {
113 auto vector = sbx::math::vector2{1, 2};
114 vector -= sbx::math::vector2{2, 1};
115
116 EXPECT_FLOAT_EQ(vector.x(), -1.0f);
117 EXPECT_FLOAT_EQ(vector.y(), 1.0f);
118}
119
120TEST(libsbx_math_vector2, multiplication_assignment) {
121 auto vector = sbx::math::vector2{1, 2};
122 vector *= 2;
123
124 EXPECT_FLOAT_EQ(vector.x(), 2.0f);
125 EXPECT_FLOAT_EQ(vector.y(), 4.0f);
126}
127
128TEST(libsbx_math_vector2, division_assignment) {
129 auto vector = sbx::math::vector2{2, 4};
130 vector /= 2;
131
132 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
133 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
134}
135
136TEST(libsbx_math_vector2, addition) {
137 const auto lhs = sbx::math::vector2{1, 2};
138 const auto rhs = sbx::math::vector2{2, 1};
139 const auto result = lhs + rhs;
140
141 EXPECT_FLOAT_EQ(result.x(), 3.0f);
142 EXPECT_FLOAT_EQ(result.y(), 3.0f);
143}
144
145TEST(libsbx_math_vector2, subtraction) {
146 const auto lhs = sbx::math::vector2{1, 2};
147 const auto rhs = sbx::math::vector2{2, 1};
148 const auto result = lhs - rhs;
149
150 EXPECT_FLOAT_EQ(result.x(), -1.0f);
151 EXPECT_FLOAT_EQ(result.y(), 1.0f);
152}
153
154TEST(libsbx_math_vector2, multiplication) {
155 const auto lhs = sbx::math::vector2{1, 2};
156 const auto rhs = 2;
157 const auto result = lhs * rhs;
158
159 EXPECT_FLOAT_EQ(result.x(), 2.0f);
160 EXPECT_FLOAT_EQ(result.y(), 4.0f);
161}
162
163TEST(libsbx_math_vector2, division) {
164 const auto lhs = sbx::math::vector2{2, 4};
165 const auto rhs = 2;
166 const auto result = lhs / rhs;
167
168 EXPECT_FLOAT_EQ(result.x(), 1.0f);
169 EXPECT_FLOAT_EQ(result.y(), 2.0f);
170}
171
172TEST(libsbx_math_vector2, negation) {
173 const auto vector = sbx::math::vector2{1, 2};
174 const auto result = -vector;
175
176 EXPECT_FLOAT_EQ(result.x(), -1.0f);
177 EXPECT_FLOAT_EQ(result.y(), -2.0f);
178}
179
180TEST(libsbx_math_vector2, dot) {
181 const auto lhs = sbx::math::vector2{1, 2};
182 const auto rhs = sbx::math::vector2{2, 1};
183 const auto result = sbx::math::vector2::dot(lhs, rhs);
184
185 EXPECT_FLOAT_EQ(result, 4.0f);
186}
187
188TEST(libsbx_math_vector2, normalized) {
189 const auto vector = sbx::math::vector2{1, 2};
190 const auto result = sbx::math::vector2::normalized(vector);
191
192 EXPECT_FLOAT_EQ(result.x(), 1.0f / std::sqrt(5.0f));
193 EXPECT_FLOAT_EQ(result.y(), 2.0f / std::sqrt(5.0f));
194}
195
196TEST(libsbx_math_vector2, length_squared) {
197 const auto vector = sbx::math::vector2{1, 2};
198 const auto result = vector.length_squared();
199
200 EXPECT_FLOAT_EQ(result, 5.0f);
201}
202
203TEST(libsbx_math_vector2, length) {
204 const auto vector = sbx::math::vector2{1, 2};
205 const auto result = vector.length();
206
207 EXPECT_FLOAT_EQ(result, std::sqrt(5.0f));
208}
209
210TEST(libsbx_math_vector2, normalize) {
211 auto vector = sbx::math::vector2{1, 2};
212 vector.normalize();
213
214 EXPECT_FLOAT_EQ(vector.x(), 1.0f / std::sqrt(5.0f));
215 EXPECT_FLOAT_EQ(vector.y(), 2.0f / std::sqrt(5.0f));
216}
217
218TEST(libsbx_math_vector2, get_x) {
219 const auto vector = sbx::math::vector2{1, 2};
220 const auto result = vector.x();
221
222 EXPECT_FLOAT_EQ(result, 1.0f);
223}
224
225TEST(libsbx_math_vector2, set_x) {
226 auto vector = sbx::math::vector2{1, 2};
227 vector.x() = 3;
228
229 EXPECT_FLOAT_EQ(vector.x(), 3.0f);
230 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
231}
232
233TEST(libsbx_math_vector2, get_y) {
234 const auto vector = sbx::math::vector2{1, 2};
235 const auto result = vector.y();
236
237 EXPECT_FLOAT_EQ(result, 2.0f);
238}
239
240TEST(libsbx_math_vector2, set_y) {
241 auto vector = sbx::math::vector2{1, 2};
242 vector.y() = 3;
243
244 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
245 EXPECT_FLOAT_EQ(vector.y(), 3.0f);
246}
247
248TEST(libsbx_math_vector2, hash) {
249 const auto first = sbx::math::vector2{1, 2};
250 const auto second = sbx::math::vector2{1, 2};
251
252 EXPECT_EQ(std::hash<sbx::math::vector2>{}(first), std::hash<sbx::math::vector2>{}(second));
253}
254
255TEST(libsbx_math_vector2, formatting) {
256 const auto float_vector = sbx::math::vector2f{1, 2};
257
258 auto formatted = fmt::format("{}", float_vector);
259
260 EXPECT_STREQ(formatted.c_str(), "{x: 1.00, y: 2.00}");
261
262 const auto int_vector = sbx::math::vector2i{1, 2};
263
264 formatted = fmt::format("{}", int_vector);
265
266 EXPECT_STREQ(formatted.c_str(), "{x: 1, y: 2}");
267}
268
269TEST(libsbx_math_vector2, serialize) {
270 const auto vector = sbx::math::vector2{1, 2};
271
272 const auto serialized = YAML::Node{vector};
273
274 EXPECT_FLOAT_EQ(serialized["x"].as<std::float_t>(), 1.0f);
275 EXPECT_FLOAT_EQ(serialized["y"].as<std::float_t>(), 2.0f);
276
277 auto steam = std::stringstream{};
278
279 steam << serialized;
280
281 EXPECT_STREQ(steam.str().c_str(), "{x: 1, y: 2}");
282}
283
284TEST(libsbx_math_vector2, deserialize) {
285 const auto node = YAML::Load("{x: 1, y: 2}");
286
287 const auto vector = node.as<sbx::math::vector2>();
288
289 EXPECT_FLOAT_EQ(vector.x(), 1.0f);
290 EXPECT_FLOAT_EQ(vector.y(), 2.0f);
291}
292
293#endif // LIBSBX_MATH_TESTS_VECTOR2_TESTS_HPP_
Definition: tests.cpp:6
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