/* * Copyright (C) 2012 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include #include #include #include template struct PrintfFormatTrait { static const char format[]; }; template<> struct PrintfFormatTrait { static const char format[]; }; const char PrintfFormatTrait::format[] = "%hd"; template<> struct PrintfFormatTrait { static const char format[]; }; const char PrintfFormatTrait::format[] = "%d"; template<> struct PrintfFormatTrait { static const char format[]; }; const char PrintfFormatTrait::format[] = "%ld"; template<> struct PrintfFormatTrait { static const char format[]; }; #if OS(WINDOWS) const char PrintfFormatTrait::format[] = "%I64i"; #else const char PrintfFormatTrait::format[] = "%lli"; #endif // OS(WINDOWS) template<> struct PrintfFormatTrait { static const char format[]; }; const char PrintfFormatTrait::format[] = "%hu"; template<> struct PrintfFormatTrait { static const char format[]; }; const char PrintfFormatTrait::format[] = "%u"; template<> struct PrintfFormatTrait { static const char format[]; }; const char PrintfFormatTrait::format[] = "%lu"; template<> struct PrintfFormatTrait { static const char format[]; }; #if OS(WINDOWS) const char PrintfFormatTrait::format[] = "%I64u"; #else const char PrintfFormatTrait::format[] = "%llu"; #endif // OS(WINDOWS) // FIXME: use snprintf from StringExtras.h template void testBoundaries() { const unsigned bufferSize = 256; Vector buffer; buffer.resize(bufferSize); const IntegerType min = std::numeric_limits::min(); CString minStringData = String::number(min).latin1(); snprintf(buffer.data(), bufferSize, PrintfFormatTrait::format, min); ASSERT_STREQ(buffer.data(), minStringData.data()); const IntegerType max = std::numeric_limits::max(); CString maxStringData = String::number(max).latin1(); snprintf(buffer.data(), bufferSize, PrintfFormatTrait::format, max); ASSERT_STREQ(buffer.data(), maxStringData.data()); } template void testNumbers() { const unsigned bufferSize = 256; Vector buffer; buffer.resize(bufferSize); for (int i = -100; i < 100; ++i) { const IntegerType number = static_cast(i); CString numberStringData = String::number(number).latin1(); snprintf(buffer.data(), bufferSize, PrintfFormatTrait::format, number); ASSERT_STREQ(buffer.data(), numberStringData.data()); } } TEST(WTF, IntegerToStringConversionSignedIntegerBoundaries) { testBoundaries(); testBoundaries(); testBoundaries(); testBoundaries(); } TEST(WTF, IntegerToStringConversionSignedIntegerRegularNumbers) { testNumbers(); testNumbers(); testNumbers(); testNumbers(); } TEST(WTF, IntegerToStringConversionUnsignedIntegerBoundaries) { testBoundaries(); testBoundaries(); testBoundaries(); testBoundaries(); } TEST(WTF, IntegerToStringConversionUnsignedIntegerRegularNumbers) { testNumbers(); testNumbers(); testNumbers(); testNumbers(); }