Skip to content

Commit 3f0caf8

Browse files
dvermdcmccandless
authored andcommitted
complex-numbers: add test template (#2140)
* complex-numbers: add test template Resolves #1937 * complex-numbers: remove commented code Resolves #1937 * refactor for readability
1 parent d30ff12 commit 3f0caf8

File tree

3 files changed

+180
-116
lines changed

3 files changed

+180
-116
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{
2+
"cases": [
3+
{
4+
"description": "equality of complex numbers",
5+
"property": "eq",
6+
"input": {
7+
"z1": [1, 2],
8+
"z2": [1, 2]
9+
},
10+
"expected": true
11+
},
12+
{
13+
"description": "inequality of real part",
14+
"property": "eq",
15+
"input": {
16+
"z1": [1, 2],
17+
"z2": [2, 2]
18+
},
19+
"expected": false
20+
},
21+
{
22+
"description": "inequality of imaginary part",
23+
"property": "eq",
24+
"input": {
25+
"z1": [1, 2],
26+
"z2": [1, 1]
27+
},
28+
"expected": false
29+
}
30+
]
31+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
from __future__ import division
2+
import math
3+
4+
{% extends "master_template.j2" -%}
5+
{%- set imports = ["ComplexNumber"] -%}
6+
7+
{%- macro translate_math(item) -%}
8+
{{ item | replace("pi", "math.pi") | replace("e", "math.e") | replace("ln", "math.log") }}
9+
{%- endmacro %}
10+
11+
{%- macro formatValue(val) -%}
12+
{% if val is iterable and val is not string -%}
13+
ComplexNumber({% for part in val %}{{ translate_math(part) }},{% endfor %})
14+
{%- else -%}
15+
{{ translate_math(val) }}
16+
{%- endif -%}
17+
{%- endmacro -%}
18+
19+
{%- macro smartAssert(case) -%}
20+
self.assert
21+
{%- if case["property"] in ["exp", "div"] -%}Almost
22+
{%- elif case["property"] == "eq" and not case["expected"] -%}Not
23+
{%- endif -%}Equal
24+
{%- endmacro -%}
25+
26+
{%- macro operator(prop) -%}
27+
{% if prop == "add" -%}+
28+
{%- elif prop == "sub" -%}-
29+
{%- elif prop == "mul" -%}*
30+
{%- elif prop == "div" -%}/
31+
{%- endif -%}
32+
{%- endmacro -%}
33+
34+
{% macro test_case(case) -%}
35+
def test_{{ case["description"] | to_snake }}(self):
36+
{% set input = case["input"] -%}
37+
{%- set prop = case["property"] -%}
38+
{%- set is_callable = prop not in ["real", "imaginary"] -%}
39+
{%- set is_builtin = prop in ["abs"] -%}
40+
{%- set expected = formatValue(case["expected"]) -%}
41+
{%- if input|length == 1 -%}
42+
{%- set z = formatValue(input["z"]) -%}
43+
{% if is_builtin -%}
44+
{%- set actual = prop ~ "(" ~ z ~ ")" -%}
45+
{%- else -%}
46+
{%- set actual = z ~ "." ~ prop -%}
47+
{%- if is_callable -%}
48+
{%- set actual = actual ~ "()" -%}
49+
{%- endif -%}
50+
{%- endif -%}
51+
{%- else -%}
52+
{%- set z1 = formatValue(input["z1"]) -%}
53+
{%- set z2 = formatValue(input["z2"]) -%}
54+
{%- if prop == "eq" -%}
55+
{%- set actual = z1 -%}
56+
{%- set expected = z2 -%}
57+
{%- else -%}
58+
{%- set actual = z1 ~ operator(prop) ~ z2 -%}
59+
{% endif -%}
60+
{%- endif -%}
61+
{{ smartAssert(case) }}({{ actual }}, {{expected}})
62+
{%- endmacro %}
Lines changed: 87 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,192 +1,163 @@
11
from __future__ import division
2+
import math
23

34
import unittest
45

5-
import math
6-
76
from complex_numbers import ComplexNumber
87

9-
108
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.3.0
119

10+
1211
class ComplexNumbersTest(unittest.TestCase):
1312

13+
# Real part
14+
1415
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)
1717

1818
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)
2120

2221
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
2525

2626
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)
2928

3029
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)
3331

3432
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)
3734

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+
)
4039

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
4741

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
5343

5444
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))
5946

6047
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))
6549

6650
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
7154

7255
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+
)
7759

7860
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+
)
8364

8465
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
8971

9072
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))
9574

9675
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+
)
10179

10280
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
10786

10887
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+
)
11391

11492
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+
)
11996

12097
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
125103

126104
def test_absolute_value_of_a_positive_purely_real_number(self):
127105
self.assertEqual(abs(ComplexNumber(5, 0)), 5)
128106

129107
def test_absolute_value_of_a_negative_purely_real_number(self):
130108
self.assertEqual(abs(ComplexNumber(-5, 0)), 5)
131109

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+
):
133113
self.assertEqual(abs(ComplexNumber(0, 5)), 5)
134114

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+
):
136118
self.assertEqual(abs(ComplexNumber(0, -5)), 5)
137119

138120
def test_absolute_value_of_a_number_with_real_and_imaginary_part(self):
139121
self.assertEqual(abs(ComplexNumber(3, 4)), 5)
140122

123+
# Complex conjugate
124+
141125
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))
147127

148128
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))
154130

155131
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))
168138

169139
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))
175141

176142
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))
182144

183145
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))
189160

190161

191-
if __name__ == '__main__':
162+
if __name__ == "__main__":
192163
unittest.main()

0 commit comments

Comments
 (0)