我正在使用谷歌测试为带有迭代器的容器类编写一些单元测试。我想创建一个测试,确保我的const_iterator
正确const
:即我无法分配给它
MyContainer<MyType>::const_iterator cItr = MyContainerInstance.cbegin();
*cItr = MyType(); // this should fail.
显然这将无法编译(IFF它编码正确),但有没有办法使用谷歌测试在单元测试中留下这样的检查?或者某种方式没有google测试,不需要集成另一个库?
答案 0 :(得分:3)
因此可以检测迭代器是否是常量迭代器,但它比我最初想象的要复杂。
请记住,您不需要常量迭代器的实际实例,因为您所做的只是类型检查:
// Include <type_traits> somewhere
typedef MyContainer<MyType>::const_iterator it;
typedef std::iterator_traits<it>::pointer ptr;
typedef std::remove_pointer<ptr>::type iterator_type;
std::cout << std::boolalpha << std::is_const<iterator_type>::value;
// This'll print a 0 or 1 indicating if your iterator is const or not.
然后你可以用gtest中的常规方式检查:
EXPECT_TRUE(std::is_const<iterator_type>::value);
免费建议:我认为最好让编译器通过编写一个如果违反const正确性将无法编译的测试来为您检查。
您可以使用std::vector
:
typedef std::vector<int>::const_iterator c_it;
typedef std::iterator_traits<c_it>::pointer c_ptr;
typedef std::remove_pointer<c_ptr>::type c_iterator_type;
EXPECT_TRUE(std::is_const<c_iterator_type>::value);
typedef std::vector<int>::iterator it;
typedef std::iterator_traits<it>::pointer ptr;
typedef std::remove_pointer<ptr>::type iterator_type;
EXPECT_FALSE(std::is_const<iterator_type>::value);
这应该编译并传递。