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