FizzBuzzとの3か月(5)

お世話になっております。

今日は、FizzBuzz問題を少し変えてみました。変更したのは以下2点です。

  • Buzzとプリントするのは、5で割り切れるときではなく、7で割り切れるときとする。
  • FizzBuzzとプリントするのは、3と7で割り切れるときとする。

以下、コードです。

# -*- coding: sjis -*-

import unittest
import random
import sys


class FizzBuzzFactoryTestCase(unittest.TestCase):
  def setUp(self):
    self._target = FizzBuzzFactory()

  def testgetAnswer(self):
    """1から100までの数をプリントするプログラムを書け。
    ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、
    3と5両方の倍数の場合には「FizzBuzz」とプリントすること。
    """
    self.assertEqual('1', self._target.getAnswer(1))
    self.assertEqual('2', self._target.getAnswer(2))
    self.assertEqual('Fizz', self._target.getAnswer(3))
    self.assertEqual('4', self._target.getAnswer(4))
    self.assertEqual('5', self._target.getAnswer(5))
    self.assertEqual('Fizz', self._target.getAnswer(6))
    self.assertEqual('Buzz', self._target.getAnswer(7))
    self.assertEqual('8', self._target.getAnswer(8))
    self.assertEqual('Fizz', self._target.getAnswer(9))
    self.assertEqual('10', self._target.getAnswer(10))
    self.assertEqual('11', self._target.getAnswer(11))
    self.assertEqual('Fizz', self._target.getAnswer(12))
    self.assertEqual('13', self._target.getAnswer(13))
    self.assertEqual('Buzz', self._target.getAnswer(14))
    self.assertEqual('Fizz', self._target.getAnswer(15))
    self.assertEqual('16', self._target.getAnswer(16))
    self.assertEqual('17', self._target.getAnswer(17))
    self.assertEqual('Fizz', self._target.getAnswer(18))
    self.assertEqual('19', self._target.getAnswer(19))
    self.assertEqual('20', self._target.getAnswer(20))
    self.assertEqual('FizzBuzz', self._target.getAnswer(21))
    self.assertEqual('22', self._target.getAnswer(22))
    self.assertEqual('23', self._target.getAnswer(23))
    self.assertEqual('Fizz', self._target.getAnswer(24))
    self.assertEqual('25', self._target.getAnswer(25))
    self.assertEqual('26', self._target.getAnswer(26))
    self.assertEqual('Fizz', self._target.getAnswer(27))
    self.assertEqual('Buzz', self._target.getAnswer(28))
    self.assertEqual('29', self._target.getAnswer(29))
    self.assertEqual('Fizz', self._target.getAnswer(30))
    self.assertEqual('31', self._target.getAnswer(31))
    self.assertEqual('32', self._target.getAnswer(32))
    self.assertEqual('Fizz', self._target.getAnswer(33))
    self.assertEqual('34', self._target.getAnswer(34))
    self.assertEqual('Buzz', self._target.getAnswer(35))
    self.assertEqual('Fizz', self._target.getAnswer(36))
    self.assertEqual('37', self._target.getAnswer(37))
    self.assertEqual('38', self._target.getAnswer(38))
    self.assertEqual('Fizz', self._target.getAnswer(39))
    self.assertEqual('40', self._target.getAnswer(40))
    self.assertEqual('41', self._target.getAnswer(41))
    self.assertEqual('FizzBuzz', self._target.getAnswer(42))
    self.assertEqual('43', self._target.getAnswer(43))
    self.assertEqual('44', self._target.getAnswer(44))
    self.assertEqual('Fizz', self._target.getAnswer(45))
    self.assertEqual('46', self._target.getAnswer(46))
    self.assertEqual('47', self._target.getAnswer(47))
    self.assertEqual('Fizz', self._target.getAnswer(48))
    self.assertEqual('Buzz', self._target.getAnswer(49))
    self.assertEqual('50', self._target.getAnswer(50))
    self.assertEqual('Fizz', self._target.getAnswer(51))
    self.assertEqual('52', self._target.getAnswer(52))
    self.assertEqual('53', self._target.getAnswer(53))
    self.assertEqual('Fizz', self._target.getAnswer(54))
    self.assertEqual('55', self._target.getAnswer(55))
    self.assertEqual('Buzz', self._target.getAnswer(56))
    self.assertEqual('Fizz', self._target.getAnswer(57))
    self.assertEqual('58', self._target.getAnswer(58))
    self.assertEqual('59', self._target.getAnswer(59))
    self.assertEqual('Fizz', self._target.getAnswer(60))
    self.assertEqual('61', self._target.getAnswer(61))
    self.assertEqual('62', self._target.getAnswer(62))
    self.assertEqual('FizzBuzz', self._target.getAnswer(63))
    self.assertEqual('64', self._target.getAnswer(64))
    self.assertEqual('65', self._target.getAnswer(65))
    self.assertEqual('Fizz', self._target.getAnswer(66))
    self.assertEqual('67', self._target.getAnswer(67))
    self.assertEqual('68', self._target.getAnswer(68))
    self.assertEqual('Fizz', self._target.getAnswer(69))
    self.assertEqual('Buzz', self._target.getAnswer(70))
    self.assertEqual('71', self._target.getAnswer(71))
    self.assertEqual('Fizz', self._target.getAnswer(72))
    self.assertEqual('73', self._target.getAnswer(73))
    self.assertEqual('74', self._target.getAnswer(74))
    self.assertEqual('Fizz', self._target.getAnswer(75))
    self.assertEqual('76', self._target.getAnswer(76))
    self.assertEqual('Buzz', self._target.getAnswer(77))
    self.assertEqual('Fizz', self._target.getAnswer(78))
    self.assertEqual('79', self._target.getAnswer(79))
    self.assertEqual('80', self._target.getAnswer(80))
    self.assertEqual('Fizz', self._target.getAnswer(81))
    self.assertEqual('82', self._target.getAnswer(82))
    self.assertEqual('83', self._target.getAnswer(83))
    self.assertEqual('FizzBuzz', self._target.getAnswer(84))
    self.assertEqual('85', self._target.getAnswer(85))
    self.assertEqual('86', self._target.getAnswer(86))
    self.assertEqual('Fizz', self._target.getAnswer(87))
    self.assertEqual('88', self._target.getAnswer(88))
    self.assertEqual('89', self._target.getAnswer(89))
    self.assertEqual('Fizz', self._target.getAnswer(90))
    self.assertEqual('Buzz', self._target.getAnswer(91))
    self.assertEqual('92', self._target.getAnswer(92))
    self.assertEqual('Fizz', self._target.getAnswer(93))
    self.assertEqual('94', self._target.getAnswer(94))
    self.assertEqual('95', self._target.getAnswer(95))
    self.assertEqual('Fizz', self._target.getAnswer(96))
    self.assertEqual('97', self._target.getAnswer(97))
    self.assertEqual('Buzz', self._target.getAnswer(98))
    self.assertEqual('Fizz', self._target.getAnswer(99))
    self.assertEqual('100', self._target.getAnswer(100))


