Commit 81755471 authored by Serhiy Storchaka's avatar Serhiy Storchaka Committed by GitHub

bpo-30415: Add new tests for the fnmatch module. (#1684)

parent 62c7d90b
"""Test cases for the fnmatch module.""" """Test cases for the fnmatch module."""
import unittest import unittest
import os
from fnmatch import fnmatch, fnmatchcase, translate, filter from fnmatch import fnmatch, fnmatchcase, translate, filter
class FnmatchTestCase(unittest.TestCase): class FnmatchTestCase(unittest.TestCase):
def check_match(self, filename, pattern, should_match=1, fn=fnmatch): def check_match(self, filename, pattern, should_match=True, fn=fnmatch):
if should_match: if should_match:
self.assertTrue(fn(filename, pattern), self.assertTrue(fn(filename, pattern),
"expected %r to match pattern %r" "expected %r to match pattern %r"
% (filename, pattern)) % (filename, pattern))
else: else:
self.assertTrue(not fn(filename, pattern), self.assertFalse(fn(filename, pattern),
"expected %r not to match pattern %r" "expected %r not to match pattern %r"
% (filename, pattern)) % (filename, pattern))
...@@ -26,15 +27,15 @@ class FnmatchTestCase(unittest.TestCase): ...@@ -26,15 +27,15 @@ class FnmatchTestCase(unittest.TestCase):
check('abc', '*') check('abc', '*')
check('abc', 'ab[cd]') check('abc', 'ab[cd]')
check('abc', 'ab[!de]') check('abc', 'ab[!de]')
check('abc', 'ab[de]', 0) check('abc', 'ab[de]', False)
check('a', '??', 0) check('a', '??', False)
check('a', 'b', 0) check('a', 'b', False)
# these test that '\' is handled correctly in character sets; # these test that '\' is handled correctly in character sets;
# see SF bug #409651 # see SF bug #409651
check('\\', r'[\]') check('\\', r'[\]')
check('a', r'[!\]') check('a', r'[!\]')
check('\\', r'[!\]', 0) check('\\', r'[!\]', False)
# test that filenames with newlines in them are handled correctly. # test that filenames with newlines in them are handled correctly.
# http://bugs.python.org/issue6665 # http://bugs.python.org/issue6665
...@@ -51,14 +52,38 @@ class FnmatchTestCase(unittest.TestCase): ...@@ -51,14 +52,38 @@ class FnmatchTestCase(unittest.TestCase):
def test_fnmatchcase(self): def test_fnmatchcase(self):
check = self.check_match check = self.check_match
check('AbC', 'abc', 0, fnmatchcase) check('abc', 'abc', True, fnmatchcase)
check('abc', 'AbC', 0, fnmatchcase) check('AbC', 'abc', False, fnmatchcase)
check('abc', 'AbC', False, fnmatchcase)
check('AbC', 'AbC', True, fnmatchcase)
check('usr/bin', 'usr/bin', True, fnmatchcase)
check('usr\\bin', 'usr/bin', False, fnmatchcase)
check('usr/bin', 'usr\\bin', False, fnmatchcase)
check('usr\\bin', 'usr\\bin', True, fnmatchcase)
def test_bytes(self): def test_bytes(self):
self.check_match(b'test', b'te*') self.check_match(b'test', b'te*')
self.check_match(b'test\xff', b'te*\xff') self.check_match(b'test\xff', b'te*\xff')
self.check_match(b'foo\nbar', b'foo*') self.check_match(b'foo\nbar', b'foo*')
def test_case(self):
ignorecase = os.path.normcase('ABC') == os.path.normcase('abc')
check = self.check_match
check('abc', 'abc')
check('AbC', 'abc', ignorecase)
check('abc', 'AbC', ignorecase)
check('AbC', 'AbC')
def test_sep(self):
normsep = os.path.normcase('\\') == os.path.normcase('/')
check = self.check_match
check('usr/bin', 'usr/bin')
check('usr\\bin', 'usr/bin', normsep)
check('usr/bin', 'usr\\bin', normsep)
check('usr\\bin', 'usr\\bin')
class TranslateTestCase(unittest.TestCase): class TranslateTestCase(unittest.TestCase):
def test_translate(self): def test_translate(self):
...@@ -75,7 +100,28 @@ class TranslateTestCase(unittest.TestCase): ...@@ -75,7 +100,28 @@ class TranslateTestCase(unittest.TestCase):
class FilterTestCase(unittest.TestCase): class FilterTestCase(unittest.TestCase):
def test_filter(self): def test_filter(self):
self.assertEqual(filter(['a', 'b'], 'a'), ['a']) self.assertEqual(filter(['Python', 'Ruby', 'Perl', 'Tcl'], 'P*'),
['Python', 'Perl'])
self.assertEqual(filter([b'Python', b'Ruby', b'Perl', b'Tcl'], b'P*'),
[b'Python', b'Perl'])
def test_mix_bytes_str(self):
self.assertRaises(TypeError, filter, ['test'], b'*')
self.assertRaises(TypeError, filter, [b'test'], '*')
def test_case(self):
ignorecase = os.path.normcase('P') == os.path.normcase('p')
self.assertEqual(filter(['Test.py', 'Test.rb', 'Test.PL'], '*.p*'),
['Test.py', 'Test.PL'] if ignorecase else ['Test.py'])
self.assertEqual(filter(['Test.py', 'Test.rb', 'Test.PL'], '*.P*'),
['Test.py', 'Test.PL'] if ignorecase else ['Test.PL'])
def test_sep(self):
normsep = os.path.normcase('\\') == os.path.normcase('/')
self.assertEqual(filter(['usr/bin', 'usr', 'usr\\lib'], 'usr/*'),
['usr/bin', 'usr\\lib'] if normsep else ['usr/bin'])
self.assertEqual(filter(['usr/bin', 'usr', 'usr\\lib'], 'usr\\*'),
['usr/bin', 'usr\\lib'] if normsep else ['usr\\lib'])
if __name__ == "__main__": if __name__ == "__main__":
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment