组合逐点和无序元素是数组



我有两个指针数组,我想使用 gtest/gmock 来断言它们包含相同的内容,可能以不同的顺序。我尝试过这样的事情

vector<unique_ptr<int>> a;
vector<unique_ptr<int>> b;
a.push_back(make_unique<int>(42));
a.push_back(make_unique<int>(142));
b.push_back(make_unique<int>(142));
b.push_back(make_unique<int>(42));
// I want this to compile & pass
ASSERT_THAT(a, Pointwise(UnorderedElementsAreArray(), b));

但这没有用。

Gmock 不会直接提供您想要的内容。问题是,由于数组包含指针,因此无法直接比较它们的元素,而必须为此使用匹配器。您可以从其中一个源数组构造匹配器数组,但这不会使事情变得更简单。

但是您有一些选择,具体取决于您的实际需求。如果你有两个数组,需要比较它们在排序后是否相同,只需对数组进行排序:

auto sorted_a = std::sort(a.begin(), a.end(), [](auto x, auto y) {
return *x < *y;
});
auto sorted_b = std::sort(b.begin(), b.end(), [](auto x, auto y) {
return *x < *y;
});

然后定义一个帮助程序匹配器并使用它比较它们:

MATCHER(PointeesAreEqual, "") {
return *std::get<0>(arg) == *std::get<1>(arg);
}
EXPECT_THAT(a, Pointwise(PointeesAreEqual, b))

但是,如果您只想以任意顺序检查数组是否由某些元素组成,则可以编写如下内容:

EXPECT_THAT(a, UnorderedElementsAre(Pointee(42), Pointee(142));

最新更新