Как сделать 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));
}
Другие вопросы по тегам