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