test_rules_fractions.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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.rulestestcase import RulesTestCase, tree
  6. class TestRulesFractions(RulesTestCase):
  7. def test_match_constant_division(self):
  8. a, zero = tree('a,0')
  9. root = a / zero
  10. with self.assertRaises(ZeroDivisionError) as cm:
  11. match_constant_division(root)
  12. self.assertEqual(cm.exception.message, 'Division by zero: a / 0.')
  13. root = a / 1
  14. possibilities = match_constant_division(root)
  15. self.assertEqualPos(possibilities, [P(root, division_by_one, (a,))])
  16. root = zero / a
  17. possibilities = match_constant_division(root)
  18. self.assertEqualPos(possibilities, [P(root, division_of_zero)])
  19. root = a / a
  20. possibilities = match_constant_division(root)
  21. self.assertEqualPos(possibilities, [P(root, division_by_self)])
  22. def test_division_by_one(self):
  23. a = tree('a')
  24. root = a / 1
  25. self.assertEqualNodes(division_by_one(root, (a,)), a)
  26. def test_division_of_zero(self):
  27. a, zero = tree('a,0')
  28. root = zero / a
  29. self.assertEqualNodes(division_of_zero(root, ()), zero)
  30. def test_division_by_self(self):
  31. a, one = tree('a,1')
  32. root = a / a
  33. self.assertEqualNodes(division_by_self(root, ()), one)
  34. def test_match_add_constant_fractions(self):
  35. a, b, c, l1, l2, l3, l4 = tree('a,b,c,1,2,3,4')
  36. n0, n1 = root = l1 / l2 + l3 / l4
  37. possibilities = match_add_constant_fractions(root)
  38. self.assertEqualPos(possibilities,
  39. [P(root, equalize_denominators, (n0, n1, 4))])
  40. (((n0, n1), n2), n3), n4 = root = a + l1 / l2 + b + l3 / l4 + c
  41. possibilities = match_add_constant_fractions(root)
  42. self.assertEqualPos(possibilities,
  43. [P(root, equalize_denominators, (n1, n3, 4))])
  44. n0, n1 = root = l2 / l4 + l3 / l4
  45. possibilities = match_add_constant_fractions(root)
  46. self.assertEqualPos(possibilities,
  47. [P(root, add_nominators, (n0, n1))])
  48. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + l3 / l4 + c
  49. possibilities = match_add_constant_fractions(root)
  50. self.assertEqualPos(possibilities,
  51. [P(root, add_nominators, (n1, n3))])
  52. def test_add_constant_fractions_with_negation(self):
  53. a, b, c, l1, l2, l3, l4 = tree('a,b,c,1,2,3,4')
  54. (((n0, n1), n2), n3), n4 = root = a + l2 / l2 + b + (-l3 / l4) + c
  55. possibilities = match_add_constant_fractions(root)
  56. self.assertEqualPos(possibilities,
  57. [P(root, equalize_denominators, (n1, n3, 4))])
  58. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + (-l3 / l4) + c
  59. possibilities = match_add_constant_fractions(root)
  60. self.assertEqualPos(possibilities,
  61. [P(root, add_nominators, (n1, n3))])
  62. def test_equalize_denominators(self):
  63. a, b, l1, l2, l3, l4 = tree('a,b,1,2,3,4')
  64. n0, n1 = root = l1 / l2 + l3 / l4
  65. self.assertEqualNodes(equalize_denominators(root, (n0, n1, 4)),
  66. l2 / l4 + l3 / l4)
  67. n0, n1 = root = a / l2 + b / l4
  68. self.assertEqualNodes(equalize_denominators(root, (n0, n1, 4)),
  69. (l2 * a) / l4 + b / l4)
  70. #2 / 2 - 3 / 4 -> 4 / 4 - 3 / 4 # Equalize denominators
  71. n0, n1 = root = l1 / l2 + (-l3 / l4)
  72. self.assertEqualNodes(equalize_denominators(root, (n0, n1, 4)),
  73. l2 / l4 + (-l3 / l4))
  74. #2 / 2 - 3 / 4 -> 4 / 4 - 3 / 4 # Equalize denominators
  75. n0, n1 = root = a / l2 + (-b / l4)
  76. self.assertEqualNodes(equalize_denominators(root, (n0, n1, 4)),
  77. (l2 * a) / l4 + (-b / l4))
  78. def test_add_nominators(self):
  79. a, b, c = tree('a,b,c')
  80. n0, n1 = root = a / b + c / b
  81. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + c) / b)
  82. #2 / 4 + 3 / -4 -> 2 / 4 + -3 / 4
  83. #2 / 4 - 3 / 4 -> -1 / 4 # Equal denominators, so nominators can
  84. n0, n1 = root = a / b + (-c / b)
  85. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + (-c)) / b)