]> git.tdb.fi Git - libs/math.git/blob - tests/matrix.cpp
Improve readability of Matrix test cases with typedefs
[libs/math.git] / tests / matrix.cpp
1 #include <limits>
2 #include <msp/linal/matrix.h>
3 #include <msp/linal/squarematrix.h>
4 #include <msp/test/test.h>
5
6 using namespace std;
7 using namespace Msp;
8
9 class MatrixTests: public Test::RegisteredTest<MatrixTests>
10 {
11 private:
12         typedef LinAl::SquareMatrix<double, 2> Matrix2d;
13         typedef LinAl::Matrix<double, 3, 2> Matrix3x2d;
14         typedef LinAl::Matrix<double, 2, 3> Matrix2x3d;
15         typedef LinAl::SquareMatrix<double, 3> Matrix3d;
16
17 public:
18         MatrixTests();
19
20         static const char *get_name() { return "Matrix"; }
21
22 private:
23         void multiply();
24         void invert();
25 };
26
27
28 MatrixTests::MatrixTests()
29 {
30         add(&MatrixTests::multiply, "Multiplication");
31         add(&MatrixTests::invert, "Inversion");
32 }
33
34 void MatrixTests::multiply()
35 {
36         static double data[] =
37         {
38                 1, 2, 1, 2, 1, 2,
39                 3, 0, 3, 0, 0, 3,
40                 3, 6, 3, 3, 6, 3, 6, 3, 6,
41                 9, 3, 9, 6
42         };
43
44         Matrix3x2d a(data);
45         Matrix2x3d b(data+6);
46         EXPECT_EQUAL(a*b, Matrix3d(data+12));
47         EXPECT_EQUAL(b*a, Matrix2d(data+21));
48 }
49
50 template<typename T, unsigned N>
51 bool is_identity(const LinAl::Matrix<T, N, N> &m)
52 {
53         static const T limit = numeric_limits<T>::epsilon()*4;
54         for(unsigned i=0; i<N; ++i)
55                 for(unsigned j=0; j<N; ++j)
56                         if(abs(T(i==j)-m(i, j))>limit)
57                                 return false;
58         return true;
59 }
60
61 void MatrixTests::invert()
62 {
63         static double data[] =
64         {
65                 1, 4, 2, 4, 8, 6, 2, 2, 4
66         };
67
68         Matrix3d m(data);
69         Matrix3d i = LinAl::invert(m);
70         EXPECT(is_identity(i*m));
71 }