xref: /llvm-project/libc/test/src/stdio/asprintf_test.cpp (revision a5e67fba8abb35211aebb945d9d07ac988b80cf5)
1*a5e67fbaSTsz Chan //===-- Unittests for asprintf--------------------------------------------===//
2*a5e67fbaSTsz Chan //
3*a5e67fbaSTsz Chan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*a5e67fbaSTsz Chan // See https://llvm.org/LICENSE.txt for license information.
5*a5e67fbaSTsz Chan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*a5e67fbaSTsz Chan //
7*a5e67fbaSTsz Chan //===----------------------------------------------------------------------===//
8*a5e67fbaSTsz Chan 
9*a5e67fbaSTsz Chan #include "src/stdio/asprintf.h"
10*a5e67fbaSTsz Chan #include "src/stdio/sprintf.h"
11*a5e67fbaSTsz Chan #include "src/string/memset.h"
12*a5e67fbaSTsz Chan #include "test/UnitTest/Test.h"
13*a5e67fbaSTsz Chan 
14*a5e67fbaSTsz Chan TEST(LlvmLibcASPrintfTest, SimpleNoConv) {
15*a5e67fbaSTsz Chan   char *buff = nullptr;
16*a5e67fbaSTsz Chan   int written;
17*a5e67fbaSTsz Chan   written =
18*a5e67fbaSTsz Chan       LIBC_NAMESPACE::asprintf(&buff, "A simple string with no conversions.");
19*a5e67fbaSTsz Chan   EXPECT_EQ(written, 36);
20*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, "A simple string with no conversions.");
21*a5e67fbaSTsz Chan   free(buff);
22*a5e67fbaSTsz Chan }
23*a5e67fbaSTsz Chan 
24*a5e67fbaSTsz Chan TEST(LlvmLibcASPrintfTest, PercentConv) {
25*a5e67fbaSTsz Chan   char *buff = nullptr;
26*a5e67fbaSTsz Chan   int written;
27*a5e67fbaSTsz Chan 
28*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, "%%");
29*a5e67fbaSTsz Chan   EXPECT_EQ(written, 1);
30*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, "%");
31*a5e67fbaSTsz Chan   free(buff);
32*a5e67fbaSTsz Chan 
33*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, "abc %% def");
34*a5e67fbaSTsz Chan   EXPECT_EQ(written, 9);
35*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, "abc % def");
36*a5e67fbaSTsz Chan   free(buff);
37*a5e67fbaSTsz Chan 
38*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, "%%%%%%");
39*a5e67fbaSTsz Chan   EXPECT_EQ(written, 3);
40*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, "%%%");
41*a5e67fbaSTsz Chan   free(buff);
42*a5e67fbaSTsz Chan }
43*a5e67fbaSTsz Chan 
44*a5e67fbaSTsz Chan TEST(LlvmLibcASPrintfTest, CharConv) {
45*a5e67fbaSTsz Chan   char *buff = nullptr;
46*a5e67fbaSTsz Chan   int written;
47*a5e67fbaSTsz Chan 
48*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, "%c", 'a');
49*a5e67fbaSTsz Chan   EXPECT_EQ(written, 1);
50*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, "a");
51*a5e67fbaSTsz Chan   free(buff);
52*a5e67fbaSTsz Chan 
53*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, "%3c %-3c", '1', '2');
54*a5e67fbaSTsz Chan   EXPECT_EQ(written, 7);
55*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, "  1 2  ");
56*a5e67fbaSTsz Chan   free(buff);
57*a5e67fbaSTsz Chan 
58*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, "%*c", 2, '3');
59*a5e67fbaSTsz Chan   EXPECT_EQ(written, 2);
60*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, " 3");
61*a5e67fbaSTsz Chan   free(buff);
62*a5e67fbaSTsz Chan }
63*a5e67fbaSTsz Chan 
64*a5e67fbaSTsz Chan TEST(LlvmLibcASPrintfTest, LargeStringNoConv) {
65*a5e67fbaSTsz Chan   char *buff = nullptr;
66*a5e67fbaSTsz Chan   char long_str[1001];
67*a5e67fbaSTsz Chan   LIBC_NAMESPACE::memset(long_str, 'a', 1000);
68*a5e67fbaSTsz Chan   long_str[1000] = '\0';
69*a5e67fbaSTsz Chan   int written;
70*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, long_str);
71*a5e67fbaSTsz Chan   EXPECT_EQ(written, 1000);
72*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, long_str);
73*a5e67fbaSTsz Chan   free(buff);
74*a5e67fbaSTsz Chan }
75*a5e67fbaSTsz Chan 
76*a5e67fbaSTsz Chan TEST(LlvmLibcASPrintfTest, ManyReAlloc) {
77*a5e67fbaSTsz Chan   char *buff = nullptr;
78*a5e67fbaSTsz Chan   char long_str[1001];
79*a5e67fbaSTsz Chan   auto expected_num_chars =
80*a5e67fbaSTsz Chan       LIBC_NAMESPACE::sprintf(long_str, "%200s%200s%200s", "a", "b", "c");
81*a5e67fbaSTsz Chan   long_str[expected_num_chars] = '\0';
82*a5e67fbaSTsz Chan   int written;
83*a5e67fbaSTsz Chan   written = LIBC_NAMESPACE::asprintf(&buff, long_str);
84*a5e67fbaSTsz Chan   EXPECT_EQ(written, expected_num_chars);
85*a5e67fbaSTsz Chan   ASSERT_STREQ(buff, long_str);
86*a5e67fbaSTsz Chan   free(buff);
87*a5e67fbaSTsz Chan }
88