0

有没有办法改变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格式化感到疑惑。

我在处理方面和语言环境方面没有很多经验,但我想知道是否可以使用它们以某种方式使个人unsigned chars 打印为数字而不是 ASCII?

4

1 回答 1

1

令我惊讶的是,您可以通过在测试文件内的命名空间中定义operator<<for来完成此操作(在我的例子中, ):unsigned charstdtest_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
于 2012-02-15T16:55:05.160 回答