OLD | NEW |
---|---|
(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 { | |
13 public: | |
14 DocumentMarkerListForTesting() {} | |
15 | |
16 DocumentMarker::MarkerType allowedMarkerType() const final { | |
17 return DocumentMarker::Composition; | |
18 } | |
19 | |
20 protected: | |
21 bool markerListIsSorted() const final { return false; } | |
22 }; | |
23 | |
24 class SortedDocumentMarkerListForTesting : public DocumentMarkerList { | |
25 public: | |
26 SortedDocumentMarkerListForTesting() {} | |
27 | |
28 DocumentMarker::MarkerType allowedMarkerType() const final { | |
29 return DocumentMarker::Composition; | |
30 } | |
31 | |
32 protected: | |
33 bool markerListIsSorted() const final { return true; } | |
34 }; | |
35 | |
36 class DocumentMarkerListTest : public ::testing::Test { | |
37 protected: | |
38 DocumentMarkerListTest() | |
39 : m_markerList(new DocumentMarkerListForTesting()), | |
40 m_sortedMarkerList(new SortedDocumentMarkerListForTesting()) {} | |
41 | |
42 DocumentMarker* createMarker(unsigned startOffset, unsigned endOffset) { | |
43 return new DocumentMarker(startOffset, endOffset, Color::black, false, | |
44 Color::black); | |
45 } | |
46 | |
47 Persistent<DocumentMarkerListForTesting> m_markerList; | |
48 Persistent<SortedDocumentMarkerListForTesting> m_sortedMarkerList; | |
49 }; | |
50 | |
51 TEST_F(DocumentMarkerListTest, | |
52 RemoveMarkersSortedDoRemovePartiallyOverlapping) { | |
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
| |
53 m_sortedMarkerList->add(createMarker(0, 5)); | |
54 m_sortedMarkerList->add(createMarker(10, 15)); | |
55 m_sortedMarkerList->add(createMarker(20, 25)); | |
56 m_sortedMarkerList->add(createMarker(30, 35)); | |
57 m_sortedMarkerList->add(createMarker(40, 45)); | |
58 | |
59 EXPECT_EQ(5u, m_sortedMarkerList->size()); | |
60 | |
61 // test no-op remove | |
62 EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, | |
63 m_sortedMarkerList->removeMarkers(100, 100, true)); | |
64 EXPECT_EQ(5u, m_sortedMarkerList->size()); | |
65 | |
66 // remove middle marker | |
67 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
68 m_sortedMarkerList->removeMarkers(20, 2, true)); | |
69 EXPECT_EQ(4u, m_sortedMarkerList->size()); | |
70 | |
71 EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); | |
72 EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); | |
73 | |
74 EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); | |
75 EXPECT_EQ(15u, m_sortedMarkerList->at(1)->endOffset()); | |
76 | |
77 EXPECT_EQ(30u, m_sortedMarkerList->at(2)->startOffset()); | |
78 EXPECT_EQ(35u, m_sortedMarkerList->at(2)->endOffset()); | |
79 | |
80 EXPECT_EQ(40u, m_sortedMarkerList->at(3)->startOffset()); | |
81 EXPECT_EQ(45u, m_sortedMarkerList->at(3)->endOffset()); | |
82 | |
83 // remove middle two markers | |
84 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
85 m_sortedMarkerList->removeMarkers(13, 19, true)); | |
86 EXPECT_EQ(2u, m_sortedMarkerList->size()); | |
87 | |
88 EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); | |
89 EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); | |
90 | |
91 EXPECT_EQ(40u, m_sortedMarkerList->at(1)->startOffset()); | |
92 EXPECT_EQ(45u, m_sortedMarkerList->at(1)->endOffset()); | |
93 } | |
94 | |
95 TEST_F(DocumentMarkerListTest, | |
96 RemoveMarkersUnsortedDoRemovePartiallyOverlapping) { | |
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
| |
97 m_markerList->add(createMarker(40, 45)); | |
98 m_markerList->add(createMarker(30, 35)); | |
99 m_markerList->add(createMarker(20, 25)); | |
100 m_markerList->add(createMarker(10, 15)); | |
101 m_markerList->add(createMarker(0, 5)); | |
102 | |
103 EXPECT_EQ(5u, m_markerList->size()); | |
104 | |
105 // test no-op remove | |
106 EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, | |
107 m_markerList->removeMarkers(100, 100, true)); | |
108 EXPECT_EQ(5u, m_markerList->size()); | |
109 | |
110 // remove middle marker | |
111 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
112 m_markerList->removeMarkers(20, 2, true)); | |
113 EXPECT_EQ(4u, m_markerList->size()); | |
114 | |
115 EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); | |
116 EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); | |
117 | |
118 EXPECT_EQ(30u, m_markerList->at(1)->startOffset()); | |
119 EXPECT_EQ(35u, m_markerList->at(1)->endOffset()); | |
120 | |
121 EXPECT_EQ(10u, m_markerList->at(2)->startOffset()); | |
122 EXPECT_EQ(15u, m_markerList->at(2)->endOffset()); | |
123 | |
124 EXPECT_EQ(0u, m_markerList->at(3)->startOffset()); | |
125 EXPECT_EQ(5u, m_markerList->at(3)->endOffset()); | |
126 | |
127 // remove middle two markers | |
128 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
129 m_markerList->removeMarkers(13, 19, true)); | |
130 EXPECT_EQ(2u, m_markerList->size()); | |
131 | |
132 EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); | |
133 EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); | |
134 | |
135 EXPECT_EQ(0u, m_markerList->at(1)->startOffset()); | |
136 EXPECT_EQ(5u, m_markerList->at(1)->endOffset()); | |
137 } | |
138 | |
139 TEST_F(DocumentMarkerListTest, | |
140 RemoveMarkersSortedDontRemovePartiallyOverlapping) { | |
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
| |
141 m_sortedMarkerList->add(createMarker(0, 5)); | |
142 m_sortedMarkerList->add(createMarker(10, 15)); | |
143 m_sortedMarkerList->add(createMarker(20, 25)); | |
144 m_sortedMarkerList->add(createMarker(30, 35)); | |
145 m_sortedMarkerList->add(createMarker(40, 45)); | |
146 | |
147 EXPECT_EQ(5u, m_sortedMarkerList->size()); | |
148 | |
149 // test no-op remove | |
150 EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, | |
151 m_sortedMarkerList->removeMarkers(100, 100, false)); | |
152 EXPECT_EQ(5u, m_sortedMarkerList->size()); | |
153 | |
154 // remove chunk from beginning of middle marker | |
155 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
156 m_sortedMarkerList->removeMarkers(20, 2, false)); | |
157 EXPECT_EQ(5u, m_sortedMarkerList->size()); | |
158 | |
159 EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); | |
160 EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); | |
161 | |
162 EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); | |
163 EXPECT_EQ(15u, m_sortedMarkerList->at(1)->endOffset()); | |
164 | |
165 EXPECT_EQ(22u, m_sortedMarkerList->at(2)->startOffset()); | |
166 EXPECT_EQ(25u, m_sortedMarkerList->at(2)->endOffset()); | |
167 | |
168 EXPECT_EQ(30u, m_sortedMarkerList->at(3)->startOffset()); | |
169 EXPECT_EQ(35u, m_sortedMarkerList->at(3)->endOffset()); | |
170 | |
171 EXPECT_EQ(40u, m_sortedMarkerList->at(4)->startOffset()); | |
172 EXPECT_EQ(45u, m_sortedMarkerList->at(4)->endOffset()); | |
173 | |
174 // remove chunk from end of second marker | |
175 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
176 m_sortedMarkerList->removeMarkers(13, 2, false)); | |
177 EXPECT_EQ(5u, m_sortedMarkerList->size()); | |
178 | |
179 EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); | |
180 EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); | |
181 | |
182 EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); | |
183 EXPECT_EQ(13u, m_sortedMarkerList->at(1)->endOffset()); | |
184 | |
185 EXPECT_EQ(22u, m_sortedMarkerList->at(2)->startOffset()); | |
186 EXPECT_EQ(25u, m_sortedMarkerList->at(2)->endOffset()); | |
187 | |
188 EXPECT_EQ(30u, m_sortedMarkerList->at(3)->startOffset()); | |
189 EXPECT_EQ(35u, m_sortedMarkerList->at(3)->endOffset()); | |
190 | |
191 EXPECT_EQ(40u, m_sortedMarkerList->at(4)->startOffset()); | |
192 EXPECT_EQ(45u, m_sortedMarkerList->at(4)->endOffset()); | |
193 | |
194 // remove chunk from middle of fourth marker | |
195 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
196 m_sortedMarkerList->removeMarkers(31, 1, false)); | |
197 EXPECT_EQ(6u, m_sortedMarkerList->size()); | |
198 | |
199 EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); | |
200 EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); | |
201 | |
202 EXPECT_EQ(10u, m_sortedMarkerList->at(1)->startOffset()); | |
203 EXPECT_EQ(13u, m_sortedMarkerList->at(1)->endOffset()); | |
204 | |
205 EXPECT_EQ(22u, m_sortedMarkerList->at(2)->startOffset()); | |
206 EXPECT_EQ(25u, m_sortedMarkerList->at(2)->endOffset()); | |
207 | |
208 EXPECT_EQ(30u, m_sortedMarkerList->at(3)->startOffset()); | |
209 EXPECT_EQ(31u, m_sortedMarkerList->at(3)->endOffset()); | |
210 | |
211 EXPECT_EQ(32u, m_sortedMarkerList->at(4)->startOffset()); | |
212 EXPECT_EQ(35u, m_sortedMarkerList->at(4)->endOffset()); | |
213 | |
214 EXPECT_EQ(40u, m_sortedMarkerList->at(5)->startOffset()); | |
215 EXPECT_EQ(45u, m_sortedMarkerList->at(5)->endOffset()); | |
216 | |
217 // remove middle four markers | |
218 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
219 m_sortedMarkerList->removeMarkers(10, 25, false)); | |
220 EXPECT_EQ(2u, m_sortedMarkerList->size()); | |
221 | |
222 EXPECT_EQ(0u, m_sortedMarkerList->at(0)->startOffset()); | |
223 EXPECT_EQ(5u, m_sortedMarkerList->at(0)->endOffset()); | |
224 | |
225 EXPECT_EQ(40u, m_sortedMarkerList->at(1)->startOffset()); | |
226 EXPECT_EQ(45u, m_sortedMarkerList->at(1)->endOffset()); | |
227 } | |
228 | |
229 TEST_F(DocumentMarkerListTest, | |
230 RemoveMarkersUnsortedDontRemovePartiallyOverlapping) { | |
Xiaocheng
2017/03/27 22:38:20
Could you break it into independent test cases?
| |
231 m_markerList->add(createMarker(40, 45)); | |
232 m_markerList->add(createMarker(30, 35)); | |
233 m_markerList->add(createMarker(20, 25)); | |
234 m_markerList->add(createMarker(10, 15)); | |
235 m_markerList->add(createMarker(0, 5)); | |
236 | |
237 EXPECT_EQ(5u, m_markerList->size()); | |
238 | |
239 // test no-op remove | |
240 EXPECT_EQ(DocumentMarkerList::DidNotRemoveMarker, | |
241 m_markerList->removeMarkers(100, 100, false)); | |
242 EXPECT_EQ(5u, m_markerList->size()); | |
243 | |
244 // remove chunk from beginning of middle marker | |
245 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
246 m_markerList->removeMarkers(20, 2, false)); | |
247 EXPECT_EQ(5u, m_markerList->size()); | |
248 | |
249 EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); | |
250 EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); | |
251 | |
252 EXPECT_EQ(30u, m_markerList->at(1)->startOffset()); | |
253 EXPECT_EQ(35u, m_markerList->at(1)->endOffset()); | |
254 | |
255 EXPECT_EQ(10u, m_markerList->at(2)->startOffset()); | |
256 EXPECT_EQ(15u, m_markerList->at(2)->endOffset()); | |
257 | |
258 EXPECT_EQ(0u, m_markerList->at(3)->startOffset()); | |
259 EXPECT_EQ(5u, m_markerList->at(3)->endOffset()); | |
260 | |
261 EXPECT_EQ(22u, m_markerList->at(4)->startOffset()); | |
262 EXPECT_EQ(25u, m_markerList->at(4)->endOffset()); | |
263 | |
264 // remove chunk from end of middle marker | |
265 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
266 m_markerList->removeMarkers(13, 2, false)); | |
267 EXPECT_EQ(5u, m_markerList->size()); | |
268 | |
269 EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); | |
270 EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); | |
271 | |
272 EXPECT_EQ(30u, m_markerList->at(1)->startOffset()); | |
273 EXPECT_EQ(35u, m_markerList->at(1)->endOffset()); | |
274 | |
275 EXPECT_EQ(0u, m_markerList->at(2)->startOffset()); | |
276 EXPECT_EQ(5u, m_markerList->at(2)->endOffset()); | |
277 | |
278 EXPECT_EQ(22u, m_markerList->at(3)->startOffset()); | |
279 EXPECT_EQ(25u, m_markerList->at(3)->endOffset()); | |
280 | |
281 EXPECT_EQ(10u, m_markerList->at(4)->startOffset()); | |
282 EXPECT_EQ(13u, m_markerList->at(4)->endOffset()); | |
283 | |
284 // remove chunk from middle of second marker | |
285 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
286 m_markerList->removeMarkers(31, 1, false)); | |
287 EXPECT_EQ(6u, m_markerList->size()); | |
288 | |
289 EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); | |
290 EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); | |
291 | |
292 EXPECT_EQ(0u, m_markerList->at(1)->startOffset()); | |
293 EXPECT_EQ(5u, m_markerList->at(1)->endOffset()); | |
294 | |
295 EXPECT_EQ(22u, m_markerList->at(2)->startOffset()); | |
296 EXPECT_EQ(25u, m_markerList->at(2)->endOffset()); | |
297 | |
298 EXPECT_EQ(10u, m_markerList->at(3)->startOffset()); | |
299 EXPECT_EQ(13u, m_markerList->at(3)->endOffset()); | |
300 | |
301 EXPECT_EQ(30u, m_markerList->at(4)->startOffset()); | |
302 EXPECT_EQ(31u, m_markerList->at(4)->endOffset()); | |
303 | |
304 EXPECT_EQ(32u, m_markerList->at(5)->startOffset()); | |
305 EXPECT_EQ(35u, m_markerList->at(5)->endOffset()); | |
306 | |
307 // remove all markers except 0 to 5 and 40 to 45 | |
308 EXPECT_EQ(DocumentMarkerList::DidRemoveMarker, | |
309 m_markerList->removeMarkers(5, 35, false)); | |
310 EXPECT_EQ(2u, m_markerList->size()); | |
311 | |
312 EXPECT_EQ(40u, m_markerList->at(0)->startOffset()); | |
313 EXPECT_EQ(45u, m_markerList->at(0)->endOffset()); | |
314 | |
315 EXPECT_EQ(0u, m_markerList->at(1)->startOffset()); | |
316 EXPECT_EQ(5u, m_markerList->at(1)->endOffset()); | |
317 } | |
318 | |
319 TEST_F(DocumentMarkerListTest, ShiftMarkersNoChange) { | |
320 m_markerList->add(createMarker(0, 5)); | |
321 | |
322 EXPECT_EQ(false, m_markerList->shiftMarkers(10, 0, 5)); | |
Xiaocheng
2017/03/27 22:38:20
The result is an enum.
| |
323 EXPECT_EQ(1u, m_markerList->size()); | |
324 | |
325 EXPECT_EQ(0u, m_markerList->at(0)->startOffset()); | |
326 EXPECT_EQ(5u, m_markerList->at(0)->endOffset()); | |
327 } | |
328 | |
329 TEST_F(DocumentMarkerListTest, ShiftMarkersMarkerShifted) { | |
330 m_markerList->add(createMarker(0, 5)); | |
331 | |
332 EXPECT_EQ(true, m_markerList->shiftMarkers(0, 0, 5)); | |
Xiaocheng
2017/03/27 22:38:20
The result is an enum.
| |
333 EXPECT_EQ(1u, m_markerList->size()); | |
334 | |
335 EXPECT_EQ(5u, m_markerList->at(0)->startOffset()); | |
336 EXPECT_EQ(10u, m_markerList->at(0)->endOffset()); | |
337 } | |
338 | |
339 TEST_F(DocumentMarkerListTest, ShiftMarkersMarkerRemoved) { | |
340 m_markerList->add(createMarker(0, 5)); | |
341 | |
342 EXPECT_EQ(true, m_markerList->shiftMarkers(0, 5, 0)); | |
343 EXPECT_EQ(0u, m_markerList->size()); | |
344 } | |
345 | |
346 TEST_F(DocumentMarkerListTest, CopyMarkers) { | |
347 m_markerList->add(createMarker(1, 2)); | |
348 m_markerList->add(createMarker(3, 4)); | |
349 m_markerList->add(createMarker(5, 6)); | |
350 m_markerList->add(createMarker(7, 8)); | |
351 | |
352 DocumentMarkerListForTesting* dstList = new DocumentMarkerListForTesting(); | |
353 | |
354 // Copy all markers that intersect the range 2 through 5, i.e. the first three | |
355 m_markerList->copyMarkers(2, 4, dstList, -1); | |
Xiaocheng
2017/03/27 22:38:20
Please check return value.
| |
356 | |
357 EXPECT_EQ(3u, dstList->size()); | |
358 | |
359 // Markers are clamped to the range 2 through 5, so the first and third | |
360 // markers are now length 0 | |
361 // TODO(rlanday): should we change this behavior to remove the zero-length | |
362 // markers? | |
363 EXPECT_EQ(1u, dstList->at(0)->startOffset()); | |
364 EXPECT_EQ(1u, dstList->at(0)->endOffset()); | |
365 | |
366 EXPECT_EQ(2u, dstList->at(1)->startOffset()); | |
367 EXPECT_EQ(3u, dstList->at(1)->endOffset()); | |
368 | |
369 EXPECT_EQ(4u, dstList->at(2)->startOffset()); | |
370 EXPECT_EQ(4u, dstList->at(2)->endOffset()); | |
371 } | |
372 | |
373 } // namespace blink | |
OLD | NEW |