xref: /llvm-project/libc/test/src/stdio/vsprintf_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
116d5c242SMichael Jones //===-- Unittests for vsprintf --------------------------------------------===//
216d5c242SMichael Jones //
316d5c242SMichael Jones // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
416d5c242SMichael Jones // See https://llvm.org/LICENSE.txt for license information.
516d5c242SMichael Jones // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
616d5c242SMichael Jones //
716d5c242SMichael Jones //===----------------------------------------------------------------------===//
816d5c242SMichael Jones 
916d5c242SMichael Jones // These tests are shortened copies of the non-v variants of the printf
1016d5c242SMichael Jones // functions. This is because these functions are identical in every way except
1116d5c242SMichael Jones // for how the varargs are passed.
1216d5c242SMichael Jones 
1316d5c242SMichael Jones #include "src/stdio/vsprintf.h"
1416d5c242SMichael Jones 
1516d5c242SMichael Jones #include "test/UnitTest/Test.h"
1616d5c242SMichael Jones 
call_vsprintf(char * __restrict buffer,const char * __restrict format,...)1716d5c242SMichael Jones int call_vsprintf(char *__restrict buffer, const char *__restrict format, ...) {
1816d5c242SMichael Jones   va_list vlist;
1916d5c242SMichael Jones   va_start(vlist, format);
20*b6bc9d72SGuillaume Chatelet   int ret = LIBC_NAMESPACE::vsprintf(buffer, format, vlist);
2116d5c242SMichael Jones   va_end(vlist);
2216d5c242SMichael Jones   return ret;
2316d5c242SMichael Jones }
2416d5c242SMichael Jones 
TEST(LlvmLibcVSPrintfTest,SimpleNoConv)2516d5c242SMichael Jones TEST(LlvmLibcVSPrintfTest, SimpleNoConv) {
2616d5c242SMichael Jones   char buff[64];
2716d5c242SMichael Jones   int written;
2816d5c242SMichael Jones 
2916d5c242SMichael Jones   written = call_vsprintf(buff, "A simple string with no conversions.");
3016d5c242SMichael Jones   EXPECT_EQ(written, 36);
3116d5c242SMichael Jones   ASSERT_STREQ(buff, "A simple string with no conversions.");
3216d5c242SMichael Jones }
3316d5c242SMichael Jones 
TEST(LlvmLibcVSPrintfTest,PercentConv)3416d5c242SMichael Jones TEST(LlvmLibcVSPrintfTest, PercentConv) {
3516d5c242SMichael Jones   char buff[64];
3616d5c242SMichael Jones   int written;
3716d5c242SMichael Jones 
3816d5c242SMichael Jones   written = call_vsprintf(buff, "%%");
3916d5c242SMichael Jones   EXPECT_EQ(written, 1);
4016d5c242SMichael Jones   ASSERT_STREQ(buff, "%");
4116d5c242SMichael Jones 
4216d5c242SMichael Jones   written = call_vsprintf(buff, "abc %% def");
4316d5c242SMichael Jones   EXPECT_EQ(written, 9);
4416d5c242SMichael Jones   ASSERT_STREQ(buff, "abc % def");
4516d5c242SMichael Jones 
4616d5c242SMichael Jones   written = call_vsprintf(buff, "%%%%%%");
4716d5c242SMichael Jones   EXPECT_EQ(written, 3);
4816d5c242SMichael Jones   ASSERT_STREQ(buff, "%%%");
4916d5c242SMichael Jones }
5016d5c242SMichael Jones 
TEST(LlvmLibcVSPrintfTest,CharConv)5116d5c242SMichael Jones TEST(LlvmLibcVSPrintfTest, CharConv) {
5216d5c242SMichael Jones   char buff[64];
5316d5c242SMichael Jones   int written;
5416d5c242SMichael Jones 
5516d5c242SMichael Jones   written = call_vsprintf(buff, "%c", 'a');
5616d5c242SMichael Jones   EXPECT_EQ(written, 1);
5716d5c242SMichael Jones   ASSERT_STREQ(buff, "a");
5816d5c242SMichael Jones 
5916d5c242SMichael Jones   written = call_vsprintf(buff, "%3c %-3c", '1', '2');
6016d5c242SMichael Jones   EXPECT_EQ(written, 7);
6116d5c242SMichael Jones   ASSERT_STREQ(buff, "  1 2  ");
6216d5c242SMichael Jones 
6316d5c242SMichael Jones   written = call_vsprintf(buff, "%*c", 2, '3');
6416d5c242SMichael Jones   EXPECT_EQ(written, 2);
6516d5c242SMichael Jones   ASSERT_STREQ(buff, " 3");
6616d5c242SMichael Jones }
67