Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(460)

Side by Side Diff: third_party/WebKit/Source/core/editing/BackspaceStateMachineTest.cpp

Issue 1844663002: Implement backspace state machine for complex emoji sequence. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/editing/BackspaceStateMachine.h" 5 #include "core/editing/BackspaceStateMachine.h"
6 6
7 #include "testing/gtest/include/gtest/gtest.h" 7 #include "testing/gtest/include/gtest/gtest.h"
8 #include "wtf/text/Unicode.h"
8 9
9 namespace blink { 10 namespace blink {
10 11
11 constexpr BackspaceStateMachine::State NeedMoreCodeUnit = BackspaceStateMachine: :State::NeedMoreCodeUnit; 12 constexpr BackspaceStateMachine::State NeedMoreCodeUnit = BackspaceStateMachine: :State::NeedMoreCodeUnit;
12 constexpr BackspaceStateMachine::State Finished = BackspaceStateMachine::State:: Finished; 13 constexpr BackspaceStateMachine::State Finished = BackspaceStateMachine::State:: Finished;
13 14
14 TEST(BackspaceStateMachineTest, DoNothingCase) 15 TEST(BackspaceStateMachineTest, DoNothingCase)
15 { 16 {
16 BackspaceStateMachine machine; 17 BackspaceStateMachine machine;
17 EXPECT_EQ(0, machine.finalizeAndGetBoundaryOffset()); 18 EXPECT_EQ(0, machine.finalizeAndGetBoundaryOffset());
(...skipping 22 matching lines...) Expand all
40 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(0x3042)); 41 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(0x3042));
41 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset()); 42 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
42 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset()); 43 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
43 } 44 }
44 45
45 TEST(BackspaceStateMachineTest, SurrogatePair) 46 TEST(BackspaceStateMachineTest, SurrogatePair)
46 { 47 {
47 BackspaceStateMachine machine; 48 BackspaceStateMachine machine;
48 49
49 // U+1F5FA(WORLD MAP) is \uD83D\uDDFA in UTF-16. 50 // U+1F5FA(WORLD MAP) is \uD83D\uDDFA in UTF-16.
50 uint16_t leadSurrogate = 0xD83D; 51 const UChar leadSurrogate = 0xD83D;
51 uint16_t trailSurrogate = 0xDDFA; 52 const UChar trailSurrogate = 0xDDFA;
52 53
53 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trailSurrogate)); 54 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trailSurrogate));
54 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(leadSurrogate)); 55 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(leadSurrogate));
55 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset()); 56 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
56 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset()); 57 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
57 58
58 // Edge cases 59 // Edge cases
59 // Unpaired trailing surrogate. Delete only broken trail surrogate. 60 // Unpaired trailing surrogate. Delete only broken trail surrogate.
60 machine.reset(); 61 machine.reset();
61 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trailSurrogate)); 62 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(trailSurrogate));
(...skipping 12 matching lines...) Expand all
74 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset()); 75 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
75 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset()); 76 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
76 77
77 // Unpaired leading surrogate. Delete only broken lead surrogate. 78 // Unpaired leading surrogate. Delete only broken lead surrogate.
78 machine.reset(); 79 machine.reset();
79 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(leadSurrogate)); 80 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(leadSurrogate));
80 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset()); 81 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
81 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset()); 82 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
82 } 83 }
83 84
85 TEST(BackspaceStateMachineTest, CRLF)
86 {
87 BackspaceStateMachine machine;
88
89 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('\r'));
90 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
91 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
92
93 machine.reset();
94 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\n'));
95 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
96 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
97
98 machine.reset();
99 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\n'));
100 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(' '));
101 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
102 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
103
104 // CR LF should be deleted at the same time.
105 machine.reset();
106 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit('\n'));
107 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('\r'));
108 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
109 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
110 }
111
112 TEST(BackspaceStateMachineTest, KeyCap)
113 {
114 BackspaceStateMachine machine;
115
116 const UChar keycap = 0x20E3;
117 const UChar vs16 = 0xFE0F;
118 const UChar notKeycapBaseLead = 0xD83C;
119 const UChar notKeycapBaseTrail = 0xDCCF;
120
121 // keycapBase + keycap
122 machine.reset();
123 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
124 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('0'));
125 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
126 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
127
128 // keycapBase + VS + keycap
129 machine.reset();
130 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
131 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
132 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('0'));
133 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
134 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
135
136 // Followings are edge cases. Remove only keycap character.
137 // Not keycapBase + keycap
138 machine.reset();
139 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
140 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
141 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
142 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
143
144 // Not keycapBase + VS + keycap
145 machine.reset();
146 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
147 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
148 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
149 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
150 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
151
152 // Not keycapBase(surrogate pair) + keycap
153 machine.reset();
154 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
155 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notKeycapBaseTrail ));
156 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notKeycapBaseLead));
157 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
158 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
159
160 // Not keycapBase(surrogate pair) + VS + keycap
161 machine.reset();
162 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
163 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
164 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notKeycapBaseTrail ));
165 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notKeycapBaseLead));
166 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
167 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
168
169 // Sot + keycap
170 machine.reset();
171 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
172 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
173 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
174
175 // Sot + VS + keycap
176 machine.reset();
177 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(keycap));
178 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
179 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
180 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
181 }
182
183 TEST(BackspaceStateMachineTest, EmojiModifier)
184 {
185 BackspaceStateMachine machine;
186
187 const UChar emojiModifierLead = 0xD83C;
188 const UChar emojiModifierTrail = 0xDFFB;
189 const UChar emojiModifierBase = 0x261D;
190 const UChar emojiModifierBaseLead = 0xD83D;
191 const UChar emojiModifierBaseTrail =0xDC66;
192 const UChar notEmojiModifierBaseLead = 0xD83C;
193 const UChar notEmojiModifierBaseTrail = 0xDCCF;
194 const UChar vs16 = 0xFE0F;
195
196 // EMOJI_MODIFIER_BASE + EMOJI_MODIFIER
197 machine.reset();
198 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
199 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
200 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(emojiModifierBase));
201 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
202 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
203
204 // EMOJI_MODIFIER_BASE(surrogate pairs) + EMOJI_MODIFIER
205 machine.reset();
206 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
207 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
208 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierBaseT rail));
209 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(emojiModifierBaseLead));
210 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
211 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
212
213 // EMOJI_MODIFIER_BASE + VS + EMOJI_MODIFIER
214 machine.reset();
215 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
216 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
217 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
218 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(emojiModifierBase));
219 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
220 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
221
222 // EMOJI_MODIFIER_BASE(surrogate pairs) + VS + EMOJI_MODIFIER
223 machine.reset();
224 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
225 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
226 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
227 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierBaseT rail));
228 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(emojiModifierBaseLead));
229 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
230 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
231
232 // Followings are edge cases. Remove only emoji modifier.
233 // Not EMOJI_MODIFIER_BASE + EMOJI_MODIFIER
234 machine.reset();
235 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
236 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
237 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
238 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
239 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
240
241 // Not EMOJI_MODIFIER_BASE(surrogate pairs) + EMOJI_MODIFIER
242 machine.reset();
243 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
244 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
245 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notEmojiModifierBa seTrail));
246 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notEmojiModifierBaseLead)) ;
247 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
248 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
249
250 // Not EMOJI_MODIFIER_BASE + VS + EMOJI_MODIFIER
251 machine.reset();
252 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
253 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
254 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
255 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
256 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
257 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
258
259 // Not EMOJI_MODIFIER_BASE(surrogate pairs) + VS + EMOJI_MODIFIER
260 machine.reset();
261 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
262 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
263 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
264 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notEmojiModifierBa seTrail));
265 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notEmojiModifierBaseLead)) ;
266 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
267 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
268
269 // Sot + EMOJI_MODIFIER
270 machine.reset();
271 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
272 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
273 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
274 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
275
276 // Sot + VS + EMOJI_MODIFIER
277 machine.reset();
278 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierTrail ));
279 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(emojiModifierLead) );
280 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
281 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
282 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
283 }
284
285 TEST(BackspaceStateMachineTest, RegionalIndicator)
286 {
287 BackspaceStateMachine machine;
288
289 const UChar regionalIndicatorULead = 0xD83C;
290 const UChar regionalIndicatorUTrail = 0xDDFA;
291 const UChar regionalIndicatorSLead = 0xD83C;
292 const UChar regionalIndicatorSTrail = 0xDDF8;
293 const UChar notRegionalIndicatorLead = 0xD83C;
294 const UChar notRegionalIndicatorTrail = 0xDCCF;
295
296 // Not RI + RI + RI
297 machine.reset();
298 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
299 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
300 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
301 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
302 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
303 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
304 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
305
306 // Not RI(surrogate pairs) + RI + RI
307 machine.reset();
308 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
309 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
310 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
311 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
312 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notRegionalIndicat orTrail));
313 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notRegionalIndicatorLead)) ;
314 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
315 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
316
317 // Sot + RI + RI
318 machine.reset();
319 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
320 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
321 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
322 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
323 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
324 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
325
326 // Not RI + RI + RI + RI + RI
327 machine.reset();
328 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
329 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
330 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
331 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
332 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
333 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
334 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
335 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
336 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
337 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
338 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
339
340 // Not RI(surrogate pairs) + RI + RI + RI + RI
341 machine.reset();
342 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
343 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
344 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
345 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
346 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
347 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
348 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
349 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
350 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notRegionalIndicat orTrail));
351 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notRegionalIndicatorLead)) ;
352 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
353 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
354
355 // Sot + RI + RI + RI + RI
356 machine.reset();
357 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
358 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
359 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
360 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
361 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
362 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
363 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
364 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
365 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
366 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
367
368 // Followings are edge cases. Delete last regional indicator only.
369 // Not RI + RI
370 machine.reset();
371 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
372 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
373 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
374 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
375 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
376
377 // Not RI(surrogate pairs) + RI
378 machine.reset();
379 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
380 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
381 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notRegionalIndicat orTrail));
382 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notRegionalIndicatorLead)) ;
383 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
384 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
385
386 // Sot + RI
387 machine.reset();
388 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
389 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
390 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
391 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
392
393 // Not RI + RI + RI + RI
394 machine.reset();
395 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
396 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
397 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
398 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
399 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
400 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
401 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit('a'));
402 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
403 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
404
405 // Not RI(surrogate pairs) + RI + RI + RI
406 machine.reset();
407 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
408 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
409 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
410 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
411 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
412 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
413 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notRegionalIndicat orTrail));
414 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notRegionalIndicatorLead)) ;
415 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
416 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
417
418 // Sot + RI + RI + RI
419 machine.reset();
420 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
421 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
422 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Trail));
423 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorS Lead));
424 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Trail));
425 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(regionalIndicatorU Lead));
426 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
427 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
428 }
429
430 TEST(BackspaceStateMachineTest, VariationSequencec)
431 {
432 BackspaceStateMachine machine;
433
434 UChar vs16 = 0xFE0F;
435 UChar vs16Base = '0';
436 UChar vs16BaseLead = 0xD83C;
437 UChar vs16BaseTrail = 0xDD70;
438
439 UChar vs17Lead = 0xDB40;
440 UChar vs17Trail = 0xDD00;
441 UChar vs17Base = 0x3402;
442 UChar vs17BaseLead = 0xD841;
443 UChar vs17BaseTrail = 0xDC8C;
444
445 UChar mongolianVs = 0x180B;
446 UChar mongolianVsBase = 0x1820;
447 // Variation selectors can't be a base of variation sequence.
448 UChar notvsBase = 0xFE00;
449 UChar notvsBaseLead = 0xDB40;
450 UChar notvsBaseTrail = 0xDD01;
451
452 // VS_BASE + VS
453 machine.reset();
454 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
455 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(vs16Base));
456 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
457 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
458
459 // VS_BASE + VS(surrogate pairs)
460 machine.reset();
461 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Trail));
462 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Lead));
463 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(vs17Base));
464 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
465 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
466
467 // VS_BASE(surrogate pairs) + VS
468 machine.reset();
469 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
470 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16BaseTrail));
471 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(vs16BaseLead));
472 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
473 EXPECT_EQ(-3, machine.finalizeAndGetBoundaryOffset());
474
475 // VS_BASE(surrogate pairs) + VS(surrogate pairs)
476 machine.reset();
477 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Trail));
478 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Lead));
479 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17BaseTrail));
480 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(vs17BaseLead));
481 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
482 EXPECT_EQ(-4, machine.finalizeAndGetBoundaryOffset());
483
484 // mongolianVsBase + mongolianVs
485 machine.reset();
486 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(mongolianVs));
487 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(mongolianVsBase));
488 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
489 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
490
491 // Followings are edge case. Delete only variation selector.
492 // Not VS_BASE + VS
493 machine.reset();
494 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
495 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notvsBase));
496 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
497 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
498
499 // Not VS_BASE + VS(surrogate pairs)
500 machine.reset();
501 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Trail));
502 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Lead));
503 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notvsBase));
504 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
505 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
506
507 // Not VS_BASE(surrogate pairs) + VS
508 machine.reset();
509 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
510 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notvsBaseTrail));
511 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notvsBaseLead));
512 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
513 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
514
515 // Not VS_BASE(surrogate pairs) + VS(surrogate pairs)
516 machine.reset();
517 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Trail));
518 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Lead));
519 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notvsBaseTrail));
520 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notvsBaseLead));
521 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
522 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
523
524 // Not VS_BASE + MONGOLIAN_VS
525 machine.reset();
526 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(mongolianVs));
527 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notvsBase));
528 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
529 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
530
531 // Not VS_BASE(surrogate pairs) + MONGOLIAN_VS
532 machine.reset();
533 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(mongolianVs));
534 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(notvsBaseTrail));
535 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(notvsBaseLead));
536 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
537 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
538
539 // Sot + VS
540 machine.reset();
541 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
542 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
543 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
544
545 // Sot + VS(surrogate pair)
546 machine.reset();
547 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Trail));
548 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs17Lead));
549 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
550 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
551
552 // Sot + MONGOLIAN_VS
553 machine.reset();
554 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(mongolianVs));
555 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
556 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
557 }
558
559 TEST(BackspaceStateMachineTest, ZWJSequence)
560 {
561 BackspaceStateMachine machine;
562
563 const UChar zwj = 0x200D;
564 const UChar eyeLead = 0xD83D;
565 const UChar eyeTrail = 0xDC41;
566 const UChar leftSpeachBubbleLead = 0xD83D;
567 const UChar leftSpeachBubbleTrail = 0xDDE8;
568 const UChar manLead = 0xD83D;
569 const UChar manTrail = 0xDC68;
570 const UChar boyLead = 0xD83D;
571 const UChar boyTrail = 0xDC66;
572 const UChar heart = 0x2764;
573 const UChar kissLead = 0xD83D;
574 const UChar killTrail = 0xDC8B;
575 const UChar vs16 = 0xFE0F;
576 const UChar other = 'a';
577 const UChar otherLead = 0xD83C;
578 const UChar otherTrail = 0xDCCF;
579
580 // Followings are chosen from valid zwj sequcne.
581 // See http://www.unicode.org/Public/emoji/2.0//emoji-zwj-sequences.txt
582
583 // others + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
584 // As an example, use EYE + ZWJ + LEFT_SPEACH_BUBBLE
585 machine.reset();
586 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(leftSpeachBubbleTr ail));
587 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(leftSpeachBubbleLe ad));
588 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
589 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(eyeTrail));
590 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(eyeLead));
591 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
592 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
593 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
594
595 // others(surrogate pairs) + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
596 // As an example, use EYE + ZWJ + LEFT_SPEACH_BUBBLE
597 machine.reset();
598 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(leftSpeachBubbleTr ail));
599 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(leftSpeachBubbleLe ad));
600 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
601 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(eyeTrail));
602 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(eyeLead));
603 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
604 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
605 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
606 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
607
608 // Sot + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
609 // As an example, use EYE + ZWJ + LEFT_SPEACH_BUBBLE
610 machine.reset();
611 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(leftSpeachBubbleTr ail));
612 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(leftSpeachBubbleLe ad));
613 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
614 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(eyeTrail));
615 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(eyeLead));
616 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
617 EXPECT_EQ(-5, machine.finalizeAndGetBoundaryOffset());
618
619 // others + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
620 // As an example, use MAN + ZWJ + heart + ZWJ + MAN
621 machine.reset();
622 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
623 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
624 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
625 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
626 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
627 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
628 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
629 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
630 EXPECT_EQ(-7, machine.finalizeAndGetBoundaryOffset());
631 EXPECT_EQ(-7, machine.finalizeAndGetBoundaryOffset());
632
633 // others(surrogate pairs) + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
634 // As an example, use MAN + ZWJ + heart + ZWJ + MAN
635 machine.reset();
636 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
637 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
638 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
639 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
640 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
641 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
642 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
643 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
644 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
645 EXPECT_EQ(-7, machine.finalizeAndGetBoundaryOffset());
646 EXPECT_EQ(-7, machine.finalizeAndGetBoundaryOffset());
647
648 // Sot + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
649 // As an example, use MAN + ZWJ + heart + ZWJ + MAN
650 machine.reset();
651 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
652 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
653 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
654 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
655 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
656 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
657 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
658 EXPECT_EQ(-7, machine.finalizeAndGetBoundaryOffset());
659 EXPECT_EQ(-7, machine.finalizeAndGetBoundaryOffset());
660
661 // others + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + VS + ZWJ + ZWJ_EMOJI
662 // As an example, use MAN + ZWJ + heart + vs16 + ZWJ + MAN
663 machine.reset();
664 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
665 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
666 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
667 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
668 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
669 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
670 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
671 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
672 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
673 EXPECT_EQ(-8, machine.finalizeAndGetBoundaryOffset());
674 EXPECT_EQ(-8, machine.finalizeAndGetBoundaryOffset());
675
676 // others(surrogate pairs) + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + VS + ZWJ + ZWJ_EM OJI
677 // As an example, use MAN + ZWJ + heart + vs16 + ZWJ + MAN
678 machine.reset();
679 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
680 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
681 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
682 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
683 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
684 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
685 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
686 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
687 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
688 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
689 EXPECT_EQ(-8, machine.finalizeAndGetBoundaryOffset());
690 EXPECT_EQ(-8, machine.finalizeAndGetBoundaryOffset());
691
692 // Sot + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + VS + ZWJ + ZWJ_EMOJI
693 // As an example, use MAN + ZWJ + heart + vs16 + ZWJ + MAN
694 machine.reset();
695 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
696 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
697 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
698 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
699 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
700 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
701 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
702 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
703 EXPECT_EQ(-8, machine.finalizeAndGetBoundaryOffset());
704 EXPECT_EQ(-8, machine.finalizeAndGetBoundaryOffset());
705
706 // others + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
707 // As an example, use MAN + ZWJ + MAN + ZWJ + boy + ZWJ + BOY
708 machine.reset();
709 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyTrail));
710 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyLead));
711 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
712 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyTrail));
713 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyLead));
714 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
715 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
716 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
717 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
718 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
719 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
720 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
721 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
722 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
723
724 // others(surrogate pairs) + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
725 // As an example, use MAN + ZWJ + MAN + ZWJ + boy + ZWJ + BOY
726 machine.reset();
727 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyTrail));
728 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyLead));
729 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
730 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyTrail));
731 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyLead));
732 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
733 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
734 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
735 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
736 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
737 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
738 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
739 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
740 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
741 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
742
743 // Sot + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI
744 // As an example, use MAN + ZWJ + MAN + ZWJ + boy + ZWJ + BOY
745 machine.reset();
746 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyTrail));
747 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyLead));
748 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
749 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyTrail));
750 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(boyLead));
751 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
752 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
753 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
754 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
755 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
756 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
757 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
758 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
759
760 // others + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + VS + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_E MOJI
761 // As an example, use MAN + ZWJ + heart + VS + ZWJ + KISS + ZWJ + MAN
762 machine.reset();
763 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
764 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
765 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
766 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(killTrail));
767 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kissLead));
768 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
769 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
770 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
771 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
772 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
773 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
774 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
775 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
776 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
777
778 // others(surrogate pairs) + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + VS + ZWJ + ZWJ_EM OJI + ZWJ + ZWJ_EMOJI
779 // As an example, use MAN + ZWJ + heart + VS + ZWJ + KISS + ZWJ + MAN
780 machine.reset();
781 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
782 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
783 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
784 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(killTrail));
785 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kissLead));
786 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
787 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
788 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
789 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
790 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
791 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
792 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
793 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
794 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
795 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
796
797 // Sot + ZWJ_EMOJI + ZWJ + ZWJ_EMOJI + VS + ZWJ + ZWJ_EMOJI + ZWJ + ZWJ_EMOJ I
798 // As an example, use MAN + ZWJ + heart + VS + ZWJ + KISS + ZWJ + MAN
799 machine.reset();
800 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
801 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
802 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
803 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(killTrail));
804 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(kissLead));
805 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
806 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(vs16));
807 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
808 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(zwj));
809 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
810 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
811 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
812 EXPECT_EQ(-11, machine.finalizeAndGetBoundaryOffset());
813
814 // Followings are not edge cases but good to check.
815 // If leading character is not zwj, delete only ZWJ_EMOJI.
816 // other + ZWJ_EMOJI
817 machine.reset();
818 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
819 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
820 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
821 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
822
823 // other(surrogate pairs) + ZWJ_EMOJI
824 machine.reset();
825 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
826 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
827 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
828 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
829 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
830
831 // Sot + ZWJ_EMOJI
832 machine.reset();
833 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(heart));
834 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
835 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
836
837 // other + ZWJ_EMOJI(surrogate pairs)
838 machine.reset();
839 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
840 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
841 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(other));
842 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
843 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
844
845 // other(surrogate pairs) + ZWJ_EMOJI(surrogate pairs)
846 machine.reset();
847 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
848 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
849 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(otherTrail));
850 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(otherLead));
851 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
852 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
853
854 // Sot + ZWJ_EMOJI(surrogate pairs)
855 machine.reset();
856 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manTrail));
857 EXPECT_EQ(NeedMoreCodeUnit, machine.feedPrecedingCodeUnit(manLead));
858 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
859 EXPECT_EQ(-2, machine.finalizeAndGetBoundaryOffset());
860
861 // Followings are edge case.
862 // It is hard to list all edge case patterns. Check only over deleting by ZW J.
863 // any + ZWJ: should delete only last ZWJ.
864 machine.reset();
865 EXPECT_EQ(Finished, machine.feedPrecedingCodeUnit(zwj));
866 EXPECT_EQ(-1, machine.finalizeAndGetBoundaryOffset());
867 }
84 } // namespace blink 868 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698