99 lines · cpp
1//===-- Unittests for vasprintf--------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/stdio/vasprintf.h"10#include "src/string/memset.h"11#include "test/UnitTest/Test.h"12 13int call_vasprintf(char **__restrict buffer, const char *__restrict format,14 ...) {15 va_list vlist;16 va_start(vlist, format);17 int ret = LIBC_NAMESPACE::vasprintf(buffer, format, vlist);18 va_end(vlist);19 return ret;20}21 22TEST(LlvmLibcVASPrintfTest, SimpleNoConv) {23 char *buff = nullptr;24 int written;25 written = call_vasprintf(&buff, "A simple string with no conversions.");26 EXPECT_EQ(written, 36);27 ASSERT_STREQ(buff, "A simple string with no conversions.");28 free(buff);29}30 31TEST(LlvmLibcVASPrintfTest, PercentConv) {32 char *buff = nullptr;33 int written;34 35 written = call_vasprintf(&buff, "%%");36 EXPECT_EQ(written, 1);37 ASSERT_STREQ(buff, "%");38 free(buff);39 40 written = call_vasprintf(&buff, "abc %% def");41 EXPECT_EQ(written, 9);42 ASSERT_STREQ(buff, "abc % def");43 free(buff);44 45 written = call_vasprintf(&buff, "%%%%%%");46 EXPECT_EQ(written, 3);47 ASSERT_STREQ(buff, "%%%");48 free(buff);49}50 51TEST(LlvmLibcVASPrintfTest, CharConv) {52 char *buff = nullptr;53 int written;54 55 written = call_vasprintf(&buff, "%c", 'a');56 EXPECT_EQ(written, 1);57 ASSERT_STREQ(buff, "a");58 free(buff);59 60 written = call_vasprintf(&buff, "%3c %-3c", '1', '2');61 EXPECT_EQ(written, 7);62 ASSERT_STREQ(buff, " 1 2 ");63 free(buff);64 65 written = call_vasprintf(&buff, "%*c", 2, '3');66 EXPECT_EQ(written, 2);67 ASSERT_STREQ(buff, " 3");68 free(buff);69}70 71TEST(LlvmLibcVASPrintfTest, LargeStringNoConv) {72 char *buff = nullptr;73 char long_str[1001];74 LIBC_NAMESPACE::memset(long_str, 'a', 1000);75 long_str[1000] = '\0';76 int written;77 written = call_vasprintf(&buff, long_str);78 EXPECT_EQ(written, 1000);79 ASSERT_STREQ(buff, long_str);80 free(buff);81}82 83TEST(LlvmLibcVASPrintfTest, ManyReAlloc) {84 char *buff = nullptr;85 const int expected_num_chars = 600;86 int written = call_vasprintf(&buff, "%200s%200s%200s", "", "", "");87 EXPECT_EQ(written, expected_num_chars);88 89 bool isPadding = true;90 for (int i = 0; i < expected_num_chars; i++) {91 if (buff[i] != ' ') {92 isPadding = false;93 break;94 }95 }96 EXPECT_TRUE(isPadding);97 free(buff);98}99