test_rules_powers.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. from src.rules.powers import match_add_exponents, add_exponents, \
  2. match_subtract_exponents, subtract_exponents, \
  3. match_multiply_exponents, multiply_exponents, \
  4. match_duplicate_exponent, duplicate_exponent, \
  5. match_remove_negative_exponent, remove_negative_exponent, \
  6. match_exponent_to_root, exponent_to_root
  7. from src.possibilities import Possibility as P
  8. from src.node import ExpressionNode as N
  9. from tests.rulestestcase import RulesTestCase, tree
  10. class TestRulesPowers(RulesTestCase):
  11. def test_match_add_exponents_binary(self):
  12. a, p, q = tree('a,p,q')
  13. n0, n1 = root = a ** p * a ** q
  14. possibilities = match_add_exponents(root)
  15. self.assertEqualPos(possibilities,
  16. [P(root, add_exponents, (n0, n1, a, p, q))])
  17. def test_match_add_exponents_ternary(self):
  18. a, p, q, r = tree('a,p,q,r')
  19. (n0, n1), n2 = root = a ** p * a ** q * a ** r
  20. possibilities = match_add_exponents(root)
  21. self.assertEqualPos(possibilities,
  22. [P(root, add_exponents, (n0, n1, a, p, q)),
  23. P(root, add_exponents, (n0, n2, a, p, r)),
  24. P(root, add_exponents, (n1, n2, a, q, r))])
  25. def test_match_add_exponents_multiple_identifiers(self):
  26. a, b, p, q = tree('a,b,p,q')
  27. ((a0, b0), a1), b1 = root = a ** p * b ** p * a ** q * b ** q
  28. possibilities = match_add_exponents(root)
  29. self.assertEqualPos(possibilities,
  30. [P(root, add_exponents, (a0, a1, a, p, q)),
  31. P(root, add_exponents, (b0, b1, b, p, q))])
  32. def test_match_subtract_exponents_powers(self):
  33. a, p, q = tree('a,p,q')
  34. root = a ** p / a ** q
  35. possibilities = match_subtract_exponents(root)
  36. self.assertEqualPos(possibilities,
  37. [P(root, subtract_exponents, (a, p, q))])
  38. def test_match_subtract_power_id(self):
  39. a, p = tree('a,p')
  40. root = a ** p / a
  41. possibilities = match_subtract_exponents(root)
  42. self.assertEqualPos(possibilities,
  43. [P(root, subtract_exponents, (a, p, 1))])
  44. def test_match_subtract_id_power(self):
  45. a, q = tree('a,q')
  46. root = a / a ** q
  47. possibilities = match_subtract_exponents(root)
  48. self.assertEqualPos(possibilities,
  49. [P(root, subtract_exponents, (a, 1, q))])
  50. def test_match_multiply_exponents(self):
  51. a, p, q = tree('a,p,q')
  52. root = (a ** p) ** q
  53. possibilities = match_multiply_exponents(root)
  54. self.assertEqualPos(possibilities,
  55. [P(root, multiply_exponents, (a, p, q))])
  56. def test_match_duplicate_exponent(self):
  57. a, b, p = tree('a,b,p')
  58. root = (a * b) ** p
  59. possibilities = match_duplicate_exponent(root)
  60. self.assertEqualPos(possibilities,
  61. [P(root, duplicate_exponent, ([a, b], p))])
  62. def test_match_remove_negative_exponent(self):
  63. a, p = tree('a,p')
  64. root = a ** -p
  65. possibilities = match_remove_negative_exponent(root)
  66. self.assertEqualPos(possibilities,
  67. [P(root, remove_negative_exponent, (a, -p))])
  68. def test_match_exponent_to_root(self):
  69. a, n, m, l1 = tree('a,n,m,1')
  70. root = a ** (n / m)
  71. possibilities = match_exponent_to_root(root)
  72. self.assertEqualPos(possibilities,
  73. [P(root, exponent_to_root, (a, n, m))])
  74. root = a ** (l1 / m)
  75. possibilities = match_exponent_to_root(root)
  76. self.assertEqualPos(possibilities,
  77. [P(root, exponent_to_root, (a, 1, m))])
  78. def test_add_exponents(self):
  79. a, p, q = tree('a,p,q')
  80. n0, n1 = root = a ** p * a ** q
  81. self.assertEqualNodes(add_exponents(root, (n0, n1, a, p, q)),
  82. a ** (p + q))
  83. def test_subtract_exponents(self):
  84. a, p, q = tree('a,p,q')
  85. root = a ** p / a ** q
  86. self.assertEqualNodes(subtract_exponents(root, (a, p, q)),
  87. a ** (p - q))
  88. def test_multiply_exponents(self):
  89. a, p, q = tree('a,p,q')
  90. root = (a ** p) ** q
  91. self.assertEqualNodes(multiply_exponents(root, (a, p, q)),
  92. a ** (p * q))
  93. def test_duplicate_exponent(self):
  94. a, b, c, p = tree('a,b,c,p')
  95. root = (a * b) ** p
  96. self.assertEqualNodes(duplicate_exponent(root, ([a, b], p)),
  97. a ** p * b ** p)
  98. root = (a * b * c) ** p
  99. self.assertEqualNodes(duplicate_exponent(root, ([a, b, c], p)),
  100. a ** p * b ** p * c ** p)
  101. def test_remove_negative_exponent(self):
  102. a, p, l1 = tree('a,-p,1')
  103. root = a ** p
  104. self.assertEqualNodes(remove_negative_exponent(root, (a, p)),
  105. l1 / a ** +p)
  106. def test_exponent_to_root(self):
  107. a, n, m, l1 = tree('a,n,m,1')
  108. root = a ** (n / m)
  109. self.assertEqualNodes(exponent_to_root(root, (a, n, m)),
  110. N('sqrt', a ** n, m))
  111. self.assertEqualNodes(exponent_to_root(root, (a, l1, m)),
  112. N('sqrt', a, m))