单元测试自定义 STL 兼容容器和迭代器

Unit testing custom STL-compatible containers and iterators

我刚刚为自定义容器实现了自定义迭代器类型。容器模拟 C++17 ReversibleContainer, and its iterators (both const and non-const) model LegacyRandomAccessIterator.

我的问题是; std 中是否有某种内置的东西我可以用来测试容器及其迭代器是否都符合指定的命名要求,或者我是否必须自己编写所有测试(这主要是可行的对我来说,但我不想重新发明轮子;而且我不确定我是否有足够的模板向导来真正彻底地证明例如类型等是正确的)?

诸如此类的事情(我知道这是其中之一),例如这来自 operator <:

的操作语义
custom_container::iterator a = ...;
custom_container::iterator b = ...;
assert((a < b) == (b - a > 0));

并且 return 类型是正确的等等。


我已经设法找到 一些 功能,例如 有一些有用的实用程序,例如:

if (!std::is_copy_constructible<custom_container::iterator>::value)
   /* fail test */ ;

这至少对一些基本的命名要求有好处。

不,我们没有。

事实上证明类型满足作为迭代器的所有要求不能在 C++ 中静态完成。

您可以静态测试类型是否正确,运算符等是否存在。但是在一般情况下无法证明这种语义(我认为由于莱斯定理而在实践和理论上都是如此)。

我发现大多数需求在实践中很容易检查(如果自动化不那么容易的话)。我发现最常见的问题是,比输入迭代器更强大的“遗留”迭代器必须具有它们 return 引用和指针指向的实际支持持久数据;该数据不能存在于迭代器中,否则为 temporary/generated.