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