Path: blob/main/lib/libc/tests/stdio/snprintf_test.c
39530 views
/*-1* Copyright (c) 2023 Dag-Erling Smørgrav2*3* SPDX-License-Identifier: BSD-2-Clause4*/56#include <assert.h>7#include <limits.h>8#include <locale.h>9#include <stdint.h>10#include <stdio.h>1112#include <atf-c.h>1314#ifndef nitems15#define nitems(a) (sizeof(a) / sizeof(a[0]))16#endif1718#define SNPRINTF_TEST(output, format, ...) \19do { \20char buf[256]; \21assert(strlen(output) < nitems(buf)); \22int ret = snprintf(buf, nitems(buf), format, \23__VA_ARGS__); \24ATF_CHECK_EQ(strlen(output), ret); \25if (ret > 0) { \26ATF_CHECK_EQ(0, strcmp(output, buf)); \27} \28} while (0)2930ATF_TC_WITHOUT_HEAD(snprintf_b);31ATF_TC_BODY(snprintf_b, tc)32{33SNPRINTF_TEST("0", "%b", 0);34SNPRINTF_TEST(" 0", "%12b", 0);35SNPRINTF_TEST("000000000000", "%012b", 0);36SNPRINTF_TEST("1", "%b", 1);37SNPRINTF_TEST(" 1", "%12b", 1);38SNPRINTF_TEST("000000000001", "%012b", 1);39SNPRINTF_TEST("1111111111111111111111111111111", "%b", INT_MAX);40SNPRINTF_TEST("0", "%#b", 0);41SNPRINTF_TEST(" 0", "%#12b", 0);42SNPRINTF_TEST("000000000000", "%#012b", 0);43SNPRINTF_TEST("0b1", "%#b", 1);44SNPRINTF_TEST(" 0b1", "%#12b", 1);45SNPRINTF_TEST("0b0000000001", "%#012b", 1);46SNPRINTF_TEST("0b1111111111111111111111111111111", "%#b", INT_MAX);47}4849ATF_TC_WITHOUT_HEAD(snprintf_B);50ATF_TC_BODY(snprintf_B, tc)51{52SNPRINTF_TEST("0", "%B", 0);53SNPRINTF_TEST(" 0", "%12B", 0);54SNPRINTF_TEST("000000000000", "%012B", 0);55SNPRINTF_TEST("1", "%B", 1);56SNPRINTF_TEST(" 1", "%12B", 1);57SNPRINTF_TEST("000000000001", "%012B", 1);58SNPRINTF_TEST("1111111111111111111111111111111", "%B", INT_MAX);59SNPRINTF_TEST("0", "%#B", 0);60SNPRINTF_TEST(" 0", "%#12B", 0);61SNPRINTF_TEST("000000000000", "%#012B", 0);62SNPRINTF_TEST("0B1", "%#B", 1);63SNPRINTF_TEST(" 0B1", "%#12B", 1);64SNPRINTF_TEST("0B0000000001", "%#012B", 1);65SNPRINTF_TEST("0B1111111111111111111111111111111", "%#B", INT_MAX);66}6768ATF_TC_WITHOUT_HEAD(snprintf_d);69ATF_TC_BODY(snprintf_d, tc)70{71SNPRINTF_TEST("0", "%d", 0);72SNPRINTF_TEST(" 0", "%12d", 0);73SNPRINTF_TEST("000000000000", "%012d", 0);74SNPRINTF_TEST("1", "%d", 1);75SNPRINTF_TEST(" 1", "%12d", 1);76SNPRINTF_TEST("000000000001", "%012d", 1);77SNPRINTF_TEST("2147483647", "%d", INT_MAX);78SNPRINTF_TEST(" 2147483647", "%12d", INT_MAX);79SNPRINTF_TEST("002147483647", "%012d", INT_MAX);80SNPRINTF_TEST("2,147,483,647", "%'d", INT_MAX);81}8283ATF_TC_WITHOUT_HEAD(snprintf_x);84ATF_TC_BODY(snprintf_x, tc)85{86SNPRINTF_TEST("0", "%x", 0);87SNPRINTF_TEST(" 0", "%12x", 0);88SNPRINTF_TEST("000000000000", "%012x", 0);89SNPRINTF_TEST("1", "%x", 1);90SNPRINTF_TEST(" 1", "%12x", 1);91SNPRINTF_TEST("000000000001", "%012x", 1);92SNPRINTF_TEST("7fffffff", "%x", INT_MAX);93SNPRINTF_TEST(" 7fffffff", "%12x", INT_MAX);94SNPRINTF_TEST("00007fffffff", "%012x", INT_MAX);95SNPRINTF_TEST("0", "%#x", 0);96SNPRINTF_TEST(" 0", "%#12x", 0);97SNPRINTF_TEST("000000000000", "%#012x", 0);98SNPRINTF_TEST("0x1", "%#x", 1);99SNPRINTF_TEST(" 0x1", "%#12x", 1);100SNPRINTF_TEST("0x0000000001", "%#012x", 1);101SNPRINTF_TEST("0x7fffffff", "%#x", INT_MAX);102SNPRINTF_TEST(" 0x7fffffff", "%#12x", INT_MAX);103SNPRINTF_TEST("0x007fffffff", "%#012x", INT_MAX);104}105106ATF_TC_WITHOUT_HEAD(snprintf_X);107ATF_TC_BODY(snprintf_X, tc)108{109SNPRINTF_TEST("0", "%X", 0);110SNPRINTF_TEST(" 0", "%12X", 0);111SNPRINTF_TEST("000000000000", "%012X", 0);112SNPRINTF_TEST("1", "%X", 1);113SNPRINTF_TEST(" 1", "%12X", 1);114SNPRINTF_TEST("000000000001", "%012X", 1);115SNPRINTF_TEST("7FFFFFFF", "%X", INT_MAX);116SNPRINTF_TEST(" 7FFFFFFF", "%12X", INT_MAX);117SNPRINTF_TEST("00007FFFFFFF", "%012X", INT_MAX);118SNPRINTF_TEST("0", "%#X", 0);119SNPRINTF_TEST(" 0", "%#12X", 0);120SNPRINTF_TEST("000000000000", "%#012X", 0);121SNPRINTF_TEST("0X1", "%#X", 1);122SNPRINTF_TEST(" 0X1", "%#12X", 1);123SNPRINTF_TEST("0X0000000001", "%#012X", 1);124SNPRINTF_TEST("0X7FFFFFFF", "%#X", INT_MAX);125SNPRINTF_TEST(" 0X7FFFFFFF", "%#12X", INT_MAX);126SNPRINTF_TEST("0X007FFFFFFF", "%#012X", INT_MAX);127}128129ATF_TC_WITHOUT_HEAD(snprintf_wN);130ATF_TC_BODY(snprintf_wN, tc)131{132SNPRINTF_TEST("0", "%w8d", (int8_t)0);133SNPRINTF_TEST("-128", "%w8d", (int8_t)SCHAR_MIN);134SNPRINTF_TEST("127", "%w8d", (int8_t)SCHAR_MAX);135SNPRINTF_TEST("0", "%w8u", (uint8_t)0);136SNPRINTF_TEST("255", "%w8u", (uint8_t)UCHAR_MAX);137138SNPRINTF_TEST("0", "%w16d", (int16_t)0);139SNPRINTF_TEST("-32768", "%w16d", (int16_t)SHRT_MIN);140SNPRINTF_TEST("32767", "%w16d", (int16_t)SHRT_MAX);141SNPRINTF_TEST("0", "%w16u", (uint16_t)0);142SNPRINTF_TEST("65535", "%w16u", (uint16_t)USHRT_MAX);143144SNPRINTF_TEST("0", "%w32d", (int32_t)0);145SNPRINTF_TEST("-2147483648", "%w32d", (int32_t)INT_MIN);146SNPRINTF_TEST("2147483647", "%w32d", (int32_t)INT_MAX);147SNPRINTF_TEST("0", "%w32u", (uint32_t)0);148SNPRINTF_TEST("4294967295", "%w32u", (uint32_t)UINT_MAX);149150SNPRINTF_TEST("0", "%w64d", (int64_t)0);151SNPRINTF_TEST("-9223372036854775808", "%w64d", (int64_t)LLONG_MIN);152SNPRINTF_TEST("9223372036854775807", "%w64d", (int64_t)LLONG_MAX);153SNPRINTF_TEST("0", "%w64u", (uint64_t)0);154SNPRINTF_TEST("18446744073709551615", "%w64u", (uint64_t)ULLONG_MAX);155156SNPRINTF_TEST("wd", "%wd", 0);157SNPRINTF_TEST("w1d", "%w1d", 0);158SNPRINTF_TEST("w128d", "%w128d", 0);159}160161ATF_TC_WITHOUT_HEAD(snprintf_wfN);162ATF_TC_BODY(snprintf_wfN, tc)163{164SNPRINTF_TEST("0", "%wf8d", (int_fast8_t)0);165SNPRINTF_TEST("-2147483648", "%wf8d", (int_fast8_t)INT_MIN);166SNPRINTF_TEST("2147483647", "%wf8d", (int_fast8_t)INT_MAX);167SNPRINTF_TEST("0", "%wf8u", (uint8_t)0);168SNPRINTF_TEST("4294967295", "%wf8u", (uint_fast8_t)UINT_MAX);169170SNPRINTF_TEST("0", "%wf16d", (int_fast16_t)0);171SNPRINTF_TEST("-2147483648", "%wf16d", (int_fast16_t)INT_MIN);172SNPRINTF_TEST("2147483647", "%wf16d", (int_fast16_t)INT_MAX);173SNPRINTF_TEST("0", "%wf16u", (uint16_t)0);174SNPRINTF_TEST("4294967295", "%wf16u", (uint_fast16_t)UINT_MAX);175176SNPRINTF_TEST("0", "%wf32d", (int_fast32_t)0);177SNPRINTF_TEST("-2147483648", "%wf32d", (int_fast32_t)INT_MIN);178SNPRINTF_TEST("2147483647", "%wf32d", (int_fast32_t)INT_MAX);179SNPRINTF_TEST("0", "%wf32u", (uint32_t)0);180SNPRINTF_TEST("4294967295", "%wf32u", (uint_fast32_t)UINT_MAX);181182SNPRINTF_TEST("0", "%wf64d", (int_fast64_t)0);183SNPRINTF_TEST("-9223372036854775808", "%wf64d", (int_fast64_t)LLONG_MIN);184SNPRINTF_TEST("9223372036854775807", "%wf64d", (int_fast64_t)LLONG_MAX);185SNPRINTF_TEST("0", "%wf64u", (uint64_t)0);186SNPRINTF_TEST("18446744073709551615", "%wf64u", (uint_fast64_t)ULLONG_MAX);187188SNPRINTF_TEST("wfd", "%wfd", 0);189SNPRINTF_TEST("wf1d", "%wf1d", 0);190SNPRINTF_TEST("wf128d", "%wf128d", 0);191}192193ATF_TP_ADD_TCS(tp)194{195setlocale(LC_NUMERIC, "en_US.UTF-8");196ATF_TP_ADD_TC(tp, snprintf_b);197ATF_TP_ADD_TC(tp, snprintf_B);198ATF_TP_ADD_TC(tp, snprintf_d);199ATF_TP_ADD_TC(tp, snprintf_x);200ATF_TP_ADD_TC(tp, snprintf_X);201ATF_TP_ADD_TC(tp, snprintf_wN);202ATF_TP_ADD_TC(tp, snprintf_wfN);203return (atf_no_error());204}205206207