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

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

Issue 2773883003: Add CompositionMarkerList in preparation for DocumentMarkerController refactor (Closed)
Patch Set: Make requested changes, refactor tests Created 3 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "core/editing/markers/DocumentMarkerList.h"
6
7 #include "platform/heap/Handle.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace blink {
11
12 class DocumentMarkerListForTesting : public DocumentMarkerList {
Xiaocheng 2017/03/25 00:05:35 This is not dummy enough. Let's have: class DMLFo
13 public:
14 DocumentMarkerListForTesting() : m_markersAreSorted(true) {}
15
16 DocumentMarker::MarkerType allowedMarkerType() const final {
17 return DocumentMarker::Composition;
18 }
19
20 void push_back(DocumentMarker* marker) final {
21 if (!m_markers.isEmpty() &&
22 m_markers.back()->endOffset() > marker->startOffset())
23 m_markersAreSorted = false;
24
25 m_markers.push_back(marker);
26 }
27
28 void clear() final {
29 m_markersAreSorted = true;
30 DocumentMarkerList::clear();
31 }
32
33 protected:
34 bool markerListIsSorted() const final { return m_markersAreSorted; }
35
36 private:
37 bool m_markersAreSorted;
38 };
39
40 class DocumentMarkerListTest : public ::testing::Test {
41 protected:
42 DocumentMarkerListTest() : m_markerList(new DocumentMarkerListForTesting()) {}
43
44 DocumentMarker* createMarker(unsigned startOffset, unsigned endOffset) {
45 return new DocumentMarker(startOffset, endOffset, Color::black, false,
46 Color::black);
47 }
48
49 Persistent<DocumentMarkerListForTesting> m_markerList;
50 };
51
52 TEST_F(DocumentMarkerListTest,
53 RemoveMarkersSortedDoRemovePartiallyOverlapping) {
54 m_markerList->push_back(createMarker(0, 5));
55 m_markerList->push_back(createMarker(10, 15));
56 m_markerList->push_back(createMarker(20, 25));
57 m_markerList->push_back(createMarker(30, 35));
58 m_markerList->push_back(createMarker(40, 45));
59
60 EXPECT_EQ(5u, m_markerList->size());
61
62 bool didRemoveMarker = false;
63
64 // test no-op remove
65 m_markerList->removeMarkers(100, 100, true, &didRemoveMarker);
66 EXPECT_EQ(didRemoveMarker, false);
67 EXPECT_EQ(5u, m_markerList->size());
68
69 // remove middle marker
70 m_markerList->removeMarkers(20, 2, true, &didRemoveMarker);
71 EXPECT_EQ(didRemoveMarker, true);
72 EXPECT_EQ(4u, m_markerList->size());
73
74 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
75 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
76
77 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
78 EXPECT_EQ(15u, m_markerList->at(1)->endOffset());
79
80 EXPECT_EQ(30u, m_markerList->at(2)->startOffset());
81 EXPECT_EQ(35u, m_markerList->at(2)->endOffset());
82
83 EXPECT_EQ(40u, m_markerList->at(3)->startOffset());
84 EXPECT_EQ(45u, m_markerList->at(3)->endOffset());
85
86 // remove middle two markers
87 didRemoveMarker = false;
88 m_markerList->removeMarkers(13, 19, true, &didRemoveMarker);
89 EXPECT_EQ(didRemoveMarker, true);
90 EXPECT_EQ(2u, m_markerList->size());
91
92 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
93 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
94
95 EXPECT_EQ(40u, m_markerList->at(1)->startOffset());
96 EXPECT_EQ(45u, m_markerList->at(1)->endOffset());
97 }
98
99 TEST_F(DocumentMarkerListTest,
100 RemoveMarkersUnsortedDoRemovePartiallyOverlapping) {
101 m_markerList->push_back(createMarker(40, 45));
102 m_markerList->push_back(createMarker(30, 35));
103 m_markerList->push_back(createMarker(20, 25));
104 m_markerList->push_back(createMarker(10, 15));
105 m_markerList->push_back(createMarker(0, 5));
106
107 EXPECT_EQ(5u, m_markerList->size());
108
109 bool didRemoveMarker = false;
110
111 // test no-op remove
112 m_markerList->removeMarkers(100, 100, true, &didRemoveMarker);
113 EXPECT_EQ(didRemoveMarker, false);
114 EXPECT_EQ(5u, m_markerList->size());
115
116 // remove middle marker
117 m_markerList->removeMarkers(20, 2, true, &didRemoveMarker);
118 EXPECT_EQ(didRemoveMarker, true);
119 EXPECT_EQ(4u, m_markerList->size());
120
121 EXPECT_EQ(40u, m_markerList->at(0)->startOffset());
122 EXPECT_EQ(45u, m_markerList->at(0)->endOffset());
123
124 EXPECT_EQ(30u, m_markerList->at(1)->startOffset());
125 EXPECT_EQ(35u, m_markerList->at(1)->endOffset());
126
127 EXPECT_EQ(10u, m_markerList->at(2)->startOffset());
128 EXPECT_EQ(15u, m_markerList->at(2)->endOffset());
129
130 EXPECT_EQ(0u, m_markerList->at(3)->startOffset());
131 EXPECT_EQ(5u, m_markerList->at(3)->endOffset());
132
133 // remove middle two markers
134 didRemoveMarker = false;
135 m_markerList->removeMarkers(13, 19, true, &didRemoveMarker);
136 EXPECT_EQ(didRemoveMarker, true);
137 EXPECT_EQ(2u, m_markerList->size());
138
139 EXPECT_EQ(40u, m_markerList->at(0)->startOffset());
140 EXPECT_EQ(45u, m_markerList->at(0)->endOffset());
141
142 EXPECT_EQ(0u, m_markerList->at(1)->startOffset());
143 EXPECT_EQ(5u, m_markerList->at(1)->endOffset());
144 }
145
146 TEST_F(DocumentMarkerListTest,
147 RemoveMarkersSortedDontRemovePartiallyOverlapping) {
148 m_markerList->push_back(createMarker(0, 5));
149 m_markerList->push_back(createMarker(10, 15));
150 m_markerList->push_back(createMarker(20, 25));
151 m_markerList->push_back(createMarker(30, 35));
152 m_markerList->push_back(createMarker(40, 45));
153
154 EXPECT_EQ(5u, m_markerList->size());
155
156 bool didRemoveMarker = false;
157
158 // test no-op remove
159 m_markerList->removeMarkers(100, 100, false, &didRemoveMarker);
160 EXPECT_EQ(didRemoveMarker, false);
161 EXPECT_EQ(5u, m_markerList->size());
162
163 // remove chunk from beginning of middle marker
164 m_markerList->removeMarkers(20, 2, false, &didRemoveMarker);
165 EXPECT_EQ(didRemoveMarker, true);
166 EXPECT_EQ(5u, m_markerList->size());
167
168 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
169 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
170
171 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
172 EXPECT_EQ(15u, m_markerList->at(1)->endOffset());
173
174 EXPECT_EQ(22u, m_markerList->at(2)->startOffset());
175 EXPECT_EQ(25u, m_markerList->at(2)->endOffset());
176
177 EXPECT_EQ(30u, m_markerList->at(3)->startOffset());
178 EXPECT_EQ(35u, m_markerList->at(3)->endOffset());
179
180 EXPECT_EQ(40u, m_markerList->at(4)->startOffset());
181 EXPECT_EQ(45u, m_markerList->at(4)->endOffset());
182
183 // remove chunk from end of second marker
184 didRemoveMarker = false;
185 m_markerList->removeMarkers(13, 2, false, &didRemoveMarker);
186 EXPECT_EQ(didRemoveMarker, true);
187 EXPECT_EQ(5u, m_markerList->size());
188
189 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
190 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
191
192 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
193 EXPECT_EQ(13u, m_markerList->at(1)->endOffset());
194
195 EXPECT_EQ(22u, m_markerList->at(2)->startOffset());
196 EXPECT_EQ(25u, m_markerList->at(2)->endOffset());
197
198 EXPECT_EQ(30u, m_markerList->at(3)->startOffset());
199 EXPECT_EQ(35u, m_markerList->at(3)->endOffset());
200
201 EXPECT_EQ(40u, m_markerList->at(4)->startOffset());
202 EXPECT_EQ(45u, m_markerList->at(4)->endOffset());
203
204 // remove chunk from middle of fourth marker
205 didRemoveMarker = false;
206 m_markerList->removeMarkers(31, 1, false, &didRemoveMarker);
207 EXPECT_EQ(didRemoveMarker, true);
208 EXPECT_EQ(6u, m_markerList->size());
209
210 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
211 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
212
213 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
214 EXPECT_EQ(13u, m_markerList->at(1)->endOffset());
215
216 EXPECT_EQ(22u, m_markerList->at(2)->startOffset());
217 EXPECT_EQ(25u, m_markerList->at(2)->endOffset());
218
219 EXPECT_EQ(30u, m_markerList->at(3)->startOffset());
220 EXPECT_EQ(31u, m_markerList->at(3)->endOffset());
221
222 EXPECT_EQ(32u, m_markerList->at(4)->startOffset());
223 EXPECT_EQ(35u, m_markerList->at(4)->endOffset());
224
225 EXPECT_EQ(40u, m_markerList->at(5)->startOffset());
226 EXPECT_EQ(45u, m_markerList->at(5)->endOffset());
227
228 // remove middle four markers
229 didRemoveMarker = false;
230 m_markerList->removeMarkers(10, 25, false, &didRemoveMarker);
231 EXPECT_EQ(didRemoveMarker, true);
232 EXPECT_EQ(2u, m_markerList->size());
233
234 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
235 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
236
237 EXPECT_EQ(40u, m_markerList->at(1)->startOffset());
238 EXPECT_EQ(45u, m_markerList->at(1)->endOffset());
239 }
240
241 TEST_F(DocumentMarkerListTest,
242 RemoveMarkersUnsortedDontRemovePartiallyOverlapping) {
243 m_markerList->push_back(createMarker(40, 45));
244 m_markerList->push_back(createMarker(30, 35));
245 m_markerList->push_back(createMarker(20, 25));
246 m_markerList->push_back(createMarker(10, 15));
247 m_markerList->push_back(createMarker(0, 5));
248
249 EXPECT_EQ(5u, m_markerList->size());
250
251 bool didRemoveMarker = false;
252
253 // test no-op remove
254 m_markerList->removeMarkers(100, 100, false, &didRemoveMarker);
255 EXPECT_EQ(didRemoveMarker, false);
256 EXPECT_EQ(5u, m_markerList->size());
257
258 // remove chunk from beginning of middle marker
259 m_markerList->removeMarkers(20, 2, false, &didRemoveMarker);
260 EXPECT_EQ(didRemoveMarker, true);
261 EXPECT_EQ(5u, m_markerList->size());
262
263 EXPECT_EQ(40u, m_markerList->at(0)->startOffset());
264 EXPECT_EQ(45u, m_markerList->at(0)->endOffset());
265
266 EXPECT_EQ(30u, m_markerList->at(1)->startOffset());
267 EXPECT_EQ(35u, m_markerList->at(1)->endOffset());
268
269 EXPECT_EQ(10u, m_markerList->at(2)->startOffset());
270 EXPECT_EQ(15u, m_markerList->at(2)->endOffset());
271
272 EXPECT_EQ(0u, m_markerList->at(3)->startOffset());
273 EXPECT_EQ(5u, m_markerList->at(3)->endOffset());
274
275 EXPECT_EQ(22u, m_markerList->at(4)->startOffset());
276 EXPECT_EQ(25u, m_markerList->at(4)->endOffset());
277
278 // remove chunk from end of middle marker
279 didRemoveMarker = false;
280 m_markerList->removeMarkers(13, 2, false, &didRemoveMarker);
281 EXPECT_EQ(didRemoveMarker, true);
282 EXPECT_EQ(5u, m_markerList->size());
283
284 EXPECT_EQ(40u, m_markerList->at(0)->startOffset());
285 EXPECT_EQ(45u, m_markerList->at(0)->endOffset());
286
287 EXPECT_EQ(30u, m_markerList->at(1)->startOffset());
288 EXPECT_EQ(35u, m_markerList->at(1)->endOffset());
289
290 EXPECT_EQ(0u, m_markerList->at(2)->startOffset());
291 EXPECT_EQ(5u, m_markerList->at(2)->endOffset());
292
293 EXPECT_EQ(22u, m_markerList->at(3)->startOffset());
294 EXPECT_EQ(25u, m_markerList->at(3)->endOffset());
295
296 EXPECT_EQ(10u, m_markerList->at(4)->startOffset());
297 EXPECT_EQ(13u, m_markerList->at(4)->endOffset());
298
299 // remove chunk from middle of second marker
300 didRemoveMarker = false;
301 m_markerList->removeMarkers(31, 1, false, &didRemoveMarker);
302 EXPECT_EQ(didRemoveMarker, true);
303 EXPECT_EQ(6u, m_markerList->size());
304
305 EXPECT_EQ(40u, m_markerList->at(0)->startOffset());
306 EXPECT_EQ(45u, m_markerList->at(0)->endOffset());
307
308 EXPECT_EQ(0u, m_markerList->at(1)->startOffset());
309 EXPECT_EQ(5u, m_markerList->at(1)->endOffset());
310
311 EXPECT_EQ(22u, m_markerList->at(2)->startOffset());
312 EXPECT_EQ(25u, m_markerList->at(2)->endOffset());
313
314 EXPECT_EQ(10u, m_markerList->at(3)->startOffset());
315 EXPECT_EQ(13u, m_markerList->at(3)->endOffset());
316
317 EXPECT_EQ(30u, m_markerList->at(4)->startOffset());
318 EXPECT_EQ(31u, m_markerList->at(4)->endOffset());
319
320 EXPECT_EQ(32u, m_markerList->at(5)->startOffset());
321 EXPECT_EQ(35u, m_markerList->at(5)->endOffset());
322
323 // remove all markers except 0 to 5 and 40 to 45
324 didRemoveMarker = false;
325 m_markerList->removeMarkers(5, 35, false, &didRemoveMarker);
326 EXPECT_EQ(didRemoveMarker, true);
327 EXPECT_EQ(2u, m_markerList->size());
328
329 EXPECT_EQ(40u, m_markerList->at(0)->startOffset());
330 EXPECT_EQ(45u, m_markerList->at(0)->endOffset());
331
332 EXPECT_EQ(0u, m_markerList->at(1)->startOffset());
333 EXPECT_EQ(5u, m_markerList->at(1)->endOffset());
334 }
335
336 TEST_F(DocumentMarkerListTest, ShiftMarkersDeletions) {
337 m_markerList->push_back(createMarker(0, 5));
338 m_markerList->push_back(createMarker(10, 15));
339 m_markerList->push_back(createMarker(20, 25));
340 m_markerList->push_back(createMarker(30, 35));
341 m_markerList->push_back(createMarker(40, 45));
342 // delete end of second marker, entirety of third marker, and start of fourth
343 // marker
344 m_markerList->shiftMarkers(13, 19, 0);
345
346 EXPECT_EQ(4u, m_markerList->size());
347
348 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
349 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
350
351 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
352 EXPECT_EQ(13u, m_markerList->at(1)->endOffset());
353
354 EXPECT_EQ(13u, m_markerList->at(2)->startOffset());
355 EXPECT_EQ(16u, m_markerList->at(2)->endOffset());
356
357 EXPECT_EQ(21u, m_markerList->at(3)->startOffset());
358 EXPECT_EQ(26u, m_markerList->at(3)->endOffset());
359
360 m_markerList->clear();
361 m_markerList->push_back(createMarker(5, 10));
362 // delete exactly on a marker
363 m_markerList->shiftMarkers(5, 5, 0);
364 EXPECT_EQ(0u, m_markerList->size());
365
366 m_markerList->push_back(createMarker(5, 10));
367 // delete middle of marker
368 m_markerList->shiftMarkers(6, 3, 0);
369 EXPECT_EQ(1u, m_markerList->size());
370 EXPECT_EQ(5u, m_markerList->at(0)->startOffset());
371 EXPECT_EQ(7u, m_markerList->at(0)->endOffset());
372 }
373
374 TEST_F(DocumentMarkerListTest, ShiftMarkersInsertions) {
375 m_markerList->push_back(createMarker(0, 5));
376 m_markerList->push_back(createMarker(10, 15));
377 m_markerList->push_back(createMarker(20, 25));
378 // insert in middle of second marker
379 m_markerList->shiftMarkers(12, 0, 5);
380
381 EXPECT_EQ(3u, m_markerList->size());
382
383 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
384 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
385
386 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
387 EXPECT_EQ(20u, m_markerList->at(1)->endOffset());
388
389 EXPECT_EQ(25u, m_markerList->at(2)->startOffset());
390 EXPECT_EQ(30u, m_markerList->at(2)->endOffset());
391
392 // insert right after first marker
393 m_markerList->shiftMarkers(5, 0, 5);
394
395 EXPECT_EQ(3u, m_markerList->size());
396
397 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
398 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
399
400 EXPECT_EQ(15u, m_markerList->at(1)->startOffset());
401 EXPECT_EQ(25u, m_markerList->at(1)->endOffset());
402
403 EXPECT_EQ(30u, m_markerList->at(2)->startOffset());
404 EXPECT_EQ(35u, m_markerList->at(2)->endOffset());
405
406 // insert right before second marker
407 m_markerList->shiftMarkers(15, 0, 5);
408
409 EXPECT_EQ(3u, m_markerList->size());
410
411 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
412 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
413
414 EXPECT_EQ(20u, m_markerList->at(1)->startOffset());
415 EXPECT_EQ(30u, m_markerList->at(1)->endOffset());
416
417 EXPECT_EQ(35u, m_markerList->at(2)->startOffset());
418 EXPECT_EQ(40u, m_markerList->at(2)->endOffset());
419 }
420
421 TEST_F(DocumentMarkerListTest, ShiftMarkersReplacements) {
422 m_markerList->push_back(createMarker(0, 5));
423 m_markerList->push_back(createMarker(10, 15));
424 m_markerList->push_back(createMarker(20, 25));
425 m_markerList->push_back(createMarker(30, 35));
426 m_markerList->push_back(createMarker(40, 45));
427
428 // Replace entirely of third marker and portions of second and fourth
429 m_markerList->shiftMarkers(13, 19, 1);
430
431 EXPECT_EQ(4u, m_markerList->size());
432
433 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
434 EXPECT_EQ(5u, m_markerList->at(0)->endOffset());
435
436 EXPECT_EQ(10u, m_markerList->at(1)->startOffset());
437 EXPECT_EQ(13u, m_markerList->at(1)->endOffset());
438
439 EXPECT_EQ(14u, m_markerList->at(2)->startOffset());
440 EXPECT_EQ(17u, m_markerList->at(2)->endOffset());
441
442 EXPECT_EQ(22u, m_markerList->at(3)->startOffset());
443 EXPECT_EQ(27u, m_markerList->at(3)->endOffset());
444
445 // Replace end of first marker
446 m_markerList->shiftMarkers(3, 2, 1);
447
448 EXPECT_EQ(4u, m_markerList->size());
449
450 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
451 EXPECT_EQ(4u, m_markerList->at(0)->endOffset());
452
453 EXPECT_EQ(9u, m_markerList->at(1)->startOffset());
454 EXPECT_EQ(12u, m_markerList->at(1)->endOffset());
455
456 EXPECT_EQ(13u, m_markerList->at(2)->startOffset());
457 EXPECT_EQ(16u, m_markerList->at(2)->endOffset());
458
459 EXPECT_EQ(21u, m_markerList->at(3)->startOffset());
460 EXPECT_EQ(26u, m_markerList->at(3)->endOffset());
461
462 // Replace beginning of fourth marker
463 m_markerList->shiftMarkers(13, 2, 1);
464
465 EXPECT_EQ(4u, m_markerList->size());
466
467 EXPECT_EQ(0u, m_markerList->at(0)->startOffset());
468 EXPECT_EQ(4u, m_markerList->at(0)->endOffset());
469
470 EXPECT_EQ(9u, m_markerList->at(1)->startOffset());
471 EXPECT_EQ(12u, m_markerList->at(1)->endOffset());
472
473 EXPECT_EQ(13u, m_markerList->at(2)->startOffset());
474 EXPECT_EQ(15u, m_markerList->at(2)->endOffset());
475
476 EXPECT_EQ(20u, m_markerList->at(3)->startOffset());
477 EXPECT_EQ(25u, m_markerList->at(3)->endOffset());
478 }
479
480 TEST_F(DocumentMarkerListTest, CopyMarkers) {
481 m_markerList->push_back(createMarker(1, 2));
482 m_markerList->push_back(createMarker(3, 4));
483 m_markerList->push_back(createMarker(5, 6));
484 m_markerList->push_back(createMarker(7, 8));
485
486 DocumentMarkerListForTesting* dstList = new DocumentMarkerListForTesting();
487
488 // Copy all markers that intersect the range 2 through 5, i.e. the first three
489 m_markerList->copyMarkers(2, 4, dstList, -1);
490
491 EXPECT_EQ(3u, dstList->size());
492
493 // Markers are clamped to the range 2 through 5, so the first and third
494 // markers are now length 0
Xiaocheng 2017/03/25 00:05:35 Though this matches the current behavior, it doesn
495 EXPECT_EQ(1u, dstList->at(0)->startOffset());
496 EXPECT_EQ(1u, dstList->at(0)->endOffset());
497
498 EXPECT_EQ(2u, dstList->at(1)->startOffset());
499 EXPECT_EQ(3u, dstList->at(1)->endOffset());
500
501 EXPECT_EQ(4u, dstList->at(2)->startOffset());
502 EXPECT_EQ(4u, dstList->at(2)->endOffset());
503 }
504
505 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698