2 * Copyright 2011 Google Inc.
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
11 static void assert_count(skiatest::Reporter* reporter, const SkDeque& deq, int count) {
13 REPORTER_ASSERT(reporter, deq.empty());
14 REPORTER_ASSERT(reporter, 0 == deq.count());
15 REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize());
16 REPORTER_ASSERT(reporter, NULL == deq.front());
17 REPORTER_ASSERT(reporter, NULL == deq.back());
19 REPORTER_ASSERT(reporter, !deq.empty());
20 REPORTER_ASSERT(reporter, count == deq.count());
21 REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize());
22 REPORTER_ASSERT(reporter, deq.front());
23 REPORTER_ASSERT(reporter, deq.back());
25 REPORTER_ASSERT(reporter, deq.back() == deq.front());
27 REPORTER_ASSERT(reporter, deq.back() != deq.front());
32 static void assert_iter(skiatest::Reporter* reporter, const SkDeque& deq,
34 // test forward iteration
35 SkDeque::Iter iter(deq, SkDeque::Iter::kFront_IterStart);
39 while ((ptr = iter.next())) {
40 REPORTER_ASSERT(reporter, value == *(int*)ptr);
43 REPORTER_ASSERT(reporter, value+1 == min);
45 // test reverse iteration
46 iter.reset(deq, SkDeque::Iter::kBack_IterStart);
49 while ((ptr = iter.prev())) {
50 REPORTER_ASSERT(reporter, value == *(int*)ptr);
53 REPORTER_ASSERT(reporter, value-1 == max);
55 // test mixed iteration
56 iter.reset(deq, SkDeque::Iter::kFront_IterStart);
59 // forward iteration half-way
60 for (int i = 0; i < deq.count()/2 && (ptr = iter.next()); i++) {
61 REPORTER_ASSERT(reporter, value == *(int*)ptr);
64 // then back down w/ reverse iteration
65 while ((ptr = iter.prev())) {
66 REPORTER_ASSERT(reporter, value == *(int*)ptr);
69 REPORTER_ASSERT(reporter, value-1 == max);
72 // This helper is intended to only give the unit test access to SkDeque's
73 // private numBlocksAllocated method
74 class DequeUnitTestHelper {
76 int fNumBlocksAllocated;
78 DequeUnitTestHelper(const SkDeque& deq) {
79 fNumBlocksAllocated = deq.numBlocksAllocated();
83 static void assert_blocks(skiatest::Reporter* reporter,
86 DequeUnitTestHelper helper(deq);
88 if (0 == deq.count()) {
89 REPORTER_ASSERT(reporter, 1 == helper.fNumBlocksAllocated);
91 int expected = (deq.count() + allocCount - 1) / allocCount;
92 // A block isn't freed in the deque when it first becomes empty so
93 // sometimes an extra block lingers around
94 REPORTER_ASSERT(reporter,
95 expected == helper.fNumBlocksAllocated ||
96 expected+1 == helper.fNumBlocksAllocated);
100 static void TestSub(skiatest::Reporter* reporter, int allocCount) {
101 SkDeque deq(sizeof(int), allocCount);
104 // test pushing on the front
106 assert_count(reporter, deq, 0);
107 for (i = 1; i <= 10; i++) {
108 *(int*)deq.push_front() = i;
110 assert_count(reporter, deq, 10);
111 assert_iter(reporter, deq, 10, 1);
112 assert_blocks(reporter, deq, allocCount);
114 for (i = 0; i < 5; i++) {
117 assert_count(reporter, deq, 5);
118 assert_iter(reporter, deq, 5, 1);
119 assert_blocks(reporter, deq, allocCount);
121 for (i = 0; i < 5; i++) {
124 assert_count(reporter, deq, 0);
125 assert_blocks(reporter, deq, allocCount);
127 // now test pushing on the back
129 for (i = 10; i >= 1; --i) {
130 *(int*)deq.push_back() = i;
132 assert_count(reporter, deq, 10);
133 assert_iter(reporter, deq, 10, 1);
134 assert_blocks(reporter, deq, allocCount);
136 for (i = 0; i < 5; i++) {
139 assert_count(reporter, deq, 5);
140 assert_iter(reporter, deq, 10, 6);
141 assert_blocks(reporter, deq, allocCount);
143 for (i = 0; i < 5; i++) {
146 assert_count(reporter, deq, 0);
147 assert_blocks(reporter, deq, allocCount);
149 // now test pushing/popping on both ends
151 *(int*)deq.push_front() = 5;
152 *(int*)deq.push_back() = 4;
153 *(int*)deq.push_front() = 6;
154 *(int*)deq.push_back() = 3;
155 *(int*)deq.push_front() = 7;
156 *(int*)deq.push_back() = 2;
157 *(int*)deq.push_front() = 8;
158 *(int*)deq.push_back() = 1;
159 assert_count(reporter, deq, 8);
160 assert_iter(reporter, deq, 8, 1);
161 assert_blocks(reporter, deq, allocCount);
164 DEF_TEST(Deque, reporter) {
165 // test it once with the default allocation count
166 TestSub(reporter, 1);
167 // test it again with a generous allocation count
168 TestSub(reporter, 10);