~bzr-pqm/bzr/bzr.dev

4763.2.4 by John Arbash Meinel
merge bzr.2.1 in preparation for NEWS entry.
1
# Copyright (C) 2007-2010 Canonical Ltd
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
16
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
17
"""Tests for win32utils."""
18
2681.4.2 by Alexander Belchenko
test for get_app_path
19
import os
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
20
import sys
21
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
22
from bzrlib import (
23
    osutils,
24
    tests,
25
    win32utils,
26
    )
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
27
from bzrlib.tests import (
28
    Feature,
29
    TestCase,
30
    TestCaseInTempDir,
31
    TestSkipped,
32
    UnicodeFilenameFeature,
33
    )
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
34
from bzrlib.tests.features import backslashdir_feature
2681.4.2 by Alexander Belchenko
test for get_app_path
35
from bzrlib.win32utils import glob_expand, get_app_path
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
36
37
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
38
class _RequiredModuleFeature(Feature):
39
40
    def __init__(self, mod_name):
41
        self.mod_name = mod_name
42
        super(_RequiredModuleFeature, self).__init__()
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
43
44
    def _probe(self):
45
        try:
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
46
            __import__(self.mod_name)
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
47
            return True
48
        except ImportError:
49
            return False
50
51
    def feature_name(self):
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
52
        return self.mod_name
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
53
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
54
Win32RegistryFeature = _RequiredModuleFeature('_winreg')
55
CtypesFeature = _RequiredModuleFeature('ctypes')
56
Win32comShellFeature = _RequiredModuleFeature('win32com.shell')
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
57
58
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
59
# Tests
60
# -----
2617.5.6 by Kuno Meyer
Incorporated feedback from the mailinglist.
61
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
62
class TestWin32UtilsGlobExpand(TestCaseInTempDir):
2617.5.2 by Kuno Meyer
just reformatting
63
4789.20.1 by John Arbash Meinel
Updates to tests that were exercising filesystem globbing.
64
    _test_needs_features = []
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
65
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
66
    def test_empty_tree(self):
67
        self.build_tree([])
2617.5.2 by Kuno Meyer
just reformatting
68
        self._run_testset([
69
            [['a'], ['a']],
70
            [['?'], ['?']],
71
            [['*'], ['*']],
72
            [['a', 'a'], ['a', 'a']]])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
73
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
74
    def build_ascii_tree(self):
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
75
        self.build_tree(['a', 'a1', 'a2', 'a11', 'a.1',
76
                         'b', 'b1', 'b2', 'b3',
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
77
                         'c/', 'c/c1', 'c/c2',
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
78
                         'd/', 'd/d1', 'd/d2', 'd/e/', 'd/e/e1'])
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
79
80
    def build_unicode_tree(self):
81
        self.requireFeature(UnicodeFilenameFeature)
82
        self.build_tree([u'\u1234', u'\u1234\u1234', u'\u1235/',
83
                         u'\u1235/\u1235'])
84
85
    def test_tree_ascii(self):
86
        """Checks the glob expansion and path separation char
87
        normalization"""
88
        self.build_ascii_tree()
