test_parser.py 2.1 KB

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