1"""Test cases for the fnmatch module."""
2
3from test import test_support
4import unittest
5
6from fnmatch import fnmatch, fnmatchcase, _MAXCACHE, _cache
7from fnmatch import fnmatch, fnmatchcase, _MAXCACHE, _cache, _purge
8
9
10class FnmatchTestCase(unittest.TestCase):
11
12    def tearDown(self):
13        _purge()
14
15    def check_match(self, filename, pattern, should_match=1, fn=fnmatch):
16        if should_match:
17            self.assertTrue(fn(filename, pattern),
18                         "expected %r to match pattern %r"
19                         % (filename, pattern))
20        else:
21            self.assertTrue(not fn(filename, pattern),
22                         "expected %r not to match pattern %r"
23                         % (filename, pattern))
24
25    def test_fnmatch(self):
26        check = self.check_match
27        check('abc', 'abc')
28        check('abc', '?*?')
29        check('abc', '???*')
30        check('abc', '*???')
31        check('abc', '???')
32        check('abc', '*')
33        check('abc', 'ab[cd]')
34        check('abc', 'ab[!de]')
35        check('abc', 'ab[de]', 0)
36        check('a', '??', 0)
37        check('a', 'b', 0)
38
39        # these test that '\' is handled correctly in character sets;
40        # see SF bug #409651
41        check('\\', r'[\]')
42        check('a', r'[!\]')
43        check('\\', r'[!\]', 0)
44
45        # test that filenames with newlines in them are handled correctly.
46        # http://bugs.python.org/issue6665
47        check('foo\nbar', 'foo*')
48        check('foo\nbar\n', 'foo*')
49        check('\nfoo', 'foo*', False)
50        check('\n', '*')
51
52    def test_fnmatchcase(self):
53        check = self.check_match
54        check('AbC', 'abc', 0, fnmatchcase)
55        check('abc', 'AbC', 0, fnmatchcase)
56
57    def test_cache_clearing(self):
58        # check that caches do not grow too large
59        # http://bugs.python.org/issue7846
60
61        # string pattern cache
62        for i in range(_MAXCACHE + 1):
63            fnmatch('foo', '?' * i)
64
65        self.assertLessEqual(len(_cache), _MAXCACHE)
66
67def test_main():
68    test_support.run_unittest(FnmatchTestCase)
69
70
71if __name__ == "__main__":
72    test_main()
73