test_rules_poly.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import unittest
  2. from src.node import ExpressionNode as N, ExpressionLeaf as L
  3. from src.rules.poly import match_combine_polynomes, combine_polynomes
  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 test_match_combine_polynomes_numeric_combinations(self):
  11. # l0, l1, l2 = L(1), L(2), L(2)
  12. # plus = N('+', N('+', l0, l1), l2)
  13. # p = match_combine_polynomes(plus)
  14. # self.assertEqualPos(p, [P(plus, combine_polynomes, (l0, l1)),
  15. # P(plus, combine_polynomes, (l0, l2)),
  16. # P(plus, combine_polynomes, (l1, l2))])
  17. def assertEqualPos(self, possibilities, expected):
  18. self.assertEqual(len(possibilities), len(expected))
  19. for p, e in zip(possibilities, expected):
  20. self.assertEqual(p.root, e.root)
  21. for pair in zip(p.args, e.args):
  22. self.assertEqual(*pair)
  23. self.assertEqual(p, e)
  24. def test_numbers(self):
  25. l1, l2 = root = tree('1+2')
  26. self.assertEqualPos(match_combine_polynomes(root),
  27. [P(root, combine_polynomes, ((l1, (l1, l1, l1)),
  28. (l2, (l1, l2, l1))))])
  29. def test_identifiers_basic(self):
  30. l1, l2 = tree('1,2')
  31. a1, a2 = root = tree('a+a')
  32. self.assertEqualPos(match_combine_polynomes(root),
  33. [P(root, combine_polynomes, ((a1, (l1, a1, l1)),
  34. (a2, (l1, a2, l1))))])
  35. def test_identifiers_normal(self):
  36. l1, l2 = tree('1,2')
  37. a1, a2 = root = tree('a+2a')
  38. self.assertEqualPos(match_combine_polynomes(root),
  39. [P(root, combine_polynomes, ((a1, (l1, a1, l1)),
  40. (a2, (l2, a2[1], l1))))])
  41. def test_identifiers_reverse(self):
  42. l1, l2, la = tree('1,2,a')
  43. a1, a2 = root = tree('a+a*2')
  44. self.assertEqualPos(match_combine_polynomes(root),
  45. [P(root, combine_polynomes, ((a1, (l1, a1, l1)),
  46. (a2, (l2, la, l1))))])
  47. def test_identifiers_exponent(self):
  48. l1, l2 = tree('1,2')
  49. a1, a2 = root = tree('a2+a2')
  50. self.assertEqualPos(match_combine_polynomes(root),
  51. [P(root, combine_polynomes, ((a1, (l1, a1[0], l2)),
  52. (a2, (l1, a2[0], l2))))])
  53. def test_basic_subexpressions(self):
  54. a_b, c, d, l1, l5, l7 = tree('a+b,c,d,1,5,7')
  55. left, right = root = tree('(a+b)^d + (a+b)^d')
  56. self.assertEqual(left, right)
  57. self.assertEqualPos(match_combine_polynomes(root),
  58. [P(root, combine_polynomes, ((left, (l1, a_b, d)),
  59. (right, (l1, a_b, d))))])
  60. left, right = root = tree('5(a+b)^d + 7(a+b)^d')
  61. self.assertEqualPos(match_combine_polynomes(root),
  62. [P(root, combine_polynomes, ((left, (l5, a_b, d)),
  63. (right, (l7, a_b, d))))])
  64. left, right = root = tree('c(a+b)^d + c(a+b)^d')
  65. self.assertEqual(left, right)
  66. self.assertEqualPos(match_combine_polynomes(root),
  67. [P(root, combine_polynomes, ((left, (c, a_b, d)),
  68. (right, (c, a_b, d))))])