test_parser.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. # vim: set fileencoding=utf-8 :
  2. import unittest
  3. from src.parser import Parser
  4. from src.node import ExpressionNode as Node, ExpressionLeaf as Leaf, \
  5. SPECIAL_TOKENS
  6. from tests.parser import ParserWrapper, run_expressions, line, graph
  7. from tests.rulestestcase import tree
  8. from src.rules.goniometry import sin, cos
  9. from src.rules.derivatives import der
  10. from src.rules.logarithmic import log, ln
  11. from src.rules.integrals import integral
  12. class TestParser(unittest.TestCase):
  13. def test_constructor(self):
  14. node = Node('+', Leaf(1), Leaf(4))
  15. self.assertEqual(ParserWrapper(Parser).run(['1 + 4']), node)
  16. def test_identifiers(self):
  17. run_expressions(Parser, [('a', Leaf('a'))])
  18. def test_graph(self):
  19. self.assertEqual(graph(Parser, '4a'), ("""
  20. *
  21. ╭┴╮
  22. 4 a
  23. """).replace('\n ', '\n')[1:-1])
  24. def test_line(self):
  25. self.assertEqual(line(Parser, '4-a'), '4 - a')
  26. def test_reset_after_failure(self):
  27. parser = ParserWrapper(Parser)
  28. parser.run(['-(3a+6b)'])
  29. possibilities1 = parser.parser.possibilities
  30. self.assertNotEqual(possibilities1, [])
  31. parser.run(['5+2*6'])
  32. possibilities2 = parser.parser.possibilities
  33. self.assertNotEqual(possibilities2, [])
  34. self.assertNotEqual(possibilities1, possibilities2)
  35. def test_moved_negation(self):
  36. a, b = tree('a,b')
  37. self.assertEqual(tree('-ab'), (-a) * b)
  38. self.assertEqual(tree('-(ab)'), (-a) * b)
  39. self.assertEqual(tree('-a / b'), (-a) / b)
  40. self.assertEqual(tree('-(a / b)'), (-a) / b)
  41. def test_functions(self):
  42. x = tree('x')
  43. self.assertEqual(tree('sin x'), sin(x))
  44. self.assertEqual(tree('sin 2 x'), sin(2) * x) # FIXME: correct?
  45. self.assertEqual(tree('sin x ^ 2'), sin(x ** 2))
  46. self.assertEqual(tree('sin(x) ^ 2'), sin(x) ** 2)
  47. self.assertEqual(tree('sin(x ^ 2)'), sin(x ** 2))
  48. self.assertEqual(tree('sin cos x'), sin(cos(x)))
  49. self.assertEqual(tree('sin cos x ^ 2'), sin(cos(x ** 2)))
  50. self.assertEqual(tree('sin cos(x) ^ 2'), sin(cos(x) ** 2))
  51. def test_bracket_derivative(self):
  52. x = tree('x')
  53. self.assertEqual(tree('[x]\''), der(x))
  54. self.assertEqual(tree('[x]\'\''), der(der(x)))
  55. def test_delta_derivative(self):
  56. exp, x, d = tree('x ^ 2, x, d')
  57. self.assertEqual(tree('d/dx x ^ 2'), der(exp, x))
  58. self.assertEqual(tree('d / dx x ^ 2'), der(exp, x))
  59. self.assertEqual(tree('d/dx x ^ 2 + x'), der(exp + x, x))
  60. self.assertEqual(tree('(d/dx x ^ 2) + x'), der(exp, x) + x)
  61. self.assertEqual(tree('d/d'), d / d)
  62. # FIXME: self.assertEqual(tree('d(x ^ 2)/dx'), der(exp, x))
  63. def test_logarithm(self):
  64. x, g = tree('x, g')
  65. self.assertEqual(tree('log(x, e)'), ln(x))
  66. self.assertEqual(tree('log(x, 10)'), log(x))
  67. self.assertEqual(tree('log(x, 2)'), log(x, 2))
  68. self.assertEqual(tree('log(x, g)'), log(x, g))
  69. self.assertEqual(tree('log_2(x)'), log(x, 2))
  70. self.assertEqual(tree('log_10(x)'), log(x))
  71. self.assertEqual(tree('log_g(x)'), log(x, g))
  72. self.assertEqual(tree('log_g x'), log(x, g))
  73. def test_special_tokens(self):
  74. for token in SPECIAL_TOKENS:
  75. self.assertEqual(tree(token), Leaf(token))
  76. a, t = Leaf('a'), Leaf(token)
  77. self.assertEqual(tree('a' + token), a * t)
  78. # FIXME: self.assertEqual(tree('a' + token + 'a'), a * t * a)
  79. def test_integral(self):
  80. x, y, dx, a, b = tree('x, y, dx, a, b')
  81. self.assertEqual(tree('int x'), integral(x, x))
  82. self.assertEqual(tree('int x2'), integral(x ** 2, x))
  83. self.assertEqual(tree('int x2 dx'), integral(x ** 2, x))
  84. self.assertEqual(tree('int x2 dy'), integral(x ** 2, y))
  85. self.assertEqual(tree('int_a^b x2 dy'), integral(x ** 2, y, a, b))
  86. self.assertEqual(tree('int_(a-b)^(a+b) x2'),
  87. integral(x ** 2, x, a - b, a + b))