xref: /freebsd/lib/libc/tests/stdio/snprintf_test.c (revision 4ec9ee9912765ac4ca57353999caa92a23283d8e)
1b9385720SDag-Erling Smørgrav /*-
2b9385720SDag-Erling Smørgrav  * Copyright (c) 2023 Dag-Erling Smørgrav
3b9385720SDag-Erling Smørgrav  *
4b9385720SDag-Erling Smørgrav  * SPDX-License-Identifier: BSD-2-Clause
5b9385720SDag-Erling Smørgrav  */
6b9385720SDag-Erling Smørgrav 
7b9385720SDag-Erling Smørgrav #include <assert.h>
8b9385720SDag-Erling Smørgrav #include <limits.h>
9b9385720SDag-Erling Smørgrav #include <locale.h>
10b9385720SDag-Erling Smørgrav #include <stdint.h>
11b9385720SDag-Erling Smørgrav #include <stdio.h>
12b9385720SDag-Erling Smørgrav 
13b9385720SDag-Erling Smørgrav #include <atf-c.h>
14b9385720SDag-Erling Smørgrav 
15*4ec9ee99SDag-Erling Smørgrav #ifndef nitems
16*4ec9ee99SDag-Erling Smørgrav #define nitems(a) (sizeof(a) / sizeof(a[0]))
17*4ec9ee99SDag-Erling Smørgrav #endif
18*4ec9ee99SDag-Erling Smørgrav 
19b9385720SDag-Erling Smørgrav #define SNPRINTF_TEST(output, format, ...)				\
20b9385720SDag-Erling Smørgrav 	do {								\
21b9385720SDag-Erling Smørgrav 		char buf[256];						\
22*4ec9ee99SDag-Erling Smørgrav 		assert(strlen(output) < nitems(buf));			\
23*4ec9ee99SDag-Erling Smørgrav 		int ret = snprintf(buf, nitems(buf), format,		\
24*4ec9ee99SDag-Erling Smørgrav 		    __VA_ARGS__);					\
25b9385720SDag-Erling Smørgrav 		ATF_CHECK_EQ(strlen(output), ret);			\
26b9385720SDag-Erling Smørgrav 		if (ret > 0) {						\
27*4ec9ee99SDag-Erling Smørgrav 			ATF_CHECK_EQ(0, strcmp(output, buf));		\
28b9385720SDag-Erling Smørgrav 		}							\
29b9385720SDag-Erling Smørgrav 	} while (0)
30b9385720SDag-Erling Smørgrav 
31b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_b);
32b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_b, tc)
33b9385720SDag-Erling Smørgrav {
34b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%b", 0);
35b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%12b", 0);
36b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%012b", 0);
37b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1", "%b", 1);
38b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           1", "%12b", 1);
39b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000001", "%012b", 1);
40b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX);
41b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%#b", 0);
42b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%#12b", 0);
43b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%#012b", 0);
44b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0b1", "%#b", 1);
45b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("         0b1", "%#12b", 1);
46b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0b0000000001", "%#012b", 1);
47b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX);
48b9385720SDag-Erling Smørgrav }
49b9385720SDag-Erling Smørgrav 
50b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_B);
51b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_B, tc)
52b9385720SDag-Erling Smørgrav {
53b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%B", 0);
54b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%12B", 0);
55b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%012B", 0);
56b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1", "%B", 1);
57b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           1", "%12B", 1);
58b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000001", "%012B", 1);
59b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX);
60b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%#B", 0);
61b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%#12B", 0);
62b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%#012B", 0);
63b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0B1", "%#B", 1);
64b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("         0B1", "%#12B", 1);
65b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0B0000000001", "%#012B", 1);
66b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX);
67b9385720SDag-Erling Smørgrav }
68b9385720SDag-Erling Smørgrav 
69b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_d);
70b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_d, tc)
71b9385720SDag-Erling Smørgrav {
72b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%d", 0);
73b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%12d", 0);
74b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%012d", 0);
75b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1", "%d", 1);
76b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           1", "%12d", 1);
77b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000001", "%012d", 1);
78b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("2147483647", "%d", INT_MAX);
79b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("  2147483647", "%12d", INT_MAX);
80b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("002147483647", "%012d", INT_MAX);
81b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("2,147,483,647", "%'d", INT_MAX);
82b9385720SDag-Erling Smørgrav }
83b9385720SDag-Erling Smørgrav 
84b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_x);
85b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_x, tc)
86b9385720SDag-Erling Smørgrav {
87b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%x", 0);
88b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%12x", 0);
89b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%012x", 0);
90b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1", "%x", 1);
91b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           1", "%12x", 1);
92b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000001", "%012x", 1);
93b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("7fffffff", "%x", INT_MAX);
94b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("    7fffffff", "%12x", INT_MAX);
95b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("00007fffffff", "%012x", INT_MAX);
96b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%#x", 0);
97b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%#12x", 0);
98b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%#012x", 0);
99b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0x1", "%#x", 1);
100b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("         0x1", "%#12x", 1);
101b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0x0000000001", "%#012x", 1);
102b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0x7fffffff", "%#x", INT_MAX);
103b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("  0x7fffffff", "%#12x", INT_MAX);
104b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX);
105b9385720SDag-Erling Smørgrav }
106b9385720SDag-Erling Smørgrav 
107b9385720SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(snprintf_X);
108b9385720SDag-Erling Smørgrav ATF_TC_BODY(snprintf_X, tc)
109b9385720SDag-Erling Smørgrav {
110b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%X", 0);
111b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%12X", 0);
112b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%012X", 0);
113b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("1", "%X", 1);
114b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           1", "%12X", 1);
115b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000001", "%012X", 1);
116b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("7FFFFFFF", "%X", INT_MAX);
117b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("    7FFFFFFF", "%12X", INT_MAX);
118b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX);
119b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0", "%#X", 0);
120b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("           0", "%#12X", 0);
121b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("000000000000", "%#012X", 0);
122b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0X1", "%#X", 1);
123b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("         0X1", "%#12X", 1);
124b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0X0000000001", "%#012X", 1);
125b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX);
126b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("  0X7FFFFFFF", "%#12X", INT_MAX);
127b9385720SDag-Erling Smørgrav 	SNPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX);
128b9385720SDag-Erling Smørgrav }
129b9385720SDag-Erling Smørgrav 
130b9385720SDag-Erling Smørgrav ATF_TP_ADD_TCS(tp)
131b9385720SDag-Erling Smørgrav {
132b9385720SDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "en_US.UTF-8");
133b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, snprintf_b);
134b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, snprintf_B);
135b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, snprintf_d);
136b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, snprintf_x);
137b9385720SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, snprintf_X);
138b9385720SDag-Erling Smørgrav 	return (atf_no_error());
139b9385720SDag-Erling Smørgrav }
140