如何将STL容器作为参数传递给BOOST_CHECK_EQUAL?

时间:2011-01-29 10:41:05

标签: c++ unit-testing boost stl

例如,假设我们要测试这个类:

struct TestMe {
  vector<int> getSomething();
}

测试功能由:

组成
...
vector<int> Expected;
TestMe TM;
...
Result = TM.getSomething();
BOOST_CHECK_EQUAL(Result, Expected);
...

STL向量提供了一个自由运算符==,但它没有提供运算符&lt;&lt;,因此这段代码不能编译。 我怎样才能让它发挥作用?我可以定义自己的运算符&lt;&lt; ?它的实现是什么样的?对最通用的解决方案的额外信任:)

3 个答案:

答案 0 :(得分:8)

我认为你应该使用BOOST_CHECK_EQUAL_COLLECTIONS,这会测试每个元素并打印不匹配的位置:

BOOST_CHECK_EQUAL_COLLECTIONS(Result.begin(), Result.end(), Expected.begin(), Expected.end());

答案 1 :(得分:1)

我认为Philipp's answer是最好的答案。但是,如果您愿意,可以制作适用于矢量和其他标准容器的模板化operator<<()

// Will write out any container that has begin(), end() and a const_iterator type
template <typename C>
std::ostream& output_container(std::ostream& os, C const& c) {
    for (typename C::const_iterator i = c.begin(); i != c.end(); ++i) {
        if (i != c.begin()) os << ", ";
        os << *i;
    }

    return os;
}

// Overload operators for each container type that forward to output_container()
template <typename T>
std::ostream& operator<<(std::ostream& os, vector<T> const& c) {
    return output_container(os, c);
}

template <typename T>
std::ostream& operator<<(std::ostream& os, list<T> const& c) {
    return output_container(os, c);
}

虽然您可以简单地将output_container()重命名为operator<<()并删除每容器类型operator<<()模板,从而捕获所有尝试使用{ {1}}在类类型上,这可能会干扰其他类型的<<函数模板。

答案 2 :(得分:0)

我正在寻找类似的东西,一种自定义输出字符串以十六进制打印整数的方法。将操作符注入std命名空间会起作用,但我测试中的每个BOOST_CHECK都将以十六进制格式打印。

所以我在boost名称空间中注入了一些自定义运算符,我可以用一些全局bool来控制它。

请在此处查看我的回答boost-check-fails-to-compile-operator-for-custom-types