00001
00002
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
00029
00030
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
00088 assert_eq(date::daysinmonth(2008, 11), 30);
00089
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
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
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