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

Side by Side Diff: Source/wtf/DequeTest.cpp

Issue 390983010: Fix Deque.swap for deques with inline capacity Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Use more fullnesses in test to improve coverage Created 6 years, 5 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 23 matching lines...) Expand all
34 34
35 namespace { 35 namespace {
36 36
37 TEST(DequeTest, Basic) 37 TEST(DequeTest, Basic)
38 { 38 {
39 Deque<int> intDeque; 39 Deque<int> intDeque;
40 EXPECT_TRUE(intDeque.isEmpty()); 40 EXPECT_TRUE(intDeque.isEmpty());
41 EXPECT_EQ(0ul, intDeque.size()); 41 EXPECT_EQ(0ul, intDeque.size());
42 } 42 }
43 43
44 void checkNumberSequence(Deque<int>& deque, int from, int to, bool increment) 44 template<size_t inlineCapacity>
45 void checkNumberSequence(Deque<int, inlineCapacity>& deque, int from, int to, bo ol increment)
45 { 46 {
46 Deque<int>::iterator it = increment ? deque.begin() : deque.end(); 47 typename Deque<int, inlineCapacity>::iterator it = increment ? deque.begin() : deque.end();
47 int step = from < to ? 1 : -1; 48 int step = from < to ? 1 : -1;
48 for (int i = from; i != to + step; i += step) { 49 for (int i = from; i != to + step; i += step) {
49 if (!increment) 50 if (!increment)
50 --it; 51 --it;
51 52
52 EXPECT_EQ(i, *it); 53 EXPECT_EQ(i, *it);
53 54
54 if (increment) 55 if (increment)
55 ++it; 56 ++it;
56 } 57 }
57 EXPECT_EQ(increment ? deque.end() : deque.begin(), it); 58 EXPECT_EQ(increment ? deque.end() : deque.begin(), it);
58 } 59 }
59 60
60 void checkNumberSequenceReverse(Deque<int>& deque, int from, int to, bool increm ent) 61 template<size_t inlineCapacity>
62 void checkNumberSequenceReverse(Deque<int, inlineCapacity>& deque, int from, int to, bool increment)
61 { 63 {
62 Deque<int>::reverse_iterator it = increment ? deque.rbegin() : deque.rend(); 64 typename Deque<int, inlineCapacity>::reverse_iterator it = increment ? deque .rbegin() : deque.rend();
63 int step = from < to ? 1 : -1; 65 int step = from < to ? 1 : -1;
64 for (int i = from; i != to + step; i += step) { 66 for (int i = from; i != to + step; i += step) {
65 if (!increment) 67 if (!increment)
66 --it; 68 --it;
67 69
68 EXPECT_EQ(i, *it); 70 EXPECT_EQ(i, *it);
69 71
70 if (increment) 72 if (increment)
71 ++it; 73 ++it;
72 } 74 }
73 EXPECT_EQ(increment ? deque.rend() : deque.rbegin(), it); 75 EXPECT_EQ(increment ? deque.rend() : deque.rbegin(), it);
74 } 76 }
75 77
76 TEST(DequeTest, Reverse) 78 template<size_t inlineCapacity>
79 void reverseTest()
77 { 80 {
78 Deque<int> intDeque; 81 Deque<int, inlineCapacity> intDeque;
79 intDeque.append(10); 82 intDeque.append(10);
80 intDeque.append(11); 83 intDeque.append(11);
81 intDeque.append(12); 84 intDeque.append(12);
82 intDeque.append(13); 85 intDeque.append(13);
83 86
84 checkNumberSequence(intDeque, 10, 13, true); 87 checkNumberSequence(intDeque, 10, 13, true);
85 checkNumberSequence(intDeque, 13, 10, false); 88 checkNumberSequence(intDeque, 13, 10, false);
86 checkNumberSequenceReverse(intDeque, 13, 10, true); 89 checkNumberSequenceReverse(intDeque, 13, 10, true);
87 checkNumberSequenceReverse(intDeque, 10, 13, false); 90 checkNumberSequenceReverse(intDeque, 10, 13, false);
88 91
(...skipping 13 matching lines...) Expand all
102 checkNumberSequenceReverse(intDeque, 199, 11, true); 105 checkNumberSequenceReverse(intDeque, 199, 11, true);
103 checkNumberSequenceReverse(intDeque, 11, 199, false); 106 checkNumberSequenceReverse(intDeque, 11, 199, false);
104 107
105 for (int i = 0; i < 180; ++i) 108 for (int i = 0; i < 180; ++i)
106 EXPECT_EQ(i + 11, intDeque.takeFirst()); 109 EXPECT_EQ(i + 11, intDeque.takeFirst());
107 checkNumberSequence(intDeque, 191, 199, true); 110 checkNumberSequence(intDeque, 191, 199, true);
108 checkNumberSequence(intDeque, 199, 191, false); 111 checkNumberSequence(intDeque, 199, 191, false);
109 checkNumberSequenceReverse(intDeque, 199, 191, true); 112 checkNumberSequenceReverse(intDeque, 199, 191, true);
110 checkNumberSequenceReverse(intDeque, 191, 199, false); 113 checkNumberSequenceReverse(intDeque, 191, 199, false);
111 114
112 Deque<int> intDeque2; 115 Deque<int, inlineCapacity> intDeque2;
113 swap(intDeque, intDeque2); 116 swap(intDeque, intDeque2);
114 117
115 checkNumberSequence(intDeque2, 191, 199, true); 118 checkNumberSequence(intDeque2, 191, 199, true);
116 checkNumberSequence(intDeque2, 199, 191, false); 119 checkNumberSequence(intDeque2, 199, 191, false);
117 checkNumberSequenceReverse(intDeque2, 199, 191, true); 120 checkNumberSequenceReverse(intDeque2, 199, 191, true);
118 checkNumberSequenceReverse(intDeque2, 191, 199, false); 121 checkNumberSequenceReverse(intDeque2, 191, 199, false);
119 122
120 intDeque.swap(intDeque2); 123 intDeque.swap(intDeque2);
121 124
122 checkNumberSequence(intDeque, 191, 199, true); 125 checkNumberSequence(intDeque, 191, 199, true);
123 checkNumberSequence(intDeque, 199, 191, false); 126 checkNumberSequence(intDeque, 199, 191, false);
124 checkNumberSequenceReverse(intDeque, 199, 191, true); 127 checkNumberSequenceReverse(intDeque, 199, 191, true);
125 checkNumberSequenceReverse(intDeque, 191, 199, false); 128 checkNumberSequenceReverse(intDeque, 191, 199, false);
126 129
127 intDeque.swap(intDeque2); 130 intDeque.swap(intDeque2);
128 131
129 checkNumberSequence(intDeque2, 191, 199, true); 132 checkNumberSequence(intDeque2, 191, 199, true);
130 checkNumberSequence(intDeque2, 199, 191, false); 133 checkNumberSequence(intDeque2, 199, 191, false);
131 checkNumberSequenceReverse(intDeque2, 199, 191, true); 134 checkNumberSequenceReverse(intDeque2, 199, 191, true);
132 checkNumberSequenceReverse(intDeque2, 191, 199, false); 135 checkNumberSequenceReverse(intDeque2, 191, 199, false);
133 } 136 }
134 137
138 TEST(DequeTest, Reverse)
139 {
140 reverseTest<0>();
141 reverseTest<2>();
142 }
143
135 class DestructCounter { 144 class DestructCounter {
136 public: 145 public:
137 explicit DestructCounter(int i, int* destructNumber) 146 explicit DestructCounter(int i, int* destructNumber)
138 : m_i(i) 147 : m_i(i)
139 , m_destructNumber(destructNumber) 148 , m_destructNumber(destructNumber)
140 { } 149 { }
141 150
142 ~DestructCounter() { ++(*m_destructNumber); } 151 ~DestructCounter() { ++(*m_destructNumber); }
143 int get() const { return m_i; } 152 int get() const { return m_i; }
144 153
145 private: 154 private:
146 int m_i; 155 int m_i;
147 int* m_destructNumber; 156 int* m_destructNumber;
148 }; 157 };
149 158
150 typedef WTF::Deque<OwnPtr<DestructCounter> > OwnPtrDeque; 159 template<typename OwnPtrDeque>
151 160 void ownPtrTest()
152 TEST(DequeTest, OwnPtr)
153 { 161 {
154 int destructNumber = 0; 162 int destructNumber = 0;
155 OwnPtrDeque deque; 163 OwnPtrDeque deque;
156 deque.append(adoptPtr(new DestructCounter(0, &destructNumber))); 164 deque.append(adoptPtr(new DestructCounter(0, &destructNumber)));
157 deque.append(adoptPtr(new DestructCounter(1, &destructNumber))); 165 deque.append(adoptPtr(new DestructCounter(1, &destructNumber)));
158 EXPECT_EQ(2u, deque.size()); 166 EXPECT_EQ(2u, deque.size());
159 167
160 OwnPtr<DestructCounter>& counter0 = deque.first(); 168 OwnPtr<DestructCounter>& counter0 = deque.first();
161 EXPECT_EQ(0, counter0->get()); 169 EXPECT_EQ(0, counter0->get());
162 int counter1 = deque.last()->get(); 170 int counter1 = deque.last()->get();
163 EXPECT_EQ(1, counter1); 171 EXPECT_EQ(1, counter1);
164 EXPECT_EQ(0, destructNumber); 172 EXPECT_EQ(0, destructNumber);
165 173
166 size_t index = 0; 174 size_t index = 0;
167 for (OwnPtrDeque::iterator iter = deque.begin(); iter != deque.end(); ++iter ) { 175 for (typename OwnPtrDeque::iterator iter = deque.begin(); iter != deque.end( ); ++iter) {
168 OwnPtr<DestructCounter>& refCounter = *iter; 176 OwnPtr<DestructCounter>& refCounter = *iter;
169 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); 177 EXPECT_EQ(index, static_cast<size_t>(refCounter->get()));
170 EXPECT_EQ(index, static_cast<size_t>((*refCounter).get())); 178 EXPECT_EQ(index, static_cast<size_t>((*refCounter).get()));
171 index++; 179 index++;
172 } 180 }
173 EXPECT_EQ(0, destructNumber); 181 EXPECT_EQ(0, destructNumber);
174 182
175 OwnPtrDeque::iterator it = deque.begin(); 183 typename OwnPtrDeque::iterator it = deque.begin();
176 for (index = 0; index < deque.size(); ++index) { 184 for (index = 0; index < deque.size(); ++index) {
177 OwnPtr<DestructCounter>& refCounter = *it; 185 OwnPtr<DestructCounter>& refCounter = *it;
178 EXPECT_EQ(index, static_cast<size_t>(refCounter->get())); 186 EXPECT_EQ(index, static_cast<size_t>(refCounter->get()));
179 index++; 187 index++;
180 ++it; 188 ++it;
181 } 189 }
182 EXPECT_EQ(0, destructNumber); 190 EXPECT_EQ(0, destructNumber);
183 191
184 EXPECT_EQ(0, deque.first()->get()); 192 EXPECT_EQ(0, deque.first()->get());
185 deque.removeFirst(); 193 deque.removeFirst();
(...skipping 22 matching lines...) Expand all
208 OwnPtrDeque copyDeque; 216 OwnPtrDeque copyDeque;
209 deque.swap(copyDeque); 217 deque.swap(copyDeque);
210 EXPECT_EQ(0, destructNumber); 218 EXPECT_EQ(0, destructNumber);
211 EXPECT_EQ(count, copyDeque.size()); 219 EXPECT_EQ(count, copyDeque.size());
212 EXPECT_EQ(0u, deque.size()); 220 EXPECT_EQ(0u, deque.size());
213 221
214 copyDeque.clear(); 222 copyDeque.clear();
215 EXPECT_EQ(count, static_cast<size_t>(destructNumber)); 223 EXPECT_EQ(count, static_cast<size_t>(destructNumber));
216 } 224 }
217 225
226 TEST(DequeTest, OwnPtr)
227 {
228 ownPtrTest<WTF::Deque<OwnPtr<DestructCounter> > >();
229 ownPtrTest<WTF::Deque<OwnPtr<DestructCounter>, 2> >();
230 }
231
232
218 // WrappedInt class will fail if it was memmoved or memcpyed. 233 // WrappedInt class will fail if it was memmoved or memcpyed.
219 static HashSet<void*> constructedWrappedInts; 234 static HashSet<void*> constructedWrappedInts;
220 class WrappedInt { 235 class WrappedInt {
221 public: 236 public:
222 WrappedInt(int i = 0) 237 WrappedInt(int i = 0)
223 : m_originalThisPtr(this) 238 : m_originalThisPtr(this)
224 , m_i(i) 239 , m_i(i)
225 { 240 {
226 constructedWrappedInts.add(this); 241 constructedWrappedInts.add(this);
227 } 242 }
(...skipping 18 matching lines...) Expand all
246 constructedWrappedInts.remove(this); 261 constructedWrappedInts.remove(this);
247 } 262 }
248 263
249 int get() const { return m_i; } 264 int get() const { return m_i; }
250 265
251 private: 266 private:
252 void* m_originalThisPtr; 267 void* m_originalThisPtr;
253 int m_i; 268 int m_i;
254 }; 269 };
255 270
256 TEST(DequeTest, SwapWithoutInlineCapacity) 271 template<size_t inlineCapacity>
272 void swapWithOrWithoutInlineCapacity()
257 { 273 {
258 Deque<WrappedInt> dequeA; 274 Deque<WrappedInt, inlineCapacity> dequeA;
259 dequeA.append(WrappedInt(1)); 275 dequeA.append(WrappedInt(1));
260 Deque<WrappedInt> dequeB; 276 Deque<WrappedInt, inlineCapacity> dequeB;
261 dequeB.append(WrappedInt(2)); 277 dequeB.append(WrappedInt(2));
262 278
263 ASSERT_EQ(dequeA.size(), dequeB.size()); 279 ASSERT_EQ(dequeA.size(), dequeB.size());
264 dequeA.swap(dequeB); 280 dequeA.swap(dequeB);
265 281
266 ASSERT_EQ(1u, dequeA.size()); 282 ASSERT_EQ(1u, dequeA.size());
267 EXPECT_EQ(2, dequeA.first().get()); 283 EXPECT_EQ(2, dequeA.first().get());
268 ASSERT_EQ(1u, dequeB.size()); 284 ASSERT_EQ(1u, dequeB.size());
269 EXPECT_EQ(1, dequeB.first().get()); 285 EXPECT_EQ(1, dequeB.first().get());
270 286
(...skipping 19 matching lines...) Expand all
290 dequeA.swap(dequeB); 306 dequeA.swap(dequeB);
291 307
292 ASSERT_EQ(1u, dequeA.size()); 308 ASSERT_EQ(1u, dequeA.size());
293 EXPECT_EQ(1, dequeA.first().get()); 309 EXPECT_EQ(1, dequeA.first().get());
294 ASSERT_EQ(3u, dequeB.size()); 310 ASSERT_EQ(3u, dequeB.size());
295 EXPECT_EQ(2, dequeB.first().get()); 311 EXPECT_EQ(2, dequeB.first().get());
296 312
297 dequeB.swap(dequeA); 313 dequeB.swap(dequeA);
298 } 314 }
299 315
316 TEST(DequeTest, SwapWithOrWithoutInlineCapacity)
317 {
318 swapWithOrWithoutInlineCapacity<0>();
319 swapWithOrWithoutInlineCapacity<2>();
320 }
321
322 class LivenessCounter {
323 public:
324 void ref() { s_live++; }
325 void deref() { s_live--; }
326
327 static unsigned s_live;
328 };
329
330 unsigned LivenessCounter::s_live = 0;
331
332 // Filter a few numbers out to improve the running speed of the tests. The
333 // test has nested loops, and removing even numbers from 4 and up from the
334 // loops makes it run 10 times faster.
335 bool interestingNumber(int i)
336 {
337 return i < 4 || (i & 1);
338 }
339
340 template<size_t inlineCapacity>
341 void theBigSwapTest()
Ken Russell (switch to Gerrit) 2014/07/21 20:44:09 Please consider using a more descriptive name for
Erik Corry 2014/07/22 15:49:26 Renamed, and comment added. I saw no way to split
342 {
343 LivenessCounter::s_live = 0;
344 LivenessCounter counter;
345 EXPECT_EQ(0u, LivenessCounter::s_live);
346
347 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque;
348 Deque<RefPtr<LivenessCounter>, inlineCapacity> deque2;
349 deque.append(&counter);
350 deque2.append(&counter);
351 EXPECT_EQ(2u, LivenessCounter::s_live);
352
353 for (unsigned i = 0; i < 12; i++) {
354 if (!interestingNumber(i))
355 continue;
356 for (unsigned j = i; j < 12; j++) {
357 if (!interestingNumber(j))
358 continue;
359 deque.clear();
360 deque2.clear();
361 EXPECT_EQ(0u, LivenessCounter::s_live);
362 for (unsigned k = 0; k < j; k++)
363 deque.append(&counter);
364 EXPECT_EQ(j, LivenessCounter::s_live);
365 EXPECT_EQ(j, deque.size());
366 for (unsigned k = 0; k < i; k++)
367 deque.removeFirst();
368
369 EXPECT_EQ(j - i, LivenessCounter::s_live);
370 EXPECT_EQ(j - i, deque.size());
371 deque.swap(deque2);
372 EXPECT_EQ(j - i, LivenessCounter::s_live);
373 EXPECT_EQ(0u, deque.size());
374 EXPECT_EQ(j - i, deque2.size());
375 deque.swap(deque2);
376 EXPECT_EQ(j - i, LivenessCounter::s_live);
377
378 deque2.append(&counter);
379 deque2.append(&counter);
380 deque2.append(&counter);
381
382 for (unsigned k = 0; k < 12; k++) {
383 EXPECT_EQ(3 + j - i, LivenessCounter::s_live);
384 EXPECT_EQ(j - i, deque.size());
385 EXPECT_EQ(3u, deque2.size());
386 deque.swap(deque2);
387 EXPECT_EQ(3 + j - i, LivenessCounter::s_live);
388 EXPECT_EQ(j - i, deque2.size());
389 EXPECT_EQ(3u, deque.size());
390 deque.swap(deque2);
391 EXPECT_EQ(3 + j - i, LivenessCounter::s_live);
392 EXPECT_EQ(j - i, deque.size());
393 EXPECT_EQ(3u, deque2.size());
394
395 deque2.removeFirst();
396 deque2.append(&counter);
397 }
398 }
399 }
400
401 }
402
403 TEST(DequeTest, BigSwapTest)
404 {
405 theBigSwapTest<0>();
406 theBigSwapTest<4>();
407 theBigSwapTest<9>();
408 }
409
410 template<size_t inlineCapacity>
411 void swapValuesTest()
Ken Russell (switch to Gerrit) 2014/07/21 20:44:09 Same comment applies to this test name.
Erik Corry 2014/07/22 15:49:26 Acknowledged.
412 {
413 Deque<unsigned, inlineCapacity> deque;
414 Deque<unsigned, inlineCapacity> deque2;
415
416 for (unsigned pad = 0; pad < 12; pad++) {
417 if (!interestingNumber(pad))
418 continue;
419 for (unsigned pad2 = 0; pad2 < 12; pad2++) {
420 if (!interestingNumber(pad2))
421 continue;
422 for (unsigned size = 0; size < 12; size++) {
423 if (!interestingNumber(size))
424 continue;
425 for (unsigned size2 = 0; size2 < 12; size2++) {
426 if (!interestingNumber(size2))
427 continue;
428 deque.clear();
429 deque2.clear();
430 for (unsigned i = 0; i < pad; i++)
431 deque.append(103);
432 for (unsigned i = 0; i < pad2; i++)
433 deque2.append(888);
434 for (unsigned i = 0; i < size; i++)
435 deque.append(i);
436 for (unsigned i = 0; i < size2; i++)
437 deque2.append(i + 42);
438 for (unsigned i = 0; i < pad; i++)
439 EXPECT_EQ(103u, deque.takeFirst());
440 for (unsigned i = 0; i < pad2; i++)
441 EXPECT_EQ(888u, deque2.takeFirst());
442 EXPECT_EQ(size, deque.size());
443 EXPECT_EQ(size2, deque2.size());
444 deque.swap(deque2);
445 for (unsigned i = 0; i < size; i++)
446 EXPECT_EQ(i, deque2.takeFirst());
447 for (unsigned i = 0; i < size2; i++)
448 EXPECT_EQ(i + 42, deque.takeFirst());
449 }
450 }
451 }
452 }
453 }
454
455 TEST(DequeTest, SwapValuesTest)
456 {
457 swapValuesTest<0>();
458 swapValuesTest<4>();
459 swapValuesTest<9>();
460 }
461
300 } // namespace 462 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698