BOOST_CHECK_EQUAL_COLLECTIONS с неподписанным символом выводит непечатные символы при несовпадении - PullRequest
0 голосов
/ 15 февраля 2012

Можно ли изменить формат вывода unsigned char на BOOST_CHECK_EQUAL_COLLECTIONS?

Я использую Boost.Test 1.37.0 для проверки значений в массиве без знака:

//  result.Message is a fixed-size unsigned char array
//  result.Length is the length of the data inside result.Message

const unsigned expected_message[] = { 3, 60, 43, 17 };

BOOST_CHECK_EQUAL_COLLECTIONS(
    result.Message,
    result.Message + result.Length,
    expected_message,
    expected_message + sizeof(expected_message) / sizeof(*expected_message) );

и я получаю непечатаемые символы при несовпадении:

test_foo.cpp(117): error in "test_bar": check { result.Message, result.Message + result.Length } == { expected_message, expected_message + sizeof(expected_message) /  sizeof(*expected_message) } failed. 
Mismatch in a position 1:  != 60
Mismatch in a position 2: < != 43
Mismatch in a position 3:          != 17

Я временно изменил expected_message на массив unsigned, чтобы он печатал числа, а не символы - аналогично, я мог бы скопировать result.Message в новый vector<unsigned> и сравнить с ним:

vector<unsigned> result_message(result.Message, result.Message + result.Length);

что не страшно, но я бы предпочел сравнить с оригиналом, если это возможно.

Внутренне, BOOST_CHECK_EQUAL_COLLECTIONS использует временный stringstream, к которому я не могу получить доступ, но меня удивило форматирование ostream.

У меня нет большого опыта работы с фасетами и локалями, но мне интересно, смогу ли я как-нибудь использовать их для печати отдельных unsigned char в виде чисел вместо ASCII?

1 Ответ

1 голос
/ 15 февраля 2012

К моему большому удивлению, вы можете сделать это, определив operator<< для unsigned char в пространстве имен std внутри вашего тестового файла (в моем случае, test_foo.cpp):

namespace std {

ostream &operator<<( ostream &os, const unsigned char &uc ) {
    return os << static_cast<unsigned>(uc);
}

}

Это дает:

Mismatch in a position 0: 4 != 60
Mismatch in a position 1: 60 != 43
Mismatch in a position 2: 9 != 17
...