2012-02-15 4 views
0

unsigned charの出力書式をBOOST_CHECK_EQUAL_COLLECTIONSに変更する方法はありますか?符号なしの文字を含むBOOST_CHECK_EQUAL_COLLECTIONSは、不一致で印刷不可能な文字を出力します

私はunsigned char型の配列内の値を検証するためにBoost.Test 1.37.0を使用しています:

// 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)); 

と私は不一致で印刷できない文字を取得します:私は一時的に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 

unsignedの配列で、文字ではなく数字を出力するようにしました。同様に、私はresult.Messageを新しいvector<unsigned>にコピーし、これと比較することができます:

vector<unsigned> result_message(result.Message, result.Message + result.Length); 

これはひどいわけではありませんが、可能であればオリジナルと比較したいと思います。

内部では、BOOST_CHECK_EQUAL_COLLECTIONSは、私がアクセスできない一時的なstringstreamを使用していますが、ostreamの書式設定について不思議です。

私はファセットとロケールを扱う経験はあまりありませんが、どういう形で使ってもかまいませんか?unsigned char ASCIIの代わりに数値として印刷しますか?

私の驚いたことに
+0

をいい考えですが、ファセットやロケールは過度のものです。 – mskfisher

答えて

1

、あなたは(私の場合は、test_foo.cpp)テストファイル内std名前空間でunsigned charためoperator<<を定義することによって、これを達成することができます

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 
関連する問題