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