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