]> git.tdb.fi Git - libs/math.git/blob - tests/vector.cpp
14aea8708095b5df6dd358331a6f01c39560843d
[libs/math.git] / tests / vector.cpp
1 #include <limits>
2 #include <msp/linal/vector.h>
3 #include <msp/test/test.h>
4
5 using namespace std;
6 using namespace Msp;
7
8 class VectorTests: public Test::RegisteredTest<VectorTests>
9 {
10 private:
11         typedef LinAl::Vector<int, 2> Vector2i;
12         typedef LinAl::Vector<int, 3> Vector3i;
13         typedef LinAl::Vector<float, 3> Vector3f;
14
15 public:
16         VectorTests();
17
18         static const char *get_name() { return "Vector"; }
19
20 private:
21         void component_aliases();
22         void composition();
23         void slice();
24         void addition();
25         void inner_prod();
26         void cross_prod();
27         void norm();
28         void unit_vec();
29 };
30
31 VectorTests::VectorTests()
32 {
33         add(&VectorTests::component_aliases, "Component aliases");
34         add(&VectorTests::composition, "Compose");
35         add(&VectorTests::slice, "Slice");
36         add(&VectorTests::addition, "Addition");
37         add(&VectorTests::inner_prod, "Inner product");
38         add(&VectorTests::cross_prod, "Cross product");
39         add(&VectorTests::norm, "Norm");
40         add(&VectorTests::unit_vec, "Normalize");
41 }
42
43 void VectorTests::component_aliases()
44 {
45         Vector3i v;
46         v.x = 1;
47         v[1] = 2;
48         v.z = 3;
49         EXPECT_EQUAL(v.x, v[0]);
50         EXPECT_EQUAL(v.y, v[1]);
51         EXPECT_EQUAL(v.z, v[2]);
52 }
53
54 void VectorTests::composition()
55 {
56         Vector2i v(1, 2);
57         EXPECT_EQUAL(compose(3, v), Vector3i(3, 1, 2));
58         EXPECT_EQUAL(compose(v, 3), Vector3i(1, 2, 3));
59 }
60
61 void VectorTests::slice()
62 {
63         Vector3i v(1, 2, 3);
64         EXPECT_EQUAL(v.slice<2>(0), Vector2i(1, 2));
65         EXPECT_EQUAL(v.slice<2>(1), Vector2i(2, 3));
66         EXPECT_EQUAL(v.slice<3>(0), v);
67 }
68
69 void VectorTests::addition()
70 {
71         Vector3i v(1, 2, 3);
72         Vector3i w(4, 3, 5);
73         EXPECT_EQUAL(v+w, Vector3i(5, 5, 8));
74         EXPECT_EQUAL(v+w, w+v);
75 }
76
77 void VectorTests::inner_prod()
78 {
79         Vector3i v(1, 2, 3);
80         Vector3i w(-2, 5, 1);
81         Vector3i u(-13, -7, 9);
82         EXPECT_EQUAL(inner_product(v, w), 11);
83         EXPECT_EQUAL(inner_product(v, u), 0);
84         EXPECT_EQUAL(inner_product(w, u), 0);
85 }
86
87 void VectorTests::cross_prod()
88 {
89         Vector3i x(1, 0, 0);
90         Vector3i y(0, 1, 0);
91         Vector3i z(0, 0, 1);
92         EXPECT_EQUAL(cross(x, y), z);
93         EXPECT_EQUAL(cross(y, x), -z);
94         EXPECT_EQUAL(cross(y, z), x);
95         EXPECT_EQUAL(cross(z, y), -x);
96         EXPECT_EQUAL(cross(z, x), y);
97         EXPECT_EQUAL(cross(x, z), -y);
98 }
99
100 void VectorTests::norm()
101 {
102         Vector3f v(2.0f, 6.0f, 9.0f);
103         Vector3f w(-3.0f, -4.0f, 12.0f);
104         EXPECT_EQUAL(v.norm(), 11.0f);
105         EXPECT_EQUAL(w.norm(), 13.0f);
106 }
107
108 template<typename T, unsigned N>
109 bool is_unit(const LinAl::Vector<T, N> &v)
110 {
111         static const T limit = numeric_limits<T>::epsilon()*4;
112         return abs(v.norm()-T(1))<=limit;
113 }
114
115 void VectorTests::unit_vec()
116 {
117         Vector3f v(2.0f, 6.0f, 9.0f);
118         Vector3f w(-3.0f, -4.0f, 12.0f);
119         EXPECT(is_unit(normalize(v)));
120         EXPECT(is_unit(normalize(w)));
121 }