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