今回、TDDの練習を始めようということで、FizzBuzzを実装してみることにしました。
FizzBuzzはよくあるゲームで何人か人が円になって順番に隣の人の言った数字に1を足した数字を言っていきます。ただし3の倍数のときは「Fizz」、5の倍数のときは「Buzz」、3と5の倍数のときは「FizzBuzz」と言います(ちょっと前に流行った芸人のネタみたいですが)。
これを実際にプログラムとして実装するわけです。
今回はFizzBuzzというクラスに
- 数字を初期化するコンストラクタ
- 保持している数字のときに言うべき言葉(文字列)を返すメソッド
- 現在の数字に1を足すメソッド
- 現在の数字を1減らすメソッド
- 現在の数字を設定するメソッド
- 現在の数字を返すメソッド
を実装します。
ちなみに今回はC++&Boost::test、Java&JUnit4、C#&NUnit、Python&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
少々テストの内容として怪しいですが、ほぼ初めてということで練習です。(実際にコードを書いているときはテストそのものを間違えていたりしました。)これから少しずつ練習していきたいと思います。