xref: /llvm-project/lldb/unittests/Utility/VASprintfTest.cpp (revision 24ae6294a4a97d4dfe0e43f7bcd52811b6346c17)
1 //===-- VASprintfTest.cpp ---------------------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "lldb/Utility/VASprintf.h"
11 #include "llvm/ADT/SmallString.h"
12 
13 #include "gtest/gtest.h"
14 
15 #include <locale.h>
16 
17 using namespace lldb_private;
18 using namespace llvm;
19 
20 static bool Sprintf(llvm::SmallVectorImpl<char> &Buffer, const char *Fmt, ...) {
21   va_list args;
22   va_start(args, Fmt);
23   bool Result = VASprintf(Buffer, Fmt, args);
24   va_end(args);
25   return Result;
26 }
27 
28 TEST(VASprintfTest, NoBufferResize) {
29   std::string TestStr("small");
30 
31   llvm::SmallString<32> BigBuffer;
32   ASSERT_TRUE(Sprintf(BigBuffer, "%s", TestStr.c_str()));
33   EXPECT_STREQ(TestStr.c_str(), BigBuffer.c_str());
34   EXPECT_EQ(TestStr.size(), BigBuffer.size());
35 }
36 
37 TEST(VASprintfTest, BufferResize) {
38   std::string TestStr("bigger");
39   llvm::SmallString<4> SmallBuffer;
40   ASSERT_TRUE(Sprintf(SmallBuffer, "%s", TestStr.c_str()));
41   EXPECT_STREQ(TestStr.c_str(), SmallBuffer.c_str());
42   EXPECT_EQ(TestStr.size(), SmallBuffer.size());
43 }
44 
45 TEST(VASprintfTest, EncodingError) {
46   // Save the current locale first.
47   std::string Current(::setlocale(LC_ALL, nullptr));
48 
49   setlocale(LC_ALL, ".932");
50 
51   wchar_t Invalid[2];
52   Invalid[0] = 129;
53   Invalid[1] = 0;
54   llvm::SmallString<32> Buffer;
55   EXPECT_FALSE(Sprintf(Buffer, "%ls", Invalid));
56   EXPECT_EQ("<Encoding error>", Buffer);
57 
58   setlocale(LC_CTYPE, Current.c_str());
59 }
60