test_rules_poly.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. from src.rules.poly import match_combine_polynomes, combine_polynomes
  2. from src.rules.numerics import add_numerics
  3. from src.possibilities import Possibility as P
  4. from src.parser import Parser
  5. from tests.parser import ParserWrapper
  6. from tests.rulestestcase import RulesTestCase
  7. def tree(exp, **kwargs):
  8. return ParserWrapper(Parser, **kwargs).run([exp])
  9. class TestRulesPoly(RulesTestCase):
  10. def test_identifiers_basic(self):
  11. a1, a2 = root = tree('a+a')
  12. possibilities = match_combine_polynomes(root)
  13. self.assertEqualPos(possibilities,
  14. [P(root, combine_polynomes, (a1, a2, 1, 1, 'a', 1))])
  15. def test_identifiers_normal(self):
  16. a1, a2 = root = tree('a+2a')
  17. possibilities = match_combine_polynomes(root)
  18. self.assertEqualPos(possibilities,
  19. [P(root, combine_polynomes, (a1, a2, 1, 2, 'a', 1))])
  20. def test_identifiers_reverse(self):
  21. return
  22. # TODO: Move to normalisation test
  23. a1, a2 = root = tree('a+a*2')
  24. possibilities = match_combine_polynomes(root)
  25. self.assertEqualPos(possibilities,
  26. [P(root, combine_polynomes, (a1, a2, 1, 2, a1, 1))])
  27. def test_identifiers_exponent(self):
  28. a1, a2 = root = tree('a2+a2')
  29. possibilities = match_combine_polynomes(root)
  30. self.assertEqualPos(possibilities,
  31. [P(root, combine_polynomes, (a1, a2, 1, 1, 'a', 2))])
  32. def test_identifiers_coeff_exponent_left(self):
  33. a1, a2 = root = tree('2a3+a3')
  34. possibilities = match_combine_polynomes(root)
  35. self.assertEqualPos(possibilities,
  36. [P(root, combine_polynomes, (a1, a2, 2, 1, 'a', 3))])
  37. def test_identifiers_coeff_exponent_both(self):
  38. a1, a2 = root = tree('2a3+2a3')
  39. possibilities = match_combine_polynomes(root)
  40. self.assertEqualPos(possibilities,
  41. [P(root, combine_polynomes, (a1, a2, 2, 2, 'a', 3))])
  42. def test_basic_subexpressions(self):
  43. a_b, c, d = tree('a+b,c,d')
  44. left, right = root = tree('(a+b)^d + (a+b)^d')
  45. self.assertEqual(left, right)
  46. possibilities = match_combine_polynomes(root)
  47. self.assertEqualPos(possibilities,
  48. [P(root, combine_polynomes, (left, right, 1, 1, a_b, d))])
  49. left, right = root = tree('5(a+b)^d + 7(a+b)^d')
  50. possibilities = match_combine_polynomes(root)
  51. self.assertEqualPos(possibilities,
  52. [P(root, combine_polynomes, (left, right, 5, 7, a_b, d))])
  53. # TODO: Move to other strategy
  54. #left, right = root = tree('c(a+b)^d + c(a+b)^d')
  55. #self.assertEqual(left, right)
  56. #possibilities = match_combine_polynomes(root)
  57. #self.assertEqualPos(possibilities,
  58. # [P(root, combine_polynomes, (left, right, c, c, a_b, d))])
  59. def test_match_add_numerics(self):
  60. l0, l1, l2 = tree('0,1,2')
  61. root = l0 + l1 + l2
  62. possibilities = match_combine_polynomes(root)
  63. self.assertEqualPos(possibilities,
  64. [P(root, add_numerics, (l0, l1, l0, l1)),
  65. P(root, add_numerics, (l0, l2, l0, l2)),
  66. P(root, add_numerics, (l1, l2, l1, l2))])
  67. def test_match_add_numerics_explicit_powers(self):
  68. l0, l1, l2 = tree('0^1,1*1,1*2^1')
  69. root = l0 + l1 + l2
  70. possibilities = match_combine_polynomes(root)
  71. self.assertEqualPos(possibilities,
  72. [P(root, add_numerics, (l0, l1, l0[0], l1[1])),
  73. P(root, add_numerics, (l0, l2, l0[0], l2[1][0])),
  74. P(root, add_numerics, (l1, l2, l1[1], l2[1][0]))])
  75. def test_combine_polynomes(self):
  76. # 2a + 3a -> (2 + 3) * a
  77. l0, a, l1, l2 = tree('2,a,3,1')
  78. root = l0 * a + l1 * a
  79. left, right = root
  80. replacement = combine_polynomes(root, (left, right, l0, l1, a, 1))
  81. self.assertEqualNodes(replacement, (l0 + l1) * a)
  82. # a + 3a -> (1 + 3) * a
  83. root = a + l1 * a
  84. left, right = root
  85. replacement = combine_polynomes(root, (left, right, l2, l1, a, 1))
  86. self.assertEqualNodes(replacement, (l2 + l1) * a)
  87. # 2a + a -> (2 + 1) * a
  88. root = l0 * a + a
  89. left, right = root
  90. replacement = combine_polynomes(root, (left, right, l0, l2, a, 1))
  91. self.assertEqualNodes(replacement, (l0 + 1) * a)
  92. # a + a -> (1 + 1) * a
  93. root = a + a
  94. left, right = root
  95. replacement = combine_polynomes(root, (left, right, l2, l2, a, 1))
  96. self.assertEqualNodes(replacement, (l2 + 1) * a)