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