test_node.py 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. from src.node import ExpressionNode as N, ExpressionLeaf as L, Scope, \
  2. nary_node, get_scope, OP_ADD
  3. from tests.rulestestcase import RulesTestCase, tree
  4. class TestNode(RulesTestCase):
  5. def setUp(self):
  6. self.l = [L(1), N('*', L(2), L(3)), L(4), L(5)]
  7. self.n, self.f = tree('a + b + cd,f')
  8. (self.a, self.b), self.cd = self.n
  9. self.c, self.d = self.cd
  10. self.scope = Scope(self.n)
  11. def test___lt__(self):
  12. self.assertTrue(L(1) < L(2))
  13. self.assertFalse(L(1) < L(1))
  14. self.assertFalse(L(2) < L(1))
  15. self.assertTrue(L(2) < N('+', L(1), L(2)))
  16. self.assertFalse(N('+', L(1), L(2)) < L(1))
  17. self.assertTrue(N('^', L('a'), L(2)) < N('^', L('a'), L(3)))
  18. self.assertTrue(N('^', L(2), L('a')) < N('^', L(3), L('a')))
  19. self.assertTrue(N('*', L(2), N('^', L('a'), L('b')))
  20. < N('*', L(3), N('^', L('a'), L('b'))))
  21. self.assertFalse(N('^', L('a'), L(3)) < N('^', L('a'), L(2)))
  22. def test_is_op(self):
  23. self.assertTrue(N('+', *self.l[:2]).is_op(OP_ADD))
  24. self.assertFalse(N('-', *self.l[:2]).is_op(OP_ADD))
  25. def test_is_leaf(self):
  26. self.assertTrue(L(2).is_leaf)
  27. self.assertFalse(N('+', *self.l[:2]).is_leaf)
  28. def test_is_power(self):
  29. self.assertTrue(N('^', *self.l[2:]).is_power())
  30. self.assertFalse(N('+', *self.l[2:]).is_power())
  31. def test_is_power_exponent(self):
  32. self.assertTrue(N('^', *self.l[2:]).is_power(5))
  33. self.assertFalse(N('^', *self.l[2:]).is_power(2))
  34. def test_is_nary(self):
  35. self.assertTrue(N('+', *self.l[:2]).is_nary())
  36. self.assertTrue(N('-', *self.l[:2]).is_nary())
  37. self.assertTrue(N('*', *self.l[:2]).is_nary())
  38. self.assertFalse(N('^', *self.l[:2]).is_nary())
  39. def test_is_identifier(self):
  40. self.assertTrue(L('a').is_identifier())
  41. self.assertFalse(L(1).is_identifier())
  42. def test_is_int(self):
  43. self.assertTrue(L(1).is_int())
  44. self.assertFalse(L(1.5).is_int())
  45. self.assertFalse(L('a').is_int())
  46. def test_is_float(self):
  47. self.assertTrue(L(1.5).is_float())
  48. self.assertFalse(L(1).is_float())
  49. self.assertFalse(L('a').is_float())
  50. def test_is_numeric(self):
  51. self.assertTrue(L(1).is_numeric())
  52. self.assertTrue(L(1.5).is_numeric())
  53. self.assertFalse(L('a').is_numeric())
  54. def test_extract_polynome_properties_identifier(self):
  55. self.assertEqual(L('a').extract_polynome_properties(),
  56. (L(1), L('a'), L(1)))
  57. def test_extract_polynome_properties_None(self):
  58. self.assertIsNone(N('+').extract_polynome_properties())
  59. def test_extract_polynome_properties_power(self):
  60. power = N('^', L('a'), L(2))
  61. self.assertEqual(power.extract_polynome_properties(),
  62. (L(1), L('a'), L(2)))
  63. def test_extract_polynome_properties_coefficient_exponent_int(self):
  64. times = N('*', L(3), N('^', L('a'), L(2)))
  65. self.assertEqual(times.extract_polynome_properties(),
  66. (L(3), L('a'), L(2)))
  67. def test_extract_polynome_properties_coefficient_exponent_id(self):
  68. times = N('*', L(3), N('^', L('a'), L('b')))
  69. self.assertEqual(times.extract_polynome_properties(),
  70. (L(3), L('a'), L('b')))
  71. def test_get_scope_binary(self):
  72. plus = N('+', *self.l[:2])
  73. self.assertEqual(get_scope(plus), self.l[:2])
  74. def test_get_scope_nested_left(self):
  75. plus = N('+', N('+', *self.l[:2]), self.l[2])
  76. self.assertEqual(get_scope(plus), self.l[:3])
  77. def test_get_scope_nested_right(self):
  78. plus = N('+', self.l[0], N('+', *self.l[1:3]))
  79. self.assertEqual(get_scope(plus), self.l[:3])
  80. def test_get_scope_nested_deep(self):
  81. plus = N('+', N('+', N('+', *self.l[:2]), self.l[2]), self.l[3])
  82. self.assertEqual(get_scope(plus), self.l)
  83. def test_equals_node_leaf(self):
  84. a, b = plus = tree('a + b')
  85. self.assertFalse(a.equals(plus))
  86. self.assertFalse(plus.equals(a))
  87. def test_equals_other_op(self):
  88. plus, mul = tree('a + b, a * b')
  89. self.assertFalse(plus.equals(mul))
  90. def test_equals_add(self):
  91. p0, p1, p2, p3 = tree('a + b,a + b,b + a, a + c')
  92. self.assertTrue(p0.equals(p1))
  93. self.assertTrue(p0.equals(p2))
  94. self.assertFalse(p0.equals(p3))
  95. self.assertFalse(p2.equals(p3))
  96. def test_equals_mul(self):
  97. m0, m1, m2, m3 = tree('a * b,a * b,b * a, a * c')
  98. self.assertTrue(m0.equals(m1))
  99. self.assertTrue(m0.equals(m2))
  100. self.assertFalse(m0.equals(m3))
  101. self.assertFalse(m2.equals(m3))
  102. def test_equals_nary(self):
  103. p0, p1, p2, p3, p4 = \
  104. tree('a + b + c,a + c + b,b + a + c,b + c + a,a + b + d')
  105. self.assertTrue(p0.equals(p1))
  106. self.assertTrue(p0.equals(p2))
  107. self.assertTrue(p0.equals(p3))
  108. self.assertTrue(p1.equals(p2))
  109. self.assertTrue(p1.equals(p3))
  110. self.assertTrue(p2.equals(p3))
  111. self.assertFalse(p2.equals(p4))
  112. def test_equals_nary_mary(self):
  113. m0, m1 = tree('ab,2ab')
  114. self.assertFalse(m0.equals(m1))
  115. def test_equals_div(self):
  116. d0, d1, d2 = tree('a / b,a / b,b / a')
  117. self.assertTrue(d0.equals(d1))
  118. self.assertFalse(d0.equals(d2))
  119. def test_equals_neg(self):
  120. a0, a1 = tree('-a,a')
  121. self.assertFalse(a0.equals(a1))
  122. a0, a1 = tree('-a,-a')
  123. self.assertTrue(a0.equals(a1))
  124. m0, m1 = tree('-5 * -3,-5 * 6')
  125. self.assertFalse(m0.equals(m1))
  126. def test_equals_ignore_negation(self):
  127. p0, p1 = tree('-(a + b), a + b')
  128. self.assertTrue(p0.equals(p1, ignore_negation=True))
  129. a0, a1 = tree('-a,a')
  130. self.assertTrue(a0.equals(a1, ignore_negation=True))
  131. def test_scope___init__(self):
  132. self.assertEqual(self.scope.node, self.n)
  133. self.assertEqual(self.scope.nodes, [self.a, self.b, self.cd])
  134. def test_scope_remove_leaf(self):
  135. self.scope.remove(self.b)
  136. self.assertEqual(self.scope.nodes, [self.a, self.cd])
  137. def test_scope_remove_node(self):
  138. self.scope.remove(self.cd)
  139. self.assertEqual(self.scope.nodes, [self.a, self.b])
  140. def test_scope_remove_error(self):
  141. with self.assertRaises(ValueError):
  142. self.scope.remove(self.f)
  143. def test_scope_replace(self):
  144. self.scope.replace(self.cd, self.f)
  145. self.assertEqual(self.scope.nodes, [self.a, self.b, self.f])
  146. def test_nary_node(self):
  147. a, b, c, d = tree('a,b,c,d')
  148. self.assertEqualNodes(nary_node('+', [a]), a)
  149. self.assertEqualNodes(nary_node('+', [a, b]), N('+', a, b))
  150. self.assertEqualNodes(nary_node('+', [a, b, c]),
  151. N('+', N('+', a, b), c))
  152. self.assertEqualNodes(nary_node('+', [a, b, c, d]),
  153. N('+', N('+', N('+', a, b), c), d))
  154. def test_scope_as_nary_node(self):
  155. self.assertEqualNodes(self.scope.as_nary_node(), self.n)
  156. def test_scope_as_nary_node_negated(self):
  157. n = tree('-(a + b)')
  158. self.assertEqualNodes(Scope(n).as_nary_node(), n)
  159. self.assertEqualNodes(Scope(-n).as_nary_node(), -n)