1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <string.h>
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include <limits>
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "include/v8stdint.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/ostreams.h"
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "test/cctest/cctest.h"
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochusing namespace v8::internal;
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(OStringStreamConstructor) {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream oss;
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const size_t expected_size = 0;
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(expected_size == oss.size());
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_GT(oss.capacity(), 0);
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_NE(NULL, oss.data());
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ("", oss.c_str());
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TEST_STRING            \
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "Ash nazg durbatuluk, "      \
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "ash nazg gimbatul, "        \
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "ash nazg thrakatuluk, "     \
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  "agh burzum-ishi krimpatul."
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(OStringStreamGrow) {
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream oss;
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const int repeat = 30;
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  size_t len = strlen(TEST_STRING);
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  for (int i = 0; i < repeat; ++i) {
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    oss.write(TEST_STRING, len);
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* expected =
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING;
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const size_t expected_len = len * repeat;
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK(expected_len == oss.size());
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_GT(oss.capacity(), 0);
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(0, strncmp(expected, oss.data(), expected_len));
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(expected, oss.c_str());
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <class T>
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic void check(const char* expected, T value) {
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream oss;
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  oss << value << " " << hex << value;
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ(expected, oss.c_str());
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(NumericFormatting) {
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<bool>("0 0", false);
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<bool>("1 1", true);
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int16_t>("-12345 cfc7", -12345);
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int16_t>("-32768 8000", std::numeric_limits<int16_t>::min());
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int16_t>("32767 7fff", std::numeric_limits<int16_t>::max());
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint16_t>("34567 8707", 34567);
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint16_t>("0 0", std::numeric_limits<uint16_t>::min());
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint16_t>("65535 ffff", std::numeric_limits<uint16_t>::max());
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int32_t>("-1234567 ffed2979", -1234567);
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int32_t>("-2147483648 80000000", std::numeric_limits<int32_t>::min());
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int32_t>("2147483647 7fffffff", std::numeric_limits<int32_t>::max());
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint32_t>("3456789 34bf15", 3456789);
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint32_t>("0 0", std::numeric_limits<uint32_t>::min());
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint32_t>("4294967295 ffffffff", std::numeric_limits<uint32_t>::max());
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int64_t>("-1234567 ffffffffffed2979", -1234567);
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int64_t>("-9223372036854775808 8000000000000000",
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 std::numeric_limits<int64_t>::min());
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<int64_t>("9223372036854775807 7fffffffffffffff",
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                 std::numeric_limits<int64_t>::max());
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint64_t>("3456789 34bf15", 3456789);
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint64_t>("0 0", std::numeric_limits<uint64_t>::min());
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<uint64_t>("18446744073709551615 ffffffffffffffff",
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                  std::numeric_limits<uint64_t>::max());
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<float>("0 0", 0.0f);
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<float>("123 123", 123.0f);
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<float>("-0.5 -0.5", -0.5f);
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<float>("1.25 1.25", 1.25f);
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<float>("0.0625 0.0625", 6.25e-2f);
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<double>("0 0", 0.0);
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<double>("123 123", 123.0);
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<double>("-0.5 -0.5", -0.5);
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<double>("1.25 1.25", 1.25);
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<double>("0.0625 0.0625", 6.25e-2);
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(CharacterOutput) {
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<char>("a a", 'a');
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<signed char>("B B", 'B');
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<unsigned char>("9 9", '9');
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  check<const char*>("bye bye", "bye");
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream os;
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os.put('H').write("ello", 4);
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ("Hello", os.c_str());
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(Manipulators) {
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream os;
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os << 123 << hex << 123 << endl << 123 << dec << 123 << 123;
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ("1237b\n7b123123", os.c_str());
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass MiscStuff {
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public:
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MiscStuff(int i, double d, const char* s) : i_(i), d_(d), s_(s) { }
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private:
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  friend OStream& operator<<(OStream& os, const MiscStuff& m);
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int i_;
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  double d_;
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const char* s_;
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const MiscStuff& m) {
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << "{i:" << m.i_ << ", d:" << m.d_ << ", s:'" << m.s_ << "'}";
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST(CustomOutput) {
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream os;
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  MiscStuff m(123, 4.5, "Hurz!");
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  os << m;
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  CHECK_EQ("{i:123, d:4.5, s:'Hurz!'}", os.c_str());
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
149