test_parser.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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. from tests.parser import ParserWrapper, run_expressions, line, graph
  6. from tests.rulestestcase import tree
  7. from src.rules.goniometry import sin, cos
  8. from src.rules.derivatives import der
  9. from src.rules.logarithmic import log, ln
  10. class TestParser(unittest.TestCase):
  11. def test_constructor(self):
  12. node = Node('+', Leaf(1), Leaf(4))
  13. self.assertEqual(ParserWrapper(Parser).run(['1 + 4']), node)
  14. def test_identifiers(self):
  15. run_expressions(Parser, [('a', Leaf('a'))])
  16. def test_graph(self):
  17. self.assertEqual(graph(Parser, '4a'), ("""
  18. *
  19. ╭┴╮
  20. 4 a
  21. """).replace('\n ', '\n')[1:-1])
  22. def test_line(self):
  23. self.assertEqual(line(Parser, '4-a'), '4 - a')
  24. def test_reset_after_failure(self):
  25. parser = ParserWrapper(Parser)
  26. parser.run(['-(3a+6b)'])
  27. possibilities1 = parser.parser.possibilities
  28. self.assertNotEqual(possibilities1, [])
  29. parser.run(['5+2*6'])
  30. possibilities2 = parser.parser.possibilities
  31. self.assertNotEqual(possibilities2, [])
  32. self.assertNotEqual(possibilities1, possibilities2)
  33. def test_moved_negation(self):
  34. a, b = tree('a,b')
  35. self.assertEqual(tree('-ab'), (-a) * b)
  36. self.assertEqual(tree('-(ab)'), (-a) * b)
  37. self.assertEqual(tree('-a / b'), (-a) / b)
  38. self.assertEqual(tree('-(a / b)'), (-a) / b)
  39. def test_functions(self):
  40. x = tree('x')
  41. self.assertEqual(tree('sin x'), sin(x))
  42. self.assertEqual(tree('sin 2 x'), sin(2) * x) # FIXME: correct?
  43. self.assertEqual(tree('sin x ^ 2'), sin(x ** 2))
  44. self.assertEqual(tree('sin(x) ^ 2'), sin(x) ** 2)
  45. self.assertEqual(tree('sin(x ^ 2)'), sin(x ** 2))
  46. self.assertEqual(tree('sin cos x'), sin(cos(x)))
  47. self.assertEqual(tree('sin cos x ^ 2'), sin(cos(x ** 2)))
  48. self.assertEqual(tree('sin cos(x) ^ 2'), sin(cos(x) ** 2))
  49. def test_bracket_derivative(self):
  50. x = tree('x')
  51. self.assertEqual(tree('[x]\''), der(x))
  52. self.assertEqual(tree('[x]\'\''), der(der(x)))
  53. def test_delta_derivative(self):
  54. exp, x, d = tree('x ^ 2, x, d')
  55. self.assertEqual(tree('d/dx x ^ 2'), der(exp, x))
  56. self.assertEqual(tree('d / dx x ^ 2'), der(exp, x))
  57. self.assertEqual(tree('d/dx x ^ 2 + x'), der(exp, x) + x)
  58. self.assertEqual(tree('d/dx (x ^ 2 + x)'), der(exp + x, x))
  59. self.assertEqual(tree('d/d'), d / d)
  60. # FIXME: self.assertEqual(tree('d(x ^ 2)/dx'), der(exp, x))
  61. def test_logarithm(self):
  62. x, g = tree('x, g')
  63. self.assertEqual(tree('log(x, e)'), ln(x))
  64. self.assertEqual(tree('log(x, 10)'), log(x))
  65. self.assertEqual(tree('log(x, 2)'), log(x, 2))
  66. self.assertEqual(tree('log(x, g)'), log(x, g))
  67. self.assertEqual(tree('log_2(x)'), log(x, 2))
  68. self.assertEqual(tree('log_10(x)'), log(x))
  69. self.assertEqual(tree('log_g(x)'), log(x, g))
  70. self.assertEqual(tree('log_g x'), log(x, g))