BOOST_AUTO_TEST_CASE

を使うと、init_unit_test_suite を書く必要がなくなります。プリンスオブペルシャはずいぶん前に終わってるんですが、いまさら書いてみます。

そんなわけで、前に書いた goban-test.cpp はこんなふうになります。

#include "goban.h"
 
#define BOOST_TEST_MODULE GobanTest
#include <boost/test/unit_test.hpp>
 
using namespace boost::unit_test_framework;
 
BOOST_AUTO_TEST_CASE(point_test) {
  BOOST_TEST_CHECKPOINT("reference x, y");
 
  Point p(3, 4);
 
  BOOST_CHECK_EQUAL(p.x, 3);
  BOOST_CHECK_EQUAL(p.y, 4);
 
  BOOST_TEST_CHECKPOINT("up, down, left, right");
 
  Point pu = p.up();
  Point pd = p.down();
  Point pl = p.left();
  Point pr = p.right();
 
  BOOST_CHECK_EQUAL(pu.x, p.x);
  BOOST_CHECK_EQUAL(pu.y, p.y - 1);
 
  BOOST_CHECK_EQUAL(pd.x, p.x);
  BOOST_CHECK_EQUAL(pd.y, p.y + 1);
 
  BOOST_CHECK_EQUAL(pl.x, p.x - 1);
  BOOST_CHECK_EQUAL(pl.y, p.y);
 
  BOOST_CHECK_EQUAL(pr.x, p.x + 1);
  BOOST_CHECK_EQUAL(pr.y, p.y);
 
  BOOST_TEST_CHECKPOINT("around");
 
  Points ps = p.around();
  BOOST_CHECK(ps->size() == 4);
  BOOST_CHECK(ps->find(pu) != ps->end());
  BOOST_CHECK(ps->find(pd) != ps->end());
  BOOST_CHECK(ps->find(pl) != ps->end());
  BOOST_CHECK(ps->find(pr) != ps->end());
 
  BOOST_TEST_CHECKPOINT("operator<");
 
  BOOST_CHECK(!(p < p));
  BOOST_CHECK(pu < p);
  BOOST_CHECK(p < pd);
  BOOST_CHECK(pl < p);
  BOOST_CHECK(p < pr);
}

BOOST_TEST_CHECKPOINT とか around とか operator< とか、いろいろ増えてますが、気にしないで下さい。あと、BOOST_TEST_MODULE は必須かどうか確かめてません。

(2011-07-27 追記: 必須らしいです。コメントにて id:maraigue さんが教えてくださいました。)

また、このように BOOST_AUTO_TEST_CASE を使うと、各 TEST_CASE を個別に実行することができるようになります。

$ ./goban-test --run_test=point_test

まぁ、この例だと、TEST_CASE が 1 つしかないので、意味がないんですが。

ソースコードの全部は github に置いてみました

もとにした、Scheme 版も置きました

これらは囲碁のルールをコードにおこしたものです、もう少し書き足せば、人 vs 人の囲碁ゲームにできる、…はず。

github それに git については以下のサイトを参考にさせていただきました。