1 /*
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <stdio.h>
12 #include <stdlib.h>
13
14 #include "list_wrapper.h"
15
16 const int kNumberOfElements = 10;
17
FailTest(bool failed)18 void FailTest(bool failed)
19 {
20 if (failed)
21 {
22 printf("Test failed!\n");
23 printf("Press enter to continue:");
24 getchar();
25 exit(0);
26 }
27 }
28
GetStoredIntegerValue(ListItem * list_item)29 int GetStoredIntegerValue(ListItem* list_item)
30 {
31 void* list_item_pointer = list_item->GetItem();
32 if (list_item_pointer != NULL)
33 {
34 return *(reinterpret_cast<int*>(list_item_pointer));
35 }
36 return static_cast<int>(list_item->GetUnsignedItem());
37 }
38
PrintList(ListWrapper & list)39 void PrintList(ListWrapper& list)
40 {
41 ListItem* list_item = list.First();
42 printf("List: ");
43 while (list_item != NULL)
44 {
45 int item_value = GetStoredIntegerValue(list_item);
46 FailTest(item_value < 0);
47 printf(" %d",item_value);
48 list_item = list.Next(list_item);
49 }
50 printf("\n");
51 }
52
53 // The list should always be in ascending order
ListSanity(ListWrapper & list)54 void ListSanity(ListWrapper& list)
55 {
56 if(list.Empty())
57 {
58 return;
59 }
60 ListItem* item_iter = list.First();
61 // Fake a previous value for the first iteration
62 int previous_value = GetStoredIntegerValue(item_iter) - 1;
63 while (item_iter != NULL)
64 {
65 const int value = GetStoredIntegerValue(item_iter);
66 FailTest(value != previous_value + 1);
67 previous_value = value;
68 item_iter = list.Next(item_iter);
69 }
70 }
71
main(int,char * [])72 int main(int /*argc*/, char* /*argv*/[])
73 {
74 printf("List Test:\n");
75 int element_array[kNumberOfElements];
76 for (int i = 0; i < kNumberOfElements; i++)
77 {
78 element_array[i] = i;
79 }
80 // Test PushBack 1
81 ListWrapper test_list;
82 for (int i = 2; i < kNumberOfElements - 2; i++)
83 {
84 FailTest(test_list.PushBack((void*)&element_array[i]) != 0);
85 }
86 // Test PushBack 2
87 FailTest(test_list.PushBack(element_array[kNumberOfElements - 2]) != 0);
88 FailTest(test_list.PushBack(element_array[kNumberOfElements - 1]) != 0);
89 // Test PushFront 2
90 FailTest(test_list.PushFront(element_array[1]) != 0);
91 // Test PushFront 1
92 FailTest(test_list.PushFront((void*)&element_array[0]) != 0);
93 // Test GetSize
94 FailTest(test_list.GetSize() != kNumberOfElements);
95 PrintList(test_list);
96 //Test PopFront
97 FailTest(test_list.PopFront() != 0);
98 //Test PopBack
99 FailTest(test_list.PopBack() != 0);
100 // Test GetSize
101 FailTest(test_list.GetSize() != kNumberOfElements - 2);
102 // Test Empty
103 FailTest(test_list.Empty());
104 // Test First
105 ListItem* first_item = test_list.First();
106 FailTest(first_item == NULL);
107 // Test Last
108 ListItem* last_item = test_list.Last();
109 FailTest(last_item == NULL);
110 // Test Next
111 ListItem* second_item = test_list.Next(first_item);
112 FailTest(second_item == NULL);
113 FailTest(test_list.Next(last_item) != NULL);
114 FailTest(test_list.Next(NULL) != NULL);
115 // Test Previous
116 ListItem* second_to_last_item = test_list.Previous(last_item);
117 FailTest(second_to_last_item == NULL);
118 FailTest(test_list.Previous(first_item) != NULL);
119 FailTest(test_list.Previous(NULL) != NULL);
120 // Test GetUnsignedItem
121 FailTest(last_item->GetUnsignedItem() !=
122 kNumberOfElements - 2);
123 FailTest(last_item->GetItem() !=
124 NULL);
125 // Test GetItem
126 FailTest(GetStoredIntegerValue(second_to_last_item) !=
127 kNumberOfElements - 3);
128 FailTest(second_to_last_item->GetUnsignedItem() != 0);
129 // Pop last and first since they are pushed as unsigned items.
130 FailTest(test_list.PopFront() != 0);
131 FailTest(test_list.PopBack() != 0);
132 // Test Insert. Please note that old iterators are no longer valid at
133 // this point.
134 ListItem* insert_item_last = new ListItem(reinterpret_cast<void*>(&element_array[kNumberOfElements - 2]));
135 FailTest(test_list.Insert(test_list.Last(),insert_item_last) != 0);
136 FailTest(test_list.Insert(NULL,insert_item_last) == 0);
137 ListItem* insert_item_last2 = new ListItem(reinterpret_cast<void*>(&element_array[kNumberOfElements - 2]));
138 FailTest(test_list.Insert(insert_item_last2,NULL) == 0);
139 // test InsertBefore
140 ListItem* insert_item_first = new ListItem(reinterpret_cast<void*>(&element_array[1]));
141 FailTest(test_list.InsertBefore(test_list.First(),insert_item_first) != 0);
142 FailTest(test_list.InsertBefore(NULL,insert_item_first) == 0);
143 ListItem* insert_item_first2 = new ListItem(reinterpret_cast<void*>(&element_array[1]));
144 FailTest(test_list.InsertBefore(insert_item_first2,NULL) == 0);
145 PrintList(test_list);
146 ListSanity(test_list);
147 // Erase the whole list
148 int counter = 0;
149 while (test_list.PopFront() == 0)
150 {
151 FailTest(counter++ > kNumberOfElements);
152 }
153 PrintList(test_list);
154 // Test APIs when list is empty
155 FailTest(test_list.GetSize() != 0);
156 FailTest(test_list.PopFront() != -1);
157 FailTest(test_list.PopBack() != -1);
158 FailTest(!test_list.Empty());
159 FailTest(test_list.First() != NULL);
160 FailTest(test_list.Last() != NULL);
161 FailTest(test_list.Next(NULL) != NULL);
162 FailTest(test_list.Previous(NULL) != NULL);
163 FailTest(test_list.Erase(NULL) != -1);
164 // Test Insert APIs when list is empty
165 ListItem* new_item = new ListItem(reinterpret_cast<void*>(&element_array[0]));
166 FailTest(test_list.Insert(NULL,new_item) != 0);
167 FailTest(test_list.Empty());
168 FailTest(test_list.PopFront() != 0);
169 ListItem* new_item2 = new ListItem(reinterpret_cast<void*>(&element_array[0]));
170 FailTest(test_list.InsertBefore(NULL,new_item2) != 0);
171 FailTest(test_list.Empty());
172
173 printf("Tests passed successfully!\n");
174 }
175