145 changes: 145 additions & 0 deletions libc/test/src/stdio/sprintf_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,151 @@ TEST(LlvmLibcSPrintfTest, StringConv) {
ASSERT_STREQ(buff, " beginning is important.");
}

TEST(LlvmLibcSPrintfTest, IntConv) {
char buff[64];
int written;

// Basic Tests.

written = __llvm_libc::sprintf(buff, "%d", 123);
EXPECT_EQ(written, 3);
ASSERT_STREQ(buff, "123");

written = __llvm_libc::sprintf(buff, "%i", -456);
EXPECT_EQ(written, 4);
ASSERT_STREQ(buff, "-456");

// Length Modifier Tests.

written = __llvm_libc::sprintf(buff, "%hhu", 257); // 0x10001
EXPECT_EQ(written, 1);
ASSERT_STREQ(buff, "1");

written = __llvm_libc::sprintf(buff, "%llu", 18446744073709551615ull);
EXPECT_EQ(written, 20);
ASSERT_STREQ(buff, "18446744073709551615"); // ull max

written = __llvm_libc::sprintf(buff, "%tu", ~ptrdiff_t(0));
if (sizeof(ptrdiff_t) == 8) {
EXPECT_EQ(written, 20);
ASSERT_STREQ(buff, "18446744073709551615");
} else if (sizeof(ptrdiff_t) == 4) {
EXPECT_EQ(written, 10);
ASSERT_STREQ(buff, "4294967296");
}

written = __llvm_libc::sprintf(buff, "%lld", -9223372036854775807ll - 1ll);
EXPECT_EQ(written, 20);
ASSERT_STREQ(buff, "-9223372036854775808"); // ll min

// Min Width Tests.

written = __llvm_libc::sprintf(buff, "%4d", 789);
EXPECT_EQ(written, 4);
ASSERT_STREQ(buff, " 789");

written = __llvm_libc::sprintf(buff, "%2d", 987);
EXPECT_EQ(written, 3);
ASSERT_STREQ(buff, "987");

// Precision Tests.

written = __llvm_libc::sprintf(buff, "%d", 0);
EXPECT_EQ(written, 1);
ASSERT_STREQ(buff, "0");

written = __llvm_libc::sprintf(buff, "%.0d", 0);
EXPECT_EQ(written, 0);
ASSERT_STREQ(buff, "");

written = __llvm_libc::sprintf(buff, "%.5d", 654);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "00654");

written = __llvm_libc::sprintf(buff, "%.5d", -321);
EXPECT_EQ(written, 6);
ASSERT_STREQ(buff, "-00321");

written = __llvm_libc::sprintf(buff, "%.2d", 135);
EXPECT_EQ(written, 3);
ASSERT_STREQ(buff, "135");

// Flag Tests.

written = __llvm_libc::sprintf(buff, "%.5d", -321);
EXPECT_EQ(written, 6);
ASSERT_STREQ(buff, "-00321");

written = __llvm_libc::sprintf(buff, "%-5d", 246);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "246 ");

written = __llvm_libc::sprintf(buff, "%-5d", -147);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "-147 ");

written = __llvm_libc::sprintf(buff, "%+d", 258);
EXPECT_EQ(written, 4);
ASSERT_STREQ(buff, "+258");

written = __llvm_libc::sprintf(buff, "% d", 369);
EXPECT_EQ(written, 4);
ASSERT_STREQ(buff, " 369");

written = __llvm_libc::sprintf(buff, "%05d", 470);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "00470");

written = __llvm_libc::sprintf(buff, "%05d", -581);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "-0581");

// Combined Tests.

written = __llvm_libc::sprintf(buff, "%+ u", 692);
EXPECT_EQ(written, 3);
ASSERT_STREQ(buff, "692");

written = __llvm_libc::sprintf(buff, "%+ -05d", 703);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "+703 ");

written = __llvm_libc::sprintf(buff, "%7.5d", 814);
EXPECT_EQ(written, 7);
ASSERT_STREQ(buff, " 00814");

written = __llvm_libc::sprintf(buff, "%7.5d", -925);
EXPECT_EQ(written, 7);
ASSERT_STREQ(buff, " -00925");

written = __llvm_libc::sprintf(buff, "%7.5d", 159);
EXPECT_EQ(written, 7);
ASSERT_STREQ(buff, " 00159");

written = __llvm_libc::sprintf(buff, "% -7.5d", 260);
EXPECT_EQ(written, 7);
ASSERT_STREQ(buff, " 00260 ");

written = __llvm_libc::sprintf(buff, "%5.4d", 10000);
EXPECT_EQ(written, 5);
ASSERT_STREQ(buff, "10000");

// Multiple Conversion Tests.

written = __llvm_libc::sprintf(buff, "%10d %-10d", 456, -789);
EXPECT_EQ(written, 21);
ASSERT_STREQ(buff, " 456 -789 ");

written = __llvm_libc::sprintf(buff, "%-5.4d%+.4u", 75, 25);
EXPECT_EQ(written, 9);
ASSERT_STREQ(buff, "0075 0025");

written = __llvm_libc::sprintf(buff, "% 05hhi %+-0.5llu %-+ 06.3zd",
256 + 127, 68719476736ll, size_t(2));
EXPECT_EQ(written, 24);
ASSERT_STREQ(buff, " 0127 68719476736 +002 ");
}

#ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE
TEST(LlvmLibcSPrintfTest, IndexModeParsing) {
char buff[64];
Expand Down