15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE.
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/StringExtras.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/CString.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "wtf/text/WTFString.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include <gtest/gtest.h>
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits>
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename IntegerType> struct PrintfFormatTrait { static const char format[]; };
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<short> { static const char format[]; };
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<short>::format[] = "%hd";
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<int> { static const char format[]; };
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<int>::format[] = "%d";
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<long> { static const char format[]; };
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<long>::format[] = "%ld";
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<long long> { static const char format[]; };
488abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<long long>::format[] = "%I64i";
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<long long>::format[] = "%lli";
528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif // OS(WIN)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<unsigned short> { static const char format[]; };
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<unsigned short>::format[] = "%hu";
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<unsigned> { static const char format[]; };
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<unsigned>::format[] = "%u";
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<unsigned long> { static const char format[]; };
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<unsigned long>::format[] = "%lu";
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<> struct PrintfFormatTrait<unsigned long long> { static const char format[]; };
648abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(WIN)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<unsigned long long>::format[] = "%I64u";
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const char PrintfFormatTrait<unsigned long long>::format[] = "%llu";
688abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#endif // OS(WIN)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: use snprintf from StringExtras.h
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename IntegerType>
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void testBoundaries()
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned bufferSize = 256;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<char, bufferSize> buffer;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    buffer.resize(bufferSize);
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntegerType min = std::numeric_limits<IntegerType>::min();
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CString minStringData = String::number(min).latin1();
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    snprintf(buffer.data(), bufferSize, PrintfFormatTrait<IntegerType>::format, min);
82f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    EXPECT_STREQ(buffer.data(), minStringData.data());
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntegerType max = std::numeric_limits<IntegerType>::max();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CString maxStringData = String::number(max).latin1();
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    snprintf(buffer.data(), bufferSize, PrintfFormatTrait<IntegerType>::format, max);
87f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    EXPECT_STREQ(buffer.data(), maxStringData.data());
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)template<typename IntegerType>
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void testNumbers()
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const unsigned bufferSize = 256;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Vector<char, bufferSize> buffer;
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    buffer.resize(bufferSize);
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (int i = -100; i < 100; ++i) {
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const IntegerType number = static_cast<IntegerType>(i);
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        CString numberStringData = String::number(number).latin1();
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        snprintf(buffer.data(), bufferSize, PrintfFormatTrait<IntegerType>::format, number);
101f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        EXPECT_STREQ(buffer.data(), numberStringData.data());
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
105f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(StringExtraTest, IntegerToStringConversionSignedIntegerBoundaries)
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<short>();
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<int>();
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<long>();
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<long long>();
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
113f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(StringExtraTest, IntegerToStringConversionSignedIntegerRegularNumbers)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<short>();
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<int>();
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<long>();
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<long long>();
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
121f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(StringExtraTest, IntegerToStringConversionUnsignedIntegerBoundaries)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<unsigned short>();
12407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    testBoundaries<unsigned>();
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<unsigned long>();
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testBoundaries<unsigned long long>();
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
129f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuTEST(StringExtraTest, IntegerToStringConversionUnsignedIntegerRegularNumbers)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<unsigned short>();
13207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    testNumbers<unsigned>();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<unsigned long>();
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    testNumbers<unsigned long long>();
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
13653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
13753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} // namespace
138