test_parser.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  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. class TestParser(unittest.TestCase):
  9. def test_constructor(self):
  10. node = Node('+', Leaf(1), Leaf(4))
  11. self.assertEqual(ParserWrapper(Parser).run(['1 + 4']), node)
  12. def test_identifiers(self):
  13. run_expressions(Parser, [('a', Leaf('a'))])
  14. def test_graph(self):
  15. self.assertEqual(graph(Parser, '4a'), ("""
  16. *
  17. ╭┴╮
  18. 4 a
  19. """).replace('\n ', '\n')[1:-1])
  20. def test_line(self):
  21. self.assertEqual(line(Parser, '4-a'), '4 - a')
  22. def test_reset_after_failure(self):
  23. parser = ParserWrapper(Parser)
  24. parser.run(['-(3a+6b)'])
  25. possibilities1 = parser.parser.possibilities
  26. self.assertNotEqual(possibilities1, [])
  27. parser.run(['5+2*6'])
  28. possibilities2 = parser.parser.possibilities
  29. self.assertNotEqual(possibilities2, [])
  30. self.assertNotEqual(possibilities1, possibilities2)
  31. def test_functions(self):
  32. root, x = tree('sin x, x')
  33. self.assertEqual(root, sin(x))
  34. self.assertEqual(tree('sin x ^ 2'), sin(x) ** 2)
  35. self.assertEqual(tree('sin(x) ^ 2'), sin(x) ** 2)
  36. self.assertEqual(tree('sin (x) ^ 2'), sin(x) ** 2)
  37. self.assertEqual(tree('sin(x ^ 2)'), sin(x ** 2))
  38. self.assertEqual(tree('sin cos x'), sin(cos(x)))
  39. self.assertEqual(tree('sin cos x ^ 2'), sin(cos(x)) ** 2)