2023-07-15 15:27:31 -07:00
|
|
|
# These tests are auto-generated with test data from:
|
|
|
|
|
# https://github.com/exercism/problem-specifications/tree/main/exercises/complex-numbers/canonical-data.json
|
2023-07-21 16:54:40 -07:00
|
|
|
# File last updated on 2023-07-19
|
2023-07-15 15:27:31 -07:00
|
|
|
|
2023-07-21 16:54:40 -07:00
|
|
|
import math
|
2017-09-08 19:37:28 +03:00
|
|
|
import unittest
|
|
|
|
|
|
2021-01-31 16:49:12 -05:00
|
|
|
from complex_numbers import (
|
|
|
|
|
ComplexNumber,
|
|
|
|
|
)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
|
2017-11-07 17:50:59 +07:00
|
|
|
class ComplexNumbersTest(unittest.TestCase):
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
# Real part
|
|
|
|
|
|
2018-02-20 05:34:20 +08:00
|
|
|
def test_real_part_of_a_purely_real_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 0).real, 1)
|
2018-02-20 05:34:20 +08:00
|
|
|
|
|
|
|
|
def test_real_part_of_a_purely_imaginary_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(0, 1).real, 0)
|
2018-02-20 05:34:20 +08:00
|
|
|
|
|
|
|
|
def test_real_part_of_a_number_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 2).real, 1)
|
|
|
|
|
|
|
|
|
|
# Imaginary part
|
2018-02-20 05:34:20 +08:00
|
|
|
|
|
|
|
|
def test_imaginary_part_of_a_purely_real_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 0).imaginary, 0)
|
2018-02-20 05:34:20 +08:00
|
|
|
|
|
|
|
|
def test_imaginary_part_of_a_purely_imaginary_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(0, 1).imaginary, 1)
|
2018-02-20 05:34:20 +08:00
|
|
|
|
|
|
|
|
def test_imaginary_part_of_a_number_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 2).imaginary, 2)
|
2018-02-20 05:34:20 +08:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
def test_imaginary_unit(self):
|
|
|
|
|
self.assertEqual(
|
|
|
|
|
ComplexNumber(0, 1) * ComplexNumber(0, 1), ComplexNumber(-1, 0)
|
|
|
|
|
)
|
2019-07-04 00:59:14 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
# Arithmetic
|
2019-07-04 00:59:14 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
# Addition
|
2018-02-20 05:34:20 +08:00
|
|
|
|
2017-09-08 19:37:28 +03:00
|
|
|
def test_add_purely_real_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 0) + ComplexNumber(2, 0), ComplexNumber(3, 0))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_add_purely_imaginary_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(0, 1) + ComplexNumber(0, 2), ComplexNumber(0, 3))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_add_numbers_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 2) + ComplexNumber(3, 4), ComplexNumber(4, 6))
|
|
|
|
|
|
|
|
|
|
# Subtraction
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_subtract_purely_real_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(
|
|
|
|
|
ComplexNumber(1, 0) - ComplexNumber(2, 0), ComplexNumber(-1, 0)
|
|
|
|
|
)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2017-11-07 17:50:59 +07:00
|
|
|
def test_subtract_purely_imaginary_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(
|
|
|
|
|
ComplexNumber(0, 1) - ComplexNumber(0, 2), ComplexNumber(0, -1)
|
|
|
|
|
)
|
2017-11-07 17:50:59 +07:00
|
|
|
|
2017-10-24 11:39:37 -05:00
|
|
|
def test_subtract_numbers_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(
|
|
|
|
|
ComplexNumber(1, 2) - ComplexNumber(3, 4), ComplexNumber(-2, -2)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Multiplication
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_multiply_purely_real_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 0) * ComplexNumber(2, 0), ComplexNumber(2, 0))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2017-11-07 17:50:59 +07:00
|
|
|
def test_multiply_purely_imaginary_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(
|
|
|
|
|
ComplexNumber(0, 1) * ComplexNumber(0, 2), ComplexNumber(-2, 0)
|
|
|
|
|
)
|
2017-11-07 17:50:59 +07:00
|
|
|
|
2017-09-08 19:37:28 +03:00
|
|
|
def test_multiply_numbers_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(
|
|
|
|
|
ComplexNumber(1, 2) * ComplexNumber(3, 4), ComplexNumber(-5, 10)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Division
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_divide_purely_real_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertAlmostEqual(
|
|
|
|
|
ComplexNumber(1, 0) / ComplexNumber(2, 0), ComplexNumber(0.5, 0)
|
|
|
|
|
)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_divide_purely_imaginary_numbers(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertAlmostEqual(
|
|
|
|
|
ComplexNumber(0, 1) / ComplexNumber(0, 2), ComplexNumber(0.5, 0)
|
|
|
|
|
)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_divide_numbers_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertAlmostEqual(
|
|
|
|
|
ComplexNumber(1, 2) / ComplexNumber(3, 4), ComplexNumber(0.44, 0.08)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Absolute value
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_absolute_value_of_a_positive_purely_real_number(self):
|
2018-01-10 00:33:25 +05:30
|
|
|
self.assertEqual(abs(ComplexNumber(5, 0)), 5)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_absolute_value_of_a_negative_purely_real_number(self):
|
2018-01-10 00:33:25 +05:30
|
|
|
self.assertEqual(abs(ComplexNumber(-5, 0)), 5)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
def test_absolute_value_of_a_purely_imaginary_number_with_positive_imaginary_part(
|
2021-01-31 16:49:12 -05:00
|
|
|
self,
|
2019-12-18 13:44:34 +01:00
|
|
|
):
|
2018-01-10 00:33:25 +05:30
|
|
|
self.assertEqual(abs(ComplexNumber(0, 5)), 5)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
def test_absolute_value_of_a_purely_imaginary_number_with_negative_imaginary_part(
|
2021-01-31 16:49:12 -05:00
|
|
|
self,
|
2019-12-18 13:44:34 +01:00
|
|
|
):
|
2018-01-10 00:33:25 +05:30
|
|
|
self.assertEqual(abs(ComplexNumber(0, -5)), 5)
|
2017-11-07 17:50:59 +07:00
|
|
|
|
2017-09-08 19:37:28 +03:00
|
|
|
def test_absolute_value_of_a_number_with_real_and_imaginary_part(self):
|
2018-01-10 00:33:25 +05:30
|
|
|
self.assertEqual(abs(ComplexNumber(3, 4)), 5)
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
# Complex conjugate
|
|
|
|
|
|
2017-09-08 19:37:28 +03:00
|
|
|
def test_conjugate_a_purely_real_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(5, 0).conjugate(), ComplexNumber(5, 0))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_conjugate_a_purely_imaginary_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(0, 5).conjugate(), ComplexNumber(0, -5))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2017-11-07 17:50:59 +07:00
|
|
|
def test_conjugate_a_number_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertEqual(ComplexNumber(1, 1).conjugate(), ComplexNumber(1, -1))
|
|
|
|
|
|
|
|
|
|
# Complex exponential function
|
|
|
|
|
|
|
|
|
|
def test_euler_s_identity_formula(self):
|
|
|
|
|
self.assertAlmostEqual(ComplexNumber(0, math.pi).exp(), ComplexNumber(-1, 0))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_exponential_of_0(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertAlmostEqual(ComplexNumber(0, 0).exp(), ComplexNumber(1, 0))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
|
|
|
|
def test_exponential_of_a_purely_real_number(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertAlmostEqual(ComplexNumber(1, 0).exp(), ComplexNumber(math.e, 0))
|
2017-09-08 19:37:28 +03:00
|
|
|
|
2018-02-20 05:34:20 +08:00
|
|
|
def test_exponential_of_a_number_with_real_and_imaginary_part(self):
|
2019-12-18 13:44:34 +01:00
|
|
|
self.assertAlmostEqual(
|
|
|
|
|
ComplexNumber(math.log(2), math.pi).exp(), ComplexNumber(-2, 0)
|
|
|
|
|
)
|
|
|
|
|
|
2022-12-02 19:38:07 +01:00
|
|
|
def test_exponential_resulting_in_a_number_with_real_and_imaginary_part(self):
|
|
|
|
|
self.assertAlmostEqual(
|
|
|
|
|
ComplexNumber(math.log(2) / 2, math.pi / 4).exp(), ComplexNumber(1, 1)
|
|
|
|
|
)
|
|
|
|
|
|
2021-11-10 13:05:59 -08:00
|
|
|
# Operations between real numbers and complex numbers
|
|
|
|
|
|
|
|
|
|
def test_add_real_number_to_complex_number(self):
|
|
|
|
|
self.assertEqual(ComplexNumber(1, 2) + 5, ComplexNumber(6, 2))
|
|
|
|
|
|
|
|
|
|
def test_add_complex_number_to_real_number(self):
|
|
|
|
|
self.assertEqual(5 + ComplexNumber(1, 2), ComplexNumber(6, 2))
|
|
|
|
|
|
|
|
|
|
def test_subtract_real_number_from_complex_number(self):
|
|
|
|
|
self.assertEqual(ComplexNumber(5, 7) - 4, ComplexNumber(1, 7))
|
|
|
|
|
|
|
|
|
|
def test_subtract_complex_number_from_real_number(self):
|
|
|
|
|
self.assertEqual(4 - ComplexNumber(5, 7), ComplexNumber(-1, -7))
|
|
|
|
|
|
|
|
|
|
def test_multiply_complex_number_by_real_number(self):
|
|
|
|
|
self.assertEqual(ComplexNumber(2, 5) * 5, ComplexNumber(10, 25))
|
|
|
|
|
|
|
|
|
|
def test_multiply_real_number_by_complex_number(self):
|
|
|
|
|
self.assertEqual(5 * ComplexNumber(2, 5), ComplexNumber(10, 25))
|
|
|
|
|
|
|
|
|
|
def test_divide_complex_number_by_real_number(self):
|
|
|
|
|
self.assertAlmostEqual(ComplexNumber(10, 100) / 10, ComplexNumber(1, 10))
|
|
|
|
|
|
|
|
|
|
def test_divide_real_number_by_complex_number(self):
|
|
|
|
|
self.assertAlmostEqual(5 / ComplexNumber(1, 1), ComplexNumber(2.5, -2.5))
|
|
|
|
|
|
2019-12-18 13:44:34 +01:00
|
|
|
# Additional tests for this track
|
|
|
|
|
|
|
|
|
|
def test_equality_of_complex_numbers(self):
|
|
|
|
|
self.assertEqual(ComplexNumber(1, 2), ComplexNumber(1, 2))
|
|
|
|
|
|
|
|
|
|
def test_inequality_of_real_part(self):
|
|
|
|
|
self.assertNotEqual(ComplexNumber(1, 2), ComplexNumber(2, 2))
|
|
|
|
|
|
|
|
|
|
def test_inequality_of_imaginary_part(self):
|
|
|
|
|
self.assertNotEqual(ComplexNumber(1, 2), ComplexNumber(1, 1))
|