Można użyć BOOST_REQUIRE_EQUAL_COLLECTIONS
z std::vector<T>
, ale trzeba nauczyć Boost.Test jak wydrukować std::vector
gdy masz wektor wektorów lub mapy, których wartości są wektorami. Kiedy masz mapę, Boost.Test należy nauczyć, jak drukować std::pair
. Ponieważ nie można zmienić definicji std::vector
lub std::pair
, należy to zrobić w taki sposób, aby zdefiniowany operator wstawiania strumienia był używany przez Boost.Test bez bycia częścią definicji klasy std::vector
. Ta technika jest również przydatna, jeśli nie chcesz dodawać operatorów obsługujących strumień do testowanego systemu, aby uczynić Boost.Test szczęśliwym.
Oto przepis dla każdego 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 << ']';
}
}
formatuje to wektory jak [e1,e2,e3,...,eN]
przez wektor z N
elementów i działa na dowolną liczbę wektorów, na przykład zagnieżdżone gdzie elementy wektora są również wektorami.
Oto podobny przepis na 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
powie indeks niedopasowanych elementów, jak również zawartość dwóch zbiorów, zakładając, że oba zbiory są tej samej wielkości. Jeśli mają one różne rozmiary, oznacza to niedopasowanie i drukowane są różne rozmiary.
to w docs, to tylko dobrze ukryty –
Tak, jestem zajęty edytowaniem mojego wstydu. :) Dziękuję za twoje przykłady w twojej odpowiedzi. – mskfisher
To zbyt nieprzyjemne, aby zmusić system do testowania, aby zaimplementować 'operator! =' I 'operator <<' tylko po to, aby zadowolić Boost.Test, IMO. Ponadto nie można zdefiniować tych funkcji składowych dla 'std :: vector'. Zobacz moją odpowiedź poniżej, aby uzyskać lepsze rozwiązanie. – legalize