1/* $NetBSD: strpftime-test.c,v 1.2 2017/01/28 21:31:50 christos Exp $ */ 2 3/* 4 * Copyright (c) 1999 Kungliga Tekniska H��gskolan 5 * (Royal Institute of Technology, Stockholm, Sweden). 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of KTH nor the names of its contributors may be 20 * used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 24 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 26 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 30 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 31 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 32 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 33 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 34 35#include <config.h> 36#include <krb5/roken.h> 37#ifdef TEST_STRPFTIME 38#include "strpftime-test.h" 39#endif 40 41enum { MAXSIZE = 26 }; 42 43static struct testcase { 44 time_t t; 45 struct { 46 const char *format; 47 const char *result; 48 } vals[MAXSIZE]; 49} tests[] = { 50 {0, 51 { 52 {"%A", "Thursday"}, 53 {"%a", "Thu"}, 54 {"%B", "January"}, 55 {"%b", "Jan"}, 56 {"%C", "19"}, 57 {"%d", "01"}, 58 {"%e", " 1"}, 59 {"%H", "00"}, 60 {"%I", "12"}, 61 {"%j", "001"}, 62 {"%k", " 0"}, 63 {"%l", "12"}, 64 {"%M", "00"}, 65 {"%m", "01"}, 66 {"%n", "\n"}, 67 {"%p", "AM"}, 68 {"%S", "00"}, 69 {"%t", "\t"}, 70 {"%w", "4"}, 71 {"%Y", "1970"}, 72 {"%y", "70"}, 73 {"%U", "00"}, 74 {"%W", "00"}, 75 {"%V", "01"}, 76 {"%%", "%"}, 77 {NULL, NULL}} 78 }, 79 {90000, 80 { 81 {"%A", "Friday"}, 82 {"%a", "Fri"}, 83 {"%B", "January"}, 84 {"%b", "Jan"}, 85 {"%C", "19"}, 86 {"%d", "02"}, 87 {"%e", " 2"}, 88 {"%H", "01"}, 89 {"%I", "01"}, 90 {"%j", "002"}, 91 {"%k", " 1"}, 92 {"%l", " 1"}, 93 {"%M", "00"}, 94 {"%m", "01"}, 95 {"%n", "\n"}, 96 {"%p", "AM"}, 97 {"%S", "00"}, 98 {"%t", "\t"}, 99 {"%w", "5"}, 100 {"%Y", "1970"}, 101 {"%y", "70"}, 102 {"%U", "00"}, 103 {"%W", "00"}, 104 {"%V", "01"}, 105 {"%%", "%"}, 106 {NULL, NULL} 107 } 108 }, 109 {216306, 110 { 111 {"%A", "Saturday"}, 112 {"%a", "Sat"}, 113 {"%B", "January"}, 114 {"%b", "Jan"}, 115 {"%C", "19"}, 116 {"%d", "03"}, 117 {"%e", " 3"}, 118 {"%H", "12"}, 119 {"%I", "12"}, 120 {"%j", "003"}, 121 {"%k", "12"}, 122 {"%l", "12"}, 123 {"%M", "05"}, 124 {"%m", "01"}, 125 {"%n", "\n"}, 126 {"%p", "PM"}, 127 {"%S", "06"}, 128 {"%t", "\t"}, 129 {"%w", "6"}, 130 {"%Y", "1970"}, 131 {"%y", "70"}, 132 {"%U", "00"}, 133 {"%W", "00"}, 134 {"%V", "01"}, 135 {"%%", "%"}, 136 {NULL, NULL} 137 } 138 }, 139 {259200, 140 { 141 {"%A", "Sunday"}, 142 {"%a", "Sun"}, 143 {"%B", "January"}, 144 {"%b", "Jan"}, 145 {"%C", "19"}, 146 {"%d", "04"}, 147 {"%e", " 4"}, 148 {"%H", "00"}, 149 {"%I", "12"}, 150 {"%j", "004"}, 151 {"%k", " 0"}, 152 {"%l", "12"}, 153 {"%M", "00"}, 154 {"%m", "01"}, 155 {"%n", "\n"}, 156 {"%p", "AM"}, 157 {"%S", "00"}, 158 {"%t", "\t"}, 159 {"%w", "0"}, 160 {"%Y", "1970"}, 161 {"%y", "70"}, 162 {"%U", "01"}, 163 {"%W", "00"}, 164 {"%V", "01"}, 165 {"%%", "%"}, 166 {NULL, NULL} 167 } 168 }, 169 {915148800, 170 { 171 {"%A", "Friday"}, 172 {"%a", "Fri"}, 173 {"%B", "January"}, 174 {"%b", "Jan"}, 175 {"%C", "19"}, 176 {"%d", "01"}, 177 {"%e", " 1"}, 178 {"%H", "00"}, 179 {"%I", "12"}, 180 {"%j", "001"}, 181 {"%k", " 0"}, 182 {"%l", "12"}, 183 {"%M", "00"}, 184 {"%m", "01"}, 185 {"%n", "\n"}, 186 {"%p", "AM"}, 187 {"%S", "00"}, 188 {"%t", "\t"}, 189 {"%w", "5"}, 190 {"%Y", "1999"}, 191 {"%y", "99"}, 192 {"%U", "00"}, 193 {"%W", "00"}, 194 {"%V", "53"}, 195 {"%%", "%"}, 196 {NULL, NULL}} 197 }, 198 {942161105, 199 { 200 201 {"%A", "Tuesday"}, 202 {"%a", "Tue"}, 203 {"%B", "November"}, 204 {"%b", "Nov"}, 205 {"%C", "19"}, 206 {"%d", "09"}, 207 {"%e", " 9"}, 208 {"%H", "15"}, 209 {"%I", "03"}, 210 {"%j", "313"}, 211 {"%k", "15"}, 212 {"%l", " 3"}, 213 {"%M", "25"}, 214 {"%m", "11"}, 215 {"%n", "\n"}, 216 {"%p", "PM"}, 217 {"%S", "05"}, 218 {"%t", "\t"}, 219 {"%w", "2"}, 220 {"%Y", "1999"}, 221 {"%y", "99"}, 222 {"%U", "45"}, 223 {"%W", "45"}, 224 {"%V", "45"}, 225 {"%%", "%"}, 226 {NULL, NULL} 227 } 228 } 229}; 230 231int 232main(int argc, char **argv) 233{ 234 int i, j; 235 int ret = 0; 236 237 for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) { 238 struct tm *tm; 239 240 tm = gmtime (&tests[i].t); 241 242 for (j = 0; tests[i].vals[j].format != NULL; ++j) { 243 char buf[128]; 244 size_t len; 245 struct tm tm2; 246 char *ptr; 247 248 len = strftime (buf, sizeof(buf), tests[i].vals[j].format, tm); 249 if (len != strlen (buf)) { 250 printf ("length of strftime(\"%s\") = %lu (\"%s\")\n", 251 tests[i].vals[j].format, (unsigned long)len, 252 buf); 253 ++ret; 254 continue; 255 } 256 if (strcmp (buf, tests[i].vals[j].result) != 0) { 257 printf ("result of strftime(\"%s\") = \"%s\" != \"%s\"\n", 258 tests[i].vals[j].format, buf, 259 tests[i].vals[j].result); 260 ++ret; 261 continue; 262 } 263 memset (&tm2, 0, sizeof(tm2)); 264 ptr = strptime (tests[i].vals[j].result, 265 tests[i].vals[j].format, 266 &tm2); 267 if (ptr == NULL || *ptr != '\0') { 268 printf ("bad return value from strptime(" 269 "\"%s\", \"%s\")\n", 270 tests[i].vals[j].result, 271 tests[i].vals[j].format); 272 ++ret; 273 } 274 strftime (buf, sizeof(buf), tests[i].vals[j].format, &tm2); 275 if (strcmp (buf, tests[i].vals[j].result) != 0) { 276 printf ("reverse of \"%s\" failed: \"%s\" vs \"%s\"\n", 277 tests[i].vals[j].format, 278 buf, tests[i].vals[j].result); 279 ++ret; 280 } 281 } 282 } 283 { 284 struct tm tm; 285 memset(&tm, 0, sizeof(tm)); 286 strptime ("200505", "%Y%m", &tm); 287 if (tm.tm_year != 105) 288 ++ret; 289 if (tm.tm_mon != 4) 290 ++ret; 291 } 292 if (ret) { 293 printf ("%d errors\n", ret); 294 return 1; 295 } else 296 return 0; 297} 298