|
@@ -39,6 +39,14 @@
|
|
|
|
|
|
namespace TestVector3 {
|
|
|
|
|
|
+TEST_CASE("[Vector3] Constructor methods") {
|
|
|
+ const Vector3 vector_empty = Vector3();
|
|
|
+ const Vector3 vector_zero = Vector3(0.0, 0.0, 0.0);
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector_empty == vector_zero,
|
|
|
+ "Vector3 Constructor with no inputs should return a zero Vector3.");
|
|
|
+}
|
|
|
+
|
|
|
TEST_CASE("[Vector3] Angle methods") {
|
|
|
const Vector3 vector_x = Vector3(1, 0, 0);
|
|
|
const Vector3 vector_y = Vector3(0, 1, 0);
|
|
@@ -122,6 +130,9 @@ TEST_CASE("[Vector3] Interpolation methods") {
|
|
|
CHECK_MESSAGE(
|
|
|
Vector3(1, 1, 1).slerp(Vector3(), 0.5) == Vector3(0.5, 0.5, 0.5),
|
|
|
"Vector3 slerp with one input as zero should behave like a regular lerp.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ Vector3(4, 6, 2).slerp(Vector3(8, 10, 3), 0.5).is_equal_approx(Vector3(5.90194219811429941053, 8.06758688849378394534, 2.558307894718317120038)),
|
|
|
+ "Vector3 slerp should work as expected.");
|
|
|
CHECK_MESSAGE(
|
|
|
Math::is_equal_approx(vector1.slerp(vector2, 0.5).length(), (real_t)6.25831088708303172),
|
|
|
"Vector3 slerp with different length input should return a vector with an interpolated length.");
|
|
@@ -195,6 +206,15 @@ TEST_CASE("[Vector3] Normalization methods") {
|
|
|
CHECK_MESSAGE(
|
|
|
Vector3(1, 1, 1).normalized().is_equal_approx(Vector3(Math_SQRT13, Math_SQRT13, Math_SQRT13)),
|
|
|
"Vector3 normalized should work as expected.");
|
|
|
+
|
|
|
+ Vector3 vector = Vector3(3.2, -5.4, 6);
|
|
|
+ vector.normalize();
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector == Vector3(3.2, -5.4, 6).normalized(),
|
|
|
+ "Vector3 normalize should convert same way as Vector3 normalized.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.is_equal_approx(Vector3(0.368522751763902980457, -0.621882143601586279522, 0.6909801595573180883585)),
|
|
|
+ "Vector3 normalize should work as expected.");
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[Vector3] Operators") {
|
|
@@ -318,9 +338,20 @@ TEST_CASE("[Vector3] Other methods") {
|
|
|
CHECK_MESSAGE(
|
|
|
(-vector).posmodv(Vector3(2, 3, 4)).is_equal_approx(Vector3(0.8, 2.6, 2.4)),
|
|
|
"Vector3 posmodv should work as expected.");
|
|
|
+
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.rotated(Vector3(0, 1, 0), Math_TAU).is_equal_approx(vector),
|
|
|
+ "Vector3 rotated should work as expected.");
|
|
|
CHECK_MESSAGE(
|
|
|
vector.rotated(Vector3(0, 1, 0), Math_TAU / 4).is_equal_approx(Vector3(5.6, 3.4, -1.2)),
|
|
|
"Vector3 rotated should work as expected.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.rotated(Vector3(1, 0, 0), Math_TAU / 3).is_equal_approx(Vector3(1.2, -6.54974226119285642, 0.1444863728670914)),
|
|
|
+ "Vector3 rotated should work as expected.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.rotated(Vector3(0, 0, 1), Math_TAU / 2).is_equal_approx(vector.rotated(Vector3(0, 0, 1), Math_TAU / -2)),
|
|
|
+ "Vector3 rotated should work as expected.");
|
|
|
+
|
|
|
CHECK_MESSAGE(
|
|
|
vector.snapped(Vector3(1, 1, 1)) == Vector3(1, 3, 6),
|
|
|
"Vector3 snapped to integers should be the same as rounding.");
|
|
@@ -332,18 +363,44 @@ TEST_CASE("[Vector3] Other methods") {
|
|
|
TEST_CASE("[Vector3] Plane methods") {
|
|
|
const Vector3 vector = Vector3(1.2, 3.4, 5.6);
|
|
|
const Vector3 vector_y = Vector3(0, 1, 0);
|
|
|
+ const Vector3 vector_normal = Vector3(0.88763458893247992491, 0.26300284116517923701, 0.37806658417494515320);
|
|
|
+ const Vector3 vector_non_normal = Vector3(5.4, 1.6, 2.3);
|
|
|
CHECK_MESSAGE(
|
|
|
vector.bounce(vector_y) == Vector3(1.2, -3.4, 5.6),
|
|
|
"Vector3 bounce on a plane with normal of the Y axis should.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.bounce(vector_normal).is_equal_approx(Vector3(-6.0369629829775736287, 1.25571467171034855444, 2.517589840583626047)),
|
|
|
+ "Vector3 bounce with normal should return expected value.");
|
|
|
CHECK_MESSAGE(
|
|
|
vector.reflect(vector_y) == Vector3(-1.2, 3.4, -5.6),
|
|
|
"Vector3 reflect on a plane with normal of the Y axis should.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.reflect(vector_normal).is_equal_approx(Vector3(6.0369629829775736287, -1.25571467171034855444, -2.517589840583626047)),
|
|
|
+ "Vector3 reflect with normal should return expected value.");
|
|
|
CHECK_MESSAGE(
|
|
|
vector.project(vector_y) == Vector3(0, 3.4, 0),
|
|
|
- "Vector3 projected on the X axis should only give the Y component.");
|
|
|
+ "Vector3 projected on the Y axis should only give the Y component.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.project(vector_normal).is_equal_approx(Vector3(3.61848149148878681437, 1.0721426641448257227776, 1.54120507970818697649)),
|
|
|
+ "Vector3 projected on a normal should return expected value.");
|
|
|
CHECK_MESSAGE(
|
|
|
vector.slide(vector_y) == Vector3(1.2, 0, 5.6),
|
|
|
"Vector3 slide on a plane with normal of the Y axis should set the Y to zero.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.slide(vector_normal).is_equal_approx(Vector3(-2.41848149148878681437, 2.32785733585517427722237, 4.0587949202918130235)),
|
|
|
+ "Vector3 slide with normal should return expected value.");
|
|
|
+ // There's probably a better way to test these ones?
|
|
|
+ ERR_PRINT_OFF;
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.bounce(vector_non_normal).is_equal_approx(Vector3()),
|
|
|
+ "Vector3 bounce should return empty Vector3 with non-normalised input.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.reflect(vector_non_normal).is_equal_approx(Vector3()),
|
|
|
+ "Vector3 reflect should return empty Vector3 with non-normalised input.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ vector.slide(vector_non_normal).is_equal_approx(Vector3()),
|
|
|
+ "Vector3 slide should return empty Vector3 with non-normalised input.");
|
|
|
+ ERR_PRINT_ON;
|
|
|
}
|
|
|
|
|
|
TEST_CASE("[Vector3] Rounding methods") {
|
|
@@ -389,6 +446,8 @@ TEST_CASE("[Vector3] Linear algebra methods") {
|
|
|
const Vector3 vector_x = Vector3(1, 0, 0);
|
|
|
const Vector3 vector_y = Vector3(0, 1, 0);
|
|
|
const Vector3 vector_z = Vector3(0, 0, 1);
|
|
|
+ const Vector3 a = Vector3(3.5, 8.5, 2.3);
|
|
|
+ const Vector3 b = Vector3(5.2, 4.6, 7.8);
|
|
|
CHECK_MESSAGE(
|
|
|
vector_x.cross(vector_y) == vector_z,
|
|
|
"Vector3 cross product of X and Y should give Z.");
|
|
@@ -401,6 +460,12 @@ TEST_CASE("[Vector3] Linear algebra methods") {
|
|
|
CHECK_MESSAGE(
|
|
|
vector_z.cross(vector_x) == vector_y,
|
|
|
"Vector3 cross product of Z and X should give Y.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ a.cross(b).is_equal_approx(Vector3(55.72, -15.34, -28.1)),
|
|
|
+ "Vector3 cross should return expected value.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ Vector3(-a.x, a.y, -a.z).cross(Vector3(b.x, -b.y, b.z)).is_equal_approx(Vector3(55.72, 15.34, -28.1)),
|
|
|
+ "Vector2 cross should return expected value.");
|
|
|
|
|
|
CHECK_MESSAGE(
|
|
|
vector_x.dot(vector_y) == 0.0,
|
|
@@ -411,6 +476,12 @@ TEST_CASE("[Vector3] Linear algebra methods") {
|
|
|
CHECK_MESSAGE(
|
|
|
(vector_x * 10).dot(vector_x * 10) == 100.0,
|
|
|
"Vector3 dot product of same direction vectors should behave as expected.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ Math::is_equal_approx(a.dot(b), (real_t)75.24),
|
|
|
+ "Vector3 dot should return expected value.");
|
|
|
+ CHECK_MESSAGE(
|
|
|
+ Math::is_equal_approx(Vector3(-a.x, a.y, -a.z).dot(Vector3(b.x, -b.y, b.z)), (real_t)-75.24),
|
|
|
+ "Vector3 dot should return expected value.");
|
|
|
}
|
|
|
} // namespace TestVector3
|
|
|
|