//===-- VASprintfTest.cpp ---------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "lldb/Utility/VASPrintf.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" #include #if defined (_WIN32) #define TEST_ENCODING ".932" // On Windows, test codepage 932 #else #define TEST_ENCODING "C" // ...otherwise, any widely available uni-byte LC #endif using namespace lldb_private; using namespace llvm; static bool Sprintf(llvm::SmallVectorImpl &Buffer, const char *Fmt, ...) { va_list args; va_start(args, Fmt); bool Result = VASprintf(Buffer, Fmt, args); va_end(args); return Result; } TEST(VASprintfTest, NoBufferResize) { std::string TestStr("small"); llvm::SmallString<32> BigBuffer; ASSERT_TRUE(Sprintf(BigBuffer, "%s", TestStr.c_str())); EXPECT_STREQ(TestStr.c_str(), BigBuffer.c_str()); EXPECT_EQ(TestStr.size(), BigBuffer.size()); } TEST(VASprintfTest, BufferResize) { std::string TestStr("bigger"); llvm::SmallString<4> SmallBuffer; ASSERT_TRUE(Sprintf(SmallBuffer, "%s", TestStr.c_str())); EXPECT_STREQ(TestStr.c_str(), SmallBuffer.c_str()); EXPECT_EQ(TestStr.size(), SmallBuffer.size()); } TEST(VASprintfTest, EncodingError) { // Save the current locale first. std::string Current(::setlocale(LC_ALL, nullptr)); // Ensure tested locale is successfully set ASSERT_TRUE(setlocale(LC_ALL, TEST_ENCODING)); wchar_t Invalid[2]; Invalid[0] = 0x100; Invalid[1] = 0; llvm::SmallString<32> Buffer; EXPECT_FALSE(Sprintf(Buffer, "%ls", Invalid)); EXPECT_EQ("", Buffer); // Ensure we've restored the original locale once tested ASSERT_TRUE(setlocale(LC_ALL, Current.c_str())); }