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

129
src/Math/Test/VectorTest.cpp

@ -28,18 +28,30 @@ class VectorTest: public Corrade::TestSuite::Tester {
public: public:
VectorTest(); VectorTest();
void construct(); void constructFromData();
void constructDefault();
void constructConversion();
void data();
void negative();
void addSubtract();
void multiplyDivide();
void multiplyDivideComponentWise();
void compare();
void compareComponentWise(); void compareComponentWise();
void dot(); void dot();
void multiplyDivideComponentWise();
void dotSelf(); void dotSelf();
void length(); void length();
void normalized(); void normalized();
void projected();
void sum(); void sum();
void product(); void product();
void min(); void min();
void max(); void max();
void projected();
void angle(); void angle();
void lerp(); void lerp();
@ -47,35 +59,78 @@ class VectorTest: public Corrade::TestSuite::Tester {
void configuration(); void configuration();
}; };
typedef Vector<4, float> Vector4;
typedef Vector<3, float> Vector3; typedef Vector<3, float> Vector3;
typedef Vector<4, float> Vector4;
typedef Vector<4, std::int32_t> Vector4i;
VectorTest::VectorTest() { 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::compareComponentWise,
&VectorTest::dot, &VectorTest::dot,
&VectorTest::multiplyDivideComponentWise,
&VectorTest::dotSelf, &VectorTest::dotSelf,
&VectorTest::length, &VectorTest::length,
&VectorTest::normalized, &VectorTest::normalized,
&VectorTest::projected,
&VectorTest::sum, &VectorTest::sum,
&VectorTest::product, &VectorTest::product,
&VectorTest::min, &VectorTest::min,
&VectorTest::max, &VectorTest::max,
&VectorTest::projected,
&VectorTest::angle, &VectorTest::angle,
&VectorTest::lerp, &VectorTest::lerp,
&VectorTest::debug, &VectorTest::debug,
&VectorTest::configuration); &VectorTest::configuration);
} }
void VectorTest::construct() { void VectorTest::constructFromData() {
CORRADE_COMPARE(Vector4(), Vector4(0.0f, 0.0f, 0.0f, 0.0f));
float data[] = { 1.0f, 2.0f, 3.0f, 4.0f }; float data[] = { 1.0f, 2.0f, 3.0f, 4.0f };
CORRADE_COMPARE(Vector4::from(data), Vector4(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() { 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, 8.0f));
CORRADE_VERIFY(!(Vector4(1.0f, -2.0f, -5.0f, 7.0f) < Vector4(1.1f, -1.0f, 3.0f, 7.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))); CORRADE_VERIFY(!(Vector4(1.1f, -1.0f, 3.0f, 7.0f) > Vector4(1.0f, -2.0f, -5.0f, 7.0f)));
} }
void VectorTest::dot() { void VectorTest::negative() {
CORRADE_COMPARE(Vector4::dot({1.0f, 0.5f, 0.75f, 1.5f}, {2.0f, 4.0f, 1.0f, 7.0f}), 15.25f); 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() { void VectorTest::multiplyDivideComponentWise() {
@ -103,6 +188,10 @@ void VectorTest::multiplyDivideComponentWise() {
CORRADE_COMPARE(multiplied/multiplier, vec); 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() { void VectorTest::dotSelf() {
CORRADE_COMPARE(Vector4(1.0f, 2.0f, 3.0f, 4.0f).dot(), 30.0f); 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)); 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() { void VectorTest::sum() {
CORRADE_COMPARE(Vector3(1.0f, 2.0f, 4.0f).sum(), 7.0f); 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); 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() { void VectorTest::angle() {
std::ostringstream o; std::ostringstream o;
Error::setOutput(&o); Error::setOutput(&o);

Loading…
Cancel
Save