如何在cppunit断言失败时显示十六进制值

时间:2012-10-19 05:34:58

标签: c++ unit-testing cppunit

我使用CPPUNIT_ASSERT_EQUAL(a,b)来检查值a和b。 a和b是unsigned char类型。因此,当此断言失败时,它将显示预期值和实际值。因为类型是unsigned char,所以预期值和实际值将显示为字符。例如,35将显示为#。但这不是我想要的。当然,CPPUNIT_ASSERT_EQUAL((int)a,(int)b)可能是一个解决方案,但它看起来很奇怪。此外,如果值显示为十六进制格式会更好。但我不知道如何达到这个目的。如果有人给出答案,我们将非常感激。

2 个答案:

答案 0 :(得分:1)

我认为实现此效果的唯一方法是使a和/或b采用合适的类型进行所需的比较,但格式与unsigned char不同。这看起来像这样:

template <typename T>
struct as_hex_t
{
    as_hex_t(T const& value): d_value(value) {}
    T const& d_value;
};
bool operator== (as_hex_t<T> const& v0, as_hex_t<T> const& v1) {
    return v0.d_value == v1.d_value;
}
std::ostream& operator<< (std::ostream& out, as_hex_t const& value) {
    return out << std::hex << unsigned(value.d_value) << std::dec;
}
template <typenane T>
as_hex_t<T> as_hex(T const& val) { return as_hex_t<T>(val); }

CPPUNIT_ASSERT_EQUAL(as_hex(a), as_hex(b));

显然,需要在适当的位置定义适应值的类型,并且可以进入合适的宏。我不知道CPPUNIT,但我可以想象这样的东西存在于某个地方。

答案 1 :(得分:0)

添加#include <cstdio>并使用printf功能。 (printf reference)。

使用%x%X将数字显示为十六进制。 上面链接中的示例显示了您 printf ("Some different radixes: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);

给出输出

Some different radixes: 100 64 144 0x64 0144