0

unsigned charの出力フォーマットを変更する方法はありますBOOST_CHECK_EQUAL_COLLECTIONSか?

Boost.Test 1.37.0を使用して、unsignedchar配列の値を検証しています。

//  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一時的なものを使用していますが、フォーマットについて疑問に思いました。stringstreamostream

unsigned charファセットやロケールを扱った経験はあまりありませんが、 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 に答える