xref: /freebsd/lib/libc/tests/stdio/swprintf_test.c (revision 88a9b6e1ed82b562f52bae26b3de257495cd1983)
14ec9ee99SDag-Erling Smørgrav /*-
24ec9ee99SDag-Erling Smørgrav  * Copyright (c) 2023 Dag-Erling Smørgrav
34ec9ee99SDag-Erling Smørgrav  *
44ec9ee99SDag-Erling Smørgrav  * SPDX-License-Identifier: BSD-2-Clause
54ec9ee99SDag-Erling Smørgrav  */
64ec9ee99SDag-Erling Smørgrav 
74ec9ee99SDag-Erling Smørgrav #include <assert.h>
84ec9ee99SDag-Erling Smørgrav #include <limits.h>
94ec9ee99SDag-Erling Smørgrav #include <locale.h>
104ec9ee99SDag-Erling Smørgrav #include <stdint.h>
114ec9ee99SDag-Erling Smørgrav #include <stdio.h>
124ec9ee99SDag-Erling Smørgrav #include <wchar.h>
134ec9ee99SDag-Erling Smørgrav 
144ec9ee99SDag-Erling Smørgrav #include <atf-c.h>
154ec9ee99SDag-Erling Smørgrav 
164ec9ee99SDag-Erling Smørgrav #ifndef nitems
174ec9ee99SDag-Erling Smørgrav #define nitems(a) (sizeof(a) / sizeof(a[0]))
184ec9ee99SDag-Erling Smørgrav #endif
194ec9ee99SDag-Erling Smørgrav 
204ec9ee99SDag-Erling Smørgrav #define SWPRINTF_TEST(output, format, ...)				\
214ec9ee99SDag-Erling Smørgrav 	do {								\
224ec9ee99SDag-Erling Smørgrav 		wchar_t buf[256];					\
234ec9ee99SDag-Erling Smørgrav 		assert(wcslen(L##output) < nitems(buf));		\
244ec9ee99SDag-Erling Smørgrav 		int ret = swprintf(buf, nitems(buf), L##format,		\
254ec9ee99SDag-Erling Smørgrav 		    __VA_ARGS__);					\
264ec9ee99SDag-Erling Smørgrav 		ATF_CHECK_EQ(wcslen(L##output), ret);			\
274ec9ee99SDag-Erling Smørgrav 		if (ret > 0) {						\
284ec9ee99SDag-Erling Smørgrav 			ATF_CHECK_EQ(0, wcscmp(L##output, buf));	\
294ec9ee99SDag-Erling Smørgrav 		}							\
304ec9ee99SDag-Erling Smørgrav 	} while (0)
314ec9ee99SDag-Erling Smørgrav 
324ec9ee99SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_b);
ATF_TC_BODY(swprintf_b,tc)334ec9ee99SDag-Erling Smørgrav ATF_TC_BODY(swprintf_b, tc)
344ec9ee99SDag-Erling Smørgrav {
354ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%b", 0);
364ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%12b", 0);
374ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%012b", 0);
384ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1", "%b", 1);
394ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           1", "%12b", 1);
404ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000001", "%012b", 1);
414ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX);
424ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%#b", 0);
434ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%#12b", 0);
444ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%#012b", 0);
454ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0b1", "%#b", 1);
464ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("         0b1", "%#12b", 1);
474ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0b0000000001", "%#012b", 1);
484ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX);
494ec9ee99SDag-Erling Smørgrav }
504ec9ee99SDag-Erling Smørgrav 
514ec9ee99SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_B);
ATF_TC_BODY(swprintf_B,tc)524ec9ee99SDag-Erling Smørgrav ATF_TC_BODY(swprintf_B, tc)
534ec9ee99SDag-Erling Smørgrav {
544ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%B", 0);
554ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%12B", 0);
564ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%012B", 0);
574ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1", "%B", 1);
584ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           1", "%12B", 1);
594ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000001", "%012B", 1);
604ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX);
614ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%#B", 0);
624ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%#12B", 0);
634ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%#012B", 0);
644ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0B1", "%#B", 1);
654ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("         0B1", "%#12B", 1);
664ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0B0000000001", "%#012B", 1);
674ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX);
684ec9ee99SDag-Erling Smørgrav }
694ec9ee99SDag-Erling Smørgrav 
704ec9ee99SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_d);
ATF_TC_BODY(swprintf_d,tc)714ec9ee99SDag-Erling Smørgrav ATF_TC_BODY(swprintf_d, tc)
724ec9ee99SDag-Erling Smørgrav {
734ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%d", 0);
744ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%12d", 0);
754ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%012d", 0);
764ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1", "%d", 1);
774ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           1", "%12d", 1);
784ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000001", "%012d", 1);
794ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("2147483647", "%d", INT_MAX);
804ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("  2147483647", "%12d", INT_MAX);
814ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("002147483647", "%012d", INT_MAX);
824ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("2,147,483,647", "%'d", INT_MAX);
834ec9ee99SDag-Erling Smørgrav }
844ec9ee99SDag-Erling Smørgrav 
854ec9ee99SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_x);
ATF_TC_BODY(swprintf_x,tc)864ec9ee99SDag-Erling Smørgrav ATF_TC_BODY(swprintf_x, tc)
874ec9ee99SDag-Erling Smørgrav {
884ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%x", 0);
894ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%12x", 0);
904ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%012x", 0);
914ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1", "%x", 1);
924ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           1", "%12x", 1);
934ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000001", "%012x", 1);
944ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("7fffffff", "%x", INT_MAX);
954ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("    7fffffff", "%12x", INT_MAX);
964ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("00007fffffff", "%012x", INT_MAX);
974ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%#x", 0);
984ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%#12x", 0);
994ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%#012x", 0);
1004ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0x1", "%#x", 1);
1014ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("         0x1", "%#12x", 1);
1024ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0x0000000001", "%#012x", 1);
1034ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0x7fffffff", "%#x", INT_MAX);
1044ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("  0x7fffffff", "%#12x", INT_MAX);
1054ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX);
1064ec9ee99SDag-Erling Smørgrav }
1074ec9ee99SDag-Erling Smørgrav 
1084ec9ee99SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_X);
ATF_TC_BODY(swprintf_X,tc)1094ec9ee99SDag-Erling Smørgrav ATF_TC_BODY(swprintf_X, tc)
1104ec9ee99SDag-Erling Smørgrav {
1114ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%X", 0);
1124ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%12X", 0);
1134ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%012X", 0);
1144ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("1", "%X", 1);
1154ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           1", "%12X", 1);
1164ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000001", "%012X", 1);
1174ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("7FFFFFFF", "%X", INT_MAX);
1184ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("    7FFFFFFF", "%12X", INT_MAX);
1194ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX);
1204ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%#X", 0);
1214ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("           0", "%#12X", 0);
1224ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("000000000000", "%#012X", 0);
1234ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0X1", "%#X", 1);
1244ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("         0X1", "%#12X", 1);
1254ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0X0000000001", "%#012X", 1);
1264ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX);
1274ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("  0X7FFFFFFF", "%#12X", INT_MAX);
1284ec9ee99SDag-Erling Smørgrav 	SWPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX);
1294ec9ee99SDag-Erling Smørgrav }
1304ec9ee99SDag-Erling Smørgrav 
13112b1c1e3SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_wN);
ATF_TC_BODY(swprintf_wN,tc)13212b1c1e3SDag-Erling Smørgrav ATF_TC_BODY(swprintf_wN, tc)
13312b1c1e3SDag-Erling Smørgrav {
13412b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w8d", (int8_t)0);
135*88a9b6e1SDag-Erling Smørgrav 	SWPRINTF_TEST("-128", "%w8d", (int8_t)SCHAR_MIN);
136*88a9b6e1SDag-Erling Smørgrav 	SWPRINTF_TEST("127", "%w8d", (int8_t)SCHAR_MAX);
13712b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w8u", (uint8_t)0);
13812b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("255", "%w8u", (uint8_t)UCHAR_MAX);
13912b1c1e3SDag-Erling Smørgrav 
14012b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w16d", (int16_t)0);
14112b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-32768", "%w16d", (int16_t)SHRT_MIN);
14212b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("32767", "%w16d", (int16_t)SHRT_MAX);
14312b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w16u", (uint16_t)0);
14412b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("65535", "%w16u", (uint16_t)USHRT_MAX);
14512b1c1e3SDag-Erling Smørgrav 
14612b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w32d", (int32_t)0);
14712b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-2147483648", "%w32d", (int32_t)INT_MIN);
14812b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("2147483647", "%w32d", (int32_t)INT_MAX);
14912b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w32u", (uint32_t)0);
15012b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("4294967295", "%w32u", (uint32_t)UINT_MAX);
15112b1c1e3SDag-Erling Smørgrav 
15212b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w64d", (int64_t)0);
15312b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-9223372036854775808", "%w64d", (int64_t)LLONG_MIN);
15412b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("9223372036854775807", "%w64d", (int64_t)LLONG_MAX);
15512b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%w64u", (uint64_t)0);
15612b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("18446744073709551615", "%w64u", (uint64_t)ULLONG_MAX);
15712b1c1e3SDag-Erling Smørgrav 
15812b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("wd", "%wd", 0);
15912b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("w1d", "%w1d", 0);
16012b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("w128d", "%w128d", 0);
16112b1c1e3SDag-Erling Smørgrav }
16212b1c1e3SDag-Erling Smørgrav 
16312b1c1e3SDag-Erling Smørgrav ATF_TC_WITHOUT_HEAD(swprintf_wfN);
ATF_TC_BODY(swprintf_wfN,tc)16412b1c1e3SDag-Erling Smørgrav ATF_TC_BODY(swprintf_wfN, tc)
16512b1c1e3SDag-Erling Smørgrav {
16612b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf8d", (int_fast8_t)0);
16712b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-2147483648", "%wf8d", (int_fast8_t)INT_MIN);
16812b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("2147483647", "%wf8d", (int_fast8_t)INT_MAX);
16912b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf8u", (uint8_t)0);
17012b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("4294967295", "%wf8u", (uint_fast8_t)UINT_MAX);
17112b1c1e3SDag-Erling Smørgrav 
17212b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf16d", (int_fast16_t)0);
17312b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-2147483648", "%wf16d", (int_fast16_t)INT_MIN);
17412b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("2147483647", "%wf16d", (int_fast16_t)INT_MAX);
17512b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf16u", (uint16_t)0);
17612b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("4294967295", "%wf16u", (uint_fast16_t)UINT_MAX);
17712b1c1e3SDag-Erling Smørgrav 
17812b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf32d", (int_fast32_t)0);
17912b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-2147483648", "%wf32d", (int_fast32_t)INT_MIN);
18012b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("2147483647", "%wf32d", (int_fast32_t)INT_MAX);
18112b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf32u", (uint32_t)0);
18212b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("4294967295", "%wf32u", (uint_fast32_t)UINT_MAX);
18312b1c1e3SDag-Erling Smørgrav 
18412b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf64d", (int_fast64_t)0);
18512b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("-9223372036854775808", "%wf64d", (int_fast64_t)LLONG_MIN);
18612b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("9223372036854775807", "%wf64d", (int_fast64_t)LLONG_MAX);
18712b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("0", "%wf64u", (uint64_t)0);
18812b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("18446744073709551615", "%wf64u", (uint_fast64_t)ULLONG_MAX);
18912b1c1e3SDag-Erling Smørgrav 
19012b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("wfd", "%wfd", 0);
19112b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("wf1d", "%wf1d", 0);
19212b1c1e3SDag-Erling Smørgrav 	SWPRINTF_TEST("wf128d", "%wf128d", 0);
19312b1c1e3SDag-Erling Smørgrav }
19412b1c1e3SDag-Erling Smørgrav 
ATF_TP_ADD_TCS(tp)1954ec9ee99SDag-Erling Smørgrav ATF_TP_ADD_TCS(tp)
1964ec9ee99SDag-Erling Smørgrav {
1974ec9ee99SDag-Erling Smørgrav 	setlocale(LC_NUMERIC, "en_US.UTF-8");
1984ec9ee99SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_b);
1994ec9ee99SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_B);
2004ec9ee99SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_d);
2014ec9ee99SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_x);
2024ec9ee99SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_X);
20312b1c1e3SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_wN);
20412b1c1e3SDag-Erling Smørgrav 	ATF_TP_ADD_TC(tp, swprintf_wfN);
2054ec9ee99SDag-Erling Smørgrav 	return (atf_no_error());
2064ec9ee99SDag-Erling Smørgrav }
207