È possibile utilizzare BOOST_REQUIRE_EQUAL_COLLECTIONS
con std::vector<T>
, ma si deve insegnare Boost.Test come stampare un std::vector
quando si dispone di un vettore di vettori o di una mappa i cui valori sono vettori. Quando hai una mappa, Boost.Test deve essere insegnato come stampare std::pair
. Poiché non è possibile modificare la definizione di std::vector
o std::pair
, è necessario farlo in modo che l'operatore di inserimento del flusso definito dall'utente venga utilizzato da Boost.Test senza far parte della definizione di classe di std::vector
. Inoltre, questa tecnica è utile se non si desidera aggiungere operatori di inserimento del flusso al sistema in prova solo per rendere felice Boost.Test.
Ecco la ricetta per qualsiasi 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 << ']';
}
}
Questo formatta i vettori come [e1,e2,e3,...,eN]
per un vettore con N
elementi e funziona per qualsiasi numero di vettori annidati, ad esempio dove gli elementi del vettore sono anche vettori.
Ecco la ricetta simile per 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
vi dirà l'indice degli elementi non corrispondenti, così come i contenuti delle due collezioni, assumendo le due collezioni sono della stessa dimensione. Se sono di dimensioni diverse, allora si considera una mancata corrispondenza e vengono stampate le diverse dimensioni.
questo è nella documentazione, è solo ben nascosto –
Sì, sono impegnato a cancellare la mia vergogna. :) Grazie per i tuoi esempi nella tua risposta. – mskfisher
È un po 'troppo invadente forzare il sistema sotto test per implementare 'operator! =' E 'operator <<' solo per soddisfare Boost.Test, IMO. Inoltre, non è possibile definire queste funzioni membro per 'std :: vector'. Vedi la mia risposta qui sotto per una soluzione migliore. – legalize