同じテスト ケースを複数のクラスに適用するために、型パラメーター化されたテスト (サンプル #6 ) を実装しました。signed char[]
、unsigned char[]
、const signed char[]
またはのいずれかに文字列を代入すると、次のconst unsigned char[]
ようになります。
../stackoverflow.cpp: In member function ‘void IosTest_DummyTest_Test<gtest_TypeParam_>::TestBody() [with gtest_TypeParam_ = std::basic_istream<char, std::char_traits<char> >]’:
../stackoverflow.cpp:34: instantiated from here
../stackoverflow.cpp:32: error: char-array initialized from wide string
さらに興味深いのは、テスト ケースを 1 つのタイプに適用するとすべて問題なく動作するのに、2 つ目のタイプを追加すると問題が発生することです。次のコードでエラーを再現できました。
#include "gtest/gtest.h"
#include <iostream>
// Factory methods
template<class T> std::ios* CreateStream();
template<>
std::ios* CreateStream<std::istream>() {
return &std::cin;
}
template<>
std::ios* CreateStream<std::ostream>() {
return &std::cout;
}
// Fixture class
template<class T>
class IosTest: public ::testing::Test {
protected:
IosTest() : ios_(CreateStream<T>()) {}
virtual ~IosTest() {}
std::ios* const ios_;
};
using testing::Types;
typedef Types<std::istream, std::ostream> Implementations;
TYPED_TEST_CASE(IosTest, Implementations);
TYPED_TEST(IosTest, DummyTest) {
signed char c[] = ".";
this->ios_->fill(c[0]);
};
行typedef Types<std::istream, std::ostream> Implementations;
で、 というタイプのリストが作成さImplementations
れ、次の行で、リストで定義されたタイプTYPED_TEST_CASE(IosTest, Implementations);
にテスト ケースIosTest
が適用されることが定義されImplementations
ます。
すでに述べたように、リストからstd::istream
またはを削除すると、警告なしでテストをコンパイルして実行できます (フラグを使用しています)。誰でもこの現象を説明できますか?std::ostream
Implementations
-Wall