What is it, naokirin?

テスト駆動開発の練習(1) -C++&Boost::TestでFizzBuzz-

今回、TDDの練習を始めようということで、FizzBuzzを実装してみることにしました。
FizzBuzzはよくあるゲームで何人か人が円になって順番に隣の人の言った数字に1を足した数字を言っていきます。ただし3の倍数のときは「Fizz」、5の倍数のときは「Buzz」、3と5の倍数のときは「FizzBuzz」と言います(ちょっと前に流行った芸人のネタみたいですが)。

これを実際にプログラムとして実装するわけです。
今回はFizzBuzzというクラスに

  • 数字を初期化するコンストラクタ
  • 保持している数字のときに言うべき言葉(文字列)を返すメソッド
  • 現在の数字に1を足すメソッド
  • 現在の数字を1減らすメソッド
  • 現在の数字を設定するメソッド
  • 現在の数字を返すメソッド

  • を実装します。

    ちなみに今回はC++&Boost::test、Java&JUnit4、C#NUnitPython&py.testを使用してみました。
    説明はほぼなしです。ちなみに今回はC++&Boostのコードのみ載せます。残りの3つは後々記事にしたいと思います。

まずはC++の場合(テスト以外にもBoostライブラリを使っています)

#ifndef FIZZBUZZ_H
#define FIZZBUZZ_H

#include <string>

class FizzBuzz
{
public:
	FizzBuzz(int startNumber);
	~FizzBuzz();

	std::string says();

	void increment();
	void decrement();
	void setCurrentNumber(int num);
	int getCurrentNumber();

private:
	int currentNumber;
	
};
#endif// FIZZBUZZ_H

fizzbuzz.h

#include "fizzbuzz.h"
#include <boost/lexical_cast.hpp>

FizzBuzz::FizzBuzz(int startNumber = 1)
	: currentNumber(startNumber)
{}

FizzBuzz::~FizzBuzz()
{}

std::string FizzBuzz::says()
{
	if(currentNumber % 3 == 0 && currentNumber % 5 == 0){
		return "FizzBuzz";
	}
	else if(currentNumber % 3 == 0){
		return "Fizz";
	}
	else if(currentNumber % 5 == 0){
		return "Buzz";
	}
	else{
		return boost::lexical_cast<std::string>(currentNumber);
	}
}

void FizzBuzz::increment()
{
	currentNumber++;
}

void FizzBuzz::decrement()
{
	currentNumber--;
}

void FizzBuzz::setCurrentNumber(int num)
{
	currentNumber = num;
}

int FizzBuzz::getCurrentNumber()
{
	return currentNumber;
}

fizzbuzz.cpp

#define BOOST_TEST_MODULE fizzbuzz
#include <boost/test/included/unit_test.hpp>
#include <boost/scoped_ptr.hpp>

#include "fizzbuzz.h"
using namespace boost::unit_test;

BOOST_AUTO_TEST_CASE( test_NotMultipleOfThreeAndFive )
{
	boost::scoped_ptr<FizzBuzz> fb( new FizzBuzz(1));
	
	BOOST_CHECK_EQUAL(fb->says(), "1");
}

BOOST_AUTO_TEST_CASE( test_MultipleOfThree)
{
	boost::scoped_ptr<FizzBuzz> fb( new FizzBuzz(3));

	BOOST_CHECK_EQUAL(fb->says(), "Fizz");
}

BOOST_AUTO_TEST_CASE( test_MultipleFive )
{
	boost::scoped_ptr<FizzBuzz> fb(new FizzBuzz(5));

	BOOST_CHECK_EQUAL(fb->says(), "Buzz");
}

BOOST_AUTO_TEST_CASE( test_MultipleThreeAndFive )
{
	boost::scoped_ptr<FizzBuzz> fb(new FizzBuzz(15));

	BOOST_CHECK_EQUAL(fb->says(), "FizzBuzz");
}

BOOST_AUTO_TEST_CASE( test_NumberIncrement )
{
	boost::scoped_ptr<FizzBuzz> fb(new FizzBuzz(1));
	fb->increment();

	BOOST_CHECK_EQUAL(fb->says(), "2");
}

BOOST_AUTO_TEST_CASE( test_NumberDecrement )
{
	boost::scoped_ptr<FizzBuzz> fb(new FizzBuzz(2));
	fb->decrement();

	BOOST_CHECK_EQUAL(fb->says(), "1");
}

BOOST_AUTO_TEST_CASE( test_SetCurrentNumber )
{
	boost::scoped_ptr<FizzBuzz> fb(new FizzBuzz(2));
	fb->setCurrentNumber(1);

	BOOST_CHECK_EQUAL(fb->says(), "1");
}

BOOST_AUTO_TEST_CASE( test_getCurrentNumber )
{
	boost::scoped_ptr<FizzBuzz> fb(new FizzBuzz(2));

	BOOST_CHECK_EQUAL(fb->getCurrentNumber(), 2);
}

fizzbuzztest.cpp


少々テストの内容として怪しいですが、ほぼ初めてということで練習です。(実際にコードを書いているときはテストそのものを間違えていたりしました。)これから少しずつ練習していきたいと思います。