]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blob - parser/test_parser.py
Change grammar to support priority of operation
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / test_parser.py
1 #! /usr/bin/env python
2
3
4 import unittest
5 from grako.exceptions import FailedParse
6
7
8 class TestParser(unittest.TestCase):
9     def test_01_import(self):
10         global parser, TagsSemantics
11         from parser import TagsParser
12         from build_ast import TagsSemantics
13         parser = TagsParser(parseinfo=False)
14
15     def _parse(self, input):
16         return parser.parse(input, semantics=TagsSemantics())
17
18     def test_02_tag(self):
19         self.assertEqual(self._parse('xxx'), ('NAME', 'xxx'))
20
21     def test_03_bad_tag(self):
22         self.assertRaises(FailedParse, self._parse, 'XXX')
23
24     def test_04_expression(self):
25         self.assertEqual(self._parse('!(xxx&yyy)'),
26             ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
27         )
28         self.assertEqual(self._parse('!(xxx & yyy)'),
29             ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
30         )
31         self.assertEqual(self._parse('!xxx&yyy&zzz|ooo'),
32             ('OR', ('AND',
33                 ('NOT', ('NAME', 'xxx')),
34                 ('AND', ('NAME', 'yyy'), ('NAME', 'zzz'))),
35             ('NAME', 'ooo'))
36         )
37         self.assertEqual(self._parse('!(xxx &&  yyy)'),
38             ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
39         )
40         self.assertEqual(self._parse('!(xxx || yyy)'),
41             ('NOT', ('PARENS', ('OR', ('NAME', 'xxx'), ('NAME', 'yyy'))))
42         )
43         self.assertEqual(self._parse('xxx and yyy'),
44             ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))
45         )
46         self.assertEqual(self._parse('xxx or  yyy'),
47             ('OR', ('NAME', 'xxx'), ('NAME', 'yyy'))
48         )
49         self.assertEqual(self._parse('xxx OR yyy'),
50             ('OR', ('NAME', 'xxx'), ('NAME', 'yyy'))
51         )
52         self.assertEqual(self._parse('not xxx'),
53             ('NOT', ('NAME', 'xxx'))
54         )
55         self.assertEqual(self._parse('NOT xxx'),
56             ('NOT', ('NAME', 'xxx'))
57         )
58
59     def test_05_bad_expression(self):
60         self.assertRaises(FailedParse, self._parse, '!(xxx&yyy')
61
62 if __name__ == "__main__":
63     unittest.main()