wibble 0.1.28
|
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: