今回は、古いコンパイラへの対応強化と C++11 の機能の取り込みを行なっています。
また、いくつか機能追加もしております。
C++11 の機能の取り込み
initializer_list
::iutest::ValuesIn を初期化リストに対応させました。
このような記述ができるようになります。
1 2 |
IUTEST_INSTANTIATE_TEST_CASE_P(My6, ParamTest , ::iutest::ValuesIn({ 3, 2, 1, 0 })); |
また、実験的ではありますが、
tr1/iutest_param_direct_tests.hpp
を include することで下記のような記述も可能になります。
1 2 |
IUTEST_INSTANTIATE_TEST_CASE_P(My7, ParamTest , { 3, 2, 1, 0 }); |
::iutest::Values で事足りていると思うので、あまり使いどころはないかもしれません。
1 2 |
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 を取得可能です。
1 2 3 4 5 |
IUTEST(RandomEngineTest, Test) { IUTEST_ASSERT_LE( ::std::uniform_int_distribution<unsigned int >(0, 1)(random_engine()), 1); } |
追加機能
::iutest::RandomValues
パラメータの型が取りうる値をランダムにパラメータとして設定します。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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 のように指定数分、関数オブジェクトを使ってパラメータ設定をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 がなくても同様のパラメータテストは作成できます。
上のテストを書き直すと、このようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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))); |
複数の型付けテストに考慮
複数の型を型付けテストでテストしたい場合を考え、修正を加えました。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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 で取得できるようにし、複数の型に対するテストを記述しやすくしました。
次バージョンの予定
実行順序の指定に対応予定です。あとは、そろそろスレッド周りを見ていこうかなー…という感じです。