]> git.phdru.name Git - phdru.name/cgi-bin/blog-ru/search-tags.git/blobdiff - parser/test_parser.py
Docs(TODO): Try Pyleri
[phdru.name/cgi-bin/blog-ru/search-tags.git] / parser / test_parser.py
index d7363c019b09a1a4bfd9df87c5577122de8ab17d..8783de50367b714a6d29fec923024f111a3c64b6 100755 (executable)
@@ -1,38 +1,69 @@
 #! /usr/bin/env python
 
 import unittest
+from lark import ParseError
+from parser import parse
 
 class TestParser(unittest.TestCase):
-    def test_01_import(self):
-        global parser
-        from parser import parser
+    def _parse(self, input):
+        return parse(input)
 
     def test_02_tag(self):
-        self.assertEqual(parser.parse('xxx'), ('NAME', 'xxx'))
+        self.assertEqual(self._parse('xxx'), ('NAME', 'xxx'))
 
     def test_03_bad_tag(self):
-        from ply.lex import LexError
-        self.assertRaises(LexError, parser.parse, 'XXX')
+        self.assertRaises(ParseError, self._parse, 'XXX')
 
     def test_04_expression(self):
-        self.assertEqual(parser.parse('!(xxx&yyy)'),
+        self.assertEqual(self._parse('!(xxx&yyy)'),
             ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
         )
-        self.assertEqual(parser.parse('!(xxx & yyy)'),
+        self.assertEqual(self._parse('!(xxx & yyy)'),
             ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
         )
-        self.assertEqual(parser.parse('!xxx&yyy&zzz|ooo'),
-            ('OR', ('AND', ('AND', ('NOT', ('NAME', 'xxx')), ('NAME', 'yyy')), ('NAME', 'zzz')), ('NAME', 'ooo'))
+        self.assertEqual(self._parse('!xxx&yyy&zzz|ooo'),
+            ('OR', ('AND',
+                ('NOT', ('NAME', 'xxx')),
+                ('AND', ('NAME', 'yyy'), ('NAME', 'zzz'))),
+            ('NAME', 'ooo'))
         )
-        self.assertEqual(parser.parse('!(xxx &&  yyy)'),
+        self.assertEqual(self._parse('!(xxx &&  yyy)'),
             ('NOT', ('PARENS', ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))))
         )
-        self.assertEqual(parser.parse('!(xxx || yyy)'),
+        self.assertEqual(self._parse('!(xxx || yyy)'),
             ('NOT', ('PARENS', ('OR', ('NAME', 'xxx'), ('NAME', 'yyy'))))
         )
+        self.assertEqual(self._parse('xxx and yyy'),
+            ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))
+        )
+        self.assertEqual(self._parse('xxx or  yyy'),
+            ('OR', ('NAME', 'xxx'), ('NAME', 'yyy'))
+        )
+        self.assertEqual(self._parse('xxx OR yyy'),
+            ('OR', ('NAME', 'xxx'), ('NAME', 'yyy'))
+        )
+        self.assertEqual(self._parse('not xxx'),
+            ('NOT', ('NAME', 'xxx'))
+        )
+        self.assertEqual(self._parse('NOT xxx'),
+            ('NOT', ('NAME', 'xxx'))
+        )
+        self.assertEqual(self._parse('NOT (xxx & yyy) AND zzz | ooo'),
+            ('OR',
+                ('AND',
+                    ('NOT',
+                        ('PARENS',
+                            ('AND', ('NAME', 'xxx'), ('NAME', 'yyy'))
+                        )
+                    ),
+                    ('NAME', 'zzz')
+                ),
+                ('NAME', 'ooo')
+            )
+        )
 
     def test_05_bad_expression(self):
-        self.assertIs(parser.parse('!(xxx&yyy'), None)
+        self.assertRaises(ParseError, self._parse, '!(xxx&yyy')
 
 if __name__ == "__main__":
     unittest.main()