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

Side by Side Diff: cc/quads/list_container_unittest.cc

Issue 1533773002: Delete CC. (Closed) Base URL: git@github.com:domokit/mojo.git@cl-2e
Patch Set: rebase Created 5 years 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
« no previous file with comments | « cc/quads/list_container.cc ('k') | cc/quads/render_pass.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2014 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 "cc/quads/list_container.h"
6
7 #include <vector>
8 #include "cc/quads/draw_quad.h"
9 #include "cc/quads/largest_draw_quad.h"
10 #include "cc/quads/render_pass_draw_quad.h"
11 #include "cc/quads/shared_quad_state.h"
12 #include "cc/quads/stream_video_draw_quad.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace cc {
17 namespace {
18
19 int kMagicNumberToUseForDrawQuadOne = 42;
20 int kMagicNumberToUseForDrawQuadTwo = 314;
21
22 bool isConstSharedQuadStatePointer(const SharedQuadState* ptr) {
23 return true;
24 }
25
26 bool isConstSharedQuadStatePointer(SharedQuadState* ptr) {
27 return false;
28 }
29
30 class SimpleDrawQuad : public DrawQuad {
31 public:
32 ~SimpleDrawQuad() override {}
33 void IterateResources(const ResourceIteratorCallback& callback) override {}
34
35 void set_value(int val) { value = val; }
36 int get_value() { return value; }
37 void ExtendValue(base::trace_event::TracedValue* value) const override {}
38
39 private:
40 int value;
41 };
42
43 class SimpleDrawQuadConstructMagicNumberOne : public SimpleDrawQuad {
44 public:
45 SimpleDrawQuadConstructMagicNumberOne() : SimpleDrawQuad() {
46 set_value(kMagicNumberToUseForDrawQuadOne);
47 }
48 };
49
50 class SimpleDrawQuadConstructMagicNumberTwo : public SimpleDrawQuad {
51 public:
52 SimpleDrawQuadConstructMagicNumberTwo() : SimpleDrawQuad() {
53 set_value(kMagicNumberToUseForDrawQuadTwo);
54 }
55 };
56
57 class MockDrawQuad : public DrawQuad {
58 public:
59 ~MockDrawQuad() override { Destruct(); }
60 void IterateResources(const ResourceIteratorCallback& callback) override {}
61 void ExtendValue(base::trace_event::TracedValue* value) const override {}
62 MOCK_METHOD0(Destruct, void());
63 };
64
65 TEST(ListContainerTest, ConstructorCalledInAllocateAndConstruct) {
66 ListContainer<DrawQuad> list(LargestDrawQuadSize());
67
68 size_t size = 2;
69 SimpleDrawQuadConstructMagicNumberOne* dq_1 =
70 list.AllocateAndConstruct<SimpleDrawQuadConstructMagicNumberOne>();
71 SimpleDrawQuadConstructMagicNumberTwo* dq_2 =
72 list.AllocateAndConstruct<SimpleDrawQuadConstructMagicNumberTwo>();
73
74 EXPECT_EQ(size, list.size());
75 EXPECT_EQ(dq_1, list.front());
76 EXPECT_EQ(dq_2, list.back());
77
78 EXPECT_EQ(kMagicNumberToUseForDrawQuadOne, dq_1->get_value());
79 EXPECT_EQ(kMagicNumberToUseForDrawQuadTwo, dq_2->get_value());
80 }
81
82 TEST(ListContainerTest, DestructorCalled) {
83 ListContainer<DrawQuad> list(LargestDrawQuadSize());
84
85 size_t size = 1;
86 MockDrawQuad* dq_1 = list.AllocateAndConstruct<MockDrawQuad>();
87
88 EXPECT_CALL(*dq_1, Destruct());
89 EXPECT_EQ(size, list.size());
90 EXPECT_EQ(dq_1, list.front());
91 }
92
93 TEST(ListContainerTest, DestructorCalledOnceWhenClear) {
94 ListContainer<DrawQuad> list(LargestDrawQuadSize());
95 size_t size = 1;
96 MockDrawQuad* dq_1 = list.AllocateAndConstruct<MockDrawQuad>();
97
98 EXPECT_EQ(size, list.size());
99 EXPECT_EQ(dq_1, list.front());
100
101 // Make sure destructor is called once during clear, and won't be called
102 // again.
103 testing::MockFunction<void()> separator;
104 {
105 testing::InSequence s;
106 EXPECT_CALL(*dq_1, Destruct());
107 EXPECT_CALL(separator, Call());
108 EXPECT_CALL(*dq_1, Destruct()).Times(0);
109 }
110
111 list.clear();
112 separator.Call();
113 }
114
115 TEST(ListContainerTest, DestructorCalledOnceWhenErase) {
116 ListContainer<DrawQuad> list(LargestDrawQuadSize());
117 size_t size = 1;
118 MockDrawQuad* dq_1 = list.AllocateAndConstruct<MockDrawQuad>();
119
120 EXPECT_EQ(size, list.size());
121 EXPECT_EQ(dq_1, list.front());
122
123 // Make sure destructor is called once during clear, and won't be called
124 // again.
125 testing::MockFunction<void()> separator;
126 {
127 testing::InSequence s;
128 EXPECT_CALL(*dq_1, Destruct());
129 EXPECT_CALL(separator, Call());
130 EXPECT_CALL(*dq_1, Destruct()).Times(0);
131 }
132
133 list.EraseAndInvalidateAllPointers(list.begin());
134 separator.Call();
135 }
136
137 TEST(ListContainerTest, SimpleIndexAccessSharedQuadState) {
138 ListContainer<SharedQuadState> list;
139
140 size_t size = 3;
141 SharedQuadState* sqs_1 = list.AllocateAndConstruct<SharedQuadState>();
142 SharedQuadState* sqs_2 = list.AllocateAndConstruct<SharedQuadState>();
143 SharedQuadState* sqs_3 = list.AllocateAndConstruct<SharedQuadState>();
144
145 EXPECT_EQ(size, list.size());
146 EXPECT_EQ(sqs_1, list.front());
147 EXPECT_EQ(sqs_3, list.back());
148 EXPECT_EQ(list.front(), list.ElementAt(0));
149 EXPECT_EQ(sqs_2, list.ElementAt(1));
150 EXPECT_EQ(list.back(), list.ElementAt(2));
151 }
152
153 TEST(ListContainerTest, SimpleInsertionSharedQuadState) {
154 ListContainer<SharedQuadState> list;
155
156 size_t size = 3;
157 SharedQuadState* sqs_1 = list.AllocateAndConstruct<SharedQuadState>();
158 list.AllocateAndConstruct<SharedQuadState>();
159 SharedQuadState* sqs_3 = list.AllocateAndConstruct<SharedQuadState>();
160
161 EXPECT_EQ(size, list.size());
162 EXPECT_EQ(sqs_1, list.front());
163 EXPECT_EQ(sqs_3, list.back());
164 }
165
166 TEST(ListContainerTest, SimpleInsertionAndClearSharedQuadState) {
167 ListContainer<SharedQuadState> list;
168 EXPECT_TRUE(list.empty());
169 EXPECT_EQ(0u, list.size());
170
171 size_t size = 3;
172 SharedQuadState* sqs_1 = list.AllocateAndConstruct<SharedQuadState>();
173 list.AllocateAndConstruct<SharedQuadState>();
174 SharedQuadState* sqs_3 = list.AllocateAndConstruct<SharedQuadState>();
175
176 EXPECT_EQ(size, list.size());
177 EXPECT_EQ(sqs_1, list.front());
178 EXPECT_EQ(sqs_3, list.back());
179 EXPECT_FALSE(list.empty());
180
181 list.clear();
182 EXPECT_TRUE(list.empty());
183 EXPECT_EQ(0u, list.size());
184 }
185
186 TEST(ListContainerTest, SimpleInsertionClearAndInsertAgainSharedQuadState) {
187 ListContainer<SharedQuadState> list;
188 EXPECT_TRUE(list.empty());
189 EXPECT_EQ(0u, list.size());
190
191 size_t size = 2;
192 SharedQuadState* sqs_front = list.AllocateAndConstruct<SharedQuadState>();
193 SharedQuadState* sqs_back = list.AllocateAndConstruct<SharedQuadState>();
194
195 EXPECT_EQ(size, list.size());
196 EXPECT_EQ(sqs_front, list.front());
197 EXPECT_EQ(sqs_back, list.back());
198 EXPECT_FALSE(list.empty());
199
200 list.clear();
201 EXPECT_TRUE(list.empty());
202 EXPECT_EQ(0u, list.size());
203
204 size = 3;
205 sqs_front = list.AllocateAndConstruct<SharedQuadState>();
206 list.AllocateAndConstruct<SharedQuadState>();
207 sqs_back = list.AllocateAndConstruct<SharedQuadState>();
208
209 EXPECT_EQ(size, list.size());
210 EXPECT_EQ(sqs_front, list.front());
211 EXPECT_EQ(sqs_back, list.back());
212 EXPECT_FALSE(list.empty());
213 }
214
215 // This test is used to test when there is more than one allocation needed
216 // for, ListContainer can still perform like normal vector.
217 TEST(ListContainerTest,
218 SimpleInsertionTriggerMoreThanOneAllocationSharedQuadState) {
219 ListContainer<SharedQuadState> list(sizeof(SharedQuadState), 2);
220 std::vector<SharedQuadState*> sqs_list;
221 size_t size = 10;
222 for (size_t i = 0; i < size; ++i) {
223 sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
224 }
225 EXPECT_EQ(size, list.size());
226
227 ListContainer<SharedQuadState>::Iterator iter = list.begin();
228 for (std::vector<SharedQuadState*>::const_iterator sqs_iter =
229 sqs_list.begin();
230 sqs_iter != sqs_list.end();
231 ++sqs_iter) {
232 EXPECT_EQ(*sqs_iter, *iter);
233 ++iter;
234 }
235 }
236
237 TEST(ListContainerTest,
238 CorrectAllocationSizeForMoreThanOneAllocationSharedQuadState) {
239 // Constructor sets the allocation size to 2. Every time ListContainer needs
240 // to allocate again, it doubles allocation size. In this test, 10 elements is
241 // needed, thus ListContainerShould allocate spaces 2, 4 and 8 elements.
242 ListContainer<SharedQuadState> list(sizeof(SharedQuadState), 2);
243 std::vector<SharedQuadState*> sqs_list;
244 size_t size = 10;
245 for (size_t i = 0; i < size; ++i) {
246 // Before asking for a new element, space available without another
247 // allocation follows.
248 switch (i) {
249 case 2:
250 case 6:
251 EXPECT_EQ(0u, list.AvailableSizeWithoutAnotherAllocationForTesting());
252 break;
253 case 1:
254 case 5:
255 EXPECT_EQ(1u, list.AvailableSizeWithoutAnotherAllocationForTesting());
256 break;
257 case 0:
258 case 4:
259 EXPECT_EQ(2u, list.AvailableSizeWithoutAnotherAllocationForTesting());
260 break;
261 case 3:
262 EXPECT_EQ(3u, list.AvailableSizeWithoutAnotherAllocationForTesting());
263 break;
264 case 9:
265 EXPECT_EQ(5u, list.AvailableSizeWithoutAnotherAllocationForTesting());
266 break;
267 case 8:
268 EXPECT_EQ(6u, list.AvailableSizeWithoutAnotherAllocationForTesting());
269 break;
270 case 7:
271 EXPECT_EQ(7u, list.AvailableSizeWithoutAnotherAllocationForTesting());
272 break;
273 default:
274 break;
275 }
276 sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
277 // After asking for a new element, space available without another
278 // allocation follows.
279 switch (i) {
280 case 1:
281 case 5:
282 EXPECT_EQ(0u, list.AvailableSizeWithoutAnotherAllocationForTesting());
283 break;
284 case 0:
285 case 4:
286 EXPECT_EQ(1u, list.AvailableSizeWithoutAnotherAllocationForTesting());
287 break;
288 case 3:
289 EXPECT_EQ(2u, list.AvailableSizeWithoutAnotherAllocationForTesting());
290 break;
291 case 2:
292 EXPECT_EQ(3u, list.AvailableSizeWithoutAnotherAllocationForTesting());
293 break;
294 case 9:
295 EXPECT_EQ(4u, list.AvailableSizeWithoutAnotherAllocationForTesting());
296 break;
297 case 8:
298 EXPECT_EQ(5u, list.AvailableSizeWithoutAnotherAllocationForTesting());
299 break;
300 case 7:
301 EXPECT_EQ(6u, list.AvailableSizeWithoutAnotherAllocationForTesting());
302 break;
303 case 6:
304 EXPECT_EQ(7u, list.AvailableSizeWithoutAnotherAllocationForTesting());
305 break;
306 default:
307 break;
308 }
309 }
310 EXPECT_EQ(size, list.size());
311
312 ListContainer<SharedQuadState>::Iterator iter = list.begin();
313 for (std::vector<SharedQuadState*>::const_iterator sqs_iter =
314 sqs_list.begin();
315 sqs_iter != sqs_list.end();
316 ++sqs_iter) {
317 EXPECT_EQ(*sqs_iter, *iter);
318 ++iter;
319 }
320 }
321
322 TEST(ListContainerTest, SimpleIterationSharedQuadState) {
323 ListContainer<SharedQuadState> list;
324 std::vector<SharedQuadState*> sqs_list;
325 size_t size = 10;
326 for (size_t i = 0; i < size; ++i) {
327 sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
328 }
329 EXPECT_EQ(size, list.size());
330
331 size_t num_iters_in_list = 0;
332 {
333 std::vector<SharedQuadState*>::const_iterator sqs_iter = sqs_list.begin();
334 for (ListContainer<SharedQuadState>::Iterator iter = list.begin();
335 iter != list.end();
336 ++iter) {
337 EXPECT_EQ(*sqs_iter, *iter);
338 ++num_iters_in_list;
339 ++sqs_iter;
340 }
341 }
342
343 size_t num_iters_in_vector = 0;
344 {
345 ListContainer<SharedQuadState>::Iterator iter = list.begin();
346 for (std::vector<SharedQuadState*>::const_iterator sqs_iter =
347 sqs_list.begin();
348 sqs_iter != sqs_list.end();
349 ++sqs_iter) {
350 EXPECT_EQ(*sqs_iter, *iter);
351 ++num_iters_in_vector;
352 ++iter;
353 }
354 }
355
356 EXPECT_EQ(num_iters_in_vector, num_iters_in_list);
357 }
358
359 TEST(ListContainerTest, SimpleConstIteratorIterationSharedQuadState) {
360 ListContainer<SharedQuadState> list;
361 std::vector<const SharedQuadState*> sqs_list;
362 size_t size = 10;
363 for (size_t i = 0; i < size; ++i) {
364 sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
365 }
366 EXPECT_EQ(size, list.size());
367
368 {
369 std::vector<const SharedQuadState*>::const_iterator sqs_iter =
370 sqs_list.begin();
371 for (ListContainer<SharedQuadState>::ConstIterator iter = list.begin();
372 iter != list.end();
373 ++iter) {
374 EXPECT_TRUE(isConstSharedQuadStatePointer(*iter));
375 EXPECT_EQ(*sqs_iter, *iter);
376 ++sqs_iter;
377 }
378 }
379
380 {
381 std::vector<const SharedQuadState*>::const_iterator sqs_iter =
382 sqs_list.begin();
383 for (ListContainer<SharedQuadState>::Iterator iter = list.begin();
384 iter != list.end();
385 ++iter) {
386 EXPECT_FALSE(isConstSharedQuadStatePointer(*iter));
387 EXPECT_EQ(*sqs_iter, *iter);
388 ++sqs_iter;
389 }
390 }
391
392 {
393 ListContainer<SharedQuadState>::ConstIterator iter = list.begin();
394 for (std::vector<const SharedQuadState*>::const_iterator sqs_iter =
395 sqs_list.begin();
396 sqs_iter != sqs_list.end();
397 ++sqs_iter) {
398 EXPECT_EQ(*sqs_iter, *iter);
399 ++iter;
400 }
401 }
402 }
403
404 TEST(ListContainerTest, SimpleReverseInsertionSharedQuadState) {
405 ListContainer<SharedQuadState> list;
406 std::vector<SharedQuadState*> sqs_list;
407 size_t size = 10;
408 for (size_t i = 0; i < size; ++i) {
409 sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
410 }
411 EXPECT_EQ(size, list.size());
412
413 {
414 std::vector<SharedQuadState*>::const_reverse_iterator sqs_iter =
415 sqs_list.rbegin();
416 for (ListContainer<SharedQuadState>::ReverseIterator iter = list.rbegin();
417 iter != list.rend();
418 ++iter) {
419 EXPECT_EQ(*sqs_iter, *iter);
420 ++sqs_iter;
421 }
422 }
423
424 {
425 ListContainer<SharedQuadState>::ReverseIterator iter = list.rbegin();
426 for (std::vector<SharedQuadState*>::reverse_iterator sqs_iter =
427 sqs_list.rbegin();
428 sqs_iter != sqs_list.rend();
429 ++sqs_iter) {
430 EXPECT_EQ(*sqs_iter, *iter);
431 ++iter;
432 }
433 }
434 }
435
436 TEST(ListContainerTest, SimpleDeletion) {
437 ListContainer<DrawQuad> list(LargestDrawQuadSize());
438 std::vector<SimpleDrawQuad*> sdq_list;
439 size_t size = 10;
440 for (size_t i = 0; i < size; ++i) {
441 sdq_list.push_back(list.AllocateAndConstruct<SimpleDrawQuad>());
442 sdq_list.back()->set_value(i);
443 }
444 EXPECT_EQ(size, list.size());
445
446 list.EraseAndInvalidateAllPointers(list.begin());
447 --size;
448 EXPECT_EQ(size, list.size());
449 int i = 1;
450 for (ListContainer<DrawQuad>::Iterator iter = list.begin();
451 iter != list.end();
452 ++iter) {
453 EXPECT_EQ(i, static_cast<SimpleDrawQuad*>(*iter)->get_value());
454 ++i;
455 }
456 }
457
458 TEST(ListContainerTest, SimpleIterationAndManipulation) {
459 ListContainer<DrawQuad> list(LargestDrawQuadSize());
460 std::vector<SimpleDrawQuad*> sdq_list;
461 size_t size = 10;
462 for (size_t i = 0; i < size; ++i) {
463 SimpleDrawQuad* simple_dq = list.AllocateAndConstruct<SimpleDrawQuad>();
464 sdq_list.push_back(simple_dq);
465 }
466 EXPECT_EQ(size, list.size());
467
468 ListContainer<DrawQuad>::Iterator iter = list.begin();
469 for (int i = 0; i < 10; ++i) {
470 static_cast<SimpleDrawQuad*>(*iter)->set_value(i);
471 ++iter;
472 }
473
474 int i = 0;
475 for (std::vector<SimpleDrawQuad*>::const_iterator sdq_iter = sdq_list.begin();
476 sdq_iter < sdq_list.end();
477 ++sdq_iter) {
478 EXPECT_EQ(i, (*sdq_iter)->get_value());
479 ++i;
480 }
481 }
482
483 TEST(ListContainerTest, SimpleManipulationWithIndexSimpleDrawQuad) {
484 ListContainer<DrawQuad> list(LargestDrawQuadSize());
485 std::vector<SimpleDrawQuad*> dq_list;
486 size_t size = 10;
487 for (size_t i = 0; i < size; ++i) {
488 dq_list.push_back(list.AllocateAndConstruct<SimpleDrawQuad>());
489 }
490 EXPECT_EQ(size, list.size());
491
492 for (size_t i = 0; i < size; ++i) {
493 static_cast<SimpleDrawQuad*>(list.ElementAt(i))->set_value(i);
494 }
495
496 int i = 0;
497 for (std::vector<SimpleDrawQuad*>::const_iterator dq_iter = dq_list.begin();
498 dq_iter != dq_list.end();
499 ++dq_iter, ++i) {
500 EXPECT_EQ(i, (*dq_iter)->get_value());
501 }
502 }
503
504 TEST(ListContainerTest,
505 SimpleManipulationWithIndexMoreThanOneAllocationSimpleDrawQuad) {
506 ListContainer<DrawQuad> list(LargestDrawQuadSize(), 2);
507 std::vector<SimpleDrawQuad*> dq_list;
508 size_t size = 10;
509 for (size_t i = 0; i < size; ++i) {
510 dq_list.push_back(list.AllocateAndConstruct<SimpleDrawQuad>());
511 }
512 EXPECT_EQ(size, list.size());
513
514 for (size_t i = 0; i < size; ++i) {
515 static_cast<SimpleDrawQuad*>(list.ElementAt(i))->set_value(i);
516 }
517
518 int i = 0;
519 for (std::vector<SimpleDrawQuad*>::const_iterator dq_iter = dq_list.begin();
520 dq_iter != dq_list.end();
521 ++dq_iter, ++i) {
522 EXPECT_EQ(i, (*dq_iter)->get_value());
523 }
524 }
525
526 TEST(ListContainerTest,
527 SimpleIterationAndReverseIterationWithIndexSharedQuadState) {
528 ListContainer<SharedQuadState> list;
529 std::vector<SharedQuadState*> sqs_list;
530 size_t size = 10;
531 for (size_t i = 0; i < size; ++i) {
532 sqs_list.push_back(list.AllocateAndConstruct<SharedQuadState>());
533 }
534 EXPECT_EQ(size, list.size());
535
536 size_t i = 0;
537 for (ListContainer<SharedQuadState>::Iterator iter = list.begin();
538 iter != list.end();
539 ++iter) {
540 EXPECT_EQ(i, iter.index());
541 ++i;
542 }
543
544 i = 0;
545 for (ListContainer<SharedQuadState>::ReverseIterator iter = list.rbegin();
546 iter != list.rend();
547 ++iter) {
548 EXPECT_EQ(i, iter.index());
549 ++i;
550 }
551 }
552
553 } // namespace
554 } // namespace cc
OLDNEW
« no previous file with comments | « cc/quads/list_container.cc ('k') | cc/quads/render_pass.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698