2 #include <msp/linal/vector.h>
3 #include <msp/test/test.h>
8 class VectorTests: public Test::RegisteredTest<VectorTests>
11 typedef LinAl::Vector<int, 2> Vector2i;
12 typedef LinAl::Vector<int, 3> Vector3i;
13 typedef LinAl::Vector<float, 3> Vector3f;
18 static const char *get_name() { return "Vector"; }
21 void component_aliases();
31 VectorTests::VectorTests()
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");
43 void VectorTests::component_aliases()
49 EXPECT_EQUAL(v.x, v[0]);
50 EXPECT_EQUAL(v.y, v[1]);
51 EXPECT_EQUAL(v.z, v[2]);
54 void VectorTests::composition()
57 EXPECT_EQUAL(compose(3, v), Vector3i(3, 1, 2));
58 EXPECT_EQUAL(compose(v, 3), Vector3i(1, 2, 3));
61 void VectorTests::slice()
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);
69 void VectorTests::addition()
73 EXPECT_EQUAL(v+w, Vector3i(5, 5, 8));
74 EXPECT_EQUAL(v+w, w+v);
77 void VectorTests::inner_prod()
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);
87 void VectorTests::cross_prod()
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);
100 void VectorTests::norm()
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);
108 template<typename T, unsigned N>
109 bool is_unit(const LinAl::Vector<T, N> &v)
111 static const T limit = numeric_limits<T>::epsilon()*4;
112 return abs(v.norm()-T(1))<=limit;
115 void VectorTests::unit_vec()
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)));