00001
00003 #include <iostream>
00004 #include <istream>
00005 #include <ostream>
00006 #include <sstream>
00007 #include <stdexcept>
00008
00009 #include "test.hpp"
00010 #include "fixed.hpp"
00011
00012 int main()
00013 {
00014 fixed f1;
00015 test(f1.value() == 0);
00016 fixed f2(1);
00017 test(f2.value() == 10000);
00018 fixed f3(3, 14162);
00019 test(f3.value() == 31416);
00020 fixed f4(2, 14159265);
00021 test(f4.value() == 21416);
00022 test(f2 + f4 == f1 + f3);
00023 test(f2 + f4 <= f1 + f3);
00024 test(f2 + f4 >= f1 + f3);
00025 test(f1 < f2);
00026 test(f1 <= f2);
00027 test(f1 != f2);
00028 test(f2 > f1);
00029 test(f2 >= f1);
00030 test(f2 != f1);
00031
00032 test(f2 + f4 == f3 - f1);
00033 test(f2 * f3 == f3);
00034 test(f3 / f2 == f3);
00035 f4 += f2;
00036 test(f3 == f4);
00037 f4 -= f1;
00038 test(f3 == f4);
00039 f4 *= f2;
00040 test(f3 == f4);
00041 f4 /= f2;
00042 test(f3 == f4);
00043
00044 test(-f4 == f1 - f4);
00045 test(-(-f4) == f4);
00046 --f4;
00047 test(f4 + 1 == f3);
00048 f4--;
00049 test(f4 + 2 == f3);
00050 ++f4;
00051 test(f4 + 1 == f3);
00052 f4++;
00053 test(f4 == f3);
00054 ++f3;
00055 test(++f4 == f3);
00056 test(f4-- == f3);
00057 test(f4++ == --f3);
00058 test(--f4 == f3);
00059
00060 test(f4 / f3 == f2);
00061 test(f4 - f3 == f1);
00062
00063 test(f4.as_string() == "3.1416");
00064 test(f4.integer() == 3);
00065 f4 += fixed(0,4584);
00066 test(f4 == 3.6);
00067 test(f4.integer() == 3);
00068 test(f4.round() == 4);
00069
00070 test(f3.integer() == 3);
00071 test((-f3).integer() == -3);
00072 test(f3.fraction() == 1416);
00073 test((-f3).fraction() == 1416);
00074
00075 test(fixed(7,4999).round() == 7);
00076 test(fixed(7,5000).round() == 8);
00077 test(fixed(7,5001).round() == 8);
00078 test(fixed(7,4999).round() == 7);
00079 test(fixed(8,5000).round() == 8);
00080 test(fixed(8,5001).round() == 9);
00081
00082 test(fixed(123,2345500) == fixed(123,2346));
00083 test(fixed(123,2345501) == fixed(123,2346));
00084 test(fixed(123,2345499) == fixed(123,2345));
00085 test(fixed(123,2346500) == fixed(123,2346));
00086 test(fixed(123,2346501) == fixed(123,2347));
00087 test(fixed(123,2346499) == fixed(123,2346));
00088 test(fixed(123,2346400) == fixed(123,2346));
00089 test(fixed(123,2346600) == fixed(123,2347));
00090
00091 test(fixed(-7,4999).round() == -7);
00092 test(fixed(-7,5000).round() == -8);
00093 test(fixed(-7,5001).round() == -8);
00094 test(fixed(-7,4999).round() == -7);
00095 test(fixed(-8,5000).round() == -8);
00096 test(fixed(-8,5001).round() == -9);
00097
00098 test(fixed(-3.14159265).value() == -31416);
00099 test(fixed(123,456789).value() == 1234568);
00100 test(fixed(123,4).value() == 1230004);
00101 test(fixed(-10,1111).value() == -101111);
00102
00103 std::ostringstream out;
00104 out << f3 << " 3.14159265 " << fixed(-10,12) << " 3 421.4 end";
00105 fixed f5;
00106 std::istringstream in(out.str());
00107 test(in >> f5);
00108 test(f5 == f3);
00109 test(in >> f5);
00110 test(f5 == f3);
00111 test(in >> f5);
00112 test(f5.value() == -100012);
00113 test(in >> f5);
00114 test(f5.value() == 30000);
00115 test(in >> f5);
00116 test(f5.value() == 4214000);
00117 test(not (in >> f5));
00118
00119 test(fixed(31.4159265) == fixed(31, 4159));
00120 test(fixed(31.41595) == fixed(31, 4160));
00121
00122 bool okay(false);
00123 try {
00124 fixed f6(1, -1);
00125 } catch (std::invalid_argument const& ex) {
00126 okay = true;
00127 } catch (...) {
00128 }
00129 test(okay);
00130 }