| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include "gtest/gtest.h" |
| |
| #include "map_wrapper.h" |
| |
| using ::webrtc::MapWrapper; |
| using ::webrtc::MapItem; |
| |
| const int kNumberOfElements = 10; |
| |
| int* ItemPointer(MapItem* item) { |
| if (item == NULL) { |
| return NULL; |
| } |
| return reinterpret_cast<int*>(item->GetItem()); |
| } |
| |
| bool DeleteItemContent(MapItem* item) { |
| if(item == NULL) { |
| return false; |
| } |
| int* value_ptr = ItemPointer(item); |
| delete value_ptr; |
| return true; |
| } |
| |
| int ItemValue(MapItem* item) { |
| if (item == NULL) { |
| return -1; |
| } |
| const int* value_ptr = ItemPointer(item); |
| if (value_ptr == 0) { |
| return -1; |
| } |
| return *value_ptr; |
| } |
| |
| void PrintToConsole(const char* message, bool supress) { |
| if (supress) { |
| return; |
| } |
| printf("%s", message); |
| } |
| |
| bool CreateAscendingMap(MapWrapper* ascending_map) { |
| int* insert_value = NULL; |
| for (int i = 0; i < kNumberOfElements; ++i) { |
| insert_value = new int; |
| if (insert_value == NULL) { |
| return false; |
| } |
| *insert_value = i; |
| if (0 != ascending_map->Insert( |
| i, |
| reinterpret_cast<void*>(insert_value))) { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| bool ClearMap(MapWrapper* clear_map) { |
| bool success = true; |
| while (clear_map->Size() != 0) { |
| MapItem* remove_item = clear_map->First(); |
| if (remove_item == NULL) { |
| return false; |
| } |
| if (!DeleteItemContent(remove_item)) { |
| success = false; |
| } |
| if (clear_map->Erase(remove_item) != 0) { |
| return false; |
| } |
| } |
| return success; |
| } |
| |
| void PrintMapItem(MapItem* item, bool supress) { |
| const int id = item->GetId(); |
| const int value = ItemValue(item); |
| char print_buffer[16]; |
| sprintf(print_buffer, "(%3i,%3i) ", id, value); |
| PrintToConsole(print_buffer, supress); |
| } |
| |
| // Succeeds only if all the items were printed. |
| bool PrintMap(const MapWrapper& print_map, bool supress) { |
| const int elements_to_print = print_map.Size(); |
| int elements_printed = 0; |
| MapItem* item = print_map.First(); |
| PrintToConsole("[", supress); |
| while (item != NULL) { |
| PrintMapItem(item, supress); |
| ++elements_printed; |
| item = print_map.Next(item); |
| } |
| PrintToConsole("]\n", supress); |
| return elements_printed == elements_to_print; |
| } |
| |
| // Succeeds only if all the items were printed. |
| bool ReversePrintMap(const MapWrapper& print_map, bool supress) { |
| const int elements_to_print = print_map.Size(); |
| int elements_printed = 0; |
| MapItem* item = print_map.Last(); |
| PrintToConsole("[", supress); |
| while (item != NULL) { |
| PrintMapItem(item, supress); |
| ++elements_printed; |
| item = print_map.Previous(item); |
| } |
| PrintToConsole("]\n", supress); |
| return elements_printed == elements_to_print; |
| } |
| |
| // Returns true if the map items contain the same item. |
| bool CompareItems(MapItem* lhs_item, MapItem* rhs_item) { |
| if ((lhs_item == NULL) || (rhs_item == NULL)) { |
| return false; |
| } |
| if (lhs_item->GetId() != rhs_item->GetId()) { |
| return false; |
| } |
| return lhs_item->GetItem() == rhs_item->GetItem(); |
| } |
| |
| // Returns true if the map contains the same items. |
| bool CompareMaps(const MapWrapper& lhs, const MapWrapper& rhs) { |
| const int map_size = lhs.Size(); |
| if (map_size != rhs.Size()) { |
| return false; |
| } |
| int item_count = 0; |
| MapItem* lhs_item = lhs.First(); |
| while (lhs_item != NULL) { |
| MapItem* rhs_item = rhs.Find(lhs_item->GetId()); |
| if (rhs_item == NULL) { |
| return false; |
| } |
| if (!CompareItems(lhs_item, rhs_item)) { |
| return false; |
| } |
| ++item_count; |
| lhs_item = lhs.Next(lhs_item); |
| } |
| return item_count == map_size; |
| } |
| |
| class MapWrapperTest : public ::testing::Test { |
| protected: |
| virtual void SetUp() { |
| ASSERT_TRUE(CreateAscendingMap(&ascending_map_)); |
| } |
| |
| virtual void TearDown() { |
| EXPECT_TRUE(ClearMap(&ascending_map_)); |
| } |
| MapWrapper ascending_map_; |
| }; |
| |
| TEST_F(MapWrapperTest,RemoveTest) { |
| // Erase using int id |
| { // Create local scope to avoid accidental re-use |
| MapItem* item_first = ascending_map_.First(); |
| ASSERT_FALSE(item_first == NULL); |
| const int first_value_id = item_first->GetId(); |
| const int first_value = ItemValue(item_first); |
| EXPECT_TRUE(first_value == 0); |
| EXPECT_EQ(first_value_id,first_value); |
| EXPECT_FALSE(NULL == ascending_map_.Find(first_value_id)); |
| EXPECT_TRUE(DeleteItemContent(item_first)); |
| ascending_map_.Erase(first_value_id); |
| EXPECT_TRUE(NULL == ascending_map_.Find(first_value_id)); |
| EXPECT_EQ(kNumberOfElements-1,ascending_map_.Size()); |
| } |
| |
| // Erase using MapItem* item |
| MapItem* item_last = ascending_map_.Last(); |
| ASSERT_FALSE(item_last == NULL); |
| const int last_value_id = item_last->GetId(); |
| const int last_value = ItemValue(item_last); |
| EXPECT_TRUE(last_value == kNumberOfElements - 1); |
| EXPECT_EQ(last_value_id, last_value); |
| EXPECT_FALSE(NULL == ascending_map_.Find(last_value_id)); |
| EXPECT_TRUE(DeleteItemContent(item_last)); |
| ascending_map_.Erase(last_value_id); |
| EXPECT_TRUE(NULL == ascending_map_.Find(last_value_id)); |
| EXPECT_EQ(kNumberOfElements-2,ascending_map_.Size()); |
| } |
| |
| TEST_F(MapWrapperTest, PrintTest) { |
| const bool supress = true; // Don't spam the console |
| |
| EXPECT_TRUE(PrintMap(ascending_map_, supress)); |
| EXPECT_TRUE(ReversePrintMap(ascending_map_, supress)); |
| } |
| |
| TEST_F(MapWrapperTest, CopyTest) { |
| MapWrapper compare_map; |
| ASSERT_TRUE(CreateAscendingMap(&compare_map)); |
| const int map_size = compare_map.Size(); |
| ASSERT_EQ(ascending_map_.Size(), map_size); |
| // CompareMaps compare the pointers not value of the pointers. |
| // (the values are the same since both are ascending maps). |
| EXPECT_FALSE(CompareMaps(compare_map,ascending_map_)); |
| |
| int copy_count = 0; |
| MapItem* ascend_item = ascending_map_.First(); |
| while (ascend_item != NULL) { |
| MapItem* compare_item = compare_map.Find(ascend_item->GetId()); |
| ASSERT_FALSE(compare_item == NULL); |
| DeleteItemContent(compare_item); |
| compare_item->SetItem(ascend_item->GetItem()); |
| ascend_item = ascending_map_.Next(ascend_item); |
| ++copy_count; |
| } |
| EXPECT_TRUE(CompareMaps(compare_map,ascending_map_)); |
| while (compare_map.Erase(compare_map.First()) == 0) { |
| } |
| EXPECT_EQ(map_size, copy_count); |
| } |