Skip to content

Commit 52747d6

Browse files
authored
Add basic math tests (#676)
1 parent 9508d41 commit 52747d6

File tree

3 files changed

+194
-1
lines changed

3 files changed

+194
-1
lines changed

src/w3d/math/matrix4.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,16 @@ __forceinline Vector4 operator*(const Matrix4 &a, const Vector4 &v)
477477
a[3][0] * v[0] + a[3][1] * v[1] + a[3][2] * v[2] + a[3][3] * v[3]);
478478
}
479479

480+
__forceinline int operator==(const Matrix4 &a, const Matrix4 &b)
481+
{
482+
return ((a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]) && (a[3] == b[3]));
483+
}
484+
485+
__forceinline int operator!=(const Matrix4 &a, const Matrix4 &b)
486+
{
487+
return (!(a == b));
488+
}
489+
480490
#ifdef BUILD_WITH_D3D8
481491
struct _D3DMATRIX;
482492

tests/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ FetchContent_Declare(
66

77
FetchContent_MakeAvailable(googletest)
88

9-
add_executable(thyme_tests globals.cpp test_audiofilecache.cpp test_crc.cpp test_filesystem.cpp)
9+
add_executable(thyme_tests globals.cpp test_audiofilecache.cpp test_crc.cpp test_filesystem.cpp test_w3d_math.cpp)
1010
target_link_libraries(thyme_tests gtest gtest_main)
1111
target_compile_definitions(thyme_tests PRIVATE -DTESTDATA_PATH="${CMAKE_CURRENT_SOURCE_DIR}/data")
1212

tests/test_w3d_math.cpp

Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
/**
2+
* @file
3+
*
4+
* @author feliwir
5+
*
6+
* @brief Set of tests to validate w3d math components
7+
*
8+
* @copyright Thyme is free software: you can redistribute it and/or
9+
* modify it under the terms of the GNU General Public License
10+
* as published by the Free Software Foundation, either version
11+
* 2 of the License, or (at your option) any later version.
12+
* A full copy of the GNU General Public License can be found in
13+
* LICENSE
14+
*/
15+
#include <gtest/gtest.h>
16+
#include <vector2.h>
17+
#include <vector3.h>
18+
#include <vector4.h>
19+
20+
#include <vector2i.h>
21+
#include <vector3i.h>
22+
23+
#include <matrix3.h>
24+
#include <matrix4.h>
25+
26+
TEST(w3d_math, vector2)
27+
{
28+
Vector2 a(2.0f, 1.0f);
29+
30+
// Test length
31+
EXPECT_FLOAT_EQ(a.Length(), GameMath::Sqrt(5.0f));
32+
EXPECT_FLOAT_EQ(a.Length2(), 5.0f);
33+
34+
// Test normalize
35+
auto tmp = a;
36+
tmp.Normalize();
37+
EXPECT_FLOAT_EQ(tmp.Length(), 1.0f);
38+
39+
Vector2 b(0.0f, 2.0f);
40+
41+
// Two notations for dot product
42+
EXPECT_FLOAT_EQ(Vector2::Dot_Product(a, a), 5.0f);
43+
EXPECT_FLOAT_EQ(a * a, 5.0f);
44+
45+
EXPECT_FLOAT_EQ(Vector2::Dot_Product(a, b), 2.0f);
46+
EXPECT_FLOAT_EQ(a * b, 2.0f);
47+
48+
// Test distance
49+
EXPECT_FLOAT_EQ(Vector2::Distance(a, b), GameMath::Sqrt(5.0f));
50+
51+
// Test equality operator
52+
EXPECT_EQ(a, a);
53+
EXPECT_NE(a, b);
54+
55+
// Test arithmetic
56+
EXPECT_EQ(Vector2(1.0f, 0.0f) + Vector2(0.0f, 1.0f), Vector2(1.0f, 1.0f));
57+
EXPECT_EQ(Vector2(1.0f, 0.0f) - Vector2(0.0f, 1.0f), Vector2(1.0f, -1.0f));
58+
EXPECT_EQ(Vector2(1.0f, 0.0f) * 2, Vector2(2.0f, 0.0f));
59+
EXPECT_EQ(Vector2(1.0f, 0.0f) / 2, Vector2(0.5f, 0.0f));
60+
}
61+
62+
TEST(w3d_math, vector3)
63+
{
64+
Vector3 a(2.0f, 1.0f, 1.0f);
65+
66+
// Test length
67+
EXPECT_FLOAT_EQ(a.Length(), GameMath::Sqrt(6.0f));
68+
EXPECT_FLOAT_EQ(a.Length2(), 6.0f);
69+
70+
// Test normalize
71+
auto tmp = a;
72+
tmp.Normalize();
73+
EXPECT_FLOAT_EQ(tmp.Length(), 1.0f);
74+
75+
Vector3 b(0.0f, 2.0f, 0.0f);
76+
77+
// Two notations for dot product
78+
EXPECT_FLOAT_EQ(Vector3::Dot_Product(a, a), 6.0f);
79+
EXPECT_FLOAT_EQ(a * a, 6.0f);
80+
81+
EXPECT_FLOAT_EQ(Vector3::Dot_Product(a, b), 2.0f);
82+
EXPECT_FLOAT_EQ(a * b, 2.0f);
83+
84+
// Test distance
85+
EXPECT_FLOAT_EQ(Vector3::Distance(a, b), GameMath::Sqrt(6.0f));
86+
87+
// Test equality operator
88+
EXPECT_EQ(a, a);
89+
EXPECT_NE(a, b);
90+
91+
// Test arithmetic
92+
EXPECT_EQ(Vector3(1.0f, 0.0f, 0.0f) + Vector3(0.0f, 1.0f, 0.0f), Vector3(1.0f, 1.0f, 0.0f));
93+
EXPECT_EQ(Vector3(1.0f, 0.0f, 0.0f) - Vector3(0.0f, 1.0f, 0.0f), Vector3(1.0f, -1.0f, 0.0f));
94+
EXPECT_EQ(Vector3(1.0f, 0.0f, 0.0f) * 2, Vector3(2.0f, 0.0f, 0.0f));
95+
EXPECT_EQ(Vector3(1.0f, 0.0f, 0.0f) / 2, Vector3(0.5f, 0.0f, 0.0f));
96+
}
97+
98+
TEST(w3d_math, vector4)
99+
{
100+
Vector4 a(2.0f, 1.0f, 1.0f, 1.0f);
101+
102+
// Test length
103+
EXPECT_FLOAT_EQ(a.Length(), GameMath::Sqrt(7.0f));
104+
EXPECT_FLOAT_EQ(a.Length2(), 7.0f);
105+
106+
// Test normalize
107+
auto tmp = a;
108+
tmp.Normalize();
109+
EXPECT_FLOAT_EQ(tmp.Length(), 1.0f);
110+
111+
Vector4 b(0.0f, 2.0f, 0.0f, 0.0f);
112+
113+
// Two notations for dot product
114+
EXPECT_FLOAT_EQ(Vector4::Dot_Product(a, a), 7.0f);
115+
EXPECT_FLOAT_EQ(a * a, 7.0f);
116+
117+
EXPECT_FLOAT_EQ(Vector4::Dot_Product(a, b), 2.0f);
118+
EXPECT_FLOAT_EQ(a * b, 2.0f);
119+
120+
// Test equality operator
121+
EXPECT_EQ(a, a);
122+
EXPECT_NE(a, b);
123+
124+
// Test arithmetic
125+
EXPECT_EQ(Vector4(1.0f, 0.0f, 0.0f, 0.0f) + Vector4(0.0f, 1.0f, 0.0f, 0.0f), Vector4(1.0f, 1.0f, 0.0f, 0.0f));
126+
EXPECT_EQ(Vector4(1.0f, 0.0f, 0.0f, 0.0f) - Vector4(0.0f, 1.0f, 0.0f, 0.0f), Vector4(1.0f, -1.0f, 0.0f, 0.0f));
127+
EXPECT_EQ(Vector4(1.0f, 0.0f, 0.0f, 0.0f) * 2, Vector4(2.0f, 0.0f, 0.0f, 0.0f));
128+
EXPECT_EQ(Vector4(1.0f, 0.0f, 0.0f, 0.0f) / 2, Vector4(0.5f, 0.0f, 0.0f, 0.0f));
129+
}
130+
131+
TEST(w3d_math, vector2i)
132+
{
133+
Vector2i a(2, 0);
134+
135+
// Test equality operator
136+
EXPECT_EQ(a, a);
137+
EXPECT_NE(a, Vector2i(0, 2));
138+
}
139+
140+
TEST(w3d_math, vector3i)
141+
{
142+
Vector3i a(2, 0, 0);
143+
144+
// Test equality operator
145+
EXPECT_EQ(a, a);
146+
EXPECT_NE(a, Vector3i(0, 2, 0));
147+
}
148+
149+
TEST(w3d_math, matrix3)
150+
{
151+
Matrix3 mat(true);
152+
mat[0][0] = 2.0f;
153+
EXPECT_FLOAT_EQ(mat.Determinant(), 2.0f);
154+
EXPECT_EQ(mat.Get_X_Vector(), Vector3(2.0f, 0.0f, 0.0f));
155+
EXPECT_EQ(mat[0], Vector3(2.0f, 0.0f, 0.0f));
156+
157+
EXPECT_EQ(mat.Get_Y_Vector(), Vector3(0.0f, 1.0f, 0.0f));
158+
EXPECT_EQ(mat[1], Vector3(0.0f, 1.0f, 0.0f));
159+
160+
EXPECT_EQ(mat.Get_Z_Vector(), Vector3(0.0f, 0.0f, 1.0f));
161+
EXPECT_EQ(mat[2], Vector3(0.0f, 0.0f, 1.0f));
162+
163+
Matrix3 trans = mat.Transpose();
164+
EXPECT_EQ(trans, mat);
165+
Matrix3 inv = mat.Inverse();
166+
EXPECT_FLOAT_EQ(inv[0][0], 0.5f);
167+
}
168+
169+
TEST(w3d_math, matrix4)
170+
{
171+
Matrix4 mat(true);
172+
mat[0][0] = 2.0f;
173+
EXPECT_FLOAT_EQ(mat.Determinant(), 2.0f);
174+
EXPECT_EQ(mat[0], Vector4(2.0f, 0.0f, 0.0f, 0.0f));
175+
EXPECT_EQ(mat[1], Vector4(0.0f, 1.0f, 0.0f, 0.0f));
176+
EXPECT_EQ(mat[2], Vector4(0.0f, 0.0f, 1.0f, 0.0f));
177+
EXPECT_EQ(mat[3], Vector4(0.0f, 0.0f, 0.0f, 1.0f));
178+
179+
Matrix4 trans = mat.Transpose();
180+
EXPECT_EQ(trans, mat);
181+
Matrix4 inv = mat.Inverse();
182+
EXPECT_FLOAT_EQ(inv[0][0], 0.5f);
183+
}

0 commit comments

Comments
 (0)