test_rules_poly.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import unittest
  2. from src.rules.poly import match_combine_polynomes, combine_polynomes, \
  3. combine_numerics
  4. from src.possibilities import Possibility as P
  5. from src.parser import Parser
  6. from tests.parser import ParserWrapper
  7. def tree(exp, **kwargs):
  8. return ParserWrapper(Parser, **kwargs).run([exp])
  9. class TestRulesPoly(unittest.TestCase):
  10. def assertEqualPos(self, possibilities, expected):
  11. self.assertEqual(len(possibilities), len(expected))
  12. for p, e in zip(possibilities, expected):
  13. self.assertEqual(p.root, e.root)
  14. for pair in zip(p.args, e.args):
  15. self.assertEqual(*pair)
  16. self.assertEqual(p, e)
  17. def test_numbers(self):
  18. return
  19. # TODO: Move to combine numeric test
  20. l1, l2 = root = tree('1+2')
  21. possibilities = match_combine_polynomes(root)
  22. self.assertEqualPos(possibilities,
  23. [P(root, combine_numerics, ((l1, (l1, l1, l1)),
  24. (l2, (l1, l2, l1))))])
  25. def test_identifiers_basic(self):
  26. a1, a2 = root = tree('a+a')
  27. possibilities = match_combine_polynomes(root)
  28. self.assertEqualPos(possibilities,
  29. [P(root, combine_polynomes, (a1, a2, 1, 1, 'a', 1))])
  30. def test_identifiers_normal(self):
  31. a1, a2 = root = tree('a+2a')
  32. possibilities = match_combine_polynomes(root)
  33. self.assertEqualPos(possibilities,
  34. [P(root, combine_polynomes, (a1, a2, 1, 2, 'a', 1))])
  35. def test_identifiers_reverse(self):
  36. return
  37. # TODO: Move to normalisation test
  38. a1, a2 = root = tree('a+a*2')
  39. possibilities = match_combine_polynomes(root)
  40. self.assertEqualPos(possibilities,
  41. [P(root, combine_polynomes, (a1, a2, 1, 2, a1, 1))])
  42. def test_identifiers_exponent(self):
  43. a1, a2 = root = tree('a2+a2')
  44. possibilities = match_combine_polynomes(root)
  45. self.assertEqualPos(possibilities,
  46. [P(root, combine_polynomes, (a1, a2, 1, 1, 'a', 2))])
  47. def test_identifiers_coeff_exponent_left(self):
  48. a1, a2 = root = tree('2a3+a3')
  49. possibilities = match_combine_polynomes(root)
  50. self.assertEqualPos(possibilities,
  51. [P(root, combine_polynomes, (a1, a2, 2, 1, 'a', 3))])
  52. def test_identifiers_coeff_exponent_both(self):
  53. a1, a2 = root = tree('2a3+2a3')
  54. possibilities = match_combine_polynomes(root)
  55. self.assertEqualPos(possibilities,
  56. [P(root, combine_polynomes, (a1, a2, 2, 2, 'a', 3))])
  57. def test_basic_subexpressions(self):
  58. a_b, c, d = tree('a+b,c,d')
  59. left, right = root = tree('(a+b)^d + (a+b)^d')
  60. self.assertEqual(left, right)
  61. possibilities = match_combine_polynomes(root)
  62. self.assertEqualPos(possibilities,
  63. [P(root, combine_polynomes, (left, right, 1, 1, a_b, d))])
  64. left, right = root = tree('5(a+b)^d + 7(a+b)^d')
  65. possibilities = match_combine_polynomes(root)
  66. self.assertEqualPos(possibilities,
  67. [P(root, combine_polynomes, (left, right, 5, 7, a_b, d))])
  68. # TODO: Move to other strategy
  69. #left, right = root = tree('c(a+b)^d + c(a+b)^d')
  70. #self.assertEqual(left, right)
  71. #possibilities = match_combine_polynomes(root)
  72. #self.assertEqualPos(possibilities,
  73. # [P(root, combine_polynomes, (left, right, c, c, a_b, d))])
  74. def test_match_combine_polynomes_numeric_combinations(self):
  75. return
  76. root = tree('0+1+2')
  77. # TODO: this test fails with this code: l0, l1, l2 = tree('0,1,2')
  78. l0, l1, l2 = root[0][0], root[0][1], root[1]
  79. possibilities = match_combine_polynomes(root)
  80. self.assertEqualPos(possibilities,
  81. [P(root, combine_polynomes, ((l0, (l1, l0, l1)),
  82. (l1, (l1, l1, l1)))),
  83. P(root, combine_polynomes, ((l0, (l1, l0, l1)),
  84. (l2, (l1, l2, l1)))),
  85. P(root, combine_polynomes, ((l1, (l1, l1, l1)),
  86. (l2, (l1, l2, l1))))])