2012-02-15 2 views
0

unsigned char 출력 형식을 BOOST_CHECK_EQUAL_COLLECTIONS으로 바꿀 수 있습니까?부호없는 문자가있는 BOOST_CHECK_EQUAL_COLLECTIONS는 불일치로 인쇄 할 수없는 문자를 출력합니다.

나는 부호없는 char 배열에 값을 검증하기 위해 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)); 

내가 불일치에 인쇄 할 수없는 문자를 얻을 : 나는 일시적으로 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 

unsigned 배열을 사용하여 문자가 아닌 숫자를 인쇄 할 수 있습니다. 마찬가지로 result.Message을 새로운 vector<unsigned>에 복사하고 그에 대해 비교할 수 있습니다 :

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

끔찍하지는 않지만 가능한 경우 원본과 비교하는 것이 좋습니다.

내부적으로 BOOST_CHECK_EQUAL_COLLECTIONS 임시 stringstream 내가 할 수없는 액세스를 사용하지만, 그것은 나에 대한 ostream 서식을 궁금해 얻었다.

패싯과 로케일을 다루는 데 많은 경험이 없지만 개별적으로 사용할 수 있는지 궁금합니다. unsigned char ASCII 대신 숫자로 인쇄 하시겠습니까? 놀랍게도 많은

+0

좋은 생각이지만 패싯과 로케일은 잔인합니다. – mskfisher

답변

1

, 당신은 (내 경우 test_foo.cpp를) 테스트 파일 내부의 std 네임 스페이스에 unsigned char에 대한 operator<<을 정의하여이 작업을 수행 할 수 있습니다 :

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 
관련 문제