Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | import unittest |
2 | from test.test_support import run_unittest, TESTFN | |
3 | import glob | |
4 | import os | |
5 | ||
6 | def mkdirs(fname): | |
7 | if os.path.exists(fname) or fname == '': | |
8 | return | |
9 | base, file = os.path.split(fname) | |
10 | mkdirs(base) | |
11 | os.mkdir(fname) | |
12 | ||
13 | def touchfile(fname): | |
14 | base, file = os.path.split(fname) | |
15 | mkdirs(base) | |
16 | f = open(fname, 'w') | |
17 | f.close() | |
18 | ||
19 | def deltree(fname): | |
20 | for f in os.listdir(fname): | |
21 | fullname = os.path.join(fname, f) | |
22 | if os.path.isdir(fullname): | |
23 | deltree(fullname) | |
24 | else: | |
25 | try: | |
26 | os.unlink(fullname) | |
27 | except: | |
28 | pass | |
29 | try: | |
30 | os.rmdir(fname) | |
31 | except: | |
32 | pass | |
33 | ||
34 | ||
35 | class GlobTests(unittest.TestCase): | |
36 | ||
37 | def norm(self, *parts): | |
38 | return os.path.normpath(os.path.join(self.tempdir, *parts)) | |
39 | ||
40 | def mktemp(self, *parts): | |
41 | touchfile(self.norm(*parts)) | |
42 | ||
43 | def setUp(self): | |
44 | self.tempdir = TESTFN+"_dir" | |
45 | self.mktemp('a', 'D') | |
46 | self.mktemp('aab', 'F') | |
47 | self.mktemp('aaa', 'zzzF') | |
48 | self.mktemp('ZZZ') | |
49 | self.mktemp('a', 'bcd', 'EF') | |
50 | self.mktemp('a', 'bcd', 'efg', 'ha') | |
51 | if hasattr(os, 'symlink'): | |
52 | os.symlink(self.norm('broken'), self.norm('sym1')) | |
53 | os.symlink(self.norm('broken'), self.norm('sym2')) | |
54 | ||
55 | def tearDown(self): | |
56 | deltree(self.tempdir) | |
57 | ||
58 | def glob(self, *parts): | |
59 | if len(parts) == 1: | |
60 | pattern = parts[0] | |
61 | else: | |
62 | pattern = os.path.join(*parts) | |
63 | p = os.path.join(self.tempdir, pattern) | |
64 | return glob.glob(p) | |
65 | ||
66 | def assertSequencesEqual_noorder(self, l1, l2): | |
67 | self.assertEqual(set(l1), set(l2)) | |
68 | ||
69 | def test_glob_literal(self): | |
70 | eq = self.assertSequencesEqual_noorder | |
71 | eq(self.glob('a'), [self.norm('a')]) | |
72 | eq(self.glob('a', 'D'), [self.norm('a', 'D')]) | |
73 | eq(self.glob('aab'), [self.norm('aab')]) | |
74 | eq(self.glob('zymurgy'), []) | |
75 | ||
76 | def test_glob_one_directory(self): | |
77 | eq = self.assertSequencesEqual_noorder | |
78 | eq(self.glob('a*'), map(self.norm, ['a', 'aab', 'aaa'])) | |
79 | eq(self.glob('*a'), map(self.norm, ['a', 'aaa'])) | |
80 | eq(self.glob('aa?'), map(self.norm, ['aaa', 'aab'])) | |
81 | eq(self.glob('aa[ab]'), map(self.norm, ['aaa', 'aab'])) | |
82 | eq(self.glob('*q'), []) | |
83 | ||
84 | def test_glob_nested_directory(self): | |
85 | eq = self.assertSequencesEqual_noorder | |
86 | if os.path.normcase("abCD") == "abCD": | |
87 | # case-sensitive filesystem | |
88 | eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF')]) | |
89 | else: | |
90 | # case insensitive filesystem | |
91 | eq(self.glob('a', 'bcd', 'E*'), [self.norm('a', 'bcd', 'EF'), | |
92 | self.norm('a', 'bcd', 'efg')]) | |
93 | eq(self.glob('a', 'bcd', '*g'), [self.norm('a', 'bcd', 'efg')]) | |
94 | ||
95 | def test_glob_directory_names(self): | |
96 | eq = self.assertSequencesEqual_noorder | |
97 | eq(self.glob('*', 'D'), [self.norm('a', 'D')]) | |
98 | eq(self.glob('*', '*a'), []) | |
99 | eq(self.glob('a', '*', '*', '*a'), | |
100 | [self.norm('a', 'bcd', 'efg', 'ha')]) | |
101 | eq(self.glob('?a?', '*F'), map(self.norm, [os.path.join('aaa', 'zzzF'), | |
102 | os.path.join('aab', 'F')])) | |
103 | ||
104 | def test_glob_broken_symlinks(self): | |
105 | if hasattr(os, 'symlink'): | |
106 | eq = self.assertSequencesEqual_noorder | |
107 | eq(self.glob('sym*'), [self.norm('sym1'), self.norm('sym2')]) | |
108 | eq(self.glob('sym1'), [self.norm('sym1')]) | |
109 | eq(self.glob('sym2'), [self.norm('sym2')]) | |
110 | ||
111 | ||
112 | def test_main(): | |
113 | run_unittest(GlobTests) | |
114 | ||
115 | ||
116 | if __name__ == "__main__": | |
117 | test_main() |