2012-10-19 62 views
2

我使用CPPUNIT_ASSERT_EQUAL(a,b)檢查值a和b。 a和b是無符號的字符類型。所以,當這個斷言失敗時,它會顯示預期值和實際值。由於類型是無符號字符,預期值和實際值將顯示爲字符。例如,35將顯示爲#。但這不是我想要的。當然,CPPUNIT_ASSERT_EQUAL((int)a,(int)b)可能是一個解決方案,但看起來很奇怪。此外,如果值以十六進制格式顯示,則會更好。但我不知道如何達到這一點。如果有人給出答案,將不勝感激。如何在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,但我可以想象這樣的事情存在於某個地方。

+0

非常感謝!^^ – Kery

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

+0

是的,我知道printf的指定字符。但輸出是由CPPUNIT框架打印的。我不知道如何使用printf函數來控制格式。我認爲必須有一些方法來實現這一點。無論如何,謝謝你的回答。 – Kery