155682Smarkm/*
2233294Sstas * Copyright (c) 1999 Kungliga Tekniska H��gskolan
3233294Sstas * (Royal Institute of Technology, Stockholm, Sweden).
4233294Sstas * All rights reserved.
555682Smarkm *
6233294Sstas * Redistribution and use in source and binary forms, with or without
7233294Sstas * modification, are permitted provided that the following conditions
8233294Sstas * are met:
955682Smarkm *
10233294Sstas * 1. Redistributions of source code must retain the above copyright
11233294Sstas *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
13233294Sstas * 2. Redistributions in binary form must reproduce the above copyright
14233294Sstas *    notice, this list of conditions and the following disclaimer in the
15233294Sstas *    documentation and/or other materials provided with the distribution.
1655682Smarkm *
1755682Smarkm * 3. Neither the name of KTH nor the names of its contributors may be
1855682Smarkm *    used to endorse or promote products derived from this software without
1955682Smarkm *    specific prior written permission.
2055682Smarkm *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY
2255682Smarkm * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2455682Smarkm * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE
2555682Smarkm * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2655682Smarkm * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2755682Smarkm * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2855682Smarkm * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2955682Smarkm * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
3055682Smarkm * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
3155682Smarkm * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
3255682Smarkm
3355682Smarkm#include <config.h>
34233294Sstas#include <roken.h>
35178825Sdfr#ifdef TEST_STRPFTIME
36178825Sdfr#include "strpftime-test.h"
37178825Sdfr#endif
3855682Smarkm
3955682Smarkmenum { MAXSIZE = 26 };
4055682Smarkm
4155682Smarkmstatic struct testcase {
4255682Smarkm    time_t t;
4355682Smarkm    struct {
4455682Smarkm	const char *format;
4555682Smarkm	const char *result;
4655682Smarkm    } vals[MAXSIZE];
4755682Smarkm} tests[] = {
4855682Smarkm    {0,
4955682Smarkm     {
5055682Smarkm	 {"%A", "Thursday"},
5155682Smarkm	 {"%a", "Thu"},
5255682Smarkm	 {"%B", "January"},
5355682Smarkm	 {"%b", "Jan"},
5455682Smarkm	 {"%C", "19"},
5555682Smarkm	 {"%d", "01"},
5655682Smarkm	 {"%e", " 1"},
5755682Smarkm	 {"%H", "00"},
5855682Smarkm	 {"%I", "12"},
5955682Smarkm	 {"%j", "001"},
6055682Smarkm	 {"%k", " 0"},
6155682Smarkm	 {"%l", "12"},
6255682Smarkm	 {"%M", "00"},
6355682Smarkm	 {"%m", "01"},
6455682Smarkm	 {"%n", "\n"},
6555682Smarkm	 {"%p", "AM"},
6655682Smarkm	 {"%S", "00"},
6755682Smarkm	 {"%t", "\t"},
6855682Smarkm	 {"%w", "4"},
6955682Smarkm	 {"%Y", "1970"},
7055682Smarkm	 {"%y", "70"},
7155682Smarkm	 {"%U", "00"},
7255682Smarkm	 {"%W", "00"},
7355682Smarkm	 {"%V", "01"},
7455682Smarkm	 {"%%", "%"},
7555682Smarkm	 {NULL, NULL}}
7655682Smarkm    },
7755682Smarkm    {90000,
7855682Smarkm     {
7955682Smarkm	 {"%A", "Friday"},
8055682Smarkm	 {"%a", "Fri"},
8155682Smarkm	 {"%B", "January"},
8255682Smarkm	 {"%b", "Jan"},
8355682Smarkm	 {"%C", "19"},
8455682Smarkm	 {"%d", "02"},
8555682Smarkm	 {"%e", " 2"},
8655682Smarkm	 {"%H", "01"},
8755682Smarkm	 {"%I", "01"},
8855682Smarkm	 {"%j", "002"},
8955682Smarkm	 {"%k", " 1"},
9055682Smarkm	 {"%l", " 1"},
9155682Smarkm	 {"%M", "00"},
9255682Smarkm	 {"%m", "01"},
9355682Smarkm	 {"%n", "\n"},
9455682Smarkm	 {"%p", "AM"},
9555682Smarkm	 {"%S", "00"},
9655682Smarkm	 {"%t", "\t"},
9755682Smarkm	 {"%w", "5"},
9855682Smarkm	 {"%Y", "1970"},
9955682Smarkm	 {"%y", "70"},
10055682Smarkm	 {"%U", "00"},
10155682Smarkm	 {"%W", "00"},
10255682Smarkm	 {"%V", "01"},
10355682Smarkm	 {"%%", "%"},
10455682Smarkm	 {NULL, NULL}
10555682Smarkm     }
10655682Smarkm    },
10755682Smarkm    {216306,
10855682Smarkm     {
10955682Smarkm	 {"%A", "Saturday"},
11055682Smarkm	 {"%a", "Sat"},
11155682Smarkm	 {"%B", "January"},
11255682Smarkm	 {"%b", "Jan"},
11355682Smarkm	 {"%C", "19"},
11455682Smarkm	 {"%d", "03"},
11555682Smarkm	 {"%e", " 3"},
11655682Smarkm	 {"%H", "12"},
11755682Smarkm	 {"%I", "12"},
11855682Smarkm	 {"%j", "003"},
11955682Smarkm	 {"%k", "12"},
12055682Smarkm	 {"%l", "12"},
12155682Smarkm	 {"%M", "05"},
12255682Smarkm	 {"%m", "01"},
12355682Smarkm	 {"%n", "\n"},
12455682Smarkm	 {"%p", "PM"},
12555682Smarkm	 {"%S", "06"},
12655682Smarkm	 {"%t", "\t"},
12755682Smarkm	 {"%w", "6"},
12855682Smarkm	 {"%Y", "1970"},
12955682Smarkm	 {"%y", "70"},
13055682Smarkm	 {"%U", "00"},
13155682Smarkm	 {"%W", "00"},
13255682Smarkm	 {"%V", "01"},
13355682Smarkm	 {"%%", "%"},
13455682Smarkm	 {NULL, NULL}
13555682Smarkm     }
13655682Smarkm    },
13755682Smarkm    {259200,
13855682Smarkm     {
13955682Smarkm	 {"%A", "Sunday"},
14055682Smarkm	 {"%a", "Sun"},
14155682Smarkm	 {"%B", "January"},
14255682Smarkm	 {"%b", "Jan"},
14355682Smarkm	 {"%C", "19"},
14455682Smarkm	 {"%d", "04"},
14555682Smarkm	 {"%e", " 4"},
14655682Smarkm	 {"%H", "00"},
14755682Smarkm	 {"%I", "12"},
14855682Smarkm	 {"%j", "004"},
14955682Smarkm	 {"%k", " 0"},
15055682Smarkm	 {"%l", "12"},
15155682Smarkm	 {"%M", "00"},
15255682Smarkm	 {"%m", "01"},
15355682Smarkm	 {"%n", "\n"},
15455682Smarkm	 {"%p", "AM"},
15555682Smarkm	 {"%S", "00"},
15655682Smarkm	 {"%t", "\t"},
15755682Smarkm	 {"%w", "0"},
15855682Smarkm	 {"%Y", "1970"},
15955682Smarkm	 {"%y", "70"},
16055682Smarkm	 {"%U", "01"},
16155682Smarkm	 {"%W", "00"},
16255682Smarkm	 {"%V", "01"},
16355682Smarkm	 {"%%", "%"},
16455682Smarkm	 {NULL, NULL}
16555682Smarkm     }
16655682Smarkm    },
16755682Smarkm    {915148800,
16855682Smarkm     {
16955682Smarkm	 {"%A", "Friday"},
17055682Smarkm	 {"%a", "Fri"},
17155682Smarkm	 {"%B", "January"},
17255682Smarkm	 {"%b", "Jan"},
17355682Smarkm	 {"%C", "19"},
17455682Smarkm	 {"%d", "01"},
17555682Smarkm	 {"%e", " 1"},
17655682Smarkm	 {"%H", "00"},
17755682Smarkm	 {"%I", "12"},
17855682Smarkm	 {"%j", "001"},
17955682Smarkm	 {"%k", " 0"},
18055682Smarkm	 {"%l", "12"},
18155682Smarkm	 {"%M", "00"},
18255682Smarkm	 {"%m", "01"},
18355682Smarkm	 {"%n", "\n"},
18455682Smarkm	 {"%p", "AM"},
18555682Smarkm	 {"%S", "00"},
18655682Smarkm	 {"%t", "\t"},
18755682Smarkm	 {"%w", "5"},
18855682Smarkm	 {"%Y", "1999"},
18955682Smarkm	 {"%y", "99"},
19055682Smarkm	 {"%U", "00"},
19155682Smarkm	 {"%W", "00"},
19255682Smarkm	 {"%V", "53"},
19355682Smarkm	 {"%%", "%"},
19455682Smarkm	 {NULL, NULL}}
19555682Smarkm    },
19655682Smarkm    {942161105,
19755682Smarkm     {
19855682Smarkm
19955682Smarkm	 {"%A", "Tuesday"},
20055682Smarkm	 {"%a", "Tue"},
20155682Smarkm	 {"%B", "November"},
20255682Smarkm	 {"%b", "Nov"},
20355682Smarkm	 {"%C", "19"},
20455682Smarkm	 {"%d", "09"},
20555682Smarkm	 {"%e", " 9"},
20655682Smarkm	 {"%H", "15"},
20755682Smarkm	 {"%I", "03"},
20855682Smarkm	 {"%j", "313"},
20955682Smarkm	 {"%k", "15"},
21055682Smarkm	 {"%l", " 3"},
21155682Smarkm	 {"%M", "25"},
21255682Smarkm	 {"%m", "11"},
21355682Smarkm	 {"%n", "\n"},
21455682Smarkm	 {"%p", "PM"},
21555682Smarkm	 {"%S", "05"},
21655682Smarkm	 {"%t", "\t"},
21755682Smarkm	 {"%w", "2"},
21855682Smarkm	 {"%Y", "1999"},
21955682Smarkm	 {"%y", "99"},
22055682Smarkm	 {"%U", "45"},
22155682Smarkm	 {"%W", "45"},
22255682Smarkm	 {"%V", "45"},
22355682Smarkm	 {"%%", "%"},
22455682Smarkm	 {NULL, NULL}
22555682Smarkm     }
22655682Smarkm    }
22755682Smarkm};
22855682Smarkm
22955682Smarkmint
23055682Smarkmmain(int argc, char **argv)
23155682Smarkm{
23255682Smarkm    int i, j;
23355682Smarkm    int ret = 0;
23455682Smarkm
23555682Smarkm    for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) {
23655682Smarkm	struct tm *tm;
23755682Smarkm
23855682Smarkm	tm = gmtime (&tests[i].t);
23955682Smarkm
24055682Smarkm	for (j = 0; tests[i].vals[j].format != NULL; ++j) {
24155682Smarkm	    char buf[128];
24255682Smarkm	    size_t len;
24355682Smarkm	    struct tm tm2;
24455682Smarkm	    char *ptr;
24555682Smarkm
24655682Smarkm	    len = strftime (buf, sizeof(buf), tests[i].vals[j].format, tm);
24755682Smarkm	    if (len != strlen (buf)) {
248178825Sdfr		printf ("length of strftime(\"%s\") = %lu (\"%s\")\n",
249178825Sdfr			tests[i].vals[j].format, (unsigned long)len,
25055682Smarkm			buf);
25155682Smarkm		++ret;
25255682Smarkm		continue;
25355682Smarkm	    }
25455682Smarkm	    if (strcmp (buf, tests[i].vals[j].result) != 0) {
25555682Smarkm		printf ("result of strftime(\"%s\") = \"%s\" != \"%s\"\n",
25655682Smarkm			tests[i].vals[j].format, buf,
25755682Smarkm			tests[i].vals[j].result);
25855682Smarkm		++ret;
25955682Smarkm		continue;
26055682Smarkm	    }
26155682Smarkm	    memset (&tm2, 0, sizeof(tm2));
26255682Smarkm	    ptr = strptime (tests[i].vals[j].result,
26355682Smarkm			    tests[i].vals[j].format,
26455682Smarkm			    &tm2);
26555682Smarkm	    if (ptr == NULL || *ptr != '\0') {
26655682Smarkm		printf ("bad return value from strptime("
26755682Smarkm			"\"%s\", \"%s\")\n",
26855682Smarkm			tests[i].vals[j].result,
26955682Smarkm			tests[i].vals[j].format);
27055682Smarkm		++ret;
27155682Smarkm	    }
27255682Smarkm	    strftime (buf, sizeof(buf), tests[i].vals[j].format, &tm2);
27355682Smarkm	    if (strcmp (buf, tests[i].vals[j].result) != 0) {
27455682Smarkm		printf ("reverse of \"%s\" failed: \"%s\" vs \"%s\"\n",
27555682Smarkm			tests[i].vals[j].format,
27655682Smarkm			buf, tests[i].vals[j].result);
27755682Smarkm		++ret;
27855682Smarkm	    }
27955682Smarkm	}
28055682Smarkm    }
281178825Sdfr    {
282178825Sdfr	struct tm tm;
283178825Sdfr	memset(&tm, 0, sizeof(tm));
284178825Sdfr	strptime ("200505", "%Y%m", &tm);
285178825Sdfr	if (tm.tm_year != 105)
286178825Sdfr	    ++ret;
287178825Sdfr	if (tm.tm_mon != 4)
288178825Sdfr	    ++ret;
289178825Sdfr    }
29055682Smarkm    if (ret) {
29155682Smarkm	printf ("%d errors\n", ret);
29255682Smarkm	return 1;
29355682Smarkm    } else
29455682Smarkm	return 0;
29555682Smarkm}
296