diff --git a/lib/libc/tests/stdio/Makefile b/lib/libc/tests/stdio/Makefile index f7383e5b3ef4..2a8a4e69a6c4 100644 --- a/lib/libc/tests/stdio/Makefile +++ b/lib/libc/tests/stdio/Makefile @@ -1,48 +1,49 @@ .include ATF_TESTS_C+= eintr_test ATF_TESTS_C+= fdopen_test ATF_TESTS_C+= fmemopen2_test ATF_TESTS_C+= fopen2_test ATF_TESTS_C+= freopen_test ATF_TESTS_C+= getdelim_test ATF_TESTS_C+= gets_s_test ATF_TESTS_C+= mkostemp_test ATF_TESTS_C+= open_memstream2_test ATF_TESTS_C+= open_wmemstream_test ATF_TESTS_C+= perror_test ATF_TESTS_C+= print_positional_test ATF_TESTS_C+= printbasic_test ATF_TESTS_C+= printfloat_test ATF_TESTS_C+= scanfloat_test ATF_TESTS_C+= snprintf_test ATF_TESTS_C+= sscanf_test +ATF_TESTS_C+= swprintf_test ATF_TESTS_C+= swscanf_test SRCS.fopen2_test= fopen_test.c NETBSD_ATF_TESTS_C= clearerr_test NETBSD_ATF_TESTS_C+= fflush_test NETBSD_ATF_TESTS_C+= fmemopen_test NETBSD_ATF_TESTS_C+= fopen_test NETBSD_ATF_TESTS_C+= fputc_test NETBSD_ATF_TESTS_C+= mktemp_test NETBSD_ATF_TESTS_C+= open_memstream_test NETBSD_ATF_TESTS_C+= popen_test NETBSD_ATF_TESTS_C+= printf_test NETBSD_ATF_TESTS_C+= scanf_test LIBADD.eintr_test+= md LIBADD.printfloat_test+= m LIBADD.scanfloat_test+= m .if ${COMPILER_TYPE} == "gcc" # 90: use of assignment suppression and length modifier together in scanf format PROG_OVERRIDE_VARS+= NO_WFORMAT NO_WFORMAT.scanfloat_test= .endif .include "../Makefile.netbsd-tests" .include diff --git a/lib/libc/tests/stdio/snprintf_test.c b/lib/libc/tests/stdio/snprintf_test.c index 0c335bc1a512..10d938435b96 100644 --- a/lib/libc/tests/stdio/snprintf_test.c +++ b/lib/libc/tests/stdio/snprintf_test.c @@ -1,138 +1,139 @@ /*- * Copyright (c) 2023 Dag-Erling Smørgrav * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include -#define SNPRINTF_TEST(output, format, ...) \ +#ifndef nitems +#define nitems(a) (sizeof(a) / sizeof(a[0])) +#endif + +#define SNPRINTF_TEST(output, format, ...) \ do { \ char buf[256]; \ - assert(output == NULL || strlen(output) < sizeof(buf)); \ - int ret = snprintf(buf, sizeof(buf), format, __VA_ARGS__); \ - if (output == NULL) { \ - ATF_CHECK_EQ(-1, ret); \ - } else { \ - ATF_CHECK_EQ(strlen(output), ret); \ - if (ret > 0) { \ - ATF_CHECK_STREQ(output, buf); \ - } \ + assert(strlen(output) < nitems(buf)); \ + int ret = snprintf(buf, nitems(buf), format, \ + __VA_ARGS__); \ + ATF_CHECK_EQ(strlen(output), ret); \ + if (ret > 0) { \ + ATF_CHECK_EQ(0, strcmp(output, buf)); \ } \ } while (0) ATF_TC_WITHOUT_HEAD(snprintf_b); ATF_TC_BODY(snprintf_b, tc) { SNPRINTF_TEST("0", "%b", 0); SNPRINTF_TEST(" 0", "%12b", 0); SNPRINTF_TEST("000000000000", "%012b", 0); SNPRINTF_TEST("1", "%b", 1); SNPRINTF_TEST(" 1", "%12b", 1); SNPRINTF_TEST("000000000001", "%012b", 1); SNPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX); SNPRINTF_TEST("0", "%#b", 0); SNPRINTF_TEST(" 0", "%#12b", 0); SNPRINTF_TEST("000000000000", "%#012b", 0); SNPRINTF_TEST("0b1", "%#b", 1); SNPRINTF_TEST(" 0b1", "%#12b", 1); SNPRINTF_TEST("0b0000000001", "%#012b", 1); SNPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_B); ATF_TC_BODY(snprintf_B, tc) { SNPRINTF_TEST("0", "%B", 0); SNPRINTF_TEST(" 0", "%12B", 0); SNPRINTF_TEST("000000000000", "%012B", 0); SNPRINTF_TEST("1", "%B", 1); SNPRINTF_TEST(" 1", "%12B", 1); SNPRINTF_TEST("000000000001", "%012B", 1); SNPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX); SNPRINTF_TEST("0", "%#B", 0); SNPRINTF_TEST(" 0", "%#12B", 0); SNPRINTF_TEST("000000000000", "%#012B", 0); SNPRINTF_TEST("0B1", "%#B", 1); SNPRINTF_TEST(" 0B1", "%#12B", 1); SNPRINTF_TEST("0B0000000001", "%#012B", 1); SNPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_d); ATF_TC_BODY(snprintf_d, tc) { SNPRINTF_TEST("0", "%d", 0); SNPRINTF_TEST(" 0", "%12d", 0); SNPRINTF_TEST("000000000000", "%012d", 0); SNPRINTF_TEST("1", "%d", 1); SNPRINTF_TEST(" 1", "%12d", 1); SNPRINTF_TEST("000000000001", "%012d", 1); SNPRINTF_TEST("2147483647", "%d", INT_MAX); SNPRINTF_TEST(" 2147483647", "%12d", INT_MAX); SNPRINTF_TEST("002147483647", "%012d", INT_MAX); SNPRINTF_TEST("2,147,483,647", "%'d", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_x); ATF_TC_BODY(snprintf_x, tc) { SNPRINTF_TEST("0", "%x", 0); SNPRINTF_TEST(" 0", "%12x", 0); SNPRINTF_TEST("000000000000", "%012x", 0); SNPRINTF_TEST("1", "%x", 1); SNPRINTF_TEST(" 1", "%12x", 1); SNPRINTF_TEST("000000000001", "%012x", 1); SNPRINTF_TEST("7fffffff", "%x", INT_MAX); SNPRINTF_TEST(" 7fffffff", "%12x", INT_MAX); SNPRINTF_TEST("00007fffffff", "%012x", INT_MAX); SNPRINTF_TEST("0", "%#x", 0); SNPRINTF_TEST(" 0", "%#12x", 0); SNPRINTF_TEST("000000000000", "%#012x", 0); SNPRINTF_TEST("0x1", "%#x", 1); SNPRINTF_TEST(" 0x1", "%#12x", 1); SNPRINTF_TEST("0x0000000001", "%#012x", 1); SNPRINTF_TEST("0x7fffffff", "%#x", INT_MAX); SNPRINTF_TEST(" 0x7fffffff", "%#12x", INT_MAX); SNPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX); } ATF_TC_WITHOUT_HEAD(snprintf_X); ATF_TC_BODY(snprintf_X, tc) { SNPRINTF_TEST("0", "%X", 0); SNPRINTF_TEST(" 0", "%12X", 0); SNPRINTF_TEST("000000000000", "%012X", 0); SNPRINTF_TEST("1", "%X", 1); SNPRINTF_TEST(" 1", "%12X", 1); SNPRINTF_TEST("000000000001", "%012X", 1); SNPRINTF_TEST("7FFFFFFF", "%X", INT_MAX); SNPRINTF_TEST(" 7FFFFFFF", "%12X", INT_MAX); SNPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX); SNPRINTF_TEST("0", "%#X", 0); SNPRINTF_TEST(" 0", "%#12X", 0); SNPRINTF_TEST("000000000000", "%#012X", 0); SNPRINTF_TEST("0X1", "%#X", 1); SNPRINTF_TEST(" 0X1", "%#12X", 1); SNPRINTF_TEST("0X0000000001", "%#012X", 1); SNPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX); SNPRINTF_TEST(" 0X7FFFFFFF", "%#12X", INT_MAX); SNPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX); } ATF_TP_ADD_TCS(tp) { setlocale(LC_NUMERIC, "en_US.UTF-8"); ATF_TP_ADD_TC(tp, snprintf_b); ATF_TP_ADD_TC(tp, snprintf_B); ATF_TP_ADD_TC(tp, snprintf_d); ATF_TP_ADD_TC(tp, snprintf_x); ATF_TP_ADD_TC(tp, snprintf_X); return (atf_no_error()); } diff --git a/lib/libc/tests/stdio/swprintf_test.c b/lib/libc/tests/stdio/swprintf_test.c new file mode 100644 index 000000000000..23859b5cd2e1 --- /dev/null +++ b/lib/libc/tests/stdio/swprintf_test.c @@ -0,0 +1,140 @@ +/*- + * Copyright (c) 2023 Dag-Erling Smørgrav + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include +#include + +#include + +#ifndef nitems +#define nitems(a) (sizeof(a) / sizeof(a[0])) +#endif + +#define SWPRINTF_TEST(output, format, ...) \ + do { \ + wchar_t buf[256]; \ + assert(wcslen(L##output) < nitems(buf)); \ + int ret = swprintf(buf, nitems(buf), L##format, \ + __VA_ARGS__); \ + ATF_CHECK_EQ(wcslen(L##output), ret); \ + if (ret > 0) { \ + ATF_CHECK_EQ(0, wcscmp(L##output, buf)); \ + } \ + } while (0) + +ATF_TC_WITHOUT_HEAD(swprintf_b); +ATF_TC_BODY(swprintf_b, tc) +{ + SWPRINTF_TEST("0", "%b", 0); + SWPRINTF_TEST(" 0", "%12b", 0); + SWPRINTF_TEST("000000000000", "%012b", 0); + SWPRINTF_TEST("1", "%b", 1); + SWPRINTF_TEST(" 1", "%12b", 1); + SWPRINTF_TEST("000000000001", "%012b", 1); + SWPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX); + SWPRINTF_TEST("0", "%#b", 0); + SWPRINTF_TEST(" 0", "%#12b", 0); + SWPRINTF_TEST("000000000000", "%#012b", 0); + SWPRINTF_TEST("0b1", "%#b", 1); + SWPRINTF_TEST(" 0b1", "%#12b", 1); + SWPRINTF_TEST("0b0000000001", "%#012b", 1); + SWPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX); +} + +ATF_TC_WITHOUT_HEAD(swprintf_B); +ATF_TC_BODY(swprintf_B, tc) +{ + SWPRINTF_TEST("0", "%B", 0); + SWPRINTF_TEST(" 0", "%12B", 0); + SWPRINTF_TEST("000000000000", "%012B", 0); + SWPRINTF_TEST("1", "%B", 1); + SWPRINTF_TEST(" 1", "%12B", 1); + SWPRINTF_TEST("000000000001", "%012B", 1); + SWPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX); + SWPRINTF_TEST("0", "%#B", 0); + SWPRINTF_TEST(" 0", "%#12B", 0); + SWPRINTF_TEST("000000000000", "%#012B", 0); + SWPRINTF_TEST("0B1", "%#B", 1); + SWPRINTF_TEST(" 0B1", "%#12B", 1); + SWPRINTF_TEST("0B0000000001", "%#012B", 1); + SWPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX); +} + +ATF_TC_WITHOUT_HEAD(swprintf_d); +ATF_TC_BODY(swprintf_d, tc) +{ + SWPRINTF_TEST("0", "%d", 0); + SWPRINTF_TEST(" 0", "%12d", 0); + SWPRINTF_TEST("000000000000", "%012d", 0); + SWPRINTF_TEST("1", "%d", 1); + SWPRINTF_TEST(" 1", "%12d", 1); + SWPRINTF_TEST("000000000001", "%012d", 1); + SWPRINTF_TEST("2147483647", "%d", INT_MAX); + SWPRINTF_TEST(" 2147483647", "%12d", INT_MAX); + SWPRINTF_TEST("002147483647", "%012d", INT_MAX); + SWPRINTF_TEST("2,147,483,647", "%'d", INT_MAX); +} + +ATF_TC_WITHOUT_HEAD(swprintf_x); +ATF_TC_BODY(swprintf_x, tc) +{ + SWPRINTF_TEST("0", "%x", 0); + SWPRINTF_TEST(" 0", "%12x", 0); + SWPRINTF_TEST("000000000000", "%012x", 0); + SWPRINTF_TEST("1", "%x", 1); + SWPRINTF_TEST(" 1", "%12x", 1); + SWPRINTF_TEST("000000000001", "%012x", 1); + SWPRINTF_TEST("7fffffff", "%x", INT_MAX); + SWPRINTF_TEST(" 7fffffff", "%12x", INT_MAX); + SWPRINTF_TEST("00007fffffff", "%012x", INT_MAX); + SWPRINTF_TEST("0", "%#x", 0); + SWPRINTF_TEST(" 0", "%#12x", 0); + SWPRINTF_TEST("000000000000", "%#012x", 0); + SWPRINTF_TEST("0x1", "%#x", 1); + SWPRINTF_TEST(" 0x1", "%#12x", 1); + SWPRINTF_TEST("0x0000000001", "%#012x", 1); + SWPRINTF_TEST("0x7fffffff", "%#x", INT_MAX); + SWPRINTF_TEST(" 0x7fffffff", "%#12x", INT_MAX); + SWPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX); +} + +ATF_TC_WITHOUT_HEAD(swprintf_X); +ATF_TC_BODY(swprintf_X, tc) +{ + SWPRINTF_TEST("0", "%X", 0); + SWPRINTF_TEST(" 0", "%12X", 0); + SWPRINTF_TEST("000000000000", "%012X", 0); + SWPRINTF_TEST("1", "%X", 1); + SWPRINTF_TEST(" 1", "%12X", 1); + SWPRINTF_TEST("000000000001", "%012X", 1); + SWPRINTF_TEST("7FFFFFFF", "%X", INT_MAX); + SWPRINTF_TEST(" 7FFFFFFF", "%12X", INT_MAX); + SWPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX); + SWPRINTF_TEST("0", "%#X", 0); + SWPRINTF_TEST(" 0", "%#12X", 0); + SWPRINTF_TEST("000000000000", "%#012X", 0); + SWPRINTF_TEST("0X1", "%#X", 1); + SWPRINTF_TEST(" 0X1", "%#12X", 1); + SWPRINTF_TEST("0X0000000001", "%#012X", 1); + SWPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX); + SWPRINTF_TEST(" 0X7FFFFFFF", "%#12X", INT_MAX); + SWPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX); +} + +ATF_TP_ADD_TCS(tp) +{ + setlocale(LC_NUMERIC, "en_US.UTF-8"); + ATF_TP_ADD_TC(tp, swprintf_b); + ATF_TP_ADD_TC(tp, swprintf_B); + ATF_TP_ADD_TC(tp, swprintf_d); + ATF_TP_ADD_TC(tp, swprintf_x); + ATF_TP_ADD_TC(tp, swprintf_X); + return (atf_no_error()); +}