1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 #include "Test.h" 9 #include "SkDeque.h" 10 11 static void assert_count(skiatest::Reporter* reporter, const SkDeque& deq, int count) { 12 if (0 == 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()); 18 } else { 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, NULL != deq.front()); 23 REPORTER_ASSERT(reporter, NULL != deq.back()); 24 if (1 == count) { 25 REPORTER_ASSERT(reporter, deq.back() == deq.front()); 26 } else { 27 REPORTER_ASSERT(reporter, deq.back() != deq.front()); 28 } 29 } 30 } 31 32 static void assert_f2biter(skiatest::Reporter* reporter, const SkDeque& deq, 33 int max, int min) { 34 SkDeque::F2BIter iter(deq); 35 void* ptr; 36 37 int value = max; 38 while ((ptr = iter.next()) != NULL) { 39 REPORTER_ASSERT(reporter, value == *(int*)ptr); 40 value -= 1; 41 } 42 REPORTER_ASSERT(reporter, value+1 == min); 43 } 44 45 static void TestDeque(skiatest::Reporter* reporter) { 46 SkDeque deq(sizeof(int)); 47 int i; 48 49 // test pushing on the front 50 51 assert_count(reporter, deq, 0); 52 for (i = 1; i <= 10; i++) { 53 *(int*)deq.push_front() = i; 54 } 55 assert_count(reporter, deq, 10); 56 assert_f2biter(reporter, deq, 10, 1); 57 58 for (i = 0; i < 5; i++) { 59 deq.pop_front(); 60 } 61 assert_count(reporter, deq, 5); 62 assert_f2biter(reporter, deq, 5, 1); 63 64 for (i = 0; i < 5; i++) { 65 deq.pop_front(); 66 } 67 assert_count(reporter, deq, 0); 68 69 // now test pushing on the back 70 71 for (i = 10; i >= 1; --i) { 72 *(int*)deq.push_back() = i; 73 } 74 assert_count(reporter, deq, 10); 75 assert_f2biter(reporter, deq, 10, 1); 76 77 for (i = 0; i < 5; i++) { 78 deq.pop_back(); 79 } 80 assert_count(reporter, deq, 5); 81 assert_f2biter(reporter, deq, 10, 6); 82 83 for (i = 0; i < 5; i++) { 84 deq.pop_back(); 85 } 86 assert_count(reporter, deq, 0); 87 88 // now tests pushing/poping on both ends 89 90 *(int*)deq.push_front() = 5; 91 *(int*)deq.push_back() = 4; 92 *(int*)deq.push_front() = 6; 93 *(int*)deq.push_back() = 3; 94 *(int*)deq.push_front() = 7; 95 *(int*)deq.push_back() = 2; 96 *(int*)deq.push_front() = 8; 97 *(int*)deq.push_back() = 1; 98 assert_count(reporter, deq, 8); 99 assert_f2biter(reporter, deq, 8, 1); 100 } 101 102 #include "TestClassDef.h" 103 DEFINE_TESTCLASS("Deque", TestDequeClass, TestDeque) 104