test_rules_fractions.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  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, match_multiply_fractions, \
  4. multiply_fractions, multiply_with_fraction
  5. from src.node import Scope
  6. from src.possibilities import Possibility as P
  7. from tests.rulestestcase import RulesTestCase, tree
  8. class TestRulesFractions(RulesTestCase):
  9. def test_match_constant_division(self):
  10. a, zero = tree('a,0')
  11. root = a / zero
  12. with self.assertRaises(ZeroDivisionError) as cm:
  13. match_constant_division(root)
  14. self.assertEqual(cm.exception.message, 'Division by zero: a / 0.')
  15. root = a / 1
  16. possibilities = match_constant_division(root)
  17. self.assertEqualPos(possibilities, [P(root, division_by_one, (a,))])
  18. root = zero / a
  19. possibilities = match_constant_division(root)
  20. self.assertEqualPos(possibilities, [P(root, division_of_zero, (a,))])
  21. root = a / a
  22. possibilities = match_constant_division(root)
  23. self.assertEqualPos(possibilities, [P(root, division_by_self, (a,))])
  24. def test_division_by_one(self):
  25. a = tree('a')
  26. root = a / 1
  27. self.assertEqualNodes(division_by_one(root, (a,)), a)
  28. def test_division_of_zero(self):
  29. a, zero = tree('a,0')
  30. root = zero / a
  31. self.assertEqualNodes(division_of_zero(root, ()), zero)
  32. def test_division_by_self(self):
  33. a, one = tree('a,1')
  34. root = a / a
  35. self.assertEqualNodes(division_by_self(root, ()), one)
  36. def test_match_add_constant_fractions(self):
  37. a, b, c, l1, l2, l3, l4 = tree('a,b,c,1,2,3,4')
  38. n0, n1 = root = l1 / l2 + l3 / l4
  39. possibilities = match_add_constant_fractions(root)
  40. self.assertEqualPos(possibilities,
  41. [P(root, equalize_denominators, (Scope(root), n0, n1, 4)),
  42. P(root, equalize_denominators, (Scope(root), n0, n1, 8))])
  43. (((n0, n1), n2), n3), n4 = root = a + l1 / l2 + b + l3 / l4 + c
  44. possibilities = match_add_constant_fractions(root)
  45. self.assertEqualPos(possibilities,
  46. [P(root, equalize_denominators, (Scope(root), n1, n3, 4)),
  47. P(root, equalize_denominators, (Scope(root), n1, n3, 8))])
  48. n0, n1 = root = l2 / l4 + l3 / l4
  49. possibilities = match_add_constant_fractions(root)
  50. self.assertEqualPos(possibilities,
  51. [P(root, add_nominators, (n0, n1))])
  52. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + l3 / l4 + c
  53. possibilities = match_add_constant_fractions(root)
  54. self.assertEqualPos(possibilities,
  55. [P(root, add_nominators, (n1, n3))])
  56. def test_add_constant_fractions_with_negation(self):
  57. a, b, c, l1, l2, l3, l4 = tree('a,b,c,1,2,3,4')
  58. (((n0, n1), n2), n3), n4 = root = a + l2 / l2 + b + (-l3 / l4) + c
  59. possibilities = match_add_constant_fractions(root)
  60. self.assertEqualPos(possibilities,
  61. [P(root, equalize_denominators, (Scope(root), n1, n3, 4)),
  62. P(root, equalize_denominators, (Scope(root), n1, n3, 8))])
  63. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + (-l3 / l4) + c
  64. possibilities = match_add_constant_fractions(root)
  65. self.assertEqualPos(possibilities,
  66. [P(root, add_nominators, (n1, n3))])
  67. def test_equalize_denominators(self):
  68. a, b, l1, l2, l3, l4 = tree('a,b,1,2,3,4')
  69. n0, n1 = root = l1 / l2 + l3 / l4
  70. self.assertEqualNodes(equalize_denominators(root,
  71. (Scope(root), n0, n1, 4)), l2 / l4 + l3 / l4)
  72. n0, n1 = root = a / l2 + b / l4
  73. self.assertEqualNodes(equalize_denominators(root,
  74. (Scope(root), n0, n1, 4)), (l2 * a) / l4 + b /
  75. l4)
  76. #2 / 2 - 3 / 4 -> 4 / 4 - 3 / 4 # Equalize denominators
  77. n0, n1 = root = l1 / l2 + (-l3 / l4)
  78. self.assertEqualNodes(equalize_denominators(root,
  79. (Scope(root), n0, n1, 4)), l2 / l4 + (-l3 / l4))
  80. #2 / 2 - 3 / 4 -> 4 / 4 - 3 / 4 # Equalize denominators
  81. n0, n1 = root = a / l2 + (-b / l4)
  82. self.assertEqualNodes(equalize_denominators(root,
  83. (Scope(root), n0, n1, 4)), (l2 * a) / l4 + (-b / l4))
  84. def test_add_nominators(self):
  85. a, b, c = tree('a,b,c')
  86. n0, n1 = root = a / b + c / b
  87. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + c) / b)
  88. n0, n1 = root = a / b + -c / b
  89. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + -c) / b)
  90. n0, n1 = root = a / b + -(c / b)
  91. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + -c) / b)
  92. n0, n1 = root = a / -b + c / -b
  93. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + c) / -b)
  94. n0, n1 = root = a / -b + -c / -b
  95. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + -c) / -b)
  96. def test_match_multiply_fractions(self):
  97. (a, b), (c, d) = ab, cd = root = tree('a / b * (c / d)')
  98. self.assertEqualPos(match_multiply_fractions(root),
  99. [P(root, multiply_fractions, (Scope(root), ab, cd))])
  100. (ab, e), cd = root = tree('a / b * e * (c / d)')
  101. self.assertEqualPos(match_multiply_fractions(root),
  102. [P(root, multiply_fractions, (Scope(root), ab, cd)),
  103. P(root, multiply_with_fraction, (Scope(root), e, ab)),
  104. P(root, multiply_with_fraction, (Scope(root), e, cd))])
  105. def test_multiply_fractions(self):
  106. (a, b), (c, d) = ab, cd = root = tree('a / b * (c / d)')
  107. self.assertEqual(multiply_fractions(root, (Scope(root), ab, cd)),
  108. a * c / (b * d))
  109. (ab, e), cd = root = tree('a / b * e * (c / d)')
  110. self.assertEqual(multiply_fractions(root, (Scope(root), ab, cd)),
  111. a * c / (b * d) * e)