• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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