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