【问题标题】:How to display hex value when cppunit assert failedcppunit断言失败时如何显示十六进制值
【发布时间】:2012-10-19 05:34:58
【问题描述】:

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

【问题讨论】:

    标签: c++ unit-testing cppunit


    【解决方案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,但我可以想象这样的东西存在于某个地方。

    【讨论】:

      【解决方案2】:

      添加#include &lt;cstdio&gt; 并使用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

      【讨论】:

      • 是的,我知道 printf 的说明符字符。但是输出是由 CPPUNIT 框架打印的。我不知道如何像使用 printf 函数那样控制格式。我认为必须有某种方法来实现这一点。不管怎样,谢谢你的回答。
      猜你喜欢
      • 2013-10-21
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 2012-04-29
      • 2022-12-13
      • 2012-01-08
      • 2015-06-15
      • 1970-01-01
      相关资源
      最近更新 更多