Mercurial > hgrepos > Python > apps > py-cutils
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())
