Вы можете использовать BOOST_REQUIRE_EQUAL_COLLECTIONS
с std::vector<T>
, но вы должны научить Boost.Test, как печатать std::vector
, когда у вас есть вектор векторов или карта, значения которой являются векторами.Когда у вас есть карта, Boost.Test нужно научить печатать std::pair
.Поскольку вы не можете изменить определение std::vector
или std::pair
, вы должны сделать это таким образом, чтобы определенный вами оператор вставки потока использовался Boost.Test, не являясь частью определения класса * 1009.*.Кроме того, этот метод полезен, если вы не хотите добавлять операторы вставки потоков в тестируемую систему просто для того, чтобы сделать Boost.Test счастливым.
Вот рецепт любого std::vector
:
namespace boost
{
// teach Boost.Test how to print std::vector
template <typename T>
inline wrap_stringstream&
operator<<(wrap_stringstream& wrapped, std::vector<T> const& item)
{
wrapped << '[';
bool first = true;
for (auto const& element : item) {
wrapped << (!first ? "," : "") << element;
first = false;
}
return wrapped << ']';
}
}
Это форматирует векторы как [e1,e2,e3,...,eN]
для вектора с N
элементами и будет работать для любого числа вложенных векторов, например, где элементы вектора также являются векторами.
Здесьаналогичный рецепт для std::pair
:
namespace boost
{
// teach Boost.Test how to print std::pair
template <typename K, typename V>
inline wrap_stringstream&
operator<<(wrap_stringstream& wrapped, std::pair<const K, V> const& item)
{
return wrapped << '<' << item.first << ',' << item.second << '>';
}
}
BOOST_REQUIRE_EQUAL_COLLECTIONS
расскажет вам индекс несоответствующих элементов, а также содержимое двух коллекций, предполагая, что две коллекции имеют одинаковый размер.Если они имеют разные размеры, это считается несоответствием, и различные размеры печатаются.