janwas
9542ecdd7e
refs #117 stub_impl_hack: defines a function otherwise provided by main.cpp remove old self_test.h contents (e.g. TEST); superceded by cxxtestgen TS_ASSERT etc. only include self_test from a test (otherwise, cxxtest include dir won't be set) cxxtest won't run tests named only "test"; add more descriptive name FIXES uncovered by self tests lib: infinite loop in log2 lockfree: incorrect params This was SVN commit r3979.
69 lines
1.5 KiB
C++
69 lines
1.5 KiB
C++
#include "lib/self_test.h"
|
|
|
|
#include <cstdlib>
|
|
#include <cmath>
|
|
#include "lib/lib.h"
|
|
#include "maths/Matrix3D.h"
|
|
#include "maths/Quaternion.h"
|
|
|
|
class TestMatrix : public CxxTest::TestSuite
|
|
{
|
|
public:
|
|
void test_inverse()
|
|
{
|
|
CMatrix3D m;
|
|
srand(0);
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
for (int j = 0; j < 16; ++j)
|
|
{
|
|
m._data[j] = -1.0f + 2.0f*(rand()/(float)RAND_MAX);
|
|
}
|
|
CMatrix3D n;
|
|
m.GetInverse(n);
|
|
m *= n;
|
|
// verify identity has 1s on diagonal and 0 otherwise
|
|
for (int x = 0; x < 4; ++x)
|
|
{
|
|
for (int y = 0; y < 4; ++y)
|
|
{
|
|
const float expected = (x==y)? 1.0f : 0.0f;
|
|
TS_ASSERT_DELTA(m(x,y), expected, 0.0001f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void test_quats()
|
|
{
|
|
srand(0);
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
CQuaternion q;
|
|
q.FromEulerAngles(
|
|
-6.28f + 12.56f*(rand()/(float)RAND_MAX),
|
|
-6.28f + 12.56f*(rand()/(float)RAND_MAX),
|
|
-6.28f + 12.56f*(rand()/(float)RAND_MAX)
|
|
);
|
|
CMatrix3D m;
|
|
q.ToMatrix(m);
|
|
CQuaternion q2 = m.GetRotation();
|
|
|
|
// I hope there's a good reason why they're sometimes negated, and
|
|
// it's not just a bug...
|
|
const bool ok_oneway =
|
|
feq(q2.m_W, q.m_W) &&
|
|
feq(q2.m_V.X, q.m_V.X) &&
|
|
feq(q2.m_V.Y, q.m_V.Y) &&
|
|
feq(q2.m_V.Z, q.m_V.Z);
|
|
const bool ok_otherway =
|
|
feq(q2.m_W, -q.m_W) &&
|
|
feq(q2.m_V.X, -q.m_V.X) &&
|
|
feq(q2.m_V.Y, -q.m_V.Y) &&
|
|
feq(q2.m_V.Z, -q.m_V.Z);
|
|
TS_ASSERT(ok_oneway ^ ok_otherway);
|
|
}
|
|
}
|
|
};
|
|
|