| //===-- 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 <locale.h> |
| |
| #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<char> &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("<Encoding error>", Buffer); |
| |
| // Ensure we've restored the original locale once tested |
| ASSERT_TRUE(setlocale(LC_ALL, Current.c_str())); |
| } |