blob: 92d85ecbc4fcfed4ec0bb0c3aff95f389ba99c07 [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
Serhiy Storchakab21d1552018-03-02 11:53:51 +02006from test.support import TestFailed, FakePath
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
Steve Dower23ad6d02018-02-22 10:39:10 -080010try:
11 import nt
12except ImportError:
13 # Most tests can complete without the nt module,
14 # but for those that require it we import here.
15 nt = None
Guido van Rossumead9d8d1999-02-03 17:21:21 +000016
17def tester(fn, wantResult):
Eric S. Raymondfc170b12001-02-09 11:51:27 +000018 fn = fn.replace("\\", "\\\\")
Fred Drake004d5e62000-10-23 17:22:08 +000019 gotResult = eval(fn)
20 if wantResult != gotResult:
Christian Heimesf6cd9672008-03-26 13:45:42 +000021 raise TestFailed("%s should return: %s but returned: %s" \
22 %(str(fn), str(wantResult), str(gotResult)))
Tim Peters6578dc92002-12-24 18:31:27 +000023
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000024 # then with bytes
25 fn = fn.replace("('", "(b'")
26 fn = fn.replace('("', '(b"')
27 fn = fn.replace("['", "[b'")
28 fn = fn.replace('["', '[b"')
29 fn = fn.replace(", '", ", b'")
30 fn = fn.replace(', "', ', b"')
Serhiy Storchakadbb10192014-02-13 10:13:53 +020031 fn = os.fsencode(fn).decode('latin1')
32 fn = fn.encode('ascii', 'backslashreplace').decode('ascii')
Victor Stinner1ab6c2d2011-11-15 22:27:41 +010033 with warnings.catch_warnings():
34 warnings.simplefilter("ignore", DeprecationWarning)
35 gotResult = eval(fn)
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000036 if isinstance(wantResult, str):
Serhiy Storchakadbb10192014-02-13 10:13:53 +020037 wantResult = os.fsencode(wantResult)
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000038 elif isinstance(wantResult, tuple):
Serhiy Storchakadbb10192014-02-13 10:13:53 +020039 wantResult = tuple(os.fsencode(r) for r in wantResult)
Amaury Forgeot d'Arcc72ef8b2008-10-03 18:38:26 +000040 if wantResult != gotResult:
41 raise TestFailed("%s should return: %s but returned: %s" \
42 %(str(fn), str(wantResult), repr(gotResult)))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000043
Mark Hammond5a607a32009-05-06 08:04:54 +000044
Christian Heimesf6cd9672008-03-26 13:45:42 +000045class TestNtpath(unittest.TestCase):
46 def test_splitext(self):
47 tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
48 tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
49 tester('ntpath.splitext(".ext")', ('.ext', ''))
50 tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
51 tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
52 tester('ntpath.splitext("")', ('', ''))
53 tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
54 tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
55 tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
56 tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000057
Christian Heimesf6cd9672008-03-26 13:45:42 +000058 def test_splitdrive(self):
59 tester('ntpath.splitdrive("c:\\foo\\bar")',
60 ('c:', '\\foo\\bar'))
61 tester('ntpath.splitdrive("c:/foo/bar")',
62 ('c:', '/foo/bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +000063 tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")',
Christian Heimesf6cd9672008-03-26 13:45:42 +000064 ('\\\\conky\\mountpoint', '\\foo\\bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +000065 tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")',
Christian Heimesf6cd9672008-03-26 13:45:42 +000066 ('//conky/mountpoint', '/foo/bar'))
Mark Hammond5a607a32009-05-06 08:04:54 +000067 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'))
71 tester('ntpath.splitdrive("\\\\conky\\\\mountpoint\\foo\\bar")',
72 ('', '\\\\conky\\\\mountpoint\\foo\\bar'))
73 tester('ntpath.splitdrive("//conky//mountpoint/foo/bar")',
74 ('', '//conky//mountpoint/foo/bar'))
Serhiy Storchaka3d7e1152013-12-16 14:34:55 +020075 # Issue #19911: UNC part containing U+0130
76 self.assertEqual(ntpath.splitdrive('//conky/MOUNTPOİNT/foo/bar'),
77 ('//conky/MOUNTPOİNT', '/foo/bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000078
Christian Heimesf6cd9672008-03-26 13:45:42 +000079 def test_split(self):
80 tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
81 tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
82 ('\\\\conky\\mountpoint\\foo', 'bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000083
Christian Heimesf6cd9672008-03-26 13:45:42 +000084 tester('ntpath.split("c:\\")', ('c:\\', ''))
85 tester('ntpath.split("\\\\conky\\mountpoint\\")',
Mark Hammond5a607a32009-05-06 08:04:54 +000086 ('\\\\conky\\mountpoint\\', ''))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000087
Christian Heimesf6cd9672008-03-26 13:45:42 +000088 tester('ntpath.split("c:/")', ('c:/', ''))
Mark Hammond5a607a32009-05-06 08:04:54 +000089 tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
Mark Hammond673c6cf2000-08-14 06:21:26 +000090
Christian Heimesf6cd9672008-03-26 13:45:42 +000091 def test_isabs(self):
92 tester('ntpath.isabs("c:\\")', 1)
93 tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
94 tester('ntpath.isabs("\\foo")', 1)
95 tester('ntpath.isabs("\\foo\\bar")', 1)
Tim Petersd4f7f602001-07-19 19:11:41 +000096
Christian Heimesf6cd9672008-03-26 13:45:42 +000097 def test_commonprefix(self):
98 tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
99 "/home/swen")
100 tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
101 "\\home\\swen\\")
102 tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
103 "/home/swen/spam")
Tim Peters6a3e5f12001-11-05 21:25:02 +0000104
Christian Heimesf6cd9672008-03-26 13:45:42 +0000105 def test_join(self):
106 tester('ntpath.join("")', '')
107 tester('ntpath.join("", "", "")', '')
108 tester('ntpath.join("a")', 'a')
109 tester('ntpath.join("/a")', '/a')
110 tester('ntpath.join("\\a")', '\\a')
111 tester('ntpath.join("a:")', 'a:')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000112 tester('ntpath.join("a:", "\\b")', 'a:\\b')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000113 tester('ntpath.join("a", "\\b")', '\\b')
114 tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
115 tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
116 tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
117 tester('ntpath.join("a", "b", "\\c")', '\\c')
118 tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
119 tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
Tim Peters54a14a32001-08-30 22:05:26 +0000120
Christian Heimesf6cd9672008-03-26 13:45:42 +0000121 tester("ntpath.join('', 'a')", 'a')
122 tester("ntpath.join('', '', '', '', 'a')", 'a')
123 tester("ntpath.join('a', '')", 'a\\')
124 tester("ntpath.join('a', '', '', '', '')", 'a\\')
125 tester("ntpath.join('a\\', '')", 'a\\')
126 tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200127 tester("ntpath.join('a/', '')", 'a/')
Tim Peters54a14a32001-08-30 22:05:26 +0000128
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200129 tester("ntpath.join('a/b', 'x/y')", 'a/b\\x/y')
130 tester("ntpath.join('/a/b', 'x/y')", '/a/b\\x/y')
131 tester("ntpath.join('/a/b/', 'x/y')", '/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')
135 tester("ntpath.join('c:/', 'x/y')", 'c:/x/y')
136 tester("ntpath.join('c:/a/b', 'x/y')", 'c:/a/b\\x/y')
137 tester("ntpath.join('c:/a/b/', 'x/y')", 'c:/a/b/x/y')
138 tester("ntpath.join('//computer/share', 'x/y')", '//computer/share\\x/y')
139 tester("ntpath.join('//computer/share/', 'x/y')", '//computer/share/x/y')
140 tester("ntpath.join('//computer/share/a/b', 'x/y')", '//computer/share/a/b\\x/y')
Mark Hammond5a607a32009-05-06 08:04:54 +0000141
Serhiy Storchakac369c2c2014-01-27 23:15:14 +0200142 tester("ntpath.join('a/b', '/x/y')", '/x/y')
143 tester("ntpath.join('/a/b', '/x/y')", '/x/y')
144 tester("ntpath.join('c:', '/x/y')", 'c:/x/y')
145 tester("ntpath.join('c:a/b', '/x/y')", 'c:/x/y')
146 tester("ntpath.join('c:/', '/x/y')", 'c:/x/y')
147 tester("ntpath.join('c:/a/b', '/x/y')", 'c:/x/y')
148 tester("ntpath.join('//computer/share', '/x/y')", '//computer/share/x/y')
149 tester("ntpath.join('//computer/share/', '/x/y')", '//computer/share/x/y')
150 tester("ntpath.join('//computer/share/a', '/x/y')", '//computer/share/x/y')
151
152 tester("ntpath.join('c:', 'C:x/y')", 'C:x/y')
153 tester("ntpath.join('c:a/b', 'C:x/y')", 'C:a/b\\x/y')
154 tester("ntpath.join('c:/', 'C:x/y')", 'C:/x/y')
155 tester("ntpath.join('c:/a/b', 'C:x/y')", 'C:/a/b\\x/y')
156
157 for x in ('', 'a/b', '/a/b', 'c:', 'c:a/b', 'c:/', 'c:/a/b',
158 '//computer/share', '//computer/share/', '//computer/share/a/b'):
159 for y in ('d:', 'd:x/y', 'd:/', 'd:/x/y',
160 '//machine/common', '//machine/common/', '//machine/common/x/y'):
161 tester("ntpath.join(%r, %r)" % (x, y), y)
Mark Hammond5a607a32009-05-06 08:04:54 +0000162
163 tester("ntpath.join('\\\\computer\\share\\', 'a', 'b')", '\\\\computer\\share\\a\\b')
164 tester("ntpath.join('\\\\computer\\share', 'a', 'b')", '\\\\computer\\share\\a\\b')
165 tester("ntpath.join('\\\\computer\\share', 'a\\b')", '\\\\computer\\share\\a\\b')
166 tester("ntpath.join('//computer/share/', 'a', 'b')", '//computer/share/a\\b')
167 tester("ntpath.join('//computer/share', 'a', 'b')", '//computer/share\\a\\b')
168 tester("ntpath.join('//computer/share', 'a/b')", '//computer/share\\a/b')
169
Christian Heimesf6cd9672008-03-26 13:45:42 +0000170 def test_normpath(self):
171 tester("ntpath.normpath('A//////././//.//B')", r'A\B')
172 tester("ntpath.normpath('A/./B')", r'A\B')
173 tester("ntpath.normpath('A/foo/../B')", r'A\B')
174 tester("ntpath.normpath('C:A//B')", r'C:A\B')
175 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
176 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
Tim Peters54a14a32001-08-30 22:05:26 +0000177
Christian Heimesf6cd9672008-03-26 13:45:42 +0000178 tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
179 tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
180 tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
Thomas Woutersb2137042007-02-01 18:02:27 +0000181
Christian Heimesf6cd9672008-03-26 13:45:42 +0000182 tester("ntpath.normpath('..')", r'..')
183 tester("ntpath.normpath('.')", r'.')
184 tester("ntpath.normpath('')", r'.')
185 tester("ntpath.normpath('/')", '\\')
186 tester("ntpath.normpath('c:/')", 'c:\\')
187 tester("ntpath.normpath('/../.././..')", '\\')
188 tester("ntpath.normpath('c:/../../..')", 'c:\\')
189 tester("ntpath.normpath('../.././..')", r'..\..\..')
190 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
191 tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
192 tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
Fred Drake5e997312002-01-15 03:46:43 +0000193
Georg Brandlcfb68212010-07-31 21:40:15 +0000194 tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL')
195 tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z')
196
Christian Heimesf6cd9672008-03-26 13:45:42 +0000197 def test_expandvars(self):
Walter Dörwald155374d2009-05-01 19:58:58 +0000198 with support.EnvironmentVarGuard() as env:
199 env.clear()
200 env["foo"] = "bar"
201 env["{foo"] = "baz1"
202 env["{foo}"] = "baz2"
Christian Heimesf6cd9672008-03-26 13:45:42 +0000203 tester('ntpath.expandvars("foo")', "foo")
204 tester('ntpath.expandvars("$foo bar")', "bar bar")
205 tester('ntpath.expandvars("${foo}bar")', "barbar")
206 tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
207 tester('ntpath.expandvars("$bar bar")', "$bar bar")
208 tester('ntpath.expandvars("$?bar")', "$?bar")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000209 tester('ntpath.expandvars("$foo}bar")', "bar}bar")
210 tester('ntpath.expandvars("${foo")', "${foo")
211 tester('ntpath.expandvars("${{foo}}")', "baz1}")
212 tester('ntpath.expandvars("$foo$foo")', "barbar")
213 tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
214 tester('ntpath.expandvars("%foo% bar")', "bar bar")
215 tester('ntpath.expandvars("%foo%bar")', "barbar")
216 tester('ntpath.expandvars("%foo%%foo%")', "barbar")
217 tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
218 tester('ntpath.expandvars("%?bar%")', "%?bar%")
219 tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
220 tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
Serhiy Storchaka1b87ae02015-03-25 16:40:15 +0200221 tester('ntpath.expandvars("bar\'%foo%")', "bar\'%foo%")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000222
Serhiy Storchakadbb10192014-02-13 10:13:53 +0200223 @unittest.skipUnless(support.FS_NONASCII, 'need support.FS_NONASCII')
224 def test_expandvars_nonascii(self):
225 def check(value, expected):
226 tester('ntpath.expandvars(%r)' % value, expected)
227 with support.EnvironmentVarGuard() as env:
228 env.clear()
229 nonascii = support.FS_NONASCII
230 env['spam'] = nonascii
231 env[nonascii] = 'ham' + nonascii
232 check('$spam bar', '%s bar' % nonascii)
233 check('$%s bar' % nonascii, '$%s bar' % nonascii)
234 check('${spam}bar', '%sbar' % nonascii)
235 check('${%s}bar' % nonascii, 'ham%sbar' % nonascii)
236 check('$spam}bar', '%s}bar' % nonascii)
237 check('$%s}bar' % nonascii, '$%s}bar' % nonascii)
238 check('%spam% bar', '%s bar' % nonascii)
239 check('%{}% bar'.format(nonascii), 'ham%s bar' % nonascii)
240 check('%spam%bar', '%sbar' % nonascii)
241 check('%{}%bar'.format(nonascii), 'ham%sbar' % nonascii)
242
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300243 def test_expanduser(self):
244 tester('ntpath.expanduser("test")', 'test')
245
246 with support.EnvironmentVarGuard() as env:
247 env.clear()
248 tester('ntpath.expanduser("~test")', '~test')
249
250 env['HOMEPATH'] = 'eric\\idle'
251 env['HOMEDRIVE'] = 'C:\\'
252 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
253 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
254
255 del env['HOMEDRIVE']
256 tester('ntpath.expanduser("~test")', 'eric\\test')
257 tester('ntpath.expanduser("~")', 'eric\\idle')
258
259 env.clear()
260 env['USERPROFILE'] = 'C:\\eric\\idle'
261 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
262 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300263 tester('ntpath.expanduser("~test\\foo\\bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700264 'C:\\eric\\test\\foo\\bar')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300265 tester('ntpath.expanduser("~test/foo/bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700266 'C:\\eric\\test/foo/bar')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300267 tester('ntpath.expanduser("~\\foo\\bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700268 'C:\\eric\\idle\\foo\\bar')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300269 tester('ntpath.expanduser("~/foo/bar")',
Anthony Sottile25ec4a42019-03-12 08:39:57 -0700270 'C:\\eric\\idle/foo/bar')
271
272 # bpo-36264: ignore `HOME` when set on windows
273 env.clear()
274 env['HOME'] = 'F:\\'
275 env['USERPROFILE'] = 'C:\\eric\\idle'
276 tester('ntpath.expanduser("~test")', 'C:\\eric\\test')
277 tester('ntpath.expanduser("~")', 'C:\\eric\\idle')
Serhiy Storchakaffc1e6d2014-05-28 18:11:29 +0300278
Steve Dower23ad6d02018-02-22 10:39:10 -0800279 @unittest.skipUnless(nt, "abspath requires 'nt' module")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000280 def test_abspath(self):
Steve Dower23ad6d02018-02-22 10:39:10 -0800281 tester('ntpath.abspath("C:\\")', "C:\\")
Franz Wöllertd2e902e2018-07-29 14:47:09 +0200282 with support.temp_cwd(support.TESTFN) as cwd_dir: # bpo-31047
283 tester('ntpath.abspath("")', cwd_dir)
284 tester('ntpath.abspath(" ")', cwd_dir + "\\ ")
285 tester('ntpath.abspath("?")', cwd_dir + "\\?")
Tim Grahamd03b7752018-10-25 11:26:38 -0400286 drive, _ = ntpath.splitdrive(cwd_dir)
287 tester('ntpath.abspath("/abc/")', drive + "\\abc")
Christian Heimesf6cd9672008-03-26 13:45:42 +0000288
289 def test_relpath(self):
Christian Heimesf6cd9672008-03-26 13:45:42 +0000290 tester('ntpath.relpath("a")', 'a')
291 tester('ntpath.relpath(os.path.abspath("a"))', 'a')
292 tester('ntpath.relpath("a/b")', 'a\\b')
293 tester('ntpath.relpath("../a/b")', '..\\a\\b')
Serhiy Storchaka5106d042015-01-26 10:26:14 +0200294 with support.temp_cwd(support.TESTFN) as cwd_dir:
295 currentdir = os.path.basename(cwd_dir)
296 tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
297 tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000298 tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
Mark Hammond5a607a32009-05-06 08:04:54 +0000299 tester('ntpath.relpath("c:/foo/bar/bat", "c:/x/y")', '..\\..\\foo\\bar\\bat')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000300 tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
301 tester('ntpath.relpath("a", "a")', '.')
Mark Hammond5a607a32009-05-06 08:04:54 +0000302 tester('ntpath.relpath("/foo/bar/bat", "/x/y/z")', '..\\..\\..\\foo\\bar\\bat')
303 tester('ntpath.relpath("/foo/bar/bat", "/foo/bar")', 'bat')
304 tester('ntpath.relpath("/foo/bar/bat", "/")', 'foo\\bar\\bat')
305 tester('ntpath.relpath("/", "/foo/bar/bat")', '..\\..\\..')
306 tester('ntpath.relpath("/foo/bar/bat", "/x")', '..\\foo\\bar\\bat')
307 tester('ntpath.relpath("/x", "/foo/bar/bat")', '..\\..\\..\\x')
308 tester('ntpath.relpath("/", "/")', '.')
309 tester('ntpath.relpath("/a", "/a")', '.')
310 tester('ntpath.relpath("/a/b", "/a/b")', '.')
Hirokazu Yamamotob08820a2010-10-18 12:13:18 +0000311 tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
Christian Heimesf6cd9672008-03-26 13:45:42 +0000312
Serhiy Storchaka38220932015-03-31 15:31:53 +0300313 def test_commonpath(self):
314 def check(paths, expected):
315 tester(('ntpath.commonpath(%r)' % paths).replace('\\\\', '\\'),
316 expected)
317 def check_error(exc, paths):
318 self.assertRaises(exc, ntpath.commonpath, paths)
319 self.assertRaises(exc, ntpath.commonpath,
320 [os.fsencode(p) for p in paths])
321
322 self.assertRaises(ValueError, ntpath.commonpath, [])
323 check_error(ValueError, ['C:\\Program Files', 'Program Files'])
324 check_error(ValueError, ['C:\\Program Files', 'C:Program Files'])
325 check_error(ValueError, ['\\Program Files', 'Program Files'])
326 check_error(ValueError, ['Program Files', 'C:\\Program Files'])
327 check(['C:\\Program Files'], 'C:\\Program Files')
328 check(['C:\\Program Files', 'C:\\Program Files'], 'C:\\Program Files')
329 check(['C:\\Program Files\\', 'C:\\Program Files'],
330 'C:\\Program Files')
331 check(['C:\\Program Files\\', 'C:\\Program Files\\'],
332 'C:\\Program Files')
333 check(['C:\\\\Program Files', 'C:\\Program Files\\\\'],
334 'C:\\Program Files')
335 check(['C:\\.\\Program Files', 'C:\\Program Files\\.'],
336 'C:\\Program Files')
337 check(['C:\\', 'C:\\bin'], 'C:\\')
338 check(['C:\\Program Files', 'C:\\bin'], 'C:\\')
339 check(['C:\\Program Files', 'C:\\Program Files\\Bar'],
340 'C:\\Program Files')
341 check(['C:\\Program Files\\Foo', 'C:\\Program Files\\Bar'],
342 'C:\\Program Files')
343 check(['C:\\Program Files', 'C:\\Projects'], 'C:\\')
344 check(['C:\\Program Files\\', 'C:\\Projects'], 'C:\\')
345
346 check(['C:\\Program Files\\Foo', 'C:/Program Files/Bar'],
347 'C:\\Program Files')
348 check(['C:\\Program Files\\Foo', 'c:/program files/bar'],
349 'C:\\Program Files')
350 check(['c:/program files/bar', 'C:\\Program Files\\Foo'],
351 'c:\\program files')
352
353 check_error(ValueError, ['C:\\Program Files', 'D:\\Program Files'])
354
355 check(['spam'], 'spam')
356 check(['spam', 'spam'], 'spam')
357 check(['spam', 'alot'], '')
358 check(['and\\jam', 'and\\spam'], 'and')
359 check(['and\\\\jam', 'and\\spam\\\\'], 'and')
360 check(['and\\.\\jam', '.\\and\\spam'], 'and')
361 check(['and\\jam', 'and\\spam', 'alot'], '')
362 check(['and\\jam', 'and\\spam', 'and'], 'and')
363 check(['C:and\\jam', 'C:and\\spam'], 'C:and')
364
365 check([''], '')
366 check(['', 'spam\\alot'], '')
367 check_error(ValueError, ['', '\\spam\\alot'])
368
369 self.assertRaises(TypeError, ntpath.commonpath,
370 [b'C:\\Program Files', 'C:\\Program Files\\Foo'])
371 self.assertRaises(TypeError, ntpath.commonpath,
372 [b'C:\\Program Files', 'Program Files\\Foo'])
373 self.assertRaises(TypeError, ntpath.commonpath,
374 [b'Program Files', 'C:\\Program Files\\Foo'])
375 self.assertRaises(TypeError, ntpath.commonpath,
376 ['C:\\Program Files', b'C:\\Program Files\\Foo'])
377 self.assertRaises(TypeError, ntpath.commonpath,
378 ['C:\\Program Files', b'Program Files\\Foo'])
379 self.assertRaises(TypeError, ntpath.commonpath,
380 ['Program Files', b'C:\\Program Files\\Foo'])
381
Brian Curtin62857742010-09-06 17:07:27 +0000382 def test_sameopenfile(self):
383 with TemporaryFile() as tf1, TemporaryFile() as tf2:
384 # Make sure the same file is really the same
385 self.assertTrue(ntpath.sameopenfile(tf1.fileno(), tf1.fileno()))
386 # Make sure different files are really different
387 self.assertFalse(ntpath.sameopenfile(tf1.fileno(), tf2.fileno()))
Brian Curtin13a0db52010-09-06 19:46:17 +0000388 # Make sure invalid values don't cause issues on win32
389 if sys.platform == "win32":
Hirokazu Yamamoto26253bb2010-12-05 04:16:47 +0000390 with self.assertRaises(OSError):
Brian Curtin13a0db52010-09-06 19:46:17 +0000391 # Invalid file descriptors shouldn't display assert
392 # dialogs (#4804)
393 ntpath.sameopenfile(-1, -1)
Brian Curtin62857742010-09-06 17:07:27 +0000394
Tim Golden6b528062013-08-01 12:44:00 +0100395 def test_ismount(self):
396 self.assertTrue(ntpath.ismount("c:\\"))
397 self.assertTrue(ntpath.ismount("C:\\"))
398 self.assertTrue(ntpath.ismount("c:/"))
399 self.assertTrue(ntpath.ismount("C:/"))
400 self.assertTrue(ntpath.ismount("\\\\.\\c:\\"))
401 self.assertTrue(ntpath.ismount("\\\\.\\C:\\"))
402
403 self.assertTrue(ntpath.ismount(b"c:\\"))
404 self.assertTrue(ntpath.ismount(b"C:\\"))
405 self.assertTrue(ntpath.ismount(b"c:/"))
406 self.assertTrue(ntpath.ismount(b"C:/"))
407 self.assertTrue(ntpath.ismount(b"\\\\.\\c:\\"))
408 self.assertTrue(ntpath.ismount(b"\\\\.\\C:\\"))
409
410 with support.temp_dir() as d:
411 self.assertFalse(ntpath.ismount(d))
412
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100413 if sys.platform == "win32":
414 #
415 # Make sure the current folder isn't the root folder
416 # (or any other volume root). The drive-relative
417 # locations below cannot then refer to mount points
418 #
419 drive, path = ntpath.splitdrive(sys.executable)
420 with support.change_cwd(os.path.dirname(sys.executable)):
421 self.assertFalse(ntpath.ismount(drive.lower()))
422 self.assertFalse(ntpath.ismount(drive.upper()))
Tim Golden6b528062013-08-01 12:44:00 +0100423
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100424 self.assertTrue(ntpath.ismount("\\\\localhost\\c$"))
425 self.assertTrue(ntpath.ismount("\\\\localhost\\c$\\"))
Tim Golden6b528062013-08-01 12:44:00 +0100426
Tim Goldenb2fcebb2013-08-01 13:58:58 +0100427 self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$"))
428 self.assertTrue(ntpath.ismount(b"\\\\localhost\\c$\\"))
Christian Heimesf6cd9672008-03-26 13:45:42 +0000429
Tim Goldenff64add2018-07-25 14:36:54 +0100430 def assertEqualCI(self, s1, s2):
431 """Assert that two strings are equal ignoring case differences."""
432 self.assertEqual(s1.lower(), s2.lower())
433
Steve Dower23ad6d02018-02-22 10:39:10 -0800434 @unittest.skipUnless(nt, "OS helpers require 'nt' module")
435 def test_nt_helpers(self):
436 # Trivial validation that the helpers do not break, and support both
437 # unicode and bytes (UTF-8) paths
438
Tim Goldenff64add2018-07-25 14:36:54 +0100439 executable = nt._getfinalpathname(sys.executable)
440
441 for path in executable, os.fsencode(executable):
442 volume_path = nt._getvolumepathname(path)
443 path_drive = ntpath.splitdrive(path)[0]
444 volume_path_drive = ntpath.splitdrive(volume_path)[0]
445 self.assertEqualCI(path_drive, volume_path_drive)
Steve Dower23ad6d02018-02-22 10:39:10 -0800446
447 cap, free = nt._getdiskusage(sys.exec_prefix)
448 self.assertGreater(cap, 0)
449 self.assertGreater(free, 0)
450 b_cap, b_free = nt._getdiskusage(sys.exec_prefix.encode())
451 # Free space may change, so only test the capacity is equal
452 self.assertEqual(b_cap, cap)
453 self.assertGreater(b_free, 0)
454
455 for path in [sys.prefix, sys.executable]:
456 final_path = nt._getfinalpathname(path)
457 self.assertIsInstance(final_path, str)
458 self.assertGreater(len(final_path), 0)
459
460 b_final_path = nt._getfinalpathname(path.encode())
461 self.assertIsInstance(b_final_path, bytes)
462 self.assertGreater(len(b_final_path), 0)
463
Ezio Melottid0dfe9a2013-01-10 03:12:50 +0200464class NtCommonTest(test_genericpath.CommonTest, unittest.TestCase):
Florent Xiclunac9c79782010-03-08 12:24:53 +0000465 pathmodule = ntpath
Serhiy Storchaka9ed707e2017-01-13 20:55:05 +0200466 attributes = ['relpath']
Florent Xiclunac9c79782010-03-08 12:24:53 +0000467
468
Brett Cannon3f9183b2016-08-26 14:44:48 -0700469class PathLikeTests(unittest.TestCase):
470
471 path = ntpath
472
Brett Cannon3f9183b2016-08-26 14:44:48 -0700473 def setUp(self):
474 self.file_name = support.TESTFN.lower()
Serhiy Storchakab21d1552018-03-02 11:53:51 +0200475 self.file_path = FakePath(support.TESTFN)
Brett Cannon3f9183b2016-08-26 14:44:48 -0700476 self.addCleanup(support.unlink, self.file_name)
477 with open(self.file_name, 'xb', 0) as file:
478 file.write(b"test_ntpath.PathLikeTests")
479
480 def assertPathEqual(self, func):
481 self.assertEqual(func(self.file_path), func(self.file_name))
482
483 def test_path_normcase(self):
484 self.assertPathEqual(self.path.normcase)
485
486 def test_path_isabs(self):
487 self.assertPathEqual(self.path.isabs)
488
489 def test_path_join(self):
Serhiy Storchakab21d1552018-03-02 11:53:51 +0200490 self.assertEqual(self.path.join('a', FakePath('b'), 'c'),
Brett Cannon3f9183b2016-08-26 14:44:48 -0700491 self.path.join('a', 'b', 'c'))
492
493 def test_path_split(self):
494 self.assertPathEqual(self.path.split)
495
496 def test_path_splitext(self):
497 self.assertPathEqual(self.path.splitext)
498
499 def test_path_splitdrive(self):
500 self.assertPathEqual(self.path.splitdrive)
501
502 def test_path_basename(self):
503 self.assertPathEqual(self.path.basename)
504
505 def test_path_dirname(self):
506 self.assertPathEqual(self.path.dirname)
507
508 def test_path_islink(self):
509 self.assertPathEqual(self.path.islink)
510
511 def test_path_lexists(self):
512 self.assertPathEqual(self.path.lexists)
513
514 def test_path_ismount(self):
515 self.assertPathEqual(self.path.ismount)
516
517 def test_path_expanduser(self):
518 self.assertPathEqual(self.path.expanduser)
519
520 def test_path_expandvars(self):
521 self.assertPathEqual(self.path.expandvars)
522
523 def test_path_normpath(self):
524 self.assertPathEqual(self.path.normpath)
525
526 def test_path_abspath(self):
527 self.assertPathEqual(self.path.abspath)
528
529 def test_path_realpath(self):
530 self.assertPathEqual(self.path.realpath)
531
532 def test_path_relpath(self):
533 self.assertPathEqual(self.path.relpath)
534
535 def test_path_commonpath(self):
536 common_path = self.path.commonpath([self.file_path, self.file_name])
537 self.assertEqual(common_path, self.file_name)
538
539 def test_path_isdir(self):
540 self.assertPathEqual(self.path.isdir)
541
542
Christian Heimesf6cd9672008-03-26 13:45:42 +0000543if __name__ == "__main__":
544 unittest.main()