我想要一个用于
std::future_status
枚举的值打印机。
基本上是比这更好的错误消息:
[ RUN ] BasicTest.AssertNotEqualFutureStatus
Expected equality of these values:
a
Which is: 4-byte object <00-00 00-00>
b
Which is: 4-byte object <01-00 00-00>
通常只需实施
PrintTo
或 <<
即可做到这一点。
参考:https://github.com/google/googletest/blob/main/docs/advanced.md#teaching-googletest-how-to-print-your-values和枚举类的GoogleTest测试错误打印
问题在于扩展
std
命名空间是未定义的行为。
我不想在这个输出之后打印它,这可以用 <<
或 SCOPED_TRACE
来完成。
代码
TEST(setup_test_case, testWillPass)
{
auto a = std::future_status::ready;
auto b = std::future_status::timeout;
EXPECT_EQ(a, b);
}
https://godbolt.org/z/fqPnnh9x1
有没有办法在没有 UB 的情况下从 googletest 扩展价值打印机?
GoogleTest 并不真正支持与类型不同的命名空间中的自定义打印函数。话虽这么说,如果您真的愿意,您可以通过专业化来做到这一点:
testing::internal::UniversalPrinter<T>
#include "gtest/gtest.h"
#include "gtest/gtest-printers.h"
#include <future>
namespace testing::internal {
template <>
class UniversalPrinter<std::future_status> {
public:
static void Print(const std::future_status& val, ::std::ostream* os) {
*os << static_cast<int>(val);
}
};
}
int main()
{
auto a = std::future_status::ready;
auto b = std::future_status::timeout;
EXPECT_EQ(a, b);
}
神箭链接
当然,由于这是处理 GoogleTest 内部类,因此它可能会在 GoogleTest 的未来版本中停止工作(/app/example.cpp:21: Failure
Expected equality of these values:
a
Which is: 0
b
Which is: 1
命名空间中的任何内容都可能会在没有警告的情况下发生更改)。