3

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))

TypeParamは、この場合の typedef であり、boolに基づいて Google Test によって提供されますTYPED_TEST_Pbuffer次のタイプがあります。

const TypeParam* buffer;

const_imageconst 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

*bufferとの値at(..)が として扱われることを確認するために、次のことを試してみるとどうなりますboolか? boolこの問題が発生する唯一の型パラメーターのようです。

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

gtest.ccこの懸念は、Google Test v 1.7 内の次のシグネチャ ( 、行 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 に答える