2012-02-15 3 views
0

Есть ли способ изменить форматирование вывода BOOST_CHECK_EQUAL_COLLECTIONS?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 s print как цифры вместо ASCII?

+0

Приятная мысль, но грани и локали переполнены. – mskfisher

ответ

1

К моему удивлению, вы можете сделать это, определив 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 

 Смежные вопросы

  • Нет связанных вопросов^_^