1 /* Test that posixtime works as required.
2 Copyright (C) 2011-2016 Free Software Foundation, Inc.
4 This program is free software: you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17 /* Written by Jim Meyering. */
29 #define STREQ(a, b) (strcmp (a, b) == 0)
39 static struct posixtm_test const T[] =
41 { 1300000000, 0, "%F", "2011-03-13" },
42 { 0, 10, "%T.%N", "00:00:00.000000010" },
52 for (i = 0; T[i].fmt; i++)
56 struct tm *tm = gmtime (&t);
61 n = nstrftime (buf, sizeof buf, T[i].fmt, tm, 0, T[i].in_ns);
65 printf ("nstrftime failed with format %s\n", T[i].fmt);
68 if (! STREQ (buf, T[i].exp))
71 printf ("%s: result mismatch: got %s, expected %s\n",
72 T[i].fmt, buf, T[i].exp);
85 static struct tzalloc_test TZ[] =
88 { 0, "PST8PDT,M3.2.0,M11.1.0" },
94 { 0, "CET-1CEST,M3.5.0,M10.5.0/3" },
98 { 0, "NZST-12NZDT,M9.5.0,M4.1.0/3" },
102 struct localtime_rz_test
104 /* Input parameters. */
105 struct tzalloc_test *tza;
108 /* Expected result. */
111 /* Determines if an incorrectly unset tm_isdst
112 results in failure or just a warning. */
116 static struct localtime_rz_test LT[] =
118 { TZ+Pacific, 0, "1969-12-31 16:00:00 -0800 (PST)", 0 },
119 { TZ+Arizona, 0, "1969-12-31 17:00:00 -0700 (MST)", 0 },
120 { TZ+UTC , 0, "1970-01-01 00:00:00 +0000 (UTC)", 0 },
121 { TZ+CentEur, 0, "1970-01-01 01:00:00 +0100 (CET)", 0 },
122 { TZ+Japan , 0, "1970-01-01 09:00:00 +0900 (JST)", 0 },
123 { TZ+NZ , 0, "1970-01-01 13:00:00 +1300 (NZDT)", 1 },
124 { TZ+Pacific, 500000001, "1985-11-04 16:53:21 -0800 (PST)", 0 },
125 { TZ+Arizona, 500000001, "1985-11-04 17:53:21 -0700 (MST)", 0 },
126 { TZ+UTC , 500000001, "1985-11-05 00:53:21 +0000 (UTC)", 0 },
127 { TZ+CentEur, 500000001, "1985-11-05 01:53:21 +0100 (CET)", 1 },
128 { TZ+Japan , 500000001, "1985-11-05 09:53:21 +0900 (JST)", 0 },
129 { TZ+NZ , 500000001, "1985-11-05 13:53:21 +1300 (NZDT)", 0 },
130 { TZ+Pacific, 1000000002, "2001-09-08 18:46:42 -0700 (PDT)", 0 },
131 { TZ+Arizona, 1000000002, "2001-09-08 18:46:42 -0700 (MST)", 0 },
132 { TZ+UTC , 1000000002, "2001-09-09 01:46:42 +0000 (UTC)", 0 },
133 { TZ+CentEur, 1000000002, "2001-09-09 03:46:42 +0200 (CEST)", 0 },
134 { TZ+Japan , 1000000002, "2001-09-09 10:46:42 +0900 (JST)", 0 },
135 { TZ+NZ , 1000000002, "2001-09-09 13:46:42 +1200 (NZST)", 0 },
145 for (i = 0; LT[i].tza; i++)
147 struct tzalloc_test *tza = LT[i].tza;
149 timezone_t tz = tza->tz;
151 static char const format[] = "%Y-%m-%d %H:%M:%S %z (%Z)";
156 if (!tz && tza->setting)
158 tz = tzalloc (tza->setting);
162 printf ("%s: tzalloc: %s\n", TZ[i].setting, strerror (errno));
168 setting = tza->setting ? tza->setting : "UTC0";
170 if (!localtime_rz (tz, <[i].t, &tm))
173 printf ("%s: %ld: localtime_rz: %s\n", setting, lt,
178 n = nstrftime (buf, sizeof buf, format, &tm, tz, 0);
182 printf ("%s: %ld: nstrftime failed\n", setting, lt);
186 if (! (STREQ (buf, LT[i].exp)
187 || (!tz && n == strlen (LT[i].exp)
188 && memcmp (buf, LT[i].exp, n - sizeof "(GMT)" + 1) == 0
189 && STREQ (buf + n - sizeof "(GMT)" + 1, "(GMT)"))))
191 /* Don't fail for unhandled dst in ahistorical entries,
192 as gnulib doesn't currently fix that issue, seen on Darwin 14. */
193 if (!LT[i].ahistorical || tm.tm_isdst)
195 printf ("%s: expected \"%s\", got \"%s\"\n",
196 setting, LT[i].exp, buf);
207 fail |= posixtm_test ();
208 fail |= tzalloc_test ();
214 indent-tabs-mode: nil