3

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

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

所以这是说有一个错误:真!=真。以前有人见过这个问题吗?你如何解决它?

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

捕获非错误的调用是:

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

TypeParam在这种情况下是 typedef bool,由 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);
4

2 回答 2

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 的最小测试用例中没有看到它。

于 2013-11-03T18:44:10.847 回答
1

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

于 2017-08-22T08:11:07.187 回答