Как сделать boost.Test log/print std types
#include <boost/test/included/unit_test.hpp>
BOOST_AUTO_TEST_CASE(test1)
{
std::optional<int> opt1(10);
BOOST_TEST(t == 11);
std::optional<long> opt2(11);
BOOST_CHECK_EQUAL(opt1, opt2);
}
Есть ли способ сделать тестовую печать с надписью (в коде: BOOST_TEST) std
типы? перегрузка operator<<
должен быть в пространстве имен std
быть найденным ADL и расширяющим std
запрещен. Единственное, что упомянуто в документации Boost, касается UDT, и решение также опирается на ADL, так как оно делает акцент на добавлении пользовательской функции. boost_test_print_type
в том же пространстве имен, что и UDT.
Что касается предложенного дубликата
Я не уверен. Как будет работать тонкая обертка, предложенная в дубликате? Означает ли это, что мне придется преобразовывать в оболочку в каждом тестовом примере перед каждым утверждением, вместо того, чтобы напрямую использовать стандартный тип (необязательно)? Если так, то это не то, что я ищу и нежелательно!
1 ответ
Вот решение на основе шаблона оболочки. Я думаю, что это далеко от идеала, но это должно работать как ожидалось.
template <class T>
struct PrintableOpt {
std::optional<T> value;
};
Необходимые перегрузки оператора будут
template <class T>
std::ostream& operator << (std::ostream& os, const PrintableOpt<T>& opt)
{
if (opt.value)
return os << *opt.value;
else
return os << "std::nullopt";
}
template <class T, class U>
bool operator == (const PrintableOpt<T>& lhs, const PrintableOpt<U>& rhs)
{
return lhs.value && rhs.value && *lhs.value == *rhs.value;
}
template <class T, class U>
bool operator != (const PrintableOpt<T>& lhs, const PrintableOpt<U>& rhs)
{
return !(lhs == rhs);
}
и для удобства вот две вспомогательные функции для создания экземпляров оболочки:
template <class T>
auto printable(T&& opt)
{
return PrintableOpt<T>{std::forward<T>(opt)};
}
template <class T>
auto printable(std::optional<T>& opt)
{
return PrintableOpt<T>{opt};
}
Тест теперь будет выглядеть так:
BOOST_AUTO_TEST_CASE(test1)
{
std::optional<int> opt1(10);
BOOST_TEST(printable(opt1) == printable(11));
std::optional<long> opt2(11);
BOOST_CHECK_EQUAL(printable(opt1), printable(opt2));
}