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"; }
22 void component_aliases();
32 VectorTests::VectorTests()
34 add(&VectorTests::constructors, "Constructors");
35 add(&VectorTests::component_aliases, "Component aliases");
36 add(&VectorTests::composition, "Compose");
37 add(&VectorTests::slice, "Slice");
38 add(&VectorTests::addition, "Addition");
39 add(&VectorTests::inner_prod, "Inner product");
40 add(&VectorTests::cross_prod, "Cross product");
41 add(&VectorTests::norm, "Norm");
42 add(&VectorTests::unit_vec, "Normalize");
45 void VectorTests::constructors()
47 static int data[] = { 1, 2, 3 };
50 EXPECT_EQUAL(v1[0], 1);
51 EXPECT_EQUAL(v1[1], 2);
54 EXPECT_EQUAL(v2[0], 1);
55 EXPECT_EQUAL(v2[1], 2);
56 EXPECT_EQUAL(v2[2], 3);
58 #if __cplusplus >= 201103L
59 LinAl::Vector<int, 1> v3(1);
60 EXPECT_EQUAL(v3[0], 1);
62 LinAl::Vector<int, 5> v4(1, 2, 3, 4, 5);
63 EXPECT_EQUAL(v4[0], 1);
64 EXPECT_EQUAL(v4[4], 5);
68 void VectorTests::component_aliases()
74 EXPECT_EQUAL(v.x, v[0]);
75 EXPECT_EQUAL(v.y, v[1]);
76 EXPECT_EQUAL(v.z, v[2]);
79 void VectorTests::composition()
82 EXPECT_EQUAL(compose(3, v), Vector3i(3, 1, 2));
83 EXPECT_EQUAL(compose(v, 3), Vector3i(1, 2, 3));
86 void VectorTests::slice()
89 EXPECT_EQUAL(v.slice<2>(0), Vector2i(1, 2));
90 EXPECT_EQUAL(v.slice<2>(1), Vector2i(2, 3));
91 EXPECT_EQUAL(v.slice<3>(0), v);
94 void VectorTests::addition()
98 EXPECT_EQUAL(v+w, Vector3i(5, 5, 8));
99 EXPECT_EQUAL(v+w, w+v);
102 void VectorTests::inner_prod()
105 Vector3i w(-2, 5, 1);
106 Vector3i u(-13, -7, 9);
107 EXPECT_EQUAL(inner_product(v, w), 11);
108 EXPECT_EQUAL(inner_product(v, u), 0);
109 EXPECT_EQUAL(inner_product(w, u), 0);
112 void VectorTests::cross_prod()
117 EXPECT_EQUAL(cross(x, y), z);
118 EXPECT_EQUAL(cross(y, x), -z);
119 EXPECT_EQUAL(cross(y, z), x);
120 EXPECT_EQUAL(cross(z, y), -x);
121 EXPECT_EQUAL(cross(z, x), y);
122 EXPECT_EQUAL(cross(x, z), -y);
125 void VectorTests::norm()
127 Vector3f v(2.0f, 6.0f, 9.0f);
128 Vector3f w(-3.0f, -4.0f, 12.0f);
129 EXPECT_EQUAL(v.norm(), 11.0f);
130 EXPECT_EQUAL(w.norm(), 13.0f);
133 template<typename T, unsigned N>
134 bool is_unit(const LinAl::Vector<T, N> &v)
136 static const T limit = numeric_limits<T>::epsilon()*4;
137 return abs(v.norm()-T(1))<=limit;
140 void VectorTests::unit_vec()
142 Vector3f v(2.0f, 6.0f, 9.0f);
143 Vector3f w(-3.0f, -4.0f, 12.0f);
144 EXPECT(is_unit(normalize(v)));
145 EXPECT(is_unit(normalize(w)));