blob: dacddded3dd7c1cb1248a5538d3e840571eeed10 [file] [log] [blame]
Guido van Rossumead9d8d1999-02-03 17:21:21 +00001import ntpath
Mark Hammond673c6cf2000-08-14 06:21:26 +00002import os
Brian Curtin13a0db52010-09-06 19:46:17 +00003import sys
Victor Stinner1ab6c2d2011-11-15 22:27:41 +01004import unittest
5import warnings
Georg Brandl1b37e872010-03-14 10:45:50 +00006from test.support import TestFailed
Florent Xiclunac9c79782010-03-08 12:24:53 +00007from test import support, test_genericpath
Brian Curtin62857742010-09-06 17:07:27 +00008from tempfile import TemporaryFile
Guido van Rossumead9d8d1999-02-03 17:21:21 +00009
Guido van Rossumead9d8d1999-02-03 17:21:21 +000010
11def tester(fn, wantResult):
Eric S. Raymondfc170b12001-02-09 11:51:27 +000012 fn = fn.replace("\\", "\\\\")
Fred Drake004d5e62000-10-23 17:22:08 +000013 gotResult = eval(fn)
14 if wantResult != gotResult:
Christian Heimesf6cd9672008-03-26 13:45:42 +000015 raise TestFailed("%s should return: %s but returned: %s" \
16 %(str(fn), str(wantResult), str(gotResult)))
Tim Peters6578dc92002-12-24 18:31:27 +000017
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000018 # then with bytes
19 fn = fn.replace("('", "(b'")
20 fn = fn.replace('("', '(b"')
21 fn = fn.replace("['", "[b'")
22 fn = fn.replace('["', '[b"')
23 fn = fn.replace(", '", ", b'")
24 fn = fn.replace(', "', ', b"')
Serhiy Storchakadbb10192014-02-13 10:13:53 +020025 fn = os.fsencode(fn).decode('latin1')
26 fn = fn.encode('ascii', 'backslashreplace').decode('ascii')
Victor Stinner1ab6c2d2011-11-15 22:27:41 +010027 with warnings.catch_warnings():
28 warnings.simplefilter("ignore", DeprecationWarning)
29 gotResult = eval(fn)
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000030 if isinstance(wantResult, str):
Serhiy Storchakadbb10192014-02-13 10:13:53 +020031 wantResult = os.fsencode(wantResult)
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000032 elif isinstance(wantResult, tuple):
Serhiy Storchakadbb10192014-02-13 10:13:53 +020033 wantResult = tuple(os.fsencode(r) for r in wantResult)
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000034
35 gotResult = eval(fn)
36 if wantResult != gotResult:
37 raise TestFailed("%s should return: %s but returned: %s" \
38 %(str(fn), str(wantResult), repr(gotResult)))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000039
Mark Hammond5a607a32009-05-06 08:04:54 +000040
Christian Heimesf6cd9672008-03-26 13:45:42 +000041class TestNtpath(unittest.TestCase):
42 def test_splitext(self):
43 tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
44 tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
45 tester('ntpath.splitext(".ext")', ('.ext', ''))
46 tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
47 tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
48 tester('ntpath.splitext("")', ('', ''))
49 tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
50 tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
51 tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
52 tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000053
Christian Heimesf6cd9672008-03-26 13:45:42 +000054 def test_splitdrive(self):
55 tester('ntpath.splitdrive("c:\\foo\\bar")',
56 ('c:', '\\foo\\bar'))
57 tester('ntpath.splitdrive("c:/foo/bar")',
58 ('c:', '/foo/bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +000059 tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")',
Christian Heimesf6cd9672008-03-26 13:45:42 +000060 ('\\\\conky\\mountpoint', '\\foo\\bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +000061 tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")',
Christian Heimesf6cd9672008-03-26 13:45:42 +000062 ('//conky/mountpoint', '/foo/bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +000063 tester('ntpath.splitdrive("\\\\\\conky\\mountpoint\\foo\\bar")',
64 ('', '\\\\\\conky\\mountpoint\\foo\\bar'))
65 tester('ntpath.splitdrive("///conky/mountpoint/foo/bar")',
66 ('', '///conky/mountpoint/foo/bar'))
67 tester('ntpath.splitdrive("\\\\conky\\\\mountpoint\\foo\\bar")',
68 ('', '\\\\conky\\\\mountpoint\\foo\\bar'))
69 tester('ntpath.splitdrive("//conky//mountpoint/foo/bar")',
70 ('', '//conky//mountpoint/foo/bar'))
Serhiy Storchaka3d7e1152013-12-16 14:34:55 +020071 # Issue #19911: UNC part containing U+0130
72 self.assertEqual(ntpath.splitdrive('//conky/MOUNTPOİNT/foo/bar'),
73 ('//conky/MOUNTPOİNT', '/foo/bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000074
Serhiy Storchaka593568b2013-12-16 15:13:28 +020075 def test_splitunc(self):
76 with self.assertWarns(DeprecationWarning):
77 ntpath.splitunc('')
78 with support.check_warnings(('', DeprecationWarning)):
79 tester('ntpath.splitunc("c:\\foo\\bar")',
80 ('', 'c:\\foo\\bar'))
81 tester('ntpath.splitunc("c:/foo/bar")',
82 ('', 'c:/foo/bar'))
83 tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")',
84 ('\\\\conky\\mountpoint', '\\foo\\bar'))
85 tester('ntpath.splitunc("//conky/mountpoint/foo/bar")',
86 ('//conky/mountpoint', '/foo/bar'))
87 tester('ntpath.splitunc("\\\\\\conky\\mountpoint\\foo\\bar")',
88 ('', '\\\\\\conky\\mountpoint\\foo\\bar'))
89 tester('ntpath.splitunc("///conky/mountpoint/foo/bar")',
90 ('', '///conky/mountpoint/foo/bar'))
91 tester('ntpath.splitunc("\\\\conky\\\\mountpoint\\foo\\bar")',
92 ('', '\\\\conky\\\\mountpoint\\foo\\bar'))
93 tester('ntpath.splitunc("//conky//mountpoint/foo/bar")',
94 ('', '//conky//mountpoint/foo/bar'))
95 self.assertEqual(ntpath.splitunc('//conky/MOUNTPOİNT/foo/bar'),
96 ('//conky/MOUNTPOİNT', '/foo/bar'))
97
Christian Heimesf6cd9672008-03-26 13:45:42 +000098 def test_split(self):
99 tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
100 tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
101 ('\\\\conky\\mountpoint\\foo', 'bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +0000102
Christian Heimesf6cd9672008-03-26 13:45:42 +0000103 tester('ntpath.split("c:\\")', ('c:\\', ''))
104 tester('ntpath.split("\\\\conky\\mountpoint\\")',
Mark Hammond5a607a32009-05-06 08:04:54 +0000105 ('\\\\conky\\mountpoint\\', ''))
Guido van Rossumead9d8d1999-02-03 17:21:21 +0000106
Christian Heimesf6cd9672008-03-26 13:45:42 +0000107 tester('ntpath.split("c:/")', ('c:/', ''))
Mark Hammond5a607a32009-05-06 08:04:54 +0000108 tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
Mark Hammond673c6cf2000-08-14 06:21:26 +0000109
Christian Heimesf6cd9672008-03-26 13:45:42 +0000110 def test_isabs(self):
111 tester('ntpath.isabs("c:\\")', 1)
112 tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
113 tester('ntpath.isabs("\\foo")', 1)
114 tester('ntpath.isabs("\\foo\\bar")', 1)
Tim Petersd4f7f602001-07-19 19:11:41 +0000115
Christian Heimesf6cd9672008-03-26 13:45:42 +0000116 def test_commonprefix(self):
117 tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
118 "/home/swen")
119 tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
120 "\\home\\swen\\")
121 tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
122 "/home/swen/spam")
Tim Peters6a3e5f12001-11-05 21:25:02 +0000123
Christian Heimesf6cd9672008-03-26 13:45:42 +0000124 def test_join(self):
125 tester('ntpath.join("")', '')
126 tester('ntpath.join("", "", "")', '')
127 tester('ntpath.join("a")', 'a')
128 tester('ntpath.join("/a")', '/a')
129 tester('ntpath.join("\\a")', '\\a')
130 tester('ntpath.join("a:")', 'a:')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000131 tester('ntpath.join("a:", "\\b")', 'a:\\b')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000132 tester('ntpath.join("a", "\\b")', '\\b')
133 tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
134 tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
135 tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
136 tester('ntpath.join("a", "b", "\\c")', '\\c')
137 tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
138 tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
Tim Peters54a14a32001-08-30 22:05:26 +0000139
Christian Heimesf6cd9672008-03-26 13:45:42 +0000140 tester("ntpath.join('', 'a')", 'a')
141 tester("ntpath.join('', '', '', '', 'a')", 'a')
142 tester("ntpath.join('a', '')", 'a\\')
143 tester("ntpath.join('a', '', '', '', '')", 'a\\')
144 tester("ntpath.join('a\\', '')", 'a\\')
145 tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200146 tester("ntpath.join('a/', '')", 'a/')
Tim Peters54a14a32001-08-30 22:05:26 +0000147
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200148 tester("ntpath.join('a/b', 'x/y')", 'a/b\\x/y')
149 tester("ntpath.join('/a/b', 'x/y')", '/a/b\\x/y')
150 tester("ntpath.join('/a/b/', 'x/y')", '/a/b/x/y')
151 tester("ntpath.join('c:', 'x/y')", 'c:x/y')
152 tester("ntpath.join('c:a/b', 'x/y')", 'c:a/b\\x/y')
153 tester("ntpath.join('c:a/b/', 'x/y')", 'c:a/b/x/y')
154 tester("ntpath.join('c:/', 'x/y')", 'c:/x/y')
155 tester("ntpath.join('c:/a/b', 'x/y')", 'c:/a/b\\x/y')
156 tester("ntpath.join('c:/a/b/', 'x/y')", 'c:/a/b/x/y')
157 tester("ntpath.join('//computer/share', 'x/y')", '//computer/share\\x/y')
158 tester("ntpath.join('//computer/share/', 'x/y')", '//computer/share/x/y')
159 tester("ntpath.join('//computer/share/a/b', 'x/y')", '//computer/share/a/b\\x/y')
Mark Hammond5a607a32009-05-06 08:04:54 +0000160
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200161 tester("ntpath.join('a/b', '/x/y')", '/x/y')
162 tester("ntpath.join('/a/b', '/x/y')", '/x/y')
163 tester("ntpath.join('c:', '/x/y')", 'c:/x/y')
164 tester("ntpath.join('c:a/b', '/x/y')", 'c:/x/y')
165 tester("ntpath.join('c:/', '/x/y')", 'c:/x/y')
166 tester("ntpath.join('c:/a/b', '/x/y')", 'c:/x/y')
167 tester("ntpath.join('//computer/share', '/x/y')", '//computer/share/x/y')
168 tester("ntpath.join('//computer/share/', '/x/y')", '//computer/share/x/y')
169 tester("ntpath.join('//computer/share/a', '/x/y')", '//computer/share/x/y')
170
171 tester("ntpath.join('c:', 'C:x/y')", 'C:x/y')
172 tester("ntpath.join('c:a/b', 'C:x/y')", 'C:a/b\\x/y')
173 tester("ntpath.join('c:/', 'C:x/y')", 'C:/x/y')
174 tester("ntpath.join('c:/a/b', 'C:x/y')", 'C:/a/b\\x/y')
175
176 for x in ('', 'a/b', '/a/b', 'c:', 'c:a/b', 'c:/', 'c:/a/b',
177 '//computer/share', '//computer/share/', '//computer/share/a/b'):
178 for y in ('d:', 'd:x/y', 'd:/', 'd:/x/y',
179 '//machine/common', '//machine/common/', '//machine/common/x/y'):
180 tester("ntpath.join(%r, %r)" % (x, y), y)
Mark Hammond5a607a32009-05-06 08:04:54 +0000181
182 tester("ntpath.join('\\\\computer\\share\\', 'a', 'b')", '\\\\computer\\share\\a\\b')
183 tester("ntpath.join('\\\\computer\\share', 'a', 'b')", '\\\\computer\\share\\a\\b')
184 tester("ntpath.join('\\\\computer\\share', 'a\\b')", '\\\\computer\\share\\a\\b')
185 tester("ntpath.join('//computer/share/', 'a', 'b')", '//computer/share/a\\b')
186 tester("ntpath.join('//computer/share', 'a', 'b')", '//computer/share\\a\\b')
187 tester("ntpath.join('//computer/share', 'a/b')", '//computer/share\\a/b')
188
Christian Heimesf6cd9672008-03-26 13:45:42 +0000189 def test_normpath(self):
190 tester("ntpath.normpath('A//////././//.//B')", r'A\B')
191 tester("ntpath.normpath('A/./B')", r'A\B')
192 tester("ntpath.normpath('A/foo/../B')", r'A\B')
193 tester("ntpath.normpath('C:A//B')", r'C:A\B')
194 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
195 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
Tim Peters54a14a32001-08-30 22:05:26 +0000196
Christian Heimesf6cd9672008-03-26 13:45:42 +0000197 tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
198 tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
199 tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
Thomas Woutersb2137042007-02-01 18:02:27 +0000200
Christian Heimesf6cd9672008-03-26 13:45:42 +0000201 tester("ntpath.normpath('..')", r'..')
202 tester("ntpath.normpath('.')", r'.')
203 tester("ntpath.normpath('')", r'.')
204 tester("ntpath.normpath('/')", '\\')
205 tester("ntpath.normpath('c:/')", 'c:\\')
206 tester("ntpath.normpath('/../.././..')", '\\')
207 tester("ntpath.normpath('c:/../../..')", 'c:\\')
208 tester("ntpath.normpath('../.././..')", r'..\..\..')
209 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
210 tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
211 tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
Fred Drake5e997312002-01-15 03:46:43 +0000212
Georg Brandlcfb68212010-07-31 21:40:15 +0000213 tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL')
214 tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z')
215
Christian Heimesf6cd9672008-03-26 13:45:42 +0000216 def test_expandvars(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000217 with support.EnvironmentVarGuard() as env:
218 env.clear()
219 env["foo"] = "bar"
220 env["{foo"] = "baz1"
221 env["{foo}"] = "baz2"
Christian Heimesf6cd9672008-03-26 13:45:42 +0000222 tester('ntpath.expandvars("foo")', "foo")
223 tester('ntpath.expandvars("$foo bar")', "bar bar")
224 tester('ntpath.expandvars("${foo}bar")', "barbar")
225 tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
226 tester('ntpath.expandvars("$bar bar")', "$bar bar")
227 tester('ntpath.expandvars("$?bar")', "$?bar")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000228 tester('ntpath.expandvars("$foo}bar")', "bar}bar")
229 tester('ntpath.expandvars("${foo")', "${foo")
230 tester('ntpath.expandvars("${{foo}}")', "baz1}")
231 tester('ntpath.expandvars("$foo$foo")', "barbar")
232 tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
233 tester('ntpath.expandvars("%foo% bar")', "bar bar")
234 tester('ntpath.expandvars("%foo%bar")', "barbar")
235 tester('ntpath.expandvars("%foo%%foo%")', "barbar")
236 tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
237 tester('ntpath.expandvars("%?bar%")', "%?bar%")
238 tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
239 tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
Serhiy Storchaka1b87ae02015-03-25 16:40:15 +0200240 tester('ntpath.expandvars("bar\'%foo%")', "bar\'%foo%")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000241
Serhiy Storchakadbb10192014-02-13 10:13:53 +0200242 @unittest.skipUnless(support.FS_NONASCII, 'need support.FS_NONASCII')
243 def test_expandvars_nonascii(self):
244 def check(value, expected):
245 tester('ntpath.expandvars(%r)' % value, expected)
246 with support.EnvironmentVarGuard() as env:
247 env.clear()
248 nonascii = support.FS_NONASCII
249 env['spam'] = nonascii
250 env[nonascii] = 'ham' + nonascii
251 check('$spam bar', '%s bar' % nonascii)
252 check('$%s bar' % nonascii, '$%s bar' % nonascii)
253 check('${spam}bar', '%sbar' % nonascii)
254 check('${%s}bar' % nonascii, 'ham%sbar' % nonascii)
255 check('$spam}bar', '%s}bar' % nonascii)
256 check('$%s}bar' % nonascii, '$%s}bar' % nonascii)
257 check('%spam% bar', '%s bar' % nonascii)
258 check('%{}% bar'.format(nonascii), 'ham%s bar' % nonascii)
259 check('%spam%bar', '%sbar' % nonascii)
260 check('%{}%bar'.format(nonascii), 'ham%sbar' % nonascii)
261
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300262 def test_expanduser(self):
263 tester('ntpath.expanduser("test")', 'test')
264
265 with support.EnvironmentVarGuard() as env:
266 env.clear()
267 tester('ntpath.expanduser("~test")', '~test')
268
269 env['HOMEPATH'] = 'eric\\idle'
270 env['HOMEDRIVE'] = 'C:\\'
271 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
272 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
273
274 del env['HOMEDRIVE']
275 tester('ntpath.expanduser("~test")', 'eric\\test')
276 tester('ntpath.expanduser("~")', 'eric\\idle')
277
278 env.clear()
279 env['USERPROFILE'] = 'C:\\eric\\idle'
280 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
281 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
282
283 env.clear()
284 env['HOME'] = 'C:\\idle\\eric'
285 tester('ntpath.expanduser("~test")', 'C:\\idle\\test')
286 tester('ntpath.expanduser("~")', 'C:\\idle\\eric')
287
288 tester('ntpath.expanduser("~test\\foo\\bar")',
289 'C:\\idle\\test\\foo\\bar')
290 tester('ntpath.expanduser("~test/foo/bar")',
291 'C:\\idle\\test/foo/bar')
292 tester('ntpath.expanduser("~\\foo\\bar")',
293 'C:\\idle\\eric\\foo\\bar')
294 tester('ntpath.expanduser("~/foo/bar")',
295 'C:\\idle\\eric/foo/bar')
296
Christian Heimesf6cd9672008-03-26 13:45:42 +0000297 def test_abspath(self):
298 # ntpath.abspath() can only be used on a system with the "nt" module
299 # (reasonably), so we protect this test with "import nt". This allows
300 # the rest of the tests for the ntpath module to be run to completion
301 # on any platform, since most of the module is intended to be usable
302 # from any platform.
303 try:
304 import nt
Mark Hammond5a607a32009-05-06 08:04:54 +0000305 tester('ntpath.abspath("C:\\")', "C:\\")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000306 except ImportError:
Zachary Ware9fe6d862013-12-08 00:20:35 -0600307 self.skipTest('nt module not available')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000308
309 def test_relpath(self):
Christian Heimesf6cd9672008-03-26 13:45:42 +0000310 tester('ntpath.relpath("a")', 'a')
311 tester('ntpath.relpath(os.path.abspath("a"))', 'a')
312 tester('ntpath.relpath("a/b")', 'a\\b')
313 tester('ntpath.relpath("../a/b")', '..\\a\\b')
Serhiy Storchaka5106d042015-01-26 10:26:14 +0200314 with support.temp_cwd(support.TESTFN) as cwd_dir:
315 currentdir = os.path.basename(cwd_dir)
316 tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
317 tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000318 tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
Mark Hammond5a607a32009-05-06 08:04:54 +0000319 tester('ntpath.relpath("c:/foo/bar/bat", "c:/x/y")', '..\\..\\foo\\bar\\bat')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000320 tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
321 tester('ntpath.relpath("a", "a")', '.')
Mark Hammond5a607a32009-05-06 08:04:54 +0000322 tester('ntpath.relpath("/foo/bar/bat", "/x/y/z")', '..\\..\\..\\foo\\bar\\bat')
323 tester('ntpath.relpath("/foo/bar/bat", "/foo/bar")', 'bat')
324 tester('ntpath.relpath("/foo/bar/bat", "/")', 'foo\\bar\\bat')
325 tester('ntpath.relpath("/", "/foo/bar/bat")', '..\\..\\..')
326 tester('ntpath.relpath("/foo/bar/bat", "/x")', '..\\foo\\bar\\bat')
327 tester('ntpath.relpath("/x", "/foo/bar/bat")', '..\\..\\..\\x')
328 tester('ntpath.relpath("/", "/")', '.')
329 tester('ntpath.relpath("/a", "/a")', '.')
330 tester('ntpath.relpath("/a/b", "/a/b")', '.')
Hirokazu Yamamotob08820a2010-10-18 12:13:18 +0000331 tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000332
Brian Curtin62857742010-09-06 17:07:27 +0000333 def test_sameopenfile(self):
334 with TemporaryFile() as tf1, TemporaryFile() as tf2:
335 # Make sure the same file is really the same
336 self.assertTrue(ntpath.sameopenfile(tf1.fileno(), tf1.fileno()))
337 # Make sure different files are really different
338 self.assertFalse(ntpath.sameopenfile(tf1.fileno(), tf2.fileno()))
Brian Curtin13a0db52010-09-06 19:46:17 +0000339 # Make sure invalid values don't cause issues on win32
340 if sys.platform == "win32":
Hirokazu Yamamoto26253bb2010-12-05 04:16:47 +0000341 with self.assertRaises(OSError):
Brian Curtin13a0db52010-09-06 19:46:17 +0000342 # Invalid file descriptors shouldn't display assert
343 # dialogs (#4804)
344 ntpath.sameopenfile(-1, -1)
Brian Curtin62857742010-09-06 17:07:27 +0000345
Tim Golden6b528062013-08-01 12:44:00 +0100346 def test_ismount(self):
347 self.assertTrue(ntpath.ismount("c:\\"))
348 self.assertTrue(ntpath.ismount("C:\\"))
349 self.assertTrue(ntpath.ismount("c:/"))
350 self.assertTrue(ntpath.ismount("C:/"))
351 self.assertTrue(ntpath.ismount("\\\\.\\c:\\"))
352 self.assertTrue(ntpath.ismount("\\\\.\\C:\\"))
353
354 self.assertTrue(ntpath.ismount(b"c:\\"))
355 self.assertTrue(ntpath.ismount(b"C:\\"))
356 self.assertTrue(ntpath.ismount(b"c:/"))
357 self.assertTrue(ntpath.ismount(b"C:/"))
358 self.assertTrue(ntpath.ismount(b"\\\\.\\c:\\"))
359 self.assertTrue(ntpath.ismount(b"\\\\.\\C:\\"))
360
361 with support.temp_dir() as d:
362 self.assertFalse(ntpath.ismount(d))
363
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100364 if sys.platform == "win32":
365 #
366 # Make sure the current folder isn't the root folder
367 # (or any other volume root). The drive-relative
368 # locations below cannot then refer to mount points
369 #
370 drive, path = ntpath.splitdrive(sys.executable)
371 with support.change_cwd(os.path.dirname(sys.executable)):
372 self.assertFalse(ntpath.ismount(drive.lower()))
373 self.assertFalse(ntpath.ismount(drive.upper()))
Tim Golden6b528062013-08-01 12:44:00 +0100374
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100375 self.assertTrue(ntpath.ismount("\\\\localhost\\c$"))
376 self.assertTrue(ntpath.ismount("\\\\localhost\\c$\\"))
Tim Golden6b528062013-08-01 12:44:00 +0100377
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100378 self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$"))
379 self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$\\"))
Christian Heimesf6cd9672008-03-26 13:45:42 +0000380
Ezio Melottid0dfe9a2013-01-10 03:12:50 +0200381class NtCommonTest(test_genericpath.CommonTest, unittest.TestCase):
Florent Xiclunac9c79782010-03-08 12:24:53 +0000382 pathmodule = ntpath
383 attributes = ['relpath', 'splitunc']
384
385
Christian Heimesf6cd9672008-03-26 13:45:42 +0000386if __name__ == "__main__":
387 unittest.main()