28 TEST_CASE(
"DefaultConstructorTest_ShouldBeZeroVector")
30 const auto v = Vector3();
31 const float expected = 0.0f;
32 CHECK(v.x == expected);
33 CHECK(v.y == expected);
34 CHECK(v.z == expected);
37 TEST_CASE(
"ConstructorTest")
39 const auto v = Vector3(1, 2, 3);
45 TEST_CASE(
"CopyConstructorTest")
47 const auto v1 = Vector3(1, 2, 3);
48 const auto v2 = Vector3(v1);
54 TEST_CASE(
"MoveConstructorTest")
56 Vector3 v1 = Vector3(1, 2, 3);
57 const Vector3 v2 = Vector3(std::move(v1));
63 TEST_CASE(
"AssignmentOperatorTest")
65 auto v = Vector3(1, 2, 3);
72 TEST_CASE(
"ArithmeticOperatorTest")
76 constexpr auto v1 = Vector3(1, 2, 3);
77 constexpr auto v2 = Vector3(4, 5, 6);
78 constexpr auto actual = v1 + v2;
79 constexpr auto expected = Vector3(5, 7, 9);
81 CHECK_EQ(actual, expected);
84 SUBCASE(
"Subtraction")
86 constexpr auto v1 = Vector3(1, 2, 3);
87 constexpr auto v2 = Vector3(4, 5, 6);
88 constexpr auto actual = v1 - v2;
89 constexpr auto expected = Vector3(-3, -3, -3);
91 CHECK_EQ(actual, expected);
94 SUBCASE(
"Multiplication_WhenScalarIsFirst")
96 constexpr auto v = Vector3(1, 2, 3);
97 constexpr auto s = 2.0f;
98 constexpr auto actual = s * v;
99 constexpr auto expected = Vector3(2, 4, 6);
101 CHECK_EQ(actual, expected);
104 SUBCASE(
"Multiplication_WhenScalarIsSecond")
106 constexpr auto v = Vector3(1, 2, 3);
107 constexpr auto s = 2.0f;
108 constexpr auto actual = v * s;
109 constexpr auto expected = Vector3(2, 4, 6);
111 CHECK_EQ(actual, expected);
116 constexpr auto v1 = Vector3(1, 2, 3);
117 constexpr auto v2 = 2.0f;
118 constexpr auto actual = v1 / v2;
119 constexpr auto expected = Vector3(0.5f, 1.0f, 1.5f);
121 CHECK_EQ(actual, expected);
125 TEST_CASE(
"UnaryOperatorTest")
129 constexpr auto v = Vector3(1, 2, 3);
130 constexpr auto actual = +v;
131 constexpr auto expected = Vector3(1, 2, 3);
133 CHECK_EQ(actual, expected);
138 constexpr auto v = Vector3(1, 2, 3);
139 constexpr auto actual = -v;
140 constexpr auto expected = Vector3(-1, -2, -3);
142 CHECK_EQ(actual, expected);
146 TEST_CASE(
"CrossTest")
148 const struct { Vector3 v1; Vector3 v2; Vector3 expected; }
150 {Vector3(1, 0, 0), Vector3(0, 1, 0), Vector3(0, 0, 1)},
151 {Vector3(0, 1, 0), Vector3(0, 0, 1), Vector3(1, 0, 0)},
152 {Vector3(0, 0, 1), Vector3(1, 0, 0), Vector3(0, 1, 0)},
153 {Vector3(0, 0, 1), Vector3(0, 1, 0), Vector3(-1, 0, 0)},
156 for (
auto [v1, v2, expected] : table)
158 const auto actual = v1.Cross(v2);
160 INFO(std::format(
"v1 = ({}, {}, {})", v1.x, v1.y, v1.z));
161 INFO(std::format(
"v2 = ({}, {}, {})", v2.x, v2.y, v2.z));
162 CHECK_EQ(actual, expected);
168 const struct { Vector3 v1; Vector3 v2;
float expected; }
170 {Vector3(1, 0, 0), Vector3(1, 0, 0), 1.0f},
171 {Vector3(1, 0, 0), Vector3(0, 1, 0), 0.0f},
172 {Vector3(1, 0, 0), Vector3(0, 0, 1), 0.0f},
173 {Vector3(0, 1, 0), Vector3(1, 0, 0), 0.0f},
174 {Vector3(0, 1, 0), Vector3(0, 1, 0), 1.0f},
175 {Vector3(0, 1, 1), Vector3(0, 1, 1), 2.0f},
176 {Vector3(3, 7, 5), Vector3(2, 11, 13), 148.0f},
177 {Vector3(-2, 5, -7), Vector3(1, -11, 6), -99.0f},
180 for (
auto [v1, v2, expected] : table)
182 const auto actual = v1.Dot(v2);
184 INFO(std::format(
"v1 = ({}, {}, {})", v1.x, v1.y, v1.z));
185 INFO(std::format(
"v2 = ({}, {}, {})", v2.x, v2.y, v2.z));
186 CHECK(actual == doctest::Approx(expected));
190 TEST_CASE(
"GetDistanceFromTest")
192 const struct { Vector3 v1; Vector3 v2;
float expected; }
194 {Vector3(1, 0, 0), Vector3(0, 1, 0), 1.414214f},
195 {Vector3(0, 1, 0), Vector3(0, 0, 1), 1.414214f},
196 {Vector3(26.f, -30.f, 105.f), Vector3(10.f, 0, 5.f), 105.621967f},
197 {Vector3(10.f, 0, 5.f), Vector3(26.f, -30.f, 105.f), 105.621967f},
198 {Vector3(0.2f, 1.f, -3.f), Vector3(-4.4f, 1.4f, 31.6f), 34.906732f},
201 for (
auto [v1, v2, expected] : table)
203 const auto actual = v1.GetDistanceFrom(v2);
205 INFO(std::format(
"v1 = ({}, {}, {})", v1.x, v1.y, v1.z));
206 INFO(std::format(
"v2 = ({}, {}, {})", v2.x, v2.y, v2.z));
207 CHECK(actual == doctest::Approx(expected));
211 TEST_CASE(
"GetLengthTest")
213 const struct { Vector3 v;
float expected; }
215 {Vector3(1, 0, 0), 1.0f},
216 {Vector3(0, 1, 0), 1.0f},
217 {Vector3(0, 0, 1), 1.0f},
218 {Vector3(1, 1, 1), 1.732051f},
219 {Vector3(-1, -1, -1), 1.732051f},
222 for (
auto [v, expected] : table)
224 const auto actual = v.GetLength();
226 INFO(std::format(
"v = ({}, {}, {})", v.x, v.y, v.z));
227 CHECK(actual == doctest::Approx(expected));
231 TEST_CASE(
"GetNormalizedTest_WhenZeroVectorIsPassed_ShouldBeZeroVector")
233 const auto v1 = Vector3(0, 0, 0);
234 const auto actual1 = v1.GetNormalized();
235 const auto expected1 = Vector3(0, 0, 0);
237 CHECK(actual1 == expected1);
238 CHECK(actual1.GetLength() == doctest::Approx(0.0f));
240 const auto v2 = Vector3::GetZeroVec();
241 const auto actual2 = v2.GetNormalized();
242 const auto expected2 = Vector3(0, 0, 0);
244 CHECK(actual2 == expected2);
245 CHECK(actual2.GetLength() == doctest::Approx(0.0f));
248 TEST_CASE(
"GetNormalizedTest_WhenNonZeroVectorIsPassed_ShouldBeNormalizedVector")
250 const struct { Vector3 v; Vector3 expected; }
252 {Vector3(1, 0, 0), Vector3(1, 0, 0)},
253 {Vector3(0, 1, 0), Vector3(0, 1, 0)},
254 {Vector3(0, 0, 1), Vector3(0, 0, 1)},
255 {Vector3(1, 1, 1), Vector3(0.577350f, 0.577350f, 0.577350f)},
256 {Vector3(-1, -1, -1), Vector3(-0.577350f, -0.577350f, -0.577350f)},
259 for (
auto [v, expected] : table)
261 const auto actual = v.GetNormalized();
263 INFO(std::format(
"v = ({}, {}, {})", v.x, v.y, v.z));
264 CHECK(actual == expected);
265 CHECK(actual.GetLength() == doctest::Approx(1.0f));
269 TEST_CASE(
"GetSquaredLengthTest")
271 const struct { Vector3 v;
float expected; }
273 {Vector3(1, 0, 0), 1.0f},
274 {Vector3(0, 1, 0), 1.0f},
275 {Vector3(0, 0, 1), 1.0f},
276 {Vector3(1, 1, 1), 3.0f},
277 {Vector3(-1, -1, -1), 3.0f},
280 for (
auto [v, expected] : table)
282 const auto actual = v.GetSquaredLength();
284 INFO(std::format(
"v = ({}, {}, {})", v.x, v.y, v.z));
285 CHECK(actual == doctest::Approx(expected));
289 TEST_CASE(
"IsZeroTest_WhenZeroVectorIsPassed_ShouldBeTrue")
291 const auto v1 = Vector3(0, 0, 0);
295 const auto v2 = Vector3::GetZeroVec();
300 TEST_CASE(
"IsZeroTest_WhenNonZeroVectorIsPassed_ShouldBeFalse")
302 SUBCASE(
"When (1,0,0) is passed, should be false")
304 const auto v = Vector3(1, 0, 0);
306 CHECK_FALSE(v.IsZero());
309 SUBCASE(
"When (0,1,0) is passed, should be false")
311 const auto v = Vector3(0, 1, 0);
313 CHECK_FALSE(v.IsZero());
316 SUBCASE(
"When (0,0,1) is passed, should be false")
318 const auto v = Vector3(0, 0, 1);
320 CHECK_FALSE(v.IsZero());
323 SUBCASE(
"When (1,1,1) is passed, should be false")
325 const auto v = Vector3(1, 1, 1);
327 CHECK_FALSE(v.IsZero());
330 SUBCASE(
"When (-1,-1,-1) is passed, should be false")
332 const auto v = Vector3(-1, -1, -1);
334 CHECK_FALSE(v.IsZero());
338 TEST_CASE(
"IsZeroTest_WhenEpsilonIsPassed_ShouldBeTrue")
340 const auto v1 = Vector3(0.0000001f, 0.0000001f, 0.0000001f);
345 TEST_CASE(
"NormalizeTest_WhenZeroVectorIsPassed_ShouldBeZeroVector")
347 auto v1 = Vector3(0, 0, 0);
350 CHECK(v1 == Vector3(0, 0, 0));
351 CHECK(v1.GetLength() == doctest::Approx(0.0f));
353 auto v2 = Vector3::GetZeroVec();
356 CHECK(v2 == Vector3(0, 0, 0));
357 CHECK(v2.GetLength() == doctest::Approx(0.0f));
360 TEST_CASE(
"NormalizeTest_WhenNonZeroVectorIsPassed_ShouldBeNormalizedVector")
362 const struct { Vector3 v; Vector3 expected; }
364 {Vector3(1, 0, 0), Vector3(1, 0, 0)},
365 {Vector3(0, 1, 0), Vector3(0, 1, 0)},
366 {Vector3(0, 0, 1), Vector3(0, 0, 1)},
367 {Vector3(1, 1, 1), Vector3(0.577350f, 0.577350f, 0.577350f)},
368 {Vector3(-1, -1, -1), Vector3(-0.577350f, -0.577350f, -0.577350f)},
371 for (
auto [v, expected] : table)
376 INFO(std::format(
"v = ({}, {}, {})", v.x, v.y, v.z));
377 CHECK(actual == expected);
378 CHECK(actual.GetLength() == doctest::Approx(1.0f));
382 TEST_CASE(
"ProjectedXYTest")
384 const struct { Vector3 v; Vector2 expected; }
386 {Vector3(0, 0, 0), Vector2(0, 0)},
387 {Vector3(1, 2, 3), Vector2(1, 2)},
388 {Vector3(-1, -2, -3), Vector2(-1, -2)},
391 for (
auto [v, expected] : table)
393 const auto actual = v.ProjectedXY();
395 INFO(std::format(
"v = ({}, {}, {})", v.x, v.y, v.z));
396 CHECK(actual == expected);