xref: /haiku/src/tests/system/kernel/util/SinglyLinkedListTest.cpp (revision 913e3765008cfe52fc98f621d5bd94841fcec39c)
177b1fd22SAxel Dörfler #include <cppunit/Test.h>
277b1fd22SAxel Dörfler #include <cppunit/TestCaller.h>
377b1fd22SAxel Dörfler #include <cppunit/TestSuite.h>
477b1fd22SAxel Dörfler #include <stdio.h>
577b1fd22SAxel Dörfler #include <TestUtils.h>
677b1fd22SAxel Dörfler 
777b1fd22SAxel Dörfler #include "SinglyLinkedListTest.h"
877b1fd22SAxel Dörfler #include "SinglyLinkedList.h"
977b1fd22SAxel Dörfler 
SinglyLinkedListTest(std::string name)1077b1fd22SAxel Dörfler SinglyLinkedListTest::SinglyLinkedListTest(std::string name)
1177b1fd22SAxel Dörfler 	: BTestCase(name)
1277b1fd22SAxel Dörfler {
1377b1fd22SAxel Dörfler }
1477b1fd22SAxel Dörfler 
1577b1fd22SAxel Dörfler CppUnit::Test*
Suite()1677b1fd22SAxel Dörfler SinglyLinkedListTest::Suite() {
1777b1fd22SAxel Dörfler 	CppUnit::TestSuite *suite = new CppUnit::TestSuite("SLL");
1877b1fd22SAxel Dörfler 
1977b1fd22SAxel Dörfler 	suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::User Strategy Test (default next parameter)", &SinglyLinkedListTest::UserDefaultTest));
2077b1fd22SAxel Dörfler 	suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::User Strategy Test (custom next parameter)", &SinglyLinkedListTest::UserCustomTest));
2177b1fd22SAxel Dörfler 
2277b1fd22SAxel Dörfler 	return suite;
2377b1fd22SAxel Dörfler }
2477b1fd22SAxel Dörfler 
2577b1fd22SAxel Dörfler // Class used for testing default User strategy
2677b1fd22SAxel Dörfler class Link {
2777b1fd22SAxel Dörfler public:
28*913e3765SAdrien Destugues 	SinglyLinkedListLink<Link> next;
2977b1fd22SAxel Dörfler 	long data;
3077b1fd22SAxel Dörfler 
GetSinglyLinkedListLink()31*913e3765SAdrien Destugues 	SinglyLinkedListLink<Link>* GetSinglyLinkedListLink() {
32*913e3765SAdrien Destugues 		return &next;
33*913e3765SAdrien Destugues 	}
34*913e3765SAdrien Destugues 
operator ==(const Link & ref)3577b1fd22SAxel Dörfler 	bool operator==(const Link &ref) {
3677b1fd22SAxel Dörfler 		return data == ref.data;
3777b1fd22SAxel Dörfler 	}
3877b1fd22SAxel Dörfler };
3977b1fd22SAxel Dörfler 
4077b1fd22SAxel Dörfler // Class used for testing custom User strategy
4177b1fd22SAxel Dörfler class MyLink {
4277b1fd22SAxel Dörfler public:
43*913e3765SAdrien Destugues 	SinglyLinkedListLink<MyLink> mynext;
4477b1fd22SAxel Dörfler 	long data;
4577b1fd22SAxel Dörfler 
operator ==(const MyLink & ref)4677b1fd22SAxel Dörfler 	bool operator==(const MyLink &ref) {
4777b1fd22SAxel Dörfler 		return data == ref.data;
4877b1fd22SAxel Dörfler 	}
4977b1fd22SAxel Dörfler };
5077b1fd22SAxel Dörfler 
5177b1fd22SAxel Dörfler //! Tests the given list
52*913e3765SAdrien Destugues template <class List, class Element>
5377b1fd22SAxel Dörfler void
TestList(List & list,Element * values,int valueCount)54*913e3765SAdrien Destugues SinglyLinkedListTest::TestList(List &list, Element *values, int valueCount)
5577b1fd22SAxel Dörfler {
5677b1fd22SAxel Dörfler 	list.MakeEmpty();
5777b1fd22SAxel Dörfler 
5877b1fd22SAxel Dörfler 	// PushFront
5977b1fd22SAxel Dörfler 	for (int i = 0; i < valueCount; i++) {
6077b1fd22SAxel Dörfler 		NextSubTest();
61*913e3765SAdrien Destugues 		CHK(list.Size() == i);
62*913e3765SAdrien Destugues 		list.Add(&values[i]);
63*913e3765SAdrien Destugues 		CHK(list.Size() == i+1);
6477b1fd22SAxel Dörfler 	}
6577b1fd22SAxel Dörfler 
6677b1fd22SAxel Dörfler 	// Prefix increment
6777b1fd22SAxel Dörfler 	int preIndex = valueCount-1;
68*913e3765SAdrien Destugues 	for (typename List::Iterator iterator = list.GetIterator();
69*913e3765SAdrien Destugues 			iterator.HasNext(); --preIndex) {
7077b1fd22SAxel Dörfler 		NextSubTest();
71*913e3765SAdrien Destugues 
72*913e3765SAdrien Destugues  		Element* element = iterator.Next();
73*913e3765SAdrien Destugues 		CHK(*element == values[preIndex]);
7477b1fd22SAxel Dörfler 	}
7577b1fd22SAxel Dörfler 	CHK(preIndex == -1);
7677b1fd22SAxel Dörfler 	list.MakeEmpty();
7777b1fd22SAxel Dörfler }
7877b1fd22SAxel Dörfler 
7977b1fd22SAxel Dörfler //! Test using the User strategy with the default NextMember.
8077b1fd22SAxel Dörfler void
UserDefaultTest()8177b1fd22SAxel Dörfler SinglyLinkedListTest::UserDefaultTest() {
82*913e3765SAdrien Destugues 	SinglyLinkedList<Link> list;
8377b1fd22SAxel Dörfler 	const int valueCount = 10;
8477b1fd22SAxel Dörfler 	Link values[valueCount];
8577b1fd22SAxel Dörfler 	for (int i = 0; i < valueCount; i++) {
8677b1fd22SAxel Dörfler 		values[i].data = i;
8777b1fd22SAxel Dörfler 		if (i % 2)
88*913e3765SAdrien Destugues 			values[i].next.next = NULL;	// Leave some next pointers invalid just for fun
8977b1fd22SAxel Dörfler 	}
9077b1fd22SAxel Dörfler 
9177b1fd22SAxel Dörfler 	TestList(list, values, valueCount);
9277b1fd22SAxel Dörfler }
9377b1fd22SAxel Dörfler 
9477b1fd22SAxel Dörfler //! Test using the User strategy with a custom NextMember.
9577b1fd22SAxel Dörfler void
UserCustomTest()9677b1fd22SAxel Dörfler SinglyLinkedListTest::UserCustomTest() {
97*913e3765SAdrien Destugues 	SinglyLinkedList<MyLink, SinglyLinkedListMemberGetLink<MyLink, &MyLink::mynext> > list;
9877b1fd22SAxel Dörfler 	const int valueCount = 10;
9977b1fd22SAxel Dörfler 	MyLink values[valueCount];
10077b1fd22SAxel Dörfler 	for (int i = 0; i < valueCount; i++) {
10177b1fd22SAxel Dörfler 		values[i].data = i*2;
10277b1fd22SAxel Dörfler 		if (!(i % 2))
103*913e3765SAdrien Destugues 			values[i].mynext.next = NULL;	// Leave some next pointers invalid just for fun
10477b1fd22SAxel Dörfler 	}
10577b1fd22SAxel Dörfler 
10677b1fd22SAxel Dörfler 	TestList(list, values, valueCount);
10777b1fd22SAxel Dörfler }
108