1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 03:23:01 +02:00
llvm-mirror/unittests/Support/raw_ostream_test.cpp
Daniel Dunbar e58499843b Fix off-by-one in llvm::Format::print.
- This also shortens the Format.h implementation, and uses the print buffer
   fully (it was wasting a character).

 - This manifested as llvm-test failures, because one side effect was that
   raw_ostream would write garbage '\x00' values into the output stream if it
   happened that the string was at the end of the buffer. This meant that grep
   would report 'Binary file matches', which meant the silly pattern matching
   llvm-test eventually does would fail. Cute. :)

llvm-svn: 79862
2009-08-23 20:31:39 +00:00

121 lines
3.8 KiB
C++

//===- 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));
}
}