带有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码?
答
出乎我的意料,你可以在您的测试文件中的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
好的想法,但方面和地区是矫枉过正。 – mskfisher 2012-02-15 16:56:16