175 lines
5.9 KiB
C++
175 lines
5.9 KiB
C++
|
/*
|
||
|
* 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");
|
||
|
}
|