使用Matcher中的GTEST FLOAT比较

Using gtest float comparison in Matcher

本文关键字:FLOAT 比较 GTEST 中的 Matcher 使用      更新时间:2023-10-16

我喜欢为拥有一些浮点值的结构编写匹配器:

struct Point3D
{
float x;
float y;
float z;
}
class Interface
{
virtual void SetPoint(Point3D point) = 0;
}
class MockInterface:
    public Interface
{
   MOCK_METHOD1(SetPoint, void(Point3D point));
}
MATCHER_P(Point3DEq, point, "Comparison of a Point3D")
{
   return point.x == arg.x && point.y == arg.y && point.z == arg.z;
}
TEST(Point3DComparison, TestIfPoint3DAreEqual)
{
   MockInterface interfaceFake;
   Point setPoint = { 1.0, 1.0, 1.0 }
   EXPECT_CALL(interfaceFake, SetPoint(Point3DEq(setPoint)).WillOnce(Return());
}

我不喜欢这个比赛,因为他没有尊重良好的浮点比较。我想使用Gmock或Gtest的浮动比较来编写一个匹配器。它应该看起来与之相似。

MATCHER_P(Point3DEq, point, "Comparison of a Point3D")
{
   return EXPECT_THAT(point.x, FloatEq(arg.x) && EXPECT_THAT(point.y, FloatEq(arg.y) && EXPECT_THAT(point.z, FloatEq(arg.z);
}

问题是,期望_没有返回任何布尔值。使用Gmock和Gtest的功能,有没有很好的干净方法?

不错的方法是忘记 MATCHER_P ...

使用::testing::AllOf-并使用Gmock的适当匹配器 - 如上所述FloatEq/DoubleEq-请参阅:

auto Point3DEq(Point3D const& p_expected)
{
    using namespace testing;
    return AllOf(Field(&Point3D::x, DoubleEq(p_expected.x)),
                 Field(&Point3D::y, DoubleEq(p_expected.y)),
                 Field(&Point3D::z, DoubleEq(p_expected.z)));
}