Как отобразить шестнадцатеричное значение при сбое cppunit

Я использую CPPUNIT_ASSERT_EQUAL (a, b), чтобы проверить значения a и b. A и b являются типом знака без знака. Таким образом, когда это утверждение не удалось, оно отобразит ожидаемое и фактическое значение. Поскольку типом является unsigned char, ожидаемое и фактическое значение будет отображаться в виде символов. Например, 35 будет отображаться как #. Но это не то, что я хочу. Конечно, CPPUNIT_ASSERT_EQUAL ((int) a, (int) b) может быть решением, но это выглядит странно. Кроме того, было бы лучше, если бы значения отображались в шестнадцатеричном формате. Но я не знаю, как этого достичь. Буду очень признателен, если кто-нибудь даст ответ.

2

Решение

Я думаю, что единственный способ достичь этого эффекта — это адаптировать 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

Другие решения

добавлять #include <cstdio> и использовать printf функция. (ссылка на printf).

Использовать %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