Browse Source

Math: matrix/vector rework, part 1: synchronized unit tests.

They now test the same functionality in two places, but the
functionality will be implemented differently for matrix and vector.
pull/7/head
Vladimír Vondruš 13 years ago
parent
commit
0ed0f261b4
  1. 89
      src/Math/Test/RectangularMatrixTest.cpp
  2. 129
      src/Math/Test/VectorTest.cpp

89
src/Math/Test/RectangularMatrixTest.cpp

@ -27,12 +27,14 @@ class RectangularMatrixTest: public Corrade::TestSuite::Tester {
public:
RectangularMatrixTest();
void construct();
void constructFromData();
void constructDefault();
void constructConversion();
void constructFromVectors();
void constructFrom();
void constructZero();
void data();
void compare();
void negative();
void addSubtract();
void multiplyDivide();
@ -51,12 +53,14 @@ typedef RectangularMatrix<2, 2, std::int32_t> Matrix2i;
typedef Vector<4, float> Vector4;
RectangularMatrixTest::RectangularMatrixTest() {
addTests(&RectangularMatrixTest::construct,
addTests(&RectangularMatrixTest::constructFromData,
&RectangularMatrixTest::constructDefault,
&RectangularMatrixTest::constructConversion,
&RectangularMatrixTest::constructFromVectors,
&RectangularMatrixTest::constructFrom,
&RectangularMatrixTest::constructZero,
&RectangularMatrixTest::data,
&RectangularMatrixTest::compare,
&RectangularMatrixTest::negative,
&RectangularMatrixTest::addSubtract,
&RectangularMatrixTest::multiplyDivide,
@ -68,7 +72,7 @@ RectangularMatrixTest::RectangularMatrixTest() {
&RectangularMatrixTest::configuration);
}
void RectangularMatrixTest::construct() {
void RectangularMatrixTest::constructFromData() {
float m[] = {
3.0f, 5.0f, 8.0f, 4.0f,
4.0f, 4.0f, 7.0f, 3.0f,
@ -84,20 +88,20 @@ void RectangularMatrixTest::construct() {
CORRADE_COMPARE(Matrix3x4::from(m), expected);
}
void RectangularMatrixTest::constructFromVectors() {
Matrix3x4 actual = Matrix3x4::from(Vector4(1.0f, 2.0f, 3.0f, 4.0f),
Vector4(5.0f, 6.0f, 7.0f, 8.0f),
Vector4(9.0f, 10.0f, 11.0f, 12.0f));
void RectangularMatrixTest::constructDefault() {
Matrix4x3 zero;
Matrix3x4 expected(1.0f, 2.0f, 3.0f, 4.0f,
5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f);
Matrix4x3 zeroExpected(
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f
);
CORRADE_COMPARE(actual, expected);
CORRADE_COMPARE(zero, zeroExpected);
}
void RectangularMatrixTest::constructFrom() {
void RectangularMatrixTest::constructConversion() {
Matrix2 floatingPoint(1.3f, 2.7f, -15.0f, 7.0f);
Matrix2 floatingPointRounded(1.0f, 2.0f, -15.0f, 7.0f);
Matrix2i integral(1, 2, -15, 7);
@ -106,27 +110,24 @@ void RectangularMatrixTest::constructFrom() {
CORRADE_COMPARE(Matrix2::from(integral), floatingPointRounded);
}
void RectangularMatrixTest::constructZero() {
Matrix4x3 zero;
void RectangularMatrixTest::constructFromVectors() {
Matrix3x4 actual = Matrix3x4::from(Vector4(1.0f, 2.0f, 3.0f, 4.0f),
Vector4(5.0f, 6.0f, 7.0f, 8.0f),
Vector4(9.0f, 10.0f, 11.0f, 12.0f));
Matrix4x3 zeroExpected(
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f
);
Matrix3x4 expected(1.0f, 2.0f, 3.0f, 4.0f,
5.0f, 6.0f, 7.0f, 8.0f,
9.0f, 10.0f, 11.0f, 12.0f);
CORRADE_COMPARE(zero, zeroExpected);
CORRADE_COMPARE(actual, expected);
}
void RectangularMatrixTest::data() {
Matrix3x4 m;
Vector4 vector(4.0f, 5.0f, 6.0f, 7.0f);
m[2] = vector;
m[1][1] = 1.0f;
m(0, 2) = 1.5f;
CORRADE_COMPARE(m(1, 1), 1.0f);
@ -142,6 +143,14 @@ void RectangularMatrixTest::data() {
CORRADE_COMPARE(m, expected);
}
void RectangularMatrixTest::compare() {
CORRADE_VERIFY(Matrix2(1.0f, -3.0f, 5.0f, -10.0f) == Matrix2(1.0f + MathTypeTraits<float>::epsilon()/2, -3.0f, 5.0f, -10.0f));
CORRADE_VERIFY(Matrix2(1.0f, -1.0f, 5.0f, -10.0f) != Matrix2(1.0f, -1.0f + MathTypeTraits<float>::epsilon()*2, 5.0f, -10.0f));
CORRADE_VERIFY(Matrix2i(1, -3, 5, -10) == Matrix2i(1, -3, 5, -10));
CORRADE_VERIFY(Matrix2i(1, -3, 5, -10) != Matrix2i(1, -2, 5, -10));
}
void RectangularMatrixTest::negative() {
CORRADE_COMPARE(-Matrix2(1.0f, -3.0f, 5.0f, -10.0f), Matrix2(-1.0f, 3.0f, -5.0f, 10.0f));
}
@ -155,34 +164,34 @@ void RectangularMatrixTest::addSubtract() {
-9.0f, 11.0f, 0.25f,
0.0f, -8.0f, 19.0f,
-3.0f, -5.0f, 2.0f);
Matrix4x3 e(-4.0f, 1.5f, 12.0f,
Matrix4x3 c(-4.0f, 1.5f, 12.0f,
-5.0f, 16.0f, 7.25f,
8.0f, 1.0f, 30.0f,
9.0f, 8.0f, 17.0f);
CORRADE_COMPARE(a + b, e);
CORRADE_COMPARE(e - b, a);
CORRADE_COMPARE(a + b, c);
CORRADE_COMPARE(c - b, a);
}
void RectangularMatrixTest::multiplyDivide() {
Matrix2 vec(1.0f, 2.0f, 3.0f, 4.0f);
Matrix2 matrix(1.0f, 2.0f, 3.0f, 4.0f);
Matrix2 multiplied(-1.5f, -3.0f, -4.5f, -6.0f);
CORRADE_COMPARE(vec*-1.5f, multiplied);
CORRADE_COMPARE(-1.5f*vec, multiplied);
CORRADE_COMPARE(multiplied/-1.5f, vec);
CORRADE_COMPARE(matrix*-1.5f, multiplied);
CORRADE_COMPARE(-1.5f*matrix, multiplied);
CORRADE_COMPARE(multiplied/-1.5f, matrix);
Math::RectangularMatrix<1, 1, std::int8_t> vecChar(32);
Math::RectangularMatrix<1, 1, std::int8_t> matrixChar(32);
Math::RectangularMatrix<1, 1, std::int8_t> multipliedChar(-48);
CORRADE_COMPARE(vecChar*-1.5f, multipliedChar);
CORRADE_COMPARE(multipliedChar/-1.5f, vecChar);
CORRADE_COMPARE(-1.5f*vecChar, multipliedChar);
CORRADE_COMPARE(matrixChar*-1.5f, multipliedChar);
CORRADE_COMPARE(multipliedChar/-1.5f, matrixChar);
CORRADE_COMPARE(-1.5f*matrixChar, multipliedChar);
/* Divide vector with number and inverse */
Matrix2 divisor(1.0f, 2.0f, -4.0f, 8.0f);
Matrix2 result(1.0f, 0.5f, -0.25f, 0.125f);
CORRADE_COMPARE(1.0f/divisor, result);
CORRADE_COMPARE(-1550.0f/multipliedChar, vecChar);
CORRADE_COMPARE(-1550.0f/multipliedChar, matrixChar);
}
void RectangularMatrixTest::multiply() {

129
src/Math/Test/VectorTest.cpp

@ -28,18 +28,30 @@ class VectorTest: public Corrade::TestSuite::Tester {
public:
VectorTest();
void construct();
void constructFromData();
void constructDefault();
void constructConversion();
void data();
void negative();
void addSubtract();
void multiplyDivide();
void multiplyDivideComponentWise();
void compare();
void compareComponentWise();
void dot();
void multiplyDivideComponentWise();
void dotSelf();
void length();
void normalized();
void projected();
void sum();
void product();
void min();
void max();
void projected();
void angle();
void lerp();
@ -47,35 +59,78 @@ class VectorTest: public Corrade::TestSuite::Tester {
void configuration();
};
typedef Vector<4, float> Vector4;
typedef Vector<3, float> Vector3;
typedef Vector<4, float> Vector4;
typedef Vector<4, std::int32_t> Vector4i;
VectorTest::VectorTest() {
addTests(&VectorTest::construct,
addTests(&VectorTest::constructFromData,
&VectorTest::constructDefault,
&VectorTest::constructConversion,
&VectorTest::data,
&VectorTest::negative,
&VectorTest::addSubtract,
&VectorTest::multiplyDivide,
&VectorTest::multiplyDivideComponentWise,
&VectorTest::compare,
&VectorTest::compareComponentWise,
&VectorTest::dot,
&VectorTest::multiplyDivideComponentWise,
&VectorTest::dotSelf,
&VectorTest::length,
&VectorTest::normalized,
&VectorTest::projected,
&VectorTest::sum,
&VectorTest::product,
&VectorTest::min,
&VectorTest::max,
&VectorTest::projected,
&VectorTest::angle,
&VectorTest::lerp,
&VectorTest::debug,
&VectorTest::configuration);
}
void VectorTest::construct() {
CORRADE_COMPARE(Vector4(), Vector4(0.0f, 0.0f, 0.0f, 0.0f));
void VectorTest::constructFromData() {
float data[] = { 1.0f, 2.0f, 3.0f, 4.0f };
CORRADE_COMPARE(Vector4::from(data), Vector4(1.0f, 2.0f, 3.0f, 4.0f));
}
void VectorTest::constructDefault() {
CORRADE_COMPARE(Vector4(), Vector4(0.0f, 0.0f, 0.0f, 0.0f));
}
void VectorTest::constructConversion() {
Vector4 floatingPoint(1.3f, 2.7f, -15.0f, 7.0f);
Vector4 floatingPointRounded(1.0f, 2.0f, -15.0f, 7.0f);
Vector4i integral(1, 2, -15, 7);
CORRADE_COMPARE(Vector4i::from(floatingPoint), integral);
CORRADE_COMPARE(Vector4::from(integral), floatingPointRounded);
}
void VectorTest::data() {
Vector4 vector(4.0f, 5.0f, 6.0f, 7.0f);
vector[2] = 1.0f;
vector[3] = 1.5f;
CORRADE_COMPARE(vector[2], 1.0f);
CORRADE_COMPARE(vector[3], 1.5f);
CORRADE_COMPARE(vector, Vector4(4.0f, 5.0f, 1.0f, 1.5f));
}
void VectorTest::compare() {
CORRADE_VERIFY(Vector4(1.0f, -3.5f, 5.0f, -10.0f) == Vector4(1.0f + MathTypeTraits<float>::epsilon()/2, -3.5f, 5.0f, -10.0f));
CORRADE_VERIFY(Vector4(1.0f, -1.0f, 5.0f, -10.0f) != Vector4(1.0f, -1.0f + MathTypeTraits<float>::epsilon()*2, 5.0f, -10.0f));
CORRADE_VERIFY(Vector4i(1, -3, 5, -10) == Vector4i(1, -3, 5, -10));
CORRADE_VERIFY(Vector4i(1, -3, 5, -10) != Vector4i(1, -2, 5, -10));
}
void VectorTest::compareComponentWise() {
CORRADE_VERIFY(Vector4(1.0f, -2.0f, -5.0f, 7.0f) < Vector4(1.1f, -1.0f, 3.0f, 8.0f));
CORRADE_VERIFY(!(Vector4(1.0f, -2.0f, -5.0f, 7.0f) < Vector4(1.1f, -1.0f, 3.0f, 7.0f)));
@ -90,8 +145,38 @@ void VectorTest::compareComponentWise() {
CORRADE_VERIFY(!(Vector4(1.1f, -1.0f, 3.0f, 7.0f) > Vector4(1.0f, -2.0f, -5.0f, 7.0f)));
}
void VectorTest::dot() {
CORRADE_COMPARE(Vector4::dot({1.0f, 0.5f, 0.75f, 1.5f}, {2.0f, 4.0f, 1.0f, 7.0f}), 15.25f);
void VectorTest::negative() {
CORRADE_COMPARE(-Vector4(1.0f, -3.0f, 5.0f, -10.0f), Vector4(-1.0f, 3.0f, -5.0f, 10.0f));
}
void VectorTest::addSubtract() {
Vector4 a(1.0f, -3.0f, 5.0f, -10.0f);
Vector4 b(7.5f, 33.0f, -15.0f, 0.0f);
Vector4 c(8.5f, 30.0f, -10.0f, -10.0f);
CORRADE_COMPARE(a + b, c);
CORRADE_COMPARE(c - b, a);
}
void VectorTest::multiplyDivide() {
Vector4 vector(1.0f, 2.0f, 3.0f, 4.0f);
Vector4 multiplied(-1.5f, -3.0f, -4.5f, -6.0f);
CORRADE_COMPARE(vector*-1.5f, multiplied);
CORRADE_COMPARE(-1.5f*vector, multiplied);
CORRADE_COMPARE(multiplied/-1.5f, vector);
Math::Vector<1, std::int8_t> vectorChar(32);
Math::Vector<1, std::int8_t> multipliedChar(-48);
CORRADE_COMPARE(vectorChar*-1.5f, multipliedChar);
CORRADE_COMPARE(multipliedChar/-1.5f, vectorChar);
CORRADE_COMPARE(-1.5f*vectorChar, multipliedChar);
/* Divide vector with number and inverse */
Vector4 divisor(1.0f, 2.0f, -4.0f, 8.0f);
Vector4 result(1.0f, 0.5f, -0.25f, 0.125f);
CORRADE_COMPARE(1.0f/divisor, result);
CORRADE_COMPARE(-1550.0f/multipliedChar, vectorChar);
}
void VectorTest::multiplyDivideComponentWise() {
@ -103,6 +188,10 @@ void VectorTest::multiplyDivideComponentWise() {
CORRADE_COMPARE(multiplied/multiplier, vec);
}
void VectorTest::dot() {
CORRADE_COMPARE(Vector4::dot({1.0f, 0.5f, 0.75f, 1.5f}, {2.0f, 4.0f, 1.0f, 7.0f}), 15.25f);
}
void VectorTest::dotSelf() {
CORRADE_COMPARE(Vector4(1.0f, 2.0f, 3.0f, 4.0f).dot(), 30.0f);
}
@ -115,14 +204,6 @@ void VectorTest::normalized() {
CORRADE_COMPARE(Vector4(1.0f, 1.0f, 1.0f, 1.0f).normalized(), Vector4(0.5f, 0.5f, 0.5f, 0.5f));
}
void VectorTest::projected() {
Vector3 line(1.0f, -1.0f, 0.5f);
Vector3 projected = Vector3(1.0f, 2.0f, 3.0f).projected(line);
CORRADE_COMPARE(projected, Vector3(0.222222f, -0.222222f, 0.111111f));
CORRADE_COMPARE(projected.normalized(), line.normalized());
}
void VectorTest::sum() {
CORRADE_COMPARE(Vector3(1.0f, 2.0f, 4.0f).sum(), 7.0f);
}
@ -139,6 +220,14 @@ void VectorTest::max() {
CORRADE_COMPARE(Vector3(1.0f, -2.0f, 3.0f).max(), 3.0f);
}
void VectorTest::projected() {
Vector3 line(1.0f, -1.0f, 0.5f);
Vector3 projected = Vector3(1.0f, 2.0f, 3.0f).projected(line);
CORRADE_COMPARE(projected, Vector3(0.222222f, -0.222222f, 0.111111f));
CORRADE_COMPARE(projected.normalized(), line.normalized());
}
void VectorTest::angle() {
std::ostringstream o;
Error::setOutput(&o);

Loading…
Cancel
Save