QOF 0.8.2
|
00001 /*************************************************************************** 00002 * test-date.c 00003 * Rewritten from scratch for QOF 0.8.0 00004 * 00005 * Copyright (C) 2002-2008 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, *qd1, *qd2; 00937 QofTime *qt, *copy; 00938 gint64 secs; 00939 gchar * str1, * str2; 00940 00941 qt = qof_time_new (); 00942 /* Tue May 9 14:50:10 UTC 2006 */ 00943 qof_time_set_secs (qt, 1147186210); 00944 copy = qof_time_copy (qt); 00945 do_test ((copy != NULL), "copy time NULL"); 00946 qd1 = qof_date_from_qtime(qt); 00947 qd2 = qof_date_from_qtime(copy); 00948 str1 = g_strdup_printf ("%s\n", qof_date_print(qd1, QOF_DATE_FORMAT_CUSTOM)); 00949 str2 = g_strdup_printf ("%s\n", qof_date_print(qd2, QOF_DATE_FORMAT_CUSTOM)); 00950 do_test ((safe_strcmp(str1, str2) == 0), "copied time fails to match original"); 00951 g_free (str1); 00952 g_free (str2); 00953 do_test ((qof_time_is_valid(qt) == TRUE), "qt time invalid"); 00954 do_test ((qof_time_is_valid(copy) == TRUE), "copy time invalid"); 00955 do_test ((qof_time_equal(qt, copy) == TRUE), "copy time not equal"); 00956 00957 /* test %s and %N as well as %s.%N */ 00958 { 00959 gint id, id1, id2; 00960 gchar * str; 00961 QofDate * qd_s, * qd_a; 00962 QofTime * qt_s; 00963 gint64 secs = qof_time_get_secs (qt); 00964 gint64 nsecs = qof_time_get_nanosecs (qt) + 00965 get_random_int_in_range(0, 999999); 00966 00967 qt_s = qof_time_copy (qt); 00968 qd_s = qof_date_from_qtime (qt_s); 00969 qof_date_format_add ("%s", &id); 00970 id1 = id; 00971 do_test ((id > 0), "add seconds only custom format"); 00972 qd_s = qof_date_from_qtime(qt_s); 00973 str = qof_date_print (qd_s, id); 00974 qd_a = qof_date_parse (str, id); 00975 str = qof_date_print (qd_a, QOF_DATE_FORMAT_UTC); 00976 str = qof_date_print (qd_a, id); 00977 qt_s = qof_date_to_qtime (qd_a); 00978 do_test (secs == qof_time_get_secs (qt_s), "second parsing failed"); 00979 00980 qt_s = qof_time_copy (qt); 00981 qof_time_set_nanosecs (qt_s, nsecs); 00982 qd_s = qof_date_from_qtime (qt_s); 00983 qof_date_format_add ("%N", &id); 00984 id2 = id; 00985 do_test ((id > id1), "add nanoseconds only custom format"); 00986 qd_s = qof_date_from_qtime(qt_s); 00987 str = qof_date_print (qd_s, id); 00988 qd_s = qof_date_parse (str, id); 00989 qt_s = qof_date_to_qtime (qd_s); 00990 do_test (nsecs == qof_time_get_nanosecs (qt_s), "nanosecond parsing failed"); 00991 00992 qof_date_format_add ("%s.%N", &id); 00993 do_test ((id > id2), "add sec+nanosec custom format"); 00994 qof_time_free (qt_s); 00995 qt_s = qof_time_new (); 00996 qof_time_set_secs (qt_s, secs); 00997 qof_time_set_nanosecs (qt_s, nsecs); 00998 qd_s = qof_date_from_qtime(qt_s); 00999 str = qof_date_print (qd_s, id); 01000 qd_s = qof_date_parse (str, id); 01001 qt_s = qof_date_to_qtime (qd_s); 01002 do_test (nsecs == qof_time_get_nanosecs (qt_s), "s.N - nanosecs failed"); 01003 do_test (secs == qof_time_get_secs (qt_s), "s.N - seconds failed"); 01004 } 01005 qd = qof_date_from_qtime (qt); 01006 do_test ((qof_date_adddays (qd, 45) == TRUE), 01007 "add_days failed"); 01008 secs = 1147186210 + (45 * SECS_PER_DAY); 01009 qof_time_free (qt); 01010 qt = qof_date_to_qtime (qd); 01011 qof_date_free (qd); 01012 do_test ((secs == qof_time_get_secs (qt)), 01013 "add_days gave incorrect result."); 01014 if (secs != qof_time_get_secs (qt)) 01015 PERR (" secs=%" G_GINT64_FORMAT "cmp=%" 01016 G_GINT64_FORMAT, secs, qof_time_get_secs (qt)); 01017 qof_time_set_secs (qt, 1147186210); 01018 qd = qof_date_from_qtime (qt); 01019 do_test ((qof_date_addmonths (qd, 50, TRUE) == TRUE), 01020 "add_months failed"); 01021 qof_time_free (qt); 01022 qt = qof_date_to_qtime (qd); 01023 do_test ((1278687010 == qof_time_get_secs (qt)), 01024 "add_months gave incorrect result."); 01025 qof_time_free (qt); 01026 qof_date_free (qd); 01027 } 01028 } 01029 01030 static void 01031 run_qofdate_test (void) 01032 { 01033 QofDateFormat df, test; 01034 01035 df = qof_date_format_get_current (); 01036 /* default date format tests */ 01037 { 01038 qof_date_format_set_current (QOF_DATE_FORMAT_UK); 01039 test = qof_date_format_get_current (); 01040 do_test ((test == QOF_DATE_FORMAT_UK), 01041 "setting current format as UK"); 01042 do_test ((safe_strcasecmp (qof_date_format_to_name (test), 01043 "uk") == 0), "getting the shorthand name"); 01044 do_test ((FALSE == 01045 qof_date_format_set_name ("foo", QOF_DATE_FORMAT_UK)), 01046 "default name should not be overridden"); 01047 do_test ((QOF_DATE_FORMAT_UK == 01048 qof_date_format_from_name ("uk")), 01049 "getting date format from shorthand name"); 01050 do_test (('/' == qof_date_format_get_date_separator (test)), 01051 "getting date format separator from date format"); 01052 do_test ((FALSE == qof_date_format_set_date_separator (':', 01053 test)), "default separator should not be overridden"); 01054 } 01055 /* custom date format tests */ 01056 { 01057 QofDateFormat df, df2; 01058 do_test ((qof_date_format_add ("%T", &df) == TRUE), 01059 "adding a valid format"); 01060 do_test ((qof_date_format_add ("%a%A%b%B%c%C%d%D%e%F%f%r", 01061 &df2) == FALSE), "adding an invalid format"); 01062 qof_date_format_set_current (df); 01063 test = qof_date_format_get_current (); 01064 do_test ((test == df), "setting current format"); 01065 do_test ((safe_strcasecmp (qof_date_format_to_name (test), 01066 "%T") == 0), "getting the shorthand name"); 01067 do_test ((TRUE == qof_date_format_set_name ("foo", test)), 01068 "custom name should be overridden"); 01069 do_test ((test == qof_date_format_from_name ("foo")), 01070 "getting date format from shorthand name"); 01071 do_test (('\0' == qof_date_format_get_date_separator (test)), 01072 "getting date format separator from date format"); 01073 do_test ((TRUE == qof_date_format_set_date_separator (':', test)), 01074 "custom separator should be overridden"); 01075 do_test ((':' == qof_date_format_get_date_separator (test)), 01076 "getting modified date format separator from date format"); 01077 } 01078 qof_date_format_set_current (df); 01079 /* run tests on date_normalise */ 01080 { 01081 QofDate *date; 01082 01083 date = qof_date_new (); 01084 /* Mon Jan 3 00:00:30 UTC 2000 */ 01085 date->qd_sec = SECS_PER_DAY * 2 + 30; 01086 date->qd_year = 2000; 01087 do_test ((qof_date_valid (date) == TRUE), "date 1 was invalid"); 01088 do_test ((date->qd_sec == 30), "normalised seconds incorrect - 1"); 01089 do_test ((date->qd_mday == 3), "normalised day incorrect - 1"); 01090 date->qd_mday = 54; 01091 do_test ((qof_date_valid (date) == TRUE), "date 2 was invalid"); 01092 do_test ((date->qd_sec == 30), "normalised seconds incorrect - 2"); 01093 do_test ((date->qd_mday == 23), "normalised day incorrect - 2"); 01094 date->qd_hour = 34; 01095 qof_date_valid (date); 01096 do_test ((date->qd_hour == 10), "normalised hour incorrect"); 01097 do_test ((date->qd_mday == 24), "normalised day incorrect - 3"); 01098 date->qd_mon = 17; 01099 qof_date_valid (date); 01100 do_test ((date->qd_mon == 5), "normalised month incorrect"); 01101 do_test ((date->qd_year == 2001), "normalised year incorrect"); 01102 date->qd_hour = 27; 01103 qof_date_valid (date); 01104 do_test ((date->qd_hour == 3), "normalised hour incorrect - 1"); 01105 do_test ((date->qd_mday == 25), "normalised day incorrect - 4"); 01106 date->qd_hour = -53; 01107 qof_date_valid (date); 01108 do_test ((date->qd_hour == 19), "normalised hour incorrect - 2"); 01109 do_test ((date->qd_mday == 22), "normalised day incorrect - 5"); 01110 date->qd_min = -225; 01111 qof_date_valid (date); 01112 do_test ((date->qd_min == 15), "normalised min incorrect"); 01113 do_test ((date->qd_hour == 15), "normalised hour incorrect - 3"); 01114 date->qd_min = 5; 01115 date->qd_sec = 68; 01116 qof_date_valid (date); 01117 do_test ((date->qd_sec == 8), "doxygen sec example incorrect - 1"); 01118 do_test ((date->qd_min == 6), "doxygen min example incorrect - 1"); 01119 date->qd_min = 5; 01120 date->qd_sec = -64; 01121 qof_date_valid (date); 01122 do_test ((date->qd_sec == 56), "doxygen sec example incorrect - 2"); 01123 do_test ((date->qd_min == 3), "doxygen min example incorrect - 2"); 01124 } 01125 /* run tests against QofDate<->QofTime conversions. */ 01126 /* opposite direction compared to the tests above. */ 01127 { 01128 QofDate *qd; 01129 QofTime *qt; 01130 gchar *str1; 01131 01132 qd = qof_date_new (); 01133 qd->qd_year = 2006; 01134 qd->qd_mon = 5; 01135 qd->qd_mday = 30; 01136 qd->qd_hour = 18; 01137 qd->qd_min = 24; 01138 qd->qd_sec = 17; 01139 qd->qd_nanosecs = 123456789; 01140 do_test ((qof_date_valid (qd)), "date not valid"); 01141 qt = qof_date_to_qtime (qd); 01142 str1 = qof_date_print (qd, QOF_DATE_FORMAT_UTC); 01143 do_test ((0 == safe_strcasecmp (str1, 01144 "2006-05-30T18:24:17Z")), "with nanosecs"); 01145 do_test ((qof_time_get_nanosecs (qt) == 01146 123456789L), "nanosecs mismatched."); 01147 do_test ((0 == safe_strcasecmp ("05/30/2006", 01148 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01149 "strftime:US:first"); 01150 do_test ((0 == safe_strcasecmp ("30/05/2006", 01151 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01152 "strftime:UK:first"); 01153 do_test ((0 == safe_strcasecmp ("30.05.2006", 01154 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01155 "strftime:CE:first"); 01156 do_test ((0 == safe_strcasecmp ("2006-05-30", 01157 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01158 "strftime:ISO:first"); 01159 do_test ((0 == safe_strcasecmp ("2006-05-30T18:24:17Z", 01160 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01161 "strftime:UTC:first"); 01162 do_test ((0 != safe_strcasecmp (NULL, 01163 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01164 "strftime:LOCALE:first:inrange"); 01165 do_test ((0 != safe_strcasecmp (NULL, 01166 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01167 "strftime:CUSTOM:first:inrange"); 01168 qof_date_free (qd); 01169 qof_time_free (qt); 01170 qd = qof_date_new (); 01171 qd->qd_year = 3005; 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/3005", 01180 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01181 "strftime:US:forward"); 01182 do_test ((0 == safe_strcasecmp ("24/07/3005", 01183 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01184 "strftime:UK:forward"); 01185 do_test ((0 == safe_strcasecmp ("24.07.3005", 01186 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01187 "strftime:CE:forward"); 01188 do_test ((0 == safe_strcasecmp ("3005-07-24", 01189 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01190 "strftime:ISO:forward"); 01191 do_test ((0 == safe_strcasecmp ("3005-07-24T06:34:26Z", 01192 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01193 "strftime:UTC:forward"); 01194 do_test ((0 != safe_strcasecmp (NULL, 01195 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01196 "strftime:LOCALE:forward:inrange"); 01197 do_test ((0 != safe_strcasecmp (NULL, 01198 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01199 "strftime:CUSTOM:forward:inrange"); 01200 qof_date_free (qd); 01201 qd = qof_date_new (); 01202 qd->qd_year = 4500; 01203 qd->qd_mon = 07; 01204 qd->qd_mday = 24; 01205 qd->qd_hour = 06; 01206 qd->qd_min = 34; 01207 qd->qd_sec = 26; 01208 do_test ((qof_date_valid (qd)), "date not valid"); 01209 qt = qof_date_to_qtime (qd); 01210 do_test ((0 == safe_strcasecmp ("07/24/4500", 01211 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01212 "strftime:US:fifth"); 01213 do_test ((0 == safe_strcasecmp ("24/07/4500", 01214 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01215 "strftime:UK:fifth"); 01216 do_test ((0 == safe_strcasecmp ("24.07.4500", 01217 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01218 "strftime:CE:fifth"); 01219 do_test ((0 == safe_strcasecmp ("4500-07-24", 01220 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01221 "strftime:ISO:fifth"); 01222 do_test ((0 == safe_strcasecmp ("4500-07-24T06:34:26Z", 01223 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01224 "strftime:UTC:fifth"); 01225 do_test ((0 != safe_strcasecmp (NULL, 01226 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01227 "strftime:LOCALE:fifth:inrange"); 01228 do_test ((0 != safe_strcasecmp (NULL, 01229 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01230 "strftime:CUSTOM:fifth:inrange"); 01231 qof_date_free (qd); 01232 qd = qof_date_new (); 01233 qd->qd_year = 45000; 01234 qd->qd_mon = 07; 01235 qd->qd_mday = 24; 01236 qd->qd_hour = 06; 01237 qd->qd_min = 34; 01238 qd->qd_sec = 26; 01239 do_test ((qof_date_valid (qd)), "date not valid"); 01240 qt = qof_date_to_qtime (qd); 01241 do_test ((0 == safe_strcasecmp ("07/24/45000", 01242 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01243 "strftime:US:forward2"); 01244 do_test ((0 == safe_strcasecmp ("24/07/45000", 01245 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01246 "strftime:UK:forward2"); 01247 do_test ((0 == safe_strcasecmp ("24.07.45000", 01248 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01249 "strftime:CE:forward2"); 01250 do_test ((0 == safe_strcasecmp ("45000-07-24", 01251 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01252 "strftime:ISO:forward2"); 01253 do_test ((0 == safe_strcasecmp ("45000-07-24T06:34:26Z", 01254 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01255 "strftime:UTC:forward2"); 01256 do_test ((0 != safe_strcasecmp (NULL, 01257 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01258 "strftime:LOCALE:forward2:outofrange"); 01259 do_test ((0 != safe_strcasecmp (NULL, 01260 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01261 "strftime:CUSTOM:forward2:outofrange"); 01262 qof_date_free (qd); 01263 g_free (str1); 01264 qd = qof_date_new (); 01265 qd->qd_year = 1914; 01266 qd->qd_mon = 11; 01267 qd->qd_mday = 11; 01268 qd->qd_hour = 11; 01269 do_test ((qof_date_valid (qd)), "date not valid"); 01270 qt = qof_date_to_qtime (qd); 01271 str1 = qof_date_print (qd, QOF_DATE_FORMAT_UTC); 01272 do_test ((0 == safe_strcasecmp (str1, 01273 "1914-11-11T11:00:00Z")), "armistice day"); 01274 do_test ((0 == safe_strcasecmp ("11/11/1914", 01275 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01276 "strftime:US:second"); 01277 do_test ((0 == safe_strcasecmp ("11/11/1914", 01278 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01279 "strftime:UK:second"); 01280 do_test ((0 == safe_strcasecmp ("11.11.1914", 01281 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01282 "strftime:CE:second"); 01283 do_test ((0 == safe_strcasecmp ("1914-11-11", 01284 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01285 "strftime:ISO:second"); 01286 do_test ((0 == safe_strcasecmp ("1914-11-11T11:00:00Z", 01287 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01288 "strftime:UTC:second"); 01289 do_test ((0 != safe_strcasecmp (NULL, 01290 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01291 "strftime:LOCALE:second:inrange"); 01292 do_test ((0 != safe_strcasecmp (NULL, 01293 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01294 "strftime:CUSTOM:second:inrange"); 01295 qof_date_free (qd); 01296 qof_time_free (qt); 01297 qd = qof_date_new (); 01298 qd->qd_year = 1812; 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/1812", 01307 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01308 "strftime:US:third"); 01309 do_test ((0 == safe_strcasecmp ("24/07/1812", 01310 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01311 "strftime:UK:third"); 01312 do_test ((0 == safe_strcasecmp ("24.07.1812", 01313 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01314 "strftime:CE:third"); 01315 do_test ((0 == safe_strcasecmp ("1812-07-24", 01316 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01317 "strftime:ISO:third"); 01318 do_test ((0 == safe_strcasecmp ("1812-07-24T06:34:26Z", 01319 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01320 "strftime:UTC:third"); 01321 do_test ((0 == safe_strcasecmp (NULL, 01322 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01323 "strftime:LOCALE:third:outofrange"); 01324 do_test ((0 == safe_strcasecmp (NULL, 01325 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01326 "strftime:CUSTOM:third:outofrange"); 01327 qof_date_free (qd); 01328 qd = qof_date_new (); 01329 qd->qd_year = 1066; 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/1066", 01338 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01339 "strftime:US:fourth"); 01340 do_test ((0 == safe_strcasecmp ("24/07/1066", 01341 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01342 "strftime:UK:fourth"); 01343 do_test ((0 == safe_strcasecmp ("24.07.1066", 01344 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01345 "strftime:CE:fourth"); 01346 do_test ((0 == safe_strcasecmp ("1066-07-24", 01347 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01348 "strftime:ISO:fourth"); 01349 do_test ((0 == safe_strcasecmp ("1066-07-24T06:34:26Z", 01350 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01351 "strftime:UTC:fourth"); 01352 do_test ((0 == safe_strcasecmp (NULL, 01353 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01354 "strftime:LOCALE:fourth:outofrange"); 01355 do_test ((0 == safe_strcasecmp (NULL, 01356 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01357 "strftime:CUSTOM:fourth:outofrange"); 01358 qof_date_free (qd); 01359 qd = qof_date_new (); 01360 qd->qd_year = -45; 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/-045", 01369 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01370 "strftime:US:fifth"); 01371 do_test ((0 == safe_strcasecmp ("24/07/-045", 01372 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01373 "strftime:UK:fifth"); 01374 do_test ((0 == safe_strcasecmp ("24.07.-045", 01375 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01376 "strftime:CE:fifth"); 01377 do_test ((0 == safe_strcasecmp ("-045-07-24", 01378 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01379 "strftime:ISO:fifth"); 01380 do_test ((0 == safe_strcasecmp ("-045-07-24T06:34:26Z", 01381 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01382 "strftime:UTC:fifth"); 01383 do_test ((0 == safe_strcasecmp (NULL, 01384 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01385 "strftime:LOCALE:fifth:outofrange"); 01386 do_test ((0 == safe_strcasecmp (NULL, 01387 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01388 "strftime:CUSTOM:fifth:outofrange"); 01389 qof_date_free (qd); 01390 qd = qof_date_new (); 01391 qd->qd_year = -4500; 01392 qd->qd_mon = 07; 01393 qd->qd_mday = 24; 01394 qd->qd_hour = 06; 01395 qd->qd_min = 34; 01396 qd->qd_sec = 26; 01397 do_test ((qof_date_valid (qd)), "date not valid"); 01398 qt = qof_date_to_qtime (qd); 01399 do_test ((0 == safe_strcasecmp ("07/24/-4500", 01400 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01401 "strftime:US:sixth"); 01402 do_test ((0 == safe_strcasecmp ("24/07/-4500", 01403 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01404 "strftime:UK:sixth"); 01405 do_test ((0 == safe_strcasecmp ("24.07.-4500", 01406 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01407 "strftime:CE:sixth"); 01408 do_test ((0 == safe_strcasecmp ("-4500-07-24", 01409 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01410 "strftime:ISO:sixth"); 01411 do_test ((0 == safe_strcasecmp ("-4500-07-24T06:34:26Z", 01412 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01413 "strftime:UTC:sixth"); 01414 do_test ((0 == safe_strcasecmp (NULL, 01415 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01416 "strftime:LOCALE:sixth:outofrange"); 01417 do_test ((0 == safe_strcasecmp (NULL, 01418 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01419 "strftime:CUSTOM:sixth:outofrange"); 01420 qof_date_free (qd); 01421 qd = qof_date_new (); 01422 qd->qd_year = -4500000; 01423 qd->qd_mon = 07; 01424 qd->qd_mday = 24; 01425 qd->qd_hour = 06; 01426 qd->qd_min = 34; 01427 qd->qd_sec = 26; 01428 do_test ((qof_date_valid (qd)), "date not valid"); 01429 qt = qof_date_to_qtime (qd); 01430 do_test ((0 == safe_strcasecmp ("07/24/-4500000", 01431 qof_date_print (qd, QOF_DATE_FORMAT_US))), 01432 "strftime:US:seventh"); 01433 do_test ((0 == safe_strcasecmp ("24/07/-4500000", 01434 qof_date_print (qd, QOF_DATE_FORMAT_UK))), 01435 "strftime:UK:seventh"); 01436 do_test ((0 == safe_strcasecmp ("24.07.-4500000", 01437 qof_date_print (qd, QOF_DATE_FORMAT_CE))), 01438 "strftime:CE:seventh"); 01439 do_test ((0 == safe_strcasecmp ("-4500000-07-24", 01440 qof_date_print (qd, QOF_DATE_FORMAT_ISO))), 01441 "strftime:ISO:seventh"); 01442 do_test ((0 == safe_strcasecmp ("-4500000-07-24T06:34:26Z", 01443 qof_date_print (qd, QOF_DATE_FORMAT_UTC))), 01444 "strftime:UTC:seventh"); 01445 do_test ((0 == safe_strcasecmp (NULL, 01446 qof_date_print (qd, QOF_DATE_FORMAT_LOCALE))), 01447 "strftime:LOCALE:seventh:outofrange"); 01448 do_test ((0 == safe_strcasecmp (NULL, 01449 qof_date_print (qd, QOF_DATE_FORMAT_CUSTOM))), 01450 "strftime:CUSTOM:seventh:outofrange"); 01451 qof_date_free (qd); 01452 } 01453 } 01454 01455 static void 01456 run_qoftime_test (void) 01457 { 01458 QofTime *time, *cmp, *diff; 01459 01460 time = qof_time_new (); 01461 do_test ((time != NULL), "failed to initialise QofTime."); 01462 /* basic tests */ 01463 { 01464 qof_time_set_secs (time, 796179600); 01465 do_test ((qof_time_get_secs (time) > 0), "failed to set secs"); 01466 do_test ((time != NULL), "error found"); 01467 qof_time_set_secs (time, 0); 01468 qof_time_set_nanosecs (time, 2041020040); 01469 do_test ((qof_time_get_secs (time) > 0), "failed to normalise."); 01470 do_test ((time != NULL), "error found"); 01471 do_test ((qof_time_get_nanosecs (time) > 0), 01472 "failed to set nanosecs"); 01473 } 01474 /* calculation and comparison tests */ 01475 { 01476 qof_time_add_secs (time, -1143943200); 01477 do_test ((qof_time_get_secs (time) < 0), "failed to subtract."); 01478 do_test ((time != NULL), "error found"); 01479 cmp = qof_time_new (); 01480 qof_time_set_secs (cmp, 0); 01481 do_test ((qof_time_equal (time, cmp) == FALSE), "test equal failed."); 01482 do_test ((qof_time_cmp (time, cmp) == -1), "compare cmp test"); 01483 diff = qof_time_new (); 01484 qof_time_set_secs (diff, qof_time_get_secs (cmp)); 01485 do_test ((qof_time_cmp (diff, cmp) == 0), "compare diff test"); 01486 qof_time_free (diff); 01487 diff = qof_time_diff (time, cmp); 01488 do_test ((qof_time_get_secs (diff) < 0), "diff of negative value"); 01489 qof_time_free (diff); 01490 diff = qof_time_diff (cmp, time); 01491 do_test ((qof_time_get_secs (diff) > 0), "diff of negative value"); 01492 time = qof_time_abs (time); 01493 do_test ((qof_time_get_nanosecs (time) != 0), "abs failed"); 01494 qof_time_set_secs (cmp, qof_time_get_secs (time)); 01495 qof_time_set_nanosecs (cmp, qof_time_get_nanosecs (time)); 01496 do_test ((qof_time_equal (cmp, time) == TRUE), 01497 "equality test failed"); 01498 qof_time_free (cmp); 01499 qof_time_free (time); 01500 } 01501 /* gdate basic tests */ 01502 { 01503 GDate *date, *test; 01504 GTimeVal gtv; 01505 01506 date = g_date_new_dmy (15, 5, 2006); 01507 time = qof_time_from_gdate (date); 01508 test = qof_time_to_gdate (time); 01509 do_test ((g_date_get_day (test) == 15), "gdate day fail"); 01510 do_test ((g_date_get_month (test) == 5), "gdate month fail"); 01511 do_test ((g_date_get_year (test) == 2006), "gdate year fail"); 01512 do_test ((qof_time_to_gtimeval (time, >v)), "gtimeval fail"); 01513 { 01514 QofTime *copy, *diff; 01515 01516 qof_time_add_secs (time, 26451); 01517 copy = qof_time_add_secs_copy (time, -26451); 01518 diff = qof_time_diff (time, copy); 01519 do_test ((qof_time_get_secs (diff) == 26451), 01520 "add seconds failed"); 01521 qof_time_free (copy); 01522 qof_time_free (diff); 01523 } 01524 g_date_free (date); 01525 g_date_free (test); 01526 qof_time_free (time); 01527 } 01528 /* gdate comparison tests */ 01529 { 01530 GDate *date, *cmp; 01531 gint64 time_secs, diff; 01532 glong time_nano; 01533 01534 date = g_date_new_dmy (15, 5, 2006); 01535 time = qof_time_from_gdate (date); 01536 cmp = qof_time_to_gdate (time); 01537 do_test ((g_date_compare (date, cmp) == 0), 01538 "convert to and from gdate failed"); 01539 g_date_free (cmp); 01540 time_secs = qof_time_get_secs (time); 01541 time_nano = qof_time_get_nanosecs (time); 01542 qof_time_add_secs (time, 7252); 01543 qof_time_set_nanosecs (time, 123456); 01544 do_test ((qof_time_set_day_start (time)), "set_day_start failed"); 01545 do_test ((qof_time_get_secs (time) == time_secs), 01546 "start of day incorrect"); 01547 do_test ((qof_time_get_nanosecs (time) == 0), 01548 "set nano at day start incorrect"); 01549 do_test ((qof_time_set_day_middle (time) == TRUE), 01550 "set_day_middle failed"); 01551 diff = qof_time_get_secs (time) - time_secs; 01552 do_test (diff == (SECS_PER_DAY / 2), "middle of day incorrect"); 01553 /* convert middle of day back to date */ 01554 cmp = qof_time_to_gdate (time); 01555 do_test ((g_date_compare (date, cmp) == 0), 01556 "middle of day not the same as original day"); 01557 g_date_free (cmp); 01558 01559 do_test ((qof_time_set_day_end (time)), "set_day_end failed"); 01560 do_test ((qof_time_get_secs (time) - time_secs) 01561 == (SECS_PER_DAY - 1), "end of day incorrect"); 01562 01563 /* convert end of day back to date */ 01564 cmp = qof_time_to_gdate (time); 01565 01566 do_test ((g_date_compare (date, cmp) == 0), 01567 "end of day not the same as original day"); 01568 qof_time_free (time); 01569 g_date_free (cmp); 01570 g_date_free (date); 01571 } 01572 /* QofTime today tests */ 01573 { 01574 GTimeVal *current; 01575 gint64 time_secs; 01576 QofTime *diff; 01577 01578 current = qof_time_get_current_start (); 01579 diff = qof_time_new (); 01580 qof_time_from_gtimeval (diff, current); 01581 time_secs = qof_time_get_secs (diff); 01582 time = qof_time_get_today_start (); 01583 do_test ((qof_time_get_secs (time) == time_secs), 01584 "start of day incorrect"); 01585 do_test ((qof_time_get_nanosecs (time) == 0), 01586 "today start nanosecs non zero"); 01587 qof_time_free (time); 01588 time = qof_time_get_today_end (); 01589 time_secs += SECS_PER_DAY - 1; 01590 do_test ((qof_time_get_secs (time) == time_secs), 01591 "start of today incorrect"); 01592 do_test ((qof_time_get_nanosecs (time) == 0), 01593 "today start nanosecs non zero"); 01594 qof_time_free (time); 01595 } 01596 /* last mday test */ 01597 { 01598 GDate *date; 01599 guint8 mday; 01600 01601 date = g_date_new_dmy (15, 5, 2006); 01602 time = qof_time_from_gdate (date); 01603 mday = qof_time_last_mday (time); 01604 do_test ((mday == 31), " wrong last day of May"); 01605 } 01606 /* qof_date_get_mday and qof_date_get_yday tests */ 01607 { 01608 QofDate *d; 01609 /* Wed 3rd Sep 2003 = 246. */ 01610 do_test ((246 == qof_date_get_yday (3, 9, 2003)), 01611 "get year day test, September"); 01612 d = qof_date_new (); 01613 d->qd_mday = 3; 01614 d->qd_mon = 9; 01615 d->qd_year = 2003; 01616 do_test ((TRUE == qof_date_valid (d)), 01617 "3/9/2003 not valid"); 01618 do_test ((3 == d->qd_wday), "not Wednesday"); 01619 qof_date_free (d); 01620 /* Fri 3rd Sep 2004 = 247. */ 01621 do_test ((247 == qof_date_get_yday (3, 9, 2004)), 01622 "get year day test, leap year"); 01623 d = qof_date_new (); 01624 d->qd_mday = 3; 01625 d->qd_mon = 9; 01626 d->qd_year = 2004; 01627 do_test ((TRUE == qof_date_valid (d)), 01628 "3/9/2003 not valid"); 01629 do_test ((5 == d->qd_wday), "not Friday"); 01630 qof_date_free (d); 01631 /* Sun 19th May 2002 = 139. */ 01632 do_test ((139 == qof_date_get_yday (19, 5, 2002)), 01633 "get year day test, May"); 01634 d = qof_date_new (); 01635 d->qd_mday = 19; 01636 d->qd_mon = 5; 01637 d->qd_year = 2002; 01638 do_test ((TRUE == qof_date_valid (d)), 01639 "3/9/2003 not valid"); 01640 do_test ((0 == d->qd_wday), "not Sunday"); 01641 qof_date_free (d); 01642 /* Wed 19th May 2004 = 140. */ 01643 do_test ((140 == qof_date_get_yday (19, 5, 2004)), 01644 "get year day test, May"); 01645 d = qof_date_new (); 01646 d->qd_mday = 19; 01647 d->qd_mon = 5; 01648 d->qd_year = 2004; 01649 do_test ((TRUE == qof_date_valid (d)), 01650 "3/9/2003 not valid"); 01651 do_test ((3 == d->qd_wday), "not Wednesday, May"); 01652 qof_date_free (d); 01653 /* Nov 2003 = 30 */ 01654 do_test ((30 == qof_date_get_mday (11, 2003)), 01655 "get days in month, non-leap"); 01656 /* Feb 2004 = 29 */ 01657 do_test ((29 == qof_date_get_mday (2, 2004)), 01658 "get days in month, leap year"); 01659 } 01660 /* time to dmy test */ 01661 { 01662 gboolean success; 01663 guint8 day, month; 01664 guint16 year; 01665 GDate *date; 01666 QofTime *reverse; 01667 01668 date = g_date_new_dmy (15, 5, 2006); 01669 time = qof_time_from_gdate (date); 01670 success = qof_time_to_dmy (time, &day, &month, &year); 01671 do_test ((success == TRUE), "time to dmy failed"); 01672 do_test ((day == 15), "wrong day calculated"); 01673 do_test ((month == 5), "wrong month calculated"); 01674 do_test ((year == 2006), "wrong year calculated"); 01675 reverse = qof_time_dmy_to_time (day, month, year); 01676 do_test ((qof_time_cmp (time, reverse) == 0), "dmy to time failed"); 01677 g_date_free (date); 01678 qof_time_free (time); 01679 qof_time_free (reverse); 01680 } 01681 { 01682 /* day, month, year wrapping */ 01683 QofTime *wrap_t; 01684 QofDate *wrap_d; 01685 glong day, month, year; 01686 01687 /* Thu Jul 13 18:20:27 UTC 2006 */ 01688 wrap_t = qof_time_set (1152814827, 345634); 01689 wrap_d = qof_date_from_qtime (wrap_t); 01690 PINFO (" base date for section = %s", 01691 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01692 day = wrap_d->qd_mday; 01693 month = wrap_d->qd_mon; 01694 year = wrap_d->qd_year; 01695 qof_date_free (wrap_d); 01696 /* one day ago */ 01697 wrap_d = qof_date_from_qtime (wrap_t); 01698 wrap_d->qd_mday -= 1; 01699 qof_date_valid (wrap_d); 01700 do_test ((wrap_d->qd_mon == month && 01701 wrap_d->qd_year == year && 01702 wrap_d->qd_mday == (day - 1)), 01703 " this time on previous day"); 01704 PINFO (" same time previous day = %s", 01705 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01706 qof_date_free (wrap_d); 01707 /* this time last month */ 01708 wrap_d = qof_date_from_qtime (wrap_t); 01709 wrap_d->qd_mon -= 1; 01710 qof_date_valid (wrap_d); 01711 do_test ((wrap_d->qd_mon == (month - 1) && 01712 wrap_d->qd_year == year && 01713 wrap_d->qd_mday == day), 01714 " this time last month"); 01715 PINFO (" same time previous month = %s", 01716 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01717 qof_date_free (wrap_d); 01718 /* this time last year */ 01719 wrap_d = qof_date_from_qtime (wrap_t); 01720 wrap_d->qd_year -= 1; 01721 qof_date_valid (wrap_d); 01722 do_test ((wrap_d->qd_mon == month && 01723 wrap_d->qd_year == (year - 1) && 01724 wrap_d->qd_mday == day), 01725 " this time last year"); 01726 PINFO (" same time previous year = %s", 01727 qof_date_print (wrap_d, QOF_DATE_FORMAT_ISO8601)); 01728 qof_time_free (wrap_t); 01729 qof_date_free (wrap_d); 01730 } 01731 } 01732 01733 int 01734 main (void) 01735 { 01736 qof_init (); 01737 #ifdef TEST_DEBUG 01738 qof_log_init_filename ("test-date.trace"); 01739 qof_log_set_default (QOF_LOG_DETAIL); 01740 ENTER (" "); 01741 #endif 01742 test_date_init (); 01743 run_qoftime_test (); 01744 run_qofdate_test (); 01745 run_print_scan_tests (); 01746 g_list_foreach (test_data, check_date_cycles, NULL); 01747 print_test_results (); 01748 test_date_close (); 01749 #ifdef TEST_DEBUG 01750 LEAVE (" "); 01751 qof_log_shutdown (); 01752 #endif 01753 qof_close (); 01754 exit (get_rv ()); 01755 }