diff tests/test_match.py @ 297:141a3aa0b403

First version of converting a glob-style pattern to a regex
author Franz Glasner <fzglas.hg@dom66.de>
date Tue, 04 Mar 2025 01:52:18 +0100
parents ca293f708cb4
children 16a5c337fcb9
line wrap: on
line diff
--- a/tests/test_match.py	Sun Mar 02 22:54:40 2025 +0100
+++ b/tests/test_match.py	Tue Mar 04 01:52:18 2025 +0100
@@ -10,7 +10,8 @@
 import sys
 import unittest
 
-from cutils.util.glob import CharIter
+from cutils.util import PY2
+from cutils.util.glob import CharIter, glob_to_regexp
 
 
 class TestCharIter(unittest.TestCase):
@@ -63,5 +64,100 @@
         self.assertIsNone(it.peek())
 
 
+class TestGlobToRegexp(unittest.TestCase):
+
+    def test_empty(self):
+        self.assertEqual("", glob_to_regexp(""))
+
+    def test_question_mark(self):
+        self.assertEqual(".", glob_to_regexp("?"))
+
+    def test_single_star(self):
+        self.assertEqual("[^/]*", glob_to_regexp("*"))
+
+    def test_double_star(self):
+        self.assertEqual(".*", glob_to_regexp("**"))
+
+    def test_double_star_slash(self):
+        self.assertEqual("(?:.*/)?", glob_to_regexp("**/"))
+
+    def test_double_star_in_between(self):
+        if PY2:
+            # Python 2 escapes all alnum characters in re.escape()
+            self.assertEqual("part1\\/(?:.*/)?part2",
+                             glob_to_regexp("part1/**/part2"))
+        else:
+
+            self.assertEqual("part1/(?:.*/)?part2",
+                             glob_to_regexp("part1/**/part2"))
+
+    def test_double_start_in_between2(self):
+        if PY2:
+            # Python 2 escapes all alnum characters in re.escape()
+            self.assertEqual("part1\\/.*\\.py", glob_to_regexp("part1/**.py"))
+        else:
+            self.assertEqual("part1/.*\\.py", glob_to_regexp("part1/**.py"))
+
+    def test_bracket_simple(self):
+        self.assertEqual("[abc]", glob_to_regexp("[abc]"))
+
+    def test_bracket_simple_range(self):
+        self.assertEqual("[a-c]", glob_to_regexp("[a-c]"))
+
+    def test_bracket_with_special_chars(self):
+        self.assertEqual("[x*?!^]", glob_to_regexp("[x*?!^]"))
+
+    def test_bracket_simple_range_with_escape(self):
+        self.assertEqual("[\\\\-c]", glob_to_regexp("[\\-c]"))
+
+    def test_bracket_not_closed(self):
+        self.assertEqual("\\[a", glob_to_regexp("[a"))
+
+    def test_bracket_not_closed_escapes(self):
+        self.assertEqual("\\[a\\*\\?", glob_to_regexp("[a*?"))
+
+    def test_bracket_with_dash_as_first_character(self):
+        self.assertEqual("[\\-a]", glob_to_regexp("[-a]"))
+
+    def test_bracket_with_dash_as_last_character(self):
+        self.assertEqual("[a\\-]", glob_to_regexp("[a-]"))
+
+    def test_bracket_with_closing_bracket(self):
+        self.assertEqual("[\\]a]", glob_to_regexp("[]a]"))
+
+    def test_bracket_with_caret_as_first_character(self):
+        self.assertEqual("[\\^a]", glob_to_regexp("[^a]"))
+
+    def test_bracket_negating_with_dash_as_first_character(self):
+        self.assertEqual("[^\\-a]", glob_to_regexp("[!-a]"))
+
+    def test_bracket_negating_with_dash_as_last_character(self):
+        self.assertEqual("[^a\\-]", glob_to_regexp("[!a-]"))
+
+    def test_bracket_negating_with_closing_bracket(self):
+        self.assertEqual("[^\\]a]", glob_to_regexp("[!]a]"))
+
+    def test_bracket_negating_with_caret_as_first_character(self):
+        self.assertEqual("[^^a]", glob_to_regexp("[!^a]"))
+
+    def test_simple_escapes(self):
+        for c in "\\()[]{}*.?":
+            self.assertEqual("\\"+c, glob_to_regexp("\\"+c))
+
+    def test_simple_escapes_last_backslash(self):
+        self.assertEqual("\\\\", glob_to_regexp("\\"))
+
+    def test_auto_escapes(self):
+        for c in "*.?":
+            self.assertEqual("\\"+c, glob_to_regexp("\\"+c))
+
+    def test_group_simple(self):
+        self.assertEqual("(?:abc|def)", glob_to_regexp("{abc,def}"))
+
+    def test_group_complex_nested(self):
+        self.assertEqual("(?:abc|(?:[ABQ-Z]|[^A][^/]*))",
+                         glob_to_regexp("{abc,{[ABQ-Z],[!A]*}}"))
+
+
 if __name__ == "__main__":
     sys.exit(unittest.main())