1# coding: utf-8 2import ntpath 3import os 4import sys 5from test.test_support import TestFailed 6from test import test_support, test_genericpath 7import unittest 8 9def 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) 14 15def tester(fn, wantResult): 16 fn = fn.replace("\\", "\\\\") 17 tester0(fn, wantResult) 18 19 20class 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')) 32 33 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')) 38 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')) 53 self.assertEqual(ntpath.splitdrive("//"), ("", "//")) 54 55 def test_splitunc(self): 56 tester('ntpath.splitunc("c:\\foo\\bar")', 57 ('', 'c:\\foo\\bar')) 58 tester('ntpath.splitunc("c:/foo/bar")', 59 ('', 'c:/foo/bar')) 60 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')) 64 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')) 72 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')) 75 76 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')) 80 81 tester('ntpath.split("c:\\")', ('c:\\', '')) 82 tester('ntpath.split("\\\\conky\\mountpoint\\")', 83 ('\\\\conky\\mountpoint\\', '')) 84 85 tester('ntpath.split("c:/")', ('c:/', '')) 86 tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', '')) 87 88 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) 93 94 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") 101 102 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:') 109 tester('ntpath.join("a:", "\\b")', 'a:\\b') 110 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') 117 118 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\\') 124 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') 135 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') 138 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') 145 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') 148 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) 157 158 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') 165 166 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') 169 170 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') 181 182 tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL') 183 tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z') 184 185 def test_expandvars(self): 186 with test_support.EnvironmentVarGuard() as env: 187 env.clear() 188 env["foo"] = "bar" 189 env["{foo"] = "baz1" 190 env["{foo}"] = "baz2" 191 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") 197 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") 209 tester('ntpath.expandvars("bar\'%foo%")', "bar\'%foo%") 210 211 @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 235 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 270 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. 276 # XXX this needs more tests 277 try: 278 import nt 279 except ImportError: 280 # check that the function is there even if we are not on Windows 281 ntpath.abspath 282 else: 283 tester('ntpath.abspath("C:\\")', "C:\\") 284 285 def test_relpath(self): 286 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') 290 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') 294 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")', '.') 297 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")', '.') 307 308 309class NtCommonTest(test_genericpath.CommonTest): 310 pathmodule = ntpath 311 attributes = ['relpath', 'splitunc'] 312 313 314def test_main(): 315 test_support.run_unittest(TestNtpath, NtCommonTest) 316 317 318if __name__ == "__main__": 319 unittest.main() 320