test_fixed.cpp

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 }

Generated on Sun Nov 30 09:53:22 2008 for Exploring C++ - Final Forms of Key Examples by  doxygen 1.5.3