~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')
5314.1.1 by Jason Spashett
Change test_win32utils.py so as not to fail tests if win32api module is not present.
57
Win32ApiFeature = _RequiredModuleFeature('win32api') 
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
58
5314.1.2 by Jason Spashett
Adition of blank line for formatting.
59
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
60
# Tests
61
# -----
2617.5.6 by Kuno Meyer
Incorporated feedback from the mailinglist.
62
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
63
class TestWin32UtilsGlobExpand(TestCaseInTempDir):
2617.5.2 by Kuno Meyer
just reformatting
64
4789.20.1 by John Arbash Meinel
Updates to tests that were exercising filesystem globbing.
65
    _test_needs_features = []
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
66
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
67
    def test_empty_tree(self):
68
        self.build_tree([])
2617.5.2 by Kuno Meyer
just reformatting
69
        self._run_testset([
70
            [['a'], ['a']],
71
            [['?'], ['?']],
72
            [['*'], ['*']],
73
            [['a', 'a'], ['a', 'a']]])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
74
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
75
    def build_ascii_tree(self):
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
76
        self.build_tree(['a', 'a1', 'a2', 'a11', 'a.1',
77
                         'b', 'b1', 'b2', 'b3',
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
78
                         'c/', 'c/c1', 'c/c2',
2617.5.4 by Kuno Meyer
Included feedback on initial patch.
79
                         '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.
80
81
    def build_unicode_tree(self):
82
        self.requireFeature(UnicodeFilenameFeature)
83
        self.build_tree([u'\u1234', u'\u1234\u1234', u'\u1235/',
84
                         u'\u1235/\u1235'])
85
86
    def test_tree_ascii(self):
87
        """Checks the glob expansion and path separation char
88
        normalization"""
89
        self.build_ascii_tree()
2617.5.2 by Kuno Meyer
just reformatting
90
        self._run_testset([
91
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
92
            [[u'a'], [u'a']],
93
            [[u'a', u'a' ], [u'a', u'a']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
94
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
95
            [[u'd'], [u'd']],
96
            [[u'd/'], [u'd/']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
97
2617.5.2 by Kuno Meyer
just reformatting
98
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
99
            [[u'a*'], [u'a', u'a1', u'a2', u'a11', u'a.1']],
100
            [[u'?'], [u'a', u'b', u'c', u'd']],
101
            [[u'a?'], [u'a1', u'a2']],
102
            [[u'a??'], [u'a11', u'a.1']],
103
            [[u'b[1-2]'], [u'b1', u'b2']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
104
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
105
            [[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.
106
            [[u'?/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
107
            [[u'*/*'], [u'c/c1', u'c/c2', u'd/d1', u'd/d2', u'd/e']],
108
            [[u'*/'], [u'c/', u'd/']],
109
            ])
110
111
    def test_backslash_globbing(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
112
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
113
        self.build_ascii_tree()
114
        self._run_testset([
115
            [[u'd\\'], [u'd/']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
116
            [[u'd\\*'], [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']],
118
            [[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.
119
            [[u'*\\'], [u'c/', u'd/']],
120
            ])
121
122
    def test_case_insensitive_globbing(self):
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
123
        self.requireFeature(tests.CaseInsCasePresFilenameFeature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
124
        self.build_ascii_tree()
125
        self._run_testset([
126
            [[u'A'], [u'A']],
127
            [[u'A?'], [u'a1', u'a2']],
128
            ])
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
129
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
130
    def test_tree_unicode(self):
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
131
        """Checks behaviour with non-ascii filenames"""
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
132
        self.build_unicode_tree()
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
133
        self._run_testset([
134
            # no wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
135
            [[u'\u1234'], [u'\u1234']],
136
            [[u'\u1235'], [u'\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
137
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
138
            [[u'\u1235/'], [u'\u1235/']],
139
            [[u'\u1235/\u1235'], [u'\u1235/\u1235']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
140
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
141
            # wildcards
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
142
            [[u'?'], [u'\u1234', u'\u1235']],
143
            [[u'*'], [u'\u1234', u'\u1234\u1234', u'\u1235']],
144
            [[u'\u1234*'], [u'\u1234', u'\u1234\u1234']],
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
145
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
146
            [[u'\u1235/?'], [u'\u1235/\u1235']],
147
            [[u'\u1235/*'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
148
            [[u'?/'], [u'\u1235/']],
149
            [[u'*/'], [u'\u1235/']],
150
            [[u'?/?'], [u'\u1235/\u1235']],
151
            [[u'*/*'], [u'\u1235/\u1235']],
152
            ])
153
154
    def test_unicode_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
155
        self.requireFeature(backslashdir_feature)
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
156
        self.build_unicode_tree()
157
        self._run_testset([
158
            # no wildcards
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
159
            [[u'\u1235\\'], [u'\u1235/']],
160
            [[u'\u1235\\\u1235'], [u'\u1235/\u1235']],
2617.5.8 by Kuno Meyer
Extended tests for unicode chars outside of the iso-8859-* range
161
            [[u'\u1235\\?'], [u'\u1235/\u1235']],
162
            [[u'\u1235\\*'], [u'\u1235/\u1235']],
163
            [[u'?\\'], [u'\u1235/']],
164
            [[u'*\\'], [u'\u1235/']],
165
            [[u'?\\?'], [u'\u1235/\u1235']],
4789.20.2 by John Arbash Meinel
Split the win32 globbing tests up a bit.
166
            [[u'*\\*'], [u'\u1235/\u1235']],
167
            ])
2617.5.7 by Kuno Meyer
Fix for non-ASCII filenames
168
2617.5.1 by Kuno Meyer
Added direct unit tests for win32utils.glob_expand().
169
    def _run_testset(self, testset):
170
        for pattern, expected in testset:
171
            result = glob_expand(pattern)
172
            expected.sort()
173
            result.sort()
174
            self.assertEqual(expected, result, 'pattern %s' % pattern)
2617.5.2 by Kuno Meyer
just reformatting
175
2681.4.2 by Alexander Belchenko
test for get_app_path
176
177
class TestAppPaths(TestCase):
178
2681.4.4 by Alexander Belchenko
test use Feature instead of TestSkipped
179
    _test_needs_features = [Win32RegistryFeature]
180
2681.4.2 by Alexander Belchenko
test for get_app_path
181
    def test_iexplore(self):
182
        # typical windows users should have IE installed
183
        for a in ('iexplore', 'iexplore.exe'):
184
            p = get_app_path(a)
185
            d, b = os.path.split(p)
3146.4.9 by Aaron Bentley
do case-insensitive comparision of iexplore filename
186
            self.assertEquals('iexplore.exe', b.lower())
2681.4.2 by Alexander Belchenko
test for get_app_path
187
            self.assertNotEquals('', d)
188
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
189
    def test_wordpad(self):
190
        # typical windows users should have wordpad in the system
191
        # but there is problem: its path has the format REG_EXPAND_SZ
192
        # so naive attempt to get the path is not working
5314.1.1 by Jason Spashett
Change test_win32utils.py so as not to fail tests if win32api module is not present.
193
        self.requireFeature(Win32ApiFeature)
4476.2.1 by Alexander Belchenko
win32utils.py: get_app_path() can read path for wordpad.exe (data type_id is REG_EXPAND_SZ).
194
        for a in ('wordpad', 'wordpad.exe'):
195
            p = get_app_path(a)
196
            d, b = os.path.split(p)
197
            self.assertEquals('wordpad.exe', b.lower())
198
            self.assertNotEquals('', d)
199
2681.4.2 by Alexander Belchenko
test for get_app_path
200
    def test_not_existing(self):
201
        p = get_app_path('not-existing')
202
        self.assertEquals('not-existing', p)
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
203
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
204
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
205
class TestLocationsCtypes(TestCase):
206
207
    _test_needs_features = [CtypesFeature]
208
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
209
    def assertPathsEqual(self, p1, p2):
210
        # TODO: The env var values in particular might return the "short"
211
        # version (ie, "C:\DOCUME~1\...").  Its even possible the returned
212
        # values will differ only by case - handle these situations as we
213
        # come across them.
214
        self.assertEquals(p1, p2)
215
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
216
    def test_appdata_not_using_environment(self):
217
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
218
        first = win32utils.get_appdata_location()
219
        self._captureVar("APPDATA", None)
220
        self.assertPathsEqual(first, win32utils.get_appdata_location())
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
221
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
222
    def test_appdata_matches_environment(self):
223
        # Typically the APPDATA environment variable will match
224
        # get_appdata_location
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
225
        # XXX - See bug 262874, which asserts the correct encoding is 'mbcs',
226
        encoding = osutils.get_user_encoding()
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
227
        env_val = os.environ.get("APPDATA", None)
228
        if not env_val:
229
            raise TestSkipped("No APPDATA environment variable exists")
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
230
        self.assertPathsEqual(win32utils.get_appdata_location(),
3638.4.6 by Mark Hammond
Skip the environment checks when APPDATA isn't in the environment.
231
                              env_val.decode(encoding))
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
232
233
    def test_local_appdata_not_using_environment(self):
234
        # Test that we aren't falling back to the environment
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
235
        first = win32utils.get_local_appdata_location()
236
        self._captureVar("LOCALAPPDATA", None)
237
        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
238
239
    def test_local_appdata_matches_environment(self):
240
        # LOCALAPPDATA typically only exists on Vista, so we only attempt to
241
        # compare when it exists.
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
242
        lad = win32utils.get_local_appdata_location()
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
243
        env = os.environ.get("LOCALAPPDATA")
244
        if env:
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
245
            # XXX - See bug 262874, which asserts the correct encoding is 'mbcs'
246
            encoding = osutils.get_user_encoding()
247
            self.assertPathsEqual(lad, env.decode(encoding))
248
249
250
class TestLocationsPywin32(TestLocationsCtypes):
3638.4.1 by Mark Hammond
Add win32utils.get_local_appdata_location() so bzr and plugins can
251
252
    _test_needs_features = [Win32comShellFeature]
253
254
    def setUp(self):
3638.4.3 by Mark Hammond
cleanup tests, rationalize path checking etc.
255
        super(TestLocationsPywin32, self).setUp()
256
        # We perform the exact same tests after disabling the use of ctypes.
257
        # This causes the implementation to fall back to pywin32.
4985.1.5 by Vincent Ladeuil
Deploying the new overrideAttr facility further reduces the complexity
258
        self.overrideAttr(win32utils, 'has_ctypes', False)
259
        # 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).
260
261
262
class TestSetHidden(TestCaseInTempDir):
263
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
264
    def test_unicode_dir(self):
265
        # we should handle unicode paths without errors
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
266
        self.requireFeature(UnicodeFilenameFeature)
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
267
        os.mkdir(u'\u1234')
268
        win32utils.set_file_attr_hidden(u'\u1234')
269
270
    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).
271
        # we should not raise traceback if we try to set hidden attribute
272
        # on .bzr directory below unicode path
4505.2.4 by Alexander Belchenko
guard tests with UnicodeFilenameFeature.
273
        self.requireFeature(UnicodeFilenameFeature)
4505.2.3 by Alexander Belchenko
added direct test for absolute path.
274
        os.makedirs(u'\u1234\\.bzr')
275
        path = osutils.abspath(u'\u1234\\.bzr')
276
        win32utils.set_file_attr_hidden(path)
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
277
278
279
class Test_CommandLineToArgv(tests.TestCaseInTempDir):
280
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
281
    def assertCommandLine(self, expected, line, argv=None,
282
            single_quotes_allowed=False):
4789.3.2 by Vincent Ladeuil
Add a comment precising why we sort the results of _command_line_to_argv.
283
        # Strictly speaking we should respect parameter order versus glob
284
        # expansions, but it's not really worth the effort here
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
285
        if argv is None:
286
            argv = [line]
287
        argv = win32utils._command_line_to_argv(line, argv,
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
288
                single_quotes_allowed=single_quotes_allowed)
289
        self.assertEqual(expected, sorted(argv))
4786.1.1 by John Arbash Meinel
Work on doing globbing, etc for all commands on Windows.
290
291
    def test_glob_paths(self):
292
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
293
        self.assertCommandLine([u'a/b.c', u'a/c.c'], 'a/*.c')
294
        self.build_tree(['b/', 'b/b.c', 'b/d.c', 'b/d.h'])
295
        self.assertCommandLine([u'a/b.c', u'b/b.c'], '*/b.c')
296
        self.assertCommandLine([u'a/b.c', u'a/c.c', u'b/b.c', u'b/d.c'],
297
                               '*/*.c')
298
        # Bash style, just pass through the argument if nothing matches
299
        self.assertCommandLine([u'*/*.qqq'], '*/*.qqq')
300
301
    def test_quoted_globs(self):
302
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
303
        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.
304
        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).
305
        self.assertCommandLine([u'a/*.c'], "'a/*.c'",
306
            single_quotes_allowed=True)
4786.1.2 by John Arbash Meinel
Refactor the glob_expand code a bit, making the inner function more reusable.
307
308
    def test_slashes_changed(self):
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
309
        # Quoting doesn't change the supplied args
310
        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).
311
        self.assertCommandLine([u'a\\*.c'], "'a\\*.c'",
312
            single_quotes_allowed=True)
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
313
        # 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.
314
        self.assertCommandLine([u'a/*.c'], 'a\\*.c')
4818.1.1 by John Arbash Meinel
Fix bug #485771. Only change '/' to '/' when expanding globs.
315
        self.assertCommandLine([u'a/?.c'], 'a\\?.c')
316
        # No glob, doesn't touch slashes
317
        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.
318
4913.5.11 by Gordon Tyler
Added optional single quote support to UnicodeShlex and thus command_line_to_argv (defaults to disabled).
319
    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.
320
        self.assertCommandLine(["add", "let's-do-it.txt"],
5274.4.12 by Martin
Change interface of _command_line_to_argv so old tests can still be used with new stripping logic
321
            "add let's-do-it.txt",
322
            ["add", "let's-do-it.txt"])
323
        self.expectFailure("Using single quotes breaks trimming from argv",
324
            self.assertCommandLine, ["add", "lets do it.txt"],
325
            "add 'lets do it.txt'", ["add", "'lets", "do", "it.txt'"],
326
            single_quotes_allowed=True)
4797.3.20 by John Arbash Meinel
Include the glob updates.
327
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
328
    def test_case_insensitive_globs(self):
329
        self.requireFeature(tests.CaseInsCasePresFilenameFeature)
330
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
331
        self.assertCommandLine([u'A/b.c'], 'A/B*')
332
333
    def test_backslashes(self):
5241.2.1 by Robert Collins
Merge up from 2.0/2.1:
334
        self.requireFeature(backslashdir_feature)
4789.20.3 by John Arbash Meinel
Use the right case sensitivity feature (cicp, not just ci).
335
        self.build_tree(['a/', 'a/b.c', 'a/c.c', 'a/c.h'])
336
        self.assertCommandLine([u'a/b.c'], 'a\\b*')
5274.4.13 by Martin
Add test for lp:587868 to win32 commandline tests
337
338
    def test_with_pdb(self):
339
        """Check stripping Python arguments before bzr script per lp:587868"""
340
        self.assertCommandLine([u"rocks"], "-m pdb rocks", ["rocks"])
341
        self.build_tree(['d/', 'd/f1', 'd/f2'])
342
        self.assertCommandLine([u"rm", u"x*"], "-m pdb rm x*", ["rm", u"x*"])
343
        self.assertCommandLine([u"add", u"d/f1", u"d/f2"], "-m pdb add d/*",
344
            ["add", u"d/*"])