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