Skip to content

Commit

Permalink
Match linked list tests with the current API.
Browse files Browse the repository at this point in the history
  • Loading branch information
pulkomandy committed Jun 9, 2014
1 parent 49a6a0e commit 913e376
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 70 deletions.
19 changes: 10 additions & 9 deletions src/tests/system/kernel/util/DoublyLinkedListTest.cpp
Expand Up @@ -16,23 +16,23 @@
// Class used for testing without offset
class ItemWithout {
public:
DoublyLinked::Link fLink;
DoublyLinkedListLink<ItemWithout> fLink;
int32 value;
};

// Class used for testing with offset
class ItemWith {
public:
int32 value;
DoublyLinked::Link fLink;
DoublyLinkedListLink<ItemWith> fLink;
};

// Class used for testing without offset
class ItemVirtualWithout {
public:
virtual int32 Value();

DoublyLinked::Link fLink;
DoublyLinkedListLink<ItemVirtualWithout> fLink;
int32 value;
};

Expand All @@ -42,7 +42,7 @@ class ItemVirtualWith {
virtual int32 Value();

int32 value;
DoublyLinked::Link fLink;
DoublyLinkedListLink<ItemVirtualWith> fLink;
};


Expand Down Expand Up @@ -88,7 +88,7 @@ template <typename Item>
void
DoublyLinkedListTest::TestList()
{
DoublyLinked::List<Item> list;
DoublyLinkedList<Item, DoublyLinkedListMemberGetLink<Item> > list;
int valueCount = 10;
Item items[valueCount];

Expand All @@ -106,15 +106,16 @@ DoublyLinkedListTest::TestList()
// count items in list

int count = 0;
DoublyLinked::Iterator<Item> iterator = list.Iterator();
DoublyLinkedList<Item, DoublyLinkedListMemberGetLink<Item> >::Iterator
iterator = list.GetIterator();
while (iterator.Next() != NULL)
count++;

CHK(count == valueCount);

// test for equality

iterator = list.Iterator();
iterator = list.GetIterator();

int i = 0;
Item *item;
Expand All @@ -132,7 +133,7 @@ DoublyLinkedListTest::TestList()

// remove every second

iterator = list.Iterator();
iterator = list.GetIterator();
i = 0;
while ((item = iterator.Next()) != NULL) {
CHK(item->value == i + 1);
Expand All @@ -149,7 +150,7 @@ DoublyLinkedListTest::TestList()
// count again

count = 0;
iterator = list.Iterator();
iterator = list.GetIterator();
while (iterator.Next() != NULL)
count++;

Expand Down
78 changes: 20 additions & 58 deletions src/tests/system/kernel/util/SinglyLinkedListTest.cpp
Expand Up @@ -18,17 +18,20 @@ SinglyLinkedListTest::Suite() {

suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::User Strategy Test (default next parameter)", &SinglyLinkedListTest::UserDefaultTest));
suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::User Strategy Test (custom next parameter)", &SinglyLinkedListTest::UserCustomTest));
suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::Auto Strategy Test (MallocFreeAllocator)", &SinglyLinkedListTest::AutoTest));

return suite;
}

// Class used for testing default User strategy
class Link {
public:
Link* next;
SinglyLinkedListLink<Link> next;
long data;

SinglyLinkedListLink<Link>* GetSinglyLinkedListLink() {
return &next;
}

bool operator==(const Link &ref) {
return data == ref.data;
}
Expand All @@ -37,80 +40,52 @@ class Link {
// Class used for testing custom User strategy
class MyLink {
public:
MyLink* mynext;
SinglyLinkedListLink<MyLink> mynext;
long data;

bool operator==(const MyLink &ref) {
return data == ref.data;
}
};

using Strategy::SinglyLinkedList::User;
using Strategy::SinglyLinkedList::Auto;

//! Tests the given list
template <class List>
template <class List, class Element>
void
SinglyLinkedListTest::TestList(List &list, typename List::ValueType *values, int valueCount)
SinglyLinkedListTest::TestList(List &list, Element *values, int valueCount)
{
list.MakeEmpty();

// PushFront
for (int i = 0; i < valueCount; i++) {
NextSubTest();
CHK(list.Count() == i);
CHK(list.PushFront(values[i]) == B_OK);
CHK(list.Count() == i+1);
CHK(list.Size() == i);
list.Add(&values[i]);
CHK(list.Size() == i+1);
}

{
// Prefix increment
int preIndex = valueCount-1;
typename List::Iterator iterator;
for (iterator = list.Begin(); iterator != list.End(); --preIndex) {
for (typename List::Iterator iterator = list.GetIterator();
iterator.HasNext(); --preIndex) {
NextSubTest();
// printf("(%p, %ld) %s (%p, %ld)\n", iterator->next, iterator->data, ((*iterator == values[preIndex]) ? "==" : "!="), values[preIndex].next, values[preIndex].data);
CHK(*iterator == values[preIndex]);
typename List::Iterator copy = iterator;
CHK(copy == iterator);
CHK(copy != ++iterator);

Element* element = iterator.Next();
CHK(*element == values[preIndex]);
}
CHK(preIndex == -1);
}
list.MakeEmpty();

// PushBack
for (int i = 0; i < valueCount; i++) {
NextSubTest();
CHK(list.Count() == i);
CHK(list.PushBack(values[i]) == B_OK);
CHK(list.Count() == i+1);
}

// Postfix increment
int postIndex = 0;
for (typename List::Iterator iterator = list.Begin(); iterator != list.End(); ++postIndex) {
NextSubTest();
// printf("(%p, %ld) %s (%p, %ld)\n", iterator->next, iterator->data, ((*iterator == values[postIndex]) ? "==" : "!="), values[postIndex].next, values[postIndex].data);
CHK(*iterator == values[postIndex]);
typename List::Iterator copy = iterator;
CHK(copy == iterator);
CHK(copy == iterator++);
}
CHK(postIndex == valueCount);

}

//! Test using the User strategy with the default NextMember.
void
SinglyLinkedListTest::UserDefaultTest() {
SinglyLinkedList<Link, User<Link> > list;
SinglyLinkedList<Link> list;
const int valueCount = 10;
Link values[valueCount];
for (int i = 0; i < valueCount; i++) {
values[i].data = i;
if (i % 2)
values[i].next = NULL; // Leave some next pointers invalid just for fun
values[i].next.next = NULL; // Leave some next pointers invalid just for fun
}

TestList(list, values, valueCount);
Expand All @@ -119,26 +94,13 @@ SinglyLinkedListTest::UserDefaultTest() {
//! Test using the User strategy with a custom NextMember.
void
SinglyLinkedListTest::UserCustomTest() {
SinglyLinkedList<MyLink, User<MyLink, &MyLink::mynext> > list;
SinglyLinkedList<MyLink, SinglyLinkedListMemberGetLink<MyLink, &MyLink::mynext> > list;
const int valueCount = 10;
MyLink values[valueCount];
for (int i = 0; i < valueCount; i++) {
values[i].data = i*2;
if (!(i % 2))
values[i].mynext = NULL; // Leave some next pointers invalid just for fun
}

TestList(list, values, valueCount);
}

//! Test using the Auto strategy.
void
SinglyLinkedListTest::AutoTest() {
SinglyLinkedList<long> list;
const int valueCount = 10;
long values[valueCount];
for (int i = 0; i < valueCount; i++) {
values[i] = i*3;
values[i].mynext.next = NULL; // Leave some next pointers invalid just for fun
}

TestList(list, values, valueCount);
Expand Down
5 changes: 2 additions & 3 deletions src/tests/system/kernel/util/SinglyLinkedListTest.h
Expand Up @@ -11,10 +11,9 @@ class SinglyLinkedListTest : public BTestCase {

void UserDefaultTest();
void UserCustomTest();
void AutoTest();
private:
template <class List>
void TestList(List &list, typename List::ValueType *values, int valueCount);
template <class List, class Element>
void TestList(List &list, Element *values, int valueCount);
};

#endif // _single_linked_list_test_h_

0 comments on commit 913e376

Please sign in to comment.