* Improved the parsedate() test to produce a reliable test case (with a fixed

"now", and given expected results).
* Now only prints failures, unless you give a command argument (which just
  enables verbose output).


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@32121 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2009-08-05 09:47:20 +00:00
parent e61adaa1d4
commit 3471097486

View File

@ -1,7 +1,7 @@
/* /*
** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de.
** Distributed under the terms of the OpenBeOS License. * Distributed under the terms of the MIT License.
*/ */
#include <SupportDefs.h> #include <SupportDefs.h>
@ -9,24 +9,26 @@
#include <stdio.h> #include <stdio.h>
// this file can also be compiled against the R5 parsedate() implementation
#ifndef PARSEDATE_INVALID_DATE #define ABSOLUTE 0
# define PARSEDATE_INVALID_DATE 4 #define UNKNOWN 0
# define PARSEDATE_MINUTE_RELATIVE_TIME 8 #define DAY_RELATIVE PARSEDATE_RELATIVE_TIME
#endif #define MINUTE_RELATIVE (PARSEDATE_RELATIVE_TIME \
| PARSEDATE_MINUTE_RELATIVE_TIME)
#define INVALID PARSEDATE_INVALID_DATE
char * char*
parsedate_flags_to_string(time_t result, int flags) parsedate_flags_to_string(time_t result, int flags)
{ {
if (result == -1) { if (result == -1) {
if (flags & PARSEDATE_INVALID_DATE) if ((flags & PARSEDATE_INVALID_DATE) != 0)
return "invalid"; return "invalid";
return "unknown"; return "unknown";
} }
if (flags & PARSEDATE_RELATIVE_TIME) { if ((flags & PARSEDATE_RELATIVE_TIME) != 0) {
if (flags & PARSEDATE_MINUTE_RELATIVE_TIME) if ((flags & PARSEDATE_MINUTE_RELATIVE_TIME) != 0)
return "minute relative"; return "minute relative";
return "day relative"; return "day relative";
@ -37,60 +39,78 @@ parsedate_flags_to_string(time_t result, int flags)
int int
main(int argc, char **argv) main(int argc, char** argv)
{ {
const char *dates[] = { time_t now = 1249471430;
"last tuesday", // August 5th, 2009, 11:23:50
"today",
"next tuesday", struct test {
"tuesday", time_t result;
"1976-12-15", const char* date;
"5.8.1976", int flags;
"last hour", };
"1 hour", static const test kDates[] = {
"now", {1248739200, "last tuesday", DAY_RELATIVE},
"12/15/1976", {1249430400, "today", DAY_RELATIVE},
"Sat, 08/23/2003", {1249948800, "next tuesday", DAY_RELATIVE},
"Sun, 08/23/2003", {1249344000, "tuesday", DAY_RELATIVE},
"", {1249467830, "last hour", MINUTE_RELATIVE},
"next monday 3:00", {1249475030, "1 hour", MINUTE_RELATIVE},
"thursday 4:42", {now, "now", MINUTE_RELATIVE},
"thursday +4:42", {219456000, "1976-12-15", ABSOLUTE},
"this thursday 4:42", {219456000, "12/15/1976", ABSOLUTE},
"42 minutes", {219456000, "1976/12/15", ABSOLUTE},
"2 weeks", {219456000, "15.12.1976", ABSOLUTE},
"next 5 minutes", {208051200, "5.8.1976", ABSOLUTE},
"last 15 minutes", {1061596800, "Sat, 08/23/2003", ABSOLUTE},
"-15 minutes", {1061596800, "Sun, 08/23/2003", ABSOLUTE},
"3:33pm GMT", {-1, "", INVALID},
"Mon, June 10th, 1993 10:00:03 am GMT", {1249873200, "next monday 3:00", DAY_RELATIVE},
"Sat, 16 Aug Ìîñêîâñêîå âðåìÿ (çèìà)", {1249533720, "thursday 4:42", DAY_RELATIVE},
"Mon, June 10th, 1993 10:00:03 am UTC", {1249533740, "thursday +4:42:20", DAY_RELATIVE},
"Mon, June 10th, 1993 10:00:03 am CEST", {1249533720, "this thursday 4:42", DAY_RELATIVE},
"Mon, June 10th, 1993 10:00:03 am +0000", {1249473950, "42 minutes", MINUTE_RELATIVE},
"Mon, June 10th, 1993 10:00:03 am 0000", // invalid! {1250640000, "2 weeks", DAY_RELATIVE},
"Mon, June 10th, 1993 10:00:03 am +0100", {1249471730, "next 5 minutes", MINUTE_RELATIVE},
"Mon, June 10th, 1993 10:00:03 am -0700", {1249470530, "last 15 minutes", MINUTE_RELATIVE},
"Mon, June 10th, 1993 06:00:03 am ACDT", {1249470530, "-15 minutes", MINUTE_RELATIVE},
NULL {1249486380, "3:33pm GMT", DAY_RELATIVE},
{739706403, "Mon, June 10th, 1993 10:00:03 am GMT", ABSOLUTE},
{-1, "Sat, 16 Aug Ìîñêîâñêîå âðåìÿ (çèìà)", INVALID},
{739706403, "Mon, June 10th, 1993 10:00:03 am UTC", ABSOLUTE},
{739699203, "Mon, June 10th, 1993 10:00:03 am CEST", ABSOLUTE},
{739706403, "Mon, June 10th, 1993 10:00:03 am +0000", ABSOLUTE},
{-1, "Mon, June 10th, 1993 10:00:03 am 0000", UNKNOWN},
{739702803, "Mon, June 10th, 1993 10:00:03 am +0100", ABSOLUTE},
{739731603, "Mon, June 10th, 1993 10:00:03 am -0700", ABSOLUTE},
{739654203, "Mon, June 10th, 1993 06:00:03 am ACDT", ABSOLUTE},
{-1, NULL, 0}
}; };
#if 0 bool verbose = argc > 1;
time_t now = time(NULL);
for (int i = 0; i < 500000; i++) {
int flags = 0;
parsedate_etc(dates[0], now, &flags);
}
#else
// this crashes the R5 version but not ours:
// parsedate(NULL, -1);
for (int32 i = 0; dates[i]; i++) { if (verbose)
printf("All times relative to: %s (%ld)\n", ctime(&now), now);
for (int32 i = 0; kDates[i].date; i++) {
int flags = 0; int flags = 0;
time_t result = parsedate_etc(dates[i], -1, &flags); time_t result = parsedate_etc(kDates[i].date, now, &flags);
printf("\"%s\" = %ld (%s) -> %s", dates[i], result,
parsedate_flags_to_string(result, flags), result == -1 ? "-\n" : ctime(&result)); bool failure = false;
if (flags != kDates[i].flags || result != kDates[i].result)
failure = true;
if (failure) {
printf("FAILURE: parsing time at index %ld (should be %ld, %s)\n",
i, kDates[i].result,
parsedate_flags_to_string(kDates[i].result, flags));
} }
#endif
if (verbose || failure) {
printf("\"%s\" = %ld (%s) -> %s", kDates[i].date, result,
parsedate_flags_to_string(result, flags), result == -1
? "-\n" : ctime(&result));
}
}
return 0; return 0;
} }