| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <time.h> |
| |
| struct |
| { |
| time_t when; |
| const char *tz; |
| const char *result; |
| } tests[] = |
| { |
| { 909312849L, "AEST-10AEDST-11,M10.5.0,M3.5.0", |
| "1998/10/25 21:54:09 dst=1 zone=AEDST" }, |
| { 924864849L, "AEST-10AEDST-11,M10.5.0,M3.5.0", |
| "1999/04/23 20:54:09 dst=0 zone=AEST" }, |
| { 919973892L, "AEST-10AEDST-11,M10.5.0,M3.5.0", |
| "1999/02/26 07:18:12 dst=1 zone=AEDST" }, |
| { 909312849L, "EST+5EDT,M4.1.0/2,M10.5.0/2", |
| "1998/10/25 05:54:09 dst=0 zone=EST" }, |
| { 909312849L, "EST5EDT,M4.1.0/2,M10.5.0/2", |
| "1998/10/25 05:54:09 dst=0 zone=EST" }, |
| { 909312849L, "<EST5>5EDT,M4.1.0/2,M10.5.0/2", |
| "1998/10/25 05:54:09 dst=0 zone=EST5" }, |
| { 924864849L, "EST+5EDT,M4.1.0/2,M10.5.0/2", |
| "1999/04/23 06:54:09 dst=1 zone=EDT" }, |
| { 919973892L, "EST+5EDT,M4.1.0/2,M10.5.0/2", |
| "1999/02/25 15:18:12 dst=0 zone=EST" }, |
| }; |
| |
| int |
| main (void) |
| { |
| int result = 0; |
| size_t cnt; |
| |
| for (cnt = 0; cnt < sizeof (tests) / sizeof (tests[0]); ++cnt) |
| { |
| char buf[100]; |
| struct tm *tmp; |
| |
| printf ("TZ = \"%s\", time = %ld => ", tests[cnt].tz, tests[cnt].when); |
| fflush (stdout); |
| |
| setenv ("TZ", tests[cnt].tz, 1); |
| |
| tmp = localtime (&tests[cnt].when); |
| |
| snprintf (buf, sizeof (buf), |
| "%04d/%02d/%02d %02d:%02d:%02d dst=%d zone=%s", |
| tmp->tm_year + 1900, tmp->tm_mon + 1, tmp->tm_mday, |
| tmp->tm_hour, tmp->tm_min, tmp->tm_sec, tmp->tm_isdst, |
| tzname[tmp->tm_isdst ? 1 : 0]); |
| |
| fputs (buf, stdout); |
| |
| if (strcmp (buf, tests[cnt].result) == 0) |
| puts (", OK"); |
| else |
| { |
| result = 1; |
| puts (", FAIL"); |
| } |
| } |
| |
| setenv ("TZ", "Universal", 1); |
| localtime (&tests[0].when); |
| printf ("TZ = \"Universal\" daylight %d tzname = { \"%s\", \"%s\" }", |
| daylight, tzname[0], tzname[1]); |
| if (! daylight) |
| puts (", OK"); |
| else |
| { |
| result = 1; |
| puts (", FAIL"); |
| } |
| |
| setenv ("TZ", "AEST-10AEDST-11,M10.5.0,M3.5.0", 1); |
| tzset (); |
| printf ("TZ = \"AEST-10AEDST-11,M10.5.0,M3.5.0\" daylight %d" |
| " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]); |
| if (daylight |
| && strcmp (tzname[0], "AEST") == 0 && strcmp (tzname[1], "AEDST") == 0) |
| puts (", OK"); |
| else |
| { |
| result = 1; |
| puts (", FAIL"); |
| } |
| |
| setenv ("TZ", "<AB1>-10<AB2>-11,M10.5.0,M3.5.0", 1); |
| tzset (); |
| printf ("TZ = \"<AB1>-10<AB2>-11,M10.5.0,M3.5.0\" daylight %d" |
| " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]); |
| if (daylight |
| && strcmp (tzname[0], "AB1") == 0 && strcmp (tzname[1], "AB2") == 0) |
| puts (", OK"); |
| else |
| { |
| result = 1; |
| puts (", FAIL"); |
| } |
| |
| setenv ("TZ", "<BB1>-10", 1); |
| tzset (); |
| printf ("TZ = \"<BB1>-10\" daylight %d" |
| " tzname = { \"%s\", \"%s\" }", daylight, tzname[0], tzname[1]); |
| if (daylight == 0 |
| && strcmp (tzname[0], "BB1") == 0 && strcmp (tzname[1], "BB1") == 0) |
| puts (", OK"); |
| else |
| { |
| result = 1; |
| puts (", FAIL"); |
| } |
| |
| return result; |
| } |