Как передать контейнеры STL в качестве аргументов BOOST_CHECK_EQUAL? - PullRequest
6 голосов
/ 29 января 2011

Например, скажем, у нас есть этот класс, который мы хотим протестировать:

struct TestMe {
  vector<int> getSomething();
}

И функция теста состоит из:

...
vector<int> Expected;
TestMe TM;
...
Result = TM.getSomething();
BOOST_CHECK_EQUAL(Result, Expected);
...

Вектор STL обеспечивает свободный оператор ==, но он не предоставляет оператора <<, поэтому этот код не компилируется.Как я могу заставить это работать?Могу ли я определить свой собственный оператор <<?Как будет выглядеть его реализация?Дополнительный кредит для наиболее общего решения:) </p>

Ответы [ 3 ]

8 голосов
/ 29 января 2011

Я думаю, вы должны использовать BOOST_CHECK_EQUAL_COLLECTIONS, это проверяет каждый элемент, а также печатает, где несоответствия:

BOOST_CHECK_EQUAL_COLLECTIONS(Result.begin(), Result.end(), Expected.begin(), Expected.end());
1 голос
/ 29 января 2011

Я думаю Филиппский ответ - лучший ответ.Однако вы можете сделать свой собственный шаблон operator<<(), который будет работать для векторов и других стандартных контейнеров, если вы хотите:

// Will write out any container that has begin(), end() and a const_iterator type
template <typename C>
std::ostream& output_container(std::ostream& os, C const& c) {
    for (typename C::const_iterator i = c.begin(); i != c.end(); ++i) {
        if (i != c.begin()) os << ", ";
        os << *i;
    }

    return os;
}

// Overload operators for each container type that forward to output_container()
template <typename T>
std::ostream& operator<<(std::ostream& os, vector<T> const& c) {
    return output_container(os, c);
}

template <typename T>
std::ostream& operator<<(std::ostream& os, list<T> const& c) {
    return output_container(os, c);
}

Хотя вы можете просто переименовать output_container() в operator<<() и избавиться от-container-type operator<<() шаблонов, тем самым перехватывая all попыток использовать << для типа класса, это может помешать operator<<() шаблонам функций для других типов.

0 голосов
/ 22 февраля 2014

Я искал что-то похожее, способ настроить выходную строку для печати целых чисел в шестнадцатеричном виде.Внедрение оператора в пространство имен std будет работать, но каждый BOOST_CHECK в моем тесте будет напечатан в шестнадцатеричном формате.

Поэтому я ввел несколько пользовательских операторов в пространство имен boost, которыми я мог управлять с помощью некоторых глобальных bools.

Смотрите мой ответ здесь boost-check-fail-to-compile-operator-for-custom-types .

...