0

我一直试图在Google C++ 测试框架/gtest中找到一个断言,它等同于Boost Test Library中的BOOST_CHECK_EQUAL_COLLECTIONS断言。

然而; 没有成功。所以我的问题有两个:

  1. gtest是否有等效的断言?
  2. 如果不是:如何在gtest中断言容器内容?

编辑(稍作修改的答案):

#include <iostream>

template<typename LeftIter, typename RightIter>
::testing::AssertionResult CheckEqualCollections(LeftIter left_begin,
                                                 LeftIter left_end,
                                                 RightIter right_begin)
{
    std::stringstream message;
    std::size_t index(0);
    bool equal(true);

    for(;left_begin != left_end; left_begin++, right_begin++) {
        if (*left_begin != *right_begin) {
            equal = false;
            message << "\n  Mismatch in position " << index << ": " << *left_begin << " != " <<  *right_begin;
        }
        ++index;
    }
    if (message.str().size()) {
        message << "\n";
    }
    return equal ? ::testing::AssertionSuccess() :
                   ::testing::AssertionFailure() << message.str();
}
4

2 回答 2

2

正如 Alex 所指出的,gtest 有一个名为 Google Mock 的姊妹项目,它具有比较两个容器的出色工具:

EXPECT_THAT(actual, ContainerEq(expected));
// ElementsAre accepts up to ten parameters.
EXPECT_THAT(actual, ElementsAre(a, b, c));
EXPECT_THAT(actual, ElementsAreArray(array));

您可以在Google Mock 的 wiki中找到更多信息。

于 2013-03-18T15:59:17.517 回答
0

我不知道完全等效的 gtest 断言。但是,以下函数应该提供类似的功能:

template<typename LeftIter, typename RightIter>
::testing::AssertionResult CheckEqualCollections(LeftIter left_begin,
                                                 LeftIter left_end,
                                                 RightIter right_begin) {
  bool equal(true);
  std::string message;
  std::size_t index(0);
  while (left_begin != left_end) {
    if (*left_begin++ != *right_begin++) {
      equal = false;
      message += "\n\tMismatch at index " + std::to_string(index);
    }
    ++index;
  }
  if (message.size())
    message += "\n\t";
  return equal ? ::testing::AssertionSuccess() :
                 ::testing::AssertionFailure() << message;
}

关于使用返回 an 的函数AssertionResult的部分提供了有关如何使用它的完整详细信息,但它可能类似于:

EXPECT_TRUE(CheckEqualCollections(collection1.begin(),
                                  collection1.end(),
                                  collection2.begin()));
于 2013-03-16T15:37:53.970 回答