我一直在使用CppUnit库。一切都运行良好,但现在,我坚持使用CPPUNIT_ASSERT_EQUAL
断言迭代器。所以有我的代码:
void TestingClass::test_adjacent_find()
{
// Set up
int a [5] = {1,2,3,3,5};
int b [5] = {1,2,3,4,5};
int c [1] = {1};
std::list<int> lst;
lst.push_back(1);
lst.push_back(1);
lst.push_back(5);
// Check
CPPUNIT_ASSERT_EQUAL(a+2, my_adjacent_find(a , a+5, pred_eq<int>));
CPPUNIT_ASSERT_EQUAL(b+5, my_adjacent_find(b, b+5, pred_eq<int>));
CPPUNIT_ASSERT_EQUAL(c+1, my_adjacent_find(c, c+1, pred_eq<int>));
CPPUNIT_ASSERT_EQUAL(lst.begin(), lst.end()); // problem is here
}
当我运行此测试时,我收到以下错误。
/opt/local/include/cppunit/TestAssert.h:49:13:
Invalid operands to binary expression
('OStringStream' (aka 'basic_ostringstream<char>')
and 'const std::_List_iterator<int>')
如果我用迭代器注释该行,那么它编译没有任何问题。那么我做错了什么?我应该如何断言两个迭代器的相等性?顺便说一句,我使用xcode 4.4。
答案 0 :(得分:3)
请参阅CPPUNIT_ASSERT_EQUAL
中的TestAssert.h
宏文档:
#define CPPUNIT_ASSERT_EQUAL(expected,actual)
expected
和actual
参数的要求:
可以通过专门化CppUnit::assertion_traits
来删除最后两个要求(序列化和比较)。
因此,问题的根本原因是std::list::iterator
无法序列化为std::strstream
。您需要在文档描述时编写自己的CppUnit::assertion_traits
专精,或者只是避免CPPUNIT_ASSERT_EQUAL
并使用CPPUNIT_ASSERT
:
CPPUNIT_ASSERT(lst.begin() == lst.end());