--- /dev/null
+#include "FixedTest.h"
+
+CPPUNIT_TEST_SUITE_REGISTRATION(test_math::FixedTest);
+
+typedef math::Fixed<16> Fixed;
+typedef math::Fixed<8> LowerFixed;
+typedef math::Fixed<24> HigherFixed;
+
+
+namespace test_math {
+
+void FixedTest::setUp() {
+
+}
+
+void FixedTest::tearDown() {
+
+}
+
+
+void FixedTest::testConversion() {
+ CPPUNIT_ASSERT_EQUAL(1, Fixed(3, 2).Int());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(0.75, Fixed(3, 4).Double(), std::numeric_limits<double>::epsilon());
+
+ CPPUNIT_ASSERT_EQUAL(-1, Fixed(-3, 2).Int());
+ CPPUNIT_ASSERT_DOUBLES_EQUAL(-1.25, Fixed(-5, 4).Double(), std::numeric_limits<double>::epsilon());
+
+ CPPUNIT_ASSERT_EQUAL(Fixed(3, 2), Fixed(1.5));
+ CPPUNIT_ASSERT_EQUAL(Fixed(-4, 10), Fixed(-0.4));
+
+ CPPUNIT_ASSERT_EQUAL(Fixed(3, 2), Fixed(HigherFixed(3, 2)));
+ CPPUNIT_ASSERT_EQUAL(Fixed(3, 2), Fixed(LowerFixed(3, 2)));
+}
+
+void FixedTest::testComparison() {
+ CPPUNIT_ASSERT_EQUAL(Fixed(), Fixed());
+ CPPUNIT_ASSERT_EQUAL(Fixed(1), Fixed(1));
+ CPPUNIT_ASSERT_EQUAL(Fixed(-1), Fixed(-1));
+
+ CPPUNIT_ASSERT_EQUAL(Fixed(1, 2), Fixed(2, 4));
+
+ CPPUNIT_ASSERT(Fixed(0) != Fixed(1));
+ CPPUNIT_ASSERT(Fixed(0) != Fixed(-1));
+ CPPUNIT_ASSERT(Fixed(1, 2) != Fixed(-1, 2));
+
+ CPPUNIT_ASSERT(Fixed(0) < Fixed(1));
+ CPPUNIT_ASSERT(Fixed(1, 2) <= Fixed(1));
+ CPPUNIT_ASSERT(Fixed(0) > Fixed(-1));
+ CPPUNIT_ASSERT(Fixed(1) >= Fixed(-1, 2));
+
+ CPPUNIT_ASSERT(Fixed() == LowerFixed());
+ CPPUNIT_ASSERT(Fixed() == HigherFixed());
+ CPPUNIT_ASSERT(Fixed(1) == LowerFixed(1));
+ CPPUNIT_ASSERT(Fixed(1) == HigherFixed(1));
+ CPPUNIT_ASSERT(Fixed(-1) == LowerFixed(-1));
+ CPPUNIT_ASSERT(Fixed(-1) == HigherFixed(-1));
+
+ CPPUNIT_ASSERT(Fixed(1, 2) == LowerFixed(2, 4));
+ CPPUNIT_ASSERT(Fixed(1, 2) == HigherFixed(2, 4));
+
+ CPPUNIT_ASSERT(Fixed(0) != LowerFixed(1));
+ CPPUNIT_ASSERT(Fixed(0) != HigherFixed(1));
+ CPPUNIT_ASSERT(Fixed(0) != LowerFixed(-1));
+ CPPUNIT_ASSERT(Fixed(0) != HigherFixed(-1));
+ CPPUNIT_ASSERT(Fixed(1, 2) != LowerFixed(-1, 2));
+ CPPUNIT_ASSERT(Fixed(1, 2) != HigherFixed(-1, 2));
+
+ CPPUNIT_ASSERT(Fixed(0) < LowerFixed(1));
+ CPPUNIT_ASSERT(Fixed(0) < HigherFixed(1));
+ CPPUNIT_ASSERT(Fixed(1, 2) <= LowerFixed(1));
+ CPPUNIT_ASSERT(Fixed(1, 2) <= HigherFixed(1));
+ CPPUNIT_ASSERT(Fixed(0) > LowerFixed(-1));
+ CPPUNIT_ASSERT(Fixed(0) > HigherFixed(-1));
+ CPPUNIT_ASSERT(Fixed(1) >= LowerFixed(-1, 2));
+ CPPUNIT_ASSERT(Fixed(1) >= HigherFixed(-1, 2));
+}
+
+void FixedTest::testSum() {
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(3, 4),
+ Fixed(1, 4) + Fixed(1, 2));
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(6, 4),
+ Fixed(2) - Fixed(0.5));
+}
+
+void FixedTest::testProduct() {
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(5),
+ Fixed(2) * Fixed(2.5));
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(-1.7499999999),
+ Fixed(3, 4) * Fixed(-7, 3));
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(4),
+ Fixed(2) / Fixed(0.5));
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(3),
+ Fixed(15) / Fixed(5));
+}
+
+void FixedTest::testModulo() {
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(5),
+ Fixed(5) % 6);
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(5),
+ Fixed(11) % Fixed(6));
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(2.5),
+ Fixed(7.5) % 5);
+ CPPUNIT_ASSERT_EQUAL(
+ Fixed(0.5),
+ Fixed(8) % Fixed(7.5));
+}
+
+}