如何增强测试日志/打印标准类型

时间:2019-02-05 09:42:06

标签: c++ boost c++17 boost.test

#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<<必须位于ADL找到的命名空间std中,并且禁止扩展stdboost's documentation中提到的唯一一件事是关于UDT的,该解决方案还依赖于ADL,因为它着重于在与UDT相同的名称空间中添加自定义函数boost_test_print_type

关于建议的重复项

我不确定。一式两份的薄包装纸将如何工作?这是否意味着我必须在每个断言之前在每个测试用例中都转换为包装器,而不是直接使用标准类型(可选)?如果是这样,那不是我要找的和不想要的!

1 个答案:

答案 0 :(得分:0)

这是一个基于包装模板的解决方案。我认为这远非理想,但应能按预期工作。

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