読者です 読者をやめる 読者になる 読者になる

kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

CppUnitのautoRegisterRegistry__

CppUnitのテストケースを次のようにヘッダーに直接書いていまして、

#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>

class Test : public CPPUNIT_NS::TestFixture {
  CPPUNIT_TEST_SUITE(Test);
  CPPUNIT_TEST(test);
  CPPUNIT_TEST_SUITE_END();
public:
  void test() {
  }
};

CPPUNIT_TEST_SUITE_REGISTRATION(Test);

しばらくは問題なかったんですが、いくつかテストを追加していくうちに、スイートの登録部分でエラーが出るようになってしまいました。

// Redefinition of 'autoRegisterRegistry__13' with a different type
CPPUNIT_TEST_SUITE_REGISTRATION(Test);

すぐに意味が分からなかったんでしばらく放置していたんですが(テストは分割して実行すれば良いので問題なかった)、改めてマクロを追っかけたとろ、次のようになっていました。

#define CPPUNIT_TEST_SUITE_REGISTRATION( ATestFixtureType )      \
  static CPPUNIT_NS::AutoRegisterSuite< ATestFixtureType >       \
             CPPUNIT_MAKE_UNIQUE_NAME(autoRegisterRegistry__ )

#define CPPUNIT_MAKE_UNIQUE_NAME( prefix ) CPPUNIT_JOIN( prefix, __LINE__ )

UNIQUE_NAMEってなっていますが、__LINE__を使っているだけなんですよね。つまり、たまたま行数が異なっていれば問題なくて、たまたま行数がかぶると同じ名前に展開されるのでアウトってことです。

実装がお粗末なのか、使い方が悪いのか・・・まあ、テストの分割はなんだかんだで面倒だったので、対処方法(空行で__LINE__を変える)が分かってすっきりしました。