155682Smarkm/*
255682Smarkm * Copyright (c) 1999 Kungliga Tekniska H�gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
555682Smarkm *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
955682Smarkm *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
1255682Smarkm *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    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#ifdef HAVE_CONFIG_H
3455682Smarkm#include <config.h>
3555682Smarkm#endif
36178825Sdfr#ifdef TEST_STRPFTIME
37178825Sdfr#include "strpftime-test.h"
38178825Sdfr#endif
3955682Smarkm#include "roken.h"
4055682Smarkm
41178825SdfrRCSID("$Id: strpftime-test.c 21897 2007-08-09 08:46:34Z lha $");
4255682Smarkm
4355682Smarkmenum { MAXSIZE = 26 };
4455682Smarkm
4555682Smarkmstatic struct testcase {
4655682Smarkm    time_t t;
4755682Smarkm    struct {
4855682Smarkm	const char *format;
4955682Smarkm	const char *result;
5055682Smarkm    } vals[MAXSIZE];
5155682Smarkm} tests[] = {
5255682Smarkm    {0,
5355682Smarkm     {
5455682Smarkm	 {"%A", "Thursday"},
5555682Smarkm	 {"%a", "Thu"},
5655682Smarkm	 {"%B", "January"},
5755682Smarkm	 {"%b", "Jan"},
5855682Smarkm	 {"%C", "19"},
5955682Smarkm	 {"%d", "01"},
6055682Smarkm	 {"%e", " 1"},
6155682Smarkm	 {"%H", "00"},
6255682Smarkm	 {"%I", "12"},
6355682Smarkm	 {"%j", "001"},
6455682Smarkm	 {"%k", " 0"},
6555682Smarkm	 {"%l", "12"},
6655682Smarkm	 {"%M", "00"},
6755682Smarkm	 {"%m", "01"},
6855682Smarkm	 {"%n", "\n"},
6955682Smarkm	 {"%p", "AM"},
7055682Smarkm	 {"%S", "00"},
7155682Smarkm	 {"%t", "\t"},
7255682Smarkm	 {"%w", "4"},
7355682Smarkm	 {"%Y", "1970"},
7455682Smarkm	 {"%y", "70"},
7555682Smarkm	 {"%U", "00"},
7655682Smarkm	 {"%W", "00"},
7755682Smarkm	 {"%V", "01"},
7855682Smarkm	 {"%%", "%"},
7955682Smarkm	 {NULL, NULL}}
8055682Smarkm    },
8155682Smarkm    {90000,
8255682Smarkm     {
8355682Smarkm	 {"%A", "Friday"},
8455682Smarkm	 {"%a", "Fri"},
8555682Smarkm	 {"%B", "January"},
8655682Smarkm	 {"%b", "Jan"},
8755682Smarkm	 {"%C", "19"},
8855682Smarkm	 {"%d", "02"},
8955682Smarkm	 {"%e", " 2"},
9055682Smarkm	 {"%H", "01"},
9155682Smarkm	 {"%I", "01"},
9255682Smarkm	 {"%j", "002"},
9355682Smarkm	 {"%k", " 1"},
9455682Smarkm	 {"%l", " 1"},
9555682Smarkm	 {"%M", "00"},
9655682Smarkm	 {"%m", "01"},
9755682Smarkm	 {"%n", "\n"},
9855682Smarkm	 {"%p", "AM"},
9955682Smarkm	 {"%S", "00"},
10055682Smarkm	 {"%t", "\t"},
10155682Smarkm	 {"%w", "5"},
10255682Smarkm	 {"%Y", "1970"},
10355682Smarkm	 {"%y", "70"},
10455682Smarkm	 {"%U", "00"},
10555682Smarkm	 {"%W", "00"},
10655682Smarkm	 {"%V", "01"},
10755682Smarkm	 {"%%", "%"},
10855682Smarkm	 {NULL, NULL}
10955682Smarkm     }
11055682Smarkm    },
11155682Smarkm    {216306,
11255682Smarkm     {
11355682Smarkm	 {"%A", "Saturday"},
11455682Smarkm	 {"%a", "Sat"},
11555682Smarkm	 {"%B", "January"},
11655682Smarkm	 {"%b", "Jan"},
11755682Smarkm	 {"%C", "19"},
11855682Smarkm	 {"%d", "03"},
11955682Smarkm	 {"%e", " 3"},
12055682Smarkm	 {"%H", "12"},
12155682Smarkm	 {"%I", "12"},
12255682Smarkm	 {"%j", "003"},
12355682Smarkm	 {"%k", "12"},
12455682Smarkm	 {"%l", "12"},
12555682Smarkm	 {"%M", "05"},
12655682Smarkm	 {"%m", "01"},
12755682Smarkm	 {"%n", "\n"},
12855682Smarkm	 {"%p", "PM"},
12955682Smarkm	 {"%S", "06"},
13055682Smarkm	 {"%t", "\t"},
13155682Smarkm	 {"%w", "6"},
13255682Smarkm	 {"%Y", "1970"},
13355682Smarkm	 {"%y", "70"},
13455682Smarkm	 {"%U", "00"},
13555682Smarkm	 {"%W", "00"},
13655682Smarkm	 {"%V", "01"},
13755682Smarkm	 {"%%", "%"},
13855682Smarkm	 {NULL, NULL}
13955682Smarkm     }
14055682Smarkm    },
14155682Smarkm    {259200,
14255682Smarkm     {
14355682Smarkm	 {"%A", "Sunday"},
14455682Smarkm	 {"%a", "Sun"},
14555682Smarkm	 {"%B", "January"},
14655682Smarkm	 {"%b", "Jan"},
14755682Smarkm	 {"%C", "19"},
14855682Smarkm	 {"%d", "04"},
14955682Smarkm	 {"%e", " 4"},
15055682Smarkm	 {"%H", "00"},
15155682Smarkm	 {"%I", "12"},
15255682Smarkm	 {"%j", "004"},
15355682Smarkm	 {"%k", " 0"},
15455682Smarkm	 {"%l", "12"},
15555682Smarkm	 {"%M", "00"},
15655682Smarkm	 {"%m", "01"},
15755682Smarkm	 {"%n", "\n"},
15855682Smarkm	 {"%p", "AM"},
15955682Smarkm	 {"%S", "00"},
16055682Smarkm	 {"%t", "\t"},
16155682Smarkm	 {"%w", "0"},
16255682Smarkm	 {"%Y", "1970"},
16355682Smarkm	 {"%y", "70"},
16455682Smarkm	 {"%U", "01"},
16555682Smarkm	 {"%W", "00"},
16655682Smarkm	 {"%V", "01"},
16755682Smarkm	 {"%%", "%"},
16855682Smarkm	 {NULL, NULL}
16955682Smarkm     }
17055682Smarkm    },
17155682Smarkm    {915148800,
17255682Smarkm     {
17355682Smarkm	 {"%A", "Friday"},
17455682Smarkm	 {"%a", "Fri"},
17555682Smarkm	 {"%B", "January"},
17655682Smarkm	 {"%b", "Jan"},
17755682Smarkm	 {"%C", "19"},
17855682Smarkm	 {"%d", "01"},
17955682Smarkm	 {"%e", " 1"},
18055682Smarkm	 {"%H", "00"},
18155682Smarkm	 {"%I", "12"},
18255682Smarkm	 {"%j", "001"},
18355682Smarkm	 {"%k", " 0"},
18455682Smarkm	 {"%l", "12"},
18555682Smarkm	 {"%M", "00"},
18655682Smarkm	 {"%m", "01"},
18755682Smarkm	 {"%n", "\n"},
18855682Smarkm	 {"%p", "AM"},
18955682Smarkm	 {"%S", "00"},
19055682Smarkm	 {"%t", "\t"},
19155682Smarkm	 {"%w", "5"},
19255682Smarkm	 {"%Y", "1999"},
19355682Smarkm	 {"%y", "99"},
19455682Smarkm	 {"%U", "00"},
19555682Smarkm	 {"%W", "00"},
19655682Smarkm	 {"%V", "53"},
19755682Smarkm	 {"%%", "%"},
19855682Smarkm	 {NULL, NULL}}
19955682Smarkm    },
20055682Smarkm    {942161105,
20155682Smarkm     {
20255682Smarkm
20355682Smarkm	 {"%A", "Tuesday"},
20455682Smarkm	 {"%a", "Tue"},
20555682Smarkm	 {"%B", "November"},
20655682Smarkm	 {"%b", "Nov"},
20755682Smarkm	 {"%C", "19"},
20855682Smarkm	 {"%d", "09"},
20955682Smarkm	 {"%e", " 9"},
21055682Smarkm	 {"%H", "15"},
21155682Smarkm	 {"%I", "03"},
21255682Smarkm	 {"%j", "313"},
21355682Smarkm	 {"%k", "15"},
21455682Smarkm	 {"%l", " 3"},
21555682Smarkm	 {"%M", "25"},
21655682Smarkm	 {"%m", "11"},
21755682Smarkm	 {"%n", "\n"},
21855682Smarkm	 {"%p", "PM"},
21955682Smarkm	 {"%S", "05"},
22055682Smarkm	 {"%t", "\t"},
22155682Smarkm	 {"%w", "2"},
22255682Smarkm	 {"%Y", "1999"},
22355682Smarkm	 {"%y", "99"},
22455682Smarkm	 {"%U", "45"},
22555682Smarkm	 {"%W", "45"},
22655682Smarkm	 {"%V", "45"},
22755682Smarkm	 {"%%", "%"},
22855682Smarkm	 {NULL, NULL}
22955682Smarkm     }
23055682Smarkm    }
23155682Smarkm};
23255682Smarkm
23355682Smarkmint
23455682Smarkmmain(int argc, char **argv)
23555682Smarkm{
23655682Smarkm    int i, j;
23755682Smarkm    int ret = 0;
23855682Smarkm
23955682Smarkm    for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) {
24055682Smarkm	struct tm *tm;
24155682Smarkm
24255682Smarkm	tm = gmtime (&tests[i].t);
24355682Smarkm
24455682Smarkm	for (j = 0; tests[i].vals[j].format != NULL; ++j) {
24555682Smarkm	    char buf[128];
24655682Smarkm	    size_t len;
24755682Smarkm	    struct tm tm2;
24855682Smarkm	    char *ptr;
24955682Smarkm
25055682Smarkm	    len = strftime (buf, sizeof(buf), tests[i].vals[j].format, tm);
25155682Smarkm	    if (len != strlen (buf)) {
252178825Sdfr		printf ("length of strftime(\"%s\") = %lu (\"%s\")\n",
253178825Sdfr			tests[i].vals[j].format, (unsigned long)len,
25455682Smarkm			buf);
25555682Smarkm		++ret;
25655682Smarkm		continue;
25755682Smarkm	    }
25855682Smarkm	    if (strcmp (buf, tests[i].vals[j].result) != 0) {
25955682Smarkm		printf ("result of strftime(\"%s\") = \"%s\" != \"%s\"\n",
26055682Smarkm			tests[i].vals[j].format, buf,
26155682Smarkm			tests[i].vals[j].result);
26255682Smarkm		++ret;
26355682Smarkm		continue;
26455682Smarkm	    }
26555682Smarkm	    memset (&tm2, 0, sizeof(tm2));
26655682Smarkm	    ptr = strptime (tests[i].vals[j].result,
26755682Smarkm			    tests[i].vals[j].format,
26855682Smarkm			    &tm2);
26955682Smarkm	    if (ptr == NULL || *ptr != '\0') {
27055682Smarkm		printf ("bad return value from strptime("
27155682Smarkm			"\"%s\", \"%s\")\n",
27255682Smarkm			tests[i].vals[j].result,
27355682Smarkm			tests[i].vals[j].format);
27455682Smarkm		++ret;
27555682Smarkm	    }
27655682Smarkm	    strftime (buf, sizeof(buf), tests[i].vals[j].format, &tm2);
27755682Smarkm	    if (strcmp (buf, tests[i].vals[j].result) != 0) {
27855682Smarkm		printf ("reverse of \"%s\" failed: \"%s\" vs \"%s\"\n",
27955682Smarkm			tests[i].vals[j].format,
28055682Smarkm			buf, tests[i].vals[j].result);
28155682Smarkm		++ret;
28255682Smarkm	    }
28355682Smarkm	}
28455682Smarkm    }
285178825Sdfr    {
286178825Sdfr	struct tm tm;
287178825Sdfr	memset(&tm, 0, sizeof(tm));
288178825Sdfr	strptime ("200505", "%Y%m", &tm);
289178825Sdfr	if (tm.tm_year != 105)
290178825Sdfr	    ++ret;
291178825Sdfr	if (tm.tm_mon != 4)
292178825Sdfr	    ++ret;
293178825Sdfr    }
29455682Smarkm    if (ret) {
29555682Smarkm	printf ("%d errors\n", ret);
29655682Smarkm	return 1;
29755682Smarkm    } else
29855682Smarkm	return 0;
29955682Smarkm}
300