xref: /aosp_15_r20/frameworks/minikin/tests/unittest/LayoutUtilsTest.cpp (revision 834a2baab5fdfc28e9a428ee87c7ea8f6a06a53d)
1*834a2baaSAndroid Build Coastguard Worker /*
2*834a2baaSAndroid Build Coastguard Worker  * Copyright (C) 2015 The Android Open Source Project
3*834a2baaSAndroid Build Coastguard Worker  *
4*834a2baaSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*834a2baaSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*834a2baaSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*834a2baaSAndroid Build Coastguard Worker  *
8*834a2baaSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*834a2baaSAndroid Build Coastguard Worker  *
10*834a2baaSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*834a2baaSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*834a2baaSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*834a2baaSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*834a2baaSAndroid Build Coastguard Worker  * limitations under the License.
15*834a2baaSAndroid Build Coastguard Worker  */
16*834a2baaSAndroid Build Coastguard Worker 
17*834a2baaSAndroid Build Coastguard Worker #include "LayoutUtils.h"
18*834a2baaSAndroid Build Coastguard Worker 
19*834a2baaSAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*834a2baaSAndroid Build Coastguard Worker 
21*834a2baaSAndroid Build Coastguard Worker #include "UnicodeUtils.h"
22*834a2baaSAndroid Build Coastguard Worker 
23*834a2baaSAndroid Build Coastguard Worker namespace minikin {
24*834a2baaSAndroid Build Coastguard Worker 
ExpectNextWordBreakForCache(size_t offset_in,const char * query_str)25*834a2baaSAndroid Build Coastguard Worker void ExpectNextWordBreakForCache(size_t offset_in, const char* query_str) {
26*834a2baaSAndroid Build Coastguard Worker     const size_t BUF_SIZE = 256U;
27*834a2baaSAndroid Build Coastguard Worker     uint16_t buf[BUF_SIZE];
28*834a2baaSAndroid Build Coastguard Worker     size_t expected_breakpoint = 0U;
29*834a2baaSAndroid Build Coastguard Worker     size_t size = 0U;
30*834a2baaSAndroid Build Coastguard Worker 
31*834a2baaSAndroid Build Coastguard Worker     ParseUnicode(buf, BUF_SIZE, query_str, &size, &expected_breakpoint);
32*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(expected_breakpoint, getNextWordBreakForCache(U16StringPiece(buf, size), offset_in))
33*834a2baaSAndroid Build Coastguard Worker             << "Expected position is [" << query_str << "] from offset " << offset_in;
34*834a2baaSAndroid Build Coastguard Worker }
35*834a2baaSAndroid Build Coastguard Worker 
ExpectPrevWordBreakForCache(size_t offset_in,const char * query_str)36*834a2baaSAndroid Build Coastguard Worker void ExpectPrevWordBreakForCache(size_t offset_in, const char* query_str) {
37*834a2baaSAndroid Build Coastguard Worker     const size_t BUF_SIZE = 256U;
38*834a2baaSAndroid Build Coastguard Worker     uint16_t buf[BUF_SIZE];
39*834a2baaSAndroid Build Coastguard Worker     size_t expected_breakpoint = 0U;
40*834a2baaSAndroid Build Coastguard Worker     size_t size = 0U;
41*834a2baaSAndroid Build Coastguard Worker 
42*834a2baaSAndroid Build Coastguard Worker     ParseUnicode(buf, BUF_SIZE, query_str, &size, &expected_breakpoint);
43*834a2baaSAndroid Build Coastguard Worker     EXPECT_EQ(expected_breakpoint, getPrevWordBreakForCache(U16StringPiece(buf, size), offset_in))
44*834a2baaSAndroid Build Coastguard Worker             << "Expected position is [" << query_str << "] from offset " << offset_in;
45*834a2baaSAndroid Build Coastguard Worker }
46*834a2baaSAndroid Build Coastguard Worker 
TEST(WordBreakTest,goNextWordBreakTest)47*834a2baaSAndroid Build Coastguard Worker TEST(WordBreakTest, goNextWordBreakTest) {
48*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "|");
49*834a2baaSAndroid Build Coastguard Worker 
50*834a2baaSAndroid Build Coastguard Worker     // Continue for spaces.
51*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "'a' 'b' 'c' 'd' |");
52*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "'a' 'b' 'c' 'd' |");
53*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "'a' 'b' 'c' 'd' |");
54*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "'a' 'b' 'c' 'd' |");
55*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "'a' 'b' 'c' 'd' |");
56*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "'a' 'b' 'c' 'd' |");
57*834a2baaSAndroid Build Coastguard Worker 
58*834a2baaSAndroid Build Coastguard Worker     // Space makes word break.
59*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "'a' 'b' | U+0020 'c' 'd'");
60*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "'a' 'b' | U+0020 'c' 'd'");
61*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "'a' 'b' U+0020 | 'c' 'd'");
62*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "'a' 'b' U+0020 'c' 'd' |");
63*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "'a' 'b' U+0020 'c' 'd' |");
64*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "'a' 'b' U+0020 'c' 'd' |");
65*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "'a' 'b' U+0020 'c' 'd' |");
66*834a2baaSAndroid Build Coastguard Worker 
67*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "'a' 'b' | U+2000 'c' 'd'");
68*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "'a' 'b' | U+2000 'c' 'd'");
69*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "'a' 'b' U+2000 | 'c' 'd'");
70*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "'a' 'b' U+2000 'c' 'd' |");
71*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "'a' 'b' U+2000 'c' 'd' |");
72*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "'a' 'b' U+2000 'c' 'd' |");
73*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "'a' 'b' U+2000 'c' 'd' |");
74*834a2baaSAndroid Build Coastguard Worker 
75*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "'a' 'b' | U+2000 U+2000 'c' 'd'");
76*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "'a' 'b' | U+2000 U+2000 'c' 'd'");
77*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "'a' 'b' U+2000 | U+2000 'c' 'd'");
78*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
79*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "'a' 'b' U+2000 U+2000 'c' 'd' |");
80*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "'a' 'b' U+2000 U+2000 'c' 'd' |");
81*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(6, "'a' 'b' U+2000 U+2000 'c' 'd' |");
82*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "'a' 'b' U+2000 U+2000 'c' 'd' |");
83*834a2baaSAndroid Build Coastguard Worker 
84*834a2baaSAndroid Build Coastguard Worker     // CJK ideographs makes word break.
85*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4E00 | U+4E00   U+4E00   U+4E00   U+4E00");
86*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4E00   U+4E00 | U+4E00   U+4E00   U+4E00");
87*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4E00   U+4E00   U+4E00 | U+4E00   U+4E00");
88*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4E00   U+4E00   U+4E00   U+4E00 | U+4E00");
89*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4E00   U+4E00   U+4E00   U+4E00   U+4E00 |");
90*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+4E00   U+4E00   U+4E00   U+4E00   U+4E00 |");
91*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4E00   U+4E00   U+4E00   U+4E00   U+4E00 |");
92*834a2baaSAndroid Build Coastguard Worker 
93*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4E00 | U+4E8C   U+4E09   U+56DB   U+4E94");
94*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4E00   U+4E8C | U+4E09   U+56DB   U+4E94");
95*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4E00   U+4E8C   U+4E09 | U+56DB   U+4E94");
96*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4E00   U+4E8C   U+4E09   U+56DB | U+4E94");
97*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4E00   U+4E8C   U+4E09   U+56DB   U+4E94 |");
98*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+4E00   U+4E8C   U+4E09   U+56DB   U+4E94 |");
99*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4E00   U+4E8C   U+4E09   U+56DB   U+4E94 |");
100*834a2baaSAndroid Build Coastguard Worker 
101*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
102*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
103*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
104*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4E00 'a' 'b' U+2000 | 'c' U+4E00");
105*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4E00 'a' 'b' U+2000 'c' | U+4E00");
106*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+4E00 'a' 'b' U+2000 'c' U+4E00 |");
107*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4E00 'a' 'b' U+2000 'c' U+4E00 |");
108*834a2baaSAndroid Build Coastguard Worker 
109*834a2baaSAndroid Build Coastguard Worker     // Continue if trailing characters is Unicode combining characters.
110*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4E00 U+0332 | U+4E00");
111*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4E00 U+0332 | U+4E00");
112*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4E00 U+0332 U+4E00 |");
113*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4E00 U+0332 U+4E00 |");
114*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4E00 U+0332 U+4E00 |");
115*834a2baaSAndroid Build Coastguard Worker 
116*834a2baaSAndroid Build Coastguard Worker     // Surrogate pairs.
117*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+1F60D U+1F618 |");
118*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+1F60D U+1F618 |");
119*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+1F60D U+1F618 |");
120*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+1F60D U+1F618 |");
121*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+1F60D U+1F618 |");
122*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+1F60D U+1F618 |");
123*834a2baaSAndroid Build Coastguard Worker 
124*834a2baaSAndroid Build Coastguard Worker     // Broken surrogate pairs.
125*834a2baaSAndroid Build Coastguard Worker     // U+D84D is leading surrogate but there is no trailing surrogate for it.
126*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+D84D U+1F618 |");
127*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+D84D U+1F618 |");
128*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+D84D U+1F618 |");
129*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+D84D U+1F618 |");
130*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+D84D U+1F618 |");
131*834a2baaSAndroid Build Coastguard Worker 
132*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+1F618 U+D84D |");
133*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+1F618 U+D84D |");
134*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+1F618 U+D84D |");
135*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+1F618 U+D84D |");
136*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+1F618 U+D84D |");
137*834a2baaSAndroid Build Coastguard Worker 
138*834a2baaSAndroid Build Coastguard Worker     // U+DE0D is trailing surrogate but there is no leading surrogate for it.
139*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+DE0D U+1F618 |");
140*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+DE0D U+1F618 |");
141*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+DE0D U+1F618 |");
142*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+DE0D U+1F618 |");
143*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+DE0D U+1F618 |");
144*834a2baaSAndroid Build Coastguard Worker 
145*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+1F618 U+DE0D |");
146*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+1F618 U+DE0D |");
147*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+1F618 U+DE0D |");
148*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+1F618 U+DE0D |");
149*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+1F618 U+DE0D |");
150*834a2baaSAndroid Build Coastguard Worker 
151*834a2baaSAndroid Build Coastguard Worker     // Regional indicator pair. U+1F1FA U+1F1F8 is US national flag.
152*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+1F1FA U+1F1F8 |");
153*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+1F1FA U+1F1F8 |");
154*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+1F1FA U+1F1F8 |");
155*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+1F1FA U+1F1F8 |");
156*834a2baaSAndroid Build Coastguard Worker 
157*834a2baaSAndroid Build Coastguard Worker     // Tone marks.
158*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Tone mark + CJK ideographic char
159*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4444 U+302D | U+4444");
160*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4444 U+302D | U+4444");
161*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4444 U+302D U+4444 |");
162*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4444 U+302D U+4444 |");
163*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+4444 |");
164*834a2baaSAndroid Build Coastguard Worker 
165*834a2baaSAndroid Build Coastguard Worker     // Variation Selectors.
166*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS1) + CJK Ideographic char
167*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+845B U+FE00 | U+845B");
168*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+845B U+FE00 | U+845B");
169*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+845B U+FE00 U+845B |");
170*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+845B U+FE00 U+845B |");
171*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+845B U+FE00 U+845B |");
172*834a2baaSAndroid Build Coastguard Worker 
173*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS17) + CJK Ideographic char
174*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+845B U+E0100 | U+845B");
175*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+845B U+E0100 | U+845B");
176*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+845B U+E0100 | U+845B");
177*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+845B U+E0100 U+845B |");
178*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+845B U+E0100 U+845B |");
179*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+845B U+E0100 U+845B |");
180*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+845B U+E0100 U+845B |");
181*834a2baaSAndroid Build Coastguard Worker 
182*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Tone mark + Variation Character(VS1)
183*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4444 U+302D U+FE00 | U+4444");
184*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4444 U+302D U+FE00 | U+4444");
185*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4444 U+302D U+FE00 | U+4444");
186*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4444 U+302D U+FE00 U+4444 |");
187*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4444 U+302D U+FE00 U+4444 |");
188*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+FE00 U+4444 |");
189*834a2baaSAndroid Build Coastguard Worker 
190*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Tone mark + Variation Character(VS17)
191*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4444 U+302D U+E0100 | U+4444");
192*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4444 U+302D U+E0100 | U+4444");
193*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4444 U+302D U+E0100 | U+4444");
194*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4444 U+302D U+E0100 | U+4444");
195*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4444 U+302D U+E0100 U+4444 |");
196*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+4444 U+302D U+E0100 U+4444 |");
197*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+E0100 U+4444 |");
198*834a2baaSAndroid Build Coastguard Worker 
199*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Variation Character(VS1) + Tone mark
200*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4444 U+FE00 U+302D | U+4444");
201*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4444 U+FE00 U+302D | U+4444");
202*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4444 U+FE00 U+302D | U+4444");
203*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4444 U+FE00 U+302D U+4444 |");
204*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4444 U+FE00 U+302D U+4444 |");
205*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4444 U+FE00 U+302D U+4444 |");
206*834a2baaSAndroid Build Coastguard Worker 
207*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Variation Character(VS17) + Tone mark
208*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4444 U+E0100 U+302D | U+4444");
209*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4444 U+E0100 U+302D | U+4444");
210*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4444 U+E0100 U+302D | U+4444");
211*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4444 U+E0100 U+302D | U+4444");
212*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4444 U+E0100 U+302D U+4444 |");
213*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+4444 U+E0100 U+302D U+4444 |");
214*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4444 U+E0100 U+302D U+4444 |");
215*834a2baaSAndroid Build Coastguard Worker 
216*834a2baaSAndroid Build Coastguard Worker     // Following test cases are unusual usage of variation selectors and tone
217*834a2baaSAndroid Build Coastguard Worker     // marks for caching up the further behavior changes, e.g. index of bounds
218*834a2baaSAndroid Build Coastguard Worker     // or crashes. Please feel free to update the test expectations if the
219*834a2baaSAndroid Build Coastguard Worker     // behavior change makes sense to you.
220*834a2baaSAndroid Build Coastguard Worker 
221*834a2baaSAndroid Build Coastguard Worker     // Isolated Tone marks and Variation Selectors
222*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+FE00 |");
223*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+FE00 |");
224*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+FE00 |");
225*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+E0100 |");
226*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+E0100 |");
227*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+302D |");
228*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+302D |");
229*834a2baaSAndroid Build Coastguard Worker 
230*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS1)
231*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+845B U+FE00 U+FE00 | U+845B");
232*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+845B U+FE00 U+FE00 | U+845B");
233*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+845B U+FE00 U+FE00 | U+845B");
234*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+845B U+FE00 U+FE00 U+845B |");
235*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+845B U+FE00 U+FE00 U+845B |");
236*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+845B U+FE00 U+FE00 U+845B |");
237*834a2baaSAndroid Build Coastguard Worker 
238*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS17)
239*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+845B U+E0100 U+E0100 | U+845B");
240*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+845B U+E0100 U+E0100 | U+845B");
241*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+845B U+E0100 U+E0100 | U+845B");
242*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+845B U+E0100 U+E0100 | U+845B");
243*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+845B U+E0100 U+E0100 | U+845B");
244*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+845B U+E0100 U+E0100 U+845B |");
245*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(6, "U+845B U+E0100 U+E0100 U+845B |");
246*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+845B U+E0100 U+E0100 U+845B |");
247*834a2baaSAndroid Build Coastguard Worker 
248*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS17)
249*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+845B U+FE00 U+E0100 | U+845B");
250*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+845B U+FE00 U+E0100 | U+845B");
251*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+845B U+FE00 U+E0100 | U+845B");
252*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+845B U+FE00 U+E0100 | U+845B");
253*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+845B U+FE00 U+E0100 U+845B |");
254*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+845B U+FE00 U+E0100 U+845B |");
255*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+845B U+FE00 U+E0100 U+845B |");
256*834a2baaSAndroid Build Coastguard Worker 
257*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS1)
258*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+845B U+E0100 U+FE00 | U+845B");
259*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+845B U+E0100 U+FE00 | U+845B");
260*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+845B U+E0100 U+FE00 | U+845B");
261*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+845B U+E0100 U+FE00 | U+845B");
262*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+845B U+E0100 U+FE00 U+845B |");
263*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(5, "U+845B U+E0100 U+FE00 U+845B |");
264*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+845B U+E0100 U+FE00 U+845B |");
265*834a2baaSAndroid Build Coastguard Worker 
266*834a2baaSAndroid Build Coastguard Worker     // Tone mark. + Tone mark
267*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(0, "U+4444 U+302D U+302D | U+4444");
268*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1, "U+4444 U+302D U+302D | U+4444");
269*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(2, "U+4444 U+302D U+302D | U+4444");
270*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(3, "U+4444 U+302D U+302D U+4444 |");
271*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(4, "U+4444 U+302D U+302D U+4444 |");
272*834a2baaSAndroid Build Coastguard Worker     ExpectNextWordBreakForCache(1000, "U+4444 U+302D U+302D U+4444 |");
273*834a2baaSAndroid Build Coastguard Worker }
274*834a2baaSAndroid Build Coastguard Worker 
TEST(WordBreakTest,goPrevWordBreakTest)275*834a2baaSAndroid Build Coastguard Worker TEST(WordBreakTest, goPrevWordBreakTest) {
276*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "|");
277*834a2baaSAndroid Build Coastguard Worker 
278*834a2baaSAndroid Build Coastguard Worker     // Continue for spaces.
279*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| 'a' 'b' 'c' 'd'");
280*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| 'a' 'b' 'c' 'd'");
281*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| 'a' 'b' 'c' 'd'");
282*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| 'a' 'b' 'c' 'd'");
283*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| 'a' 'b' 'c' 'd'");
284*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| 'a' 'b' 'c' 'd'");
285*834a2baaSAndroid Build Coastguard Worker 
286*834a2baaSAndroid Build Coastguard Worker     // Space makes word break.
287*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| 'a' 'b' U+0020 'c' 'd'");
288*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| 'a' 'b' U+0020 'c' 'd'");
289*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| 'a' 'b' U+0020 'c' 'd'");
290*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "'a' 'b' | U+0020 'c' 'd'");
291*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "'a' 'b' U+0020 | 'c' 'd'");
292*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "'a' 'b' U+0020 | 'c' 'd'");
293*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "'a' 'b' U+0020 | 'c' 'd'");
294*834a2baaSAndroid Build Coastguard Worker 
295*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| 'a' 'b' U+2000 'c' 'd'");
296*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| 'a' 'b' U+2000 'c' 'd'");
297*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| 'a' 'b' U+2000 'c' 'd'");
298*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "'a' 'b' | U+2000 'c' 'd'");
299*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "'a' 'b' U+2000 | 'c' 'd'");
300*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "'a' 'b' U+2000 | 'c' 'd'");
301*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "'a' 'b' U+2000 | 'c' 'd'");
302*834a2baaSAndroid Build Coastguard Worker 
303*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| 'a' 'b' U+2000 U+2000 'c' 'd'");
304*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| 'a' 'b' U+2000 U+2000 'c' 'd'");
305*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| 'a' 'b' U+2000 U+2000 'c' 'd'");
306*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "'a' 'b' | U+2000 U+2000 'c' 'd'");
307*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "'a' 'b' U+2000 | U+2000 'c' 'd'");
308*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
309*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(6, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
310*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "'a' 'b' U+2000 U+2000 | 'c' 'd'");
311*834a2baaSAndroid Build Coastguard Worker 
312*834a2baaSAndroid Build Coastguard Worker     // CJK ideographs makes word break.
313*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4E00 U+4E00 U+4E00 U+4E00 U+4E00");
314*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4E00 U+4E00 U+4E00 U+4E00 U+4E00");
315*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "U+4E00 | U+4E00 U+4E00 U+4E00 U+4E00");
316*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "U+4E00 U+4E00 | U+4E00 U+4E00 U+4E00");
317*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+4E00 U+4E00 U+4E00 | U+4E00 U+4E00");
318*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+4E00 U+4E00 U+4E00 U+4E00 | U+4E00");
319*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4E00 U+4E00 U+4E00 U+4E00 | U+4E00");
320*834a2baaSAndroid Build Coastguard Worker 
321*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4E00 U+4E8C U+4E09 U+56DB U+4E94");
322*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4E00 U+4E8C U+4E09 U+56DB U+4E94");
323*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "U+4E00 | U+4E8C U+4E09 U+56DB U+4E94");
324*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "U+4E00 U+4E8C | U+4E09 U+56DB U+4E94");
325*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+4E00 U+4E8C U+4E09 | U+56DB U+4E94");
326*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+4E00 U+4E8C U+4E09 U+56DB | U+4E94");
327*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4E00 U+4E8C U+4E09 U+56DB | U+4E94");
328*834a2baaSAndroid Build Coastguard Worker 
329*834a2baaSAndroid Build Coastguard Worker     // Mixed case.
330*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
331*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
332*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
333*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+4E00 'a' 'b' U+2000 'c' U+4E00");
334*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+4E00 'a' 'b' | U+2000 'c' U+4E00");
335*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+4E00 'a' 'b' U+2000 | 'c' U+4E00");
336*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(6, "U+4E00 'a' 'b' U+2000 'c' | U+4E00");
337*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4E00 'a' 'b' U+2000 'c' | U+4E00");
338*834a2baaSAndroid Build Coastguard Worker 
339*834a2baaSAndroid Build Coastguard Worker     // Continue if trailing characters is Unicode combining characters.
340*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4E00 U+0332 U+4E00");
341*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4E00 U+0332 U+4E00");
342*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4E00 U+0332 U+4E00");
343*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "U+4E00 U+0332 | U+4E00");
344*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4E00 U+0332 | U+4E00");
345*834a2baaSAndroid Build Coastguard Worker 
346*834a2baaSAndroid Build Coastguard Worker     // Surrogate pairs.
347*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+1F60D U+1F618");
348*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+1F60D U+1F618");
349*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+1F60D U+1F618");
350*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+1F60D U+1F618");
351*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| U+1F60D U+1F618");
352*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+1F60D U+1F618");
353*834a2baaSAndroid Build Coastguard Worker 
354*834a2baaSAndroid Build Coastguard Worker     // Broken surrogate pairs.
355*834a2baaSAndroid Build Coastguard Worker     // U+D84D is leading surrogate but there is no trailing surrogate for it.
356*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+D84D U+1F618");
357*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+D84D U+1F618");
358*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+D84D U+1F618");
359*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+D84D U+1F618");
360*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+D84D U+1F618");
361*834a2baaSAndroid Build Coastguard Worker 
362*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+1F618 U+D84D");
363*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+1F618 U+D84D");
364*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+1F618 U+D84D");
365*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+1F618 U+D84D");
366*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+1F618 U+D84D");
367*834a2baaSAndroid Build Coastguard Worker 
368*834a2baaSAndroid Build Coastguard Worker     // U+DE0D is trailing surrogate but there is no leading surrogate for it.
369*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+DE0D U+1F618");
370*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+DE0D U+1F618");
371*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+DE0D U+1F618");
372*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+DE0D U+1F618");
373*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+DE0D U+1F618");
374*834a2baaSAndroid Build Coastguard Worker 
375*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+1F618 U+DE0D");
376*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+1F618 U+DE0D");
377*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+1F618 U+DE0D");
378*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+1F618 U+DE0D");
379*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+1F618 U+DE0D");
380*834a2baaSAndroid Build Coastguard Worker 
381*834a2baaSAndroid Build Coastguard Worker     // Regional indicator pair. U+1F1FA U+1F1F8 is US national flag.
382*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+1F1FA U+1F1F8");
383*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+1F1FA U+1F1F8");
384*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+1F1FA U+1F1F8");
385*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+1F1FA U+1F1F8");
386*834a2baaSAndroid Build Coastguard Worker 
387*834a2baaSAndroid Build Coastguard Worker     // Tone marks.
388*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Tone mark + CJK ideographic char
389*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+4444");
390*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+4444");
391*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+4444");
392*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "U+4444 U+302D | U+4444");
393*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4444 U+302D | U+4444");
394*834a2baaSAndroid Build Coastguard Worker 
395*834a2baaSAndroid Build Coastguard Worker     // Variation Selectors.
396*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS1) + CJK Ideographic char
397*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+845B U+FE00 U+845B");
398*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+845B U+FE00 U+845B");
399*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+845B U+FE00 U+845B");
400*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "U+845B U+FE00 | U+845B");
401*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+845B U+FE00 | U+845B");
402*834a2baaSAndroid Build Coastguard Worker 
403*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS17) + CJK Ideographic char
404*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+845B U+E0100 U+845B");
405*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+845B U+E0100 U+845B");
406*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+845B U+E0100 U+845B");
407*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+845B U+E0100 U+845B");
408*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+845B U+E0100 | U+845B");
409*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+845B U+E0100 | U+845B");
410*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+845B U+E0100 | U+845B");
411*834a2baaSAndroid Build Coastguard Worker 
412*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Tone mark + Variation Character(VS1)
413*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+FE00 U+4444");
414*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+FE00 U+4444");
415*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+FE00 U+4444");
416*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+4444 U+302D U+FE00 U+4444");
417*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+4444 U+302D U+FE00 | U+4444");
418*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4444 U+302D U+FE00 | U+4444");
419*834a2baaSAndroid Build Coastguard Worker 
420*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Tone mark + Variation Character(VS17)
421*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+E0100 U+4444");
422*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+E0100 U+4444");
423*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+E0100 U+4444");
424*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+4444 U+302D U+E0100 U+4444");
425*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| U+4444 U+302D U+E0100 U+4444");
426*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+4444 U+302D U+E0100 | U+4444");
427*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4444 U+302D U+E0100 | U+4444");
428*834a2baaSAndroid Build Coastguard Worker 
429*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Variation Character(VS1) + Tone mark
430*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4444 U+FE00 U+302D U+4444");
431*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4444 U+FE00 U+302D U+4444");
432*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4444 U+FE00 U+302D U+4444");
433*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+4444 U+FE00 U+302D U+4444");
434*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+4444 U+FE00 U+302D | U+4444");
435*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4444 U+FE00 U+302D | U+4444");
436*834a2baaSAndroid Build Coastguard Worker 
437*834a2baaSAndroid Build Coastguard Worker     // CJK ideographic char + Variation Character(VS17) + Tone mark
438*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4444 U+E0100 U+302D U+4444");
439*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4444 U+E0100 U+302D U+4444");
440*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4444 U+E0100 U+302D U+4444");
441*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+4444 U+E0100 U+302D U+4444");
442*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| U+4444 U+E0100 U+302D U+4444");
443*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+4444 U+E0100 U+302D | U+4444");
444*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4444 U+E0100 U+302D | U+4444");
445*834a2baaSAndroid Build Coastguard Worker 
446*834a2baaSAndroid Build Coastguard Worker     // Following test cases are unusual usage of variation selectors and tone
447*834a2baaSAndroid Build Coastguard Worker     // marks for caching up the further behavior changes, e.g. index of bounds
448*834a2baaSAndroid Build Coastguard Worker     // or crashes. Please feel free to update the test expectations if the
449*834a2baaSAndroid Build Coastguard Worker     // behavior change makes sense to you.
450*834a2baaSAndroid Build Coastguard Worker 
451*834a2baaSAndroid Build Coastguard Worker     // Isolated Tone marks and Variation Selectors
452*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+FE00");
453*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+FE00");
454*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+FE00");
455*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+E0100");
456*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+E0100");
457*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+302D");
458*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "| U+302D");
459*834a2baaSAndroid Build Coastguard Worker 
460*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS1)
461*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+845B U+FE00 U+FE00 U+845B");
462*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+845B U+FE00 U+FE00 U+845B");
463*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+845B U+FE00 U+FE00 U+845B");
464*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+845B U+FE00 U+FE00 U+845B");
465*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+845B U+FE00 U+FE00 | U+845B");
466*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+845B U+FE00 U+FE00 | U+845B");
467*834a2baaSAndroid Build Coastguard Worker 
468*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS17)
469*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+845B U+E0100 U+E0100 U+845B");
470*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+845B U+E0100 U+E0100 U+845B");
471*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+845B U+E0100 U+E0100 U+845B");
472*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+845B U+E0100 U+E0100 U+845B");
473*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| U+845B U+E0100 U+E0100 U+845B");
474*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "| U+845B U+E0100 U+E0100 U+845B");
475*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(6, "U+845B U+E0100 U+E0100 | U+845B");
476*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+845B U+E0100 U+E0100 | U+845B");
477*834a2baaSAndroid Build Coastguard Worker 
478*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS1) + Variation Selector(VS17)
479*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+845B U+FE00 U+E0100 U+845B");
480*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+845B U+FE00 U+E0100 U+845B");
481*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+845B U+FE00 U+E0100 U+845B");
482*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+845B U+FE00 U+E0100 U+845B");
483*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| U+845B U+FE00 U+E0100 U+845B");
484*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+845B U+FE00 U+E0100 | U+845B");
485*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+845B U+FE00 U+E0100 | U+845B");
486*834a2baaSAndroid Build Coastguard Worker 
487*834a2baaSAndroid Build Coastguard Worker     // CJK Ideographic char + Variation Selector(VS17) + Variation Selector(VS1)
488*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+845B U+E0100 U+FE00 U+845B");
489*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+845B U+E0100 U+FE00 U+845B");
490*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+845B U+E0100 U+FE00 U+845B");
491*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+845B U+E0100 U+FE00 U+845B");
492*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "| U+845B U+E0100 U+FE00 U+845B");
493*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(5, "U+845B U+E0100 U+FE00 | U+845B");
494*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+845B U+E0100 U+FE00 | U+845B");
495*834a2baaSAndroid Build Coastguard Worker 
496*834a2baaSAndroid Build Coastguard Worker     // Tone mark. + Tone mark
497*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(0, "| U+4444 U+302D U+302D U+4444");
498*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1, "| U+4444 U+302D U+302D U+4444");
499*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(2, "| U+4444 U+302D U+302D U+4444");
500*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(3, "| U+4444 U+302D U+302D U+4444");
501*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(4, "U+4444 U+302D U+302D | U+4444");
502*834a2baaSAndroid Build Coastguard Worker     ExpectPrevWordBreakForCache(1000, "U+4444 U+302D U+302D | U+4444");
503*834a2baaSAndroid Build Coastguard Worker }
504*834a2baaSAndroid Build Coastguard Worker 
505*834a2baaSAndroid Build Coastguard Worker }  // namespace minikin
506