15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Google 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 are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/LocaleICU.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 34591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/PassOwnPtr.h" 35591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/StringBuilder.h" 36f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include <gtest/gtest.h> 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 38c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)using namespace blink; 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class LocaleICUTest : public ::testing::Test { 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Labels class is used for printing results in EXPECT_EQ macro. 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) class Labels { 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) public: 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Labels(const Vector<String> labels) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_labels(labels) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // FIXME: We should use Vector<T>::operator==() if it works. 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool operator==(const Labels& other) const 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_labels.size() != other.m_labels.size()) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned index = 0; index < m_labels.size(); ++index) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (m_labels[index] != other.m_labels[index]) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return false; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return true; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String toString() const 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) StringBuilder builder; 649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) builder.appendLiteral("labels("); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (unsigned index = 0; index < m_labels.size(); ++index) { 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (index) 679e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) builder.appendLiteral(", "); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) builder.append('"'); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) builder.append(m_labels[index]); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) builder.append('"'); 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) builder.append(')'); 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return builder.toString(); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) private: 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<String> m_labels; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected: 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Labels labels(const String& element1, const String& element2) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Vector<String> labels = Vector<String>(); 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) labels.append(element1); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) labels.append(element2); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Labels(labels); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String monthFormat(const char* localeString) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->monthFormat(); 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String localizedDateFormatText(const char* localeString) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->timeFormat(); 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String localizedShortDateFormatText(const char* localeString) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->shortTimeFormat(); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String shortMonthLabel(const char* localeString, unsigned index) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->shortMonthLabels()[index]; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String shortStandAloneMonthLabel(const char* localeString, unsigned index) 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->shortStandAloneMonthLabels()[index]; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String standAloneMonthLabel(const char* localeString, unsigned index) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->standAloneMonthLabels()[index]; 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Labels timeAMPMLabels(const char* localeString) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Labels(locale->timeAMPMLabels()); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isRTL(const char* localeString) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<LocaleICU> locale = LocaleICU::create(localeString); 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->isRTL(); 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)std::ostream& operator<<(std::ostream& os, const LocaleICUTest::Labels& labels) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return os << labels.toString().utf8().data(); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if ENABLE(INPUT_MULTIPLE_FIELDS_UI) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, isRTL) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(isRTL("ar-EG")); 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_FALSE(isRTL("en-us")); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_FALSE(isRTL("ja-jp")); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_FALSE(isRTL("**invalid**")); 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, monthFormat) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("MMMM yyyy", monthFormat("en_US").utf8().data()); 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("MMMM yyyy", monthFormat("fr").utf8().data()); 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("yyyy\xE5\xB9\xB4M\xE6\x9C\x88", monthFormat("ja").utf8().data()); 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, localizedDateFormatText) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Note: EXPECT_EQ(String, String) doesn't print result as string. 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("h:mm:ss a", localizedDateFormatText("en_US").utf8().data()); 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("HH:mm:ss", localizedDateFormatText("fr").utf8().data()); 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("H:mm:ss", localizedDateFormatText("ja").utf8().data()); 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, localizedShortDateFormatText) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("h:mm a", localizedShortDateFormatText("en_US").utf8().data()); 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("HH:mm", localizedShortDateFormatText("fr").utf8().data()); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("H:mm", localizedShortDateFormatText("ja").utf8().data()); 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, standAloneMonthLabels) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("January", standAloneMonthLabel("en_US", 0).utf8().data()); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("June", standAloneMonthLabel("en_US", 5).utf8().data()); 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("December", standAloneMonthLabel("en_US", 11).utf8().data()); 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("janvier", standAloneMonthLabel("fr_FR", 0).utf8().data()); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("juin", standAloneMonthLabel("fr_FR", 5).utf8().data()); 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("d\xC3\xA9" "cembre", standAloneMonthLabel("fr_FR", 11).utf8().data()); 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("1\xE6\x9C\x88", standAloneMonthLabel("ja_JP", 0).utf8().data()); 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("6\xE6\x9C\x88", standAloneMonthLabel("ja_JP", 5).utf8().data()); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("12\xE6\x9C\x88", standAloneMonthLabel("ja_JP", 11).utf8().data()); 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("\xD0\x9C\xD0\xB0\xD1\x80\xD1\x82", standAloneMonthLabel("ru_RU", 2).utf8().data()); 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("\xD0\x9C\xD0\xB0\xD0\xB9", standAloneMonthLabel("ru_RU", 4).utf8().data()); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, shortMonthLabels) 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("Jan", shortMonthLabel("en_US", 0).utf8().data()); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("Jan", shortStandAloneMonthLabel("en_US", 0).utf8().data()); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("Dec", shortMonthLabel("en_US", 11).utf8().data()); 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("Dec", shortStandAloneMonthLabel("en_US", 11).utf8().data()); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("janv.", shortMonthLabel("fr_FR", 0).utf8().data()); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("janv.", shortStandAloneMonthLabel("fr_FR", 0).utf8().data()); 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("d\xC3\xA9" "c.", shortMonthLabel("fr_FR", 11).utf8().data()); 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("d\xC3\xA9" "c.", shortStandAloneMonthLabel("fr_FR", 11).utf8().data()); 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("1\xE6\x9C\x88", shortMonthLabel("ja_JP", 0).utf8().data()); 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("1\xE6\x9C\x88", shortStandAloneMonthLabel("ja_JP", 0).utf8().data()); 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("12\xE6\x9C\x88", shortMonthLabel("ja_JP", 11).utf8().data()); 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("12\xE6\x9C\x88", shortStandAloneMonthLabel("ja_JP", 11).utf8().data()); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("\xD0\xBC\xD0\xB0\xD1\x80\xD1\x82\xD0\xB0", shortMonthLabel("ru_RU", 2).utf8().data()); 212197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch EXPECT_STREQ("\xD0\x9C\xD0\xB0\xD1\x80\xD1\x82", shortStandAloneMonthLabel("ru_RU", 2).utf8().data()); 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_STREQ("\xD0\xBC\xD0\xB0\xD1\x8F", shortMonthLabel("ru_RU", 4).utf8().data()); 214197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch EXPECT_STREQ("\xD0\x9C\xD0\xB0\xD0\xB9", shortStandAloneMonthLabel("ru_RU", 4).utf8().data()); 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, timeAMPMLabels) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(labels("AM", "PM"), timeAMPMLabels("en_US")); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(labels("AM", "PM"), timeAMPMLabels("fr")); 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UChar jaAM[3] = { 0x5348, 0x524d, 0 }; 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) UChar jaPM[3] = { 0x5348, 0x5F8C, 0 }; 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(labels(String(jaAM), String(jaPM)), timeAMPMLabels("ja")); 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static String testDecimalSeparator(const AtomicString& localeIdentifier) 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<Locale> locale = Locale::create(localeIdentifier); 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return locale->localizedDecimalSeparator(); 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, localizedDecimalSeparator) 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(String("."), testDecimalSeparator("en_US")); 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(String(","), testDecimalSeparator("fr")); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void testNumberIsReversible(const AtomicString& localeIdentifier, const char* original, const char* shouldHave = 0) 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) OwnPtr<Locale> locale = Locale::create(localeIdentifier); 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String localized = locale->convertToLocalizedNumber(original); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (shouldHave) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_TRUE(localized.contains(shouldHave)); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) String converted = locale->convertFromLocalizedNumber(localized); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) EXPECT_EQ(original, converted); 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void testNumbers(const char* localeString) 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible(localeString, "123456789012345678901234567890"); 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible(localeString, "-123.456"); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible(localeString, ".456"); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible(localeString, "-0.456"); 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)TEST_F(LocaleICUTest, reversible) 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("en_US", "123456789012345678901234567890"); 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("en_US", "-123.456", "."); 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("en_US", ".456", "."); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("en_US", "-0.456", "."); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("fr", "123456789012345678901234567890"); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("fr", "-123.456", ","); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("fr", ".456", ","); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumberIsReversible("fr", "-0.456", ","); 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Persian locale has a negative prefix and a negative suffix. 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("fa"); 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Test some of major locales. 2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("ar"); 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("de_DE"); 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("es_ES"); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("ja_JP"); 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("ko_KR"); 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("zh_CN"); 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("zh_HK"); 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testNumbers("zh_TW"); 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 283