Тщательное тестирование на равенство двух карт с googletest - PullRequest
1 голос
/ 03 июля 2019

Мне интересно, каков "правильный / лучший" способ проверить равенство двух std::map с помощью каркаса googletest?

Загвоздка в том, что std::map имеет несколько указателей в значениях, и я хочу проверить, правильна ли вещь, на которую они указывают, в двух std::map с.

Например, моя карта имеет следующую подпись:

std::map<int, std::vector<std::pair<MyClass1*, MyClass2*>>>

Поэтому я хочу убедиться, что значения указателей MyClass1 и MyClass2 одинаковы на двух картах, которые я тестирую.

1 Ответ

1 голос
/ 11 июля 2019

Вы можете определить совпадение, если operator== не является опцией:

using mymap = std::map<int, std::vector<std::pair<MyClass1 *, MyClass2 *>>>;

MATCHER_P(MAP_MATCHER, expected_map, "Maps are not equal") {
  if (expected_map.size() != arg.size()) {
    return false;
  }
  return std::all_of(expected_map.cbegin(), expected_map.cend(), [&](const std::pair<int, std::vector<std::pair<MyClass1 *, MyClass2 *>>> &item) {
  auto arg_item = arg.find(item.first);
    if (arg.cend() == arg_item) {
      return false;
    }
    //more checks here
  });
}

, а затем использовать его:

TEST(maptest, test1) {
  mymap m1{{1, {{new MyClass1{}, new MyClass2{}}}}};
  mymap m2{{1, {{new MyClass1{}, new MyClass2{}}}}};

  ASSERT_THAT(m1, MAP_MATCHER(m2));
}
...