/* * Copyright 2011 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "Test.h" #include "SkDeque.h" static void assert_count(skiatest::Reporter* reporter, const SkDeque& deq, int count) { if (0 == count) { REPORTER_ASSERT(reporter, deq.empty()); REPORTER_ASSERT(reporter, 0 == deq.count()); REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize()); REPORTER_ASSERT(reporter, NULL == deq.front()); REPORTER_ASSERT(reporter, NULL == deq.back()); } else { REPORTER_ASSERT(reporter, !deq.empty()); REPORTER_ASSERT(reporter, count == deq.count()); REPORTER_ASSERT(reporter, sizeof(int) == deq.elemSize()); REPORTER_ASSERT(reporter, NULL != deq.front()); REPORTER_ASSERT(reporter, NULL != deq.back()); if (1 == count) { REPORTER_ASSERT(reporter, deq.back() == deq.front()); } else { REPORTER_ASSERT(reporter, deq.back() != deq.front()); } } } static void assert_f2biter(skiatest::Reporter* reporter, const SkDeque& deq, int max, int min) { SkDeque::F2BIter iter(deq); void* ptr; int value = max; while ((ptr = iter.next()) != NULL) { REPORTER_ASSERT(reporter, value == *(int*)ptr); value -= 1; } REPORTER_ASSERT(reporter, value+1 == min); } static void TestDeque(skiatest::Reporter* reporter) { SkDeque deq(sizeof(int)); int i; // test pushing on the front assert_count(reporter, deq, 0); for (i = 1; i <= 10; i++) { *(int*)deq.push_front() = i; } assert_count(reporter, deq, 10); assert_f2biter(reporter, deq, 10, 1); for (i = 0; i < 5; i++) { deq.pop_front(); } assert_count(reporter, deq, 5); assert_f2biter(reporter, deq, 5, 1); for (i = 0; i < 5; i++) { deq.pop_front(); } assert_count(reporter, deq, 0); // now test pushing on the back for (i = 10; i >= 1; --i) { *(int*)deq.push_back() = i; } assert_count(reporter, deq, 10); assert_f2biter(reporter, deq, 10, 1); for (i = 0; i < 5; i++) { deq.pop_back(); } assert_count(reporter, deq, 5); assert_f2biter(reporter, deq, 10, 6); for (i = 0; i < 5; i++) { deq.pop_back(); } assert_count(reporter, deq, 0); // now tests pushing/poping on both ends *(int*)deq.push_front() = 5; *(int*)deq.push_back() = 4; *(int*)deq.push_front() = 6; *(int*)deq.push_back() = 3; *(int*)deq.push_front() = 7; *(int*)deq.push_back() = 2; *(int*)deq.push_front() = 8; *(int*)deq.push_back() = 1; assert_count(reporter, deq, 8); assert_f2biter(reporter, deq, 8, 1); } #include "TestClassDef.h" DEFINE_TESTCLASS("Deque", TestDequeClass, TestDeque)