[3.6] bpo-30415: Add new tests for the fnmatch module. (GH-1684) (#1694)

(cherry picked from commit 8175547)
This commit is contained in:
Serhiy Storchaka 2017-05-21 10:35:39 +03:00 committed by GitHub
parent b5bf7e85b7
commit cf5c1be8f6

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__":