blob: b9a4c906defc26ebdef9c013851cf0915c104110 [file] [log] [blame]
Benjamin Peterson3bef9352014-06-22 19:07:38 -07001# coding: utf-8
Guido van Rossumead9d8d1999-02-03 17:21:21 +00002import ntpath
Mark Hammond673c6cf2000-08-14 06:21:26 +00003import os
Serhiy Storchaka2ac9d312014-02-19 23:27:37 +02004import sys
Georg Brandla4f46e12010-02-07 17:03:15 +00005from test.test_support import TestFailed
Florent Xiclunadc1531c2010-03-06 18:07:18 +00006from test import test_support, test_genericpath
Jerry Seutterfc7b3e32008-03-26 05:58:14 +00007import unittest
Guido van Rossumead9d8d1999-02-03 17:21:21 +00008
Serhiy Storchaka2ac9d312014-02-19 23:27:37 +02009def tester0(fn, wantResult):
10 gotResult = eval(fn)
11 if wantResult != gotResult:
12 raise TestFailed, "%s should return: %r but returned: %r" \
13 %(fn, wantResult, gotResult)
Guido van Rossumead9d8d1999-02-03 17:21:21 +000014
15def tester(fn, wantResult):
Eric S. Raymondfc170b12001-02-09 11:51:27 +000016 fn = fn.replace("\\", "\\\\")
Serhiy Storchaka2ac9d312014-02-19 23:27:37 +020017 tester0(fn, wantResult)
Tim Peters6578dc92002-12-24 18:31:27 +000018
Guido van Rossumead9d8d1999-02-03 17:21:21 +000019
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000020class TestNtpath(unittest.TestCase):
21 def test_splitext(self):
22 tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
23 tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
24 tester('ntpath.splitext(".ext")', ('.ext', ''))
25 tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
26 tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
27 tester('ntpath.splitext("")', ('', ''))
28 tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
29 tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
30 tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
31 tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000032
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000033 def test_splitdrive(self):
34 tester('ntpath.splitdrive("c:\\foo\\bar")',
35 ('c:', '\\foo\\bar'))
36 tester('ntpath.splitdrive("c:/foo/bar")',
37 ('c:', '/foo/bar'))
Benjamin Peterson3bef9352014-06-22 19:07:38 -070038 tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")',
39 ('\\\\conky\\mountpoint', '\\foo\\bar'))
40 tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")',
41 ('//conky/mountpoint', '/foo/bar'))
42 tester('ntpath.splitdrive("\\\\\\conky\\mountpoint\\foo\\bar")',
43 ('', '\\\\\\conky\\mountpoint\\foo\\bar'))
44 tester('ntpath.splitdrive("///conky/mountpoint/foo/bar")',
45 ('', '///conky/mountpoint/foo/bar'))
46 tester('ntpath.splitdrive("\\\\conky\\\\mountpoint\\foo\\bar")',
47 ('', '\\\\conky\\\\mountpoint\\foo\\bar'))
48 tester('ntpath.splitdrive("//conky//mountpoint/foo/bar")',
49 ('', '//conky//mountpoint/foo/bar'))
50 # Issue #19911: UNC part containing U+0130
51 self.assertEqual(ntpath.splitdrive(u'//conky/MOUNTPOİNT/foo/bar'),
52 (u'//conky/MOUNTPOİNT', '/foo/bar'))
Benjamin Peterson2ad54212014-08-31 09:34:09 -040053 self.assertEqual(ntpath.splitdrive("//"), ("", "//"))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000054
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000055 def test_splitunc(self):
Serhiy Storchakadd5a46c2013-12-16 15:15:29 +020056 tester('ntpath.splitunc("c:\\foo\\bar")',
57 ('', 'c:\\foo\\bar'))
58 tester('ntpath.splitunc("c:/foo/bar")',
59 ('', 'c:/foo/bar'))
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000060 tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")',
61 ('\\\\conky\\mountpoint', '\\foo\\bar'))
62 tester('ntpath.splitunc("//conky/mountpoint/foo/bar")',
63 ('//conky/mountpoint', '/foo/bar'))
Serhiy Storchakadd5a46c2013-12-16 15:15:29 +020064 tester('ntpath.splitunc("\\\\\\conky\\mountpoint\\foo\\bar")',
65 ('', '\\\\\\conky\\mountpoint\\foo\\bar'))
66 tester('ntpath.splitunc("///conky/mountpoint/foo/bar")',
67 ('', '///conky/mountpoint/foo/bar'))
68 tester('ntpath.splitunc("\\\\conky\\\\mountpoint\\foo\\bar")',
69 ('', '\\\\conky\\\\mountpoint\\foo\\bar'))
70 tester('ntpath.splitunc("//conky//mountpoint/foo/bar")',
71 ('', '//conky//mountpoint/foo/bar'))
Serhiy Storchaka2bd8b222015-02-13 12:02:05 +020072 if test_support.have_unicode:
73 self.assertEqual(ntpath.splitunc(u'//conky/MOUNTPO%cNT/foo/bar' % 0x0130),
74 (u'//conky/MOUNTPO%cNT' % 0x0130, u'/foo/bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000075
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000076 def test_split(self):
77 tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
78 tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
79 ('\\\\conky\\mountpoint\\foo', 'bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000080
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000081 tester('ntpath.split("c:\\")', ('c:\\', ''))
82 tester('ntpath.split("\\\\conky\\mountpoint\\")',
Benjamin Peterson3bef9352014-06-22 19:07:38 -070083 ('\\\\conky\\mountpoint\\', ''))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000084
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000085 tester('ntpath.split("c:/")', ('c:/', ''))
Benjamin Peterson3bef9352014-06-22 19:07:38 -070086 tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
Mark Hammond673c6cf2000-08-14 06:21:26 +000087
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000088 def test_isabs(self):
89 tester('ntpath.isabs("c:\\")', 1)
90 tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
91 tester('ntpath.isabs("\\foo")', 1)
92 tester('ntpath.isabs("\\foo\\bar")', 1)
Tim Petersd4f7f602001-07-19 19:11:41 +000093
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000094 def test_commonprefix(self):
95 tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
96 "/home/swen")
97 tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
98 "\\home\\swen\\")
99 tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
100 "/home/swen/spam")
Tim Peters6a3e5f12001-11-05 21:25:02 +0000101
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000102 def test_join(self):
103 tester('ntpath.join("")', '')
104 tester('ntpath.join("", "", "")', '')
105 tester('ntpath.join("a")', 'a')
106 tester('ntpath.join("/a")', '/a')
107 tester('ntpath.join("\\a")', '\\a')
108 tester('ntpath.join("a:")', 'a:')
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000109 tester('ntpath.join("a:", "\\b")', 'a:\\b')
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000110 tester('ntpath.join("a", "\\b")', '\\b')
111 tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
112 tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
113 tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
114 tester('ntpath.join("a", "b", "\\c")', '\\c')
115 tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
116 tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
Tim Peters54a14a32001-08-30 22:05:26 +0000117
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000118 tester("ntpath.join('', 'a')", 'a')
119 tester("ntpath.join('', '', '', '', 'a')", 'a')
120 tester("ntpath.join('a', '')", 'a\\')
121 tester("ntpath.join('a', '', '', '', '')", 'a\\')
122 tester("ntpath.join('a\\', '')", 'a\\')
123 tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
Serhiy Storchaka31f51212014-01-27 23:14:51 +0200124 tester("ntpath.join('a/', '')", 'a/')
125
126 tester("ntpath.join('a/b', 'x/y')", 'a/b\\x/y')
127 tester("ntpath.join('/a/b', 'x/y')", '/a/b\\x/y')
128 tester("ntpath.join('/a/b/', 'x/y')", '/a/b/x/y')
129 tester("ntpath.join('c:', 'x/y')", 'c:x/y')
130 tester("ntpath.join('c:a/b', 'x/y')", 'c:a/b\\x/y')
131 tester("ntpath.join('c:a/b/', 'x/y')", 'c:a/b/x/y')
132 tester("ntpath.join('c:/', 'x/y')", 'c:/x/y')
133 tester("ntpath.join('c:/a/b', 'x/y')", 'c:/a/b\\x/y')
134 tester("ntpath.join('c:/a/b/', 'x/y')", 'c:/a/b/x/y')
Benjamin Peterson3bef9352014-06-22 19:07:38 -0700135 tester("ntpath.join('//computer/share', 'x/y')", '//computer/share\\x/y')
136 tester("ntpath.join('//computer/share/', 'x/y')", '//computer/share/x/y')
137 tester("ntpath.join('//computer/share/a/b', 'x/y')", '//computer/share/a/b\\x/y')
Serhiy Storchaka31f51212014-01-27 23:14:51 +0200138
139 tester("ntpath.join('a/b', '/x/y')", '/x/y')
140 tester("ntpath.join('/a/b', '/x/y')", '/x/y')
141 tester("ntpath.join('c:', '/x/y')", 'c:/x/y')
142 tester("ntpath.join('c:a/b', '/x/y')", 'c:/x/y')
143 tester("ntpath.join('c:/', '/x/y')", 'c:/x/y')
144 tester("ntpath.join('c:/a/b', '/x/y')", 'c:/x/y')
Benjamin Peterson3bef9352014-06-22 19:07:38 -0700145 tester("ntpath.join('//computer/share', '/x/y')", '//computer/share/x/y')
146 tester("ntpath.join('//computer/share/', '/x/y')", '//computer/share/x/y')
147 tester("ntpath.join('//computer/share/a', '/x/y')", '//computer/share/x/y')
Serhiy Storchaka31f51212014-01-27 23:14:51 +0200148
149 tester("ntpath.join('c:', 'C:x/y')", 'C:x/y')
150 tester("ntpath.join('c:a/b', 'C:x/y')", 'C:a/b\\x/y')
151 tester("ntpath.join('c:/', 'C:x/y')", 'C:/x/y')
152 tester("ntpath.join('c:/a/b', 'C:x/y')", 'C:/a/b\\x/y')
153
154 for x in ('', 'a/b', '/a/b', 'c:', 'c:a/b', 'c:/', 'c:/a/b'):
155 for y in ('d:', 'd:x/y', 'd:/', 'd:/x/y'):
156 tester("ntpath.join(%r, %r)" % (x, y), y)
Tim Peters54a14a32001-08-30 22:05:26 +0000157
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000158 def test_normpath(self):
159 tester("ntpath.normpath('A//////././//.//B')", r'A\B')
160 tester("ntpath.normpath('A/./B')", r'A\B')
161 tester("ntpath.normpath('A/foo/../B')", r'A\B')
162 tester("ntpath.normpath('C:A//B')", r'C:A\B')
163 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
164 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
Tim Peters54a14a32001-08-30 22:05:26 +0000165
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000166 tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
167 tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
168 tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
Sjoerd Mullender33a0a062007-01-16 16:42:38 +0000169
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000170 tester("ntpath.normpath('..')", r'..')
171 tester("ntpath.normpath('.')", r'.')
172 tester("ntpath.normpath('')", r'.')
173 tester("ntpath.normpath('/')", '\\')
174 tester("ntpath.normpath('c:/')", 'c:\\')
175 tester("ntpath.normpath('/../.././..')", '\\')
176 tester("ntpath.normpath('c:/../../..')", 'c:\\')
177 tester("ntpath.normpath('../.././..')", r'..\..\..')
178 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
179 tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
180 tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
Fred Drake5e997312002-01-15 03:46:43 +0000181
Georg Brandle2773252010-08-01 19:14:56 +0000182 tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL')
183 tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z')
184
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000185 def test_expandvars(self):
Walter Dörwald6733bed2009-05-01 17:35:37 +0000186 with test_support.EnvironmentVarGuard() as env:
187 env.clear()
188 env["foo"] = "bar"
189 env["{foo"] = "baz1"
190 env["{foo}"] = "baz2"
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000191 tester('ntpath.expandvars("foo")', "foo")
192 tester('ntpath.expandvars("$foo bar")', "bar bar")
193 tester('ntpath.expandvars("${foo}bar")', "barbar")
194 tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
195 tester('ntpath.expandvars("$bar bar")', "$bar bar")
196 tester('ntpath.expandvars("$?bar")', "$?bar")
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000197 tester('ntpath.expandvars("$foo}bar")', "bar}bar")
198 tester('ntpath.expandvars("${foo")', "${foo")
199 tester('ntpath.expandvars("${{foo}}")', "baz1}")
200 tester('ntpath.expandvars("$foo$foo")', "barbar")
201 tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
202 tester('ntpath.expandvars("%foo% bar")', "bar bar")
203 tester('ntpath.expandvars("%foo%bar")', "barbar")
204 tester('ntpath.expandvars("%foo%%foo%")', "barbar")
205 tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
206 tester('ntpath.expandvars("%?bar%")', "%?bar%")
207 tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
208 tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
Serhiy Storchaka53b542f2015-03-25 16:39:58 +0200209 tester('ntpath.expandvars("bar\'%foo%")', "bar\'%foo%")
Collin Winter6f187742007-03-16 22:16:08 +0000210
Serhiy Storchaka2ac9d312014-02-19 23:27:37 +0200211 @unittest.skipUnless(test_support.FS_NONASCII, 'need test_support.FS_NONASCII')
212 def test_expandvars_nonascii(self):
213 encoding = sys.getfilesystemencoding()
214 def check(value, expected):
215 tester0("ntpath.expandvars(%r)" % value, expected)
216 tester0("ntpath.expandvars(%r)" % value.decode(encoding),
217 expected.decode(encoding))
218 with test_support.EnvironmentVarGuard() as env:
219 env.clear()
220 unonascii = test_support.FS_NONASCII
221 snonascii = unonascii.encode(encoding)
222 env['spam'] = snonascii
223 env[snonascii] = 'ham' + snonascii
224 check('$spam bar', '%s bar' % snonascii)
225 check('$%s bar' % snonascii, '$%s bar' % snonascii)
226 check('${spam}bar', '%sbar' % snonascii)
227 check('${%s}bar' % snonascii, 'ham%sbar' % snonascii)
228 check('$spam}bar', '%s}bar' % snonascii)
229 check('$%s}bar' % snonascii, '$%s}bar' % snonascii)
230 check('%spam% bar', '%s bar' % snonascii)
231 check('%{}% bar'.format(snonascii), 'ham%s bar' % snonascii)
232 check('%spam%bar', '%sbar' % snonascii)
233 check('%{}%bar'.format(snonascii), 'ham%sbar' % snonascii)
234
Serhiy Storchaka49b20862014-05-28 18:11:08 +0300235 def test_expanduser(self):
236 tester('ntpath.expanduser("test")', 'test')
237
238 with test_support.EnvironmentVarGuard() as env:
239 env.clear()
240 tester('ntpath.expanduser("~test")', '~test')
241
242 env['HOMEPATH'] = 'eric\\idle'
243 env['HOMEDRIVE'] = 'C:\\'
244 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
245 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
246
247 del env['HOMEDRIVE']
248 tester('ntpath.expanduser("~test")', 'eric\\test')
249 tester('ntpath.expanduser("~")', 'eric\\idle')
250
251 env.clear()
252 env['USERPROFILE'] = 'C:\\eric\\idle'
253 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
254 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
255
256 env.clear()
257 env['HOME'] = 'C:\\idle\\eric'
258 tester('ntpath.expanduser("~test")', 'C:\\idle\\test')
259 tester('ntpath.expanduser("~")', 'C:\\idle\\eric')
260
261 tester('ntpath.expanduser("~test\\foo\\bar")',
262 'C:\\idle\\test\\foo\\bar')
263 tester('ntpath.expanduser("~test/foo/bar")',
264 'C:\\idle\\test/foo/bar')
265 tester('ntpath.expanduser("~\\foo\\bar")',
266 'C:\\idle\\eric\\foo\\bar')
267 tester('ntpath.expanduser("~/foo/bar")',
268 'C:\\idle\\eric/foo/bar')
269
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000270 def test_abspath(self):
271 # ntpath.abspath() can only be used on a system with the "nt" module
272 # (reasonably), so we protect this test with "import nt". This allows
273 # the rest of the tests for the ntpath module to be run to completion
274 # on any platform, since most of the module is intended to be usable
275 # from any platform.
Ezio Melotti4cc80ca2010-02-20 08:09:39 +0000276 # XXX this needs more tests
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000277 try:
278 import nt
279 except ImportError:
Ezio Melotti4cc80ca2010-02-20 08:09:39 +0000280 # check that the function is there even if we are not on Windows
281 ntpath.abspath
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000282 else:
283 tester('ntpath.abspath("C:\\")', "C:\\")
284
285 def test_relpath(self):
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000286 tester('ntpath.relpath("a")', 'a')
287 tester('ntpath.relpath(os.path.abspath("a"))', 'a')
288 tester('ntpath.relpath("a/b")', 'a\\b')
289 tester('ntpath.relpath("../a/b")', '..\\a\\b')
Serhiy Storchaka38a33ec2015-01-26 10:26:00 +0200290 with test_support.temp_cwd(test_support.TESTFN) as cwd_dir:
291 currentdir = os.path.basename(cwd_dir)
292 tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
293 tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000294 tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
295 tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
296 tester('ntpath.relpath("a", "a")', '.')
Hirokazu Yamamoto50f7d7e2010-10-18 13:55:29 +0000297 tester('ntpath.relpath("/foo/bar/bat", "/x/y/z")', '..\\..\\..\\foo\\bar\\bat')
298 tester('ntpath.relpath("/foo/bar/bat", "/foo/bar")', 'bat')
299 tester('ntpath.relpath("/foo/bar/bat", "/")', 'foo\\bar\\bat')
300 tester('ntpath.relpath("/", "/foo/bar/bat")', '..\\..\\..')
301 tester('ntpath.relpath("/foo/bar/bat", "/x")', '..\\foo\\bar\\bat')
302 tester('ntpath.relpath("/x", "/foo/bar/bat")', '..\\..\\..\\x')
303 tester('ntpath.relpath("/", "/")', '.')
304 tester('ntpath.relpath("/a", "/a")', '.')
305 tester('ntpath.relpath("/a/b", "/a/b")', '.')
306 tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000307
308
Florent Xiclunadc1531c2010-03-06 18:07:18 +0000309class NtCommonTest(test_genericpath.CommonTest):
Florent Xicluna985478d2010-03-06 18:52:52 +0000310 pathmodule = ntpath
Florent Xiclunadc1531c2010-03-06 18:07:18 +0000311 attributes = ['relpath', 'splitunc']
312
313
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000314def test_main():
Florent Xiclunadc1531c2010-03-06 18:07:18 +0000315 test_support.run_unittest(TestNtpath, NtCommonTest)
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000316
317
318if __name__ == "__main__":
319 unittest.main()