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/MathExtras.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> 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)namespace { 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(WTF, StringCreationFromLiteral) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch String stringFromLiteral("Explicit construction syntax"); 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_EQ(strlen("Explicit construction syntax"), stringFromLiteral.length()); 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(stringFromLiteral == "Explicit construction syntax"); 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(stringFromLiteral.is8Bit()); 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(String("Explicit construction syntax") == stringFromLiteral); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(WTF, StringASCII) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CString output; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Null String. 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output = String().ascii(); 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("", output.data()); 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Empty String. 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) output = emptyString().ascii(); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("", output.data()); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Regular String. 583c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch output = String("foobar").ascii(); 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("foobar", output.data()); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static void testNumberToStringECMAScript(double number, const char* reference) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) CString numberString = String::numberToStringECMAScript(number).latin1(); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ(reference, numberString.data()); 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(WTF, StringNumberToStringECMAScriptBoundaries) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) typedef std::numeric_limits<double> Limits; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Infinity. 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(Limits::infinity(), "Infinity"); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(-Limits::infinity(), "-Infinity"); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // NaN. 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(-Limits::quiet_NaN(), "NaN"); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Zeros. 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(0, "0"); 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(-0, "0"); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Min-Max. 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(Limits::min(), "2.2250738585072014e-308"); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(Limits::max(), "1.7976931348623157e+308"); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(WTF, StringNumberToStringECMAScriptRegularNumbers) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Pi. 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(piDouble, "3.141592653589793"); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(piFloat, "3.1415927410125732"); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(piOverTwoDouble, "1.5707963267948966"); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(piOverTwoFloat, "1.5707963705062866"); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(piOverFourDouble, "0.7853981633974483"); 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(piOverFourFloat, "0.7853981852531433"); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // e. 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const double e = 2.71828182845904523536028747135266249775724709369995; 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(e, "2.718281828459045"); 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // c, speed of light in m/s. 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const double c = 299792458; 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(c, "299792458"); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Golen ratio. 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) const double phi = 1.6180339887498948482; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberToStringECMAScript(phi, "1.618033988749895"); 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST(WTF, StringReplaceWithLiteral) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Cases for 8Bit source. 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String testString = "1224"; 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(testString.is8Bit()); 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral('2', ""); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("14", testString.utf8().data()); 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString = "1224"; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(testString.is8Bit()); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral('2', "3"); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("1334", testString.utf8().data()); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString = "1224"; 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(testString.is8Bit()); 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral('2', "555"); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("15555554", testString.utf8().data()); 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString = "1224"; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_TRUE(testString.is8Bit()); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral('3', "NotFound"); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("1224", testString.utf8().data()); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Cases for 16Bit source. 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString = String::fromUTF8("résumé"); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_FALSE(testString.is8Bit()); 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral(UChar(0x00E9 /*U+00E9 is 'é'*/), "e"); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("resume", testString.utf8().data()); 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString = String::fromUTF8("résumé"); 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_FALSE(testString.is8Bit()); 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral(UChar(0x00E9 /*U+00E9 is 'é'*/), ""); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("rsum", testString.utf8().data()); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString = String::fromUTF8("résumé"); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_FALSE(testString.is8Bit()); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testString.replaceWithLiteral('3', "NotFound"); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT_STREQ("résumé", testString.utf8().data()); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1518abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)TEST(WTF, StringComparisonOfSameStringVectors) 1528abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles){ 1538abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Vector<String> stringVector; 1548abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) stringVector.append("one"); 1558abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) stringVector.append("two"); 1568abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 1578abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) Vector<String> sameStringVector; 1588abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) sameStringVector.append("one"); 1598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) sameStringVector.append("two"); 1608abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 1618abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) ASSERT_EQ(stringVector, sameStringVector); 1628abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)} 1638abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles) 16419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)TEST(WTF, SimplifyWhiteSpace) 16519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles){ 16619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) String extraSpaces(" Hello world "); 16719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT_EQ(String("Hello world"), extraSpaces.simplifyWhiteSpace()); 16819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT_EQ(String(" Hello world "), extraSpaces.simplifyWhiteSpace(WTF::DoNotStripWhiteSpace)); 16919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 17019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) String extraSpacesAndNewlines(" \nHello\n world\n "); 17119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT_EQ(String("Hello world"), extraSpacesAndNewlines.simplifyWhiteSpace()); 17219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT_EQ(String(" Hello world "), extraSpacesAndNewlines.simplifyWhiteSpace(WTF::DoNotStripWhiteSpace)); 17319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 17419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) String extraSpacesAndTabs(" \nHello\t world\t "); 17519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT_EQ(String("Hello world"), extraSpacesAndTabs.simplifyWhiteSpace()); 17619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) ASSERT_EQ(String(" Hello world "), extraSpacesAndTabs.simplifyWhiteSpace(WTF::DoNotStripWhiteSpace)); 17719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)} 17819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 17909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)struct CaseFoldingTestData { 18009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* sourceDescription; 18109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* source; 18209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char** localeList; 18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) size_t localeListLength; 18409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* expected; 18509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}; 18609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 18709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// \xC4\xB0 = U+0130 (capital dotted I) 18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// \xC4\xB1 = U+0131 (lowercase dotless I) 18909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* turkicInput = "Isi\xC4\xB0 \xC4\xB0s\xC4\xB1I"; 19009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* greekInput = "\xCE\x9F\xCE\x94\xCE\x8C\xCE\xA3 \xCE\x9F\xCE\xB4\xCF\x8C\xCF\x82 \xCE\xA3\xCE\xBF \xCE\xA3\xCE\x9F o\xCE\xA3 \xCE\x9F\xCE\xA3 \xCF\x83 \xE1\xBC\x95\xCE\xBE"; 19109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* lithuanianInput = "I \xC3\x8F J J\xCC\x88 \xC4\xAE \xC4\xAE\xCC\x88 \xC3\x8C \xC3\x8D \xC4\xA8 xi\xCC\x87\xCC\x88 xj\xCC\x87\xCC\x88 x\xC4\xAF\xCC\x87\xCC\x88 xi\xCC\x87\xCC\x80 xi\xCC\x87\xCC\x81 xi\xCC\x87\xCC\x83 XI X\xC3\x8F XJ XJ\xCC\x88 X\xC4\xAE X\xC4\xAE\xCC\x88"; 19209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 19409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* turkicLocales[] = { 19509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "tr", "tr-TR", "tr_TR", "tr@foo=bar", "tr-US", "TR", "tr-tr", "tR", 19609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "az", "az-AZ", "az_AZ", "az@foo=bar", "az-US", "Az", "AZ-AZ", }; 19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* nonTurkicLocales[] = { 19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "en", "en-US", "en_US", "en@foo=bar", "EN", "En", 19909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "ja", "el", "fil", "fi", "lt", }; 20009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* greekLocales[] = { 20109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "el", "el-GR", "el_GR", "el@foo=bar", "el-US", "EL", "el-gr", "eL", 20209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}; 20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* nonGreekLocales[] = { 20409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "en", "en-US", "en_US", "en@foo=bar", "EN", "En", 20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "ja", "tr", "az", "fil", "fi", "lt", }; 20609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* lithuanianLocales[] = { 20709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "lt", "lt-LT", "lt_LT", "lt@foo=bar", "lt-US", "LT", "lt-lt", "lT", 20809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}; 20909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Should not have "tr" or "az" because "lt" and 'tr/az' rules conflict with each other. 21009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)const char* nonLithuanianLocales[] = { 21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "en", "en-US", "en_US", "en@foo=bar", "EN", "En", "ja", "fil", "fi", "el", }; 21209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST(WTF, StringToUpperLocale) 21409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 21509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) CaseFoldingTestData testDataList[] = { 21609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 21709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Turkic input", 21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) turkicInput, 21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) turkicLocales, 22009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(turkicLocales) / sizeof(const char*), 22109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "IS\xC4\xB0\xC4\xB0 \xC4\xB0SII", 22209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Turkic input", 22409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) turkicInput, 22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) nonTurkicLocales, 22609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(nonTurkicLocales) / sizeof(const char*), 22709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "ISI\xC4\xB0 \xC4\xB0SII", 22809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 22909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Greek input", 23009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) greekInput, 23109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) greekLocales, 23209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(greekLocales) / sizeof(const char*), 23309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "\xCE\x9F\xCE\x94\xCE\x9F\xCE\xA3 \xCE\x9F\xCE\x94\xCE\x9F\xCE\xA3 \xCE\xA3\xCE\x9F \xCE\xA3\xCE\x9F \x4F\xCE\xA3 \xCE\x9F\xCE\xA3 \xCE\xA3 \xCE\x95\xCE\x9E", 23409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Greek input", 23609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) greekInput, 23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) nonGreekLocales, 23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(nonGreekLocales) / sizeof(const char*), 23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "\xCE\x9F\xCE\x94\xCE\x8C\xCE\xA3 \xCE\x9F\xCE\x94\xCE\x8C\xCE\xA3 \xCE\xA3\xCE\x9F \xCE\xA3\xCE\x9F \x4F\xCE\xA3 \xCE\x9F\xCE\xA3 \xCE\xA3 \xE1\xBC\x9D\xCE\x9E", 24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Lithuanian input", 24209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lithuanianInput, 24309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lithuanianLocales, 24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(lithuanianLocales) / sizeof(const char*), 24509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "I \xC3\x8F J J\xCC\x88 \xC4\xAE \xC4\xAE\xCC\x88 \xC3\x8C \xC3\x8D \xC4\xA8 XI\xCC\x88 XJ\xCC\x88 X\xC4\xAE\xCC\x88 XI\xCC\x80 XI\xCC\x81 XI\xCC\x83 XI X\xC3\x8F XJ XJ\xCC\x88 X\xC4\xAE X\xC4\xAE\xCC\x88", 24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 24709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Lithuanian input", 24809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lithuanianInput, 24909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) nonLithuanianLocales, 25009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(nonLithuanianLocales) / sizeof(const char*), 25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "I \xC3\x8F J J\xCC\x88 \xC4\xAE \xC4\xAE\xCC\x88 \xC3\x8C \xC3\x8D \xC4\xA8 XI\xCC\x87\xCC\x88 XJ\xCC\x87\xCC\x88 X\xC4\xAE\xCC\x87\xCC\x88 XI\xCC\x87\xCC\x80 XI\xCC\x87\xCC\x81 XI\xCC\x87\xCC\x83 XI X\xC3\x8F XJ XJ\xCC\x88 X\xC4\xAE X\xC4\xAE\xCC\x88", 25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }; 25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 25509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (size_t i = 0; i < sizeof(testDataList) / sizeof(testDataList[0]); ++i) { 25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* expected = testDataList[i].expected; 25709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) String source = String::fromUTF8(testDataList[i].source); 25809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (size_t j = 0; j < testDataList[i].localeListLength; ++j) { 25909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* locale = testDataList[i].localeList[j]; 26009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) EXPECT_STREQ(expected, source.upper(locale).utf8().data()) << testDataList[i].sourceDescription << "; locale=" << locale; 26109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 26209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 26409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 26509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST(WTF, StringToLowerLocale) 26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 26709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) CaseFoldingTestData testDataList[] = { 26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) { 26909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Turkic input", 27009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) turkicInput, 27109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) turkicLocales, 27209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(turkicLocales) / sizeof(const char*), 27309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "\xC4\xB1sii is\xC4\xB1\xC4\xB1", 27409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 27509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Turkic input", 27609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) turkicInput, 27709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) nonTurkicLocales, 27809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(nonTurkicLocales) / sizeof(const char*), 27909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) // U+0130 is lowercased to U+0069 followed by U+0307 28009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "isii\xCC\x87 i\xCC\x87s\xC4\xB1i", 28109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 28209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Greek input", 28309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) greekInput, 28409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) greekLocales, 28509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(greekLocales) / sizeof(const char*), 28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "\xCE\xBF\xCE\xB4\xCF\x8C\xCF\x82 \xCE\xBF\xCE\xB4\xCF\x8C\xCF\x82 \xCF\x83\xCE\xBF \xCF\x83\xCE\xBF \x6F\xCF\x82 \xCE\xBF\xCF\x82 \xCF\x83 \xE1\xBC\x95\xCE\xBE", 28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Greek input", 28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) greekInput, 29009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) nonGreekLocales, 29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(greekLocales) / sizeof(const char*), 29209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "\xCE\xBF\xCE\xB4\xCF\x8C\xCF\x82 \xCE\xBF\xCE\xB4\xCF\x8C\xCF\x82 \xCF\x83\xCE\xBF \xCF\x83\xCE\xBF \x6F\xCF\x82 \xCE\xBF\xCF\x82 \xCF\x83 \xE1\xBC\x95\xCE\xBE", 29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 29409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Lithuanian input", 29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lithuanianInput, 29609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lithuanianLocales, 29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(lithuanianLocales) / sizeof(const char*), 29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "i \xC3\xAF j j\xCC\x87\xCC\x88 \xC4\xAF \xC4\xAF\xCC\x87\xCC\x88 i\xCC\x87\xCC\x80 i\xCC\x87\xCC\x81 i\xCC\x87\xCC\x83 xi\xCC\x87\xCC\x88 xj\xCC\x87\xCC\x88 x\xC4\xAF\xCC\x87\xCC\x88 xi\xCC\x87\xCC\x80 xi\xCC\x87\xCC\x81 xi\xCC\x87\xCC\x83 xi x\xC3\xAF xj xj\xCC\x87\xCC\x88 x\xC4\xAF x\xC4\xAF\xCC\x87\xCC\x88", 29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, { 30009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "Lithuanian input", 30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) lithuanianInput, 30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) nonLithuanianLocales, 30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) sizeof(nonLithuanianLocales) / sizeof(const char*), 30409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) "\x69 \xC3\xAF \x6A \x6A\xCC\x88 \xC4\xAF \xC4\xAF\xCC\x88 \xC3\xAC \xC3\xAD \xC4\xA9 \x78\x69\xCC\x87\xCC\x88 \x78\x6A\xCC\x87\xCC\x88 \x78\xC4\xAF\xCC\x87\xCC\x88 \x78\x69\xCC\x87\xCC\x80 \x78\x69\xCC\x87\xCC\x81 \x78\x69\xCC\x87\xCC\x83 \x78\x69 \x78\xC3\xAF \x78\x6A \x78\x6A\xCC\x88 \x78\xC4\xAF \x78\xC4\xAF\xCC\x88", 30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }, 30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) }; 30709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (size_t i = 0; i < sizeof(testDataList) / sizeof(testDataList[0]); ++i) { 30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* expected = testDataList[i].expected; 31009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) String source = String::fromUTF8(testDataList[i].source); 31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) for (size_t j = 0; j < testDataList[i].localeListLength; ++j) { 31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) const char* locale = testDataList[i].localeList[j]; 31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) EXPECT_STREQ(expected, source.lower(locale).utf8().data()) << testDataList[i].sourceDescription << "; locale=" << locale; 31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 31853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)} // namespace 319