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 for false_item in (
10 False,
11 None, bool(None),
12 0, 0.0, bool(0), bool(0.0),
13 str(), bool(str()),
14 tuple(), bool(tuple()),
15 list(), bool(list()),
16 set(), bool(set()),
17 dict(), bool(dict()),
18 ):
19 with self.subTest(item=false_item):
20 self.assertFalse(false_item)
21
22 def test_what_is_true(self):
23 self.assertIsInstance(True, (bool, int))
24 self.assertNotIsInstance(True, float)
25
26 for true_item in (
27 True,
28 -1, bool(-1), 1, bool(1),
29 -0.1, bool(-0.1), 0.1, bool(0.1),
30 "text", bool("text"),
31 ((1, 2, 3, 'n')), bool((1, 2, 3, 'n')),
32 [1, 2, 3, 'n'], bool([1, 2, 3, 'n']),
33 {1, 2, 3, 'n'}, bool({1, 2, 3, 'n'}),
34 {'key': 'value'}, bool({'key': 'value'}),
35 ):
36 with self.subTest(item=true_item):
37 self.assertTrue(true_item)
38
39 def test_the_value_of_false(self):
40 self.assertEqual(False+1, 1)
41 self.assertEqual(False-1, -1)
42 self.assertEqual(False*1, 0)
43 with self.assertRaises(ZeroDivisionError):
44 1 / False
45
46 def test_the_value_of_true(self):
47 self.assertEqual(True+1, 2)
48 self.assertEqual(True-1, 0)
49 self.assertEqual(True*1, 1)
50 self.assertEqual(True/1, 1)
51
52
53# NOTES
54# a dictionary with things is True
55# a set with things is True
56# a list with things is True
57# a tuple with things is True
58# a string with things is True
59# positive and negative numbers are True
60# True is True
61# True is not false
62# True is a boolean
63# True is an integer
64# True is not a float
65# True is 1
66# the empty dictionary is False
67# the empty set is False
68# the empty list is False
69# the empty tuple is False
70# the empty string is False
71# 0 is False
72# None is False
73# False is False
74# False is not true
75# False is a boolean
76# False is an integer
77# False is not a float
78# False is 0
79
80
81# Exceptions seen
82# AssertionError