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 "gtest/gtest.h" 12e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 13c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/list_wrapper.h" 14c55a96383497a772a307b346368133960b02ad03Eric Laurent#include "system_wrappers/interface/scoped_ptr.h" 15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentusing ::webrtc::ListWrapper; 17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentusing ::webrtc::ListItem; 18c55a96383497a772a307b346368133960b02ad03Eric Laurentusing ::webrtc::scoped_ptr; 19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Note: kNumberOfElements needs to be even. 21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentconst unsigned int kNumberOfElements = 10; 22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// An opaque implementation of dynamic or statically allocated unsigned ints. 24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// This class makes it possible to use the exact same code for testing of both 25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// the dynamic and static implementation of ListWrapper. 26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Clarification: ListWrapper has two versions of PushBack(..). It takes an 27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// unsigned integer or a void pointer. The integer implementation takes care 28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// of memory management. The void pointer version expect the caller to manage 29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// the memory associated with the void pointer. 30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// This class works like the integer version but can be implemented on top of 31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// either the integer version or void pointer version of ListWrapper. 32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Note: the non-virtual fuctions behave the same for both versions. 33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass ListWrapperSimple { 34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent static ListWrapperSimple* Create(bool static_allocation); 36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ~ListWrapperSimple() {} 37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // These three functions should be used for manipulating ListItems so that 39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // they are the type corresponding to the underlying implementation. 40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual unsigned int GetUnsignedItem( 41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const ListItem* item) const = 0; 42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ListItem* CreateListItem(unsigned int item_id) = 0; 43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int GetSize() const { 44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.GetSize(); 45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PushBack(const unsigned int item_id) = 0; 47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PushFront(const unsigned int item_id) = 0; 48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PopFront() = 0; 49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PopBack() = 0; 50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool Empty() const { 51e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.Empty(); 52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* First() const { 54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.First(); 55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* Last() const { 57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.Last(); 58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* Next(ListItem* item) const { 60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.Next(item); 61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* Previous(ListItem* item) const { 63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.Previous(item); 64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int Erase(ListItem* item) = 0; 66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int Insert(ListItem* existing_previous_item, 67c55a96383497a772a307b346368133960b02ad03Eric Laurent ListItem* new_item) { 68c55a96383497a772a307b346368133960b02ad03Eric Laurent const int retval = list_.Insert(existing_previous_item, new_item); 69c55a96383497a772a307b346368133960b02ad03Eric Laurent if (retval != 0) { 70c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_TRUE(DestroyListItem(new_item)); 71c55a96383497a772a307b346368133960b02ad03Eric Laurent } 72c55a96383497a772a307b346368133960b02ad03Eric Laurent return retval; 73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent int InsertBefore(ListItem* existing_next_item, 76c55a96383497a772a307b346368133960b02ad03Eric Laurent ListItem* new_item) { 77c55a96383497a772a307b346368133960b02ad03Eric Laurent const int retval = list_.InsertBefore(existing_next_item, new_item); 78c55a96383497a772a307b346368133960b02ad03Eric Laurent if (retval != 0) { 79c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_TRUE(DestroyListItem(new_item)); 80c55a96383497a772a307b346368133960b02ad03Eric Laurent } 81c55a96383497a772a307b346368133960b02ad03Eric Laurent return retval; 82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprotected: 84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapperSimple() {} 85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 86c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual bool DestroyListItemContent(ListItem* item) = 0; 87c55a96383497a772a307b346368133960b02ad03Eric Laurent bool DestroyListItem(ListItem* item) { 88c55a96383497a772a307b346368133960b02ad03Eric Laurent const bool retval = DestroyListItemContent(item); 89c55a96383497a772a307b346368133960b02ad03Eric Laurent delete item; 90c55a96383497a772a307b346368133960b02ad03Eric Laurent return retval; 91c55a96383497a772a307b346368133960b02ad03Eric Laurent } 92c55a96383497a772a307b346368133960b02ad03Eric Laurent 93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapper list_; 94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 96c55a96383497a772a307b346368133960b02ad03Eric Laurentvoid ClearList(ListWrapperSimple* list_wrapper) { 97c55a96383497a772a307b346368133960b02ad03Eric Laurent if (list_wrapper == NULL) { 98c55a96383497a772a307b346368133960b02ad03Eric Laurent return; 99c55a96383497a772a307b346368133960b02ad03Eric Laurent } 100c55a96383497a772a307b346368133960b02ad03Eric Laurent ListItem* list_item = list_wrapper->First(); 101c55a96383497a772a307b346368133960b02ad03Eric Laurent while (list_item != NULL) { 102c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(list_wrapper->Erase(list_item), 0); 103c55a96383497a772a307b346368133960b02ad03Eric Laurent list_item = list_wrapper->First(); 104c55a96383497a772a307b346368133960b02ad03Eric Laurent } 105c55a96383497a772a307b346368133960b02ad03Eric Laurent} 106c55a96383497a772a307b346368133960b02ad03Eric Laurent 107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass ListWrapperStatic : public ListWrapperSimple { 108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapperStatic() {} 110c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual ~ListWrapperStatic() { 111c55a96383497a772a307b346368133960b02ad03Eric Laurent ClearList(this); 112c55a96383497a772a307b346368133960b02ad03Eric Laurent } 113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual unsigned int GetUnsignedItem(const ListItem* item) const { 115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return item->GetUnsignedItem(); 116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ListItem* CreateListItem(unsigned int item_id) { 118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return new ListItem(item_id); 119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 120c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual bool DestroyListItemContent(ListItem* item) { 121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return true; 122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PushBack(const unsigned int item_id) { 124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.PushBack(item_id); 125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PushFront(const unsigned int item_id) { 127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.PushFront(item_id); 128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PopFront() { 130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.PopFront(); 131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PopBack() { 133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.PopBack(); 134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int Erase(ListItem* item) { 136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return list_.Erase(item); 137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass ListWrapperDynamic : public ListWrapperSimple { 141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentpublic: 142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapperDynamic() {} 143c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual ~ListWrapperDynamic() { 144c55a96383497a772a307b346368133960b02ad03Eric Laurent ClearList(this); 145c55a96383497a772a307b346368133960b02ad03Eric Laurent } 146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual unsigned int GetUnsignedItem(const ListItem* item) const { 148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const unsigned int* return_value_pointer = 149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent reinterpret_cast<unsigned int*> (item->GetItem()); 150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value_pointer == NULL) { 151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return *return_value_pointer; 154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual ListItem* CreateListItem(unsigned int item_id) { 156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int* item_id_pointer = new unsigned int; 157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item_id_pointer == NULL) { 158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *item_id_pointer = item_id; 161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* return_value = new ListItem( 162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent reinterpret_cast<void*>(item_id_pointer)); 163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value == NULL) { 164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete item_id_pointer; 165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 169c55a96383497a772a307b346368133960b02ad03Eric Laurent virtual bool DestroyListItemContent(ListItem* item) { 170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item == NULL) { 171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent bool return_value = false; 174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int* item_id_ptr = reinterpret_cast<unsigned int*>( 175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item->GetItem()); 176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item_id_ptr != NULL) { 177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return_value = true; 178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete item_id_ptr; 179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PushBack(const unsigned int item_id) { 183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int* item_id_ptr = new unsigned int; 184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item_id_ptr == NULL) { 185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *item_id_ptr = item_id; 188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const int return_value = list_.PushBack( 189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent reinterpret_cast<void*>(item_id_ptr)); 190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value != 0) { 191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete item_id_ptr; 192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PushFront(const unsigned int item_id) { 196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int* item_id_ptr = new unsigned int; 197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item_id_ptr == NULL) { 198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent *item_id_ptr = item_id; 201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const int return_value = list_.PushFront( 202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent reinterpret_cast<void*>(item_id_ptr)); 203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value != 0) { 204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete item_id_ptr; 205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PopFront() { 209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return Erase(list_.First()); 210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int PopBack() { 212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return Erase(list_.Last()); 213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent virtual int Erase(ListItem* item) { 215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (item == NULL) { 216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return -1; 217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 218c55a96383497a772a307b346368133960b02ad03Eric Laurent int retval = 0; 219c55a96383497a772a307b346368133960b02ad03Eric Laurent if (!DestroyListItemContent(item)) { 220c55a96383497a772a307b346368133960b02ad03Eric Laurent retval = -1; 221c55a96383497a772a307b346368133960b02ad03Eric Laurent ADD_FAILURE(); 222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (list_.Erase(item) != 0) { 224c55a96383497a772a307b346368133960b02ad03Eric Laurent retval = -1; 225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 226c55a96383497a772a307b346368133960b02ad03Eric Laurent return retval; 227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}; 229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListWrapperSimple* ListWrapperSimple::Create(bool static_allocation) { 231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if(static_allocation) 232e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 233e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return new ListWrapperStatic(); 234e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 235e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return new ListWrapperDynamic(); 236e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 237e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 238e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListWrapperSimple* CreateAscendingList(bool static_allocation) { 239e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapperSimple* return_value = ListWrapperSimple::Create( 240e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent static_allocation); 241e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value == NULL) { 242e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 243e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 244e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (unsigned int i = 0; i < kNumberOfElements; ++i) { 245e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value->PushBack(i) == -1) { 246e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ClearList(return_value); 247e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete return_value; 248e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 249e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 250e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 251e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 252e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 253e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 254c55a96383497a772a307b346368133960b02ad03Eric LaurentListWrapperSimple* CreateDescendingList(bool static_allocation) { 255e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapperSimple* return_value = ListWrapperSimple::Create( 256e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent static_allocation); 257e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value == NULL) { 258e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 259e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 260e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (unsigned int i = 0; i < kNumberOfElements; ++i) { 261e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value->PushBack(kNumberOfElements - i - 1) == -1) { 262e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ClearList(return_value); 263e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete return_value; 264e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 265e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 266e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 267e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 268e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 269e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 270e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// [0,kNumberOfElements - 1,1,kNumberOfElements - 2,...] (this is why 271e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// kNumberOfElements need to be even) 272e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentListWrapperSimple* CreateInterleavedList(bool static_allocation) { 273e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListWrapperSimple* return_value = ListWrapperSimple::Create( 274e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent static_allocation); 275e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value == NULL) { 276e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 277e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 278e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int uneven_count = 0; 279e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int even_count = 0; 280e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (unsigned int i = 0; i < kNumberOfElements; i++) { 281e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int push_value = 0; 282e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if ((i % 2) == 0) { 283e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent push_value = even_count; 284e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent even_count++; 285e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } else { 286e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent push_value = kNumberOfElements - uneven_count - 1; 287e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent uneven_count++; 288e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 289e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (return_value->PushBack(push_value) == -1) { 290e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ClearList(return_value); 291e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent delete return_value; 292e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return NULL; 293e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 294e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 295e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return return_value; 296e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 297e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 298e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid PrintList(const ListWrapperSimple* list) { 299e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* list_item = list->First(); 300e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent printf("["); 301e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while (list_item != NULL) 302e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 303e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent printf("%3u", list->GetUnsignedItem(list_item)); 304e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent list_item = list->Next(list_item); 305e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 306e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent printf("]\n"); 307e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 308e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 309e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool CompareLists(const ListWrapperSimple* lhs, const ListWrapperSimple* rhs) { 310e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const unsigned int list_size = lhs->GetSize(); 311e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (lhs->GetSize() != rhs->GetSize()) { 312e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 313e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 314e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (lhs->Empty()) { 315e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return rhs->Empty(); 316e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 317e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent unsigned int i = 0; 318e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* lhs_item = lhs->First(); 319e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* rhs_item = rhs->First(); 320e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while (i < list_size) { 321e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (lhs_item == NULL) { 322e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 323e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 324e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (rhs_item == NULL) { 325e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 326e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 327e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent if (lhs->GetUnsignedItem(lhs_item) != rhs->GetUnsignedItem(rhs_item)) { 328e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return false; 329e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 330e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent i++; 331e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent lhs_item = lhs->Next(lhs_item); 332e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent rhs_item = rhs->Next(rhs_item); 333e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 334e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent return true; 335e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 336e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 337e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST(ListWrapperTest,ReverseNewIntList) { 338e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Create a new temporary list with elements reversed those of 339e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // new_int_list_ 340c55a96383497a772a307b346368133960b02ad03Eric Laurent const scoped_ptr<ListWrapperSimple> descending_list( 341c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateDescendingList(rand()%2)); 342c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(descending_list.get() == NULL); 343c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(descending_list->Empty()); 344c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(kNumberOfElements,descending_list->GetSize()); 345c55a96383497a772a307b346368133960b02ad03Eric Laurent 346c55a96383497a772a307b346368133960b02ad03Eric Laurent const scoped_ptr<ListWrapperSimple> ascending_list( 347c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateAscendingList(rand()%2)); 348c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(ascending_list.get() == NULL); 349e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(ascending_list->Empty()); 350e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_EQ(kNumberOfElements,ascending_list->GetSize()); 351e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 352c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> list_to_reverse( 353c55a96383497a772a307b346368133960b02ad03Eric Laurent ListWrapperSimple::Create(rand()%2)); 354e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 355e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Reverse the list using PushBack and Previous. 356e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (ListItem* item = ascending_list->Last(); item != NULL; 357e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item = ascending_list->Previous(item)) { 358e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent list_to_reverse->PushBack(ascending_list->GetUnsignedItem(item)); 359e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 360e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 361c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(CompareLists(descending_list.get(), list_to_reverse.get())); 362e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 363c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> list_to_un_reverse( 364c55a96383497a772a307b346368133960b02ad03Eric Laurent ListWrapperSimple::Create(rand()%2)); 365c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(list_to_un_reverse.get() == NULL); 366e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent // Reverse the reversed list using PushFront and Next. 367e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent for (ListItem* item = list_to_reverse->First(); item != NULL; 368e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item = list_to_reverse->Next(item)) { 369e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent list_to_un_reverse->PushFront(list_to_reverse->GetUnsignedItem(item)); 370e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 371c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(CompareLists(ascending_list.get(), list_to_un_reverse.get())); 372e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 373e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 374e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST(ListWrapperTest,PopTest) { 375c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> ascending_list(CreateAscendingList(rand()%2)); 376c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(ascending_list.get() == NULL); 377e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(ascending_list->Empty()); 378c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, ascending_list->PopFront()); 379c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(1U, ascending_list->GetUnsignedItem(ascending_list->First())); 380c55a96383497a772a307b346368133960b02ad03Eric Laurent 381c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, ascending_list->PopBack()); 382c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(kNumberOfElements - 2, ascending_list->GetUnsignedItem( 383e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ascending_list->Last())); 384e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent EXPECT_EQ(kNumberOfElements - 2, ascending_list->GetSize()); 385e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 386e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 387e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Use Insert to interleave two lists. 388e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST(ListWrapperTest,InterLeaveTest) { 389c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> interleave_list( 390c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateAscendingList(rand()%2)); 391c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(interleave_list.get() == NULL); 392e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(interleave_list->Empty()); 393e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 394c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> descending_list( 395c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateDescendingList(rand()%2)); 396c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(descending_list.get() == NULL); 397e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 398c55a96383497a772a307b346368133960b02ad03Eric Laurent for (unsigned int i = 0; i < kNumberOfElements/2; ++i) { 399c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(0, interleave_list->PopBack()); 400c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(0, descending_list->PopBack()); 401e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 402c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(kNumberOfElements/2, interleave_list->GetSize()); 403c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(kNumberOfElements/2, descending_list->GetSize()); 404e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 405c55a96383497a772a307b346368133960b02ad03Eric Laurent unsigned int insert_position = kNumberOfElements/2; 406e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_EQ(insert_position * 2, kNumberOfElements); 407c55a96383497a772a307b346368133960b02ad03Eric Laurent while (!descending_list->Empty()) 408e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 409c55a96383497a772a307b346368133960b02ad03Eric Laurent ListItem* item = descending_list->Last(); 410e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(item == NULL); 411e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 412c55a96383497a772a307b346368133960b02ad03Eric Laurent const unsigned int item_id = descending_list->GetUnsignedItem(item); 413c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(0, descending_list->Erase(item)); 414e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 415e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* insert_item = interleave_list->CreateListItem(item_id); 416e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(insert_item == NULL); 417e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item = interleave_list->First(); 418e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(item == NULL); 419c55a96383497a772a307b346368133960b02ad03Eric Laurent for (unsigned int j = 0; j < insert_position - 1; ++j) { 420e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item = interleave_list->Next(item); 421e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(item == NULL); 422e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 423c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(0, interleave_list->Insert(item, insert_item)); 424e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent --insert_position; 425e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 426e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 427c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> interleaved_list( 428c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateInterleavedList(rand()%2)); 429c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(interleaved_list.get() == NULL); 430c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(interleaved_list->Empty()); 431c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(CompareLists(interleaved_list.get(), interleave_list.get())); 432e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 433e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 434e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Use InsertBefore to interleave two lists. 435e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST(ListWrapperTest,InterLeaveTestII) { 436c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> interleave_list( 437c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateDescendingList(rand()%2)); 438c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(interleave_list.get() == NULL); 439e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(interleave_list->Empty()); 440e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 441c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> ascending_list(CreateAscendingList(rand()%2)); 442c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(ascending_list.get() == NULL); 443e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 444c55a96383497a772a307b346368133960b02ad03Eric Laurent for (unsigned int i = 0; i < kNumberOfElements/2; ++i) { 445c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(0, interleave_list->PopBack()); 446c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(0, ascending_list->PopBack()); 447e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 448c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(kNumberOfElements/2, interleave_list->GetSize()); 449c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_EQ(kNumberOfElements/2, ascending_list->GetSize()); 450e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 451c55a96383497a772a307b346368133960b02ad03Eric Laurent unsigned int insert_position = kNumberOfElements/2; 452e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_EQ(insert_position * 2, kNumberOfElements); 453e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent while (!ascending_list->Empty()) 454e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent { 455e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* item = ascending_list->Last(); 456e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(item == NULL); 457e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 458e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent const unsigned int item_id = ascending_list->GetUnsignedItem(item); 459e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_EQ(0,ascending_list->Erase(item)); 460e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 461e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ListItem* insert_item = interleave_list->CreateListItem(item_id); 462e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(insert_item == NULL); 463e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item = interleave_list->First(); 464e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(item == NULL); 465c55a96383497a772a307b346368133960b02ad03Eric Laurent for (unsigned int j = 0; j < insert_position - 1; ++j) { 466e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent item = interleave_list->Next(item); 467e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(item == NULL); 468e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 469c55a96383497a772a307b346368133960b02ad03Eric Laurent EXPECT_EQ(interleave_list->InsertBefore(item, insert_item), 0); 470e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent --insert_position; 471e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent } 472e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 473c55a96383497a772a307b346368133960b02ad03Eric Laurent scoped_ptr<ListWrapperSimple> interleaved_list( 474c55a96383497a772a307b346368133960b02ad03Eric Laurent CreateInterleavedList(rand()%2)); 475c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_FALSE(interleaved_list.get() == NULL); 476e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent ASSERT_FALSE(interleaved_list->Empty()); 477e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent 478c55a96383497a772a307b346368133960b02ad03Eric Laurent ASSERT_TRUE(CompareLists(interleaved_list.get(), interleave_list.get())); 479e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent} 480