xref: /aosp_15_r20/external/llvm-libc/test/src/stdio/snprintf_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for snprintf --------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/stdio/snprintf.h"
10*71db0c75SAndroid Build Coastguard Worker 
11*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
12*71db0c75SAndroid Build Coastguard Worker 
13*71db0c75SAndroid Build Coastguard Worker // The sprintf test cases cover testing the shared printf functionality, so
14*71db0c75SAndroid Build Coastguard Worker // these tests will focus on snprintf exclusive features.
15*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSNPrintfTest,CutOff)16*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSNPrintfTest, CutOff) {
17*71db0c75SAndroid Build Coastguard Worker   char buff[100];
18*71db0c75SAndroid Build Coastguard Worker   int written;
19*71db0c75SAndroid Build Coastguard Worker 
20*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(buff, 16,
21*71db0c75SAndroid Build Coastguard Worker                                      "A simple string with no conversions.");
22*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, 36);
23*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buff, "A simple string");
24*71db0c75SAndroid Build Coastguard Worker 
25*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(buff, 5, "%s", "1234567890");
26*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, 10);
27*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buff, "1234");
28*71db0c75SAndroid Build Coastguard Worker 
29*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(buff, 67, "%-101c", 'a');
30*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, 101);
31*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buff, "a "
32*71db0c75SAndroid Build Coastguard Worker                      "        " // Each of these is 8 spaces, and there are 8.
33*71db0c75SAndroid Build Coastguard Worker                      "        " // In total there are 65 spaces
34*71db0c75SAndroid Build Coastguard Worker                      "        " // 'a' + 65 spaces + '\0' = 67
35*71db0c75SAndroid Build Coastguard Worker                      "        "
36*71db0c75SAndroid Build Coastguard Worker                      "        "
37*71db0c75SAndroid Build Coastguard Worker                      "        "
38*71db0c75SAndroid Build Coastguard Worker                      "        "
39*71db0c75SAndroid Build Coastguard Worker                      "        ");
40*71db0c75SAndroid Build Coastguard Worker 
41*71db0c75SAndroid Build Coastguard Worker   // passing null as the output pointer is allowed as long as buffsz is 0.
42*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(nullptr, 0, "%s and more", "1234567890");
43*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, 19);
44*71db0c75SAndroid Build Coastguard Worker 
45*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(nullptr, 0, "%*s", INT_MIN, "nothing");
46*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, INT_MAX);
47*71db0c75SAndroid Build Coastguard Worker }
48*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcSNPrintfTest,NoCutOff)49*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcSNPrintfTest, NoCutOff) {
50*71db0c75SAndroid Build Coastguard Worker   char buff[64];
51*71db0c75SAndroid Build Coastguard Worker   int written;
52*71db0c75SAndroid Build Coastguard Worker 
53*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(buff, 37,
54*71db0c75SAndroid Build Coastguard Worker                                      "A simple string with no conversions.");
55*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, 36);
56*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buff, "A simple string with no conversions.");
57*71db0c75SAndroid Build Coastguard Worker 
58*71db0c75SAndroid Build Coastguard Worker   written = LIBC_NAMESPACE::snprintf(buff, 20, "%s", "1234567890");
59*71db0c75SAndroid Build Coastguard Worker   EXPECT_EQ(written, 10);
60*71db0c75SAndroid Build Coastguard Worker   ASSERT_STREQ(buff, "1234567890");
61*71db0c75SAndroid Build Coastguard Worker }
62