FizzBuzzとの3か月(6)

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

今日はテストコードを直しました。
最初のコードとほとんど同じです。違うのは分岐の条件のみです。

以下、コードです。

# -*- 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」と、7の倍数のときは「Buzz」とプリントし、
    3と7両方の倍数の場合には「FizzBuzz」とプリントすること。
    """
    for i in range(100):
      param = i + 1
      answer = self._target.getAnswer(param)
      if 'Fizz' == answer:
        self.assertEqual(0, param % 3)
      elif 'Buzz' == answer:
        self.assertEqual(0, param % 7)
      elif 'FizzBuzz' == answer:
        self.assertEqual(0, param % 3)
        self.assertEqual(0, param % 7)
      else:
        self.assertEqual(False, param % 3 == 0)
        self.assertEqual(False, param % 7 == 0)


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()

明日は休みで時間がありますので、別の言語で実装してみようかと思います。

以上