data structures: list comprehensions: tests and solutions
list comprehensions tests
the code from list_comprehensions/tests/test_list_comprehensions.py from list comprehensions
1import random
2import src.list_comprehensions
3import unittest
4
5
6def process(number):
7 return number ** 2
8
9
10def condition(number):
11 return number % 2 == 0
12
13
14class TestListComprehensions(unittest.TestCase):
15
16 def setUp(self):
17 self.a_list = []
18 self.iterable = range(0, random.randint(2, 1000))
19
20 def test_making_a_list_w_a_for_loop(self):
21 for number in self.iterable:
22 self.a_list.append(number)
23
24 self.assertEqual(self.a_list, list(self.iterable))
25 self.assertEqual(
26 src.list_comprehensions.a_for_loop(self.iterable),
27 self.a_list
28 )
29
30 def test_making_a_list_w_extend(self):
31 self.assertIsNone(self.a_list.extend(self.iterable))
32 self.assertEqual(self.a_list, list(self.iterable))
33
34 def test_making_a_list_w_a_list_comprehension(self):
35 self.assertEqual(
36 list(self.iterable),
37 [item for item in self.iterable]
38 )
39 self.assertEqual(
40 src.list_comprehensions.a_list_comprehension(self.iterable),
41 [item for item in self.iterable]
42 )
43
44 def test_making_a_list_w_conditions(self):
45 even_numbers, odd_numbers = [], []
46 for item in self.iterable:
47 if condition(item):
48 even_numbers.append(item)
49 else:
50 odd_numbers.append(item)
51
52 self.assertEqual(
53 even_numbers,
54 [item for item in self.iterable if condition(item)]
55 )
56 self.assertEqual(
57 src.list_comprehensions.get_even_numbers(self.iterable),
58 [item for item in self.iterable if condition(item)]
59 )
60 self.assertEqual(
61 odd_numbers,
62 [item for item in self.iterable if not condition(item)]
63 )
64 self.assertEqual(
65 src.list_comprehensions.get_odd_numbers(self.iterable),
66 [item for item in self.iterable if not condition(item)]
67 )
68
69 def test_making_a_list_w_processes(self):
70 square_club = []
71 for item in self.iterable:
72 square_club.append(process(item))
73
74 self.assertEqual(
75 square_club,
76 [process(item) for item in self.iterable]
77 )
78 self.assertEqual(
79 src.list_comprehensions.square(self.iterable),
80 [process(item) for item in self.iterable]
81 )
82
83 def test_making_a_list_w_processes_and_conditions(self):
84 even_squares, odd_squares = [], []
85 for item in self.iterable:
86 item = process(item)
87 if condition(item):
88 even_squares.append(item)
89 else:
90 odd_squares.append(item)
91
92 self.assertEqual(
93 even_squares,
94 [process(item) for item in self.iterable if condition(item)]
95 )
96 self.assertEqual(
97 odd_squares,
98 [process(item) for item in self.iterable if not condition(item)]
99 )
100
101
102# Exceptions seen
103# AssertionError
104# NameError
105# AttributeError
106# TypeError
how to make a calculator 6: tests
the code from calculator/tests/test_calculator.py from how to make a calculator 6
1import random
2import src.calculator
3import unittest
4
5
6def a_random_number():
7 return random.triangular(-1000.0, 1000.0)
8
9
10class TestCalculator(unittest.TestCase):
11
12 def setUp(self):
13 self.random_first_number = a_random_number()
14 self.random_second_number = a_random_number()
15
16 def test_addition(self):
17 self.assertEqual(
18 src.calculator.add(
19 self.random_first_number,
20 self.random_second_number
21 ),
22 self.random_first_number+self.random_second_number
23 )
24
25 def test_subtraction(self):
26 self.assertEqual(
27 src.calculator.subtract(
28 self.random_first_number,
29 self.random_second_number
30 ),
31 self.random_first_number-self.random_second_number
32 )
33
34 def test_multiplication(self):
35 self.assertEqual(
36 src.calculator.multiply(
37 self.random_first_number,
38 self.random_second_number
39 ),
40 self.random_first_number*self.random_second_number
41 )
42
43 def test_division(self):
44 try:
45 self.assertEqual(
46 src.calculator.divide(
47 self.random_first_number,
48 self.random_second_number
49 ),
50 self.random_first_number/self.random_second_number
51 )
52 except ZeroDivisionError:
53 self.assertEqual(
54 src.calculator.divide(self.random_first_number, 0),
55 'brmph?! I cannot divide by 0. Try again...'
56 )
57
58 def test_calculator_w_list_items(self):
59 two_numbers = [
60 self.random_first_number,
61 self.random_second_number
62 ]
63
64 self.assertEqual(
65 src.calculator.add(
66 two_numbers[0],
67 two_numbers[1]
68 ),
69 self.random_first_number+self.random_second_number
70 )
71 self.assertEqual(
72 src.calculator.divide(
73 two_numbers[-2],
74 two_numbers[-1]
75 ),
76 self.random_first_number/self.random_second_number
77 )
78 self.assertEqual(
79 src.calculator.multiply(
80 two_numbers[1],
81 two_numbers[-1]
82 ),
83 self.random_second_number*self.random_second_number
84 )
85 self.assertEqual(
86 src.calculator.subtract(
87 two_numbers[-2],
88 two_numbers[0]
89 ),
90 self.random_first_number-self.random_first_number
91 )
92 self.assertEqual(
93 src.calculator.add(*two_numbers),
94 self.random_first_number+self.random_second_number
95 )
96 self.assertEqual(
97 src.calculator.divide(*two_numbers),
98 self.random_first_number/self.random_second_number
99 )
100 self.assertEqual(
101 src.calculator.multiply(*two_numbers),
102 self.random_first_number*self.random_second_number
103 )
104 self.assertEqual(
105 src.calculator.subtract(*two_numbers),
106 self.random_first_number-self.random_second_number
107 )
108
109 def test_calculator_raises_type_error_when_given_more_than_two_inputs(self):
110 not_two_numbers = [0, 1, 2]
111
112 with self.assertRaises(TypeError):
113 src.calculator.add(*not_two_numbers)
114 with self.assertRaises(TypeError):
115 src.calculator.divide(*not_two_numbers)
116 with self.assertRaises(TypeError):
117 src.calculator.multiply(*not_two_numbers)
118 with self.assertRaises(TypeError):
119 src.calculator.subtract(*not_two_numbers)
120
121 def test_calculator_sends_message_when_input_is_not_a_number(self):
122 error_message = 'brmph?! Numbers only. Try again...'
123
124 [
125 self.assertEqual(
126 src.calculator.add(data_type, a_random_number()),
127 error_message
128 ) for data_type in (
129 None,
130 True, False,
131 str(), 'text',
132 tuple(), (0, 1, 2, 'n'),
133 list(), [0, 1, 2, 'n'],
134 set(), {0, 1, 2, 'n'},
135 dict(), {'key': 'value'},
136 )
137 ]
138
139 for data_type in (
140 None,
141 True, False,
142 str(), 'text',
143 tuple(), (0, 1, 2, 'n'),
144 list(), [0, 1, 2, 'n'],
145 set(), {0, 1, 2, 'n'},
146 dict(), {'key': 'value'},
147 ):
148 with self.subTest(data_type=data_type):
149 self.assertEqual(
150 src.calculator.add(
151 data_type, a_random_number()
152 ),
153 error_message
154 )
155 self.assertEqual(
156 src.calculator.divide(
157 data_type, a_random_number()
158 ),
159 error_message
160 )
161 self.assertEqual(
162 src.calculator.multiply(
163 data_type, a_random_number()
164 ),
165 error_message
166 )
167 self.assertEqual(
168 src.calculator.subtract(
169 data_type, a_random_number()
170 ),
171 error_message
172 )
173
174
175# Exceptions seen
176# AssertionError
177# NameError
178# AttributeError
179# TypeError
how to make a calculator 6: solutions
the solutions in calculator/src/calculator.py from how to make a calculator 6
1def numbers_only(function):
2 def decorator(first_input, second_input):
3 bad_data_types = (str, list, bool)
4 error_message = 'brmph?! Numbers only. Try again...'
5
6 for value in (first_input, second_input):
7 if (
8 value is None
9 or
10 isinstance(value, bad_data_types)
11 ):
12 return error_message
13
14 try:
15 return function(first_input, second_input)
16 except TypeError:
17 return error_message
18 return decorator
19
20
21@numbers_only
22def subtract(first_input, second_input):
23 return first_input - second_input
24
25
26@numbers_only
27def multiply(first_input, second_input):
28 return first_input * second_input
29
30
31@numbers_only
32def divide(first_input, second_input):
33 try:
34 return first_input / second_input
35 except ZeroDivisionError:
36 return 'brmph?! I cannot divide by 0. Try again...'
37
38
39@numbers_only
40def add(first_input, second_input):
41 return first_input + second_input
booleans 3: tests
the tests in booleans/tests/test_booleans.py from booleans 3: values of True and False
1import unittest
2
3
4class TestBooleans(unittest.TestCase):
5
6 def test_what_is_false(self):
7 self.assertIsInstance(False, (bool, int))
8 self.assertNotIsInstance(False, float)
9
10 for false_item in (
11 False,
12 None, bool(None),
13 0, 0.0, bool(0), bool(0.0),
14 str(), bool(str()),
15 tuple(), bool(tuple()),
16 list(), bool(list()),
17 set(), bool(set()),
18 dict(), bool(dict()),
19 ):
20 with self.subTest(item=false_item):
21 self.assertFalse(false_item)
22
23 def test_what_is_true(self):
24 self.assertIsInstance(True, (bool, int))
25 self.assertNotIsInstance(True, float)
26
27 for true_item in (
28 True,
29 -1, bool(-1), 1, bool(1),
30 -0.1, bool(-0.1), 0.1, bool(0.1),
31 "text", bool("text"),
32 ((1, 2, 3, 'n')), bool((1, 2, 3, 'n')),
33 [1, 2, 3, 'n'], bool([1, 2, 3, 'n']),
34 {1, 2, 3, 'n'}, bool({1, 2, 3, 'n'}),
35 {'key': 'value'}, bool({'key': 'value'}),
36 ):
37 with self.subTest(item=true_item):
38 self.assertTrue(true_item)
39
40 def test_the_value_of_false(self):
41 self.assertEqual(False+1, 1)
42 self.assertEqual(False-1, -1)
43 self.assertEqual(False*1, 0)
44 with self.assertRaises(ZeroDivisionError):
45 1 / False
46
47 def test_the_value_of_true(self):
48 self.assertEqual(True+1, 2)
49 self.assertEqual(True-1, 0)
50 self.assertEqual(True*1, 1)
51 self.assertEqual(True/1, 1)
52
53
54# NOTES
55# a dictionary with things is True
56# a set with things is True
57# a list with things is True
58# a tuple with things is True
59# a string with things is True
60# positive and negative numbers are True
61# True is True
62# True is not false
63# True is a boolean
64# True is an integer
65# True is not a float
66# True is 1
67# the empty dictionary is False
68# the empty set is False
69# the empty list is False
70# the empty tuple is False
71# the empty string is False
72# 0 is False
73# None is False
74# False is False
75# False is not true
76# False is a boolean
77# False is an integer
78# False is not a float
79# False is 0
80
81
82# Exceptions seen
83# AssertionError