class FizzBuzzFactory(object):
  def __init__(self):
    self._fizzbuzzList = [Fizz(), Buzz(), FizzBuzz(), Figure()]

  def getAnswer(self, num):
    """numに対応した文字列を返す。"""
    result = None
    for fizzbuzz in self._fizzbuzzList:
      if fizzbuzz.isAnswerOf(num):
        result = fizzbuzz
        break
    return str(result)

  def execute(self):
    """1から100をパラメータとしてgetAnswerを実行し、復帰値を出力する"""
    for i in range(100):
      param = i + 1
      print(self.getAnswer(param))


class Fizz(object):
  def __str__(self):
    return 'Fizz'

  def isAnswerOf(self, num):
    return num % 3 == 0 and not FizzBuzz().isAnswerOf(num)


class Buzz(object):
  def __str__(self):
    return 'Buzz'

  def isAnswerOf(self, num):
    return num % 7 == 0 and not FizzBuzz().isAnswerOf(num)


class FizzBuzz(object):
  def __str__(self):
    return 'FizzBuzz'

  def isAnswerOf(self, num):
    return num % 3 == 0 and num % 7 == 0


class Figure(object):
  def __str__(self):
    if not self._num:
      raise Exception
    return str(self._num)

  def isAnswerOf(self, num):
    if not Fizz().isAnswerOf(num) and not Buzz().isAnswerOf(num):
      self._num = num
      return True
    return False


if __name__ == '__main__':
  unittest.main()

本番のソースを直すのは簡単でしたが、テストコードを直すのがやはり難しかったです。
次は、テストコードをもう少し保守しやすくします。

以上