xref: /freebsd-src/contrib/netbsd-tests/lib/libc/time/t_strptime.c (revision 2a22df74e9fceaffd62ee437de08383d6cf8cfe0)
1640235e2SEnji Cooper /* $NetBSD: t_strptime.c,v 1.12 2015/10/31 02:25:11 christos Exp $ */
257718be8SEnji Cooper 
357718be8SEnji Cooper /*-
457718be8SEnji Cooper  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
557718be8SEnji Cooper  * All rights reserved.
657718be8SEnji Cooper  *
757718be8SEnji Cooper  * This code is derived from software contributed to The NetBSD Foundation
857718be8SEnji Cooper  * by David Laight.
957718be8SEnji Cooper  *
1057718be8SEnji Cooper  * Redistribution and use in source and binary forms, with or without
1157718be8SEnji Cooper  * modification, are permitted provided that the following conditions
1257718be8SEnji Cooper  * are met:
1357718be8SEnji Cooper  * 1. Redistributions of source code must retain the above copyright
1457718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer.
1557718be8SEnji Cooper  * 2. Redistributions in binary form must reproduce the above copyright
1657718be8SEnji Cooper  *    notice, this list of conditions and the following disclaimer in the
1757718be8SEnji Cooper  *    documentation and/or other materials provided with the distribution.
1857718be8SEnji Cooper  *
1957718be8SEnji Cooper  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2057718be8SEnji Cooper  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2157718be8SEnji Cooper  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2257718be8SEnji Cooper  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2357718be8SEnji Cooper  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2457718be8SEnji Cooper  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2557718be8SEnji Cooper  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2657718be8SEnji Cooper  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2757718be8SEnji Cooper  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2857718be8SEnji Cooper  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2957718be8SEnji Cooper  * POSSIBILITY OF SUCH DAMAGE.
3057718be8SEnji Cooper  */
3157718be8SEnji Cooper 
3257718be8SEnji Cooper #include <sys/cdefs.h>
3357718be8SEnji Cooper __COPYRIGHT("@(#) Copyright (c) 2008\
3457718be8SEnji Cooper  The NetBSD Foundation, inc. All rights reserved.");
35640235e2SEnji Cooper __RCSID("$NetBSD: t_strptime.c,v 1.12 2015/10/31 02:25:11 christos Exp $");
3657718be8SEnji Cooper 
3757718be8SEnji Cooper #include <time.h>
38640235e2SEnji Cooper #include <stdlib.h>
39640235e2SEnji Cooper #include <stdio.h>
4057718be8SEnji Cooper 
4157718be8SEnji Cooper #include <atf-c.h>
4257718be8SEnji Cooper 
4357718be8SEnji Cooper static void
h_pass(const char * buf,const char * fmt,int len,int tm_sec,int tm_min,int tm_hour,int tm_mday,int tm_mon,int tm_year,int tm_wday,int tm_yday)4457718be8SEnji Cooper h_pass(const char *buf, const char *fmt, int len,
4557718be8SEnji Cooper     int tm_sec, int tm_min, int tm_hour, int tm_mday,
4657718be8SEnji Cooper     int tm_mon, int tm_year, int tm_wday, int tm_yday)
4757718be8SEnji Cooper {
4857718be8SEnji Cooper 	struct tm tm = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL };
4957718be8SEnji Cooper 	const char *ret, *exp;
5057718be8SEnji Cooper 
5157718be8SEnji Cooper 	exp = buf + len;
5257718be8SEnji Cooper 	ret = strptime(buf, fmt, &tm);
5357718be8SEnji Cooper 
54ff0ba872SEnji Cooper #ifdef __FreeBSD__
55e58fb51fSEnji Cooper 	ATF_CHECK_MSG(ret == exp,
56e58fb51fSEnji Cooper 	    "strptime(\"%s\", \"%s\", tm): incorrect return code: "
57e58fb51fSEnji Cooper 	    "expected: %p, got: %p", buf, fmt, exp, ret);
58e58fb51fSEnji Cooper 
59e58fb51fSEnji Cooper #define H_REQUIRE_FIELD(field)						\
60e58fb51fSEnji Cooper 		ATF_CHECK_MSG(tm.field == field,			\
61e58fb51fSEnji Cooper 		    "strptime(\"%s\", \"%s\", tm): incorrect %s: "	\
62e58fb51fSEnji Cooper 		    "expected: %d, but got: %d", buf, fmt,		\
63e58fb51fSEnji Cooper 		    ___STRING(field), field, tm.field)
64e58fb51fSEnji Cooper #else
6557718be8SEnji Cooper 	ATF_REQUIRE_MSG(ret == exp,
6657718be8SEnji Cooper 	    "strptime(\"%s\", \"%s\", tm): incorrect return code: "
6757718be8SEnji Cooper 	    "expected: %p, got: %p", buf, fmt, exp, ret);
6857718be8SEnji Cooper 
6957718be8SEnji Cooper #define H_REQUIRE_FIELD(field)						\
7057718be8SEnji Cooper 		ATF_REQUIRE_MSG(tm.field == field,			\
7157718be8SEnji Cooper 		    "strptime(\"%s\", \"%s\", tm): incorrect %s: "	\
7257718be8SEnji Cooper 		    "expected: %d, but got: %d", buf, fmt,		\
7357718be8SEnji Cooper 		    ___STRING(field), field, tm.field)
74e58fb51fSEnji Cooper #endif
7557718be8SEnji Cooper 
7657718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_sec);
7757718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_min);
7857718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_hour);
7957718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_mday);
8057718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_mon);
8157718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_year);
8257718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_wday);
8357718be8SEnji Cooper 	H_REQUIRE_FIELD(tm_yday);
8457718be8SEnji Cooper 
8557718be8SEnji Cooper #undef H_REQUIRE_FIELD
8657718be8SEnji Cooper }
8757718be8SEnji Cooper 
8857718be8SEnji Cooper static void
h_fail(const char * buf,const char * fmt)8957718be8SEnji Cooper h_fail(const char *buf, const char *fmt)
9057718be8SEnji Cooper {
9157718be8SEnji Cooper 	struct tm tm = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, NULL };
9257718be8SEnji Cooper 
93ff0ba872SEnji Cooper #ifdef __FreeBSD__
94e58fb51fSEnji Cooper 	ATF_CHECK_MSG(strptime(buf, fmt, &tm) == NULL, "strptime(\"%s\", "
95e58fb51fSEnji Cooper 	    "\"%s\", &tm) should fail, but it didn't", buf, fmt);
96e58fb51fSEnji Cooper #else
9757718be8SEnji Cooper 	ATF_REQUIRE_MSG(strptime(buf, fmt, &tm) == NULL, "strptime(\"%s\", "
9857718be8SEnji Cooper 	    "\"%s\", &tm) should fail, but it didn't", buf, fmt);
99e58fb51fSEnji Cooper #endif
10057718be8SEnji Cooper }
10157718be8SEnji Cooper 
102640235e2SEnji Cooper static struct {
103640235e2SEnji Cooper 	const char *name;
104640235e2SEnji Cooper 	long offs;
105640235e2SEnji Cooper } zt[] = {
106281c2989SYuri Pankov #ifndef __FreeBSD__
107640235e2SEnji Cooper 	{ "Z",				0 },
108640235e2SEnji Cooper 	{ "UT",				0 },
109640235e2SEnji Cooper 	{ "UTC",			0 },
110640235e2SEnji Cooper 	{ "GMT",			0 },
111640235e2SEnji Cooper 	{ "EST",			-18000 },
112640235e2SEnji Cooper 	{ "EDT",			-14400 },
113640235e2SEnji Cooper 	{ "CST",			-21600 },
114640235e2SEnji Cooper 	{ "CDT",			-18000 },
115640235e2SEnji Cooper 	{ "MST",			-25200 },
116640235e2SEnji Cooper 	{ "MDT",			-21600 },
117640235e2SEnji Cooper 	{ "PST",			-28800 },
118640235e2SEnji Cooper 	{ "PDT",			-25200 },
119640235e2SEnji Cooper 
120640235e2SEnji Cooper 	{ "VST",			-1 },
121640235e2SEnji Cooper 	{ "VDT",			-1 },
122640235e2SEnji Cooper 
123640235e2SEnji Cooper 	{ "+03",			10800 },
124640235e2SEnji Cooper 	{ "-03",			-10800 },
125640235e2SEnji Cooper 	{ "+0403",			14580 },
126640235e2SEnji Cooper 	{ "-0403",			-14580 },
127640235e2SEnji Cooper 	{ "+04:03",			14580 },
128640235e2SEnji Cooper 	{ "-04:03",			-14580 },
129640235e2SEnji Cooper 	{ "+14:00",			50400 },
130640235e2SEnji Cooper 	{ "-14:00",			-50400 },
131640235e2SEnji Cooper 	{ "+23:59",			86340 },
132640235e2SEnji Cooper 	{ "-23:59",			-86340 },
133640235e2SEnji Cooper 
134640235e2SEnji Cooper 	{ "1",				-1 },
135640235e2SEnji Cooper 	{ "03",				-1 },
136640235e2SEnji Cooper 	{ "0304",			-1 },
137640235e2SEnji Cooper 	{ "+1",				-1 },
138640235e2SEnji Cooper 	{ "-203",			-1 },
139640235e2SEnji Cooper 	{ "+12345",			-1 },
140640235e2SEnji Cooper 	{ "+12:345",			-1 },
141640235e2SEnji Cooper 	{ "+123:45",			-1 },
142640235e2SEnji Cooper 	{ "+2400",			-1 },
143640235e2SEnji Cooper 	{ "-2400",			-1 },
144640235e2SEnji Cooper 	{ "+1060",			-1 },
145640235e2SEnji Cooper 	{ "-1060",			-1 },
146640235e2SEnji Cooper 
147640235e2SEnji Cooper 	{ "A",				-3600 },
148640235e2SEnji Cooper 	{ "B",				-7200 },
149640235e2SEnji Cooper 	{ "C",				-10800 },
150640235e2SEnji Cooper 	{ "D",				-14400 },
151640235e2SEnji Cooper 	{ "E",				-18000 },
152640235e2SEnji Cooper 	{ "F",				-21600 },
153640235e2SEnji Cooper 	{ "G",				-25200 },
154640235e2SEnji Cooper 	{ "H",				-28800 },
155640235e2SEnji Cooper 	{ "I",				-32400 },
156640235e2SEnji Cooper 	{ "L",				-39600 },
157640235e2SEnji Cooper 	{ "M",				-43200 },
158640235e2SEnji Cooper 	{ "N",				3600 },
159640235e2SEnji Cooper 	{ "O",				7200 },
160640235e2SEnji Cooper 	{ "P",				10800 },
161640235e2SEnji Cooper 	{ "Q",				14400 },
162640235e2SEnji Cooper 	{ "R",				18000 },
163640235e2SEnji Cooper 	{ "T",				25200 },
164640235e2SEnji Cooper 	{ "U",				28800 },
165640235e2SEnji Cooper 	{ "V",				32400 },
166640235e2SEnji Cooper 	{ "W",				36000 },
167640235e2SEnji Cooper 	{ "X",				39600 },
168640235e2SEnji Cooper 	{ "Y",				43200 },
169640235e2SEnji Cooper 
170640235e2SEnji Cooper 	{ "J",				-2 },
171640235e2SEnji Cooper 
172640235e2SEnji Cooper 	{ "America/Los_Angeles",	-28800 },
173640235e2SEnji Cooper 	{ "America/New_York",		-18000 },
174640235e2SEnji Cooper 	{ "EST4EDT",			-14400 },
175640235e2SEnji Cooper 
176640235e2SEnji Cooper 	{ "Bogus",			-1 },
177281c2989SYuri Pankov #endif
178640235e2SEnji Cooper };
179640235e2SEnji Cooper 
180640235e2SEnji Cooper static void
ztest1(const char * name,const char * fmt,long value)181640235e2SEnji Cooper ztest1(const char *name, const char *fmt, long value)
182640235e2SEnji Cooper {
183640235e2SEnji Cooper 	struct tm tm;
184640235e2SEnji Cooper 	char *rv;
185640235e2SEnji Cooper 
186640235e2SEnji Cooper 	memset(&tm, 0, sizeof(tm));
187640235e2SEnji Cooper 	if ((rv = strptime(name, fmt, &tm)) == NULL)
188640235e2SEnji Cooper 		tm.tm_gmtoff = -1;
189640235e2SEnji Cooper 	else if (rv == name && fmt[1] == 'Z')
190640235e2SEnji Cooper 		value = 0;
191640235e2SEnji Cooper 
192640235e2SEnji Cooper 	switch (value) {
193281c2989SYuri Pankov #ifndef __FreeBSD__
194640235e2SEnji Cooper 	case -2:
195640235e2SEnji Cooper 		value = -timezone;
196640235e2SEnji Cooper 		break;
197281c2989SYuri Pankov #endif
198640235e2SEnji Cooper 	case -1:
199640235e2SEnji Cooper 		if (fmt[1] == 'Z')
200640235e2SEnji Cooper 			value = 0;
201640235e2SEnji Cooper 		break;
202640235e2SEnji Cooper 	default:
203640235e2SEnji Cooper 		break;
204640235e2SEnji Cooper 	}
205640235e2SEnji Cooper 
206640235e2SEnji Cooper 	ATF_REQUIRE_MSG(tm.tm_gmtoff == value,
207640235e2SEnji Cooper 	    "strptime(\"%s\", \"%s\", &tm): "
208640235e2SEnji Cooper 	    "expected: tm.tm_gmtoff=%ld, got: tm.tm_gmtoff=%ld",
209640235e2SEnji Cooper 	    name, fmt, value, tm.tm_gmtoff);
210640235e2SEnji Cooper 	printf("%s %s %ld\n", name, fmt, tm.tm_gmtoff);
211640235e2SEnji Cooper }
212640235e2SEnji Cooper 
213640235e2SEnji Cooper static void
ztest(const char * fmt)214640235e2SEnji Cooper ztest(const char *fmt)
215640235e2SEnji Cooper {
216640235e2SEnji Cooper 	setenv("TZ", "US/Eastern", 1);
217281c2989SYuri Pankov #ifndef __FreeBSD__
218640235e2SEnji Cooper 	ztest1("GMT", fmt, 0);
219640235e2SEnji Cooper 	ztest1("UTC", fmt, 0);
220640235e2SEnji Cooper 	ztest1("US/Eastern", fmt, -18000);
221281c2989SYuri Pankov #endif
222640235e2SEnji Cooper 	for (size_t i = 0; i < __arraycount(zt); i++)
223640235e2SEnji Cooper 		ztest1(zt[i].name, fmt, zt[i].offs);
224640235e2SEnji Cooper }
225640235e2SEnji Cooper 
22657718be8SEnji Cooper ATF_TC(common);
22757718be8SEnji Cooper 
ATF_TC_HEAD(common,tc)22857718be8SEnji Cooper ATF_TC_HEAD(common, tc)
22957718be8SEnji Cooper {
23057718be8SEnji Cooper 
23157718be8SEnji Cooper 	atf_tc_set_md_var(tc, "descr", "Checks strptime(3): various checks");
23257718be8SEnji Cooper }
23357718be8SEnji Cooper 
ATF_TC_BODY(common,tc)23457718be8SEnji Cooper ATF_TC_BODY(common, tc)
23557718be8SEnji Cooper {
23657718be8SEnji Cooper 
23757718be8SEnji Cooper 	h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %T %Y",
238640235e2SEnji Cooper 		24, 46, 27, 23, 20, 0, 98, 2, 19);
23957718be8SEnji Cooper 	h_pass("Tue Jan 20 23:27:46 1998", "%a %b %d %H:%M:%S %Y",
240640235e2SEnji Cooper 		24, 46, 27, 23, 20, 0, 98, 2, 19);
24157718be8SEnji Cooper 	h_pass("Tue Jan 20 23:27:46 1998", "%c",
242640235e2SEnji Cooper 		24, 46, 27, 23, 20, 0, 98, 2, 19);
24357718be8SEnji Cooper 	h_pass("Fri Mar  4 20:05:34 2005", "%a %b %e %H:%M:%S %Y",
244640235e2SEnji Cooper 		24, 34, 5, 20, 4, 2, 105, 5, 62);
24557718be8SEnji Cooper 	h_pass("5\t3  4 8pm:05:34 2005", "%w%n%m%t%d%n%k%p:%M:%S %Y",
246640235e2SEnji Cooper 		21, 34, 5, 20, 4, 2, 105, 5, 62);
24757718be8SEnji Cooper 	h_pass("Fri Mar  4 20:05:34 2005", "%c",
248640235e2SEnji Cooper 		24, 34, 5, 20, 4, 2, 105, 5, 62);
24957718be8SEnji Cooper }
25057718be8SEnji Cooper 
25157718be8SEnji Cooper ATF_TC(day);
25257718be8SEnji Cooper 
ATF_TC_HEAD(day,tc)25357718be8SEnji Cooper ATF_TC_HEAD(day, tc)
25457718be8SEnji Cooper {
25557718be8SEnji Cooper 
256640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
257640235e2SEnji Cooper 			  "Checks strptime(3) day name conversions [aA]");
25857718be8SEnji Cooper }
25957718be8SEnji Cooper 
ATF_TC_BODY(day,tc)26057718be8SEnji Cooper ATF_TC_BODY(day, tc)
26157718be8SEnji Cooper {
26257718be8SEnji Cooper 
26357718be8SEnji Cooper 	h_pass("Sun", "%a", 3, -1, -1, -1, -1, -1, -1, 0, -1);
26457718be8SEnji Cooper 	h_pass("Sunday", "%a", 6, -1, -1, -1, -1, -1, -1, 0, -1);
26557718be8SEnji Cooper 	h_pass("Mon", "%a", 3, -1, -1, -1, -1, -1, -1, 1, -1);
26657718be8SEnji Cooper 	h_pass("Monday", "%a", 6, -1, -1, -1, -1, -1, -1, 1, -1);
26757718be8SEnji Cooper 	h_pass("Tue", "%a", 3, -1, -1, -1, -1, -1, -1, 2, -1);
26857718be8SEnji Cooper 	h_pass("Tuesday", "%a", 7, -1, -1, -1, -1, -1, -1, 2, -1);
26957718be8SEnji Cooper 	h_pass("Wed", "%a", 3, -1, -1, -1, -1, -1, -1, 3, -1);
27057718be8SEnji Cooper 	h_pass("Wednesday", "%a", 9, -1, -1, -1, -1, -1, -1, 3, -1);
27157718be8SEnji Cooper 	h_pass("Thu", "%a", 3, -1, -1, -1, -1, -1, -1, 4, -1);
27257718be8SEnji Cooper 	h_pass("Thursday", "%a", 8, -1, -1, -1, -1, -1, -1, 4, -1);
27357718be8SEnji Cooper 	h_pass("Fri", "%a", 3, -1, -1, -1, -1, -1, -1, 5, -1);
27457718be8SEnji Cooper 	h_pass("Friday", "%a", 6, -1, -1, -1, -1, -1, -1, 5, -1);
27557718be8SEnji Cooper 	h_pass("Sat", "%a", 3, -1, -1, -1, -1, -1, -1, 6, -1);
27657718be8SEnji Cooper 	h_pass("Saturday", "%a", 8, -1, -1, -1, -1, -1, -1, 6, -1);
27757718be8SEnji Cooper 	h_pass("Saturn", "%a", 3, -1, -1, -1, -1, -1, -1, 6, -1);
27857718be8SEnji Cooper 	h_fail("Moon", "%a");
27957718be8SEnji Cooper 	h_pass("Sun", "%A", 3, -1, -1, -1, -1, -1, -1, 0, -1);
28057718be8SEnji Cooper 	h_pass("Sunday", "%A", 6, -1, -1, -1, -1, -1, -1, 0, -1);
28157718be8SEnji Cooper 	h_pass("Mon", "%A", 3, -1, -1, -1, -1, -1, -1, 1, -1);
28257718be8SEnji Cooper 	h_pass("Monday", "%A", 6, -1, -1, -1, -1, -1, -1, 1, -1);
28357718be8SEnji Cooper 	h_pass("Tue", "%A", 3, -1, -1, -1, -1, -1, -1, 2, -1);
28457718be8SEnji Cooper 	h_pass("Tuesday", "%A", 7, -1, -1, -1, -1, -1, -1, 2, -1);
28557718be8SEnji Cooper 	h_pass("Wed", "%A", 3, -1, -1, -1, -1, -1, -1, 3, -1);
28657718be8SEnji Cooper 	h_pass("Wednesday", "%A", 9, -1, -1, -1, -1, -1, -1, 3, -1);
28757718be8SEnji Cooper 	h_pass("Thu", "%A", 3, -1, -1, -1, -1, -1, -1, 4, -1);
28857718be8SEnji Cooper 	h_pass("Thursday", "%A", 8, -1, -1, -1, -1, -1, -1, 4, -1);
28957718be8SEnji Cooper 	h_pass("Fri", "%A", 3, -1, -1, -1, -1, -1, -1, 5, -1);
29057718be8SEnji Cooper 	h_pass("Friday", "%A", 6, -1, -1, -1, -1, -1, -1, 5, -1);
29157718be8SEnji Cooper 	h_pass("Sat", "%A", 3, -1, -1, -1, -1, -1, -1, 6, -1);
29257718be8SEnji Cooper 	h_pass("Saturday", "%A", 8, -1, -1, -1, -1, -1, -1, 6, -1);
29357718be8SEnji Cooper 	h_pass("Saturn", "%A", 3, -1, -1, -1, -1, -1, -1, 6, -1);
29457718be8SEnji Cooper 	h_fail("Moon", "%A");
29557718be8SEnji Cooper 
29657718be8SEnji Cooper 	h_pass("mon", "%a", 3, -1, -1, -1, -1, -1, -1, 1, -1);
29757718be8SEnji Cooper 	h_pass("tueSDay", "%A", 7, -1, -1, -1, -1, -1, -1, 2, -1);
29857718be8SEnji Cooper 	h_pass("sunday", "%A", 6, -1, -1, -1, -1, -1, -1, 0, -1);
299ff0ba872SEnji Cooper #ifdef __NetBSD__
30057718be8SEnji Cooper 	h_fail("sunday", "%EA");
301e58fb51fSEnji Cooper #else
302e58fb51fSEnji Cooper 	h_pass("Sunday", "%EA", 6, -1, -1, -1, -1, -1, -1, 0, -1);
303e58fb51fSEnji Cooper #endif
30457718be8SEnji Cooper 	h_pass("SaturDay", "%A", 8, -1, -1, -1, -1, -1, -1, 6, -1);
305ff0ba872SEnji Cooper #ifdef __NetBSD__
30657718be8SEnji Cooper 	h_fail("SaturDay", "%OA");
307e58fb51fSEnji Cooper #else
308e58fb51fSEnji Cooper 	h_pass("SaturDay", "%OA", 8, -1, -1, -1, -1, -1, -1, 6, -1);
309e58fb51fSEnji Cooper #endif
310281c2989SYuri Pankov 
311281c2989SYuri Pankov #ifdef __FreeBSD__
312281c2989SYuri Pankov 	h_fail("00", "%d");
313281c2989SYuri Pankov #endif
31457718be8SEnji Cooper }
31557718be8SEnji Cooper 
316640235e2SEnji Cooper ATF_TC(hour);
317640235e2SEnji Cooper 
ATF_TC_HEAD(hour,tc)318640235e2SEnji Cooper ATF_TC_HEAD(hour, tc)
319640235e2SEnji Cooper {
320640235e2SEnji Cooper 
321640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
322281c2989SYuri Pankov #ifdef __FreeBSD__
323281c2989SYuri Pankov 			  "Checks strptime(3) hour conversions [HIkl]");
324281c2989SYuri Pankov #else
325640235e2SEnji Cooper 			  "Checks strptime(3) hour conversions [IH]");
326281c2989SYuri Pankov #endif
327640235e2SEnji Cooper }
328640235e2SEnji Cooper 
ATF_TC_BODY(hour,tc)329640235e2SEnji Cooper ATF_TC_BODY(hour, tc)
330640235e2SEnji Cooper {
331640235e2SEnji Cooper 
332640235e2SEnji Cooper 	h_fail("00", "%I");
333640235e2SEnji Cooper 	h_fail("13", "%I");
334*32a8ec8bSYuri Pankov 
335281c2989SYuri Pankov #ifdef __FreeBSD__
336*32a8ec8bSYuri Pankov 	h_pass("0", "%k", 1, -1, -1, 0, -1, -1, -1, -1, -1);
337*32a8ec8bSYuri Pankov 	h_pass("04", "%k", 2, -1, -1, 4, -1, -1, -1, -1, -1);
338*32a8ec8bSYuri Pankov 	h_pass(" 8", "%k", 2, -1, -1, 8, -1, -1, -1, -1, -1);
339*32a8ec8bSYuri Pankov 	h_pass("23", "%k", 2, -1, -1, 23, -1, -1, -1, -1, -1);
340*32a8ec8bSYuri Pankov 	h_fail("24", "%k");
341*32a8ec8bSYuri Pankov 
342*32a8ec8bSYuri Pankov 	h_fail("0", "%l");
343*32a8ec8bSYuri Pankov 	h_pass("1", "%l", 1, -1, -1, 1, -1, -1, -1, -1, -1);
344*32a8ec8bSYuri Pankov 	h_pass("05", "%l", 2, -1, -1, 5, -1, -1, -1, -1, -1);
345*32a8ec8bSYuri Pankov 	h_pass(" 9", "%l", 2, -1, -1, 9, -1, -1, -1, -1, -1);
346*32a8ec8bSYuri Pankov 	h_pass("12", "%l", 2, -1, -1, 12, -1, -1, -1, -1, -1);
347281c2989SYuri Pankov 	h_fail("13", "%l");
348281c2989SYuri Pankov #endif
349640235e2SEnji Cooper 
350640235e2SEnji Cooper 	h_pass("00", "%H", 2, -1, -1, 0, -1, -1, -1, -1, -1);
351640235e2SEnji Cooper 	h_pass("12", "%H", 2, -1, -1, 12, -1, -1, -1, -1, -1);
352640235e2SEnji Cooper 	h_pass("23", "%H", 2, -1, -1, 23, -1, -1, -1, -1, -1);
353640235e2SEnji Cooper 	h_fail("24", "%H");
354640235e2SEnji Cooper }
355640235e2SEnji Cooper 
356640235e2SEnji Cooper 
35757718be8SEnji Cooper ATF_TC(month);
35857718be8SEnji Cooper 
ATF_TC_HEAD(month,tc)35957718be8SEnji Cooper ATF_TC_HEAD(month, tc)
36057718be8SEnji Cooper {
36157718be8SEnji Cooper 
362640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
363640235e2SEnji Cooper 			  "Checks strptime(3) month name conversions [bB]");
36457718be8SEnji Cooper }
36557718be8SEnji Cooper 
ATF_TC_BODY(month,tc)36657718be8SEnji Cooper ATF_TC_BODY(month, tc)
36757718be8SEnji Cooper {
36857718be8SEnji Cooper 
36957718be8SEnji Cooper 	h_pass("Jan", "%b", 3, -1, -1, -1, -1, 0, -1, -1, -1);
37057718be8SEnji Cooper 	h_pass("January", "%b", 7, -1, -1, -1, -1, 0, -1, -1, -1);
37157718be8SEnji Cooper 	h_pass("Feb", "%b", 3, -1, -1, -1, -1, 1, -1, -1, -1);
37257718be8SEnji Cooper 	h_pass("February", "%b", 8, -1, -1, -1, -1, 1, -1, -1, -1);
37357718be8SEnji Cooper 	h_pass("Mar", "%b", 3, -1, -1, -1, -1, 2, -1, -1, -1);
37457718be8SEnji Cooper 	h_pass("March", "%b", 5, -1, -1, -1, -1, 2, -1, -1, -1);
37557718be8SEnji Cooper 	h_pass("Apr", "%b", 3, -1, -1, -1, -1, 3, -1, -1, -1);
37657718be8SEnji Cooper 	h_pass("April", "%b", 5, -1, -1, -1, -1, 3, -1, -1, -1);
37757718be8SEnji Cooper 	h_pass("May", "%b", 3, -1, -1, -1, -1, 4, -1, -1, -1);
37857718be8SEnji Cooper 	h_pass("Jun", "%b", 3, -1, -1, -1, -1, 5, -1, -1, -1);
37957718be8SEnji Cooper 	h_pass("June", "%b", 4, -1, -1, -1, -1, 5, -1, -1, -1);
38057718be8SEnji Cooper 	h_pass("Jul", "%b", 3, -1, -1, -1, -1, 6, -1, -1, -1);
38157718be8SEnji Cooper 	h_pass("July", "%b", 4, -1, -1, -1, -1, 6, -1, -1, -1);
38257718be8SEnji Cooper 	h_pass("Aug", "%b", 3, -1, -1, -1, -1, 7, -1, -1, -1);
38357718be8SEnji Cooper 	h_pass("August", "%b", 6, -1, -1, -1, -1, 7, -1, -1, -1);
38457718be8SEnji Cooper 	h_pass("Sep", "%b", 3, -1, -1, -1, -1, 8, -1, -1, -1);
38557718be8SEnji Cooper 	h_pass("September", "%b", 9, -1, -1, -1, -1, 8, -1, -1, -1);
38657718be8SEnji Cooper 	h_pass("Oct", "%b", 3, -1, -1, -1, -1, 9, -1, -1, -1);
38757718be8SEnji Cooper 	h_pass("October", "%b", 7, -1, -1, -1, -1, 9, -1, -1, -1);
38857718be8SEnji Cooper 	h_pass("Nov", "%b", 3, -1, -1, -1, -1, 10, -1, -1, -1);
38957718be8SEnji Cooper 	h_pass("November", "%b", 8, -1, -1, -1, -1, 10, -1, -1, -1);
39057718be8SEnji Cooper 	h_pass("Dec", "%b", 3, -1, -1, -1, -1, 11, -1, -1, -1);
39157718be8SEnji Cooper 	h_pass("December", "%b", 8, -1, -1, -1, -1, 11, -1, -1, -1);
39257718be8SEnji Cooper 	h_pass("Mayor", "%b", 3, -1, -1, -1, -1, 4, -1, -1, -1);
39357718be8SEnji Cooper 	h_pass("Mars", "%b", 3, -1, -1, -1, -1, 2, -1, -1, -1);
39457718be8SEnji Cooper 	h_fail("Rover", "%b");
39557718be8SEnji Cooper 	h_pass("Jan", "%B", 3, -1, -1, -1, -1, 0, -1, -1, -1);
39657718be8SEnji Cooper 	h_pass("January", "%B", 7, -1, -1, -1, -1, 0, -1, -1, -1);
39757718be8SEnji Cooper 	h_pass("Feb", "%B", 3, -1, -1, -1, -1, 1, -1, -1, -1);
39857718be8SEnji Cooper 	h_pass("February", "%B", 8, -1, -1, -1, -1, 1, -1, -1, -1);
39957718be8SEnji Cooper 	h_pass("Mar", "%B", 3, -1, -1, -1, -1, 2, -1, -1, -1);
40057718be8SEnji Cooper 	h_pass("March", "%B", 5, -1, -1, -1, -1, 2, -1, -1, -1);
40157718be8SEnji Cooper 	h_pass("Apr", "%B", 3, -1, -1, -1, -1, 3, -1, -1, -1);
40257718be8SEnji Cooper 	h_pass("April", "%B", 5, -1, -1, -1, -1, 3, -1, -1, -1);
40357718be8SEnji Cooper 	h_pass("May", "%B", 3, -1, -1, -1, -1, 4, -1, -1, -1);
40457718be8SEnji Cooper 	h_pass("Jun", "%B", 3, -1, -1, -1, -1, 5, -1, -1, -1);
40557718be8SEnji Cooper 	h_pass("June", "%B", 4, -1, -1, -1, -1, 5, -1, -1, -1);
40657718be8SEnji Cooper 	h_pass("Jul", "%B", 3, -1, -1, -1, -1, 6, -1, -1, -1);
40757718be8SEnji Cooper 	h_pass("July", "%B", 4, -1, -1, -1, -1, 6, -1, -1, -1);
40857718be8SEnji Cooper 	h_pass("Aug", "%B", 3, -1, -1, -1, -1, 7, -1, -1, -1);
40957718be8SEnji Cooper 	h_pass("August", "%B", 6, -1, -1, -1, -1, 7, -1, -1, -1);
41057718be8SEnji Cooper 	h_pass("Sep", "%B", 3, -1, -1, -1, -1, 8, -1, -1, -1);
41157718be8SEnji Cooper 	h_pass("September", "%B", 9, -1, -1, -1, -1, 8, -1, -1, -1);
41257718be8SEnji Cooper 	h_pass("Oct", "%B", 3, -1, -1, -1, -1, 9, -1, -1, -1);
41357718be8SEnji Cooper 	h_pass("October", "%B", 7, -1, -1, -1, -1, 9, -1, -1, -1);
41457718be8SEnji Cooper 	h_pass("Nov", "%B", 3, -1, -1, -1, -1, 10, -1, -1, -1);
41557718be8SEnji Cooper 	h_pass("November", "%B", 8, -1, -1, -1, -1, 10, -1, -1, -1);
41657718be8SEnji Cooper 	h_pass("Dec", "%B", 3, -1, -1, -1, -1, 11, -1, -1, -1);
41757718be8SEnji Cooper 	h_pass("December", "%B", 8, -1, -1, -1, -1, 11, -1, -1, -1);
41857718be8SEnji Cooper 	h_pass("Mayor", "%B", 3, -1, -1, -1, -1, 4, -1, -1, -1);
41957718be8SEnji Cooper 	h_pass("Mars", "%B", 3, -1, -1, -1, -1, 2, -1, -1, -1);
42057718be8SEnji Cooper 	h_fail("Rover", "%B");
42157718be8SEnji Cooper 
42257718be8SEnji Cooper 	h_pass("september", "%b", 9, -1, -1, -1, -1, 8, -1, -1, -1);
42357718be8SEnji Cooper 	h_pass("septembe", "%B", 3, -1, -1, -1, -1, 8, -1, -1, -1);
42457718be8SEnji Cooper }
42557718be8SEnji Cooper 
426640235e2SEnji Cooper ATF_TC(seconds);
427640235e2SEnji Cooper 
ATF_TC_HEAD(seconds,tc)428640235e2SEnji Cooper ATF_TC_HEAD(seconds, tc)
429640235e2SEnji Cooper {
430640235e2SEnji Cooper 
431640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
432640235e2SEnji Cooper 			  "Checks strptime(3) seconds conversions [S]");
433640235e2SEnji Cooper }
434640235e2SEnji Cooper 
ATF_TC_BODY(seconds,tc)435640235e2SEnji Cooper ATF_TC_BODY(seconds, tc)
436640235e2SEnji Cooper {
437640235e2SEnji Cooper 
438640235e2SEnji Cooper 	h_pass("0", "%S", 1, 0, -1, -1, -1, -1, -1, -1, -1);
439640235e2SEnji Cooper 	h_pass("59", "%S", 2, 59, -1, -1, -1, -1, -1, -1, -1);
440640235e2SEnji Cooper 	h_pass("60", "%S", 2, 60, -1, -1, -1, -1, -1, -1, -1);
441281c2989SYuri Pankov #ifdef __FreeBSD__
442281c2989SYuri Pankov 	/*
443281c2989SYuri Pankov 	 * (Much) older versions of the standard (up to the Issue 6) allowed for
444281c2989SYuri Pankov 	 * [0;61] range in %S conversion for double-leap seconds, and it's
445281c2989SYuri Pankov 	 * apparently what NetBSD and glibc are expecting, however current
446281c2989SYuri Pankov 	 * version defines allowed values to be [0;60], and that is what our
447281c2989SYuri Pankov 	 * strptime() implementation expects.
448281c2989SYuri Pankov 	 */
449281c2989SYuri Pankov 	h_fail("61", "%S");
450281c2989SYuri Pankov #else
451640235e2SEnji Cooper 	h_pass("61", "%S", 2, 61, -1, -1, -1, -1, -1, -1, -1);
452281c2989SYuri Pankov #endif
453640235e2SEnji Cooper 	h_fail("62", "%S");
454640235e2SEnji Cooper }
455640235e2SEnji Cooper 
456640235e2SEnji Cooper ATF_TC(year);
457640235e2SEnji Cooper 
ATF_TC_HEAD(year,tc)458640235e2SEnji Cooper ATF_TC_HEAD(year, tc)
459640235e2SEnji Cooper {
460640235e2SEnji Cooper 
461640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
462640235e2SEnji Cooper 			  "Checks strptime(3) century/year conversions [CyY]");
463640235e2SEnji Cooper }
464640235e2SEnji Cooper 
ATF_TC_BODY(year,tc)465640235e2SEnji Cooper ATF_TC_BODY(year, tc)
466640235e2SEnji Cooper {
467640235e2SEnji Cooper 
468640235e2SEnji Cooper 	h_pass("x20y", "x%Cy", 4, -1, -1, -1, -1, -1, 100, -1, -1);
469640235e2SEnji Cooper 	h_pass("x84y", "x%yy", 4, -1, -1, -1, -1, -1, 84, -1, -1);
470640235e2SEnji Cooper 	h_pass("x2084y", "x%C%yy", 6, -1, -1, -1, -1, -1, 184, -1, -1);
471640235e2SEnji Cooper 	h_pass("x8420y", "x%y%Cy", 6, -1, -1, -1, -1, -1, 184, -1, -1);
472640235e2SEnji Cooper 	h_pass("%20845", "%%%C%y5", 6, -1, -1, -1, -1, -1, 184, -1, -1);
473281c2989SYuri Pankov #ifndef __FreeBSD__
474640235e2SEnji Cooper 	h_fail("%", "%E%");
475281c2989SYuri Pankov #endif
476640235e2SEnji Cooper 
477640235e2SEnji Cooper 	h_pass("1980", "%Y", 4, -1, -1, -1, -1, -1, 80, -1, -1);
478640235e2SEnji Cooper 	h_pass("1980", "%EY", 4, -1, -1, -1, -1, -1, 80, -1, -1);
479640235e2SEnji Cooper }
480640235e2SEnji Cooper 
481640235e2SEnji Cooper ATF_TC(zone);
482640235e2SEnji Cooper 
ATF_TC_HEAD(zone,tc)483640235e2SEnji Cooper ATF_TC_HEAD(zone, tc)
484640235e2SEnji Cooper {
485640235e2SEnji Cooper 
486640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
487640235e2SEnji Cooper 			  "Checks strptime(3) timezone conversion [z]");
488640235e2SEnji Cooper }
489640235e2SEnji Cooper 
490640235e2SEnji Cooper 
ATF_TC_BODY(zone,tc)491640235e2SEnji Cooper ATF_TC_BODY(zone, tc)
492640235e2SEnji Cooper {
493640235e2SEnji Cooper 	ztest("%z");
494640235e2SEnji Cooper }
495640235e2SEnji Cooper 
496640235e2SEnji Cooper ATF_TC(Zone);
497640235e2SEnji Cooper 
ATF_TC_HEAD(Zone,tc)498640235e2SEnji Cooper ATF_TC_HEAD(Zone, tc)
499640235e2SEnji Cooper {
500640235e2SEnji Cooper 
501640235e2SEnji Cooper 	atf_tc_set_md_var(tc, "descr",
502640235e2SEnji Cooper 			  "Checks strptime(3) timezone conversion [Z]");
503640235e2SEnji Cooper }
504640235e2SEnji Cooper 
505640235e2SEnji Cooper 
ATF_TC_BODY(Zone,tc)506640235e2SEnji Cooper ATF_TC_BODY(Zone, tc)
507640235e2SEnji Cooper {
508281c2989SYuri Pankov 	ztest("%Z");
509640235e2SEnji Cooper }
510640235e2SEnji Cooper 
ATF_TP_ADD_TCS(tp)51157718be8SEnji Cooper ATF_TP_ADD_TCS(tp)
51257718be8SEnji Cooper {
51357718be8SEnji Cooper 
51457718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, common);
51557718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, day);
516640235e2SEnji Cooper 	ATF_TP_ADD_TC(tp, hour);
51757718be8SEnji Cooper 	ATF_TP_ADD_TC(tp, month);
518640235e2SEnji Cooper 	ATF_TP_ADD_TC(tp, seconds);
519640235e2SEnji Cooper 	ATF_TP_ADD_TC(tp, year);
520640235e2SEnji Cooper 	ATF_TP_ADD_TC(tp, zone);
521640235e2SEnji Cooper 	ATF_TP_ADD_TC(tp, Zone);
52257718be8SEnji Cooper 
52357718be8SEnji Cooper 	return atf_no_error();
52457718be8SEnji Cooper }
525