1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker
5*635a8641SAndroid Build Coastguard Worker #include "base/i18n/case_conversion.h"
6*635a8641SAndroid Build Coastguard Worker #include "base/i18n/rtl.h"
7*635a8641SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
8*635a8641SAndroid Build Coastguard Worker #include "base/test/icu_test_util.h"
9*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*635a8641SAndroid Build Coastguard Worker #include "third_party/icu/source/i18n/unicode/usearch.h"
11*635a8641SAndroid Build Coastguard Worker
12*635a8641SAndroid Build Coastguard Worker namespace base {
13*635a8641SAndroid Build Coastguard Worker namespace i18n {
14*635a8641SAndroid Build Coastguard Worker
15*635a8641SAndroid Build Coastguard Worker namespace {
16*635a8641SAndroid Build Coastguard Worker
17*635a8641SAndroid Build Coastguard Worker const wchar_t kNonASCIIMixed[] =
18*635a8641SAndroid Build Coastguard Worker L"\xC4\xD6\xE4\xF6\x20\xCF\xEF\x20\xF7\x25"
19*635a8641SAndroid Build Coastguard Worker L"\xA4\x23\x2A\x5E\x60\x40\xA3\x24\x2030\x201A\x7E\x20\x1F07\x1F0F"
20*635a8641SAndroid Build Coastguard Worker L"\x20\x1E00\x1E01";
21*635a8641SAndroid Build Coastguard Worker const wchar_t kNonASCIILower[] =
22*635a8641SAndroid Build Coastguard Worker L"\xE4\xF6\xE4\xF6\x20\xEF\xEF"
23*635a8641SAndroid Build Coastguard Worker L"\x20\xF7\x25\xA4\x23\x2A\x5E\x60\x40\xA3\x24\x2030\x201A\x7E\x20\x1F07"
24*635a8641SAndroid Build Coastguard Worker L"\x1F07\x20\x1E01\x1E01";
25*635a8641SAndroid Build Coastguard Worker const wchar_t kNonASCIIUpper[] =
26*635a8641SAndroid Build Coastguard Worker L"\xC4\xD6\xC4\xD6\x20\xCF\xCF"
27*635a8641SAndroid Build Coastguard Worker L"\x20\xF7\x25\xA4\x23\x2A\x5E\x60\x40\xA3\x24\x2030\x201A\x7E\x20\x1F0F"
28*635a8641SAndroid Build Coastguard Worker L"\x1F0F\x20\x1E00\x1E00";
29*635a8641SAndroid Build Coastguard Worker
30*635a8641SAndroid Build Coastguard Worker } // namespace
31*635a8641SAndroid Build Coastguard Worker
32*635a8641SAndroid Build Coastguard Worker // Test upper and lower case string conversion.
TEST(CaseConversionTest,UpperLower)33*635a8641SAndroid Build Coastguard Worker TEST(CaseConversionTest, UpperLower) {
34*635a8641SAndroid Build Coastguard Worker const string16 mixed(ASCIIToUTF16("Text with UPPer & lowER casE."));
35*635a8641SAndroid Build Coastguard Worker const string16 expected_lower(ASCIIToUTF16("text with upper & lower case."));
36*635a8641SAndroid Build Coastguard Worker const string16 expected_upper(ASCIIToUTF16("TEXT WITH UPPER & LOWER CASE."));
37*635a8641SAndroid Build Coastguard Worker
38*635a8641SAndroid Build Coastguard Worker string16 result = ToLower(mixed);
39*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_lower, result);
40*635a8641SAndroid Build Coastguard Worker
41*635a8641SAndroid Build Coastguard Worker result = ToUpper(mixed);
42*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_upper, result);
43*635a8641SAndroid Build Coastguard Worker }
44*635a8641SAndroid Build Coastguard Worker
TEST(CaseConversionTest,NonASCII)45*635a8641SAndroid Build Coastguard Worker TEST(CaseConversionTest, NonASCII) {
46*635a8641SAndroid Build Coastguard Worker const string16 mixed(WideToUTF16(kNonASCIIMixed));
47*635a8641SAndroid Build Coastguard Worker const string16 expected_lower(WideToUTF16(kNonASCIILower));
48*635a8641SAndroid Build Coastguard Worker const string16 expected_upper(WideToUTF16(kNonASCIIUpper));
49*635a8641SAndroid Build Coastguard Worker
50*635a8641SAndroid Build Coastguard Worker string16 result = ToLower(mixed);
51*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_lower, result);
52*635a8641SAndroid Build Coastguard Worker
53*635a8641SAndroid Build Coastguard Worker result = ToUpper(mixed);
54*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_upper, result);
55*635a8641SAndroid Build Coastguard Worker }
56*635a8641SAndroid Build Coastguard Worker
TEST(CaseConversionTest,TurkishLocaleConversion)57*635a8641SAndroid Build Coastguard Worker TEST(CaseConversionTest, TurkishLocaleConversion) {
58*635a8641SAndroid Build Coastguard Worker const string16 mixed(WideToUTF16(L"\x49\x131"));
59*635a8641SAndroid Build Coastguard Worker const string16 expected_lower(WideToUTF16(L"\x69\x131"));
60*635a8641SAndroid Build Coastguard Worker const string16 expected_upper(WideToUTF16(L"\x49\x49"));
61*635a8641SAndroid Build Coastguard Worker
62*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
63*635a8641SAndroid Build Coastguard Worker i18n::SetICUDefaultLocale("en_US");
64*635a8641SAndroid Build Coastguard Worker
65*635a8641SAndroid Build Coastguard Worker string16 result = ToLower(mixed);
66*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_lower, result);
67*635a8641SAndroid Build Coastguard Worker
68*635a8641SAndroid Build Coastguard Worker result = ToUpper(mixed);
69*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_upper, result);
70*635a8641SAndroid Build Coastguard Worker
71*635a8641SAndroid Build Coastguard Worker i18n::SetICUDefaultLocale("tr");
72*635a8641SAndroid Build Coastguard Worker
73*635a8641SAndroid Build Coastguard Worker const string16 expected_lower_turkish(WideToUTF16(L"\x131\x131"));
74*635a8641SAndroid Build Coastguard Worker const string16 expected_upper_turkish(WideToUTF16(L"\x49\x49"));
75*635a8641SAndroid Build Coastguard Worker
76*635a8641SAndroid Build Coastguard Worker result = ToLower(mixed);
77*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_lower_turkish, result);
78*635a8641SAndroid Build Coastguard Worker
79*635a8641SAndroid Build Coastguard Worker result = ToUpper(mixed);
80*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(expected_upper_turkish, result);
81*635a8641SAndroid Build Coastguard Worker }
82*635a8641SAndroid Build Coastguard Worker
TEST(CaseConversionTest,FoldCase)83*635a8641SAndroid Build Coastguard Worker TEST(CaseConversionTest, FoldCase) {
84*635a8641SAndroid Build Coastguard Worker // Simple ASCII, should lower-case.
85*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ASCIIToUTF16("hello, world"),
86*635a8641SAndroid Build Coastguard Worker FoldCase(ASCIIToUTF16("Hello, World")));
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker // Non-ASCII cases from above. They should all fold to the same result.
89*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(FoldCase(WideToUTF16(kNonASCIIMixed)),
90*635a8641SAndroid Build Coastguard Worker FoldCase(WideToUTF16(kNonASCIILower)));
91*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(FoldCase(WideToUTF16(kNonASCIIMixed)),
92*635a8641SAndroid Build Coastguard Worker FoldCase(WideToUTF16(kNonASCIIUpper)));
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Worker // Turkish cases from above. This is the lower-case expected result from the
95*635a8641SAndroid Build Coastguard Worker // US locale. It should be the same even when the current locale is Turkish.
96*635a8641SAndroid Build Coastguard Worker const string16 turkish(WideToUTF16(L"\x49\x131"));
97*635a8641SAndroid Build Coastguard Worker const string16 turkish_expected(WideToUTF16(L"\x69\x131"));
98*635a8641SAndroid Build Coastguard Worker
99*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
100*635a8641SAndroid Build Coastguard Worker i18n::SetICUDefaultLocale("en_US");
101*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(turkish_expected, FoldCase(turkish));
102*635a8641SAndroid Build Coastguard Worker
103*635a8641SAndroid Build Coastguard Worker i18n::SetICUDefaultLocale("tr");
104*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(turkish_expected, FoldCase(turkish));
105*635a8641SAndroid Build Coastguard Worker
106*635a8641SAndroid Build Coastguard Worker // Test a case that gets bigger when processed.
107*635a8641SAndroid Build Coastguard Worker // U+130 = LATIN CAPITAL LETTER I WITH DOT ABOVE gets folded to a lower case
108*635a8641SAndroid Build Coastguard Worker // "i" followed by U+307 COMBINING DOT ABOVE.
109*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(WideToUTF16(L"i\u0307j"), FoldCase(WideToUTF16(L"\u0130j")));
110*635a8641SAndroid Build Coastguard Worker
111*635a8641SAndroid Build Coastguard Worker // U+00DF (SHARP S) and U+1E9E (CAPIRAL SHARP S) are both folded to "ss".
112*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ASCIIToUTF16("ssss"), FoldCase(WideToUTF16(L"\u00DF\u1E9E")));
113*635a8641SAndroid Build Coastguard Worker }
114*635a8641SAndroid Build Coastguard Worker
115*635a8641SAndroid Build Coastguard Worker } // namespace i18n
116*635a8641SAndroid Build Coastguard Worker } // namespace base
117*635a8641SAndroid Build Coastguard Worker
118*635a8641SAndroid Build Coastguard Worker
119*635a8641SAndroid Build Coastguard Worker
120