xref: /aosp_15_r20/external/skia/tests/DequeTest.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2011 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkDeque.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
10*c8dee2aaSAndroid Build Coastguard Worker 
assert_count(skiatest::Reporter * reporter,const SkDeque & deq,int count)11*c8dee2aaSAndroid Build Coastguard Worker static void assert_count(skiatest::Reporter* reporter, const SkDeque& deq, int count) {
12*c8dee2aaSAndroid Build Coastguard Worker     if (0 == count) {
13*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, deq.empty());
14*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, 0 == deq.count());
15*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize());
16*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, nullptr == deq.front());
17*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, nullptr == deq.back());
18*c8dee2aaSAndroid Build Coastguard Worker     } else {
19*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, !deq.empty());
20*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, count == deq.count());
21*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize());
22*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, deq.front());
23*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, deq.back());
24*c8dee2aaSAndroid Build Coastguard Worker         if (1 == count) {
25*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, deq.back() == deq.front());
26*c8dee2aaSAndroid Build Coastguard Worker         } else {
27*c8dee2aaSAndroid Build Coastguard Worker             REPORTER_ASSERT(reporter, deq.back() != deq.front());
28*c8dee2aaSAndroid Build Coastguard Worker         }
29*c8dee2aaSAndroid Build Coastguard Worker     }
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker 
assert_iter(skiatest::Reporter * reporter,const SkDeque & deq,int max,int min)32*c8dee2aaSAndroid Build Coastguard Worker static void assert_iter(skiatest::Reporter* reporter, const SkDeque& deq,
33*c8dee2aaSAndroid Build Coastguard Worker                         int max, int min) {
34*c8dee2aaSAndroid Build Coastguard Worker     // test forward iteration
35*c8dee2aaSAndroid Build Coastguard Worker     SkDeque::Iter iter(deq, SkDeque::Iter::kFront_IterStart);
36*c8dee2aaSAndroid Build Coastguard Worker     void* ptr;
37*c8dee2aaSAndroid Build Coastguard Worker 
38*c8dee2aaSAndroid Build Coastguard Worker     int value = max;
39*c8dee2aaSAndroid Build Coastguard Worker     while ((ptr = iter.next())) {
40*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, value == *(int*)ptr);
41*c8dee2aaSAndroid Build Coastguard Worker         value -= 1;
42*c8dee2aaSAndroid Build Coastguard Worker     }
43*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, value+1 == min);
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     // test reverse iteration
46*c8dee2aaSAndroid Build Coastguard Worker     iter.reset(deq, SkDeque::Iter::kBack_IterStart);
47*c8dee2aaSAndroid Build Coastguard Worker 
48*c8dee2aaSAndroid Build Coastguard Worker     value = min;
49*c8dee2aaSAndroid Build Coastguard Worker     while ((ptr = iter.prev())) {
50*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, value == *(int*)ptr);
51*c8dee2aaSAndroid Build Coastguard Worker         value += 1;
52*c8dee2aaSAndroid Build Coastguard Worker     }
53*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, value-1 == max);
54*c8dee2aaSAndroid Build Coastguard Worker 
55*c8dee2aaSAndroid Build Coastguard Worker     // test mixed iteration
56*c8dee2aaSAndroid Build Coastguard Worker     iter.reset(deq, SkDeque::Iter::kFront_IterStart);
57*c8dee2aaSAndroid Build Coastguard Worker 
58*c8dee2aaSAndroid Build Coastguard Worker     value = max;
59*c8dee2aaSAndroid Build Coastguard Worker     // forward iteration half-way
60*c8dee2aaSAndroid Build Coastguard Worker     for (int i = 0; i < deq.count()/2 && (ptr = iter.next()); i++) {
61*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, value == *(int*)ptr);
62*c8dee2aaSAndroid Build Coastguard Worker         value -= 1;
63*c8dee2aaSAndroid Build Coastguard Worker     }
64*c8dee2aaSAndroid Build Coastguard Worker     // then back down w/ reverse iteration
65*c8dee2aaSAndroid Build Coastguard Worker     while ((ptr = iter.prev())) {
66*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, value == *(int*)ptr);
67*c8dee2aaSAndroid Build Coastguard Worker         value += 1;
68*c8dee2aaSAndroid Build Coastguard Worker     }
69*c8dee2aaSAndroid Build Coastguard Worker     REPORTER_ASSERT(reporter, value-1 == max);
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker 
72*c8dee2aaSAndroid Build Coastguard Worker // This helper is intended to only give the unit test access to SkDeque's
73*c8dee2aaSAndroid Build Coastguard Worker // private numBlocksAllocated method
74*c8dee2aaSAndroid Build Coastguard Worker class DequeUnitTestHelper {
75*c8dee2aaSAndroid Build Coastguard Worker public:
76*c8dee2aaSAndroid Build Coastguard Worker     int fNumBlocksAllocated;
77*c8dee2aaSAndroid Build Coastguard Worker 
DequeUnitTestHelper(const SkDeque & deq)78*c8dee2aaSAndroid Build Coastguard Worker     DequeUnitTestHelper(const SkDeque& deq) {
79*c8dee2aaSAndroid Build Coastguard Worker         fNumBlocksAllocated = deq.numBlocksAllocated();
80*c8dee2aaSAndroid Build Coastguard Worker     }
81*c8dee2aaSAndroid Build Coastguard Worker };
82*c8dee2aaSAndroid Build Coastguard Worker 
assert_blocks(skiatest::Reporter * reporter,const SkDeque & deq,int allocCount)83*c8dee2aaSAndroid Build Coastguard Worker static void assert_blocks(skiatest::Reporter* reporter,
84*c8dee2aaSAndroid Build Coastguard Worker                           const SkDeque& deq,
85*c8dee2aaSAndroid Build Coastguard Worker                           int allocCount) {
86*c8dee2aaSAndroid Build Coastguard Worker     DequeUnitTestHelper helper(deq);
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     if (0 == deq.count()) {
89*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter, 1 == helper.fNumBlocksAllocated);
90*c8dee2aaSAndroid Build Coastguard Worker     } else {
91*c8dee2aaSAndroid Build Coastguard Worker         int expected = (deq.count() + allocCount - 1) / allocCount;
92*c8dee2aaSAndroid Build Coastguard Worker         // A block isn't freed in the deque when it first becomes empty so
93*c8dee2aaSAndroid Build Coastguard Worker         // sometimes an extra block lingers around
94*c8dee2aaSAndroid Build Coastguard Worker         REPORTER_ASSERT(reporter,
95*c8dee2aaSAndroid Build Coastguard Worker             expected == helper.fNumBlocksAllocated ||
96*c8dee2aaSAndroid Build Coastguard Worker             expected+1 == helper.fNumBlocksAllocated);
97*c8dee2aaSAndroid Build Coastguard Worker     }
98*c8dee2aaSAndroid Build Coastguard Worker }
99*c8dee2aaSAndroid Build Coastguard Worker 
TestSub(skiatest::Reporter * reporter,int allocCount)100*c8dee2aaSAndroid Build Coastguard Worker static void TestSub(skiatest::Reporter* reporter, int allocCount) {
101*c8dee2aaSAndroid Build Coastguard Worker     SkDeque deq(sizeof(int), allocCount);
102*c8dee2aaSAndroid Build Coastguard Worker     int i;
103*c8dee2aaSAndroid Build Coastguard Worker 
104*c8dee2aaSAndroid Build Coastguard Worker     // test pushing on the front
105*c8dee2aaSAndroid Build Coastguard Worker 
106*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 0);
107*c8dee2aaSAndroid Build Coastguard Worker     for (i = 1; i <= 10; i++) {
108*c8dee2aaSAndroid Build Coastguard Worker         *(int*)deq.push_front() = i;
109*c8dee2aaSAndroid Build Coastguard Worker     }
110*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 10);
111*c8dee2aaSAndroid Build Coastguard Worker     assert_iter(reporter, deq, 10, 1);
112*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
113*c8dee2aaSAndroid Build Coastguard Worker 
114*c8dee2aaSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
115*c8dee2aaSAndroid Build Coastguard Worker         deq.pop_front();
116*c8dee2aaSAndroid Build Coastguard Worker     }
117*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 5);
118*c8dee2aaSAndroid Build Coastguard Worker     assert_iter(reporter, deq, 5, 1);
119*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
122*c8dee2aaSAndroid Build Coastguard Worker         deq.pop_front();
123*c8dee2aaSAndroid Build Coastguard Worker     }
124*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 0);
125*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
126*c8dee2aaSAndroid Build Coastguard Worker 
127*c8dee2aaSAndroid Build Coastguard Worker     // now test pushing on the back
128*c8dee2aaSAndroid Build Coastguard Worker 
129*c8dee2aaSAndroid Build Coastguard Worker     for (i = 10; i >= 1; --i) {
130*c8dee2aaSAndroid Build Coastguard Worker         *(int*)deq.push_back() = i;
131*c8dee2aaSAndroid Build Coastguard Worker     }
132*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 10);
133*c8dee2aaSAndroid Build Coastguard Worker     assert_iter(reporter, deq, 10, 1);
134*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
135*c8dee2aaSAndroid Build Coastguard Worker 
136*c8dee2aaSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
137*c8dee2aaSAndroid Build Coastguard Worker         deq.pop_back();
138*c8dee2aaSAndroid Build Coastguard Worker     }
139*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 5);
140*c8dee2aaSAndroid Build Coastguard Worker     assert_iter(reporter, deq, 10, 6);
141*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
142*c8dee2aaSAndroid Build Coastguard Worker 
143*c8dee2aaSAndroid Build Coastguard Worker     for (i = 0; i < 5; i++) {
144*c8dee2aaSAndroid Build Coastguard Worker         deq.pop_back();
145*c8dee2aaSAndroid Build Coastguard Worker     }
146*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 0);
147*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
148*c8dee2aaSAndroid Build Coastguard Worker 
149*c8dee2aaSAndroid Build Coastguard Worker     // now test pushing/popping on both ends
150*c8dee2aaSAndroid Build Coastguard Worker 
151*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_front() = 5;
152*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_back() = 4;
153*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_front() = 6;
154*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_back() = 3;
155*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_front() = 7;
156*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_back() = 2;
157*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_front() = 8;
158*c8dee2aaSAndroid Build Coastguard Worker     *(int*)deq.push_back() = 1;
159*c8dee2aaSAndroid Build Coastguard Worker     assert_count(reporter, deq, 8);
160*c8dee2aaSAndroid Build Coastguard Worker     assert_iter(reporter, deq, 8, 1);
161*c8dee2aaSAndroid Build Coastguard Worker     assert_blocks(reporter, deq, allocCount);
162*c8dee2aaSAndroid Build Coastguard Worker }
163*c8dee2aaSAndroid Build Coastguard Worker 
DEF_TEST(Deque,reporter)164*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(Deque, reporter) {
165*c8dee2aaSAndroid Build Coastguard Worker     // test it once with the default allocation count
166*c8dee2aaSAndroid Build Coastguard Worker     TestSub(reporter, 1);
167*c8dee2aaSAndroid Build Coastguard Worker     // test it again with a generous allocation count
168*c8dee2aaSAndroid Build Coastguard Worker     TestSub(reporter, 10);
169*c8dee2aaSAndroid Build Coastguard Worker }
170