Danger

DANGER WILL ROBINSON! This chapter is still UNDER CONSTRUCTION.

It is DEFINITELY full of mistakes and may be completely different when I am done editing it though most of the code should work

classes: tests and solutions

tests

the code in person/tests/test_person.py from classes

  1import datetime
  2import random
  3import src.person
  4import unittest
  5
  6
  7def this_year():
  8    return datetime.datetime.now().year
  9
 10
 11def random_year_of_birth():
 12    return random.randint(
 13        this_year()-120, this_year()
 14    )
 15
 16
 17def get_age(year_of_birth):
 18    return this_year() - year_of_birth
 19
 20
 21class TestPerson(unittest.TestCase):
 22
 23    def setUp(self):
 24        self.random_first_name = random.choice((
 25            'jane', 'joe', 'john', 'person',
 26        ))
 27        self.random_year_of_birth = random_year_of_birth()
 28        self.random_new_year_of_birth = random_year_of_birth()
 29        self.original_age = get_age(self.random_year_of_birth)
 30        self.new_age = get_age(self.random_new_year_of_birth)
 31        self.random_last_name = random.choice((
 32            'doe', 'smith', 'blow', 'public',
 33        ))
 34        self.random_sex = random.choice(('F', 'M'))
 35        self.random_factory_person = src.person.factory(
 36            first_name=self.random_first_name,
 37            last_name=self.random_last_name,
 38            sex=self.random_sex,
 39            year_of_birth=self.random_year_of_birth,
 40        )
 41        self.random_classy_person = src.person.Person(
 42            first_name=self.random_first_name,
 43            last_name=self.random_last_name,
 44            sex=self.random_sex,
 45            year_of_birth=self.random_year_of_birth,
 46        )
 47
 48    def test_takes_keyword_arguments(self):
 49        self.assertEqual(
 50            self.random_factory_person,
 51            dict(
 52                first_name=self.random_first_name,
 53                last_name=self.random_last_name,
 54                sex=self.random_sex,
 55                age=self.original_age,
 56            )
 57        )
 58
 59    def test_function_w_default_keyword_arguments(self):
 60        self.assertEqual(
 61            src.person.factory(self.random_first_name),
 62            dict(
 63                first_name=self.random_first_name,
 64                last_name='doe',
 65                sex='M',
 66                age=0,
 67            )
 68        )
 69
 70    def test_factory_person_introduction(self):
 71        self.assertEqual(
 72            src.person.introduce(self.random_factory_person),
 73            (
 74                f'Hi, my name is {self.random_first_name} '
 75                f'{self.random_last_name} '
 76                f'and I am {self.original_age}'
 77            )
 78        )
 79
 80    def test_classy_person_introduction(self):
 81        self.assertEqual(
 82            self.random_classy_person.introduce(),
 83            (
 84                f'Hi, my name is {self.random_first_name} '
 85                f'{self.random_last_name} '
 86                f'and I am {self.original_age}'
 87            )
 88        )
 89
 90    def test_update_factory_person_year_of_birth(self):
 91        self.assertEqual(
 92            self.random_factory_person.get('age'),
 93            self.original_age
 94        )
 95
 96        with self.assertRaises(KeyError):
 97            self.random_factory_person['year_of_birth']
 98        self.assertEqual(
 99            self.random_factory_person.setdefault(
100                'year_of_birth', self.random_new_year_of_birth
101            ),
102            self.random_new_year_of_birth
103        )
104        self.assertEqual(
105            self.random_factory_person.get('age'),
106            self.original_age
107        )
108
109        self.assertEqual(
110            src.person.update_year_of_birth(
111                self.random_factory_person,
112                self.random_new_year_of_birth
113            ),
114            dict(
115                first_name=self.random_factory_person.get('first_name'),
116                last_name=self.random_factory_person.get('last_name'),
117                sex=self.random_factory_person.get('sex'),
118                age=self.new_age,
119            )
120        )
121
122    def test_update_classy_person_year_of_birth(self):
123        self.assertEqual(
124            self.random_classy_person.get_age(),
125            self.original_age
126        )
127
128        self.random_classy_person.year_of_birth = self.random_new_year_of_birth
129        self.assertEqual(
130            self.random_classy_person.get_age(),
131            self.new_age
132        )
133
134    def test_attributes_and_methods_of_classes(self):
135        self.assertEqual(
136            dir(src.person.Person),
137            [
138                '__class__',
139                '__delattr__',
140                '__dict__',
141                '__dir__',
142                '__doc__',
143                '__eq__',
144                '__firstlineno__',
145                '__format__',
146                '__ge__',
147                '__getattribute__',
148                '__getstate__',
149                '__gt__',
150                '__hash__',
151                '__init__',
152                '__init_subclass__',
153                '__le__',
154                '__lt__',
155                '__module__',
156                '__ne__',
157                '__new__',
158                '__reduce__',
159                '__reduce_ex__',
160                '__repr__',
161                '__setattr__',
162                '__sizeof__',
163                '__static_attributes__',
164                '__str__',
165                '__subclasshook__',
166                '__weakref__',
167                'get_age',
168                'introduce'
169            ]
170        )
171
172
173# Exceptions Encountered
174# AssertionError
175# NameError
176# AttributeError
177# TypeError
178# SyntaxError
179# KeyError

solutions

the solutions in person/src/person.py from classes

 1import datetime
 2
 3
 4def this_year():
 5    return datetime.datetime.today().year
 6
 7
 8def factory(
 9        first_name, last_name='doe',
10        sex='M', year_of_birth=this_year(),
11    ):
12    return {
13        'first_name': first_name,
14        'last_name': last_name,
15        'sex': sex,
16        'age': this_year() - year_of_birth,
17    }
18
19
20def introduce(person):
21    return (
22        f'Hi, my name is {person.get("first_name")} '
23        f'{person.get("last_name")} '
24        f'and I am {person.get("age")}'
25    )
26
27
28def update_year_of_birth(person, new_year_of_birth):
29    return factory(
30        first_name=person.get('first_name'),
31        last_name=person.get('last_name'),
32        sex=person.get('sex'),
33        year_of_birth=new_year_of_birth,
34    )
35
36
37class Person(object):
38
39    def __init__(
40        self, first_name, last_name='doe',
41        sex='M', year_of_birth=this_year(),
42    ):
43        self.first_name = first_name
44        self.last_name = last_name
45        self.random_year_of_birth = year_of_birth
46        return None
47
48    def get_age(self):
49        return this_year() - self.random_year_of_birth
50
51    def introduce(self):
52        return (
53            f'Hi, my name is {self.first_name} '
54            f'{self.last_name} '
55            f'and I am {self.get_age()}'
56        )