14
14
# You should have received a copy of the GNU General Public License
15
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
18
from bzrlib.globbing import (
23
21
from bzrlib.tests import (
117
115
[u'a', u'q', u'f'],
118
116
[u'A', u'Q', u'F']),
120
118
[u'A', u'Q', u'F'],
121
119
[u'a', u'q', u'f']),
123
121
[u'Afoo', u'.foo'],
124
122
[u'afoo', u'ABfoo']),
126
124
[u'fooAbar', u'foo.bar'],
128
(u'[\x20-\x30\u8336]',
126
(ur'[\x20-\x30\u8336]',
129
127
[u'\040', u'\044', u'\u8336'],
131
(u'[^\x20-\x30\u8336]',
129
(ur'[^\x20-\x30\u8336]',
133
131
[u'\040', u'\044', u'\u8336']),
136
134
def test_regex(self):
137
135
self.assertMatch([
139
[u'a', u'b', u'ccc'],
140
[u'd', u'aa', u'c+', u'-a']),
142
[u'a', u'b', u'ccc'],
143
[u'd', u'aa', u'c+', u'-a']),
144
(u'RE:(?P<a>.)(?P=a)',
137
[u'a', u'b', u'ccc'],
138
[u'd', u'aa', u'c+', u'-a']),
140
[u'a', u'b', u'ccc'],
141
[u'd', u'aa', u'c+', u'-a']),
142
(ur'RE:(?P<a>.)(?P=a)',
146
144
[u'ab', u'aa', u'aaa']),
147
# test we can handle odd numbers of trailing backslashes
150
[u'a', u'ab', u'aa', u'aaa']),
153
147
def test_question_mark(self):
172
166
[u'foo/x', u'foo/bax', u'foo/a.x', u'foo/.x', u'foo/.q.x'],
173
167
[u'foo/bar/bax']),
175
[u'\u8336/x', u'foo/x', u'foo/bax', u'x/a.x', u'.foo/x',
169
[u'\u8336/x', u'foo/x', u'foo/bax', u'x/a.x', u'.foo/x',
176
170
u'\u8336/.x', u'foo/.q.x'],
177
171
[u'foo/bar/bax']),
179
173
[u'foo', u'foo.bar'],
180
174
[u'.foo', u'foo/bar', u'foo/.bar']),
182
[u'bar', u'foobar', ur'foo\nbar', u'foo.bar', u'foo/bar',
176
[u'bar', u'foobar', ur'foo\nbar', u'foo.bar', u'foo/bar',
183
177
u'foo/foobar', u'foo/f.bar', u'.bar', u'foo/.bar'],
192
186
[u'foox', u'foo/bax', u'foo/.x', u'foo/bar/bax']),
194
188
[u'bar', u'foo/bar'],
195
[u'foobar', u'foo.bar', u'foo/foobar', u'foo/f.bar',
189
[u'foobar', u'foo.bar', u'foo/foobar', u'foo/f.bar',
196
190
u'.bar', u'foo/.bar']),
197
191
# check that we ignore extra *s, so *** is treated like ** not *.
200
194
[u'foox', u'foo/bax', u'foo/.x', u'foo/bar/bax']),
202
196
[u'bar', u'foo/bar'],
203
[u'foobar', u'foo.bar', u'foo/foobar', u'foo/f.bar',
197
[u'foobar', u'foo.bar', u'foo/foobar', u'foo/f.bar',
204
198
u'.bar', u'foo/.bar']),
205
199
# the remaining tests check that ** is interpreted as *
206
200
# unless it is a whole path component
217
211
[u'foo', u'foo.bar'],
218
212
[u'.foo', u'foo/bar', u'foo/.bar']),
220
[u'bar', u'foobar', ur'foo\nbar', u'foo.bar', u'foo/bar',
214
[u'bar', u'foobar', ur'foo\nbar', u'foo.bar', u'foo/bar',
221
215
u'foo/foobar', u'foo/f.bar', u'.bar', u'foo/.bar'],
232
226
[u'foo/bar', u'foo/.bar', u'x/foo/y']),
235
def test_backslash(self):
239
[u'\u8336/foo', u'barfoo', u'x/y/foo']),
242
[u'foo/bar', u'foo/.bar', u'x/foo/y']),
244
[u'foo/x', u'foo/bar/x'],
245
[u'foox', u'foo/bax', u'foo/.x', u'foo/bar/bax']),
248
def test_trailing_slash(self):
252
[u'\u8336/foo', u'barfoo', u'x/y/foo']),
255
[u'foo/', u'\u8336/foo', u'barfoo', u'x/y/foo']),
258
229
def test_leading_asterisk_dot(self):
259
230
self.assertMatch([
261
[u'foo/bar/baz.x', u'\u8336/Q.x', u'foo.y.x', u'.foo.x',
232
[u'foo/bar/baz.x', u'\u8336/Q.x', u'foo.y.x', u'.foo.x',
262
233
u'bar/.foo.x', u'.x',],
294
265
def test_large_globset(self):
295
266
"""tests that the globster can handle a large set of patterns.
297
Large is defined as more than supported by python regex groups,
268
Large is defined as more than supported by python regex groups,
299
270
This test assumes the globs are broken into regexs containing 99
307
278
self.assertEqual(patterns[x],globster.match(filename))
308
279
self.assertEqual(None,globster.match('foobar.300'))
311
class TestOrderedGlobster(TestCase):
313
def test_ordered_globs(self):
314
"""test that the first match in a list is the one found"""
315
patterns = [ u'*.foo', u'bar.*']
316
globster = _OrderedGlobster(patterns)
317
self.assertEqual(u'*.foo', globster.match('bar.foo'))
318
self.assertEqual(None, globster.match('foo.bar'))
319
globster = _OrderedGlobster(reversed(patterns))
320
self.assertEqual(u'bar.*', globster.match('bar.foo'))
321
self.assertEqual(None, globster.match('foo.bar'))
324
class TestNormalizePattern(TestCase):
326
def test_backslashes(self):
327
"""tests that backslashes are converted to forward slashes, multiple
328
backslashes are collapsed to single forward slashes and trailing
329
backslashes are removed"""
330
self.assertEqual(u'/', normalize_pattern(u'\\'))
331
self.assertEqual(u'/', normalize_pattern(u'\\\\'))
332
self.assertEqual(u'/foo/bar', normalize_pattern(u'\\foo\\bar'))
333
self.assertEqual(u'foo/bar', normalize_pattern(u'foo\\bar\\'))
334
self.assertEqual(u'/foo/bar', normalize_pattern(u'\\\\foo\\\\bar\\\\'))
336
def test_forward_slashes(self):
337
"""tests that multiple foward slashes are collapsed to single forward
338
slashes and trailing forward slashes are removed"""
339
self.assertEqual(u'/', normalize_pattern(u'/'))
340
self.assertEqual(u'/', normalize_pattern(u'//'))
341
self.assertEqual(u'/foo/bar', normalize_pattern(u'/foo/bar'))
342
self.assertEqual(u'foo/bar', normalize_pattern(u'foo/bar/'))
343
self.assertEqual(u'/foo/bar', normalize_pattern(u'//foo//bar//'))
345
def test_mixed_slashes(self):
346
"""tests that multiple mixed slashes are collapsed to single forward
347
slashes and trailing mixed slashes are removed"""
348
self.assertEqual(u'/foo/bar', normalize_pattern(u'\\/\\foo//\\///bar/\\\\/'))