test_rules_poly.py 3.9 KB

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