2013年3月29日金曜日

iutest v1.4.0 をリリースしました

iutest v1.4.0 をリリースしました。

今回は、古いコンパイラへの対応強化と 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 件のコメント:

コメントを投稿