// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "wimax_manager/utility.h"

#include <base/stl_util.h>
#include <gtest/gtest.h>

using std::map;
using std::set;

namespace wimax_manager {

class UtilityTest : public testing::Test {
};

TEST_F(UtilityTest, GetKeysOfMapWithEmptyMap) {
  map<int, char> empty_map;
  set<int> keys = GetKeysOfMap(empty_map);
  EXPECT_TRUE(keys.empty());
}

TEST_F(UtilityTest, GetKeysOfMap) {
  map<int, char> test_map;
  test_map[2] = 'b';
  test_map[1] = 'a';
  test_map[3] = 'c';

  set<int> keys = GetKeysOfMap(test_map);
  EXPECT_EQ(3, keys.size());
  EXPECT_TRUE(ContainsKey(keys, 1));
  EXPECT_TRUE(ContainsKey(keys, 2));
  EXPECT_TRUE(ContainsKey(keys, 3));
  EXPECT_FALSE(ContainsKey(keys, 4));
}

TEST_F(UtilityTest, RemoveKeysFromMapWithEmptySetOfKeys) {
  set<int> keys_to_remove;
  map<int, char> test_map;
  test_map[2] = 'b';
  test_map[1] = 'a';
  test_map[3] = 'c';

  RemoveKeysFromMap(&test_map, keys_to_remove);
  EXPECT_EQ(3, test_map.size());
  EXPECT_EQ('a', test_map[1]);
  EXPECT_EQ('b', test_map[2]);
  EXPECT_EQ('c', test_map[3]);
}

TEST_F(UtilityTest, RemoveKeysFromMapWithEmptyMap) {
  set<int> keys_to_remove;
  keys_to_remove.insert(1);
  keys_to_remove.insert(4);

  map<int, char> test_map;
  RemoveKeysFromMap(&test_map, keys_to_remove);
  EXPECT_TRUE(test_map.empty());
}

TEST_F(UtilityTest, RemoveKeysFromMap) {
  set<int> keys_to_remove;
  keys_to_remove.insert(1);
  keys_to_remove.insert(4);

  map<int, char> test_map;
  test_map[2] = 'b';
  test_map[1] = 'a';
  test_map[3] = 'c';

  RemoveKeysFromMap(&test_map, keys_to_remove);
  EXPECT_EQ(2, test_map.size());
  EXPECT_FALSE(ContainsKey(test_map, 1));
  EXPECT_FALSE(ContainsKey(test_map, 4));
  EXPECT_EQ('b', test_map[2]);
  EXPECT_EQ('c', test_map[3]);
}

}  // namespace wimax_manager
