1/* 2** Copyright 2003-2004, Axel D��rfler, axeld@pinc-software.de. All rights reserved. 3** Distributed under the terms of the MIT License. 4*/ 5 6 7#include "DoublyLinkedListTest.h" 8 9#include <cppunit/TestCaller.h> 10#include <cppunit/TestSuite.h> 11#include <TestUtils.h> 12 13#include <util/DoublyLinkedList.h> 14 15 16// Class used for testing without offset 17class ItemWithout { 18 public: 19 DoublyLinkedListLink<ItemWithout> fLink; 20 int32 value; 21}; 22 23// Class used for testing with offset 24class ItemWith { 25 public: 26 int32 value; 27 DoublyLinkedListLink<ItemWith> fLink; 28}; 29 30// Class used for testing without offset 31class ItemVirtualWithout { 32 public: 33 virtual int32 Value(); 34 35 DoublyLinkedListLink<ItemVirtualWithout> fLink; 36 int32 value; 37}; 38 39// Class used for testing with offset 40class ItemVirtualWith { 41 public: 42 virtual int32 Value(); 43 44 int32 value; 45 DoublyLinkedListLink<ItemVirtualWith> fLink; 46}; 47 48 49int32 50ItemVirtualWithout::Value() 51{ 52 return value; 53} 54 55 56int32 57ItemVirtualWith::Value() 58{ 59 return value; 60} 61 62 63// #pragma mark - 64 65 66DoublyLinkedListTest::DoublyLinkedListTest(std::string name) 67 : BTestCase(name) 68{ 69} 70 71 72CppUnit::Test* 73DoublyLinkedListTest::Suite() { 74 CppUnit::TestSuite *suite = new CppUnit::TestSuite("DLL"); 75 76 suite->addTest(new CppUnit::TestCaller<DoublyLinkedListTest>("DoublyLinkedList::no offset", &DoublyLinkedListTest::WithoutOffsetTest)); 77 suite->addTest(new CppUnit::TestCaller<DoublyLinkedListTest>("DoublyLinkedList::with offset", &DoublyLinkedListTest::WithOffsetTest)); 78 suite->addTest(new CppUnit::TestCaller<DoublyLinkedListTest>("DoublyLinkedList::virtual no offset", &DoublyLinkedListTest::VirtualWithoutOffsetTest)); 79 suite->addTest(new CppUnit::TestCaller<DoublyLinkedListTest>("DoublyLinkedList::virtual with offset", &DoublyLinkedListTest::VirtualWithOffsetTest)); 80 81 return suite; 82} 83 84 85//! Tests the given list 86 87template <typename Item> 88void 89DoublyLinkedListTest::TestList() 90{ 91 DoublyLinkedList<Item, DoublyLinkedListMemberGetLink<Item> > list; 92 int valueCount = 10; 93 Item items[valueCount]; 94 95 // initialize 96 97 for (int i = 0; i < valueCount; i++) { 98 items[i].value = i; 99 list.Add(&items[i]); 100 } 101 102 // list must not be empty 103 104 CHK(!list.IsEmpty()); 105 106 // count items in list 107 108 int count = 0; 109 typename DoublyLinkedList<Item, 110 DoublyLinkedListMemberGetLink<Item> >::Iterator 111 iterator = list.GetIterator(); 112 while (iterator.Next() != NULL) 113 count++; 114 115 CHK(count == valueCount); 116 117 // test for equality 118 119 iterator = list.GetIterator(); 120 121 int i = 0; 122 Item *item; 123 while ((item = iterator.Next()) != NULL) { 124 CHK(item->value == i); 125 CHK(item == &items[i]); 126 i++; 127 } 128 129 // remove first 130 131 Item *first = list.RemoveHead(); 132 CHK(first->value == 0); 133 CHK(first == &items[0]); 134 135 // remove every second 136 137 iterator = list.GetIterator(); 138 i = 0; 139 while ((item = iterator.Next()) != NULL) { 140 CHK(item->value == i + 1); 141 142 if (i % 2) 143 list.Remove(item); 144 i++; 145 } 146 147 // re-add first 148 149 list.Add(first); 150 151 // count again 152 153 count = 0; 154 iterator = list.GetIterator(); 155 while (iterator.Next() != NULL) 156 count++; 157 158 CHK(count == (valueCount / 2) + 1); 159} 160 161 162//! Test using no offset, no virtual 163 164void 165DoublyLinkedListTest::WithoutOffsetTest() { 166 TestList<ItemWithout>(); 167} 168 169 170//! Test using offset, no virtual 171 172void 173DoublyLinkedListTest::WithOffsetTest() { 174 TestList<ItemWith>(); 175} 176 177 178//! Test using no offset, virtual 179 180void 181DoublyLinkedListTest::VirtualWithoutOffsetTest() { 182 TestList<ItemVirtualWithout>(); 183} 184 185 186//! Test using offset, virtual 187 188void 189DoublyLinkedListTest::VirtualWithOffsetTest() { 190 TestList<ItemVirtualWith>(); 191} 192 193