test_rules_fractions.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from src.rules.fractions import match_constant_division, division_by_one, \
  2. division_of_zero, division_by_self, match_add_constant_fractions, \
  3. equalize_denominators, add_nominators
  4. from src.possibilities import Possibility as P
  5. from tests.test_rules_poly import tree
  6. from tests.rulestestcase import RulesTestCase
  7. class TestRulesFractions(RulesTestCase):
  8. def test_match_constant_division(self):
  9. a, zero = tree('a,0')
  10. root = a / zero
  11. with self.assertRaises(ZeroDivisionError) as cm:
  12. match_constant_division(root)
  13. self.assertEqual(cm.exception.message, 'Division by zero: a / 0.')
  14. root = a / 1
  15. possibilities = match_constant_division(root)
  16. self.assertEqualPos(possibilities, [P(root, division_by_one, (a,))])
  17. root = zero / a
  18. possibilities = match_constant_division(root)
  19. self.assertEqualPos(possibilities, [P(root, division_of_zero)])
  20. root = a / a
  21. possibilities = match_constant_division(root)
  22. self.assertEqualPos(possibilities, [P(root, division_by_self)])
  23. def test_division_by_one(self):
  24. a = tree('a')
  25. root = a / 1
  26. self.assertEqualNodes(division_by_one(root, (a,)), a)
  27. def test_division_of_zero(self):
  28. a, zero = tree('a,0')
  29. root = zero / a
  30. self.assertEqualNodes(division_of_zero(root, ()), zero)
  31. def test_division_by_self(self):
  32. a, one = tree('a,1')
  33. root = a / a
  34. self.assertEqualNodes(division_by_self(root, ()), one)
  35. def test_match_add_constant_fractions(self):
  36. a, b, c, l1, l2, l3, l4 = tree('a,b,c,1,2,3,4')
  37. n0, n1 = root = l1 / l2 + l3 / l4
  38. possibilities = match_add_constant_fractions(root)
  39. self.assertEqualPos(possibilities,
  40. [P(root, equalize_denominators, (n0, n1, 4))])
  41. (((n0, n1), n2), n3), n4 = root = a + l1 / l2 + b + l3 / l4 + c
  42. possibilities = match_add_constant_fractions(root)
  43. self.assertEqualPos(possibilities,
  44. [P(root, equalize_denominators, (n1, n3, 4))])
  45. n0, n1 = root = l2 / l4 + l3 / l4
  46. possibilities = match_add_constant_fractions(root)
  47. self.assertEqualPos(possibilities,
  48. [P(root, add_nominators, (n0, n1))])
  49. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + l3 / l4 + c
  50. possibilities = match_add_constant_fractions(root)
  51. self.assertEqualPos(possibilities,
  52. [P(root, add_nominators, (n1, n3))])
  53. def test_equalize_denominators(self):
  54. a, b, l1, l2, l3, l4 = tree('a,b,1,2,3,4')
  55. n0, n1 = root = l1 / l2 + l3 / l4
  56. self.assertEqualNodes(equalize_denominators(root, (n0, n1, 4)),
  57. l2 / l4 + l3 / l4)
  58. n0, n1 = root = a / l2 + b / l4
  59. self.assertEqualNodes(equalize_denominators(root, (n0, n1, 4)),
  60. (l2 * a) / l4 + b / l4)
  61. def test_add_nominators(self):
  62. a, b, c = tree('a,b,c')
  63. n0, n1 = root = a / b + c / b
  64. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + c) / b)