Files
j3ml/tests/LinearAlgebra/Matrix4x4Tests.hpp
josh 4d9a9d3a95
Some checks failed
Build Docs With Doxygen / Explore-Gitea-Actions (push) Waiting to run
Run tests / Explore-Gitea-Actions (push) Has been cancelled
Migrate from google-test to jtest.
2024-06-26 11:43:29 -04:00

130 lines
3.1 KiB
C++

#include <jtest/jtest.hpp>
#include <J3ML/LinearAlgebra/Matrix4x4.h>
#include <J3ML/LinearAlgebra/Quaternion.h>
using namespace J3ML::LinearAlgebra;
int Matrix4x4Tests() {
TEST("Mat4x4::Add_Unary", []
{
Matrix4x4 m(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16);
Matrix4x4 m2 = +m;
jtest::check(m.Equals(m2));
});
TEST("Mat4x4::Inverse", [] {
RNG rng;
Matrix4x4 A = Matrix4x4::RandomGeneral(rng, -10.f, 10.f);
bool mayFail = Math::EqualAbs(A.Determinant(), 0.f, 1e-2f);
Matrix4x4 A2 = A;
bool success = A2.Inverse();
jtest::check(success || mayFail);
if (success)
{
Matrix4x4 id = A * A2;
Matrix4x4 id2 = A2 * A;
jtest::check(id.Equals(Matrix4x4::Identity, 0.3f));
jtest::check(id2.Equals(Matrix4x4::Identity, 0.3f));
}
});
TEST("Mat4x4::Ctor", []{
RNG rng;
Matrix3x3 m = Matrix3x3::RandomGeneral(rng, -10.f, 10.f);
Matrix4x4 m2(m);
for (int y = 0; y < 3; ++y)
for (int x = 0; x < 3; ++x)
assert(Math::EqualAbs(m.At(y, x), m2.At(y, x)));
jtest::check(Math::EqualAbs(m2[0][3], 0.f));
jtest::check(Math::EqualAbs(m2[1][3], 0.f));
jtest::check(Math::EqualAbs(m2[2][3], 0.f));
jtest::check(Math::EqualAbs(m2[3][0], 0.f));
jtest::check(Math::EqualAbs(m2[3][1], 0.f));
jtest::check(Math::EqualAbs(m2[3][2], 0.f));
jtest::check(Math::EqualAbs(m2[3][3], 0.f));
});
TEST("Mat4x4::SetRow", []
{
Matrix4x4 m;
m.SetRow(0, 1,2,3,4);
m.SetRow(1, Vector4(5,6,7,8));
m.SetRow(2, 9,10,11,12);
m.SetRow(3, 13, 14, 15, 16);
Matrix4x4 m3(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16);
Matrix4x4 m2;
m2.Set(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16);
jtest::check(m.Equals(m2));
jtest::check(m.Equals(m3));
});
TEST("Mat4x4::SwapRows", []
{
Matrix4x4 m(1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16);
Matrix4x4 m2(13,14,15,16, 9,10,11,12, 5,6,7,8, 1,2,3,4);
m.SwapRows(0,3);
m.SwapRows(1,2);
jtest::check(m.Equals(m2));
});
TEST("Mat4x4::CtorCols", []
{
Matrix4x4 m(Vector4(1,2,3,4), Vector4(5,6,7,8), Vector4(9,10,11,12), Vector4(13,14,15,16));
Matrix4x4 m2(1,5,9,13, 2,6,10,14, 3,7,11,15, 4,8,12,16);
jtest::check(m.Equals(m2));
});
TEST("Mat4x4::CtorFromQuat", []
{
RNG rng;
// TODO: Multiple random passes
Quaternion q = Quaternion::RandomRotation(rng);
Matrix4x4 m(q);
Vector3 v = Vector3(-1, 5, 20.f);
Vector3 v1 = q * v;
Vector3 v2 = m.Transform(v); //m.TransformPos(v);
jtest::check(v1.Equals(v2));
});
TEST("Mat4x4::CtorFromQuatTrans", [] {});
TEST("Mat4x4::Translate", [] {});
TEST("Mat4x4::Scale", [] {});
TEST("Mat4x4::InverseOrthogonalUniformScale", [] {});
TEST("Mat4x4::InverseOrthonormal", [] {});
TEST("Mat4x4::DeterminantCorrectness", [] { });
TEST("Mat4x4::MulMat3x3", [] {});
return 0;
}