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