1248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org// Copyright 2014 the V8 project authors. All rights reserved. 2248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be 3248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org// found in the LICENSE file. 4248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 5248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#include <string.h> 6248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#include <limits> 7248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 8248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#include "include/v8stdint.h" 9248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#include "src/ostreams.h" 10248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#include "test/cctest/cctest.h" 11248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 12248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgusing namespace v8::internal; 13248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 14248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 15248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgTEST(OStringStreamConstructor) { 16248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org OStringStream oss; 17248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org const size_t expected_size = 0; 18248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK(expected_size == oss.size()); 19248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_GT(oss.capacity(), 0); 20248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_NE(NULL, oss.data()); 21248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ("", oss.c_str()); 22248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 23248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 24248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 25248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org#define TEST_STRING \ 26248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org "Ash nazg durbatuluk, " \ 27248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org "ash nazg gimbatul, " \ 28248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org "ash nazg thrakatuluk, " \ 29248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org "agh burzum-ishi krimpatul." 30248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 31248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgTEST(OStringStreamGrow) { 32248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org OStringStream oss; 33248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org const int repeat = 30; 34248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org size_t len = strlen(TEST_STRING); 35248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org for (int i = 0; i < repeat; ++i) { 36248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org oss.write(TEST_STRING, len); 37248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org } 38248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org const char* expected = 39248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING 40248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING 41248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING 42248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING 43248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING 44248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org TEST_STRING TEST_STRING TEST_STRING TEST_STRING TEST_STRING; 45248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org const size_t expected_len = len * repeat; 46248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK(expected_len == oss.size()); 47248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_GT(oss.capacity(), 0); 48248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ(0, strncmp(expected, oss.data(), expected_len)); 49248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ(expected, oss.c_str()); 50248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 51248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 52248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 53248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgtemplate <class T> 54248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgstatic void check(const char* expected, T value) { 55248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org OStringStream oss; 56248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org oss << value << " " << hex << value; 57248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ(expected, oss.c_str()); 58248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 59248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 60248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 61248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgTEST(NumericFormatting) { 62248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<bool>("0 0", false); 63248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<bool>("1 1", true); 64248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 65248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int16_t>("-12345 cfc7", -12345); 66248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int16_t>("-32768 8000", std::numeric_limits<int16_t>::min()); 67248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int16_t>("32767 7fff", std::numeric_limits<int16_t>::max()); 68248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 69248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint16_t>("34567 8707", 34567); 70248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint16_t>("0 0", std::numeric_limits<uint16_t>::min()); 71248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint16_t>("65535 ffff", std::numeric_limits<uint16_t>::max()); 72248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 73248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int32_t>("-1234567 ffed2979", -1234567); 74248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int32_t>("-2147483648 80000000", std::numeric_limits<int32_t>::min()); 75248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int32_t>("2147483647 7fffffff", std::numeric_limits<int32_t>::max()); 76248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 77248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint32_t>("3456789 34bf15", 3456789); 78248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint32_t>("0 0", std::numeric_limits<uint32_t>::min()); 79248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint32_t>("4294967295 ffffffff", std::numeric_limits<uint32_t>::max()); 80248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 81248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int64_t>("-1234567 ffffffffffed2979", -1234567); 82248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int64_t>("-9223372036854775808 8000000000000000", 83248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org std::numeric_limits<int64_t>::min()); 84248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<int64_t>("9223372036854775807 7fffffffffffffff", 85248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org std::numeric_limits<int64_t>::max()); 86248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 87248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint64_t>("3456789 34bf15", 3456789); 88248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint64_t>("0 0", std::numeric_limits<uint64_t>::min()); 89248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<uint64_t>("18446744073709551615 ffffffffffffffff", 90248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org std::numeric_limits<uint64_t>::max()); 91248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 92248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<float>("0 0", 0.0f); 93248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<float>("123 123", 123.0f); 94248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<float>("-0.5 -0.5", -0.5f); 95248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<float>("1.25 1.25", 1.25f); 96248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<float>("0.0625 0.0625", 6.25e-2f); 97248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 98248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<double>("0 0", 0.0); 99248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<double>("123 123", 123.0); 100248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<double>("-0.5 -0.5", -0.5); 101248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<double>("1.25 1.25", 1.25); 102248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<double>("0.0625 0.0625", 6.25e-2); 103248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 104248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 105248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 106248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgTEST(CharacterOutput) { 107248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<char>("a a", 'a'); 108248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<signed char>("B B", 'B'); 109248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<unsigned char>("9 9", '9'); 110248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org check<const char*>("bye bye", "bye"); 111248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 112248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org OStringStream os; 113248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org os.put('H').write("ello", 4); 114248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ("Hello", os.c_str()); 115248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 116248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 117248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 118248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgTEST(Manipulators) { 119248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org OStringStream os; 120248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org os << 123 << hex << 123 << endl << 123 << dec << 123 << 123; 121248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ("1237b\n7b123123", os.c_str()); 122248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 123248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 124248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 125248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgclass MiscStuff { 126248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org public: 127248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org MiscStuff(int i, double d, const char* s) : i_(i), d_(d), s_(s) { } 128248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 129248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org private: 130248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org friend OStream& operator<<(OStream& os, const MiscStuff& m); 131248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 132248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org int i_; 133248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org double d_; 134248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org const char* s_; 135248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org}; 136248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 137248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 138248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgOStream& operator<<(OStream& os, const MiscStuff& m) { 139248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org return os << "{i:" << m.i_ << ", d:" << m.d_ << ", s:'" << m.s_ << "'}"; 140248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 141248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 142248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org 143248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.orgTEST(CustomOutput) { 144248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org OStringStream os; 145248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org MiscStuff m(123, 4.5, "Hurz!"); 146248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org os << m; 147248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org CHECK_EQ("{i:123, d:4.5, s:'Hurz!'}", os.c_str()); 148248dd43badb99ffce44eae2d767cda3cefaad521machenbach@chromium.org} 149