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

This commit is contained in:
Serhiy Storchaka 2017-05-21 08:57:00 +03:00 committed by GitHub
parent 62c7d90b64
commit 817554715b

View file

@ -1,18 +1,19 @@
"""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):
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):
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):
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__":