--- /dev/null
+#include "VectorTest.h"
+
+#include <limits>
+
+CPPUNIT_TEST_SUITE_REGISTRATION(test_math::VectorTest);
+
+using math::Vector;
+
+
+namespace test_math {
+
+void VectorTest::setUp() {
+
+}
+
+void VectorTest::tearDown() {
+
+}
+
+
+void VectorTest::testComparison() {
+ CPPUNIT_ASSERT_EQUAL(Vector<int>(0, 0), Vector<int>(0, 0));
+
+ CPPUNIT_ASSERT(Vector<int>(0, 0) != Vector<int>(0, 1));
+ CPPUNIT_ASSERT(Vector<int>(0, 0) != Vector<int>(1, 0));
+ CPPUNIT_ASSERT(Vector<int>(0, 0) != Vector<int>(1, 1));
+}
+
+void VectorTest::testSum() {
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(1, 1),
+ Vector<int>(1, 1) + Vector<int>(0, 0));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(1, 1),
+ Vector<int>(0, 1) + Vector<int>(1, 0));
+
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(1, 1),
+ Vector<int>(1, 1) - Vector<int>(0, 0));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(0, 1),
+ Vector<int>(1, 1) - Vector<int>(1, 0));
+}
+
+void VectorTest::testProduct() {
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(2, 3),
+ Vector<int>(2, 3) * Vector<int>(1, 1));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(10, 12),
+ Vector<int>(2, 3) * Vector<int>(5, 4));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(2, 3),
+ Vector<int>(2, 3) * 1);
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(4, 6),
+ Vector<int>(2, 3) * 2);
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(2, 3),
+ 1 * Vector<int>(2, 3));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(4, 6),
+ 2 * Vector<int>(2, 3));
+
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(10, 12),
+ Vector<int>(10, 12) / Vector<int>(1, 1));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(2, 3),
+ Vector<int>(10, 12) / Vector<int>(5, 4));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(4, 6),
+ Vector<int>(4, 6) / 1);
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(2, 3),
+ Vector<int>(4, 6) / 2);
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(3, 4),
+ 12 / Vector<int>(4, 3));
+}
+
+void VectorTest::testModulo() {
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(0, 0),
+ Vector<int>(1, 2) % Vector<int>(1, 1));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(0, 0),
+ Vector<int>(1, 2) % 1);
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(3, 1),
+ Vector<int>(3, 5) % Vector<int>(4, 2));
+ CPPUNIT_ASSERT_EQUAL(
+ Vector<int>(3, 1),
+ Vector<int>(3, 5) % 4);
+
+ Vector<float> vecf = Vector<float>(4.0f, 5.0f) % Vector<float>(2.0f, 3.0f);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0f, vecf.X(), std::numeric_limits<float>::epsilon());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0f, vecf.Y(), std::numeric_limits<float>::epsilon());
+
+ vecf = Vector<float>(4.0f, 5.0f) % 4.0f;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0f, vecf.X(), std::numeric_limits<float>::epsilon());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0f, vecf.Y(), std::numeric_limits<float>::epsilon());
+
+ Vector<double> vecd = Vector<double>(4.0, 5.0) % Vector<double>(2.0, 3.0);
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, vecd.X(), std::numeric_limits<double>::epsilon());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, vecd.Y(), std::numeric_limits<double>::epsilon());
+
+ vecd = Vector<double>(4.0, 5.0) % 4.0;
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, vecd.X(), std::numeric_limits<double>::epsilon());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(1.0, vecd.Y(), std::numeric_limits<double>::epsilon());
+}
+
+void VectorTest::testFunctional() {
+ const Vector<int> vec(2, 5);
+ CPPUNIT_ASSERT_EQUAL(2, vec.X());
+ CPPUNIT_ASSERT_EQUAL(5, vec.Y());
+ CPPUNIT_ASSERT_EQUAL(52, vec.Index(10));
+
+ const Vector<int> indexVec = Vector<int>::FromIndex(52, 10);
+ CPPUNIT_ASSERT_EQUAL(vec, indexVec);
+
+ Vector<int> lockedVec = Vector<int>(vec);
+ lockedVec.Lock(Vector<int>(2, 2));
+ CPPUNIT_ASSERT_EQUAL(Vector<int>(2, 4), lockedVec);
+}
+
+}