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