From 0ed0f261b4dec1b92f82a08cdd5da6987d35c6a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Sat, 26 Jan 2013 14:24:13 +0100 Subject: [PATCH] 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. --- src/Math/Test/RectangularMatrixTest.cpp | 89 ++++++++-------- src/Math/Test/VectorTest.cpp | 129 ++++++++++++++++++++---- 2 files changed, 158 insertions(+), 60 deletions(-) diff --git a/src/Math/Test/RectangularMatrixTest.cpp b/src/Math/Test/RectangularMatrixTest.cpp index 24fc78fba..86bc8e61a 100644 --- a/src/Math/Test/RectangularMatrixTest.cpp +++ b/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::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::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() { diff --git a/src/Math/Test/VectorTest.cpp b/src/Math/Test/VectorTest.cpp index 56eb0083b..03fead6d7 100644 --- a/src/Math/Test/VectorTest.cpp +++ b/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::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::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);