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