00001 #include <cmath> 00002 #include <iostream> 00003 #include <istream> 00004 #include <ostream> 00005 #include <sstream> 00006 #include <stdexcept> 00007 00008 #include "test.hpp" 00009 #include "fixed.hpp" 00010 00011 void test_fixed() 00012 { 00013 typedef fixed<int, 4> fixed; 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(std::abs(f4.as_double() - 3.6) < 0.0000001); 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 }