Как сделать boost.Test log / print std types - PullRequest
0 голосов
/ 05 февраля 2019
#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 Ответ

0 голосов
/ 05 февраля 2019

Вот решение на основе шаблона оболочки.Я думаю, что это далеко от идеала, но он должен работать как ожидалось.

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));
}
...