|
1 | 1 | from __future__ import division
|
| 2 | +import math |
2 | 3 |
|
3 | 4 | import unittest
|
4 | 5 |
|
5 |
| -import math |
6 |
| - |
7 | 6 | from complex_numbers import ComplexNumber
|
8 | 7 |
|
9 |
| - |
10 | 8 | # Tests adapted from `problem-specifications//canonical-data.json` @ v1.3.0
|
11 | 9 |
|
| 10 | + |
12 | 11 | class ComplexNumbersTest(unittest.TestCase):
|
13 | 12 |
|
| 13 | + # Real part |
| 14 | + |
14 | 15 | def test_real_part_of_a_purely_real_number(self):
|
15 |
| - input_number = ComplexNumber(1, 0) |
16 |
| - self.assertEqual(input_number.real, 1) |
| 16 | + self.assertEqual(ComplexNumber(1, 0).real, 1) |
17 | 17 |
|
18 | 18 | def test_real_part_of_a_purely_imaginary_number(self):
|
19 |
| - input_number = ComplexNumber(0, 1) |
20 |
| - self.assertEqual(input_number.real, 0) |
| 19 | + self.assertEqual(ComplexNumber(0, 1).real, 0) |
21 | 20 |
|
22 | 21 | def test_real_part_of_a_number_with_real_and_imaginary_part(self):
|
23 |
| - input_number = ComplexNumber(1, 2) |
24 |
| - self.assertEqual(input_number.real, 1) |
| 22 | + self.assertEqual(ComplexNumber(1, 2).real, 1) |
| 23 | + |
| 24 | + # Imaginary part |
25 | 25 |
|
26 | 26 | def test_imaginary_part_of_a_purely_real_number(self):
|
27 |
| - input_number = ComplexNumber(1, 0) |
28 |
| - self.assertEqual(input_number.imaginary, 0) |
| 27 | + self.assertEqual(ComplexNumber(1, 0).imaginary, 0) |
29 | 28 |
|
30 | 29 | def test_imaginary_part_of_a_purely_imaginary_number(self):
|
31 |
| - input_number = ComplexNumber(0, 1) |
32 |
| - self.assertEqual(input_number.imaginary, 1) |
| 30 | + self.assertEqual(ComplexNumber(0, 1).imaginary, 1) |
33 | 31 |
|
34 | 32 | def test_imaginary_part_of_a_number_with_real_and_imaginary_part(self):
|
35 |
| - input_number = ComplexNumber(1, 2) |
36 |
| - self.assertEqual(input_number.imaginary, 2) |
| 33 | + self.assertEqual(ComplexNumber(1, 2).imaginary, 2) |
37 | 34 |
|
38 |
| - def test_equality_of_complex_numbers(self): |
39 |
| - self.assertEqual(ComplexNumber(1, 2), ComplexNumber(1, 2)) |
| 35 | + def test_imaginary_unit(self): |
| 36 | + self.assertEqual( |
| 37 | + ComplexNumber(0, 1) * ComplexNumber(0, 1), ComplexNumber(-1, 0) |
| 38 | + ) |
40 | 39 |
|
41 |
| - def test_inequality_of_complex_numbers(self): |
42 |
| - number = ComplexNumber(1, 2) |
43 |
| - number_different_real_part = ComplexNumber(2, 2) |
44 |
| - number_different_imaginary_part = ComplexNumber(1, 1) |
45 |
| - self.assertNotEqual(number, number_different_real_part) |
46 |
| - self.assertNotEqual(number, number_different_imaginary_part) |
| 40 | + # Arithmetic |
47 | 41 |
|
48 |
| - def test_imaginary_unit(self): |
49 |
| - first_input = ComplexNumber(0, 1) |
50 |
| - second_input = ComplexNumber(0, 1) |
51 |
| - expected = ComplexNumber(-1, 0) |
52 |
| - self.assertEqual(first_input * second_input, expected) |
| 42 | + # Addition |
53 | 43 |
|
54 | 44 | def test_add_purely_real_numbers(self):
|
55 |
| - first_input = ComplexNumber(1, 0) |
56 |
| - second_input = ComplexNumber(2, 0) |
57 |
| - expected = ComplexNumber(3, 0) |
58 |
| - self.assertEqual(first_input + second_input, expected) |
| 45 | + self.assertEqual(ComplexNumber(1, 0) + ComplexNumber(2, 0), ComplexNumber(3, 0)) |
59 | 46 |
|
60 | 47 | def test_add_purely_imaginary_numbers(self):
|
61 |
| - first_input = ComplexNumber(0, 1) |
62 |
| - second_input = ComplexNumber(0, 2) |
63 |
| - expected = ComplexNumber(0, 3) |
64 |
| - self.assertEqual(first_input + second_input, expected) |
| 48 | + self.assertEqual(ComplexNumber(0, 1) + ComplexNumber(0, 2), ComplexNumber(0, 3)) |
65 | 49 |
|
66 | 50 | def test_add_numbers_with_real_and_imaginary_part(self):
|
67 |
| - first_input = ComplexNumber(1, 2) |
68 |
| - second_input = ComplexNumber(3, 4) |
69 |
| - expected = ComplexNumber(4, 6) |
70 |
| - self.assertEqual(first_input + second_input, expected) |
| 51 | + self.assertEqual(ComplexNumber(1, 2) + ComplexNumber(3, 4), ComplexNumber(4, 6)) |
| 52 | + |
| 53 | + # Subtraction |
71 | 54 |
|
72 | 55 | def test_subtract_purely_real_numbers(self):
|
73 |
| - first_input = ComplexNumber(1, 0) |
74 |
| - second_input = ComplexNumber(2, 0) |
75 |
| - expected = ComplexNumber(-1, 0) |
76 |
| - self.assertEqual(first_input - second_input, expected) |
| 56 | + self.assertEqual( |
| 57 | + ComplexNumber(1, 0) - ComplexNumber(2, 0), ComplexNumber(-1, 0) |
| 58 | + ) |
77 | 59 |
|
78 | 60 | def test_subtract_purely_imaginary_numbers(self):
|
79 |
| - first_input = ComplexNumber(0, 1) |
80 |
| - second_input = ComplexNumber(0, 2) |
81 |
| - expected = ComplexNumber(0, -1) |
82 |
| - self.assertEqual(first_input - second_input, expected) |
| 61 | + self.assertEqual( |
| 62 | + ComplexNumber(0, 1) - ComplexNumber(0, 2), ComplexNumber(0, -1) |
| 63 | + ) |
83 | 64 |
|
84 | 65 | def test_subtract_numbers_with_real_and_imaginary_part(self):
|
85 |
| - first_input = ComplexNumber(1, 2) |
86 |
| - second_input = ComplexNumber(3, 4) |
87 |
| - expected = ComplexNumber(-2, -2) |
88 |
| - self.assertEqual(first_input - second_input, expected) |
| 66 | + self.assertEqual( |
| 67 | + ComplexNumber(1, 2) - ComplexNumber(3, 4), ComplexNumber(-2, -2) |
| 68 | + ) |
| 69 | + |
| 70 | + # Multiplication |
89 | 71 |
|
90 | 72 | def test_multiply_purely_real_numbers(self):
|
91 |
| - first_input = ComplexNumber(1, 0) |
92 |
| - second_input = ComplexNumber(2, 0) |
93 |
| - expected = ComplexNumber(2, 0) |
94 |
| - self.assertEqual(first_input * second_input, expected) |
| 73 | + self.assertEqual(ComplexNumber(1, 0) * ComplexNumber(2, 0), ComplexNumber(2, 0)) |
95 | 74 |
|
96 | 75 | def test_multiply_purely_imaginary_numbers(self):
|
97 |
| - first_input = ComplexNumber(0, 1) |
98 |
| - second_input = ComplexNumber(0, 2) |
99 |
| - expected = ComplexNumber(-2, 0) |
100 |
| - self.assertEqual(first_input * second_input, expected) |
| 76 | + self.assertEqual( |
| 77 | + ComplexNumber(0, 1) * ComplexNumber(0, 2), ComplexNumber(-2, 0) |
| 78 | + ) |
101 | 79 |
|
102 | 80 | def test_multiply_numbers_with_real_and_imaginary_part(self):
|
103 |
| - first_input = ComplexNumber(1, 2) |
104 |
| - second_input = ComplexNumber(3, 4) |
105 |
| - expected = ComplexNumber(-5, 10) |
106 |
| - self.assertEqual(first_input * second_input, expected) |
| 81 | + self.assertEqual( |
| 82 | + ComplexNumber(1, 2) * ComplexNumber(3, 4), ComplexNumber(-5, 10) |
| 83 | + ) |
| 84 | + |
| 85 | + # Division |
107 | 86 |
|
108 | 87 | def test_divide_purely_real_numbers(self):
|
109 |
| - input_number = ComplexNumber(1.0, 0.0) |
110 |
| - expected = ComplexNumber(0.5, 0.0) |
111 |
| - divider = ComplexNumber(2.0, 0.0) |
112 |
| - self.assertEqual(input_number / divider, expected) |
| 88 | + self.assertAlmostEqual( |
| 89 | + ComplexNumber(1, 0) / ComplexNumber(2, 0), ComplexNumber(0.5, 0) |
| 90 | + ) |
113 | 91 |
|
114 | 92 | def test_divide_purely_imaginary_numbers(self):
|
115 |
| - input_number = ComplexNumber(0, 1) |
116 |
| - expected = ComplexNumber(0.5, 0) |
117 |
| - divider = ComplexNumber(0, 2) |
118 |
| - self.assertEqual(input_number / divider, expected) |
| 93 | + self.assertAlmostEqual( |
| 94 | + ComplexNumber(0, 1) / ComplexNumber(0, 2), ComplexNumber(0.5, 0) |
| 95 | + ) |
119 | 96 |
|
120 | 97 | def test_divide_numbers_with_real_and_imaginary_part(self):
|
121 |
| - input_number = ComplexNumber(1, 2) |
122 |
| - expected = ComplexNumber(0.44, 0.08) |
123 |
| - divider = ComplexNumber(3, 4) |
124 |
| - self.assertEqual(input_number / divider, expected) |
| 98 | + self.assertAlmostEqual( |
| 99 | + ComplexNumber(1, 2) / ComplexNumber(3, 4), ComplexNumber(0.44, 0.08) |
| 100 | + ) |
| 101 | + |
| 102 | + # Absolute value |
125 | 103 |
|
126 | 104 | def test_absolute_value_of_a_positive_purely_real_number(self):
|
127 | 105 | self.assertEqual(abs(ComplexNumber(5, 0)), 5)
|
128 | 106 |
|
129 | 107 | def test_absolute_value_of_a_negative_purely_real_number(self):
|
130 | 108 | self.assertEqual(abs(ComplexNumber(-5, 0)), 5)
|
131 | 109 |
|
132 |
| - def test_absolute_value_of_imaginary_number_positive_imaginary_part(self): |
| 110 | + def test_absolute_value_of_a_purely_imaginary_number_with_positive_imaginary_part( |
| 111 | + self |
| 112 | + ): |
133 | 113 | self.assertEqual(abs(ComplexNumber(0, 5)), 5)
|
134 | 114 |
|
135 |
| - def test_absolute_value_of_imaginary_number_negative_imaginary_part(self): |
| 115 | + def test_absolute_value_of_a_purely_imaginary_number_with_negative_imaginary_part( |
| 116 | + self |
| 117 | + ): |
136 | 118 | self.assertEqual(abs(ComplexNumber(0, -5)), 5)
|
137 | 119 |
|
138 | 120 | def test_absolute_value_of_a_number_with_real_and_imaginary_part(self):
|
139 | 121 | self.assertEqual(abs(ComplexNumber(3, 4)), 5)
|
140 | 122 |
|
| 123 | + # Complex conjugate |
| 124 | + |
141 | 125 | def test_conjugate_a_purely_real_number(self):
|
142 |
| - input_number = ComplexNumber(5, 0) |
143 |
| - expected = ComplexNumber(5, 0) |
144 |
| - self.assertEqual(input_number.conjugate().real, expected.real) |
145 |
| - self.assertEqual(input_number.conjugate().imaginary, |
146 |
| - expected.imaginary) |
| 126 | + self.assertEqual(ComplexNumber(5, 0).conjugate(), ComplexNumber(5, 0)) |
147 | 127 |
|
148 | 128 | def test_conjugate_a_purely_imaginary_number(self):
|
149 |
| - input_number = ComplexNumber(0, 5) |
150 |
| - expected = ComplexNumber(0, -5) |
151 |
| - self.assertEqual(input_number.conjugate().real, expected.real) |
152 |
| - self.assertEqual(input_number.conjugate().imaginary, |
153 |
| - expected.imaginary) |
| 129 | + self.assertEqual(ComplexNumber(0, 5).conjugate(), ComplexNumber(0, -5)) |
154 | 130 |
|
155 | 131 | def test_conjugate_a_number_with_real_and_imaginary_part(self):
|
156 |
| - input_number = ComplexNumber(1, 1) |
157 |
| - expected = ComplexNumber(1, -1) |
158 |
| - self.assertEqual(input_number.conjugate().real, expected.real) |
159 |
| - self.assertEqual(input_number.conjugate().imaginary, |
160 |
| - expected.imaginary) |
161 |
| - |
162 |
| - def test_eulers_identity_formula(self): |
163 |
| - input_number = ComplexNumber(0, math.pi) |
164 |
| - expected = ComplexNumber(-1, 0) |
165 |
| - actual = input_number.exp() |
166 |
| - self.assertAlmostEqual(actual.real, expected.real) |
167 |
| - self.assertAlmostEqual(actual.imaginary, expected.imaginary) |
| 132 | + self.assertEqual(ComplexNumber(1, 1).conjugate(), ComplexNumber(1, -1)) |
| 133 | + |
| 134 | + # Complex exponential function |
| 135 | + |
| 136 | + def test_euler_s_identity_formula(self): |
| 137 | + self.assertAlmostEqual(ComplexNumber(0, math.pi).exp(), ComplexNumber(-1, 0)) |
168 | 138 |
|
169 | 139 | def test_exponential_of_0(self):
|
170 |
| - input_number = ComplexNumber(0, 0) |
171 |
| - expected = ComplexNumber(1, 0) |
172 |
| - actual = input_number.exp() |
173 |
| - self.assertAlmostEqual(actual.real, expected.real) |
174 |
| - self.assertAlmostEqual(actual.imaginary, expected.imaginary) |
| 140 | + self.assertAlmostEqual(ComplexNumber(0, 0).exp(), ComplexNumber(1, 0)) |
175 | 141 |
|
176 | 142 | def test_exponential_of_a_purely_real_number(self):
|
177 |
| - input_number = ComplexNumber(1, 0) |
178 |
| - expected = ComplexNumber(math.e, 0) |
179 |
| - actual = input_number.exp() |
180 |
| - self.assertAlmostEqual(actual.real, expected.real) |
181 |
| - self.assertAlmostEqual(actual.imaginary, expected.imaginary) |
| 143 | + self.assertAlmostEqual(ComplexNumber(1, 0).exp(), ComplexNumber(math.e, 0)) |
182 | 144 |
|
183 | 145 | def test_exponential_of_a_number_with_real_and_imaginary_part(self):
|
184 |
| - input_number = ComplexNumber(math.log(2), math.pi) |
185 |
| - expected = ComplexNumber(-2, 0) |
186 |
| - actual = input_number.exp() |
187 |
| - self.assertAlmostEqual(actual.real, expected.real) |
188 |
| - self.assertAlmostEqual(actual.imaginary, expected.imaginary) |
| 146 | + self.assertAlmostEqual( |
| 147 | + ComplexNumber(math.log(2), math.pi).exp(), ComplexNumber(-2, 0) |
| 148 | + ) |
| 149 | + |
| 150 | + # Additional tests for this track |
| 151 | + |
| 152 | + def test_equality_of_complex_numbers(self): |
| 153 | + self.assertEqual(ComplexNumber(1, 2), ComplexNumber(1, 2)) |
| 154 | + |
| 155 | + def test_inequality_of_real_part(self): |
| 156 | + self.assertNotEqual(ComplexNumber(1, 2), ComplexNumber(2, 2)) |
| 157 | + |
| 158 | + def test_inequality_of_imaginary_part(self): |
| 159 | + self.assertNotEqual(ComplexNumber(1, 2), ComplexNumber(1, 1)) |
189 | 160 |
|
190 | 161 |
|
191 |
| -if __name__ == '__main__': |
| 162 | +if __name__ == "__main__": |
192 | 163 | unittest.main()
|
0 commit comments