scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

  1/*
  2output:
  3testing
  4test1:
  5	test 0
  6		n=6:Friday
  7	test 1
  8		n=7:January
  9	test 2
 10		n=2:20
 11	test 3
 12		n=8:01/01/21
 13	test 4
 14		n=10:2021-01-01
 15	test 5
 16		n=4:2020
 17	test 6
 18		n=2:10
 19	test 7
 20		n=2:10
 21	test 8
 22		n=2:30
 23	test 9
 24		n=5:10:30
 25	test 10
 26		n=2:59
 27	test 11
 28		n=8:14:30:59
 29	test 12
 30		n=2:00
 31	test 13
 32		n=2:53
 33	test 14
 34		n=2:00
 35	test 15
 36		n=8:14:30:59
 37	test 16
 38		n=4:2021
 39	test 17
 40		n=4:2021
 41	test 18
 42		n=3:UTC
 43	test 19
 44		n=3:Fri
 45	test 20
 46		n=3:Jan
 47	test 21
 48		n=24:Fri Jan  1 10:30:59 2021
 49	test 22
 50		n=2:01
 51	test 23
 52		n=2: 1
 53	test 24
 54		n=2:20
 55	test 25
 56		n=3:Jan
 57	test 26
 58		n=3:001
 59	test 27
 60		n=2:01
 61	test 28
 62		n=1:
 63
 64	test 29
 65		n=2:AM
 66	test 30
 67		n=2:PM
 68	test 31
 69		n=1:%
 70	test 32
 71		n=11:02:30:59 PM
 72	test 33
 73		n=1:	
 74	test 34
 75		n=1:5
 76	test 35
 77		n=1:5
 78	test 36
 79		n=8:01/01/21
 80	test 37
 81		n=2:21
 82	test 38
 83		n=5:+0000
 84	test 39
 85		n=7:49 1997
 86	test 40
 87		n=7:53 1998
 88test2:
 89test3:
 90test4:
 91test5:
 92test6:
 93test7:
 94test8:
 95test9:
 96test10:
 97test11:
 98test12:
 99test13:
100test14:
101test15:
102test16:
103test17:
104test18:
105test18:
106done
107end:
108*/
109
110#include <assert.h>
111#include <stdio.h>
112#include <stdlib.h>
113#include <string.h>
114#include <time.h>
115
116#define NELEM(x) (sizeof(x)/sizeof((x)[0]))
117
118struct test {
119	struct tm tm;
120	char *fmt;
121} tests[] = {
122	//sec, min,hour,mday,mon,year,wday,yday,isdst, fmt
123	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%A"},
124	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%B"},
125	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%C"},
126	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%D"},
127	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%F"},
128	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%G"},
129	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%H"},
130	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%I"},
131	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%M"},
132	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%R"},
133	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%S"},
134	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%T"},
135	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%U"},
136	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%V"},
137	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%W"},
138	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%X"},
139	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%Y"},
140	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%Y"},
141	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%Z"},
142	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%a"},
143	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%b"},
144	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%c"},
145	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%d"},
146	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%e"},
147	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%g"},
148	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%h"},
149	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%j"},
150	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%m"},
151	{{0},                                          "%n"},
152	{{ 59,  30,  10,   1,  0, 121,   5,   0},      "%p"},
153	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%p"},
154	{{0},                                          "%%"},
155	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%r"},
156	{{0},                                          "%t"},
157	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%u"},
158	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%w"},
159	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%x"},
160	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%y"},
161	{{ 59,  30,  14,   1,  0, 121,   5,   0},      "%z"},
162	{{ 59,  30,  10,   1, 11,  97,   2, 363},      "%V %G"},
163	{{ 59,  30,  10,   2,  0,  99,   6,   1},      "%V %G"},
164};
165
166#ifndef __unix__
167#define putenv(x) (x)
168/*
169 * Ok, this is by definition undefined behaviour because
170 * we are using the name of a library function. The reallity
171 * is that if you use a static linker then this would
172 * overload the libc getenv and it will work as expected,
173 * but if you use a dynamic linker then the internal
174 * references will be tied to the internal getenv function
175 * and this would not work. For our main use case that is
176 * testing scc libc this is good enough, and with the
177 * fallback to putenv this will work in the systems we are
178 * interested on
179 */
180char *
181getenv(const char *name)
182{
183	if (strcmp(name, "TZ") != 0)
184		return NULL;
185	return "UTC";
186}
187#endif
188
189void
190test1(void)
191{
192	int n;
193	char buf[70];
194	struct test *tp;
195
196	puts("test1:");
197	for (tp = tests; tp < &tests[NELEM(tests)]; ++tp) {
198		printf("\ttest %d\n", (int) (tp - tests));
199		mktime(&tp->tm);
200		n = strftime(buf, sizeof(buf), tp->fmt, &tp->tm);
201		printf("\t\tn=%d:%s\n", n, buf);
202	}
203}
204
205void
206test2(void)
207{
208	struct tm tm;
209	char s1[32], s2[32];
210	size_t n1, n2;
211
212	puts("test2:");
213	tm.tm_sec = 59;
214	tm.tm_min = 30;
215	tm.tm_hour = 10;
216	tm.tm_mday = 1;
217	tm.tm_mon = 0;
218	tm.tm_year = 121;
219	tm.tm_wday = 5;
220	tm.tm_yday = 0;
221
222	n1 = strftime(s1, 32, "%c", &tm);
223	n2 = strftime(s2, 32, "%Ec", &tm);
224
225	assert(n1 == 24 && strcmp(s1, "Fri Jan  1 10:30:59 2021") == 0);
226	assert(n2 == 24 && strcmp(s2, "Fri Jan  1 10:30:59 2021") == 0);
227}
228
229void
230test3(void)
231{
232	struct tm tm;
233	char s1[8], s2[8];
234	size_t n1, n2;
235
236	puts("test3:");
237	tm.tm_sec = 59;
238	tm.tm_min = 30;
239	tm.tm_hour = 10;
240	tm.tm_mday = 1;
241	tm.tm_mon = 0;
242	tm.tm_year = 121;
243	tm.tm_wday = 5;
244	tm.tm_yday = 0;
245
246	n1 = strftime(s1, 8, "%d", &tm);
247	n2 = strftime(s2, 8, "%Od", &tm);
248
249	assert(n1 == 2 && strcmp(s1, "01") == 0);
250	assert(n2 == 2 && strcmp(s2, "01") == 0);
251}
252
253void
254test4(void)
255{
256	struct tm tm;
257	char s1[8], s2[8];
258	size_t n1, n2;
259
260	puts("test4:");
261	tm.tm_sec = 59;
262	tm.tm_min = 30;
263	tm.tm_hour = 10;
264	tm.tm_mday = 1;
265	tm.tm_mon = 0;
266	tm.tm_year = 121;
267	tm.tm_wday = 5;
268	tm.tm_yday = 0;
269
270	n1 = strftime(s1, 8, "%e", &tm);
271	n2 = strftime(s2, 8, "%Oe", &tm);
272
273	assert(n1 == 2 && strcmp(s1, " 1") == 0);
274	assert(n2 == 2 && strcmp(s2, " 1") == 0);
275}
276
277void
278test5(void)
279{
280	struct tm tm;
281	char s1[8], s2[8];
282	size_t n1, n2;
283
284	puts("test5:");
285	tm.tm_sec = 59;
286	tm.tm_min = 30;
287	tm.tm_hour = 14;
288	tm.tm_mday = 1;
289	tm.tm_mon = 0;
290	tm.tm_year = 121;
291	tm.tm_wday = 5;
292	tm.tm_yday = 0;
293
294	n1 = strftime(s1, 8, "%m", &tm);
295	n2 = strftime(s2, 8, "%Om", &tm);
296
297	assert(n1 == 2 && strcmp(s1, "01") == 0);
298	assert(n2 == 2 && strcmp(s2, "01") == 0);
299}
300
301void
302test6(void)
303{
304	struct tm tm;
305	char s1[8], s2[8];
306	size_t n1, n2;
307
308	puts("test6:");
309	tm.tm_sec = 59;
310	tm.tm_min = 30;
311	tm.tm_hour = 14;
312	tm.tm_mday = 1;
313	tm.tm_mon = 0;
314	tm.tm_year = 121;
315	tm.tm_wday = 5;
316	tm.tm_yday = 0;
317
318	n1 = strftime(s1, 8, "%u", &tm);
319	n2 = strftime(s2, 8, "%Ou", &tm);
320
321	assert(n1 == 1 && strcmp(s1, "5") == 0);
322	assert(n2 == 1 && strcmp(s2, "5") == 0);
323}
324
325void
326test7(void)
327{
328	struct tm tm;
329	char s1[8], s2[8];
330	size_t n1, n2;
331
332	puts("test7:");
333	tm.tm_sec = 59;
334	tm.tm_min = 30;
335	tm.tm_hour = 14;
336	tm.tm_mday = 1;
337	tm.tm_mon = 0;
338	tm.tm_year = 121;
339	tm.tm_wday = 5;
340	tm.tm_yday = 0;
341
342	n1 = strftime(s1, 8, "%w", &tm);
343	n2 = strftime(s2, 8, "%Ow", &tm);
344
345	assert(n1 == 1 && strcmp(s1, "5") == 0);
346	assert(n2 == 1 && strcmp(s2, "5") == 0);
347}
348
349void
350test8(void)
351{
352	struct tm tm;
353	char s1[16], s2[16];
354	size_t n1, n2;
355
356	puts("test8:");
357	tm.tm_sec = 59;
358	tm.tm_min = 30;
359	tm.tm_hour = 14;
360	tm.tm_mday = 1;
361	tm.tm_mon = 0;
362	tm.tm_year = 121;
363	tm.tm_wday = 5;
364	tm.tm_yday = 0;
365
366	n1 = strftime(s1, 16, "%x", &tm);
367	n2 = strftime(s2, 16, "%Ex", &tm);
368
369	assert(n1 == 8 && strcmp(s1, "01/01/21") == 0);
370	assert(n2 == 8 && strcmp(s2, "01/01/21") == 0);
371}
372
373void
374test9(void)
375{
376	struct tm tm;
377	char s1[8], s2[8], s3[8];
378	size_t n1, n2, n3;
379
380	puts("test9:");
381	tm.tm_sec = 59;
382	tm.tm_min = 30;
383	tm.tm_hour = 14;
384	tm.tm_mday = 1;
385	tm.tm_mon = 0;
386	tm.tm_year = 121;
387	tm.tm_wday = 5;
388	tm.tm_yday = 0;
389
390	n1 = strftime(s1, 8, "%y", &tm);
391	n2 = strftime(s2, 8, "%Ey", &tm);
392	n3 = strftime(s3, 8, "%Oy", &tm);
393
394	assert(n1 == 2 && strcmp(s1, "21") == 0);
395	assert(n2 == 2 && strcmp(s2, "21") == 0);
396	assert(n3 == 2 && strcmp(s3, "21") == 0);
397}
398
399void
400test10(void)
401{
402	struct tm tm;
403	char s1[8], s2[8];
404	size_t n1, n2;
405
406	puts("test10:");
407	tm.tm_sec = 59;
408	tm.tm_min = 30;
409	tm.tm_hour = 10;
410	tm.tm_mday = 1;
411	tm.tm_mon = 0;
412	tm.tm_year = 121;
413	tm.tm_wday = 5;
414	tm.tm_yday = 0;
415
416	n1 = strftime(s1, 8, "%C", &tm);
417	n2 = strftime(s2, 8, "%EC", &tm);
418
419	assert(n1 == 2 && strcmp(s1, "20") == 0);
420	assert(n2 == 2 && strcmp(s2, "20") == 0);
421}
422
423void
424test11(void)
425{
426	struct tm tm;
427	char s1[8], s2[8];
428	size_t n1, n2;
429
430	puts("test11:");
431	tm.tm_sec = 59;
432	tm.tm_min = 30;
433	tm.tm_hour = 14;
434	tm.tm_mday = 1;
435	tm.tm_mon = 0;
436	tm.tm_year = 121;
437	tm.tm_wday = 5;
438	tm.tm_yday = 0;
439
440	n1 = strftime(s1, 8, "%H", &tm);
441	n2 = strftime(s2, 8, "%OH", &tm);
442
443	assert(n1 == 2 && strcmp(s1, "14") == 0);
444	assert(n2 == 2 && strcmp(s2, "14") == 0);
445}
446
447void
448test12(void)
449{
450	struct tm tm;
451	char s1[8], s2[8];
452	size_t n1, n2;
453
454	puts("test12:");
455	tm.tm_sec = 59;
456	tm.tm_min = 30;
457	tm.tm_hour = 14;
458	tm.tm_mday = 1;
459	tm.tm_mon = 0;
460	tm.tm_year = 121;
461	tm.tm_wday = 5;
462	tm.tm_yday = 0;
463
464	n1 = strftime(&s1[0], 8, "%I", &tm);
465	n2 = strftime(&s2[0], 8, "%OI", &tm);
466
467	assert(n1 == 2 && strcmp(s1, "02") == 0);
468	assert(n2 == 2 && strcmp(s2, "02") == 0);
469}
470
471void
472test13(void)
473{
474	struct tm tm;
475	char s1[8], s2[8];
476	size_t n1, n2;
477
478	puts("test13:");
479	tm.tm_sec = 59;
480	tm.tm_min = 30;
481	tm.tm_hour = 14;
482	tm.tm_mday = 1;
483	tm.tm_mon = 0;
484	tm.tm_year = 121;
485	tm.tm_wday = 5;
486	tm.tm_yday = 0;
487
488	n1 = strftime(s1, 8, "%M", &tm);
489	n2 = strftime(s2, 8, "%OM", &tm);
490
491	assert(n1 == 2 && strcmp(s1, "30") == 0);
492	assert(n2 == 2 && strcmp(s2, "30") == 0);
493}
494
495void
496test14(void)
497{
498	struct tm tm;
499	char s1[8], s2[8];
500	size_t n1, n2;
501
502	puts("test14:");
503	tm.tm_sec = 59;
504	tm.tm_min = 30;
505	tm.tm_hour = 14;
506	tm.tm_mday = 1;
507	tm.tm_mon = 0;
508	tm.tm_year = 121;
509	tm.tm_wday = 5;
510	tm.tm_yday = 0;
511
512	n1 = strftime(s1, 8, "%S", &tm);
513	n2 = strftime(s2, 8, "%OS", &tm);
514
515	assert(n1 == 2 && strcmp(s1, "59") == 0);
516	assert(n2 == 2 && strcmp(s2, "59") == 0);
517}
518
519void
520test15(void)
521{
522	struct tm tm;
523	char s1[8], s2[8];
524	size_t n1, n2;
525
526	puts("test15:");
527	tm.tm_sec = 59;
528	tm.tm_min = 30;
529	tm.tm_hour = 14;
530	tm.tm_mday = 1;
531	tm.tm_mon = 0;
532	tm.tm_year = 121;
533	tm.tm_wday = 5;
534	tm.tm_yday = 0;
535
536	n1 = strftime(s1, 8, "%U", &tm);
537	n2 = strftime(s2, 8, "%OU", &tm);
538
539	assert(n1 == 2 && strcmp(s1, "00") == 0);
540	assert(n2 == 2 && strcmp(s2, "00") == 0);
541}
542
543void
544test16(void)
545{
546	struct tm tm;
547	char s1[8], s2[8];
548	size_t n1, n2;
549
550	puts("test16:");
551	tm.tm_sec = 59;
552	tm.tm_min = 30;
553	tm.tm_hour = 14;
554	tm.tm_mday = 1;
555	tm.tm_mon = 0;
556	tm.tm_year = 121;
557	tm.tm_wday = 5;
558	tm.tm_yday = 0;
559
560	n1 = strftime(s1, 8, "%V", &tm);
561	n2 = strftime(s2, 8, "%OV", &tm);
562
563	assert(n1 == 2 && strcmp(s1, "53") == 0);
564	assert(n2 == 2 && strcmp(s2, "53") == 0);
565}
566
567void
568test17(void)
569{
570	struct tm tm;
571	char s1[8], s2[8];
572	size_t n1, n2;
573
574	puts("test17:");
575	tm.tm_sec = 59;
576	tm.tm_min = 30;
577	tm.tm_hour = 14;
578	tm.tm_mday = 1;
579	tm.tm_mon = 0;
580	tm.tm_year = 121;
581	tm.tm_wday = 5;
582	tm.tm_yday = 0;
583
584	n1 = strftime(s1, 8, "%W", &tm);
585	n2 = strftime(s2, 8, "%OW", &tm);
586
587	assert(n1 == 2 && strcmp(s1, "00") == 0);
588	assert(n2 == 2 && strcmp(s2, "00") == 0);
589
590}
591
592void
593test18(void)
594{
595	struct tm tm;
596	char s1[16], s2[16];
597	size_t n1, n2;
598
599	puts("test18:");
600	tm.tm_sec = 59;
601	tm.tm_min = 30;
602	tm.tm_hour = 14;
603	tm.tm_mday = 1;
604	tm.tm_mon = 0;
605	tm.tm_year = 121;
606	tm.tm_wday = 5;
607	tm.tm_yday = 0;
608
609	n1 = strftime(&s1[0], 16, "%X", &tm);
610	n2 = strftime(&s2[0], 16, "%EX", &tm);
611
612	assert(n1 == 8 && strcmp(s1, "14:30:59") == 0);
613	assert(n2 == 8 && strcmp(s2, "14:30:59") == 0);
614}
615
616void
617test19(void)
618{
619	struct tm tm;
620	char s1[8], s2[8];
621	size_t n1, n2;
622
623	puts("test18:");
624	tm.tm_sec = 59;
625	tm.tm_min = 30;
626	tm.tm_hour = 14;
627	tm.tm_mday = 1;
628	tm.tm_mon = 0;
629	tm.tm_year = 121;
630	tm.tm_wday = 5;
631	tm.tm_yday = 0;
632
633	n1 = strftime(s1, 8, "%Y", &tm);
634	n2 = strftime(s2, 8, "%EY", &tm);
635
636	assert(n1 == 4 && strcmp(s1, "2021") == 0);
637	assert(n2 == 4 && strcmp(s2, "2021") == 0);
638}
639
640int
641main(void)
642{
643	puts("testing");
644	putenv("TZ=UTC");
645	test1();
646	test2();
647	test3();
648	test4();
649	test5();
650	test6();
651	test7();
652	test8();
653	test9();
654	test10();
655	test11();
656	test12();
657	test13();
658	test14();
659	test15();
660	test16();
661	test17();
662	test18();
663	test19();
664	puts("done");
665
666	return 0;
667}