2018-02-21 23:17:18 +08:00
|
|
|
from __future__ import division
|
|
|
|
|
import unittest
|
|
|
|
|
|
2021-01-31 16:49:12 -05:00
|
|
|
from rational_numbers import (
|
|
|
|
|
Rational,
|
|
|
|
|
)
|
2018-02-21 23:17:18 +08:00
|
|
|
|
2020-10-15 12:46:24 -04:00
|
|
|
# Tests adapted from `problem-specifications//canonical-data.json`
|
2018-02-21 23:17:18 +08:00
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
|
2018-06-13 09:12:09 -04:00
|
|
|
class RationalNumbersTest(unittest.TestCase):
|
2018-02-21 23:17:18 +08:00
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Tests of type: Arithmetic
|
|
|
|
|
|
|
|
|
|
# Addition
|
|
|
|
|
|
|
|
|
|
def test_add_two_positive_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) + Rational(2, 3), Rational(7, 6))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_add_a_positive_rational_number_and_a_negative_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) + Rational(-2, 3), Rational(-1, 6))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_add_two_negative_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) + Rational(-2, 3), Rational(-7, 6))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_add_a_rational_number_to_its_additive_inverse(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) + Rational(-1, 2), Rational(0, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Subtraction
|
|
|
|
|
|
|
|
|
|
def test_subtract_two_positive_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) - Rational(2, 3), Rational(-1, 6))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_subtract_a_positive_rational_number_and_a_negative_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) - Rational(-2, 3), Rational(7, 6))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_subtract_two_negative_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) - Rational(-2, 3), Rational(1, 6))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_subtract_a_rational_number_from_itself(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) - Rational(1, 2), Rational(0, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Multiplication
|
|
|
|
|
|
|
|
|
|
def test_multiply_two_positive_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) * Rational(2, 3), Rational(1, 3))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_multiply_a_negative_rational_number_by_a_positive_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) * Rational(2, 3), Rational(-1, 3))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_multiply_two_negative_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) * Rational(-2, 3), Rational(1, 3))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_multiply_a_rational_number_by_its_reciprocal(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) * Rational(2, 1), Rational(1, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_multiply_a_rational_number_by_1(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) * Rational(1, 1), Rational(1, 2))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_multiply_a_rational_number_by_0(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) * Rational(0, 1), Rational(0, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Division
|
|
|
|
|
|
|
|
|
|
def test_divide_two_positive_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) / Rational(2, 3), Rational(3, 4))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_divide_a_positive_rational_number_by_a_negative_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) / Rational(-2, 3), Rational(-3, 4))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_divide_two_negative_rational_numbers(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) / Rational(-2, 3), Rational(3, 4))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_divide_a_rational_number_by_1(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) / Rational(1, 1), Rational(1, 2))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Tests of type: Absolute value
|
|
|
|
|
|
|
|
|
|
def test_absolute_value_of_a_positive_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(abs(Rational(1, 2)), Rational(1, 2))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_absolute_value_of_a_positive_rational_number_with_negative_numerator_and_denominator(
|
2021-01-31 16:49:12 -05:00
|
|
|
self,
|
2019-10-25 16:03:32 +02:00
|
|
|
):
|
2019-03-25 09:05:05 -05:00
|
|
|
self.assertEqual(abs(Rational(-1, -2)), Rational(1, 2))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_absolute_value_of_a_negative_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(abs(Rational(-1, 2)), Rational(1, 2))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_absolute_value_of_a_negative_rational_number_with_negative_denominator(
|
2021-01-31 16:49:12 -05:00
|
|
|
self,
|
2019-10-25 16:03:32 +02:00
|
|
|
):
|
2019-03-25 09:05:05 -05:00
|
|
|
self.assertEqual(abs(Rational(1, -2)), Rational(1, 2))
|
|
|
|
|
|
2018-02-21 23:17:18 +08:00
|
|
|
def test_absolute_value_of_zero(self):
|
|
|
|
|
self.assertEqual(abs(Rational(0, 1)), Rational(0, 1))
|
|
|
|
|
|
2022-02-09 17:35:09 -08:00
|
|
|
def test_absolute_value_of_a_rational_number_is_reduced_to_lowest_terms(self):
|
|
|
|
|
self.assertEqual(abs(Rational(2, 4)), Rational(1, 2))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Tests of type: Exponentiation of a rational number
|
|
|
|
|
|
|
|
|
|
def test_raise_a_positive_rational_number_to_a_positive_integer_power(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) ** 3, Rational(1, 8))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_raise_a_negative_rational_number_to_a_positive_integer_power(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) ** 3, Rational(-1, 8))
|
|
|
|
|
|
2022-02-09 17:35:09 -08:00
|
|
|
def test_raise_a_positive_rational_number_to_a_negative_integer_power(self):
|
|
|
|
|
self.assertEqual(Rational(3, 5) ** -2, Rational(25, 9))
|
|
|
|
|
|
|
|
|
|
def test_raise_a_negative_rational_number_to_an_even_negative_integer_power(self):
|
|
|
|
|
self.assertEqual(Rational(-3, 5) ** -2, Rational(25, 9))
|
|
|
|
|
|
|
|
|
|
def test_raise_a_negative_rational_number_to_an_odd_negative_integer_power(self):
|
|
|
|
|
self.assertEqual(Rational(-3, 5) ** -3, Rational(-125, 27))
|
|
|
|
|
|
2018-02-21 23:17:18 +08:00
|
|
|
def test_raise_zero_to_an_integer_power(self):
|
|
|
|
|
self.assertEqual(Rational(0, 1) ** 5, Rational(0, 1))
|
|
|
|
|
|
|
|
|
|
def test_raise_one_to_an_integer_power(self):
|
|
|
|
|
self.assertEqual(Rational(1, 1) ** 4, Rational(1, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_raise_a_positive_rational_number_to_the_power_of_zero(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(1, 2) ** 0, Rational(1, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_raise_a_negative_rational_number_to_the_power_of_zero(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-1, 2) ** 0, Rational(1, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Tests of type: Exponentiation of a real number to a rational number
|
|
|
|
|
|
|
|
|
|
def test_raise_a_real_number_to_a_positive_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertAlmostEqual(8 ** Rational(4, 3), 16.0, places=8)
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_raise_a_real_number_to_a_negative_rational_number(self):
|
|
|
|
|
self.assertAlmostEqual(9 ** Rational(-1, 2), 0.3333333333333333, places=8)
|
2018-02-21 23:17:18 +08:00
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_raise_a_real_number_to_a_zero_rational_number(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertAlmostEqual(2 ** Rational(0, 1), 1.0, places=8)
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
# Tests of type: Reduction to lowest terms
|
|
|
|
|
|
|
|
|
|
def test_reduce_a_positive_rational_number_to_lowest_terms(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(2, 4), Rational(1, 2))
|
|
|
|
|
|
2021-11-10 12:47:26 -08:00
|
|
|
def test_reduce_places_the_minus_sign_on_the_numerator(self):
|
|
|
|
|
self.assertEqual(Rational(3, -4), Rational(-3, 4))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_reduce_a_negative_rational_number_to_lowest_terms(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-4, 6), Rational(-2, 3))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_reduce_a_rational_number_with_a_negative_denominator_to_lowest_terms(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(3, -9), Rational(-1, 3))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_reduce_zero_to_lowest_terms(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(0, 6), Rational(0, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_reduce_an_integer_to_lowest_terms(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(-14, 7), Rational(-2, 1))
|
|
|
|
|
|
2019-10-25 16:03:32 +02:00
|
|
|
def test_reduce_one_to_lowest_terms(self):
|
2018-02-21 23:17:18 +08:00
|
|
|
self.assertEqual(Rational(13, 13), Rational(1, 1))
|