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
13e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent#include "map_wrapper.h"
14e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
15e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentusing ::webrtc::MapWrapper;
16e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentusing ::webrtc::MapItem;
17e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
18c55a96383497a772a307b346368133960b02ad03Eric Laurentconst int kNumberOfElements = 10;
19e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
20e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint* ItemPointer(MapItem* item) {
21e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (item == NULL) {
22e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return NULL;
23e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
24e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return reinterpret_cast<int*>(item->GetItem());
25e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
26e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
27e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool DeleteItemContent(MapItem* item) {
28e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if(item == NULL) {
29e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return false;
30e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
31e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int* value_ptr = ItemPointer(item);
32e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    delete value_ptr;
33e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return true;
34e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
35e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
36e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentint ItemValue(MapItem* item) {
37e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (item == NULL) {
38e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
39e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
40e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int* value_ptr = ItemPointer(item);
41e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (value_ptr == 0) {
42e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return -1;
43e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
44e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return *value_ptr;
45e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
46e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
47e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid PrintToConsole(const char* message, bool supress) {
48e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (supress) {
49e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return;
50e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
51c55a96383497a772a307b346368133960b02ad03Eric Laurent    printf("%s", message);
52e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
53e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
54e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool CreateAscendingMap(MapWrapper* ascending_map) {
55e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int* insert_value = NULL;
56e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    for (int i = 0; i < kNumberOfElements; ++i) {
57e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        insert_value = new int;
58e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (insert_value == NULL) {
59e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return false;
60e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
61e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        *insert_value = i;
62e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (0 != ascending_map->Insert(
63e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                     i,
64e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent                     reinterpret_cast<void*>(insert_value))) {
65e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return false;
66e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
67e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
68e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return true;
69e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
70e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
71e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool ClearMap(MapWrapper* clear_map) {
72e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    bool success = true;
73e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    while (clear_map->Size() != 0) {
74e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        MapItem* remove_item = clear_map->First();
75e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (remove_item == NULL) {
76e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return false;
77e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
78e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (!DeleteItemContent(remove_item)) {
79e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            success = false;
80e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
81e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (clear_map->Erase(remove_item) != 0) {
82e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return false;
83e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
84e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
85e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return success;
86e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
87e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
88e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentvoid PrintMapItem(MapItem* item, bool supress) {
89e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int id = item->GetId();
90e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int value = ItemValue(item);
91e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    char print_buffer[16];
92e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    sprintf(print_buffer, "(%3i,%3i) ", id, value);
93e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    PrintToConsole(print_buffer, supress);
94e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
95e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
96e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Succeeds only if all the items were printed.
97e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool PrintMap(const MapWrapper& print_map, bool supress) {
98e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int elements_to_print = print_map.Size();
99e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int elements_printed = 0;
100e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapItem* item = print_map.First();
101e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    PrintToConsole("[", supress);
102e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    while (item != NULL) {
103e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        PrintMapItem(item, supress);
104e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ++elements_printed;
105e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        item = print_map.Next(item);
106e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
107e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    PrintToConsole("]\n", supress);
108e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return elements_printed == elements_to_print;
109e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
110e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
111e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Succeeds only if all the items were printed.
112e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool ReversePrintMap(const MapWrapper& print_map, bool supress) {
113e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int elements_to_print = print_map.Size();
114e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int elements_printed = 0;
115e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapItem* item = print_map.Last();
116e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    PrintToConsole("[", supress);
117e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    while (item != NULL) {
118e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        PrintMapItem(item, supress);
119e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ++elements_printed;
120e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        item = print_map.Previous(item);
121e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
122e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    PrintToConsole("]\n", supress);
123e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return elements_printed == elements_to_print;
124e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
125e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
126e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Returns true if the map items contain the same item.
127e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool CompareItems(MapItem* lhs_item, MapItem* rhs_item) {
128e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if ((lhs_item == NULL) || (rhs_item == NULL)) {
129e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return false;
130e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
131e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (lhs_item->GetId() != rhs_item->GetId()) {
132e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return false;
133e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
134e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return lhs_item->GetItem() == rhs_item->GetItem();
135e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
136e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
137e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent// Returns true if the map contains the same items.
138e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentbool CompareMaps(const MapWrapper& lhs, const MapWrapper& rhs) {
139e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int map_size = lhs.Size();
140e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    if (map_size != rhs.Size()) {
141e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        return false;
142e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
143e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int item_count = 0;
144e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapItem* lhs_item = lhs.First();
145e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    while (lhs_item != NULL) {
146e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        MapItem* rhs_item = rhs.Find(lhs_item->GetId());
147e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (rhs_item == NULL) {
148e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return false;
149e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
150e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        if (!CompareItems(lhs_item, rhs_item)) {
151e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent            return false;
152e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        }
153e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ++item_count;
154e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        lhs_item = lhs.Next(lhs_item);
155e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
156e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    return item_count == map_size;
157e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
158e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
159e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentclass MapWrapperTest : public ::testing::Test {
160e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurentprotected:
161e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual void SetUp() {
162e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ASSERT_TRUE(CreateAscendingMap(&ascending_map_));
163e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
164e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
165e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    virtual void TearDown() {
166e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_TRUE(ClearMap(&ascending_map_));
167e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
168e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapWrapper ascending_map_;
169e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent};
170e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
171e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST_F(MapWrapperTest,RemoveTest) {
172e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Erase using int id
173e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    { // Create local scope to avoid accidental re-use
174e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        MapItem* item_first = ascending_map_.First();
175e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ASSERT_FALSE(item_first == NULL);
176e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        const int first_value_id = item_first->GetId();
177e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        const int first_value = ItemValue(item_first);
178e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_TRUE(first_value == 0);
179e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_EQ(first_value_id,first_value);
180e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_FALSE(NULL == ascending_map_.Find(first_value_id));
181e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_TRUE(DeleteItemContent(item_first));
182e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ascending_map_.Erase(first_value_id);
183e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_TRUE(NULL == ascending_map_.Find(first_value_id));
184e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        EXPECT_EQ(kNumberOfElements-1,ascending_map_.Size());
185e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
186e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
187e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // Erase using MapItem* item
188e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapItem* item_last = ascending_map_.Last();
189e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ASSERT_FALSE(item_last == NULL);
190e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int last_value_id = item_last->GetId();
191e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int last_value = ItemValue(item_last);
192e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_TRUE(last_value == kNumberOfElements - 1);
193e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_EQ(last_value_id, last_value);
194e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_FALSE(NULL == ascending_map_.Find(last_value_id));
195e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_TRUE(DeleteItemContent(item_last));
196e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ascending_map_.Erase(last_value_id);
197e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_TRUE(NULL == ascending_map_.Find(last_value_id));
198e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_EQ(kNumberOfElements-2,ascending_map_.Size());
199e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
200e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
201e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST_F(MapWrapperTest, PrintTest) {
202e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const bool supress = true; // Don't spam the console
203e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
204e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_TRUE(PrintMap(ascending_map_, supress));
205e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_TRUE(ReversePrintMap(ascending_map_, supress));
206e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
207e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
208e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric LaurentTEST_F(MapWrapperTest, CopyTest) {
209e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapWrapper compare_map;
210e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ASSERT_TRUE(CreateAscendingMap(&compare_map));
211e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    const int map_size = compare_map.Size();
212e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    ASSERT_EQ(ascending_map_.Size(), map_size);
213e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // CompareMaps compare the pointers not value of the pointers.
214e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    // (the values are the same since both are ascending maps).
215e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_FALSE(CompareMaps(compare_map,ascending_map_));
216e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent
217e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    int copy_count = 0;
218e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    MapItem* ascend_item = ascending_map_.First();
219e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    while (ascend_item != NULL) {
220e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        MapItem* compare_item = compare_map.Find(ascend_item->GetId());
221e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ASSERT_FALSE(compare_item == NULL);
222e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        DeleteItemContent(compare_item);
223e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        compare_item->SetItem(ascend_item->GetItem());
224e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ascend_item = ascending_map_.Next(ascend_item);
225e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent        ++copy_count;
226e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
227e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_TRUE(CompareMaps(compare_map,ascending_map_));
228e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    while (compare_map.Erase(compare_map.First()) == 0) {
229e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    }
230e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent    EXPECT_EQ(map_size, copy_count);
231e48d5845c8b35de2ab73ea055c18a61fa3a9f0beEric Laurent}
232