| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| |
| #include "list_wrapper.h" |
| |
| const int kNumberOfElements = 10; |
| |
| void FailTest(bool failed) |
| { |
| if (failed) |
| { |
| printf("Test failed!\n"); |
| printf("Press enter to continue:"); |
| getchar(); |
| exit(0); |
| } |
| } |
| |
| int GetStoredIntegerValue(ListItem* list_item) |
| { |
| void* list_item_pointer = list_item->GetItem(); |
| if (list_item_pointer != NULL) |
| { |
| return *(reinterpret_cast<int*>(list_item_pointer)); |
| } |
| return static_cast<int>(list_item->GetUnsignedItem()); |
| } |
| |
| void PrintList(ListWrapper& list) |
| { |
| ListItem* list_item = list.First(); |
| printf("List: "); |
| while (list_item != NULL) |
| { |
| int item_value = GetStoredIntegerValue(list_item); |
| FailTest(item_value < 0); |
| printf(" %d",item_value); |
| list_item = list.Next(list_item); |
| } |
| printf("\n"); |
| } |
| |
| // The list should always be in ascending order |
| void ListSanity(ListWrapper& list) |
| { |
| if(list.Empty()) |
| { |
| return; |
| } |
| ListItem* item_iter = list.First(); |
| // Fake a previous value for the first iteration |
| int previous_value = GetStoredIntegerValue(item_iter) - 1; |
| while (item_iter != NULL) |
| { |
| const int value = GetStoredIntegerValue(item_iter); |
| FailTest(value != previous_value + 1); |
| previous_value = value; |
| item_iter = list.Next(item_iter); |
| } |
| } |
| |
| int main(int /*argc*/, char* /*argv*/[]) |
| { |
| printf("List Test:\n"); |
| int element_array[kNumberOfElements]; |
| for (int i = 0; i < kNumberOfElements; i++) |
| { |
| element_array[i] = i; |
| } |
| // Test PushBack 1 |
| ListWrapper test_list; |
| for (int i = 2; i < kNumberOfElements - 2; i++) |
| { |
| FailTest(test_list.PushBack((void*)&element_array[i]) != 0); |
| } |
| // Test PushBack 2 |
| FailTest(test_list.PushBack(element_array[kNumberOfElements - 2]) != 0); |
| FailTest(test_list.PushBack(element_array[kNumberOfElements - 1]) != 0); |
| // Test PushFront 2 |
| FailTest(test_list.PushFront(element_array[1]) != 0); |
| // Test PushFront 1 |
| FailTest(test_list.PushFront((void*)&element_array[0]) != 0); |
| // Test GetSize |
| FailTest(test_list.GetSize() != kNumberOfElements); |
| PrintList(test_list); |
| //Test PopFront |
| FailTest(test_list.PopFront() != 0); |
| //Test PopBack |
| FailTest(test_list.PopBack() != 0); |
| // Test GetSize |
| FailTest(test_list.GetSize() != kNumberOfElements - 2); |
| // Test Empty |
| FailTest(test_list.Empty()); |
| // Test First |
| ListItem* first_item = test_list.First(); |
| FailTest(first_item == NULL); |
| // Test Last |
| ListItem* last_item = test_list.Last(); |
| FailTest(last_item == NULL); |
| // Test Next |
| ListItem* second_item = test_list.Next(first_item); |
| FailTest(second_item == NULL); |
| FailTest(test_list.Next(last_item) != NULL); |
| FailTest(test_list.Next(NULL) != NULL); |
| // Test Previous |
| ListItem* second_to_last_item = test_list.Previous(last_item); |
| FailTest(second_to_last_item == NULL); |
| FailTest(test_list.Previous(first_item) != NULL); |
| FailTest(test_list.Previous(NULL) != NULL); |
| // Test GetUnsignedItem |
| FailTest(last_item->GetUnsignedItem() != |
| kNumberOfElements - 2); |
| FailTest(last_item->GetItem() != |
| NULL); |
| // Test GetItem |
| FailTest(GetStoredIntegerValue(second_to_last_item) != |
| kNumberOfElements - 3); |
| FailTest(second_to_last_item->GetUnsignedItem() != 0); |
| // Pop last and first since they are pushed as unsigned items. |
| FailTest(test_list.PopFront() != 0); |
| FailTest(test_list.PopBack() != 0); |
| // Test Insert. Please note that old iterators are no longer valid at |
| // this point. |
| ListItem* insert_item_last = new ListItem(reinterpret_cast<void*>(&element_array[kNumberOfElements - 2])); |
| FailTest(test_list.Insert(test_list.Last(),insert_item_last) != 0); |
| FailTest(test_list.Insert(NULL,insert_item_last) == 0); |
| ListItem* insert_item_last2 = new ListItem(reinterpret_cast<void*>(&element_array[kNumberOfElements - 2])); |
| FailTest(test_list.Insert(insert_item_last2,NULL) == 0); |
| // test InsertBefore |
| ListItem* insert_item_first = new ListItem(reinterpret_cast<void*>(&element_array[1])); |
| FailTest(test_list.InsertBefore(test_list.First(),insert_item_first) != 0); |
| FailTest(test_list.InsertBefore(NULL,insert_item_first) == 0); |
| ListItem* insert_item_first2 = new ListItem(reinterpret_cast<void*>(&element_array[1])); |
| FailTest(test_list.InsertBefore(insert_item_first2,NULL) == 0); |
| PrintList(test_list); |
| ListSanity(test_list); |
| // Erase the whole list |
| int counter = 0; |
| while (test_list.PopFront() == 0) |
| { |
| FailTest(counter++ > kNumberOfElements); |
| } |
| PrintList(test_list); |
| // Test APIs when list is empty |
| FailTest(test_list.GetSize() != 0); |
| FailTest(test_list.PopFront() != -1); |
| FailTest(test_list.PopBack() != -1); |
| FailTest(!test_list.Empty()); |
| FailTest(test_list.First() != NULL); |
| FailTest(test_list.Last() != NULL); |
| FailTest(test_list.Next(NULL) != NULL); |
| FailTest(test_list.Previous(NULL) != NULL); |
| FailTest(test_list.Erase(NULL) != -1); |
| // Test Insert APIs when list is empty |
| ListItem* new_item = new ListItem(reinterpret_cast<void*>(&element_array[0])); |
| FailTest(test_list.Insert(NULL,new_item) != 0); |
| FailTest(test_list.Empty()); |
| FailTest(test_list.PopFront() != 0); |
| ListItem* new_item2 = new ListItem(reinterpret_cast<void*>(&element_array[0])); |
| FailTest(test_list.InsertBefore(NULL,new_item2) != 0); |
| FailTest(test_list.Empty()); |
| |
| printf("Tests passed successfully!\n"); |
| } |