test_rules_fractions.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  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.node import Scope
  5. from src.possibilities import Possibility as P
  6. from tests.rulestestcase import RulesTestCase, tree
  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, (a,))])
  20. root = a / a
  21. possibilities = match_constant_division(root)
  22. self.assertEqualPos(possibilities, [P(root, division_by_self, (a,))])
  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, (Scope(root), n0, n1, 4)),
  41. P(root, equalize_denominators, (Scope(root), n0, n1, 8))])
  42. (((n0, n1), n2), n3), n4 = root = a + l1 / l2 + b + l3 / l4 + c
  43. possibilities = match_add_constant_fractions(root)
  44. self.assertEqualPos(possibilities,
  45. [P(root, equalize_denominators, (Scope(root), n1, n3, 4)),
  46. P(root, equalize_denominators, (Scope(root), n1, n3, 8))])
  47. n0, n1 = root = l2 / l4 + l3 / l4
  48. possibilities = match_add_constant_fractions(root)
  49. self.assertEqualPos(possibilities,
  50. [P(root, add_nominators, (n0, n1))])
  51. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + l3 / l4 + c
  52. possibilities = match_add_constant_fractions(root)
  53. self.assertEqualPos(possibilities,
  54. [P(root, add_nominators, (n1, n3))])
  55. def test_add_constant_fractions_with_negation(self):
  56. a, b, c, l1, l2, l3, l4 = tree('a,b,c,1,2,3,4')
  57. (((n0, n1), n2), n3), n4 = root = a + l2 / l2 + b + (-l3 / l4) + c
  58. possibilities = match_add_constant_fractions(root)
  59. self.assertEqualPos(possibilities,
  60. [P(root, equalize_denominators, (Scope(root), n1, n3, 4)),
  61. P(root, equalize_denominators, (Scope(root), n1, n3, 8))])
  62. (((n0, n1), n2), n3), n4 = root = a + l2 / l4 + b + (-l3 / l4) + c
  63. possibilities = match_add_constant_fractions(root)
  64. self.assertEqualPos(possibilities,
  65. [P(root, add_nominators, (n1, n3))])
  66. def test_equalize_denominators(self):
  67. a, b, l1, l2, l3, l4 = tree('a,b,1,2,3,4')
  68. n0, n1 = root = l1 / l2 + l3 / l4
  69. self.assertEqualNodes(equalize_denominators(root,
  70. (Scope(root), n0, n1, 4)), l2 / l4 + l3 / l4)
  71. n0, n1 = root = a / l2 + b / l4
  72. self.assertEqualNodes(equalize_denominators(root,
  73. (Scope(root), n0, n1, 4)), (l2 * a) / l4 + b /
  74. l4)
  75. #2 / 2 - 3 / 4 -> 4 / 4 - 3 / 4 # Equalize denominators
  76. n0, n1 = root = l1 / l2 + (-l3 / l4)
  77. self.assertEqualNodes(equalize_denominators(root,
  78. (Scope(root), n0, n1, 4)), l2 / l4 + (-l3 / l4))
  79. #2 / 2 - 3 / 4 -> 4 / 4 - 3 / 4 # Equalize denominators
  80. n0, n1 = root = a / l2 + (-b / l4)
  81. self.assertEqualNodes(equalize_denominators(root,
  82. (Scope(root), n0, n1, 4)), (l2 * a) / l4 + (-b / l4))
  83. def test_add_nominators(self):
  84. a, b, c = tree('a,b,c')
  85. n0, n1 = root = a / b + c / b
  86. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + c) / b)
  87. n0, n1 = root = a / b + -c / b
  88. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + -c) / b)
  89. n0, n1 = root = a / b + -(c / b)
  90. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + -c) / b)
  91. n0, n1 = root = a / -b + c / -b
  92. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + c) / -b)
  93. n0, n1 = root = a / -b + -c / -b
  94. self.assertEqualNodes(add_nominators(root, (n0, n1)), (a + -c) / -b)