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 )