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.
5 #include "cc/quads/list_container.h"
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"
19 int kMagicNumberToUseForDrawQuadOne
= 42;
20 int kMagicNumberToUseForDrawQuadTwo
= 314;
22 bool isConstSharedQuadStatePointer(const SharedQuadState
* ptr
) {
26 bool isConstSharedQuadStatePointer(SharedQuadState
* ptr
) {
30 class SimpleDrawQuad
: public DrawQuad
{
32 ~SimpleDrawQuad() override
{}
33 void IterateResources(const ResourceIteratorCallback
& callback
) override
{}
35 void set_value(int val
) { value
= val
; }
36 int get_value() { return value
; }
37 void ExtendValue(base::debug::TracedValue
* value
) const override
{}
43 class SimpleDrawQuadConstructMagicNumberOne
: public SimpleDrawQuad
{
45 SimpleDrawQuadConstructMagicNumberOne() : SimpleDrawQuad() {
46 set_value(kMagicNumberToUseForDrawQuadOne
);
50 class SimpleDrawQuadConstructMagicNumberTwo
: public SimpleDrawQuad
{
52 SimpleDrawQuadConstructMagicNumberTwo() : SimpleDrawQuad() {
53 set_value(kMagicNumberToUseForDrawQuadTwo
);
57 class MockDrawQuad
: public DrawQuad
{
59 virtual ~MockDrawQuad() { Destruct(); }
60 virtual void IterateResources(
61 const ResourceIteratorCallback
& callback
) override
{}
62 virtual void ExtendValue(base::debug::TracedValue
* value
) const override
{}
63 MOCK_METHOD0(Destruct
, void());
66 TEST(ListContainerTest
, ConstructorCalledInAllocateAndConstruct
) {
67 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
70 SimpleDrawQuadConstructMagicNumberOne
* dq_1
=
71 list
.AllocateAndConstruct
<SimpleDrawQuadConstructMagicNumberOne
>();
72 SimpleDrawQuadConstructMagicNumberTwo
* dq_2
=
73 list
.AllocateAndConstruct
<SimpleDrawQuadConstructMagicNumberTwo
>();
75 EXPECT_EQ(size
, list
.size());
76 EXPECT_EQ(dq_1
, list
.front());
77 EXPECT_EQ(dq_2
, list
.back());
79 EXPECT_EQ(kMagicNumberToUseForDrawQuadOne
, dq_1
->get_value());
80 EXPECT_EQ(kMagicNumberToUseForDrawQuadTwo
, dq_2
->get_value());
83 TEST(ListContainerTest
, DestructorCalled
) {
84 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
87 MockDrawQuad
* dq_1
= list
.AllocateAndConstruct
<MockDrawQuad
>();
89 EXPECT_CALL(*dq_1
, Destruct());
90 EXPECT_EQ(size
, list
.size());
91 EXPECT_EQ(dq_1
, list
.front());
94 TEST(ListContainerTest
, DestructorCalledOnceWhenClear
) {
95 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
97 MockDrawQuad
* dq_1
= list
.AllocateAndConstruct
<MockDrawQuad
>();
99 EXPECT_EQ(size
, list
.size());
100 EXPECT_EQ(dq_1
, list
.front());
102 // Make sure destructor is called once during clear, and won't be called
104 testing::MockFunction
<void()> separator
;
106 testing::InSequence s
;
107 EXPECT_CALL(*dq_1
, Destruct());
108 EXPECT_CALL(separator
, Call());
109 EXPECT_CALL(*dq_1
, Destruct()).Times(0);
116 TEST(ListContainerTest
, DestructorCalledOnceWhenErase
) {
117 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
119 MockDrawQuad
* dq_1
= list
.AllocateAndConstruct
<MockDrawQuad
>();
121 EXPECT_EQ(size
, list
.size());
122 EXPECT_EQ(dq_1
, list
.front());
124 // Make sure destructor is called once during clear, and won't be called
126 testing::MockFunction
<void()> separator
;
128 testing::InSequence s
;
129 EXPECT_CALL(*dq_1
, Destruct());
130 EXPECT_CALL(separator
, Call());
131 EXPECT_CALL(*dq_1
, Destruct()).Times(0);
134 list
.EraseAndInvalidateAllPointers(list
.begin());
138 TEST(ListContainerTest
, SimpleIndexAccessSharedQuadState
) {
139 ListContainer
<SharedQuadState
> list
;
142 SharedQuadState
* sqs_1
= list
.AllocateAndConstruct
<SharedQuadState
>();
143 SharedQuadState
* sqs_2
= list
.AllocateAndConstruct
<SharedQuadState
>();
144 SharedQuadState
* sqs_3
= list
.AllocateAndConstruct
<SharedQuadState
>();
146 EXPECT_EQ(size
, list
.size());
147 EXPECT_EQ(sqs_1
, list
.front());
148 EXPECT_EQ(sqs_3
, list
.back());
149 EXPECT_EQ(list
.front(), list
.ElementAt(0));
150 EXPECT_EQ(sqs_2
, list
.ElementAt(1));
151 EXPECT_EQ(list
.back(), list
.ElementAt(2));
154 TEST(ListContainerTest
, SimpleInsertionSharedQuadState
) {
155 ListContainer
<SharedQuadState
> list
;
158 SharedQuadState
* sqs_1
= list
.AllocateAndConstruct
<SharedQuadState
>();
159 list
.AllocateAndConstruct
<SharedQuadState
>();
160 SharedQuadState
* sqs_3
= list
.AllocateAndConstruct
<SharedQuadState
>();
162 EXPECT_EQ(size
, list
.size());
163 EXPECT_EQ(sqs_1
, list
.front());
164 EXPECT_EQ(sqs_3
, list
.back());
167 TEST(ListContainerTest
, SimpleInsertionAndClearSharedQuadState
) {
168 ListContainer
<SharedQuadState
> list
;
169 EXPECT_TRUE(list
.empty());
170 EXPECT_EQ(0u, list
.size());
173 SharedQuadState
* sqs_1
= list
.AllocateAndConstruct
<SharedQuadState
>();
174 list
.AllocateAndConstruct
<SharedQuadState
>();
175 SharedQuadState
* sqs_3
= list
.AllocateAndConstruct
<SharedQuadState
>();
177 EXPECT_EQ(size
, list
.size());
178 EXPECT_EQ(sqs_1
, list
.front());
179 EXPECT_EQ(sqs_3
, list
.back());
180 EXPECT_FALSE(list
.empty());
183 EXPECT_TRUE(list
.empty());
184 EXPECT_EQ(0u, list
.size());
187 TEST(ListContainerTest
, SimpleInsertionClearAndInsertAgainSharedQuadState
) {
188 ListContainer
<SharedQuadState
> list
;
189 EXPECT_TRUE(list
.empty());
190 EXPECT_EQ(0u, list
.size());
193 SharedQuadState
* sqs_front
= list
.AllocateAndConstruct
<SharedQuadState
>();
194 SharedQuadState
* sqs_back
= list
.AllocateAndConstruct
<SharedQuadState
>();
196 EXPECT_EQ(size
, list
.size());
197 EXPECT_EQ(sqs_front
, list
.front());
198 EXPECT_EQ(sqs_back
, list
.back());
199 EXPECT_FALSE(list
.empty());
202 EXPECT_TRUE(list
.empty());
203 EXPECT_EQ(0u, list
.size());
206 sqs_front
= list
.AllocateAndConstruct
<SharedQuadState
>();
207 list
.AllocateAndConstruct
<SharedQuadState
>();
208 sqs_back
= list
.AllocateAndConstruct
<SharedQuadState
>();
210 EXPECT_EQ(size
, list
.size());
211 EXPECT_EQ(sqs_front
, list
.front());
212 EXPECT_EQ(sqs_back
, list
.back());
213 EXPECT_FALSE(list
.empty());
216 // This test is used to test when there is more than one allocation needed
217 // for, ListContainer can still perform like normal vector.
218 TEST(ListContainerTest
,
219 SimpleInsertionTriggerMoreThanOneAllocationSharedQuadState
) {
220 ListContainer
<SharedQuadState
> list(sizeof(SharedQuadState
), 2);
221 std::vector
<SharedQuadState
*> sqs_list
;
223 for (size_t i
= 0; i
< size
; ++i
) {
224 sqs_list
.push_back(list
.AllocateAndConstruct
<SharedQuadState
>());
226 EXPECT_EQ(size
, list
.size());
228 ListContainer
<SharedQuadState
>::Iterator iter
= list
.begin();
229 for (std::vector
<SharedQuadState
*>::const_iterator sqs_iter
=
231 sqs_iter
!= sqs_list
.end();
233 EXPECT_EQ(*sqs_iter
, &*iter
);
238 TEST(ListContainerTest
,
239 CorrectAllocationSizeForMoreThanOneAllocationSharedQuadState
) {
240 // Constructor sets the allocation size to 2. Every time ListContainer needs
241 // to allocate again, it doubles allocation size. In this test, 10 elements is
242 // needed, thus ListContainerShould allocate spaces 2, 4 and 8 elements.
243 ListContainer
<SharedQuadState
> list(sizeof(SharedQuadState
), 2);
244 std::vector
<SharedQuadState
*> sqs_list
;
246 for (size_t i
= 0; i
< size
; ++i
) {
247 // Before asking for a new element, space available without another
248 // allocation follows.
252 EXPECT_EQ(0u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
256 EXPECT_EQ(1u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
260 EXPECT_EQ(2u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
263 EXPECT_EQ(3u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
266 EXPECT_EQ(5u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
269 EXPECT_EQ(6u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
272 EXPECT_EQ(7u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
277 sqs_list
.push_back(list
.AllocateAndConstruct
<SharedQuadState
>());
278 // After asking for a new element, space available without another
279 // allocation follows.
283 EXPECT_EQ(0u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
287 EXPECT_EQ(1u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
290 EXPECT_EQ(2u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
293 EXPECT_EQ(3u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
296 EXPECT_EQ(4u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
299 EXPECT_EQ(5u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
302 EXPECT_EQ(6u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
305 EXPECT_EQ(7u, list
.AvailableSizeWithoutAnotherAllocationForTesting());
311 EXPECT_EQ(size
, list
.size());
313 ListContainer
<SharedQuadState
>::Iterator iter
= list
.begin();
314 for (std::vector
<SharedQuadState
*>::const_iterator sqs_iter
=
316 sqs_iter
!= sqs_list
.end();
318 EXPECT_EQ(*sqs_iter
, &*iter
);
323 TEST(ListContainerTest
, SimpleIterationSharedQuadState
) {
324 ListContainer
<SharedQuadState
> list
;
325 std::vector
<SharedQuadState
*> sqs_list
;
327 for (size_t i
= 0; i
< size
; ++i
) {
328 sqs_list
.push_back(list
.AllocateAndConstruct
<SharedQuadState
>());
330 EXPECT_EQ(size
, list
.size());
332 size_t num_iters_in_list
= 0;
334 std::vector
<SharedQuadState
*>::const_iterator sqs_iter
= sqs_list
.begin();
335 for (ListContainer
<SharedQuadState
>::Iterator iter
= list
.begin();
338 EXPECT_EQ(*sqs_iter
, &*iter
);
344 size_t num_iters_in_vector
= 0;
346 ListContainer
<SharedQuadState
>::Iterator iter
= list
.begin();
347 for (std::vector
<SharedQuadState
*>::const_iterator sqs_iter
=
349 sqs_iter
!= sqs_list
.end();
351 EXPECT_EQ(*sqs_iter
, &*iter
);
352 ++num_iters_in_vector
;
357 EXPECT_EQ(num_iters_in_vector
, num_iters_in_list
);
360 TEST(ListContainerTest
, SimpleConstIteratorIterationSharedQuadState
) {
361 ListContainer
<SharedQuadState
> list
;
362 std::vector
<const SharedQuadState
*> sqs_list
;
364 for (size_t i
= 0; i
< size
; ++i
) {
365 sqs_list
.push_back(list
.AllocateAndConstruct
<SharedQuadState
>());
367 EXPECT_EQ(size
, list
.size());
370 std::vector
<const SharedQuadState
*>::const_iterator sqs_iter
=
372 for (ListContainer
<SharedQuadState
>::ConstIterator iter
= list
.begin();
375 EXPECT_TRUE(isConstSharedQuadStatePointer(&*iter
));
376 EXPECT_EQ(*sqs_iter
, &*iter
);
382 std::vector
<const SharedQuadState
*>::const_iterator sqs_iter
=
384 for (ListContainer
<SharedQuadState
>::Iterator iter
= list
.begin();
387 EXPECT_FALSE(isConstSharedQuadStatePointer(&*iter
));
388 EXPECT_EQ(*sqs_iter
, &*iter
);
394 ListContainer
<SharedQuadState
>::ConstIterator iter
= list
.begin();
395 for (std::vector
<const SharedQuadState
*>::const_iterator sqs_iter
=
397 sqs_iter
!= sqs_list
.end();
399 EXPECT_EQ(*sqs_iter
, &*iter
);
405 TEST(ListContainerTest
, SimpleReverseInsertionSharedQuadState
) {
406 ListContainer
<SharedQuadState
> list
;
407 std::vector
<SharedQuadState
*> sqs_list
;
409 for (size_t i
= 0; i
< size
; ++i
) {
410 sqs_list
.push_back(list
.AllocateAndConstruct
<SharedQuadState
>());
412 EXPECT_EQ(size
, list
.size());
415 std::vector
<SharedQuadState
*>::const_reverse_iterator sqs_iter
=
417 for (ListContainer
<SharedQuadState
>::ReverseIterator iter
= list
.rbegin();
420 EXPECT_EQ(*sqs_iter
, &(*iter
));
426 ListContainer
<SharedQuadState
>::ReverseIterator iter
= list
.rbegin();
427 for (std::vector
<SharedQuadState
*>::reverse_iterator sqs_iter
=
429 sqs_iter
!= sqs_list
.rend();
431 EXPECT_EQ(*sqs_iter
, &(*iter
));
437 TEST(ListContainerTest
, SimpleDeletion
) {
438 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
439 std::vector
<SimpleDrawQuad
*> sdq_list
;
441 for (size_t i
= 0; i
< size
; ++i
) {
442 sdq_list
.push_back(list
.AllocateAndConstruct
<SimpleDrawQuad
>());
443 sdq_list
.back()->set_value(i
);
445 EXPECT_EQ(size
, list
.size());
447 list
.EraseAndInvalidateAllPointers(list
.begin());
449 EXPECT_EQ(size
, list
.size());
451 for (ListContainer
<DrawQuad
>::Iterator iter
= list
.begin();
454 EXPECT_EQ(i
, static_cast<SimpleDrawQuad
*>(&*iter
)->get_value());
459 TEST(ListContainerTest
, SimpleIterationAndManipulation
) {
460 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
461 std::vector
<SimpleDrawQuad
*> sdq_list
;
463 for (size_t i
= 0; i
< size
; ++i
) {
464 SimpleDrawQuad
* simple_dq
= list
.AllocateAndConstruct
<SimpleDrawQuad
>();
465 sdq_list
.push_back(simple_dq
);
467 EXPECT_EQ(size
, list
.size());
469 ListContainer
<DrawQuad
>::Iterator iter
= list
.begin();
470 for (int i
= 0; i
< 10; ++i
) {
471 static_cast<SimpleDrawQuad
*>(&*iter
)->set_value(i
);
476 for (std::vector
<SimpleDrawQuad
*>::const_iterator sdq_iter
= sdq_list
.begin();
477 sdq_iter
< sdq_list
.end();
479 EXPECT_EQ(i
, (*sdq_iter
)->get_value());
484 TEST(ListContainerTest
, SimpleManipulationWithIndexSimpleDrawQuad
) {
485 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
));
486 std::vector
<SimpleDrawQuad
*> dq_list
;
488 for (size_t i
= 0; i
< size
; ++i
) {
489 dq_list
.push_back(list
.AllocateAndConstruct
<SimpleDrawQuad
>());
491 EXPECT_EQ(size
, list
.size());
493 for (size_t i
= 0; i
< size
; ++i
) {
494 static_cast<SimpleDrawQuad
*>(list
.ElementAt(i
))->set_value(i
);
498 for (std::vector
<SimpleDrawQuad
*>::const_iterator dq_iter
= dq_list
.begin();
499 dq_iter
!= dq_list
.end();
501 EXPECT_EQ(i
, (*dq_iter
)->get_value());
505 TEST(ListContainerTest
,
506 SimpleManipulationWithIndexMoreThanOneAllocationSimpleDrawQuad
) {
507 ListContainer
<DrawQuad
> list(sizeof(kLargestDrawQuad
), 2);
508 std::vector
<SimpleDrawQuad
*> dq_list
;
510 for (size_t i
= 0; i
< size
; ++i
) {
511 dq_list
.push_back(list
.AllocateAndConstruct
<SimpleDrawQuad
>());
513 EXPECT_EQ(size
, list
.size());
515 for (size_t i
= 0; i
< size
; ++i
) {
516 static_cast<SimpleDrawQuad
*>(list
.ElementAt(i
))->set_value(i
);
520 for (std::vector
<SimpleDrawQuad
*>::const_iterator dq_iter
= dq_list
.begin();
521 dq_iter
!= dq_list
.end();
523 EXPECT_EQ(i
, (*dq_iter
)->get_value());
527 TEST(ListContainerTest
,
528 SimpleIterationAndReverseIterationWithIndexSharedQuadState
) {
529 ListContainer
<SharedQuadState
> list
;
530 std::vector
<SharedQuadState
*> sqs_list
;
532 for (size_t i
= 0; i
< size
; ++i
) {
533 sqs_list
.push_back(list
.AllocateAndConstruct
<SharedQuadState
>());
535 EXPECT_EQ(size
, list
.size());
538 for (ListContainer
<SharedQuadState
>::Iterator iter
= list
.begin();
541 EXPECT_EQ(i
, iter
.index());
546 for (ListContainer
<SharedQuadState
>::ReverseIterator iter
= list
.rbegin();
549 EXPECT_EQ(i
, iter
.index());