2617.5.2 by Kuno Meyer
just reformatting
89
        self._run_testset([
90
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
91
            [[u'a'], [u'a']],
92
            [[u'a', u'a' ], [u'a', u'a']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
93
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
94
            [[u'd'], [u'd']],
95
            [[u'd/'], [u'd/']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
96
2617.5.2 by Kuno Meyer
just reformatting
97
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
98
            [[u'a*'], [u'a', u'a1', u'a2', u'a11', u'a.1']],
99
            [[u'?'], [u'a', u'b', u'c', u'd']],
100
            [[u'a?'], [u'a1', u'a2']],
101
            [[u'a??'], [u'a11', u'a.1']],
102
            [[u'b[1-2]'], [u'b1', u'b2']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
103
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
104
            [[u'd/*'], [u'd/d1', u'd/d2', u'd/e']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
105
            [[u'?/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
106
            [[u'*/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
107
            [[u'*/'], [u'c/', u'd/']],
108
            ])
109
110
    def test_backslash_globbing(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
111
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
112
        self.build_ascii_tree()
113
        self._run_testset([
114
            [[u'd\\'], [u'd/']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
115
            [[u'd\\*'], [u'd/d1', u'd/d2', u'd/e']],
116
            [[u'?\\*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
117
            [[u'*\\*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
118
            [[u'*\\'], [u'c/', u'd/']],
119
            ])
120
121
    def test_case_insensitive_globbing(self):
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
122
        self.requireFeature(tests.CaseInsCasePresFilenameFeature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
123
        self.build_ascii_tree()
124
        self._run_testset([
125
            [[u'A'], [u'A']],
126
            [[u'A?'], [u'a1', u'a2']],
127
            ])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
128
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
129
    def test_tree_unicode(self):
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
130
        """Checks behaviour with non-ascii filenames"""
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
131
        self.build_unicode_tree()
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
132
        self._run_testset([
133
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
134
            [[u'\u1234'], [u'\u1234']],
135
            [[u'\u1235'], [u'\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
136
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
137
            [[u'\u1235/'], [u'\u1235/']],
138
            [[u'\u1235/\u1235'], [u'\u1235/\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
139
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
140
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
141
            [[u'?'], [u'\u1234', u'\u1235']],
142
            [[u'*'], [u'\u1234', u'\u1234\u1234', u'\u1235']],
143
            [[u'\u1234*'], [u'\u1234', u'\u1234\u1234']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
144
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
145
            [[u'\u1235/?'], [u'\u1235/\u1235']],
146
            [[u'\u1235/*'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
147
            [[u'?/'], [u'\u1235/']],
148
            [[u'*/'], [u'\u1235/']],
149
            [[u'?/?'], [u'\u1235/\u1235']],
150
            [[u'*/*'], [u'\u1235/\u1235']],
151
            ])
152
153
    def test_unicode_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
154
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
155
        self.build_unicode_tree()
156
        self._run_testset([
157
            # no wildcards
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
158
            [[u'\u1235\\'], [u'\u1235/']],
159
            [[u'\u1235\\\u1235'], [u'\u1235/\u1235']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
160
            [[u'\u1235\\?'], [u'\u1235/\u1235']],
161
            [[u'\u1235\\*'], [u'\u1235/\u1235']],
162
            [[u'?\\'], [u'\u1235/']],
163
            [[u'*\\'], [u'\u1235/']],
164
            [[u'?\\?'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
165
            [[u'*\\*'], [u'\u1235/\u1235']],
166
            ])
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
167
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
168
    def _run_testset(self, testset):
169
        for pattern, expected in testset:
170
            result = glob_expand(pattern)
171
            expected.sort()
172
            result.sort()
173
            self.assertEqual(expected, result, 'pattern %s' % pattern)
2617.5.2 by Kuno Meyer
just reformatting
174
2681.4.2 by Alexander Belchenko
test for get_app_path
175
176
class TestAppPaths(TestCase):
177
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
178
    _test_needs_features = [Win32RegistryFeature]
179
2681.4.2 by Alexander Belchenko
test for get_app_path
180
    def test_iexplore(self):
181
        # typical windows users should have IE installed
182
        for a in ('iexplore', 'iexplore.exe'):
183
            p = get_app_path(a)
184
            d, b = os.path.split(p)
3146.4.9 by Aaron Bentley
do case-insensitive comparision of iexplore filename
185
            self.assertEquals('iexplore.exe', b.lower())
2681.4.2 by Alexander Belchenko
test for get_app_path
186
            self.assertNotEquals('', d)
187
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
188
    def test_wordpad(self):
189
        # typical windows users should have wordpad in the system
190
        # but there is problem: its path has the format REG_EXPAND_SZ
191
        # so naive attempt to get the path is not working
192
        for a in ('wordpad', 'wordpad.exe'):
193
            p = get_app_path(a)
194
            d, b = os.path.split(p)
195
            self.assertEquals('wordpad.exe', b.lower())
196
            self.assertNotEquals('', d)
197
2681.4.2 by Alexander Belchenko
test for get_app_path
198
    def test_not_existing(self):
199
        p = get_app_path('not-existing')
200
        self.assertEquals('not-existing', p)
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
201
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
202
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
203
class TestLocationsCtypes(TestCase):
204
205
    _test_needs_features = [CtypesFeature]
206
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
207
    def assertPathsEqual(self, p1, p2):
208
        # TODO: The env var values in particular might return the "short"
209
        # version (ie, "C:\DOCUME~1\...").  Its even possible the returned
210
        # values will differ only by case - handle these situations as we
211
        # come across them.
212
        self.assertEquals(p1, p2)
213
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
214
    def test_appdata_not_using_environment(self):
215
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
216
        first = win32utils.get_appdata_location()
217
        self._captureVar("APPDATA", None)
218
        self.assertPathsEqual(first, win32utils.get_appdata_location())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
219
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
220
    def test_appdata_matches_environment(self):
221
        # Typically the APPDATA environment variable will match
222
        # get_appdata_location
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
223
        # XXX - See bug 262874, which asserts the correct encoding is 'mbcs',
224
        encoding = osutils.get_user_encoding()
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
225
        env_val = os.environ.get("APPDATA", None)
226
        if not env_val:
227
            raise TestSkipped("No APPDATA environment variable exists")
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
228
        self.assertPathsEqual(win32utils.get_appdata_location(),
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
229
                              env_val.decode(encoding))
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
230
231
    def test_local_appdata_not_using_environment(self):
232
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
233
        first = win32utils.get_local_appdata_location()
234
        self._captureVar("LOCALAPPDATA", None)
235
        self.assertPathsEqual(first, win32utils.get_local_appdata_location())
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
236
237
    def test_local_appdata_matches_environment(self):
238
        # LOCALAPPDATA typically only exists on Vista, so we only attempt to
239
        # compare when it exists.
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
240
        lad = win32utils.get_local_appdata_location()
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
241
        env = os.environ.get("LOCALAPPDATA")
242
        if env:
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
243
            # XXX - See bug 262874, which asserts the correct encoding is 'mbcs'
244
            encoding = osutils.get_user_encoding()
245
            self.assertPathsEqual(lad, env.decode(encoding))
246
247
248
class TestLocationsPywin32(TestLocationsCtypes):
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
249
250
    _test_needs_features = [Win32comShellFeature]
251
252
    def setUp(self):
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
253
        super(TestLocationsPywin32, self).setUp()
254
        # We perform the exact same tests after disabling the use of ctypes.
255
        # This causes the implementation to fall back to pywin32.
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
256
        self.overrideAttr(win32utils, 'has_ctypes', False)
257
        # FIXME: this should be done by parametrization -- vila 100123
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
258
259
260
class TestSetHidden(TestCaseInTempDir):
261
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
262
    def test_unicode_dir(self):
263
        # we should handle unicode paths without errors
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
264
        self.requireFeature(UnicodeFilenameFeature)
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
265
        os.mkdir(u'\u1234')
266
        win32utils.set_file_attr_hidden(u'\u1234')
267
268
    def test_dot_bzr_in_unicode_dir(self):
4505.2.1 by Alexander Belchenko
Set hidden attribute on .bzr directory below unicode path should never fail with error. The operation should succeed even if bzr unable to set the attribute. (related to bug #335362).
269
        # we should not raise traceback if we try to set hidden attribute
270
        # on .bzr directory below unicode path
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
271
        self.requireFeature(UnicodeFilenameFeature)
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
272
        os.makedirs(u'\u1234\\.bzr')
273
        path = osutils.abspath(u'\u1234\\.bzr')
274
        win32utils.set_file_attr_hidden(path)
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
275
276
277
class Test_CommandLineToArgv(tests.TestCaseInTempDir):
278
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
279
    def assertCommandLine(self, expected, line, single_quotes_allowed=False):
4789.3.2 by Vincent Ladeuil
Add a comment precising why we sort the results of _command_line_to_argv.
280
        # Strictly speaking we should respect parameter order versus glob
281
        # expansions, but it's not really worth the effort here
4913.5.25 by Gordon Tyler
Simplified win32utils.command_line_to_argv and made it private since it's no longer used outside of the module.
282
        argv = win32utils._command_line_to_argv(line,
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
283
                single_quotes_allowed=single_quotes_allowed)
284
        self.assertEqual(expected, sorted(argv))
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
285
286
    def test_glob_paths(self):
287
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
288
        self.assertCommandLine([u'a/b.c', u'a/c.c'], 'a/*.c')
289
        self.build_tree(['b/', 'b/b.c', 'b/d.c', 'b/d.h'])
290
        self.assertCommandLine([u'a/b.c', u'b/b.c'], '*/b.c')
291
        self.assertCommandLine([u'a/b.c', u'a/c.c', u'b/b.c', u'b/d.c'],
292
                               '*/*.c')
293
        # Bash style, just pass through the argument if nothing matches
294
        self.assertCommandLine([u'*/*.qqq'], '*/*.qqq')
295
296
    def test_quoted_globs(self):
297
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
298
        self.assertCommandLine([u'a/*.c'], '"a/*.c"')
4789.1.1 by Alexander Belchenko
In standard windows shell single quote is not supported as quote. Restored standard windows behavior.
299
        self.assertCommandLine([u"'a/*.c'"], "'a/*.c'")
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
300
        self.assertCommandLine([u'a/*.c'], "'a/*.c'",
301
            single_quotes_allowed=True)
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
302
303
    def test_slashes_changed(self):
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
304
        # Quoting doesn't change the supplied args
305
        self.assertCommandLine([u'a\\*.c'], '"a\\*.c"')
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
306
        self.assertCommandLine([u'a\\*.c'], "'a\\*.c'",
307
            single_quotes_allowed=True)
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
308
        # Expands the glob, but nothing matches, swaps slashes
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
309
        self.assertCommandLine([u'a/*.c'], 'a\\*.c')
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
310
        self.assertCommandLine([u'a/?.c'], 'a\\?.c')
311
        # No glob, doesn't touch slashes
312
        self.assertCommandLine([u'a\\foo.c'], 'a\\foo.c')
4789.1.1 by Alexander Belchenko
In standard windows shell single quote is not supported as quote. Restored standard windows behavior.
313
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
314
    def test_single_quote_support(self):
4789.1.1 by Alexander Belchenko
In standard windows shell single quote is not supported as quote. Restored standard windows behavior.
315
        self.assertCommandLine(["add", "let's-do-it.txt"],
316
            "add let's-do-it.txt")
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
317
        self.assertCommandLine(["add", "lets do it.txt"],
318
            "add 'lets do it.txt'", single_quotes_allowed=True)
4797.3.20 by John Arbash Meinel
Include the glob updates.
319
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
320
    def test_case_insensitive_globs(self):
321
        self.requireFeature(tests.CaseInsCasePresFilenameFeature)
322
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
323
        self.assertCommandLine([u'A/b.c'], 'A/B*')
324
325
    def test_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
326
        self.requireFeature(backslashdir_feature)
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
327
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
328
        self.assertCommandLine([u'a/b.c'], 'a\\b*')