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