xref: /llvm-project/libc/test/src/stdio/vsnprintf_test.cpp (revision b6bc9d72f65a5086f310f321e969d96e9a559e75)
116d5c242SMichael Jones //===-- Unittests for snprintf --------------------------------------------===//
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 copies of the non-v variants of the printf functions. This is
1016d5c242SMichael Jones // because these functions are identical in every way except for how the varargs
1116d5c242SMichael Jones // are passed.
1216d5c242SMichael Jones 
1316d5c242SMichael Jones #include "src/stdio/vsnprintf.h"
1416d5c242SMichael Jones 
1516d5c242SMichael Jones #include "test/UnitTest/Test.h"
1616d5c242SMichael Jones 
call_vsnprintf(char * __restrict buffer,size_t buffsz,const char * __restrict format,...)1716d5c242SMichael Jones int call_vsnprintf(char *__restrict buffer, size_t buffsz,
1816d5c242SMichael Jones                    const char *__restrict format, ...) {
1916d5c242SMichael Jones   va_list vlist;
2016d5c242SMichael Jones   va_start(vlist, format);
21*b6bc9d72SGuillaume Chatelet   int ret = LIBC_NAMESPACE::vsnprintf(buffer, buffsz, format, vlist);
2216d5c242SMichael Jones   va_end(vlist);
2316d5c242SMichael Jones   return ret;
2416d5c242SMichael Jones }
2516d5c242SMichael Jones 
2616d5c242SMichael Jones // The sprintf test cases cover testing the shared printf functionality, so
2716d5c242SMichael Jones // these tests will focus on snprintf exclusive features.
2816d5c242SMichael Jones 
TEST(LlvmLibcVSNPrintfTest,CutOff)2916d5c242SMichael Jones TEST(LlvmLibcVSNPrintfTest, CutOff) {
3016d5c242SMichael Jones   char buff[100];
3116d5c242SMichael Jones   int written;
3216d5c242SMichael Jones 
3316d5c242SMichael Jones   written = call_vsnprintf(buff, 16, "A simple string with no conversions.");
3416d5c242SMichael Jones   EXPECT_EQ(written, 36);
3516d5c242SMichael Jones   ASSERT_STREQ(buff, "A simple string");
3616d5c242SMichael Jones 
3716d5c242SMichael Jones   written = call_vsnprintf(buff, 5, "%s", "1234567890");
3816d5c242SMichael Jones   EXPECT_EQ(written, 10);
3916d5c242SMichael Jones   ASSERT_STREQ(buff, "1234");
4016d5c242SMichael Jones 
4116d5c242SMichael Jones   written = call_vsnprintf(buff, 67, "%-101c", 'a');
4216d5c242SMichael Jones   EXPECT_EQ(written, 101);
4316d5c242SMichael Jones   ASSERT_STREQ(buff, "a "
4416d5c242SMichael Jones                      "        " // Each of these is 8 spaces, and there are 8.
4516d5c242SMichael Jones                      "        " // In total there are 65 spaces
4616d5c242SMichael Jones                      "        " // 'a' + 65 spaces + '\0' = 67
4716d5c242SMichael Jones                      "        "
4816d5c242SMichael Jones                      "        "
4916d5c242SMichael Jones                      "        "
5016d5c242SMichael Jones                      "        "
5116d5c242SMichael Jones                      "        ");
5216d5c242SMichael Jones 
5316d5c242SMichael Jones   // passing null as the output pointer is allowed as long as buffsz is 0.
5416d5c242SMichael Jones   written = call_vsnprintf(nullptr, 0, "%s and more", "1234567890");
5516d5c242SMichael Jones   EXPECT_EQ(written, 19);
5616d5c242SMichael Jones }
5716d5c242SMichael Jones 
TEST(LlvmLibcVSNPrintfTest,NoCutOff)5816d5c242SMichael Jones TEST(LlvmLibcVSNPrintfTest, NoCutOff) {
5916d5c242SMichael Jones   char buff[64];
6016d5c242SMichael Jones   int written;
6116d5c242SMichael Jones 
6216d5c242SMichael Jones   written = call_vsnprintf(buff, 37, "A simple string with no conversions.");
6316d5c242SMichael Jones   EXPECT_EQ(written, 36);
6416d5c242SMichael Jones   ASSERT_STREQ(buff, "A simple string with no conversions.");
6516d5c242SMichael Jones 
6616d5c242SMichael Jones   written = call_vsnprintf(buff, 20, "%s", "1234567890");
6716d5c242SMichael Jones   EXPECT_EQ(written, 10);
6816d5c242SMichael Jones   ASSERT_STREQ(buff, "1234567890");
6916d5c242SMichael Jones }
70