test_rules_poly.py 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import unittest
  2. from src.node import ExpressionNode as N, ExpressionLeaf as L
  3. from src.rules.poly import match_combine_factors, 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_factors_numeric_combinations(self):
  11. # l0, l1, l2 = L(1), L(2), L(2)
  12. # plus = N('+', N('+', l0, l1), l2)
  13. # p = match_combine_factors(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_basic(self):
  25. l1, l2 = root = tree('1+2')
  26. self.assertEqualPos(match_combine_factors(root),
  27. [P(root, combine_polynomes, ((l1, (l1, l1, l1, False)),
  28. (l2, (l2, l1, l1, False))))])
  29. a1, a2 = root = tree('a+a')
  30. self.assertEqualPos(match_combine_factors(root),
  31. [P(root, combine_polynomes, ((a1, (a1, l1, l1, False)),
  32. (a2, (a2, l1, l1, False))))])
  33. a1, a2 = root = tree('a+2a')
  34. self.assertEqualPos(match_combine_factors(root),
  35. [P(root, combine_polynomes, ((a1, (a1, l1, l1, False)),
  36. (a2, (a2[1], l1, l2, False))))])
  37. a1, a2 = root = tree('a+a*2')
  38. self.assertEqualPos(match_combine_factors(root),
  39. [P(root, combine_polynomes, ((a1, (a1, l1, l1, False)),
  40. (a2, (a2[1], l1, l2, False))))])
  41. a1, a2 = root = tree('a2+a2')
  42. self.assertEqualPos(match_combine_factors(root),
  43. [P(root, combine_polynomes, ((a1, (a1[0], l2, l1, True)),
  44. (a2, (a2[0], l2, l1, True))))])
  45. def test_basic_subexpressions(self):
  46. return # TODO: test this!!
  47. a_b = tree('a+b')
  48. c, d = tree('c+d')
  49. l1 = tree('1')
  50. l5, l7 = tree('5+7')
  51. left, right = root = tree('(a+b)^d + (a+b)^d')
  52. self.assertEqual(left, right)
  53. self.assertEqualPos(match_combine_factors(root),
  54. [P(root, combine_polynomes, ((left, (a_b, d, l1, True)),
  55. (right, (a_b, d, l1, True))))])
  56. left, right = root = tree('5(a+b)^d + 7(a+b)^d')
  57. #<Possibility root="5 * (a + b) ^ d + 7 * (a + b) ^ d"
  58. # handler=combine_polynomes args=((<src.node.ExpressionNode object at
  59. # 0x9fb2e0c>, (<src.node.ExpressionNode object at 0x9fb2c2c>,
  60. # 'd', 5, True)), (<src.node.ExpressionNode object at
  61. # 0x9fb438c>, (<src.node.ExpressionNode object at
  62. # 0x9fb2f0c>, 'd', 7, True)))>
  63. self.assertEqualPos(match_combine_factors(root),
  64. [P(root, combine_polynomes, ((left, (a_b, d, l5, True)),
  65. (right, (a_b, d, l7, True))))])
  66. left, right = root = tree('c(a+b)^d + c(a+b)^d')
  67. self.assertEqual(left, right)
  68. self.assertEqualPos(match_combine_factors(root),
  69. [P(root, combine_polynomes, ((left, (left[0], c, d, True)),
  70. (right, (right[0], c, d, True))))])