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