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