今回は、古いコンパイラへの対応強化と C++11 の機能の取り込みを行なっています。
また、いくつか機能追加もしております。
C++11 の機能の取り込み
initializer_list
::iutest::ValuesIn を初期化リストに対応させました。
このような記述ができるようになります。
IUTEST_INSTANTIATE_TEST_CASE_P(My6, ParamTest
, ::iutest::ValuesIn({ 3, 2, 1, 0 }));
また、実験的ではありますが、
tr1/iutest_param_direct_tests.hpp
を include することで下記のような記述も可能になります。
IUTEST_INSTANTIATE_TEST_CASE_P(My7, ParamTest
, { 3, 2, 1, 0 });
::iutest::Values で事足りていると思うので、あまり使いどころはないかもしれません。
IUTEST_INSTANTIATE_TEST_CASE_P(My3, ParamTest
, ::iutest::Values(3, 2, 1, 0));
extern template
ライブラリビルド向けに extern template を使ってみました。
個人的な勉強のために使ってみた程度です。
random (distribution)
特定範囲の乱数生成に uniform_int_distribution を使うようにしました。
また、::iutest::detail::iuRandom クラスを distribution の要求仕様に対応させました。
テスト関数から random_engine() 関数を呼ぶことで iuRandom を取得可能です。
IUTEST(RandomEngineTest, Test)
{
IUTEST_ASSERT_LE(
::std::uniform_int_distribution<unsigned int>(0, 1)(random_engine()), 1);
}
追加機能
::iutest::RandomValues
パラメータの型が取りうる値をランダムにパラメータとして設定します。class RandomValuesTest1 : public ::iutest::TestWithParam<int> {};
class RandomValuesTest2 : public ::iutest::TestWithParam<char> {};
class RandomValuesTest3 : public ::iutest::TestWithParam<float> {};
IUTEST_P(RandomValuesTest1, Test)
{
int v = GetParam();
IUTEST_SUCCEED() << v;
}
IUTEST_P(RandomValuesTest2, Test)
{
char v = GetParam();
IUTEST_SUCCEED() << v;
}
IUTEST_P(RandomValuesTest3, Test)
{
float v = GetParam();
IUTEST_ASSERT_GE(1, v);
IUTEST_ASSERT_LE(0, v);
IUTEST_SUCCEED() << v;
}
IUTEST_INSTANTIATE_TEST_CASE_P(A, RandomValuesTest1, ::iutest::RandomValues(5));
IUTEST_INSTANTIATE_TEST_CASE_P(A, RandomValuesTest2, ::iutest::RandomValues(5));
IUTEST_INSTANTIATE_TEST_CASE_P(A, RandomValuesTest3, ::iutest::RandomValues(5));
::iutest::ValuesGen
::iutest::RandomValues を作るにあたって汎用的に使えそうだったので、追加しました。::std::generate のように指定数分、関数オブジェクトを使ってパラメータ設定をします。
struct RandomVMExceptMoneyGenerator
{
::iutest::detail::iuRandom engine;
int operator ()(void)
{
for(;;)
{
int n = engine() % 1000;
if( n != 10 && n != 50 && n != 100 && n != 500 ) return n;
}
}
};
IUTEST_INSTANTIATE_TEST_CASE_P(Random03, ValuesGenTest
, ::iutest::ValuesGen(5, RandomVMExceptMoneyGenerator()));
::iutest::RandomValues もそうですが、::iutest::ValuesGen がなくても同様のパラメータテストは作成できます。
上のテストを書き直すと、このようになります。
struct RandomVMExceptMoneyGenerator
{
::iutest::detail::iuRandom engine;
int operator ()(void)
{
for(;;)
{
int n = engine() % 1000;
if( n != 10 && n != 50 && n != 100 && n != 500 ) return n;
}
}
};
::std::vector<int> RandomVMExceptMoneyParams(int n)
{
::std::vector<int> v(n);
::std::generate(v.begin(), v.end(), RandomVMExceptMoneyGenerator());
return v;
}
IUTEST_INSTANTIATE_TEST_CASE_P(Random03, ValuesGenTest
, ::iutest::ValuesIn(RandomVMExceptMoneyParams(5)));
複数の型付けテストに考慮
複数の型を型付けテストでテストしたい場合を考え、修正を加えました。template<typename T>
class MultiTypedTest : public ::iutest::Test
{
};
typedef ::iutest::Types< ::iutest::Types<int, float>, ::iutest::Types<int, double> > MultiTypedTestTypes;
IUTEST_TYPED_TEST_CASE(MultiTypedTest, MultiTypedTestTypes);
IUTEST_TYPED_TEST(MultiTypedTest, Get)
{
typedef typename TypeParam:: template get<0>::type Type1; // 型を取得する get を追加
typedef typename TypeParam:: template get<1>::type Type2; // template 引数に何番目の型を指定します
::iutest::StaticAssertTypeEq< Type1, int >();
IUTEST_SUCCEED() << ::iutest::detail::GetTypeName< Type1 >();
IUTEST_SUCCEED() << ::iutest::detail::GetTypeName< Type2 >();
}
複数の型を持った ::iutest::Types をパラメータとして TYPED_TEST を作成します。
各型を ::iutest::Types::get で取得できるようにし、複数の型に対するテストを記述しやすくしました。
次バージョンの予定
実行順序の指定に対応予定です。あとは、そろそろスレッド周りを見ていこうかなー…という感じです。
0 件のコメント:
コメントを投稿