title.png

^<< 2008.12/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 26 27 28 29 30 31 >>$

Trackback の仕組みはありませんので、コメントにでも残していただくと嬉しいかも、です。

(2008.12.11)

boost::unit_test_framework でちょいハマりした件(あるいはバッドノウハウを身につけた件)

まぁ、バッドノウハウ満載のC++なので・・・

んで、ごくごく普通に、下記のような感じでテストを書いてるんですが。。。

hogeTest.cpp:

.....

// (1)

struct HogeTestFixture
{
    HogeTestFixture() { /* setup here */ }
    ~HogeTestFixture() { /* teardown here */ }

    Hoge testTarget_;
    ....
};

BOOST_AUTO_TEST_SUITE(hogeTest_suite)

BOOST_FIXTURE_TEST_CASE(test_Foo, HogeTestFixture)
{
    BOOST_CHECK( testTarget_.Foo() );
}

// (2)

BOOST_FIXTURE_TEST_CASE(test_Bar, HogeTestFixture)
{
    BOOST_CHECK_EQUAL( testTarget_.Bar() , 100 );
}

.... and more tests ....

BOOST_AUTO_TEST_SUITE_END()

どうやら、BOOST_AUTO_TEST_SUITE() と BOOST_AUTO_TEST_SUITE_END() の間で boost/assign.hpp を include しようとすると、コンパイルエラーになるようです。 例えば (2) の場所に #include <boost/assign.hpp> を書いたらコンパイルエラーになりました。 (boost 1.35.0 を使って VS2008 で確認)

C++ 特有の一見しただけでは意味が分からないエラーメッセージで、なかなか真相に気づけずにちょっとハマっちゃいました。 (1) の場所に include を移したら、何事も無かったかのようにビルドが通りました・・・うーん。

なんとなく、バッドノウハウが身に付いた瞬間でした(^^;

ちなみに、boost::assign は、演算子オーバーロードを利用して(比較的)自然な記法でコンテナの初期化や代入ができるようにするものです。

#include <boost/assign.hpp>
#include <vector>

using namespace boost::assign;

void func()
{
    std::vector<int> vec;
    vec += 0, 1, 2, 3;
}

は以下と等価です。

#include <vector>

void func()
{
    std::vector<int> vec;
    vec.push_back(0);
    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);
}

ツッコミ