1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
//===- llvm/unittest/Support/raw_ostream_test.cpp - raw_ostream tests -----===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "gtest/gtest.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
template<typename T> std::string printToString(const T &Value) {
std::string res;
llvm::raw_string_ostream(res) << Value;
return res;
}
/// printToString - Print the given value to a stream which only has \arg
/// BytesLeftInBuffer bytes left in the buffer. This is useful for testing edge
/// cases in the buffer handling logic.
template<typename T> std::string printToString(const T &Value,
unsigned BytesLeftInBuffer) {
// FIXME: This is relying on internal knowledge of how raw_ostream works to
// get the buffer position right.
SmallString<256> SVec;
assert(BytesLeftInBuffer < 256 && "Invalid buffer count!");
llvm::raw_svector_ostream OS(SVec);
unsigned StartIndex = 256 - BytesLeftInBuffer;
for (unsigned i = 0; i != StartIndex; ++i)
OS << '?';
OS << Value;
return OS.str().substr(StartIndex);
}
template<typename T> std::string printToStringUnbuffered(const T &Value) {
std::string res;
llvm::raw_string_ostream OS(res);
OS.SetUnbuffered();
OS << Value;
return res;
}
TEST(raw_ostreamTest, Types_Buffered) {
// Char
EXPECT_EQ("c", printToString('c'));
// String
EXPECT_EQ("hello", printToString("hello"));
EXPECT_EQ("hello", printToString(std::string("hello")));
// Int
EXPECT_EQ("0", printToString(0));
EXPECT_EQ("2425", printToString(2425));
EXPECT_EQ("-2425", printToString(-2425));
// Long long
EXPECT_EQ("0", printToString(0LL));
EXPECT_EQ("257257257235709", printToString(257257257235709LL));
EXPECT_EQ("-257257257235709", printToString(-257257257235709LL));
// Double
EXPECT_EQ("1.100000e+00", printToString(1.1));
// void*
EXPECT_EQ("0x0", printToString((void*) 0));
EXPECT_EQ("0xbeef", printToString((void*) 0xbeef));
EXPECT_EQ("0xdeadbeef", printToString((void*) 0xdeadbeef));
// Min and max.
EXPECT_EQ("18446744073709551615", printToString(UINT64_MAX));
EXPECT_EQ("-9223372036854775808", printToString(INT64_MIN));
}
TEST(raw_ostreamTest, Types_Unbuffered) {
// Char
EXPECT_EQ("c", printToStringUnbuffered('c'));
// String
EXPECT_EQ("hello", printToStringUnbuffered("hello"));
EXPECT_EQ("hello", printToStringUnbuffered(std::string("hello")));
// Int
EXPECT_EQ("0", printToStringUnbuffered(0));
EXPECT_EQ("2425", printToStringUnbuffered(2425));
EXPECT_EQ("-2425", printToStringUnbuffered(-2425));
// Long long
EXPECT_EQ("0", printToStringUnbuffered(0LL));
EXPECT_EQ("257257257235709", printToStringUnbuffered(257257257235709LL));
EXPECT_EQ("-257257257235709", printToStringUnbuffered(-257257257235709LL));
// Double
EXPECT_EQ("1.100000e+00", printToStringUnbuffered(1.1));
// void*
EXPECT_EQ("0x0", printToStringUnbuffered((void*) 0));
EXPECT_EQ("0xbeef", printToStringUnbuffered((void*) 0xbeef));
EXPECT_EQ("0xdeadbeef", printToStringUnbuffered((void*) 0xdeadbeef));
// Min and max.
EXPECT_EQ("18446744073709551615", printToStringUnbuffered(UINT64_MAX));
EXPECT_EQ("-9223372036854775808", printToStringUnbuffered(INT64_MIN));
}
TEST(raw_ostreamTest, BufferEdge) {
EXPECT_EQ("1.20", printToString(format("%.2f", 1.2), 1));
EXPECT_EQ("1.20", printToString(format("%.2f", 1.2), 2));
EXPECT_EQ("1.20", printToString(format("%.2f", 1.2), 3));
EXPECT_EQ("1.20", printToString(format("%.2f", 1.2), 4));
EXPECT_EQ("1.20", printToString(format("%.2f", 1.2), 10));
}
TEST(raw_ostreamTest, TinyBuffer) {
std::string Str;
raw_string_ostream OS(Str);
OS.SetBufferSize(1);
OS << "hello";
OS << 1;
OS << 'w' << 'o' << 'r' << 'l' << 'd';
EXPECT_EQ("hello1world", OS.str());
}
TEST(raw_ostreamTest, WriteEscaped) {
std::string Str;
Str = "";
raw_string_ostream(Str).write_escaped("hi");
EXPECT_EQ("hi", Str);
Str = "";
raw_string_ostream(Str).write_escaped("\\\t\n\"");
EXPECT_EQ("\\\\\\t\\n\\\"", Str);
Str = "";
raw_string_ostream(Str).write_escaped("\1\10\200");
EXPECT_EQ("\\001\\010\\200", Str);
}
}
|