带有unsigned char的BOOST_CHECK_EQUAL_COLLECTIONS在输出不匹配时输出不可打印的字符

问题描述:

有什么方法可以更改unsigned char输出格式BOOST_CHECK_EQUAL_COLLECTIONS带有unsigned char的BOOST_CHECK_EQUAL_COLLECTIONS在输出不匹配时输出不可打印的字符

我使用如Boost.Test 1.37.0在unsigned char类型数组来验证值:

// 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的格式。

我没有很多处理方面和区域设置的经验,但是我想知道我是否可以用它们以某种方式使用它们打印数字而不是ASCII码?

+0

好的想法,但方面和地区是矫枉过正。 – mskfisher 2012-02-15 16:56:16

出乎我的意料,你可以在您的测试文件中的std命名空间定义operator<<unsigned char做到这一点(在我的情况,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