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