QOF 0.7.5
|
00001 /*************************************************************************** 00002 * test-date.c 00003 * Rewritten from scratch for QOF 0.7.0 00004 * 00005 * Copyright (C) 2002, 2004, 2005, 2006 00006 * Free Software Foundation, Inc. 00007 * 00008 ****************************************************************************/ 00009 /* 00010 * This program is free software; you can redistribute it and/or modify 00011 * it under the terms of the GNU General Public License as published by 00012 * the Free Software Foundation; either version 2 of the License, or 00013 * (at your option) any later version. 00014 * 00015 * This program is distributed in the hope that it will be useful, 00016 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00017 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00018 * GNU General Public License for more details. 00019 * 00020 * You should have received a copy of the GNU General Public License 00021 * along with this program; if not, write to the Free Software 00022 * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301, USA 00023 */ 00024 00025 #include "config.h" 00026 #include <stdio.h> 00027 #include <ctype.h> 00028 #include <glib.h> 00029 #include <time.h> 00030 #include "qof.h" 00031 #include "test-stuff.h" 00032 00033 static gboolean test_data_is_init = FALSE; 00034 static GList *test_data = NULL; 00035 static QofLogModule log_module = QOF_MOD_DATE; 00036 00037 typedef struct 00038 { 00039 /* time value of the date below */ 00040 QofTime *time; 00041 /* date value of the above time. */ 00042 QofDate *date; 00043 /* GList of the date in each QofDateFormat */ 00044 GList *string_list; 00045 /* unique ID for this date for error reports. */ 00046 const gchar *id; 00047 }QTestDate; 00048 00049 static void 00050 check_date_cycles (gpointer data, 00051 gpointer user_data __attribute__ ((unused))) 00052 { 00053 QofDateFormat df; 00054 gchar *str, *cmp; 00055 QTestDate *d; 00056 gint i; 00057 00058 d = (QTestDate*)data; 00059 df = qof_date_format_get_current (); 00060 /* test qof_date_to_qtime and qof_date_from_qtime */ 00061 { 00062 do_test ((0 == qof_time_cmp (qof_date_to_qtime (d->date), 00063 d->time)), d->id); 00064 do_test ((0 == qof_date_compare (qof_date_from_qtime (d->time), 00065 d->date)), d->id); 00066 } 00067 /* don't test locale-sensitive formats, yet. */ 00068 for (i = 1; i <= 6; i++) 00069 { 00070 str = qof_date_print (d->date, i); 00071 cmp = (gchar*)g_list_nth_data (d->string_list, (i - 1)); 00072 if (0 != safe_strcasecmp (str, cmp)) 00073 DEBUG (" str=%s cmp=%s", str, cmp); 00074 do_test ((0 == safe_strcasecmp (str, cmp)), d->id); 00075 /* now test qofstrptime */ 00076 { 00077 gint result; 00078 QofDate *h, *j; 00079 const gchar * t; 00080 struct tm base; 00081 00082 base.tm_year = base.tm_mday = base.tm_mon = 0; 00083 base.tm_min = base.tm_hour = base.tm_gmtoff = 0; 00084 base.tm_sec = base.tm_isdst = 0; 00085 result = 0; 00087 if ((d->date->qd_year > 0) && 00088 (d->date->qd_year < 9999)) 00089 { 00090 h = qof_date_parse (cmp, i); 00091 do_test ((h != NULL), "no date could be parsed"); 00092 if (!h) 00093 PERR (" h failed for str=%s, " 00094 "cmp=%s, %d\n", str, cmp, i); 00095 t = qof_date_format_get_format (i); 00096 strptime (cmp, t, &base); 00097 j = qof_date_from_struct_tm (&base); 00098 do_test ((j != NULL), "no value from struct tm"); 00099 if (h) 00100 { 00101 j->qd_nanosecs = h->qd_nanosecs; 00102 result = qof_date_compare (h, j); 00103 do_test ((0 == qof_date_compare (h, j)), 00104 "compare with strptime"); 00105 } 00106 if (h) 00107 qof_date_free (h); 00108 } 00109 } 00110 } 00111 qof_date_format_set_current (df); 00112 } 00113 00114 static void 00115 test_date_init (void) 00116 { 00117 test_data_is_init = TRUE; 00118 test_data = NULL; 00119 /* A selection of current, old and future dates - all in UTC only. */ 00120 { 00121 QTestDate *td = g_new0 (QTestDate, 1); 00122 td->time = qof_time_new (); 00123 qof_time_set_secs (td->time, 1147621550); 00124 qof_time_set_nanosecs (td->time, G_GINT64_CONSTANT(1000)); 00125 td->date = qof_date_new (); 00126 td->date->qd_year = 2006; 00127 td->date->qd_mon = 5; 00128 td->date->qd_mday = 14; 00129 td->date->qd_hour = 15; 00130 td->date->qd_min = 45; 00131 td->date->qd_sec = G_GINT64_CONSTANT(50); 00132 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00133 qof_date_valid (td->date); 00134 td->string_list = NULL; 00135 td->string_list = g_list_append (td->string_list, "05/14/2006"); 00136 td->string_list = g_list_append (td->string_list, "14/05/2006"); 00137 td->string_list = g_list_append (td->string_list, "14.05.2006"); 00138 td->string_list = g_list_append (td->string_list, "2006-05-14"); 00139 td->string_list = g_list_append (td->string_list, "2006-05-14T15:45:50Z"); 00140 td->string_list = g_list_append (td->string_list, 00141 "2006-05-14 15:45:50.000001000 +0000"); 00142 td->id = "a current time"; 00143 test_data = g_list_prepend (test_data, td); 00144 } 00145 { 00146 QTestDate *td = g_new0 (QTestDate, 1); 00147 td->time = qof_time_new (); 00148 qof_time_set_secs (td->time, 1147132800); 00149 qof_time_set_nanosecs (td->time, 2); 00150 td->date = qof_date_new (); 00151 td->date->qd_year = 2006; 00152 td->date->qd_mon = 5; 00153 td->date->qd_mday = 9; 00154 td->date->qd_hour = 0; 00155 td->date->qd_min = 0; 00156 td->date->qd_sec = G_GINT64_CONSTANT(0); 00157 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00158 qof_date_valid (td->date); 00159 td->string_list = NULL; 00160 td->string_list = g_list_prepend (td->string_list, "05/09/2006"); 00161 td->string_list = g_list_prepend (td->string_list, "09/05/2006"); 00162 td->string_list = g_list_prepend (td->string_list, "09.05.2006"); 00163 td->string_list = g_list_prepend (td->string_list, "2006-05-09"); 00164 td->string_list = g_list_prepend (td->string_list, "2006-05-09T00:00:00Z"); 00165 td->string_list = g_list_prepend (td->string_list, 00166 "2006-05-09 00:00:00.000000002 +0000"); 00167 td->string_list = g_list_reverse (td->string_list); 00168 td->id = "a recent time"; 00169 test_data = g_list_prepend (test_data, td); 00170 } 00171 { 00172 QTestDate *td = g_new0 (QTestDate, 1); 00173 td->time = qof_time_new (); 00174 qof_time_set_secs (td->time, 1147186144); 00175 qof_time_set_nanosecs (td->time, 100); 00176 td->date = qof_date_new (); 00177 td->date->qd_year = 2006; 00178 td->date->qd_mon = 5; 00179 td->date->qd_mday = 9; 00180 td->date->qd_hour = 14; 00181 td->date->qd_min = 49; 00182 td->date->qd_sec = G_GINT64_CONSTANT(4); 00183 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00184 qof_date_valid (td->date); 00185 td->string_list = NULL; 00186 td->string_list = g_list_prepend (td->string_list, "05/09/2006"); 00187 td->string_list = g_list_prepend (td->string_list, "09/05/2006"); 00188 td->string_list = g_list_prepend (td->string_list, "09.05.2006"); 00189 td->string_list = g_list_prepend (td->string_list, "2006-05-09"); 00190 td->string_list = g_list_prepend (td->string_list, "2006-05-09T14:49:04Z"); 00191 td->string_list = g_list_prepend (td->string_list, 00192 "2006-05-09 14:49:04.000000100 +0000"); 00193 td->string_list = g_list_reverse (td->string_list); 00194 td->id = "second recent time"; 00195 test_data = g_list_prepend (test_data, td); 00196 } 00197 { 00198 QTestDate *td = g_new0 (QTestDate, 1); 00199 td->time = qof_time_new (); 00200 qof_time_set_secs (td->time, 63039600); 00201 qof_time_set_nanosecs (td->time, 4); 00202 td->date = qof_date_new (); 00203 td->date->qd_year = 1971; 00204 td->date->qd_mon = 12; 00205 td->date->qd_mday = 31; 00206 td->date->qd_hour = 15; 00207 td->date->qd_min = 0; 00208 td->date->qd_sec = G_GINT64_CONSTANT(0); 00209 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00210 qof_date_valid (td->date); 00211 td->string_list = NULL; 00212 td->string_list = g_list_prepend (td->string_list, "12/31/1971"); 00213 td->string_list = g_list_prepend (td->string_list, "31/12/1971"); 00214 td->string_list = g_list_prepend (td->string_list, "31.12.1971"); 00215 td->string_list = g_list_prepend (td->string_list, "1971-12-31"); 00216 td->string_list = g_list_prepend (td->string_list, "1971-12-31T15:00:00Z"); 00217 td->string_list = g_list_prepend (td->string_list, 00218 "1971-12-31 15:00:00.000000004 +0000"); 00219 td->string_list = g_list_reverse (td->string_list); 00220 td->id = "New Year's Eve 1971"; 00221 test_data = g_list_prepend (test_data, td); 00222 } 00223 { 00224 QTestDate *td = g_new0 (QTestDate, 1); 00225 td->time = qof_time_new (); 00226 qof_time_set_secs (td->time, 315532800); 00227 qof_time_set_nanosecs (td->time, 123456789); 00228 td->date = qof_date_new (); 00229 td->date->qd_year = 1980; 00230 td->date->qd_mon = 1; 00231 td->date->qd_mday = 1; 00232 td->date->qd_hour = 0; 00233 td->date->qd_min = 0; 00234 td->date->qd_sec = G_GINT64_CONSTANT(0); 00235 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00236 qof_date_valid (td->date); 00237 td->string_list = NULL; 00238 td->string_list = g_list_prepend (td->string_list, "01/01/1980"); 00239 td->string_list = g_list_prepend (td->string_list, "01/01/1980"); 00240 td->string_list = g_list_prepend (td->string_list, "01.01.1980"); 00241 td->string_list = g_list_prepend (td->string_list, "1980-01-01"); 00242 td->string_list = g_list_prepend (td->string_list, "1980-01-01T00:00:00Z"); 00243 td->string_list = g_list_prepend (td->string_list, 00244 "1980-01-01 00:00:00.123456789 +0000"); 00245 td->string_list = g_list_reverse (td->string_list); 00246 td->id = "New Year's Day 1980"; 00247 test_data = g_list_prepend (test_data, td); 00248 } 00249 { 00250 QTestDate *td = g_new0 (QTestDate, 1); 00251 td->time = qof_time_new (); 00252 qof_time_set_secs (td->time, 946684799); 00253 qof_time_set_nanosecs (td->time, 987654321); 00254 td->date = qof_date_new (); 00255 td->date->qd_year = 1999; 00256 td->date->qd_mon = 12; 00257 td->date->qd_mday = 31; 00258 td->date->qd_hour = 23; 00259 td->date->qd_min = 59; 00260 td->date->qd_sec = G_GINT64_CONSTANT(59); 00261 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00262 qof_date_valid (td->date); 00263 td->string_list = NULL; 00264 td->string_list = g_list_prepend (td->string_list, "12/31/1999"); 00265 td->string_list = g_list_prepend (td->string_list, "31/12/1999"); 00266 td->string_list = g_list_prepend (td->string_list, "31.12.1999"); 00267 td->string_list = g_list_prepend (td->string_list, "1999-12-31"); 00268 td->string_list = g_list_prepend (td->string_list, "1999-12-31T23:59:59Z"); 00269 td->string_list = g_list_prepend (td->string_list, 00270 "1999-12-31 23:59:59.987654321 +0000"); 00271 td->string_list = g_list_reverse (td->string_list); 00272 td->id = "Millenium Eve"; 00273 test_data = g_list_prepend (test_data, td); 00274 } 00275 { 00276 QTestDate *td = g_new0 (QTestDate, 1); 00277 td->time = qof_time_new (); 00278 qof_time_set_secs (td->time, 699378323); 00279 qof_time_set_nanosecs (td->time, 90000); 00280 td->date = qof_date_new (); 00281 td->date->qd_year = 1992; 00282 td->date->qd_mon = 2; 00283 td->date->qd_mday = 29; 00284 td->date->qd_hour = 15; 00285 td->date->qd_min = 45; 00286 td->date->qd_sec = G_GINT64_CONSTANT(23); 00287 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00288 qof_date_valid (td->date); 00289 td->string_list = NULL; 00290 td->string_list = g_list_prepend (td->string_list, "02/29/1992"); 00291 td->string_list = g_list_prepend (td->string_list, "29/02/1992"); 00292 td->string_list = g_list_prepend (td->string_list, "29.02.1992"); 00293 td->string_list = g_list_prepend (td->string_list, "1992-02-29"); 00294 td->string_list = g_list_prepend (td->string_list, "1992-02-29T15:45:23Z"); 00295 td->string_list = g_list_prepend (td->string_list, 00296 "1992-02-29 15:45:23.000090000 +0000"); 00297 td->string_list = g_list_reverse (td->string_list); 00298 td->id = "29th February 1992"; 00299 test_data = g_list_prepend (test_data, td); 00300 } 00301 { 00302 00303 QTestDate *td = g_new0 (QTestDate, 1); 00304 td->time = qof_time_new (); 00305 qof_time_set_secs (td->time, -1); 00306 qof_time_set_nanosecs (td->time, 9); 00307 td->date = qof_date_new (); 00308 td->date->qd_year = 1969; 00309 td->date->qd_mon = 12; 00310 td->date->qd_mday = 31; 00311 td->date->qd_hour = 23; 00312 td->date->qd_min = 59; 00313 td->date->qd_sec = G_GINT64_CONSTANT(59); 00314 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00315 qof_date_valid (td->date); 00316 td->string_list = NULL; 00317 td->string_list = g_list_prepend (td->string_list, "12/31/1969"); 00318 td->string_list = g_list_prepend (td->string_list, "31/12/1969"); 00319 td->string_list = g_list_prepend (td->string_list, "31.12.1969"); 00320 td->string_list = g_list_prepend (td->string_list, "1969-12-31"); 00321 td->string_list = g_list_prepend (td->string_list, "1969-12-31T23:59:59Z"); 00322 td->string_list = g_list_prepend (td->string_list, 00323 "1969-12-31 23:59:59.000000009 +0000"); 00324 td->string_list = g_list_reverse (td->string_list); 00325 td->id = "epoch eve"; 00326 test_data = g_list_prepend (test_data, td); 00327 } 00328 { 00329 QTestDate *td = g_new0 (QTestDate, 1); 00330 td->time = qof_time_new (); 00331 qof_time_set_secs (td->time, -192776400); 00332 qof_time_set_nanosecs (td->time, 818818818); 00333 td->date = qof_date_new (); 00334 td->date->qd_year = 1963; 00335 td->date->qd_mon = 11; 00336 td->date->qd_mday = 22; 00337 td->date->qd_hour = 19; 00338 td->date->qd_min = 0; 00339 td->date->qd_sec = G_GINT64_CONSTANT(0); 00340 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00341 qof_date_valid (td->date); 00342 td->string_list = NULL; 00343 td->string_list = g_list_prepend (td->string_list, "11/22/1963"); 00344 td->string_list = g_list_prepend (td->string_list, "22/11/1963"); 00345 td->string_list = g_list_prepend (td->string_list, "22.11.1963"); 00346 td->string_list = g_list_prepend (td->string_list, "1963-11-22"); 00347 td->string_list = g_list_prepend (td->string_list, "1963-11-22T19:00:00Z"); 00348 td->string_list = g_list_prepend (td->string_list, 00349 "1963-11-22 19:00:00.818818818 +0000"); 00350 td->string_list = g_list_reverse (td->string_list); 00351 td->id = "approx JFK, 1963"; 00352 test_data = g_list_prepend (test_data, td); 00353 } 00354 { 00355 QTestDate *td = g_new0 (QTestDate, 1); 00356 td->time = qof_time_new (); 00357 qof_time_set_secs (td->time, -767311080); 00358 qof_time_set_nanosecs (td->time, 0); 00359 td->date = qof_date_new (); 00360 td->date->qd_year = 1945; 00361 td->date->qd_mon = 9; 00362 td->date->qd_mday = 8; 00363 td->date->qd_hour = 2; 00364 td->date->qd_min = 2; 00365 td->date->qd_sec = G_GINT64_CONSTANT(0); 00366 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00367 qof_date_valid (td->date); 00368 td->string_list = NULL; 00369 td->string_list = g_list_prepend (td->string_list, "09/08/1945"); 00370 td->string_list = g_list_prepend (td->string_list, "08/09/1945"); 00371 td->string_list = g_list_prepend (td->string_list, "08.09.1945"); 00372 td->string_list = g_list_prepend (td->string_list, "1945-09-08"); 00373 td->string_list = g_list_prepend (td->string_list, "1945-09-08T02:02:00Z"); 00374 td->string_list = g_list_prepend (td->string_list, 00375 "1945-09-08 02:02:00.000000000 +0000"); 00376 td->string_list = g_list_reverse (td->string_list); 00377 td->id = "Nagasaki, 1945"; 00378 test_data = g_list_prepend (test_data, td); 00379 } 00380 { 00381 QTestDate *td = g_new0 (QTestDate, 1); 00382 td->time = qof_time_new (); 00383 qof_time_set_secs (td->time, -1613826000); 00384 qof_time_set_nanosecs (td->time, 0); 00385 td->date = qof_date_new (); 00386 td->date->qd_year = 1918; 00387 td->date->qd_mon = 11; 00388 td->date->qd_mday = 11; 00389 td->date->qd_hour = 11; 00390 td->date->qd_min = 0; 00391 td->date->qd_sec = G_GINT64_CONSTANT(0); 00392 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00393 qof_date_valid (td->date); 00394 td->string_list = NULL; 00395 td->string_list = g_list_prepend (td->string_list, "11/11/1918"); 00396 td->string_list = g_list_prepend (td->string_list, "11/11/1918"); 00397 td->string_list = g_list_prepend (td->string_list, "11.11.1918"); 00398 td->string_list = g_list_prepend (td->string_list, "1918-11-11"); 00399 td->string_list = g_list_prepend (td->string_list, "1918-11-11T11:00:00Z"); 00400 td->string_list = g_list_prepend (td->string_list, 00401 "1918-11-11 11:00:00.000000000 +0000"); 00402 td->string_list = g_list_reverse (td->string_list); 00403 td->id = "Armistice 1918"; 00404 test_data = g_list_prepend (test_data, td); 00405 } 00406 { 00407 QTestDate *td = g_new0 (QTestDate, 1); 00408 td->time = qof_time_new (); 00409 qof_time_set_secs (td->time, 00410 G_GINT64_CONSTANT(-2208988801)); 00411 qof_time_set_nanosecs (td->time, 0); 00412 td->date = qof_date_new (); 00413 td->date->qd_year = 1899; 00414 td->date->qd_mon = 12; 00415 td->date->qd_mday = 31; 00416 td->date->qd_hour = 23; 00417 td->date->qd_min = 59; 00418 td->date->qd_sec = G_GINT64_CONSTANT(59); 00419 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00420 qof_date_valid (td->date); 00421 td->string_list = NULL; 00422 td->string_list = g_list_prepend (td->string_list, "12/31/1899"); 00423 td->string_list = g_list_prepend (td->string_list, "31/12/1899"); 00424 td->string_list = g_list_prepend (td->string_list, "31.12.1899"); 00425 td->string_list = g_list_prepend (td->string_list, "1899-12-31"); 00426 td->string_list = g_list_prepend (td->string_list, "1899-12-31T23:59:59Z"); 00427 td->string_list = g_list_prepend (td->string_list, 00428 "1899-12-31 23:59:59.000000000 +0000"); 00429 td->string_list = g_list_reverse (td->string_list); 00430 td->id = "19th century Millenium Eve"; 00431 test_data = g_list_prepend (test_data, td); 00432 } 00433 { 00434 QTestDate *td = g_new0 (QTestDate, 1); 00435 td->time = qof_time_new (); 00436 qof_time_set_secs (td->time, 00437 G_GINT64_CONSTANT(-13311993599)); 00438 qof_time_set_nanosecs (td->time, 0); 00439 td->date = qof_date_new (); 00440 td->date->qd_year = 1548; 00441 td->date->qd_mon = 2; 00442 td->date->qd_mday = 29; 00443 td->date->qd_hour = 0; 00444 td->date->qd_min = 0; 00445 td->date->qd_sec = G_GINT64_CONSTANT(1); 00446 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00447 qof_date_valid (td->date); 00448 td->string_list = NULL; 00449 td->string_list = g_list_prepend (td->string_list, "02/29/1548"); 00450 td->string_list = g_list_prepend (td->string_list, "29/02/1548"); 00451 td->string_list = g_list_prepend (td->string_list, "29.02.1548"); 00452 td->string_list = g_list_prepend (td->string_list, "1548-02-29"); 00453 td->string_list = g_list_prepend (td->string_list, "1548-02-29T00:00:01Z"); 00454 td->string_list = g_list_prepend (td->string_list, 00455 "1548-02-29 00:00:01.000000000 +0000"); 00456 td->string_list = g_list_reverse (td->string_list); 00457 td->id = "16th century leap day"; 00458 test_data = g_list_prepend (test_data, td); 00459 } 00460 { 00461 QTestDate *td = g_new0 (QTestDate, 1); 00462 td->time = qof_time_new (); 00463 qof_time_set_secs (td->time, G_GINT64_CONSTANT(-28502726400)); 00464 qof_time_set_nanosecs (td->time, 0); 00465 td->date = qof_date_new (); 00466 td->date->qd_year = 1066; 00467 td->date->qd_mon = 10; 00468 td->date->qd_mday = 14; 00469 td->date->qd_hour = 8; 00470 td->date->qd_min = 0; 00471 td->date->qd_sec = G_GINT64_CONSTANT(0); 00472 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00473 qof_date_valid (td->date); 00474 td->string_list = NULL; 00475 td->string_list = g_list_prepend (td->string_list, "10/14/1066"); 00476 td->string_list = g_list_prepend (td->string_list, "14/10/1066"); 00477 td->string_list = g_list_prepend (td->string_list, "14.10.1066"); 00478 td->string_list = g_list_prepend (td->string_list, "1066-10-14"); 00479 td->string_list = g_list_prepend (td->string_list, "1066-10-14T08:00:00Z"); 00480 td->string_list = g_list_prepend (td->string_list, 00481 "1066-10-14 08:00:00.000000000 +0000"); 00482 td->string_list = g_list_reverse (td->string_list); 00483 td->id = "Battle of Hastings, 1066"; 00484 test_data = g_list_prepend (test_data, td); 00485 } 00486 { 00487 QTestDate *td = g_new0 (QTestDate, 1); 00488 td->time = qof_time_new (); 00489 qof_time_set_secs (td->time, 00490 G_GINT64_CONSTANT(-36417340799)); 00491 qof_time_set_nanosecs (td->time, 0); 00492 td->date = qof_date_new (); 00493 td->date->qd_year = 815; 00494 td->date->qd_mon = 12; 00495 td->date->qd_mday = 25; 00496 td->date->qd_hour = 0; 00497 td->date->qd_min = 0; 00498 td->date->qd_sec = G_GINT64_CONSTANT(1); 00499 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00500 qof_date_valid (td->date); 00501 td->string_list = NULL; 00502 td->string_list = g_list_prepend (td->string_list, "12/25/0815"); 00503 td->string_list = g_list_prepend (td->string_list, "25/12/0815"); 00504 td->string_list = g_list_prepend (td->string_list, "25.12.0815"); 00505 td->string_list = g_list_prepend (td->string_list, "0815-12-25"); 00506 td->string_list = g_list_prepend (td->string_list, "0815-12-25T00:00:01Z"); 00507 td->string_list = g_list_prepend (td->string_list, 00508 "0815-12-25 00:00:01.000000000 +0000"); 00509 td->string_list = g_list_reverse (td->string_list); 00510 td->id = "9th century Christmas Day"; 00511 test_data = g_list_prepend (test_data, td); 00512 } 00513 { 00514 QTestDate *td = g_new0 (QTestDate, 1); 00515 td->time = qof_time_new (); 00516 qof_time_set_secs (td->time, G_GINT64_CONSTANT(-60798160800)); 00517 qof_time_set_nanosecs (td->time, 0); 00518 td->date = qof_date_new (); 00519 td->date->qd_year = 43; 00520 td->date->qd_mon = 5; 00521 td->date->qd_mday = 20; 00522 td->date->qd_hour = 14; 00523 td->date->qd_min = 0; 00524 td->date->qd_sec = G_GINT64_CONSTANT(0); 00525 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00526 qof_date_valid (td->date); 00527 td->string_list = NULL; 00528 td->string_list = g_list_prepend (td->string_list, "05/20/0043"); 00529 td->string_list = g_list_prepend (td->string_list, "20/05/0043"); 00530 td->string_list = g_list_prepend (td->string_list, "20.05.0043"); 00531 td->string_list = g_list_prepend (td->string_list, "0043-05-20"); 00532 td->string_list = g_list_prepend (td->string_list, "0043-05-20T14:00:00Z"); 00533 td->string_list = g_list_prepend (td->string_list, 00534 "0043-05-20 14:00:00.000000000 +0000"); 00535 td->string_list = g_list_reverse (td->string_list); 00536 td->id = "approx Roman invasion, 43AD"; 00537 test_data = g_list_prepend (test_data, td); 00538 } 00543 { 00544 QTestDate *td = g_new0 (QTestDate, 1); 00545 td->time = qof_time_new (); 00546 qof_time_set_secs (td->time, G_GINT64_CONSTANT(-62167824001)); 00547 qof_time_set_nanosecs (td->time, 0); 00548 td->date = qof_date_new (); 00549 td->date->qd_year = -1; 00550 td->date->qd_mon = 12; 00551 td->date->qd_mday = 24; 00552 td->date->qd_hour = 23; 00553 td->date->qd_min = 59; 00554 td->date->qd_sec = G_GINT64_CONSTANT(59); 00555 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00556 qof_date_valid (td->date); 00557 td->string_list = NULL; 00558 td->string_list = g_list_prepend (td->string_list, "12/24/-001"); 00559 td->string_list = g_list_prepend (td->string_list, "24/12/-001"); 00560 td->string_list = g_list_prepend (td->string_list, "24.12.-001"); 00561 td->string_list = g_list_prepend (td->string_list, "-001-12-24"); 00562 td->string_list = g_list_prepend (td->string_list, "-001-12-24T23:59:59Z"); 00563 td->string_list = g_list_prepend (td->string_list, 00564 "-001-12-24 23:59:59.000000000 +0000"); 00565 td->string_list = g_list_reverse (td->string_list); 00566 td->id = "Xmas eve, 1BC"; 00567 test_data = g_list_prepend (test_data, td); 00568 } 00569 { 00570 QTestDate *td = g_new0 (QTestDate, 1); 00571 td->time = qof_time_new (); 00572 qof_time_set_secs (td->time, 00573 G_GINT64_CONSTANT(-204110409601)); 00574 qof_time_set_nanosecs (td->time, 0); 00575 td->date = qof_date_new (); 00576 td->date->qd_year = -4499; 00577 td->date->qd_mon = 12; 00578 td->date->qd_mday = 31; 00579 td->date->qd_hour = 23; 00580 td->date->qd_min = 59; 00581 td->date->qd_sec = G_GINT64_CONSTANT(59); 00582 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00583 qof_date_valid (td->date); 00584 td->string_list = NULL; 00585 td->string_list = g_list_prepend (td->string_list, "12/31/-4499"); 00586 td->string_list = g_list_prepend (td->string_list, "31/12/-4499"); 00587 td->string_list = g_list_prepend (td->string_list, "31.12.-4499"); 00588 td->string_list = g_list_prepend (td->string_list, "-4499-12-31"); 00589 td->string_list = g_list_prepend (td->string_list, "-4499-12-31T23:59:59Z"); 00590 td->string_list = g_list_prepend (td->string_list, 00591 "-4499-12-31 23:59:59.000000000 +0000"); 00592 td->string_list = g_list_reverse (td->string_list); 00593 td->id = "far past."; 00594 test_data = g_list_prepend (test_data, td); 00595 } 00596 { 00597 QTestDate *td = g_new0 (QTestDate, 1); 00598 td->time = qof_time_new (); 00599 qof_time_set_secs (td->time, 00600 G_GINT64_CONSTANT(-2097527529601)); 00601 qof_time_set_nanosecs (td->time, 0); 00602 td->date = qof_date_new (); 00603 td->date->qd_year = -64499; 00604 td->date->qd_mon = 12; 00605 td->date->qd_mday = 31; 00606 td->date->qd_hour = 23; 00607 td->date->qd_min = 59; 00608 td->date->qd_sec = G_GINT64_CONSTANT(59); 00609 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00610 qof_date_valid (td->date); 00611 td->string_list = NULL; 00612 td->string_list = g_list_prepend (td->string_list, "12/31/-64499"); 00613 td->string_list = g_list_prepend (td->string_list, "31/12/-64499"); 00614 td->string_list = g_list_prepend (td->string_list, "31.12.-64499"); 00615 td->string_list = g_list_prepend (td->string_list, "-64499-12-31"); 00616 td->string_list = g_list_prepend (td->string_list, "-64499-12-31T23:59:59Z"); 00617 td->string_list = g_list_prepend (td->string_list, 00618 "-64499-12-31 23:59:59.000000000 +0000"); 00619 td->string_list = g_list_reverse (td->string_list); 00620 td->id = "far, far past."; 00621 test_data = g_list_prepend (test_data, td); 00622 } 00623 /* now test far future dates */ 00624 { 00625 QTestDate *td = g_new0 (QTestDate, 1); 00626 td->time = qof_time_new (); 00627 qof_time_set_secs (td->time, G_GINT64_CONSTANT(32679095666)); 00628 qof_time_set_nanosecs (td->time, 800); 00629 td->date = qof_date_new (); 00630 td->date->qd_year = 3005; 00631 td->date->qd_mon = 7; 00632 td->date->qd_mday = 24; 00633 td->date->qd_hour = 6; 00634 td->date->qd_min = 34; 00635 td->date->qd_sec = G_GINT64_CONSTANT(26); 00636 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00637 qof_date_valid (td->date); 00638 td->string_list = NULL; 00639 td->string_list = g_list_prepend (td->string_list, "07/24/3005"); 00640 td->string_list = g_list_prepend (td->string_list, "24/07/3005"); 00641 td->string_list = g_list_prepend (td->string_list, "24.07.3005"); 00642 td->string_list = g_list_prepend (td->string_list, "3005-07-24"); 00643 td->string_list = g_list_prepend (td->string_list, "3005-07-24T06:34:26Z"); 00644 td->string_list = g_list_prepend (td->string_list, 00645 "3005-07-24 06:34:26.000000800 +0000"); 00646 td->string_list = g_list_reverse (td->string_list); 00647 td->id = "24th July 3005"; 00648 test_data = g_list_prepend (test_data, td); 00649 } 00650 { 00651 QTestDate *td = g_new0 (QTestDate, 1); 00652 td->time = qof_time_new (); 00653 qof_time_set_secs (td->time, 00654 G_GINT64_CONSTANT(79839129599)); 00655 qof_time_set_nanosecs (td->time, 50000); 00656 td->date = qof_date_new (); 00657 td->date->qd_year = 4499; 00658 td->date->qd_mon = 12; 00659 td->date->qd_mday = 31; 00660 td->date->qd_hour = 23; 00661 td->date->qd_min = 59; 00662 td->date->qd_sec = G_GINT64_CONSTANT(59); 00663 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00664 qof_date_valid (td->date); 00665 td->string_list = NULL; 00666 td->string_list = g_list_prepend (td->string_list, "12/31/4499"); 00667 td->string_list = g_list_prepend (td->string_list, "31/12/4499"); 00668 td->string_list = g_list_prepend (td->string_list, "31.12.4499"); 00669 td->string_list = g_list_prepend (td->string_list, "4499-12-31"); 00670 td->string_list = g_list_prepend (td->string_list, "4499-12-31T23:59:59Z"); 00671 td->string_list = g_list_prepend (td->string_list, 00672 "4499-12-31 23:59:59.000050000 +0000"); 00673 td->string_list = g_list_reverse (td->string_list); 00674 td->id = "44th century Millenium Eve"; 00675 test_data = g_list_prepend (test_data, td); 00676 } 00677 { 00678 QTestDate *td = g_new0 (QTestDate, 1); 00679 td->time = qof_time_new (); 00680 qof_time_set_secs (td->time, 00681 G_GINT64_CONSTANT(395408649599)); 00682 qof_time_set_nanosecs (td->time, 7000000); 00683 td->date = qof_date_new (); 00684 td->date->qd_year = 14499; 00685 td->date->qd_mon = 12; 00686 td->date->qd_mday = 31; 00687 td->date->qd_hour = 23; 00688 td->date->qd_min = 59; 00689 td->date->qd_sec = G_GINT64_CONSTANT(59); 00690 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00691 qof_date_valid (td->date); 00692 td->string_list = NULL; 00693 td->string_list = g_list_prepend (td->string_list, "12/31/14499"); 00694 td->string_list = g_list_prepend (td->string_list, "31/12/14499"); 00695 td->string_list = g_list_prepend (td->string_list, "31.12.14499"); 00696 td->string_list = g_list_prepend (td->string_list, "14499-12-31"); 00697 td->string_list = g_list_prepend (td->string_list, "14499-12-31T23:59:59Z"); 00698 td->string_list = g_list_prepend (td->string_list, 00699 "14499-12-31 23:59:59.007000000 +0000"); 00700 td->string_list = g_list_reverse (td->string_list); 00701 td->id = "144th century Millenium Eve"; 00702 test_data = g_list_prepend (test_data, td); 00703 } 00704 { 00705 QTestDate *td = g_new0 (QTestDate, 1); 00706 td->time = qof_time_new (); 00707 qof_time_set_secs (td->time, 00708 G_GINT64_CONSTANT(74869815369599)); 00709 qof_time_set_nanosecs (td->time, 45321545); 00710 td->date = qof_date_new (); 00711 td->date->qd_year = 2374499; 00712 td->date->qd_mon = 12; 00713 td->date->qd_mday = 31; 00714 td->date->qd_hour = 23; 00715 td->date->qd_min = 59; 00716 td->date->qd_sec = G_GINT64_CONSTANT(59); 00717 td->date->qd_nanosecs = qof_time_get_nanosecs (td->time); 00718 qof_date_valid (td->date); 00719 td->string_list = NULL; 00720 td->string_list = g_list_prepend (td->string_list, "12/31/2374499"); 00721 td->string_list = g_list_prepend (td->string_list, "31/12/2374499"); 00722 td->string_list = g_list_prepend (td->string_list, "31.12.2374499"); 00723 td->string_list = g_list_prepend (td->string_list, "2374499-12-31"); 00724 td->string_list = g_list_prepend (td->string_list, "2374499-12-31T23:59:59Z"); 00725 td->string_list = g_list_prepend (td->string_list, 00726 "2374499-12-31 23:59:59.045321545 +0000"); 00727 td->string_list = g_list_reverse (td->string_list); 00728 td->id = "far, far future"; 00729 test_data = g_list_prepend (test_data, td); 00730 } 00731 } 00732 00733 static void 00734 free_test_data (gpointer data, gpointer user_data __attribute__ ((unused))) 00735 { 00736 QTestDate *td; 00737 00738 td = (QTestDate*)data; 00739 qof_date_free (td->date); 00740 qof_time_free (td->time); 00741 td->string_list = NULL; 00742 g_free (td); 00743 td = NULL; 00744 } 00745 00746 static void 00747 test_date_close (void) 00748 { 00749 g_list_foreach (test_data, free_test_data, NULL); 00750 } 00751 00752 static void 00753 scan_and_stamp (const gchar * str, QofDateFormat df, QofTimeSecs check) 00754 { 00755 QofTime *scan; 00756 QofDate *qd; 00757 gchar *stamp; 00758 00759 qd = qof_date_parse (str, df); 00760 scan = qof_date_to_qtime (qd); 00761 do_test ((scan != NULL), "scan failed"); 00762 if (scan == NULL) 00763 return; 00764 do_test ((0 == safe_strcasecmp(qd->qd_zone, "GMT")), 00765 " timezone reset incorrect"); 00766 do_test ((qof_time_get_secs (scan) == check), 00767 "wrong time value"); 00768 if (qof_time_get_secs (scan) != check) 00769 PERR (" wrong time value %" 00770 G_GINT64_FORMAT " %" G_GINT64_FORMAT " diff=%" 00771 G_GINT64_FORMAT " df=%d str=%s cmp=%s", 00772 qof_time_get_secs (scan), check, 00773 qof_time_get_secs (scan) - check, df, str, 00774 qof_date_print(qd, QOF_DATE_FORMAT_UTC)); 00775 stamp = qof_date_print (qof_date_from_qtime(scan), df); 00776 do_test ((stamp != NULL), "stamp failed"); 00777 /* timezone tests mean stamp cannot be compared to str */ 00778 qof_time_free (scan); 00779 } 00780 00781 static void 00782 stamp_and_scan (QofTimeSecs start, glong nanosecs, 00783 QofDateFormat df) 00784 { 00785 gchar *str1, *str2; 00786 QofDate *check; 00787 QofTime *time, *scan; 00788 00789 time = qof_time_new (); 00790 qof_time_set_secs (time, start); 00791 qof_time_set_nanosecs (time, nanosecs); 00792 str1 = qof_date_print (qof_date_from_qtime(time), df); 00793 do_test ((str1 != NULL), "stamp failed"); 00794 if (!str1) 00795 return; 00796 check = qof_date_parse (str1, df); 00797 do_test ((check != NULL), "parse failed"); 00798 if (!check) 00799 PERR (" tried to parse %s\n", str1); 00800 scan = qof_date_to_qtime (check); 00801 qof_date_free (check); 00802 do_test ((scan != NULL), "scan failed"); 00803 if (!scan) 00804 return; 00805 /* depending on the format, data may be lost here 00806 as some formats do not encode the time. So only 00807 test that the returned stamp is the same. */ 00808 check = qof_date_from_qtime (scan); 00809 str2 = qof_date_print (check, df); 00810 qof_date_free (check); 00811 /* 2 digit year errors with format 6 */ 00812 do_test ((str2 != NULL), "printed string is null"); 00813 do_test ((qof_date_from_qtime (scan) != NULL), 00814 "from_qtime failed"); 00815 do_test ((0 == safe_strcasecmp (str1, str2)), 00816 "stamp different to scan"); 00817 if (0 != safe_strcasecmp (str1, str2)) 00818 PERR (" df=%d str=%s scan=%s", df, str1, str2); 00819 qof_time_free (scan); 00820 qof_time_free (time); 00821 g_free (str1); 00822 g_free (str2); 00823 } 00824 00825 static void 00826 run_print_scan_tests (void) 00827 { 00828 gint i; 00829 gint64 secs; 00830 QofDateFormat df; 00831 00832 /* Set a secs value at the limit of the range of time_t 00833 on 32bit systems. */ 00834 secs = G_MAXINT32; 00835 /* add ten days */ 00836 secs += SECS_PER_DAY * 10; 00837 for (i = 1; i <= QOF_DATE_FORMAT_ISO8601; i++) 00838 { 00839 stamp_and_scan (796179600, 0, i); 00840 stamp_and_scan (796179500, 72000, i); 00841 stamp_and_scan (152098136, 0, i); 00842 stamp_and_scan (1964049931, 0, i); 00843 stamp_and_scan (1162088421, 12548000, i); 00844 stamp_and_scan (325659000 - 6500, 0, i); 00845 stamp_and_scan (1143943200, 0, i); 00846 stamp_and_scan (1603591171, 595311000, i); 00847 stamp_and_scan (1738909365, 204102000, i); 00848 stamp_and_scan (1603591171, 595311000, i); 00849 stamp_and_scan (1143943200 - 1, 0, i); 00850 stamp_and_scan (1143943200, 0, i); 00851 stamp_and_scan (1143943200 + (7 * 60 * 60), 0, i); 00852 stamp_and_scan (1143943200 + (8 * 60 * 60), 0, i); 00853 stamp_and_scan (1841443200, 0, i); 00854 00855 /* work with early dates */ 00856 stamp_and_scan (G_GINT64_CONSTANT (-796179600), 253, i); 00857 stamp_and_scan (G_GINT64_CONSTANT (-152098136), 865, i); 00858 stamp_and_scan (G_GINT64_CONSTANT (-1143943200), 67, i); 00859 stamp_and_scan (G_GINT64_CONSTANT (-1964049931), 53, i); 00860 stamp_and_scan (G_GINT64_CONSTANT (-2463880447), 48, i); 00861 stamp_and_scan (G_GINT64_CONSTANT (-22905158401), 9, i); 00862 stamp_and_scan (G_GINT64_CONSTANT (-28502726400), 1, i); 00863 stamp_and_scan (G_GINT64_CONSTANT (-60798211200), 0, i); 00864 stamp_and_scan (G_GINT64_CONSTANT (-32727638740), 0, i); 00865 /* stamp_and_scan (G_GINT64_CONSTANT (-86956848000), 0, i);*/ 00866 stamp_and_scan (secs, 0, i); 00867 /* Wed 29 Jan 2048 03:14:07 UTC */ 00868 stamp_and_scan (G_GINT64_CONSTANT (2463880447), 0, i); 00869 /* Sat 29 Jan 2050 03:14:07 UTC */ 00870 stamp_and_scan (G_GINT64_CONSTANT (2527038847), 0, i); 00871 /* work with far future dates */ 00872 /* 32,727,638,740 Fri Feb 6 02:45:40 UTC 3007 */ 00873 stamp_and_scan (G_GINT64_CONSTANT (32727638740), 0, i); 00874 /* 88,313,632,867 Fri Jul 19 12:41:07 UTC 4768 */ 00875 stamp_and_scan (G_GINT64_CONSTANT (88313632867), 0, i); 00876 /* 189,216,632,865 Fri Jan 14 07:47:45 UTC 7966 */ 00877 stamp_and_scan (G_GINT64_CONSTANT (189216632865), 0, i); 00878 /* 378,432,632,864 Sat Jan 20 07:47:44 UTC 13,962 */ 00879 stamp_and_scan (G_GINT64_CONSTANT (378432632864), 0, i); 00880 /* 3165071328567 Wed Feb 13 00:09:27 UTC 102,267 */ 00881 stamp_and_scan (G_GINT64_CONSTANT (3165071328567), 0, i); 00882 } 00883 /* far, far future dates delay the test */ 00884 #ifdef TEST_DEBUG 00885 /* 43165071328567 Wed Aug 28 23:16:07 UTC 1,369,816 */ 00886 stamp_and_scan (G_GINT64_CONSTANT (3165071328567), 00887 0, QOF_DATE_FORMAT_UTC); 00888 /* 843165071328567 Tue Jun 19 05:29:27 UTC 26,720,807 */ 00889 stamp_and_scan (G_GINT64_CONSTANT(843165071328567), 00890 0, QOF_DATE_FORMAT_UTC); 00892 /* 9843165071328567 Mon Jan 9 21:29:27 UTC 311,919,454 */ 00893 /* stamp_and_scan (G_GINT64_CONSTANT(9843165071328567), 00894 0, QOF_DATE_FORMAT_UTC); 00895 stamp_and_scan (G_GINT64_CONSTANT(9843165071328567), 00896 354758450, QOF_DATE_FORMAT_ISO8601);*/ 00897 #endif 00898 scan_and_stamp ("05/09/2006", QOF_DATE_FORMAT_US, 00899 1147132800); 00900 scan_and_stamp ("09/05/2006", QOF_DATE_FORMAT_UK, 00901 1147132800); 00902 scan_and_stamp ("09.05.2006", QOF_DATE_FORMAT_CE, 00903 1147132800); 00904 scan_and_stamp ("2006-05-09", QOF_DATE_FORMAT_ISO, 00905 1147132800); 00906 scan_and_stamp ("2006-05-09T00:00:00Z", QOF_DATE_FORMAT_UTC, 00907 1147132800); 00908 scan_and_stamp ("2006-05-09T14:49:04Z", QOF_DATE_FORMAT_UTC, 00909 1147186144); 00910 00911 /* test a custom format */ 00912 df = 0; 00913 do_test ((qof_date_format_add ("%Y-%m-%d %H:%M:%S %z", 00914 &df) == TRUE), "failed to add scan suitable format"); 00915 /* test timezone settings */ 00916 /* 1972-01-01T00:00:00Z */ 00917 scan_and_stamp ("1971-12-31 15:00:00 -0900", df, 63072000); 00918 /* 1980-01-01T00:00:00Z */ 00919 scan_and_stamp ("1979-12-31 15:00:00 -0900", df, 315532800); 00920 scan_and_stamp ("1980-01-01 00:00:00 -0000", df, 315532800); 00921 scan_and_stamp ("1980-01-01 00:00:00 +0000", df, 315532800); 00922 scan_and_stamp ("1980-01-01 09:00:00 +0900", df, 315532800); 00923 scan_and_stamp ("1980-01-01 08:30:00 +0830", df, 315532800); 00924 /* pre-1970 dates */ 00925 scan_and_stamp ("1963-11-22 14:00:00 -0500", df, -192776400); 00926 scan_and_stamp ("1945-09-08 11:02:00 +0900", df, -767311080); 00927 scan_and_stamp ("1918-11-11 11:00:00 +0000", df, -1613826000); 00928 /* work with really early dates */ 00929 /* 14th October 1066 (time is just a guess) */ 00930 scan_and_stamp ("1066-10-14 08:00:00 +0000", df, 00931 G_GINT64_CONSTANT (-28502726400)); 00932 /* May 43AD Roman invasion (day and time guessed) */ 00933 scan_and_stamp ("0043-05-20 14:00:00 +0000", df, 00934 G_GINT64_CONSTANT (-60798160800)); 00935 { 00936 QofDate *qd; 00937 QofTime *qt; 00938 gint64 secs; 00939 00940 qt = qof_time_new (); 00941 /* Tue May 9 14:50:10 UTC 2006 */ 00942 qof_time_set_secs (qt, 1147186210); 00943 qd = qof_date_from_qtime (qt); 00944 do_test ((qof_date_adddays (qd, 45) == TRUE), 00945 "add_days failed"); 00946 secs = 1147186210 + (45 * SECS_PER_DAY); 00947 qof_time_free (qt); 00948 qt = qof_date_to_qtime (qd); 00949 qof_date_free (qd); 00950 do_test ((secs == qof_time_get_secs (qt)), 00951 "add_days gave incorrect result."); 00952 if (secs != qof_time_get_secs (qt)) 00953 PERR (" secs=%" G_GINT64_FORMAT "cmp=%" 00954 G_GINT64_FORMAT, secs, qof_time_get_secs (qt)); 00955 qof_time_set_secs (qt, 1147186210); 00956 qd = qof_date_from_qtime (qt); 00957 do_test ((qof_date_addmonths (qd, 50, TRUE) == TRUE), 00958 "add_months failed"); 00959 qof_time_free (qt); 00960 qt = qof_date_to_qtime (qd); 00961 do_test ((1278687010 == qof_time_get_secs (qt)), 00962 "add_months gave incorrect result."); 00963 qof_time_free (qt); 00964 qof_date_free (qd); 00965 } 00966 } 00967 00968 static void 00969 run_qofdate_test (void) 00970 { 00971 QofDateFormat df, test; 00972 00973 df = qof_date_format_get_current (); 00974 /* default date format tests */ 00975 { 00976 qof_date_format_set_current (QOF_DATE_FORMAT_UK); 00977 test = qof_date_format_get_current (); 00978 do_test ((test == QOF_DATE_FORMAT_UK), 00979 "setting current format as UK"); 00980 do_test ((safe_strcasecmp (qof_date_format_to_name (test), 00981 "uk") == 0), "getting the shorthand name"); 00982 do_test ((FALSE == 00983 qof_date_format_set_name ("foo", QOF_DATE_FORMAT_UK)), 00984 "default name should not be overridden"); 00985 do_test ((QOF_DATE_FORMAT_UK == 00986 qof_date_format_from_name ("uk")), 00987 "getting date format from shorthand name"); 00988 do_test (('/' == qof_date_format_get_date_separator (test)), 00989 "getting date format separator from date format"); 00990 do_test ((FALSE == qof_date_format_set_date_separator (':', 00991 test)), "default separator should not be overridden"); 00992 } 00993 /* custom date format tests */ 00994 { 00995 QofDateFormat df, df2; 00996 do_test ((qof_date_format_add ("%T", &df) == TRUE), 00997 "adding a valid format"); 00998 do_test ((qof_date_format_add ("%a%A%b%B%c%C%d%D%e%F%f%r", 00999 &df2) == FALSE), "adding an invalid format"); 01000 qof_date_format_set_current (df); 01001 test = qof_date_format_get_current (); 01002 do_test ((test == df), "setting current format"); 01003 do_test ((safe_strcasecmp (qof_date_format_to_name (test), 01004 "%T") == 0), "getting the shorthand name"); 01005 do_test ((TRUE == qof_date_format_set_name ("foo", test)), 01006 "custom name should be overridden"); 01007 do_test ((test == qof_date_format_from_name ("foo")), 01008 "getting date format from shorthand name"); 01009 do_test (('\0' == qof_date_format_get_date_separator (test)), 01010 "getting date format separator from date format"); 01011 do_test ((TRUE == qof_date_format_set_date_separator (':', test)), 01012 "custom separator should be overridden"); 01013 do_test ((':' == qof_date_format_get_date_separator (test)), 01014 "getting modified date format separator from date format"); 01015 } 01016 qof_date_format_set_current (df); 01017 /* run tests on date_normalise */ 01018 { 01019 QofDate *date; 01020 01021 date = qof_date_new (); 01022 /* Mon Jan 3 00:00:30 UTC 2000 */ 01023 date->qd_sec = SECS_PER_DAY * 2 + 30; 01024 date->qd_year = 2000; 01025 do_test ((qof_date_valid (date) == TRUE), "date 1 was invalid"); 01026 do_test ((date->qd_sec == 30), "normalised seconds incorrect - 1"); 01027 do_test ((date->qd_mday == 2), "normalised day incorrect - 1"); 01028 date->qd_mday = 54; 01029 do_test ((qof_date_valid (date) == TRUE), "date 2 was invalid"); 01030 do_test ((date->qd_sec == 30), "normalised seconds incorrect - 2"); 01031 do_test ((date->qd_mday == 23), "normalised day incorrect - 2"); 01032 date->qd_hour = 34; 01033 qof_date_valid (date); 01034 do_test ((date->qd_hour == 10), "normalised hour incorrect"); 01035 do_test ((date->qd_mday == 24), "normalised day incorrect - 3"); 01036 date->qd_mon = 17; 01037 qof_date_valid (date); 01038 do_test ((date->qd_mon == 5), "normalised month incorrect"); 01039 do_test ((date->qd_year == 2001), "normalised year incorrect"); 01040 date->qd_hour = 27; 01041 qof_date_valid (date); 01042 do_test ((date->qd_hour == 3), "normalised hour incorrect - 1"); 01043 do_test ((date->qd_mday == 25), "normalised day incorrect - 4"); 01044 date->qd_hour = -53; 01045 qof_date_valid (date); 01046 do_test ((date->qd_hour == 19), "normalised hour incorrect - 2"); 01047 do_test ((date->qd_mday == 22), "normalised day incorrect - 5"); 01048 date->qd_min = -225; 01049 qof_date_valid (date); 01050 do_test ((date->qd_min == 15), "normalised min incorrect"); 01051 do_test ((date->qd_hour == 15), "normalised hour incorrect - 3"); 01052 date->qd_min = 5; 01053 date->qd_sec = 68; 01054 qof_date_valid (date); 01055 do_test ((date->qd_sec == 8), "doxygen sec example incorrect - 1"); 01056 do_test ((date->qd_min == 6), "doxygen min example incorrect - 1"); 01057 date->qd_min = 5; 01058 date->qd_sec = -64; 01059 qof_date_valid (date); 01060 do_test ((date->qd_sec == 56), "doxygen sec example incorrect - 2"); 01061 do_test ((date->qd_min == 3), "doxygen min example incorrect - 2"); 01062 } 01063 /* run tests against QofDate<->QofTime conversions. */ 01064 /* opposite direction compared to the tests above. */ 01065 { 01066 QofDate *qd; 01067 QofTime *qt; 01068 gchar *str1; 01069 01070 qd = qof_date_new (); 01071 qd->qd_year = 2006; 01072 qd->qd_mon = 5; 01073 qd->qd_mday = 30; 01074 qd->qd_hour = 18; 01075 qd->qd_min = 24; 01076 qd->qd_sec = 17; 01077 qd->qd_nanosecs = 123456789; 01078 do_test ((qof_date_valid (qd)), "date not valid"); 01079 qt = qof_date_to_qtime (qd); 01080 str1 = qof_date_print (qd, QOF_DATE_FORMAT_UTC); 01081 do_test ((0 == safe_strcasecmp (str1, 01082 "2006-05-30T18:24:17Z")), "with nanosecs"); 01083 do_test ((qof_time_get_nanosecs (qt) == 01084 123456789L), "nanosecs mismatched."); 01085 do_test ((0 == safe_strcasecmp ("05/30/2006", 01086 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01087 "strftime:US:first"); 01088 do_test ((0 == safe_strcasecmp ("30/05/2006", 01089 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01090 "strftime:UK:first"); 01091 do_test ((0 == safe_strcasecmp ("30.05.2006", 01092 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01093 "strftime:CE:first"); 01094 do_test ((0 == safe_strcasecmp ("2006-05-30", 01095 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01096 "strftime:ISO:first"); 01097 do_test ((0 == safe_strcasecmp ("2006-05-30T18:24:17Z", 01098 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01099 "strftime:UTC:first"); 01100 do_test ((0 != safe_strcasecmp (NULL, 01101 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01102 "strftime:LOCALE:first:inrange"); 01103 do_test ((0 != safe_strcasecmp (NULL, 01104 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01105 "strftime:CUSTOM:first:inrange"); 01106 qof_date_free (qd); 01107 qof_time_free (qt); 01108 qd = qof_date_new (); 01109 qd->qd_year = 3005; 01110 qd->qd_mon = 07; 01111 qd->qd_mday = 24; 01112 qd->qd_hour = 06; 01113 qd->qd_min = 34; 01114 qd->qd_sec = 26; 01115 do_test ((qof_date_valid (qd)), "date not valid"); 01116 qt = qof_date_to_qtime (qd); 01117 do_test ((0 == safe_strcasecmp ("07/24/3005", 01118 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01119 "strftime:US:forward"); 01120 do_test ((0 == safe_strcasecmp ("24/07/3005", 01121 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01122 "strftime:UK:forward"); 01123 do_test ((0 == safe_strcasecmp ("24.07.3005", 01124 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01125 "strftime:CE:forward"); 01126 do_test ((0 == safe_strcasecmp ("3005-07-24", 01127 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01128 "strftime:ISO:forward"); 01129 do_test ((0 == safe_strcasecmp ("3005-07-24T06:34:26Z", 01130 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01131 "strftime:UTC:forward"); 01132 do_test ((0 != safe_strcasecmp (NULL, 01133 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01134 "strftime:LOCALE:forward:inrange"); 01135 do_test ((0 != safe_strcasecmp (NULL, 01136 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01137 "strftime:CUSTOM:forward:inrange"); 01138 qof_date_free (qd); 01139 qd = qof_date_new (); 01140 qd->qd_year = 4500; 01141 qd->qd_mon = 07; 01142 qd->qd_mday = 24; 01143 qd->qd_hour = 06; 01144 qd->qd_min = 34; 01145 qd->qd_sec = 26; 01146 do_test ((qof_date_valid (qd)), "date not valid"); 01147 qt = qof_date_to_qtime (qd); 01148 do_test ((0 == safe_strcasecmp ("07/24/4500", 01149 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01150 "strftime:US:fifth"); 01151 do_test ((0 == safe_strcasecmp ("24/07/4500", 01152 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01153 "strftime:UK:fifth"); 01154 do_test ((0 == safe_strcasecmp ("24.07.4500", 01155 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01156 "strftime:CE:fifth"); 01157 do_test ((0 == safe_strcasecmp ("4500-07-24", 01158 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01159 "strftime:ISO:fifth"); 01160 do_test ((0 == safe_strcasecmp ("4500-07-24T06:34:26Z", 01161 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01162 "strftime:UTC:fifth"); 01163 do_test ((0 != safe_strcasecmp (NULL, 01164 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01165 "strftime:LOCALE:fifth:inrange"); 01166 do_test ((0 != safe_strcasecmp (NULL, 01167 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01168 "strftime:CUSTOM:fifth:inrange"); 01169 qof_date_free (qd); 01170 qd = qof_date_new (); 01171 qd->qd_year = 45000; 01172 qd->qd_mon = 07; 01173 qd->qd_mday = 24; 01174 qd->qd_hour = 06; 01175 qd->qd_min = 34; 01176 qd->qd_sec = 26; 01177 do_test ((qof_date_valid (qd)), "date not valid"); 01178 qt = qof_date_to_qtime (qd); 01179 do_test ((0 == safe_strcasecmp ("07/24/45000", 01180 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01181 "strftime:US:forward2"); 01182 do_test ((0 == safe_strcasecmp ("24/07/45000", 01183 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01184 "strftime:UK:forward2"); 01185 do_test ((0 == safe_strcasecmp ("24.07.45000", 01186 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01187 "strftime:CE:forward2"); 01188 do_test ((0 == safe_strcasecmp ("45000-07-24", 01189 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01190 "strftime:ISO:forward2"); 01191 do_test ((0 == safe_strcasecmp ("45000-07-24T06:34:26Z", 01192 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01193 "strftime:UTC:forward2"); 01194 do_test ((0 != safe_strcasecmp (NULL, 01195 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01196 "strftime:LOCALE:forward2:outofrange"); 01197 do_test ((0 != safe_strcasecmp (NULL, 01198 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01199 "strftime:CUSTOM:forward2:outofrange"); 01200 qof_date_free (qd); 01201 g_free (str1); 01202 qd = qof_date_new (); 01203 qd->qd_year = 1914; 01204 qd->qd_mon = 11; 01205 qd->qd_mday = 11; 01206 qd->qd_hour = 11; 01207 do_test ((qof_date_valid (qd)), "date not valid"); 01208 qt = qof_date_to_qtime (qd); 01209 str1 = qof_date_print (qd, QOF_DATE_FORMAT_UTC); 01210 do_test ((0 == safe_strcasecmp (str1, 01211 "1914-11-11T11:00:00Z")), "armistice day"); 01212 do_test ((0 == safe_strcasecmp ("11/11/1914", 01213 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01214 "strftime:US:second"); 01215 do_test ((0 == safe_strcasecmp ("11/11/1914", 01216 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01217 "strftime:UK:second"); 01218 do_test ((0 == safe_strcasecmp ("11.11.1914", 01219 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01220 "strftime:CE:second"); 01221 do_test ((0 == safe_strcasecmp ("1914-11-11", 01222 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01223 "strftime:ISO:second"); 01224 do_test ((0 == safe_strcasecmp ("1914-11-11T11:00:00Z", 01225 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01226 "strftime:UTC:second"); 01227 do_test ((0 != safe_strcasecmp (NULL, 01228 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01229 "strftime:LOCALE:second:inrange"); 01230 do_test ((0 != safe_strcasecmp (NULL, 01231 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01232 "strftime:CUSTOM:second:inrange"); 01233 qof_date_free (qd); 01234 qof_time_free (qt); 01235 qd = qof_date_new (); 01236 qd->qd_year = 1812; 01237 qd->qd_mon = 07; 01238 qd->qd_mday = 24; 01239 qd->qd_hour = 06; 01240 qd->qd_min = 34; 01241 qd->qd_sec = 26; 01242 do_test ((qof_date_valid (qd)), "date not valid"); 01243 qt = qof_date_to_qtime (qd); 01244 do_test ((0 == safe_strcasecmp ("07/24/1812", 01245 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01246 "strftime:US:third"); 01247 do_test ((0 == safe_strcasecmp ("24/07/1812", 01248 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01249 "strftime:UK:third"); 01250 do_test ((0 == safe_strcasecmp ("24.07.1812", 01251 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01252 "strftime:CE:third"); 01253 do_test ((0 == safe_strcasecmp ("1812-07-24", 01254 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01255 "strftime:ISO:third"); 01256 do_test ((0 == safe_strcasecmp ("1812-07-24T06:34:26Z", 01257 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01258 "strftime:UTC:third"); 01259 do_test ((0 == safe_strcasecmp (NULL, 01260 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01261 "strftime:LOCALE:third:outofrange"); 01262 do_test ((0 == safe_strcasecmp (NULL, 01263 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01264 "strftime:CUSTOM:third:outofrange"); 01265 qof_date_free (qd); 01266 qd = qof_date_new (); 01267 qd->qd_year = 1066; 01268 qd->qd_mon = 07; 01269 qd->qd_mday = 24; 01270 qd->qd_hour = 06; 01271 qd->qd_min = 34; 01272 qd->qd_sec = 26; 01273 do_test ((qof_date_valid (qd)), "date not valid"); 01274 qt = qof_date_to_qtime (qd); 01275 do_test ((0 == safe_strcasecmp ("07/24/1066", 01276 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01277 "strftime:US:fourth"); 01278 do_test ((0 == safe_strcasecmp ("24/07/1066", 01279 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01280 "strftime:UK:fourth"); 01281 do_test ((0 == safe_strcasecmp ("24.07.1066", 01282 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01283 "strftime:CE:fourth"); 01284 do_test ((0 == safe_strcasecmp ("1066-07-24", 01285 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01286 "strftime:ISO:fourth"); 01287 do_test ((0 == safe_strcasecmp ("1066-07-24T06:34:26Z", 01288 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01289 "strftime:UTC:fourth"); 01290 do_test ((0 == safe_strcasecmp (NULL, 01291 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01292 "strftime:LOCALE:fourth:outofrange"); 01293 do_test ((0 == safe_strcasecmp (NULL, 01294 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01295 "strftime:CUSTOM:fourth:outofrange"); 01296 qof_date_free (qd); 01297 qd = qof_date_new (); 01298 qd->qd_year = -45; 01299 qd->qd_mon = 07; 01300 qd->qd_mday = 24; 01301 qd->qd_hour = 06; 01302 qd->qd_min = 34; 01303 qd->qd_sec = 26; 01304 do_test ((qof_date_valid (qd)), "date not valid"); 01305 qt = qof_date_to_qtime (qd); 01306 do_test ((0 == safe_strcasecmp ("07/24/-045", 01307 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01308 "strftime:US:fifth"); 01309 do_test ((0 == safe_strcasecmp ("24/07/-045", 01310 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01311 "strftime:UK:fifth"); 01312 do_test ((0 == safe_strcasecmp ("24.07.-045", 01313 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01314 "strftime:CE:fifth"); 01315 do_test ((0 == safe_strcasecmp ("-045-07-24", 01316 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01317 "strftime:ISO:fifth"); 01318 do_test ((0 == safe_strcasecmp ("-045-07-24T06:34:26Z", 01319 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01320 "strftime:UTC:fifth"); 01321 do_test ((0 == safe_strcasecmp (NULL, 01322 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01323 "strftime:LOCALE:fifth:outofrange"); 01324 do_test ((0 == safe_strcasecmp (NULL, 01325 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01326 "strftime:CUSTOM:fifth:outofrange"); 01327 qof_date_free (qd); 01328 qd = qof_date_new (); 01329 qd->qd_year = -4500; 01330 qd->qd_mon = 07; 01331 qd->qd_mday = 24; 01332 qd->qd_hour = 06; 01333 qd->qd_min = 34; 01334 qd->qd_sec = 26; 01335 do_test ((qof_date_valid (qd)), "date not valid"); 01336 qt = qof_date_to_qtime (qd); 01337 do_test ((0 == safe_strcasecmp ("07/24/-4500", 01338 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01339 "strftime:US:sixth"); 01340 do_test ((0 == safe_strcasecmp ("24/07/-4500", 01341 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01342 "strftime:UK:sixth"); 01343 do_test ((0 == safe_strcasecmp ("24.07.-4500", 01344 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01345 "strftime:CE:sixth"); 01346 do_test ((0 == safe_strcasecmp ("-4500-07-24", 01347 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01348 "strftime:ISO:sixth"); 01349 do_test ((0 == safe_strcasecmp ("-4500-07-24T06:34:26Z", 01350 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01351 "strftime:UTC:sixth"); 01352 do_test ((0 == safe_strcasecmp (NULL, 01353 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01354 "strftime:LOCALE:sixth:outofrange"); 01355 do_test ((0 == safe_strcasecmp (NULL, 01356 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01357 "strftime:CUSTOM:sixth:outofrange"); 01358 qof_date_free (qd); 01359 qd = qof_date_new (); 01360 qd->qd_year = -4500000; 01361 qd->qd_mon = 07; 01362 qd->qd_mday = 24; 01363 qd->qd_hour = 06; 01364 qd->qd_min = 34; 01365 qd->qd_sec = 26; 01366 do_test ((qof_date_valid (qd)), "date not valid"); 01367 qt = qof_date_to_qtime (qd); 01368 do_test ((0 == safe_strcasecmp ("07/24/-4500000", 01369 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01370 "strftime:US:seventh"); 01371 do_test ((0 == safe_strcasecmp ("24/07/-4500000", 01372 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01373 "strftime:UK:seventh"); 01374 do_test ((0 == safe_strcasecmp ("24.07.-4500000", 01375 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01376 "strftime:CE:seventh"); 01377 do_test ((0 == safe_strcasecmp ("-4500000-07-24", 01378 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01379 "strftime:ISO:seventh"); 01380 do_test ((0 == safe_strcasecmp ("-4500000-07-24T06:34:26Z", 01381 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01382 "strftime:UTC:seventh"); 01383 do_test ((0 == safe_strcasecmp (NULL, 01384 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01385 "strftime:LOCALE:seventh:outofrange"); 01386 do_test ((0 == safe_strcasecmp (NULL, 01387 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01388 "strftime:CUSTOM:seventh:outofrange"); 01389 qof_date_free (qd); 01390 } 01391 } 01392 01393 static void 01394 run_qoftime_test (void) 01395 { 01396 QofTime *time, *cmp, *diff; 01397 01398 time = qof_time_new (); 01399 do_test ((time != NULL), "failed to initialise QofTime."); 01400 /* basic tests */ 01401 { 01402 qof_time_set_secs (time, 796179600); 01403 do_test ((qof_time_get_secs (time) > 0), "failed to set secs"); 01404 do_test ((time != NULL), "error found"); 01405 qof_time_set_secs (time, 0); 01406 qof_time_set_nanosecs (time, 2041020040); 01407 do_test ((qof_time_get_secs (time) > 0), "failed to normalise."); 01408 do_test ((time != NULL), "error found"); 01409 do_test ((qof_time_get_nanosecs (time) > 0), 01410 "failed to set nanosecs"); 01411 } 01412 /* calculation and comparison tests */ 01413 { 01414 qof_time_add_secs (time, -1143943200); 01415 do_test ((qof_time_get_secs (time) < 0), "failed to subtract."); 01416 do_test ((time != NULL), "error found"); 01417 cmp = qof_time_new (); 01418 qof_time_set_secs (cmp, 0); 01419 do_test ((qof_time_equal (time, cmp) == FALSE), "test equal failed."); 01420 do_test ((qof_time_cmp (time, cmp) == -1), "compare cmp test"); 01421 diff = qof_time_new (); 01422 qof_time_set_secs (diff, qof_time_get_secs (cmp)); 01423 do_test ((qof_time_cmp (diff, cmp) == 0), "compare diff test"); 01424 qof_time_free (diff); 01425 diff = qof_time_diff (time, cmp); 01426 do_test ((qof_time_get_secs (diff) < 0), "diff of negative value"); 01427 qof_time_free (diff); 01428 diff = qof_time_diff (cmp, time); 01429 do_test ((qof_time_get_secs (diff) > 0), "diff of negative value"); 01430 time = qof_time_abs (time); 01431 do_test ((qof_time_get_nanosecs (time) != 0), "abs failed"); 01432 qof_time_set_secs (cmp, qof_time_get_secs (time)); 01433 qof_time_set_nanosecs (cmp, qof_time_get_nanosecs (time)); 01434 do_test ((qof_time_equal (cmp, time) == TRUE), 01435 "equality test failed"); 01436 qof_time_free (cmp); 01437 qof_time_free (time); 01438 } 01439 /* gdate basic tests */ 01440 { 01441 GDate *date, *test; 01442 GTimeVal gtv; 01443 01444 date = g_date_new_dmy (15, 5, 2006); 01445 time = qof_time_from_gdate (date); 01446 test = qof_time_to_gdate (time); 01447 do_test ((g_date_get_day (test) == 15), "gdate day fail"); 01448 do_test ((g_date_get_month (test) == 5), "gdate month fail"); 01449 do_test ((g_date_get_year (test) == 2006), "gdate year fail"); 01450 do_test ((qof_time_to_gtimeval (time, >v)), "gtimeval fail"); 01451 { 01452 QofTime *copy, *diff; 01453 01454 qof_time_add_secs (time, 26451); 01455 copy = qof_time_add_secs_copy (time, -26451); 01456 diff = qof_time_diff (time, copy); 01457 do_test ((qof_time_get_secs (diff) == 26451), 01458 "add seconds failed"); 01459 qof_time_free (copy); 01460 qof_time_free (diff); 01461 } 01462 g_date_free (date); 01463 g_date_free (test); 01464 qof_time_free (time); 01465 } 01466 /* gdate comparison tests */ 01467 { 01468 GDate *date, *cmp; 01469 gint64 time_secs, diff; 01470 glong time_nano; 01471 01472 date = g_date_new_dmy (15, 5, 2006); 01473 time = qof_time_from_gdate (date); 01474 cmp = qof_time_to_gdate (time); 01475 do_test ((g_date_compare (date, cmp) == 0), 01476 "convert to and from gdate failed"); 01477 g_date_free (cmp); 01478 time_secs = qof_time_get_secs (time); 01479 time_nano = qof_time_get_nanosecs (time); 01480 qof_time_add_secs (time, 7252); 01481 qof_time_set_nanosecs (time, 123456); 01482 do_test ((qof_time_set_day_start (time)), "set_day_start failed"); 01483 do_test ((qof_time_get_secs (time) == time_secs), 01484 "start of day incorrect"); 01485 do_test ((qof_time_get_nanosecs (time) == 0), 01486 "set nano at day start incorrect"); 01487 do_test ((qof_time_set_day_middle (time) == TRUE), 01488 "set_day_middle failed"); 01489 diff = qof_time_get_secs (time) - time_secs; 01490 do_test (diff == (SECS_PER_DAY / 2), "middle of day incorrect"); 01491 /* convert middle of day back to date */ 01492 cmp = qof_time_to_gdate (time); 01493 do_test ((g_date_compare (date, cmp) == 0), 01494 "middle of day not the same as original day"); 01495 g_date_free (cmp); 01496 01497 do_test ((qof_time_set_day_end (time)), "set_day_end failed"); 01498 do_test ((qof_time_get_secs (time) - time_secs) 01499 == (SECS_PER_DAY - 1), "end of day incorrect"); 01500 01501 /* convert end of day back to date */ 01502 cmp = qof_time_to_gdate (time); 01503 01504 do_test ((g_date_compare (date, cmp) == 0), 01505 "end of day not the same as original day"); 01506 qof_time_free (time); 01507 g_date_free (cmp); 01508 g_date_free (date); 01509 } 01510 /* QofTime today tests */ 01511 { 01512 GTimeVal *current; 01513 gint64 time_secs; 01514 QofTime *diff; 01515 01516 current = qof_time_get_current_start (); 01517 diff = qof_time_new (); 01518 qof_time_from_gtimeval (diff, current); 01519 time_secs = qof_time_get_secs (diff); 01520 time = qof_time_get_today_start (); 01521 do_test ((qof_time_get_secs (time) == time_secs), 01522 "start of day incorrect"); 01523 do_test ((qof_time_get_nanosecs (time) == 0), 01524 "today start nanosecs non zero"); 01525 qof_time_free (time); 01526 time = qof_time_get_today_end (); 01527 time_secs += SECS_PER_DAY - 1; 01528 do_test ((qof_time_get_secs (time) == time_secs), 01529 "start of today incorrect"); 01530 do_test ((qof_time_get_nanosecs (time) == 0), 01531 "today start nanosecs non zero"); 01532 qof_time_free (time); 01533 } 01534 /* last mday test */ 01535 { 01536 GDate *date; 01537 guint8 mday; 01538 01539 date = g_date_new_dmy (15, 5, 2006); 01540 time = qof_time_from_gdate (date); 01541 mday = qof_time_last_mday (time); 01542 do_test ((mday == 31), " wrong last day of May"); 01543 } 01544 /* qof_date_get_mday and qof_date_get_yday tests */ 01545 { 01546 QofDate *d; 01547 /* Wed 3rd Sep 2003 = 246. */ 01548 do_test ((246 == qof_date_get_yday (3, 9, 2003)), 01549 "get year day test, September"); 01550 d = qof_date_new (); 01551 d->qd_mday = 3; 01552 d->qd_mon = 9; 01553 d->qd_year = 2003; 01554 do_test ((TRUE == qof_date_valid (d)), 01555 "3/9/2003 not valid"); 01556 do_test ((3 == d->qd_wday), "not Wednesday"); 01557 qof_date_free (d); 01558 /* Fri 3rd Sep 2004 = 247. */ 01559 do_test ((247 == qof_date_get_yday (3, 9, 2004)), 01560 "get year day test, leap year"); 01561 d = qof_date_new (); 01562 d->qd_mday = 3; 01563 d->qd_mon = 9; 01564 d->qd_year = 2004; 01565 do_test ((TRUE == qof_date_valid (d)), 01566 "3/9/2003 not valid"); 01567 do_test ((5 == d->qd_wday), "not Friday"); 01568 qof_date_free (d); 01569 /* Sun 19th May 2002 = 139. */ 01570 do_test ((139 == qof_date_get_yday (19, 5, 2002)), 01571 "get year day test, May"); 01572 d = qof_date_new (); 01573 d->qd_mday = 19; 01574 d->qd_mon = 5; 01575 d->qd_year = 2002; 01576 do_test ((TRUE == qof_date_valid (d)), 01577 "3/9/2003 not valid"); 01578 do_test ((0 == d->qd_wday), "not Sunday"); 01579 qof_date_free (d); 01580 /* Wed 19th May 2004 = 140. */ 01581 do_test ((140 == qof_date_get_yday (19, 5, 2004)), 01582 "get year day test, May"); 01583 d = qof_date_new (); 01584 d->qd_mday = 19; 01585 d->qd_mon = 5; 01586 d->qd_year = 2004; 01587 do_test ((TRUE == qof_date_valid (d)), 01588 "3/9/2003 not valid"); 01589 do_test ((3 == d->qd_wday), "not Wednesday, May"); 01590 qof_date_free (d); 01591 /* Nov 2003 = 30 */ 01592 do_test ((30 == qof_date_get_mday (11, 2003)), 01593 "get days in month, non-leap"); 01594 /* Feb 2004 = 29 */ 01595 do_test ((29 == qof_date_get_mday (2, 2004)), 01596 "get days in month, leap year"); 01597 } 01598 /* time to dmy test */ 01599 { 01600 gboolean success; 01601 guint8 day, month; 01602 guint16 year; 01603 GDate *date; 01604 QofTime *reverse; 01605 01606 date = g_date_new_dmy (15, 5, 2006); 01607 time = qof_time_from_gdate (date); 01608 success = qof_time_to_dmy (time, &day, &month, &year); 01609 do_test ((success == TRUE), "time to dmy failed"); 01610 do_test ((day == 15), "wrong day calculated"); 01611 do_test ((month == 5), "wrong month calculated"); 01612 do_test ((year == 2006), "wrong year calculated"); 01613 reverse = qof_time_dmy_to_time (day, month, year); 01614 do_test ((qof_time_cmp (time, reverse) == 0), "dmy to time failed"); 01615 g_date_free (date); 01616 qof_time_free (time); 01617 qof_time_free (reverse); 01618 } 01619 { 01620 /* day, month, year wrapping */ 01621 QofTime *wrap_t; 01622 QofDate *wrap_d; 01623 glong day, month, year; 01624 01625 /* Thu Jul 13 18:20:27 UTC 2006 */ 01626 wrap_t = qof_time_set (1152814827, 345634); 01627 wrap_d = qof_date_from_qtime (wrap_t); 01628 PINFO (" base date for section = %s", 01629 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01630 day = wrap_d->qd_mday; 01631 month = wrap_d->qd_mon; 01632 year = wrap_d->qd_year; 01633 qof_date_free (wrap_d); 01634 /* one day ago */ 01635 wrap_d = qof_date_from_qtime (wrap_t); 01636 wrap_d->qd_mday -= 1; 01637 qof_date_valid (wrap_d); 01638 do_test ((wrap_d->qd_mon == month && 01639 wrap_d->qd_year == year && 01640 wrap_d->qd_mday == (day - 1)), 01641 " this time on previous day"); 01642 PINFO (" same time previous day = %s", 01643 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01644 qof_date_free (wrap_d); 01645 /* this time last month */ 01646 wrap_d = qof_date_from_qtime (wrap_t); 01647 wrap_d->qd_mon -= 1; 01648 qof_date_valid (wrap_d); 01649 do_test ((wrap_d->qd_mon == (month - 1) && 01650 wrap_d->qd_year == year && 01651 wrap_d->qd_mday == day), 01652 " this time last month"); 01653 PINFO (" same time previous month = %s", 01654 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01655 qof_date_free (wrap_d); 01656 /* this time last year */ 01657 wrap_d = qof_date_from_qtime (wrap_t); 01658 wrap_d->qd_year -= 1; 01659 qof_date_valid (wrap_d); 01660 do_test ((wrap_d->qd_mon == month && 01661 wrap_d->qd_year == (year - 1) && 01662 wrap_d->qd_mday == day), 01663 " this time last year"); 01664 PINFO (" same time previous year = %s", 01665 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01666 qof_time_free (wrap_t); 01667 qof_date_free (wrap_d); 01668 } 01669 } 01670 01671 int 01672 main (void) 01673 { 01674 qof_init (); 01675 #ifdef TEST_DEBUG 01676 qof_log_init_filename ("test-date.trace"); 01677 qof_log_set_default (QOF_LOG_DETAIL); 01678 ENTER (" "); 01679 #endif 01680 test_date_init (); 01681 run_qoftime_test (); 01682 run_qofdate_test (); 01683 run_print_scan_tests (); 01684 g_list_foreach (test_data, check_date_cycles, NULL); 01685 print_test_results (); 01686 test_date_close (); 01687 #ifdef TEST_DEBUG 01688 LEAVE (" "); 01689 qof_log_shutdown (); 01690 #endif 01691 qof_close (); 01692 exit (get_rv ()); 01693 }