让我说以下内容:
unordered_map<string, int> map{{"foo", 1}, {"bar", 2}, {"baz", 3}};
vector<string> expected_keys{"foo", "bar", "kaz"}; // Note "kaz" not "baz"
并且我想测试来自map
的键是否全部包含在expected_keys
的集合中。
我真正想写的是:
EXPECT_THAT(map, Each(Key(From(expected_keys))));
但是据我所知,没有任何东西支持From
模式;也就是说,检查一个值是否来自一组值。匹配器库似乎假设您将一直执行set contains value
,而永远不会执行value is in set
。在每种情况下,这些都是等效的。而且,如果unordered_map
具有keys()
API,则可以使用简单的UnorderedElementsAreArray(expected_keys)
将其放入模式中。但事实并非如此。
我能想到的最接近的是:
EXPECT_THAT(map, Each(Key(ResultOf([&](const key&){return Value(expected_keys, Contains(key));}, IsTrue())))
哪个...太可怕了。 Pointwise()
确实很接近,但是搜索的有序性使其不适用于无序的容器。
是否有一种方法可以直接进行这种查询而无需求助于ResultOf()
和Value()
?还是我以错误的方式思考问题?
auto KeyMatch(const vector<string>& keys) {
vector<decltype(Key(keys[0]))> matchers;
for (const auto& val : keys) {
matchers.push_back(Key(val));
}
return UnorderedElementsAreArray(matchers);
};
....
ASSERT_THAT(map, KeyMatch(keys));