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