blob: a42190786b8f1647b87b3ec637e564c709e32fe9 [file] [log] [blame]
Guido van Rossumead9d8d1999-02-03 17:21:21 +00001import ntpath
Mark Hammond673c6cf2000-08-14 06:21:26 +00002import os
Jerry Seutterfc7b3e32008-03-26 05:58:14 +00003from test.test_support import verbose, TestFailed
4import test.test_support as test_support
5import unittest
Guido van Rossumead9d8d1999-02-03 17:21:21 +00006
Guido van Rossumead9d8d1999-02-03 17:21:21 +00007
8def tester(fn, wantResult):
Eric S. Raymondfc170b12001-02-09 11:51:27 +00009 fn = fn.replace("\\", "\\\\")
Fred Drake004d5e62000-10-23 17:22:08 +000010 gotResult = eval(fn)
11 if wantResult != gotResult:
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000012 raise TestFailed, "%s should return: %s but returned: %s" \
13 %(str(fn), str(wantResult), str(gotResult))
Tim Peters6578dc92002-12-24 18:31:27 +000014
Guido van Rossumead9d8d1999-02-03 17:21:21 +000015
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000016class TestNtpath(unittest.TestCase):
17 def test_splitext(self):
18 tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
19 tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
20 tester('ntpath.splitext(".ext")', ('.ext', ''))
21 tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
22 tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
23 tester('ntpath.splitext("")', ('', ''))
24 tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
25 tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
26 tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
27 tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000028
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000029 def test_splitdrive(self):
30 tester('ntpath.splitdrive("c:\\foo\\bar")',
31 ('c:', '\\foo\\bar'))
32 tester('ntpath.splitdrive("c:/foo/bar")',
33 ('c:', '/foo/bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000034
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000035 def test_splitunc(self):
36 tester('ntpath.splitunc("\\\\conky\\mountpoint\\foo\\bar")',
37 ('\\\\conky\\mountpoint', '\\foo\\bar'))
38 tester('ntpath.splitunc("//conky/mountpoint/foo/bar")',
39 ('//conky/mountpoint', '/foo/bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000040
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000041 def test_split(self):
42 tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
43 tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
44 ('\\\\conky\\mountpoint\\foo', 'bar'))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000045
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000046 tester('ntpath.split("c:\\")', ('c:\\', ''))
47 tester('ntpath.split("\\\\conky\\mountpoint\\")',
48 ('\\\\conky\\mountpoint', ''))
Guido van Rossumead9d8d1999-02-03 17:21:21 +000049
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000050 tester('ntpath.split("c:/")', ('c:/', ''))
51 tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint', ''))
Mark Hammond673c6cf2000-08-14 06:21:26 +000052
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000053 def test_isabs(self):
54 tester('ntpath.isabs("c:\\")', 1)
55 tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
56 tester('ntpath.isabs("\\foo")', 1)
57 tester('ntpath.isabs("\\foo\\bar")', 1)
Tim Petersd4f7f602001-07-19 19:11:41 +000058
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000059 def test_commonprefix(self):
60 tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
61 "/home/swen")
62 tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
63 "\\home\\swen\\")
64 tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
65 "/home/swen/spam")
Tim Peters6a3e5f12001-11-05 21:25:02 +000066
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000067 def test_join(self):
68 tester('ntpath.join("")', '')
69 tester('ntpath.join("", "", "")', '')
70 tester('ntpath.join("a")', 'a')
71 tester('ntpath.join("/a")', '/a')
72 tester('ntpath.join("\\a")', '\\a')
73 tester('ntpath.join("a:")', 'a:')
74 tester('ntpath.join("a:", "b")', 'a:b')
75 tester('ntpath.join("a:", "/b")', 'a:/b')
76 tester('ntpath.join("a:", "\\b")', 'a:\\b')
77 tester('ntpath.join("a", "/b")', '/b')
78 tester('ntpath.join("a", "\\b")', '\\b')
79 tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
80 tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
81 tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
82 tester('ntpath.join("a", "b", "\\c")', '\\c')
83 tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
84 tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
85 tester("ntpath.join('c:', '/a')", 'c:/a')
86 tester("ntpath.join('c:/', '/a')", 'c:/a')
87 tester("ntpath.join('c:/a', '/b')", '/b')
88 tester("ntpath.join('c:', 'd:/')", 'd:/')
89 tester("ntpath.join('c:/', 'd:/')", 'd:/')
90 tester("ntpath.join('c:/', 'd:/a/b')", 'd:/a/b')
Tim Peters54a14a32001-08-30 22:05:26 +000091
Jerry Seutterfc7b3e32008-03-26 05:58:14 +000092 tester("ntpath.join('')", '')
93 tester("ntpath.join('', '', '', '', '')", '')
94 tester("ntpath.join('a')", 'a')
95 tester("ntpath.join('', 'a')", 'a')
96 tester("ntpath.join('', '', '', '', 'a')", 'a')
97 tester("ntpath.join('a', '')", 'a\\')
98 tester("ntpath.join('a', '', '', '', '')", 'a\\')
99 tester("ntpath.join('a\\', '')", 'a\\')
100 tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
Tim Peters54a14a32001-08-30 22:05:26 +0000101
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000102 def test_normpath(self):
103 tester("ntpath.normpath('A//////././//.//B')", r'A\B')
104 tester("ntpath.normpath('A/./B')", r'A\B')
105 tester("ntpath.normpath('A/foo/../B')", r'A\B')
106 tester("ntpath.normpath('C:A//B')", r'C:A\B')
107 tester("ntpath.normpath('D:A/./B')", r'D:A\B')
108 tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
Tim Peters54a14a32001-08-30 22:05:26 +0000109
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000110 tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
111 tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
112 tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
Sjoerd Mullender33a0a062007-01-16 16:42:38 +0000113
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000114 tester("ntpath.normpath('..')", r'..')
115 tester("ntpath.normpath('.')", r'.')
116 tester("ntpath.normpath('')", r'.')
117 tester("ntpath.normpath('/')", '\\')
118 tester("ntpath.normpath('c:/')", 'c:\\')
119 tester("ntpath.normpath('/../.././..')", '\\')
120 tester("ntpath.normpath('c:/../../..')", 'c:\\')
121 tester("ntpath.normpath('../.././..')", r'..\..\..')
122 tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
123 tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
124 tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
Fred Drake5e997312002-01-15 03:46:43 +0000125
Ezio Melotti698037a2010-01-12 03:38:53 +0000126 # Issue 5827: Make sure normpath preserves unicode
127 for path in (u'', u'.', u'/', u'\\', u'///foo/.//bar//'):
128 self.assertTrue(isinstance(ntpath.normpath(path), unicode),
129 'normpath() returned str instead of unicode')
130
Georg Brandle64de922010-08-01 22:10:15 +0000131 tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL')
132 tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z')
133
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000134 def test_expandvars(self):
135 oldenv = os.environ.copy()
136 try:
137 os.environ.clear()
138 os.environ["foo"] = "bar"
139 os.environ["{foo"] = "baz1"
140 os.environ["{foo}"] = "baz2"
141 tester('ntpath.expandvars("foo")', "foo")
142 tester('ntpath.expandvars("$foo bar")', "bar bar")
143 tester('ntpath.expandvars("${foo}bar")', "barbar")
144 tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
145 tester('ntpath.expandvars("$bar bar")', "$bar bar")
146 tester('ntpath.expandvars("$?bar")', "$?bar")
147 tester('ntpath.expandvars("${foo}bar")', "barbar")
148 tester('ntpath.expandvars("$foo}bar")', "bar}bar")
149 tester('ntpath.expandvars("${foo")', "${foo")
150 tester('ntpath.expandvars("${{foo}}")', "baz1}")
151 tester('ntpath.expandvars("$foo$foo")', "barbar")
152 tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
153 tester('ntpath.expandvars("%foo% bar")', "bar bar")
154 tester('ntpath.expandvars("%foo%bar")', "barbar")
155 tester('ntpath.expandvars("%foo%%foo%")', "barbar")
156 tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
157 tester('ntpath.expandvars("%?bar%")', "%?bar%")
158 tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
159 tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
160 finally:
161 os.environ.clear()
162 os.environ.update(oldenv)
Collin Winter6f187742007-03-16 22:16:08 +0000163
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000164 def test_abspath(self):
165 # ntpath.abspath() can only be used on a system with the "nt" module
166 # (reasonably), so we protect this test with "import nt". This allows
167 # the rest of the tests for the ntpath module to be run to completion
168 # on any platform, since most of the module is intended to be usable
169 # from any platform.
Ezio Melotti502f8eb2010-02-20 09:16:04 +0000170 # XXX this needs more tests
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000171 try:
172 import nt
173 except ImportError:
Ezio Melotti502f8eb2010-02-20 09:16:04 +0000174 # check that the function is there even if we are not on Windows
175 ntpath.abspath
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000176 else:
177 tester('ntpath.abspath("C:\\")', "C:\\")
178
Ezio Melotti502f8eb2010-02-20 09:16:04 +0000179 # Issue 3426: check that abspath retuns unicode when the arg is
180 # unicode and str when it's str, with both ASCII and non-ASCII cwds
181 saved_cwd = os.getcwd()
182 for cwd in (u'cwd', u'\xe7w\xf0'):
183 try:
184 os.mkdir(cwd)
185 os.chdir(cwd)
186 for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
187 self.assertTrue(isinstance(ntpath.abspath(path), str))
188 for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
189 self.assertTrue(isinstance(ntpath.abspath(upath),
190 unicode))
191 finally:
192 os.chdir(saved_cwd)
193 os.rmdir(cwd)
194
195
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000196 def test_relpath(self):
197 currentdir = os.path.split(os.getcwd())[-1]
198 tester('ntpath.relpath("a")', 'a')
199 tester('ntpath.relpath(os.path.abspath("a"))', 'a')
200 tester('ntpath.relpath("a/b")', 'a\\b')
201 tester('ntpath.relpath("../a/b")', '..\\a\\b')
202 tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
203 tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
204 tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
205 tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
206 tester('ntpath.relpath("a", "a")', '.')
207
208
209def test_main():
210 test_support.run_unittest(TestNtpath)
211
212
213if __name__ == "__main__":
214 unittest.main()