Sie BOOST_REQUIRE_EQUAL_COLLECTIONS
mit std::vector<T>
verwenden können, aber Sie haben Boost.Test zu lehren, wie ein std::vector
zu drucken, wenn Sie einen Vektor von Vektoren oder eine Karte, deren Werte Vektoren haben. Wenn Sie eine Karte haben, muss Boost.Test gelernt werden, wie man std::pair
druckt. Da Sie die Definition von std::vector
oder std::pair
nicht ändern können, müssen Sie dies so tun, dass der von Ihnen definierte Stream-Insertion-Operator von Boost.Test verwendet wird, ohne Teil der Klassendefinition von std::vector
zu sein. Außerdem ist diese Technik nützlich, wenn Sie keine Stream-Insertion-Operatoren zu Ihrem getesteten System hinzufügen möchten, um Boost.Test glücklich zu machen. Hier
ist das Rezept für jede 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 << ']';
}
}
Dieser formatiert die Vektoren als [e1,e2,e3,...,eN]
für einen Vektor mit N
Elemente und wird für eine beliebige Anzahl von verschachtelten arbeiten Vektoren, z.B. wo die Elemente des Vektors auch Vektoren sind.
Hier ist das ähnliche Rezept für 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
werden Ihnen sagen, den Index der nicht übereinstimmen Elemente sowie die Inhalte der beiden Sammlungen, unter der Annahme, die beiden Sammlungen von gleicher Größe sind. Wenn sie unterschiedlich groß sind, wird das als Mismatch betrachtet und die unterschiedlichen Größen werden gedruckt.
tun dies in der Dokumentation ist, dann ist es nur gut versteckt –
Ja, ich bin beschäftigt, meine Schande zu bearbeiten. :) Danke für deine Beispiele in deiner Antwort. – mskfisher
Es ist ein bisschen zu aufdringlich, das zu testende System zu zwingen, 'operator! =' Und 'operator << zu implementieren, nur um Boost.Test, IMO zu erfüllen. Außerdem können Sie diese Memberfunktionen für 'std :: vector' nicht definieren. Siehe meine Antwort unten für eine bessere Lösung. – legalize