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