ASSERT_EQ在gtest中布尔失败

时间:2013-10-25 19:06:26

标签: c++ boolean googletest

我有一个自定义聚合模板类型,我试图使用gtest测试。我正在使用TYPED_TEST_P,并测试各种类型。它工作正常,直到我尝试做布尔类型。我得到以下“错误”

error: Value of: const_img.at(pt.x,pt.y)
  Actual: true
Expected: *buffer
Which is: true

所以这就是说有一个错误:true!= true。有人以前看过这个问题吗?你是如何解决的?

我不能在这里发布所有代码,但是:

捕获非错误的调用是:

ASSERT_EQ(*buffer,const_img.at(pt.x,pt.y))

在这种情况下,

TypeParambool的typedef,由Google Test基于TYPED_TEST_P提供。 buffer具有以下类型:

const TypeParam* buffer;

const_image是一个const Image<TypeParam>&(自定义类),它强制at成为const重载,占用空间:

const TypeParam& at(ptrdiff_t col,ptrdiff_t row) const;

显然,这是返回正确的值(true应该等于true),并且永远不会达到以下if语句的断点:

  if (*buffer != const_img.at(pt.x,pt.y))
  {
    std::cout << "here" << std::endl;
  }

如果我跳过测试const重载,我没有错误(这很奇怪)。

编辑:解决方法

以下工作有效,但是......愚蠢。

  TypeParam a = const_img.at(pt.x,pt.y);
  TypeParam b = *buffer;
  ASSERT_EQ(
    a,b);

2 个答案:

答案 0 :(得分:2)

您的值是否有可能在int宏的扩展中的某处转换为ASSERT_EQ

如果您尝试以下操作会怎样,以确保*bufferat(..)的值被视为bool?听起来bool是唯一出现此问题的类型参数。

ASSERT_EQ(static_cast<TypeParam>(*buffer),
          static_cast<TypeParam>(const_img.at(pt.x,pt.y)));

在Google Test v 1.7(gtest.cc,第1114行)中查看以下签名时出现了这种担忧:

// The helper function for {ASSERT|EXPECT}_EQ with int or enum
// arguments.
AssertionResult CmpHelperEQ(const char* expected_expression,
                            const char* actual_expression,
                            BiggestInt expected,
                            BiggestInt actual) {
// ...

编辑:

如果您希望这样做,您应该能够使用以下内容:

#include <functional>  // std::equal_to
//  ...
EXPECT_PRED2(std::equal_to<Pixel_t>(), *buffer, const_img.at(pt.x,pt.y));

这将应用arity-2比较仿函数。 Google Test还会在发生故障时打印您的个人论点及其价值,这样您就不会失去功能。

不幸的是,这个答案并不能解释原始问题中发生了什么。我自己尝试观察这个问题,这会使故障排除变得更容易,但是使用Apple LLVM 5.0和Gtest 1.6的最小测试用例并没有看到它。

答案 1 :(得分:0)

{EXPECT_EQ(,)}在内部将bool转换为int或其他一些数字类型。 c ++标准说bool when false表示为0,但是当为true时用其他数字表示为0.这意味着在你的情况下: {EXPECT_EQ(true,true)} 可以在内部评估为: {EXPECT_EQ(4,1)} 这种比较失败了。