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

时间:2012-02-15 15:58:51

标签: locale string-formatting stringstream facet boost-test

有没有办法更改unsigned char的<{1}}输出格式?

我正在使用Boost.Test 1.37.0来验证unsigned char数组中的值:

BOOST_CHECK_EQUAL_COLLECTIONS

我在不匹配时得到了不可打印的字符:

//  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?

1 个答案:

答案 0 :(得分:1)

令我惊讶的是,您可以通过在测试文件中的operator<<命名空间中为unsigned char定义std(在我的情况下为test_foo.cpp)来实现此目的:< / p>

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