xref: /haiku/src/tests/system/kernel/util/SinglyLinkedListTest.cpp (revision 548149fe48f59cf27f6071e9629b8bbe2ad32c1f)
1 #include <cppunit/Test.h>
2 #include <cppunit/TestCaller.h>
3 #include <cppunit/TestSuite.h>
4 #include <stdio.h>
5 #include <TestUtils.h>
6 
7 #include "SinglyLinkedListTest.h"
8 #include "SinglyLinkedList.h"
9 
10 SinglyLinkedListTest::SinglyLinkedListTest(std::string name)
11 	: BTestCase(name)
12 {
13 }
14 
15 CppUnit::Test*
16 SinglyLinkedListTest::Suite() {
17 	CppUnit::TestSuite *suite = new CppUnit::TestSuite("SLL");
18 
19 	suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::User Strategy Test (default next parameter)", &SinglyLinkedListTest::UserDefaultTest));
20 	suite->addTest(new CppUnit::TestCaller<SinglyLinkedListTest>("SinglyLinkedList::User Strategy Test (custom next parameter)", &SinglyLinkedListTest::UserCustomTest));
21 
22 	return suite;
23 }
24 
25 // Class used for testing default User strategy
26 class Link {
27 public:
28 	SinglyLinkedListLink<Link> next;
29 	long data;
30 
31 	SinglyLinkedListLink<Link>* GetSinglyLinkedListLink() {
32 		return &next;
33 	}
34 
35 	bool operator==(const Link &ref) {
36 		return data == ref.data;
37 	}
38 };
39 
40 // Class used for testing custom User strategy
41 class MyLink {
42 public:
43 	SinglyLinkedListLink<MyLink> mynext;
44 	long data;
45 
46 	bool operator==(const MyLink &ref) {
47 		return data == ref.data;
48 	}
49 };
50 
51 //! Tests the given list
52 template <class List, class Element>
53 void
54 SinglyLinkedListTest::TestList(List &list, Element *values, int valueCount)
55 {
56 	list.MakeEmpty();
57 
58 	// PushFront
59 	for (int i = 0; i < valueCount; i++) {
60 		NextSubTest();
61 		CHK(list.Size() == i);
62 		list.Add(&values[i]);
63 		CHK(list.Size() == i+1);
64 	}
65 
66 	// Prefix increment
67 	int preIndex = valueCount-1;
68 	for (typename List::Iterator iterator = list.GetIterator();
69 			iterator.HasNext(); --preIndex) {
70 		NextSubTest();
71 
72  		Element* element = iterator.Next();
73 		CHK(*element == values[preIndex]);
74 	}
75 	CHK(preIndex == -1);
76 	list.MakeEmpty();
77 }
78 
79 //! Test using the User strategy with the default NextMember.
80 void
81 SinglyLinkedListTest::UserDefaultTest() {
82 	SinglyLinkedList<Link> list;
83 	const int valueCount = 10;
84 	Link values[valueCount];
85 	for (int i = 0; i < valueCount; i++) {
86 		values[i].data = i;
87 		if (i % 2)
88 			values[i].next.next = NULL;	// Leave some next pointers invalid just for fun
89 	}
90 
91 	TestList(list, values, valueCount);
92 }
93 
94 //! Test using the User strategy with a custom NextMember.
95 void
96 SinglyLinkedListTest::UserCustomTest() {
97 	SinglyLinkedList<MyLink, SinglyLinkedListMemberGetLink<MyLink, &MyLink::mynext> > list;
98 	const int valueCount = 10;
99 	MyLink values[valueCount];
100 	for (int i = 0; i < valueCount; i++) {
101 		values[i].data = i*2;
102 		if (!(i % 2))
103 			values[i].mynext.next = NULL;	// Leave some next pointers invalid just for fun
104 	}
105 
106 	TestList(list, values, valueCount);
107 }
108