1*ff6fe39eSMichael Jones //===-- Unittests for sprintf ---------------------------------------------===// 2*ff6fe39eSMichael Jones // 3*ff6fe39eSMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ff6fe39eSMichael Jones // See https://llvm.org/LICENSE.txt for license information. 5*ff6fe39eSMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ff6fe39eSMichael Jones // 7*ff6fe39eSMichael Jones //===----------------------------------------------------------------------===// 8*ff6fe39eSMichael Jones 9*ff6fe39eSMichael Jones #include "src/stdio/sprintf.h" 10*ff6fe39eSMichael Jones 11*ff6fe39eSMichael Jones #include "utils/UnitTest/Test.h" 12*ff6fe39eSMichael Jones 13*ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, SimpleNoConv) { 14*ff6fe39eSMichael Jones char buff[64]; 15*ff6fe39eSMichael Jones int written; 16*ff6fe39eSMichael Jones 17*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "A simple string with no conversions."); 18*ff6fe39eSMichael Jones EXPECT_EQ(written, 36); 19*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "A simple string with no conversions."); 20*ff6fe39eSMichael Jones } 21*ff6fe39eSMichael Jones 22*ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, PercentConv) { 23*ff6fe39eSMichael Jones char buff[64]; 24*ff6fe39eSMichael Jones int written; 25*ff6fe39eSMichael Jones 26*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%%"); 27*ff6fe39eSMichael Jones EXPECT_EQ(written, 1); 28*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "%"); 29*ff6fe39eSMichael Jones 30*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "abc %% def"); 31*ff6fe39eSMichael Jones EXPECT_EQ(written, 9); 32*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "abc % def"); 33*ff6fe39eSMichael Jones 34*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%%%%%%"); 35*ff6fe39eSMichael Jones EXPECT_EQ(written, 3); 36*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "%%%"); 37*ff6fe39eSMichael Jones } 38*ff6fe39eSMichael Jones 39*ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, CharConv) { 40*ff6fe39eSMichael Jones char buff[64]; 41*ff6fe39eSMichael Jones int written; 42*ff6fe39eSMichael Jones 43*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%c", 'a'); 44*ff6fe39eSMichael Jones EXPECT_EQ(written, 1); 45*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "a"); 46*ff6fe39eSMichael Jones 47*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%3c %-3c", '1', '2'); 48*ff6fe39eSMichael Jones EXPECT_EQ(written, 7); 49*ff6fe39eSMichael Jones ASSERT_STREQ(buff, " 1 2 "); 50*ff6fe39eSMichael Jones 51*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%*c", 2, '3'); 52*ff6fe39eSMichael Jones EXPECT_EQ(written, 2); 53*ff6fe39eSMichael Jones ASSERT_STREQ(buff, " 3"); 54*ff6fe39eSMichael Jones } 55*ff6fe39eSMichael Jones 56*ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, StringConv) { 57*ff6fe39eSMichael Jones char buff[64]; 58*ff6fe39eSMichael Jones int written; 59*ff6fe39eSMichael Jones 60*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%s", "abcDEF123"); 61*ff6fe39eSMichael Jones EXPECT_EQ(written, 9); 62*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "abcDEF123"); 63*ff6fe39eSMichael Jones 64*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%10s %-10s", "centered", "title"); 65*ff6fe39eSMichael Jones EXPECT_EQ(written, 21); 66*ff6fe39eSMichael Jones ASSERT_STREQ(buff, " centered title "); 67*ff6fe39eSMichael Jones 68*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%-5.4s%-4.4s", "words can describe", 69*ff6fe39eSMichael Jones "soups most delicious"); 70*ff6fe39eSMichael Jones EXPECT_EQ(written, 9); 71*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "word soup"); 72*ff6fe39eSMichael Jones 73*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%*s %.*s %*.*s", 10, "beginning", 2, 74*ff6fe39eSMichael Jones "isn't", 12, 10, "important. Ever."); 75*ff6fe39eSMichael Jones EXPECT_EQ(written, 26); 76*ff6fe39eSMichael Jones ASSERT_STREQ(buff, " beginning is important."); 77*ff6fe39eSMichael Jones } 78*ff6fe39eSMichael Jones 79*ff6fe39eSMichael Jones #ifndef LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE 80*ff6fe39eSMichael Jones TEST(LlvmLibcSPrintfTest, IndexModeParsing) { 81*ff6fe39eSMichael Jones char buff[64]; 82*ff6fe39eSMichael Jones int written; 83*ff6fe39eSMichael Jones 84*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%1$s", "abcDEF123"); 85*ff6fe39eSMichael Jones EXPECT_EQ(written, 9); 86*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "abcDEF123"); 87*ff6fe39eSMichael Jones 88*ff6fe39eSMichael Jones written = __llvm_libc::sprintf(buff, "%1$s %%", "abcDEF123"); 89*ff6fe39eSMichael Jones EXPECT_EQ(written, 11); 90*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "abcDEF123 %"); 91*ff6fe39eSMichael Jones 92*ff6fe39eSMichael Jones written = 93*ff6fe39eSMichael Jones __llvm_libc::sprintf(buff, "%3$s %1$s %2$s", "is", "hard", "ordering"); 94*ff6fe39eSMichael Jones EXPECT_EQ(written, 16); 95*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "ordering is hard"); 96*ff6fe39eSMichael Jones 97*ff6fe39eSMichael Jones written = __llvm_libc::sprintf( 98*ff6fe39eSMichael Jones buff, "%10$s %9$s %8$c %7$s %6$s, %6$s %5$s %4$-*1$s %3$.*11$s %2$s. %%", 99*ff6fe39eSMichael Jones 6, "pain", "alphabetical", "such", "is", "this", "do", 'u', "would", 100*ff6fe39eSMichael Jones "why", 1); 101*ff6fe39eSMichael Jones EXPECT_EQ(written, 45); 102*ff6fe39eSMichael Jones ASSERT_STREQ(buff, "why would u do this, this is such a pain. %"); 103*ff6fe39eSMichael Jones } 104*ff6fe39eSMichael Jones #endif // LLVM_LIBC_PRINTF_DISABLE_INDEX_MODE 105