2019年8月21日水曜日

開発環境

Head First はじめてのプログラミング ―頭とからだで覚えるPythonプログラミング入門 (Eric Freeman(著)、嶋田 健志(監修)、木下 哲也(翻訳)、株式会社オライリー・ジャパン)を12章(オブジェクト指向プログラミング - オブジェクト村への旅)の自分で考えてみよう(545ページ)の解答を求めてみる。

コード

Python 3

sample4_test.py

#!/usr/bin/env python3
from unittest import TestCase, main
from test.support import captured_stdout
from sample4 import Car, Taxi, Limo


class MyTestCase(TestCase):
    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_car(self):
        car = Car()
        with captured_stdout() as stdout:
            car.start()
            car.drive()
        self.assertEqual(stdout.getvalue(), 'Car is moving\n')

    def test_taxi(self):
        taxi = Taxi()
        with captured_stdout() as stdout:
            taxi.start()
            taxi.hire('Kim')
            taxi.drive()
            taxi.pay(5.0)
            taxi.drive()
        s = '''Hired by Kim
Honk honk, out of the way
Car is moving
Paid 5.0
Honk honk, out of the way
Car is moving
'''
        self.assertEqual(stdout.getvalue(), s)

    def test_limo(self):
        limo = Limo()
        with captured_stdout() as stdout:
            limo.start()
            limo.hire('Jenn')
            limo.pour_drink()
            limo.pay(10.0, 5.0)
        s = '''Hired by Jenn
Pouring drink
Paid 10.0 Tip 5.0
Paid 15.0
'''
        self.assertEqual(stdout.getvalue(), s)


if __name__ == '__main__':
    main()

sample4.py

#!/usr/bin/env python3
class Car:
    def __init__(self):
        self.speed = 0
        self.running = False

    def start(self):
        self.running = True

    def drive(self):
        if self.running:
            print('Car is moving')
        else:
            print('Start the car first')


class Taxi(Car):
    def __init__(self):
        super().__init__()
        self.passenger = None
        self.balance = 0.0

    def drive(self):
        print('Honk honk, out of the way')
        super().drive()

    def hire(self, passenger):
        print(f'Hired by {passenger}')
        self.passenger = passenger

    def pay(self, amount):
        print(f'Paid {amount}')
        self.balance += amount
        self.pasenger = None


class Limo(Taxi):
    def drive(self):
        print('Limo driving in luxury')
        Car.drive(self)

    def pay(self, amount, big_tip):
        print(f'Paid {amount} Tip {big_tip}')
        super().pay(amount + big_tip)

    def pour_drink(self):
        print('Pouring drink')

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

$ ./sample4_test.py 
E
======================================================================
ERROR: test_car (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./sample4_test.py", line 14, in test_car
    car = Car()
NameError: name 'Car' is not defined

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (errors=1)
$ ./sample4_test.py 
F
======================================================================
FAIL: test_car (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./sample4_test.py", line 19, in test_car
    self.assertEqual(stdout.getvalue(), 'Car is moving')
AssertionError: 'Car is moving\n' != 'Car is moving'
- Car is moving
?              -
+ Car is moving

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)
$ ./sample4_test.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
$ ./sample4_test.py 
.E
======================================================================
ERROR: test_taxi (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./sample4_test.py", line 22, in test_taxi
    taxi = Taxi()
NameError: name 'Taxi' is not defined

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (errors=1)
$ ./sample4_test.py
..
----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK
$ ./sample4_test.py
.E.
======================================================================
ERROR: test_limo (__main__.MyTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./sample4_test.py", line 39, in test_limo
    limo = Limo()
NameError: name 'Limo' is not defined

----------------------------------------------------------------------
Ran 3 tests in 0.001s

FAILED (errors=1)
$ ./sample4_test.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK
$ 

0 コメント:

コメントを投稿