• Main Page
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

grcal.test.h

Go to the documentation of this file.
00001 /* -*- C++ -*- (c) 2007 Petr Rockai <me@mornfall.net>
00002                (c) 2007 Enrico Zini <enrico@enricozini.org> */
00003 
00004 #include <wibble/test.h>
00005 #include <wibble/grcal/grcal.h>
00006 
00007 namespace {
00008 
00009 using namespace std;
00010 using namespace wibble;
00011 using namespace wibble::grcal;
00012 
00013 #define assert_dt_eq(x, ...) assert_dt_eq_fn( LOCATION( #x " == " #__VA_ARGS__ ), x, __VA_ARGS__)
00014 void assert_dt_eq_fn( Location l, const int* val, int ye, int mo=-1, int da=-1, int ho=-1, int mi=-1, int se=-1 )
00015 {
00016     int cmp[6] = { ye, mo, da, ho, mi, se };
00017     std::string a = date::tostring(val);
00018     std::string b = date::tostring(cmp);
00019     
00020     if ( !( a == b ) ) {
00021         AssertFailed f( l );
00022         f << " got ["
00023           << a << "] != [" << b
00024           << "] instead";
00025     }
00026 }
00027 
00028 // This is copied from grcal.cpp, which is dangerous as I may forget to keep
00029 // in sync; however, it's not a function I'd like to export, but it's a
00030 // function I'd like to test
00031 static inline void normalN(int& lo, int& hi, int N)
00032 {
00033     if (lo < 0)
00034     {
00035         int m = (-lo)/N;
00036         if (lo % N) ++m;
00037         hi -= m;
00038         lo = (lo + (m*N)) % N;
00039     } else {
00040         hi += lo / N;
00041         lo = lo % N;
00042     }
00043 }
00044 
00045 #define assert_nn_eq(x, y, N, x1, y1) assert_nn_eq_fn( LOCATION( #x ", " #y " mod " #N " == " #x1 ", " #y1 ), x, y, N, x1, y1)
00046 void assert_nn_eq_fn( Location l, int x, int y, int N, int x1, int y1)
00047 {
00048     int vx = x;
00049     int vy = y;
00050     normalN(vx, vy, N);
00051     
00052         if (vx == x1 && vy == y1)
00053             return;
00054 
00055         AssertFailed f( l );
00056          f << " got ["
00057            << vx << ", " << vy << "] != ["
00058            << x1 << ", " << y1 << "] instead";
00059 }
00060 
00061 
00062 struct TestGrcalDate {
00063     void fill(int* dst, int ye, int mo=-1, int da=-1, int ho=-1, int mi=-1, int se=-1)
00064     {
00065         dst[0] = ye;
00066         dst[1] = mo;
00067         dst[2] = da;
00068         dst[3] = ho;
00069         dst[4] = mi;
00070         dst[5] = se;
00071     }
00072 
00073     Test normaln()
00074     {
00075         assert_nn_eq(0, 0, 60, 0, 0);
00076         assert_nn_eq(-1, 0, 60, 59, -1);
00077         assert_nn_eq(60, 60, 60, 0, 61);
00078         assert_nn_eq(60, 0, 60, 0, 1);
00079         assert_nn_eq(0, 60, 60, 0, 60);
00080         assert_nn_eq(-3600, 0, 60, 0, -60);
00081         assert_nn_eq(-61, 1, 60, 59, -1);
00082         assert_nn_eq(-0, 0, 60, 0, 0);
00083     }
00084 
00085     Test daysinmonth()
00086     {
00087         // Trenta giorni ha novembre
00088         assert_eq(date::daysinmonth(2008, 11), 30);
00089         // Con april, giugno e settembre
00090         assert_eq(date::daysinmonth(2008, 4), 30);
00091         assert_eq(date::daysinmonth(2008, 6), 30);
00092         assert_eq(date::daysinmonth(2008, 9), 30);
00093         // Di ventotto ce n'รจ uno
00094         assert_eq(date::daysinmonth(2001, 2), 28);
00095         assert_eq(date::daysinmonth(2004, 2), 29);
00096         assert_eq(date::daysinmonth(2100, 2), 28);
00097         assert_eq(date::daysinmonth(2000, 2), 29);
00098         // Tutti gli altri ne han trentuno
00099         assert_eq(date::daysinmonth(2008, 1), 31);
00100         assert_eq(date::daysinmonth(2008, 3), 31);
00101         assert_eq(date::daysinmonth(2008, 5), 31);
00102         assert_eq(date::daysinmonth(2008, 7), 31);
00103         assert_eq(date::daysinmonth(2008, 8), 31);
00104         assert_eq(date::daysinmonth(2008, 10), 31);
00105         assert_eq(date::daysinmonth(2008, 12), 31);
00106     }
00107 
00108     Test daysinyear()
00109     {
00110         assert_eq(date::daysinyear(2001), 365);
00111         assert_eq(date::daysinyear(2004), 366);
00112         assert_eq(date::daysinyear(2100), 365);
00113         assert_eq(date::daysinyear(2000), 366);
00114     }
00115 
00116     Test easter()
00117     {
00118         int month, day;
00119         date::easter(2008, &month, &day);
00120         assert_eq(month, 3);
00121         assert_eq(day, 23);
00122     }
00123 
00124     Test tostring()
00125     {
00126         int val[6];
00127         fill(val, 2008);
00128         assert_eq(date::tostring(val), "2008");
00129         fill(val, 2008, 3);
00130         assert_eq(date::tostring(val), "2008-03");
00131         fill(val, 2008, 3, 31);
00132         assert_eq(date::tostring(val), "2008-03-31");
00133         fill(val, 2008, 3, 31, 3);
00134         assert_eq(date::tostring(val), "2008-03-31 03");
00135         fill(val, 2008, 3, 31, 3, 21);
00136         assert_eq(date::tostring(val), "2008-03-31 03:21");
00137         fill(val, 2008, 3, 31, 3, 21, 0);
00138         assert_eq(date::tostring(val), "2008-03-31 03:21:00");
00139     }
00140 
00141     Test lowerbound()
00142     {
00143         int src[6];
00144         int dst[6];
00145         fill(src, 2008);
00146         date::lowerbound(src, dst);
00147         assert_dt_eq(dst, 2008, 1, 1, 0, 0, 0);
00148 
00149         date::lowerbound(src);
00150         assert_dt_eq(src, 2008, 1, 1, 0, 0, 0);
00151     }
00152 
00153     Test normalise()
00154     {
00155         int val[6];
00156         fill(val, 2008, 1, 1, 0, 0, 0);
00157         date::normalise(val);
00158         assert_dt_eq(val, 2008, 1, 1, 0, 0, 0);
00159 
00160         fill(val, 2008, 1, 1, 0, 0, 0);
00161         val[1] -= 12;
00162         date::normalise(val);
00163         assert_dt_eq(val, 2007, 1, 1, 0, 0, 0);
00164 
00165         fill(val, 2008, 3, 1, 0, 0, 0);
00166         val[5] -= 1;
00167         date::normalise(val);
00168         assert_dt_eq(val, 2008, 2, 29, 23, 59, 59);
00169 
00170         fill(val, 2008, 2, 28, 23, 0, 0);
00171         val[5] += 3600;
00172         date::normalise(val);
00173         assert_dt_eq(val, 2008, 2, 29, 0, 0, 0);
00174 
00175         fill(val, 2008, 2, 28, 23, 0, 0);
00176         val[5] += 3600;
00177         val[0] += 1;
00178         date::normalise(val);
00179         assert_dt_eq(val, 2009, 3, 1, 0, 0, 0);
00180 
00181         fill(val, 2008, 2, 28, 23, 0, 0);
00182         val[5] += 3600;
00183         val[1] += 12;
00184         date::normalise(val);
00185         assert_dt_eq(val, 2009, 3, 1, 0, 0, 0);
00186     }
00187 
00188     Test upperbound()
00189     {
00190         int src[6];
00191         int dst[6];
00192         fill(src, 2008);
00193         date::upperbound(src, dst);
00194         assert_dt_eq(dst, 2008, 12, 31, 23, 59, 59);
00195 
00196         date::upperbound(src);
00197         assert_dt_eq(src, 2008, 12, 31, 23, 59, 59);
00198 
00199         fill(src, 2008, 2);
00200         date::upperbound(src);
00201         assert_dt_eq(src, 2008, 2, 29, 23, 59, 59);
00202     }
00203 
00204     Test duration()
00205     {
00206         int val1[6];
00207         int val2[6];
00208 
00209         fill(val1, 2007, 12, 25);
00210         fill(val2, 2007, 12, 26);
00211         assert_eq(date::duration(val1, val2), 3600*24);
00212 
00213 
00214         fill(val1, 2007, 1, 2, 3, 4, 5);
00215         assert_eq(date::secondsfrom(2006, val1), 3600*24*365+3600*24+3*3600+4*60+5);
00216 
00217         fill(val2, 2007, 1, 1, 0, 0, 0);
00218         assert_eq(date::secondsfrom(2006, val2), 3600*24*365);
00219 
00220         fill(val2, 2006, 12, 31, 23, 59, 59);
00221         assert_eq(date::secondsfrom(2006, val2), 3600*24*365-1);
00222 
00223         fill(val1, 2006, 12, 31, 23, 59, 59);
00224         fill(val2, 2007, 1, 2, 3, 4, 5);
00225         assert_eq(date::duration(val1, val2), 1+3600*24+3*3600+4*60+5);
00226     }
00227 };
00228 
00229 struct TestGrcalTime {
00230     void fill(int* dst, int ho=-1, int mi=-1, int se=-1)
00231     {
00232         dst[0] = ho;
00233         dst[1] = mi;
00234         dst[2] = se;
00235     }
00236 
00237     Test tostring()
00238     {
00239         int val[3];
00240         fill(val);
00241         assert_eq(dtime::tostring(val), "");
00242         fill(val, 9);
00243         assert_eq(dtime::tostring(val), "09");
00244         fill(val, 10, 9);
00245         assert_eq(dtime::tostring(val), "10:09");
00246         fill(val, 11, 10, 9);
00247         assert_eq(dtime::tostring(val), "11:10:09");
00248     }
00249     Test tostring_sec()
00250     {
00251         assert_eq(dtime::tostring(3600), "01:00:00");
00252         assert_eq(dtime::tostring(3661), "01:01:01");
00253     }
00254 };
00255 
00256 }
00257 
00258 // vim:set ts=4 sw=4:

Generated on Sun Feb 17 2013 02:35:43 for wibble by  doxygen 1.7.1