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/rtl.h"
6*635a8641SAndroid Build Coastguard Worker
7*635a8641SAndroid Build Coastguard Worker #include <stddef.h>
8*635a8641SAndroid Build Coastguard Worker
9*635a8641SAndroid Build Coastguard Worker #include <algorithm>
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker #include "base/files/file_path.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/macros.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/strings/string_util.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/strings/sys_string_conversions.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/strings/utf_string_conversions.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/test/icu_test_util.h"
17*635a8641SAndroid Build Coastguard Worker #include "build/build_config.h"
18*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
19*635a8641SAndroid Build Coastguard Worker #include "testing/platform_test.h"
20*635a8641SAndroid Build Coastguard Worker #include "third_party/icu/source/common/unicode/locid.h"
21*635a8641SAndroid Build Coastguard Worker #include "third_party/icu/source/i18n/unicode/usearch.h"
22*635a8641SAndroid Build Coastguard Worker
23*635a8641SAndroid Build Coastguard Worker namespace base {
24*635a8641SAndroid Build Coastguard Worker namespace i18n {
25*635a8641SAndroid Build Coastguard Worker
26*635a8641SAndroid Build Coastguard Worker class RTLTest : public PlatformTest {
27*635a8641SAndroid Build Coastguard Worker };
28*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,GetFirstStrongCharacterDirection)29*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, GetFirstStrongCharacterDirection) {
30*635a8641SAndroid Build Coastguard Worker struct {
31*635a8641SAndroid Build Coastguard Worker const wchar_t* text;
32*635a8641SAndroid Build Coastguard Worker TextDirection direction;
33*635a8641SAndroid Build Coastguard Worker } cases[] = {
34*635a8641SAndroid Build Coastguard Worker // Test pure LTR string.
35*635a8641SAndroid Build Coastguard Worker { L"foo bar", LEFT_TO_RIGHT },
36*635a8641SAndroid Build Coastguard Worker // Test pure RTL string.
37*635a8641SAndroid Build Coastguard Worker { L"\x05d0\x05d1\x05d2 \x05d3\x0d4\x05d5", RIGHT_TO_LEFT},
38*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
39*635a8641SAndroid Build Coastguard Worker // is a character with type L.
40*635a8641SAndroid Build Coastguard Worker { L"foo \x05d0 bar", LEFT_TO_RIGHT },
41*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
42*635a8641SAndroid Build Coastguard Worker // is a character with type R.
43*635a8641SAndroid Build Coastguard Worker { L"\x05d0 foo bar", RIGHT_TO_LEFT },
44*635a8641SAndroid Build Coastguard Worker // Test bidi string which starts with a character with weak directionality
45*635a8641SAndroid Build Coastguard Worker // and in which the first character with strong directionality is a
46*635a8641SAndroid Build Coastguard Worker // character with type L.
47*635a8641SAndroid Build Coastguard Worker { L"!foo \x05d0 bar", LEFT_TO_RIGHT },
48*635a8641SAndroid Build Coastguard Worker // Test bidi string which starts with a character with weak directionality
49*635a8641SAndroid Build Coastguard Worker // and in which the first character with strong directionality is a
50*635a8641SAndroid Build Coastguard Worker // character with type R.
51*635a8641SAndroid Build Coastguard Worker { L",\x05d0 foo bar", RIGHT_TO_LEFT },
52*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
53*635a8641SAndroid Build Coastguard Worker // is a character with type LRE.
54*635a8641SAndroid Build Coastguard Worker { L"\x202a \x05d0 foo bar", LEFT_TO_RIGHT },
55*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
56*635a8641SAndroid Build Coastguard Worker // is a character with type LRO.
57*635a8641SAndroid Build Coastguard Worker { L"\x202d \x05d0 foo bar", LEFT_TO_RIGHT },
58*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
59*635a8641SAndroid Build Coastguard Worker // is a character with type RLE.
60*635a8641SAndroid Build Coastguard Worker { L"\x202b foo \x05d0 bar", RIGHT_TO_LEFT },
61*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
62*635a8641SAndroid Build Coastguard Worker // is a character with type RLO.
63*635a8641SAndroid Build Coastguard Worker { L"\x202e foo \x05d0 bar", RIGHT_TO_LEFT },
64*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the first character with strong directionality
65*635a8641SAndroid Build Coastguard Worker // is a character with type AL.
66*635a8641SAndroid Build Coastguard Worker { L"\x0622 foo \x05d0 bar", RIGHT_TO_LEFT },
67*635a8641SAndroid Build Coastguard Worker // Test a string without strong directionality characters.
68*635a8641SAndroid Build Coastguard Worker { L",!.{}", LEFT_TO_RIGHT },
69*635a8641SAndroid Build Coastguard Worker // Test empty string.
70*635a8641SAndroid Build Coastguard Worker { L"", LEFT_TO_RIGHT },
71*635a8641SAndroid Build Coastguard Worker // Test characters in non-BMP (e.g. Phoenician letters. Please refer to
72*635a8641SAndroid Build Coastguard Worker // http://demo.icu-project.org/icu-bin/ubrowse?scr=151&b=10910 for more
73*635a8641SAndroid Build Coastguard Worker // information).
74*635a8641SAndroid Build Coastguard Worker {
75*635a8641SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_UTF32)
76*635a8641SAndroid Build Coastguard Worker L" ! \x10910" L"abc 123",
77*635a8641SAndroid Build Coastguard Worker #elif defined(WCHAR_T_IS_UTF16)
78*635a8641SAndroid Build Coastguard Worker L" ! \xd802\xdd10" L"abc 123",
79*635a8641SAndroid Build Coastguard Worker #else
80*635a8641SAndroid Build Coastguard Worker #error wchar_t should be either UTF-16 or UTF-32
81*635a8641SAndroid Build Coastguard Worker #endif
82*635a8641SAndroid Build Coastguard Worker RIGHT_TO_LEFT },
83*635a8641SAndroid Build Coastguard Worker {
84*635a8641SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_UTF32)
85*635a8641SAndroid Build Coastguard Worker L" ! \x10401" L"abc 123",
86*635a8641SAndroid Build Coastguard Worker #elif defined(WCHAR_T_IS_UTF16)
87*635a8641SAndroid Build Coastguard Worker L" ! \xd801\xdc01" L"abc 123",
88*635a8641SAndroid Build Coastguard Worker #else
89*635a8641SAndroid Build Coastguard Worker #error wchar_t should be either UTF-16 or UTF-32
90*635a8641SAndroid Build Coastguard Worker #endif
91*635a8641SAndroid Build Coastguard Worker LEFT_TO_RIGHT },
92*635a8641SAndroid Build Coastguard Worker };
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i)
95*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].direction,
96*635a8641SAndroid Build Coastguard Worker GetFirstStrongCharacterDirection(WideToUTF16(cases[i].text)));
97*635a8641SAndroid Build Coastguard Worker }
98*635a8641SAndroid Build Coastguard Worker
99*635a8641SAndroid Build Coastguard Worker
100*635a8641SAndroid Build Coastguard Worker // Note that the cases with LRE, LRO, RLE and RLO are invalid for
101*635a8641SAndroid Build Coastguard Worker // GetLastStrongCharacterDirection because they should be followed by PDF
102*635a8641SAndroid Build Coastguard Worker // character.
TEST_F(RTLTest,GetLastStrongCharacterDirection)103*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, GetLastStrongCharacterDirection) {
104*635a8641SAndroid Build Coastguard Worker struct {
105*635a8641SAndroid Build Coastguard Worker const wchar_t* text;
106*635a8641SAndroid Build Coastguard Worker TextDirection direction;
107*635a8641SAndroid Build Coastguard Worker } cases[] = {
108*635a8641SAndroid Build Coastguard Worker // Test pure LTR string.
109*635a8641SAndroid Build Coastguard Worker { L"foo bar", LEFT_TO_RIGHT },
110*635a8641SAndroid Build Coastguard Worker // Test pure RTL string.
111*635a8641SAndroid Build Coastguard Worker { L"\x05d0\x05d1\x05d2 \x05d3\x0d4\x05d5", RIGHT_TO_LEFT},
112*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the last character with strong directionality
113*635a8641SAndroid Build Coastguard Worker // is a character with type L.
114*635a8641SAndroid Build Coastguard Worker { L"foo \x05d0 bar", LEFT_TO_RIGHT },
115*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the last character with strong directionality
116*635a8641SAndroid Build Coastguard Worker // is a character with type R.
117*635a8641SAndroid Build Coastguard Worker { L"\x05d0 foo bar \x05d3", RIGHT_TO_LEFT },
118*635a8641SAndroid Build Coastguard Worker // Test bidi string which ends with a character with weak directionality
119*635a8641SAndroid Build Coastguard Worker // and in which the last character with strong directionality is a
120*635a8641SAndroid Build Coastguard Worker // character with type L.
121*635a8641SAndroid Build Coastguard Worker { L"!foo \x05d0 bar!", LEFT_TO_RIGHT },
122*635a8641SAndroid Build Coastguard Worker // Test bidi string which ends with a character with weak directionality
123*635a8641SAndroid Build Coastguard Worker // and in which the last character with strong directionality is a
124*635a8641SAndroid Build Coastguard Worker // character with type R.
125*635a8641SAndroid Build Coastguard Worker { L",\x05d0 foo bar \x05d1,", RIGHT_TO_LEFT },
126*635a8641SAndroid Build Coastguard Worker // Test bidi string in which the last character with strong directionality
127*635a8641SAndroid Build Coastguard Worker // is a character with type AL.
128*635a8641SAndroid Build Coastguard Worker { L"\x0622 foo \x05d0 bar \x0622", RIGHT_TO_LEFT },
129*635a8641SAndroid Build Coastguard Worker // Test a string without strong directionality characters.
130*635a8641SAndroid Build Coastguard Worker { L",!.{}", LEFT_TO_RIGHT },
131*635a8641SAndroid Build Coastguard Worker // Test empty string.
132*635a8641SAndroid Build Coastguard Worker { L"", LEFT_TO_RIGHT },
133*635a8641SAndroid Build Coastguard Worker // Test characters in non-BMP (e.g. Phoenician letters. Please refer to
134*635a8641SAndroid Build Coastguard Worker // http://demo.icu-project.org/icu-bin/ubrowse?scr=151&b=10910 for more
135*635a8641SAndroid Build Coastguard Worker // information).
136*635a8641SAndroid Build Coastguard Worker {
137*635a8641SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_UTF32)
138*635a8641SAndroid Build Coastguard Worker L"abc 123" L" ! \x10910 !",
139*635a8641SAndroid Build Coastguard Worker #elif defined(WCHAR_T_IS_UTF16)
140*635a8641SAndroid Build Coastguard Worker L"abc 123" L" ! \xd802\xdd10 !",
141*635a8641SAndroid Build Coastguard Worker #else
142*635a8641SAndroid Build Coastguard Worker #error wchar_t should be either UTF-16 or UTF-32
143*635a8641SAndroid Build Coastguard Worker #endif
144*635a8641SAndroid Build Coastguard Worker RIGHT_TO_LEFT },
145*635a8641SAndroid Build Coastguard Worker {
146*635a8641SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_UTF32)
147*635a8641SAndroid Build Coastguard Worker L"abc 123" L" ! \x10401 !",
148*635a8641SAndroid Build Coastguard Worker #elif defined(WCHAR_T_IS_UTF16)
149*635a8641SAndroid Build Coastguard Worker L"abc 123" L" ! \xd801\xdc01 !",
150*635a8641SAndroid Build Coastguard Worker #else
151*635a8641SAndroid Build Coastguard Worker #error wchar_t should be either UTF-16 or UTF-32
152*635a8641SAndroid Build Coastguard Worker #endif
153*635a8641SAndroid Build Coastguard Worker LEFT_TO_RIGHT },
154*635a8641SAndroid Build Coastguard Worker };
155*635a8641SAndroid Build Coastguard Worker
156*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i)
157*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].direction,
158*635a8641SAndroid Build Coastguard Worker GetLastStrongCharacterDirection(WideToUTF16(cases[i].text)));
159*635a8641SAndroid Build Coastguard Worker }
160*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,GetStringDirection)161*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, GetStringDirection) {
162*635a8641SAndroid Build Coastguard Worker struct {
163*635a8641SAndroid Build Coastguard Worker const wchar_t* text;
164*635a8641SAndroid Build Coastguard Worker TextDirection direction;
165*635a8641SAndroid Build Coastguard Worker } cases[] = {
166*635a8641SAndroid Build Coastguard Worker // Test pure LTR string.
167*635a8641SAndroid Build Coastguard Worker { L"foobar", LEFT_TO_RIGHT },
168*635a8641SAndroid Build Coastguard Worker { L".foobar", LEFT_TO_RIGHT },
169*635a8641SAndroid Build Coastguard Worker { L"foo, bar", LEFT_TO_RIGHT },
170*635a8641SAndroid Build Coastguard Worker // Test pure LTR with strong directionality characters of type LRE.
171*635a8641SAndroid Build Coastguard Worker { L"\x202a\x202a", LEFT_TO_RIGHT },
172*635a8641SAndroid Build Coastguard Worker { L".\x202a\x202a", LEFT_TO_RIGHT },
173*635a8641SAndroid Build Coastguard Worker { L"\x202a, \x202a", LEFT_TO_RIGHT },
174*635a8641SAndroid Build Coastguard Worker // Test pure LTR with strong directionality characters of type LRO.
175*635a8641SAndroid Build Coastguard Worker { L"\x202d\x202d", LEFT_TO_RIGHT },
176*635a8641SAndroid Build Coastguard Worker { L".\x202d\x202d", LEFT_TO_RIGHT },
177*635a8641SAndroid Build Coastguard Worker { L"\x202d, \x202d", LEFT_TO_RIGHT },
178*635a8641SAndroid Build Coastguard Worker // Test pure LTR with various types of strong directionality characters.
179*635a8641SAndroid Build Coastguard Worker { L"foo \x202a\x202d", LEFT_TO_RIGHT },
180*635a8641SAndroid Build Coastguard Worker { L".\x202d foo \x202a", LEFT_TO_RIGHT },
181*635a8641SAndroid Build Coastguard Worker { L"\x202a, \x202d foo", LEFT_TO_RIGHT },
182*635a8641SAndroid Build Coastguard Worker // Test pure RTL with strong directionality characters of type R.
183*635a8641SAndroid Build Coastguard Worker { L"\x05d0\x05d0", RIGHT_TO_LEFT },
184*635a8641SAndroid Build Coastguard Worker { L".\x05d0\x05d0", RIGHT_TO_LEFT },
185*635a8641SAndroid Build Coastguard Worker { L"\x05d0, \x05d0", RIGHT_TO_LEFT },
186*635a8641SAndroid Build Coastguard Worker // Test pure RTL with strong directionality characters of type RLE.
187*635a8641SAndroid Build Coastguard Worker { L"\x202b\x202b", RIGHT_TO_LEFT },
188*635a8641SAndroid Build Coastguard Worker { L".\x202b\x202b", RIGHT_TO_LEFT },
189*635a8641SAndroid Build Coastguard Worker { L"\x202b, \x202b", RIGHT_TO_LEFT },
190*635a8641SAndroid Build Coastguard Worker // Test pure RTL with strong directionality characters of type RLO.
191*635a8641SAndroid Build Coastguard Worker { L"\x202e\x202e", RIGHT_TO_LEFT },
192*635a8641SAndroid Build Coastguard Worker { L".\x202e\x202e", RIGHT_TO_LEFT },
193*635a8641SAndroid Build Coastguard Worker { L"\x202e, \x202e", RIGHT_TO_LEFT },
194*635a8641SAndroid Build Coastguard Worker // Test pure RTL with strong directionality characters of type AL.
195*635a8641SAndroid Build Coastguard Worker { L"\x0622\x0622", RIGHT_TO_LEFT },
196*635a8641SAndroid Build Coastguard Worker { L".\x0622\x0622", RIGHT_TO_LEFT },
197*635a8641SAndroid Build Coastguard Worker { L"\x0622, \x0622", RIGHT_TO_LEFT },
198*635a8641SAndroid Build Coastguard Worker // Test pure RTL with various types of strong directionality characters.
199*635a8641SAndroid Build Coastguard Worker { L"\x05d0\x202b\x202e\x0622", RIGHT_TO_LEFT },
200*635a8641SAndroid Build Coastguard Worker { L".\x202b\x202e\x0622\x05d0", RIGHT_TO_LEFT },
201*635a8641SAndroid Build Coastguard Worker { L"\x0622\x202e, \x202b\x05d0", RIGHT_TO_LEFT },
202*635a8641SAndroid Build Coastguard Worker // Test bidi strings.
203*635a8641SAndroid Build Coastguard Worker { L"foo \x05d0 bar", UNKNOWN_DIRECTION },
204*635a8641SAndroid Build Coastguard Worker { L"\x202b foo bar", UNKNOWN_DIRECTION },
205*635a8641SAndroid Build Coastguard Worker { L"!foo \x0622 bar", UNKNOWN_DIRECTION },
206*635a8641SAndroid Build Coastguard Worker { L"\x202a\x202b", UNKNOWN_DIRECTION },
207*635a8641SAndroid Build Coastguard Worker { L"\x202e\x202d", UNKNOWN_DIRECTION },
208*635a8641SAndroid Build Coastguard Worker { L"\x0622\x202a", UNKNOWN_DIRECTION },
209*635a8641SAndroid Build Coastguard Worker { L"\x202d\x05d0", UNKNOWN_DIRECTION },
210*635a8641SAndroid Build Coastguard Worker // Test a string without strong directionality characters.
211*635a8641SAndroid Build Coastguard Worker { L",!.{}", LEFT_TO_RIGHT },
212*635a8641SAndroid Build Coastguard Worker // Test empty string.
213*635a8641SAndroid Build Coastguard Worker { L"", LEFT_TO_RIGHT },
214*635a8641SAndroid Build Coastguard Worker {
215*635a8641SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_UTF32)
216*635a8641SAndroid Build Coastguard Worker L" ! \x10910" L"abc 123",
217*635a8641SAndroid Build Coastguard Worker #elif defined(WCHAR_T_IS_UTF16)
218*635a8641SAndroid Build Coastguard Worker L" ! \xd802\xdd10" L"abc 123",
219*635a8641SAndroid Build Coastguard Worker #else
220*635a8641SAndroid Build Coastguard Worker #error wchar_t should be either UTF-16 or UTF-32
221*635a8641SAndroid Build Coastguard Worker #endif
222*635a8641SAndroid Build Coastguard Worker UNKNOWN_DIRECTION },
223*635a8641SAndroid Build Coastguard Worker {
224*635a8641SAndroid Build Coastguard Worker #if defined(WCHAR_T_IS_UTF32)
225*635a8641SAndroid Build Coastguard Worker L" ! \x10401" L"abc 123",
226*635a8641SAndroid Build Coastguard Worker #elif defined(WCHAR_T_IS_UTF16)
227*635a8641SAndroid Build Coastguard Worker L" ! \xd801\xdc01" L"abc 123",
228*635a8641SAndroid Build Coastguard Worker #else
229*635a8641SAndroid Build Coastguard Worker #error wchar_t should be either UTF-16 or UTF-32
230*635a8641SAndroid Build Coastguard Worker #endif
231*635a8641SAndroid Build Coastguard Worker LEFT_TO_RIGHT },
232*635a8641SAndroid Build Coastguard Worker };
233*635a8641SAndroid Build Coastguard Worker
234*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i)
235*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(cases[i].direction,
236*635a8641SAndroid Build Coastguard Worker GetStringDirection(WideToUTF16(cases[i].text)));
237*635a8641SAndroid Build Coastguard Worker }
238*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,WrapPathWithLTRFormatting)239*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, WrapPathWithLTRFormatting) {
240*635a8641SAndroid Build Coastguard Worker const wchar_t* cases[] = {
241*635a8641SAndroid Build Coastguard Worker // Test common path, such as "c:\foo\bar".
242*635a8641SAndroid Build Coastguard Worker L"c:/foo/bar",
243*635a8641SAndroid Build Coastguard Worker // Test path with file name, such as "c:\foo\bar\test.jpg".
244*635a8641SAndroid Build Coastguard Worker L"c:/foo/bar/test.jpg",
245*635a8641SAndroid Build Coastguard Worker // Test path ending with punctuation, such as "c:\(foo)\bar.".
246*635a8641SAndroid Build Coastguard Worker L"c:/(foo)/bar.",
247*635a8641SAndroid Build Coastguard Worker // Test path ending with separator, such as "c:\foo\bar\".
248*635a8641SAndroid Build Coastguard Worker L"c:/foo/bar/",
249*635a8641SAndroid Build Coastguard Worker // Test path with RTL character.
250*635a8641SAndroid Build Coastguard Worker L"c:/\x05d0",
251*635a8641SAndroid Build Coastguard Worker // Test path with 2 level RTL directory names.
252*635a8641SAndroid Build Coastguard Worker L"c:/\x05d0/\x0622",
253*635a8641SAndroid Build Coastguard Worker // Test path with mixed RTL/LTR directory names and ending with punctuation.
254*635a8641SAndroid Build Coastguard Worker L"c:/\x05d0/\x0622/(foo)/b.a.r.",
255*635a8641SAndroid Build Coastguard Worker // Test path without driver name, such as "/foo/bar/test/jpg".
256*635a8641SAndroid Build Coastguard Worker L"/foo/bar/test.jpg",
257*635a8641SAndroid Build Coastguard Worker // Test path start with current directory, such as "./foo".
258*635a8641SAndroid Build Coastguard Worker L"./foo",
259*635a8641SAndroid Build Coastguard Worker // Test path start with parent directory, such as "../foo/bar.jpg".
260*635a8641SAndroid Build Coastguard Worker L"../foo/bar.jpg",
261*635a8641SAndroid Build Coastguard Worker // Test absolute path, such as "//foo/bar.jpg".
262*635a8641SAndroid Build Coastguard Worker L"//foo/bar.jpg",
263*635a8641SAndroid Build Coastguard Worker // Test path with mixed RTL/LTR directory names.
264*635a8641SAndroid Build Coastguard Worker L"c:/foo/\x05d0/\x0622/\x05d1.jpg",
265*635a8641SAndroid Build Coastguard Worker // Test empty path.
266*635a8641SAndroid Build Coastguard Worker L""
267*635a8641SAndroid Build Coastguard Worker };
268*635a8641SAndroid Build Coastguard Worker
269*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
270*635a8641SAndroid Build Coastguard Worker FilePath path;
271*635a8641SAndroid Build Coastguard Worker #if defined(OS_WIN)
272*635a8641SAndroid Build Coastguard Worker std::wstring win_path(cases[i]);
273*635a8641SAndroid Build Coastguard Worker std::replace(win_path.begin(), win_path.end(), '/', '\\');
274*635a8641SAndroid Build Coastguard Worker path = FilePath(win_path);
275*635a8641SAndroid Build Coastguard Worker std::wstring wrapped_expected =
276*635a8641SAndroid Build Coastguard Worker std::wstring(L"\x202a") + win_path + L"\x202c";
277*635a8641SAndroid Build Coastguard Worker #else
278*635a8641SAndroid Build Coastguard Worker path = FilePath(base::SysWideToNativeMB(cases[i]));
279*635a8641SAndroid Build Coastguard Worker std::wstring wrapped_expected =
280*635a8641SAndroid Build Coastguard Worker std::wstring(L"\x202a") + cases[i] + L"\x202c";
281*635a8641SAndroid Build Coastguard Worker #endif
282*635a8641SAndroid Build Coastguard Worker string16 localized_file_path_string;
283*635a8641SAndroid Build Coastguard Worker WrapPathWithLTRFormatting(path, &localized_file_path_string);
284*635a8641SAndroid Build Coastguard Worker
285*635a8641SAndroid Build Coastguard Worker std::wstring wrapped_actual = UTF16ToWide(localized_file_path_string);
286*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(wrapped_expected, wrapped_actual);
287*635a8641SAndroid Build Coastguard Worker }
288*635a8641SAndroid Build Coastguard Worker }
289*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,WrapString)290*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, WrapString) {
291*635a8641SAndroid Build Coastguard Worker const wchar_t* cases[] = {
292*635a8641SAndroid Build Coastguard Worker L" . ",
293*635a8641SAndroid Build Coastguard Worker L"abc",
294*635a8641SAndroid Build Coastguard Worker L"a" L"\x5d0\x5d1",
295*635a8641SAndroid Build Coastguard Worker L"a" L"\x5d1" L"b",
296*635a8641SAndroid Build Coastguard Worker L"\x5d0\x5d1\x5d2",
297*635a8641SAndroid Build Coastguard Worker L"\x5d0\x5d1" L"a",
298*635a8641SAndroid Build Coastguard Worker L"\x5d0" L"a" L"\x5d1",
299*635a8641SAndroid Build Coastguard Worker };
300*635a8641SAndroid Build Coastguard Worker
301*635a8641SAndroid Build Coastguard Worker const bool was_rtl = IsRTL();
302*635a8641SAndroid Build Coastguard Worker
303*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
304*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i) {
305*635a8641SAndroid Build Coastguard Worker // Toggle the application default text direction (to try each direction).
306*635a8641SAndroid Build Coastguard Worker SetRTLForTesting(!IsRTL());
307*635a8641SAndroid Build Coastguard Worker
308*635a8641SAndroid Build Coastguard Worker string16 empty;
309*635a8641SAndroid Build Coastguard Worker WrapStringWithLTRFormatting(&empty);
310*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(empty.empty());
311*635a8641SAndroid Build Coastguard Worker WrapStringWithRTLFormatting(&empty);
312*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(empty.empty());
313*635a8641SAndroid Build Coastguard Worker
314*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
315*635a8641SAndroid Build Coastguard Worker string16 input = WideToUTF16(cases[i]);
316*635a8641SAndroid Build Coastguard Worker string16 ltr_wrap = input;
317*635a8641SAndroid Build Coastguard Worker WrapStringWithLTRFormatting(<r_wrap);
318*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ltr_wrap[0], kLeftToRightEmbeddingMark);
319*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ltr_wrap.substr(1, ltr_wrap.length() - 2), input);
320*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(ltr_wrap[ltr_wrap.length() -1], kPopDirectionalFormatting);
321*635a8641SAndroid Build Coastguard Worker
322*635a8641SAndroid Build Coastguard Worker string16 rtl_wrap = input;
323*635a8641SAndroid Build Coastguard Worker WrapStringWithRTLFormatting(&rtl_wrap);
324*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(rtl_wrap[0], kRightToLeftEmbeddingMark);
325*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(rtl_wrap.substr(1, rtl_wrap.length() - 2), input);
326*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(rtl_wrap[rtl_wrap.length() -1], kPopDirectionalFormatting);
327*635a8641SAndroid Build Coastguard Worker }
328*635a8641SAndroid Build Coastguard Worker }
329*635a8641SAndroid Build Coastguard Worker
330*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(was_rtl, IsRTL());
331*635a8641SAndroid Build Coastguard Worker }
332*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,GetDisplayStringInLTRDirectionality)333*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, GetDisplayStringInLTRDirectionality) {
334*635a8641SAndroid Build Coastguard Worker struct {
335*635a8641SAndroid Build Coastguard Worker const wchar_t* path;
336*635a8641SAndroid Build Coastguard Worker bool wrap_ltr;
337*635a8641SAndroid Build Coastguard Worker bool wrap_rtl;
338*635a8641SAndroid Build Coastguard Worker } cases[] = {
339*635a8641SAndroid Build Coastguard Worker { L"test", false, true },
340*635a8641SAndroid Build Coastguard Worker { L"test.html", false, true },
341*635a8641SAndroid Build Coastguard Worker { L"\x05d0\x05d1\x05d2", true, true },
342*635a8641SAndroid Build Coastguard Worker { L"\x05d0\x05d1\x05d2.txt", true, true },
343*635a8641SAndroid Build Coastguard Worker { L"\x05d0" L"abc", true, true },
344*635a8641SAndroid Build Coastguard Worker { L"\x05d0" L"abc.txt", true, true },
345*635a8641SAndroid Build Coastguard Worker { L"abc\x05d0\x05d1", false, true },
346*635a8641SAndroid Build Coastguard Worker { L"abc\x05d0\x05d1.jpg", false, true },
347*635a8641SAndroid Build Coastguard Worker };
348*635a8641SAndroid Build Coastguard Worker
349*635a8641SAndroid Build Coastguard Worker const bool was_rtl = IsRTL();
350*635a8641SAndroid Build Coastguard Worker
351*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
352*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i) {
353*635a8641SAndroid Build Coastguard Worker // Toggle the application default text direction (to try each direction).
354*635a8641SAndroid Build Coastguard Worker SetRTLForTesting(!IsRTL());
355*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
356*635a8641SAndroid Build Coastguard Worker string16 input = WideToUTF16(cases[i].path);
357*635a8641SAndroid Build Coastguard Worker string16 output = GetDisplayStringInLTRDirectionality(input);
358*635a8641SAndroid Build Coastguard Worker // Test the expected wrapping behavior for the current UI directionality.
359*635a8641SAndroid Build Coastguard Worker if (IsRTL() ? cases[i].wrap_rtl : cases[i].wrap_ltr)
360*635a8641SAndroid Build Coastguard Worker EXPECT_NE(output, input);
361*635a8641SAndroid Build Coastguard Worker else
362*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(output, input);
363*635a8641SAndroid Build Coastguard Worker }
364*635a8641SAndroid Build Coastguard Worker }
365*635a8641SAndroid Build Coastguard Worker
366*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(was_rtl, IsRTL());
367*635a8641SAndroid Build Coastguard Worker }
368*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,GetTextDirection)369*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, GetTextDirection) {
370*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("ar"));
371*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("ar_EG"));
372*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("he"));
373*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("he_IL"));
374*635a8641SAndroid Build Coastguard Worker // iw is an obsolete code for Hebrew.
375*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("iw"));
376*635a8641SAndroid Build Coastguard Worker // Although we're not yet localized to Farsi and Urdu, we
377*635a8641SAndroid Build Coastguard Worker // do have the text layout direction information for them.
378*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("fa"));
379*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("ur"));
380*635a8641SAndroid Build Coastguard Worker #if 0
381*635a8641SAndroid Build Coastguard Worker // Enable these when we include the minimal locale data for Azerbaijani
382*635a8641SAndroid Build Coastguard Worker // written in Arabic and Dhivehi. At the moment, our copy of
383*635a8641SAndroid Build Coastguard Worker // ICU data does not have entries for them.
384*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("az_Arab"));
385*635a8641SAndroid Build Coastguard Worker // Dhivehi that uses Thaana script.
386*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocale("dv"));
387*635a8641SAndroid Build Coastguard Worker #endif
388*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("en"));
389*635a8641SAndroid Build Coastguard Worker // Chinese in China with '-'.
390*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("zh-CN"));
391*635a8641SAndroid Build Coastguard Worker // Filipino : 3-letter code
392*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("fil"));
393*635a8641SAndroid Build Coastguard Worker // Russian
394*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("ru"));
395*635a8641SAndroid Build Coastguard Worker // Japanese that uses multiple scripts
396*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocale("ja"));
397*635a8641SAndroid Build Coastguard Worker }
398*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,GetTextDirectionForLocaleInStartUp)399*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, GetTextDirectionForLocaleInStartUp) {
400*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("ar"));
401*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("ar_EG"));
402*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("he"));
403*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("he_IL"));
404*635a8641SAndroid Build Coastguard Worker // iw is an obsolete code for Hebrew.
405*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("iw"));
406*635a8641SAndroid Build Coastguard Worker // Although we're not yet localized to Farsi and Urdu, we
407*635a8641SAndroid Build Coastguard Worker // do have the text layout direction information for them.
408*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("fa"));
409*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(RIGHT_TO_LEFT, GetTextDirectionForLocaleInStartUp("ur"));
410*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("en"));
411*635a8641SAndroid Build Coastguard Worker // Chinese in China with '-'.
412*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("zh-CN"));
413*635a8641SAndroid Build Coastguard Worker // Filipino : 3-letter code
414*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("fil"));
415*635a8641SAndroid Build Coastguard Worker // Russian
416*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("ru"));
417*635a8641SAndroid Build Coastguard Worker // Japanese that uses multiple scripts
418*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(LEFT_TO_RIGHT, GetTextDirectionForLocaleInStartUp("ja"));
419*635a8641SAndroid Build Coastguard Worker }
420*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,UnadjustStringForLocaleDirection)421*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, UnadjustStringForLocaleDirection) {
422*635a8641SAndroid Build Coastguard Worker // These test strings are borrowed from WrapPathWithLTRFormatting
423*635a8641SAndroid Build Coastguard Worker const wchar_t* cases[] = {
424*635a8641SAndroid Build Coastguard Worker L"foo bar",
425*635a8641SAndroid Build Coastguard Worker L"foo \x05d0 bar",
426*635a8641SAndroid Build Coastguard Worker L"\x05d0 foo bar",
427*635a8641SAndroid Build Coastguard Worker L"!foo \x05d0 bar",
428*635a8641SAndroid Build Coastguard Worker L",\x05d0 foo bar",
429*635a8641SAndroid Build Coastguard Worker L"\x202a \x05d0 foo bar",
430*635a8641SAndroid Build Coastguard Worker L"\x202d \x05d0 foo bar",
431*635a8641SAndroid Build Coastguard Worker L"\x202b foo \x05d0 bar",
432*635a8641SAndroid Build Coastguard Worker L"\x202e foo \x05d0 bar",
433*635a8641SAndroid Build Coastguard Worker L"\x0622 foo \x05d0 bar",
434*635a8641SAndroid Build Coastguard Worker };
435*635a8641SAndroid Build Coastguard Worker
436*635a8641SAndroid Build Coastguard Worker const bool was_rtl = IsRTL();
437*635a8641SAndroid Build Coastguard Worker
438*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
439*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i) {
440*635a8641SAndroid Build Coastguard Worker // Toggle the application default text direction (to try each direction).
441*635a8641SAndroid Build Coastguard Worker SetRTLForTesting(!IsRTL());
442*635a8641SAndroid Build Coastguard Worker
443*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
444*635a8641SAndroid Build Coastguard Worker string16 test_case = WideToUTF16(cases[i]);
445*635a8641SAndroid Build Coastguard Worker string16 adjusted_string = test_case;
446*635a8641SAndroid Build Coastguard Worker
447*635a8641SAndroid Build Coastguard Worker if (!AdjustStringForLocaleDirection(&adjusted_string))
448*635a8641SAndroid Build Coastguard Worker continue;
449*635a8641SAndroid Build Coastguard Worker
450*635a8641SAndroid Build Coastguard Worker EXPECT_NE(test_case, adjusted_string);
451*635a8641SAndroid Build Coastguard Worker EXPECT_TRUE(UnadjustStringForLocaleDirection(&adjusted_string));
452*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(test_case, adjusted_string) << " for test case [" << test_case
453*635a8641SAndroid Build Coastguard Worker << "] with IsRTL() == " << IsRTL();
454*635a8641SAndroid Build Coastguard Worker }
455*635a8641SAndroid Build Coastguard Worker }
456*635a8641SAndroid Build Coastguard Worker
457*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(was_rtl, IsRTL());
458*635a8641SAndroid Build Coastguard Worker }
459*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,EnsureTerminatedDirectionalFormatting)460*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, EnsureTerminatedDirectionalFormatting) {
461*635a8641SAndroid Build Coastguard Worker struct {
462*635a8641SAndroid Build Coastguard Worker const wchar_t* unformated_text;
463*635a8641SAndroid Build Coastguard Worker const wchar_t* formatted_text;
464*635a8641SAndroid Build Coastguard Worker } cases[] = {
465*635a8641SAndroid Build Coastguard Worker // Tests string without any dir-formatting characters.
466*635a8641SAndroid Build Coastguard Worker {L"google.com", L"google.com"},
467*635a8641SAndroid Build Coastguard Worker // Tests string with properly terminated dir-formatting character.
468*635a8641SAndroid Build Coastguard Worker {L"\x202egoogle.com\x202c", L"\x202egoogle.com\x202c"},
469*635a8641SAndroid Build Coastguard Worker // Tests string with over-terminated dir-formatting characters.
470*635a8641SAndroid Build Coastguard Worker {L"\x202egoogle\x202c.com\x202c", L"\x202egoogle\x202c.com\x202c"},
471*635a8641SAndroid Build Coastguard Worker // Tests string beginning with a dir-formatting character.
472*635a8641SAndroid Build Coastguard Worker {L"\x202emoc.elgoog", L"\x202emoc.elgoog\x202c"},
473*635a8641SAndroid Build Coastguard Worker // Tests string that over-terminates then re-opens.
474*635a8641SAndroid Build Coastguard Worker {L"\x202egoogle\x202c\x202c.\x202eom",
475*635a8641SAndroid Build Coastguard Worker L"\x202egoogle\x202c\x202c.\x202eom\x202c"},
476*635a8641SAndroid Build Coastguard Worker // Tests string containing a dir-formatting character in the middle.
477*635a8641SAndroid Build Coastguard Worker {L"google\x202e.com", L"google\x202e.com\x202c"},
478*635a8641SAndroid Build Coastguard Worker // Tests string with multiple dir-formatting characters.
479*635a8641SAndroid Build Coastguard Worker {L"\x202egoogle\x202e.com/\x202eguest",
480*635a8641SAndroid Build Coastguard Worker L"\x202egoogle\x202e.com/\x202eguest\x202c\x202c\x202c"},
481*635a8641SAndroid Build Coastguard Worker // Test the other dir-formatting characters (U+202A, U+202B, and U+202D).
482*635a8641SAndroid Build Coastguard Worker {L"\x202agoogle.com", L"\x202agoogle.com\x202c"},
483*635a8641SAndroid Build Coastguard Worker {L"\x202bgoogle.com", L"\x202bgoogle.com\x202c"},
484*635a8641SAndroid Build Coastguard Worker {L"\x202dgoogle.com", L"\x202dgoogle.com\x202c"},
485*635a8641SAndroid Build Coastguard Worker };
486*635a8641SAndroid Build Coastguard Worker
487*635a8641SAndroid Build Coastguard Worker const bool was_rtl = IsRTL();
488*635a8641SAndroid Build Coastguard Worker
489*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
490*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i) {
491*635a8641SAndroid Build Coastguard Worker // Toggle the application default text direction (to try each direction).
492*635a8641SAndroid Build Coastguard Worker SetRTLForTesting(!IsRTL());
493*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
494*635a8641SAndroid Build Coastguard Worker string16 unsanitized_text = WideToUTF16(cases[i].unformated_text);
495*635a8641SAndroid Build Coastguard Worker string16 sanitized_text = WideToUTF16(cases[i].formatted_text);
496*635a8641SAndroid Build Coastguard Worker EnsureTerminatedDirectionalFormatting(&unsanitized_text);
497*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(sanitized_text, unsanitized_text);
498*635a8641SAndroid Build Coastguard Worker }
499*635a8641SAndroid Build Coastguard Worker }
500*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(was_rtl, IsRTL());
501*635a8641SAndroid Build Coastguard Worker }
502*635a8641SAndroid Build Coastguard Worker
TEST_F(RTLTest,SanitizeUserSuppliedString)503*635a8641SAndroid Build Coastguard Worker TEST_F(RTLTest, SanitizeUserSuppliedString) {
504*635a8641SAndroid Build Coastguard Worker struct {
505*635a8641SAndroid Build Coastguard Worker const wchar_t* unformatted_text;
506*635a8641SAndroid Build Coastguard Worker const wchar_t* formatted_text;
507*635a8641SAndroid Build Coastguard Worker } cases[] = {
508*635a8641SAndroid Build Coastguard Worker // Tests RTL string with properly terminated dir-formatting character.
509*635a8641SAndroid Build Coastguard Worker {L"\x202eكبير Google التطبيق\x202c", L"\x202eكبير Google التطبيق\x202c"},
510*635a8641SAndroid Build Coastguard Worker // Tests RTL string with over-terminated dir-formatting characters.
511*635a8641SAndroid Build Coastguard Worker {L"\x202eكبير Google\x202cالتطبيق\x202c",
512*635a8641SAndroid Build Coastguard Worker L"\x202eكبير Google\x202cالتطبيق\x202c"},
513*635a8641SAndroid Build Coastguard Worker // Tests RTL string that over-terminates then re-opens.
514*635a8641SAndroid Build Coastguard Worker {L"\x202eكبير Google\x202c\x202cالتطبيق\x202e",
515*635a8641SAndroid Build Coastguard Worker L"\x202eكبير Google\x202c\x202cالتطبيق\x202e\x202c"},
516*635a8641SAndroid Build Coastguard Worker // Tests RTL string with multiple dir-formatting characters.
517*635a8641SAndroid Build Coastguard Worker {L"\x202eك\x202eبير Google الت\x202eطبيق",
518*635a8641SAndroid Build Coastguard Worker L"\x202eك\x202eبير Google الت\x202eطبيق\x202c\x202c\x202c"},
519*635a8641SAndroid Build Coastguard Worker // Test the other dir-formatting characters (U+202A, U+202B, and U+202D).
520*635a8641SAndroid Build Coastguard Worker {L"\x202aكبير Google التطبيق", L"\x202aكبير Google التطبيق\x202c"},
521*635a8641SAndroid Build Coastguard Worker {L"\x202bكبير Google التطبيق", L"\x202bكبير Google التطبيق\x202c"},
522*635a8641SAndroid Build Coastguard Worker {L"\x202dكبير Google التطبيق", L"\x202dكبير Google التطبيق\x202c"},
523*635a8641SAndroid Build Coastguard Worker
524*635a8641SAndroid Build Coastguard Worker };
525*635a8641SAndroid Build Coastguard Worker
526*635a8641SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(cases); ++i) {
527*635a8641SAndroid Build Coastguard Worker // On Windows for an LTR locale, no changes to the string are made.
528*635a8641SAndroid Build Coastguard Worker string16 prefix, suffix = WideToUTF16(L"");
529*635a8641SAndroid Build Coastguard Worker #if !defined(OS_WIN)
530*635a8641SAndroid Build Coastguard Worker prefix = WideToUTF16(L"\x200e\x202b");
531*635a8641SAndroid Build Coastguard Worker suffix = WideToUTF16(L"\x202c\x200e");
532*635a8641SAndroid Build Coastguard Worker #endif // !OS_WIN
533*635a8641SAndroid Build Coastguard Worker string16 unsanitized_text = WideToUTF16(cases[i].unformatted_text);
534*635a8641SAndroid Build Coastguard Worker string16 sanitized_text =
535*635a8641SAndroid Build Coastguard Worker prefix + WideToUTF16(cases[i].formatted_text) + suffix;
536*635a8641SAndroid Build Coastguard Worker SanitizeUserSuppliedString(&unsanitized_text);
537*635a8641SAndroid Build Coastguard Worker EXPECT_EQ(sanitized_text, unsanitized_text);
538*635a8641SAndroid Build Coastguard Worker }
539*635a8641SAndroid Build Coastguard Worker }
540*635a8641SAndroid Build Coastguard Worker
541*635a8641SAndroid Build Coastguard Worker class SetICULocaleTest : public PlatformTest {};
542*635a8641SAndroid Build Coastguard Worker
TEST_F(SetICULocaleTest,OverlongLocaleId)543*635a8641SAndroid Build Coastguard Worker TEST_F(SetICULocaleTest, OverlongLocaleId) {
544*635a8641SAndroid Build Coastguard Worker test::ScopedRestoreICUDefaultLocale restore_locale;
545*635a8641SAndroid Build Coastguard Worker std::string id("fr-ca-x-foo");
546*635a8641SAndroid Build Coastguard Worker while (id.length() < 152)
547*635a8641SAndroid Build Coastguard Worker id.append("-x-foo");
548*635a8641SAndroid Build Coastguard Worker SetICUDefaultLocale(id);
549*635a8641SAndroid Build Coastguard Worker EXPECT_STRNE("en_US", icu::Locale::getDefault().getName());
550*635a8641SAndroid Build Coastguard Worker id.append("zzz");
551*635a8641SAndroid Build Coastguard Worker SetICUDefaultLocale(id);
552*635a8641SAndroid Build Coastguard Worker EXPECT_STREQ("en_US", icu::Locale::getDefault().getName());
553*635a8641SAndroid Build Coastguard Worker }
554*635a8641SAndroid Build Coastguard Worker
555*635a8641SAndroid Build Coastguard Worker } // namespace i18n
556*635a8641SAndroid Build Coastguard Worker } // namespace base
557