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