blob: f5bc9520c84b8f505551b7e032125dc14197a0fe [file] [log] [blame]
Guido van Rossumead9d8d1999-02-03 17:21:21 +00001import ntpath
Mark Hammond673c6cf2000-08-14 06:21:26 +00002import os
Georg Brandla4f46e12010-02-07 17:03:15 +00003from test.test_support import TestFailed
Jerry Seutterfc7b3e32008-03-26 05:58:14 +00004import 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 Melottib5689de2010-01-12 03:32:05 +0000126 # Issue 5827: Make sure normpath preserves unicode
127 for path in (u'', u'.', u'/', u'\\', u'///foo/.//bar//'):
Ezio Melottib0f5adc2010-01-24 16:58:36 +0000128 self.assertIsInstance(ntpath.normpath(path), unicode,
129 'normpath() returned str instead of unicode')
Ezio Melottib5689de2010-01-12 03:32:05 +0000130
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000131 def test_expandvars(self):
Walter Dörwald6733bed2009-05-01 17:35:37 +0000132 with test_support.EnvironmentVarGuard() as env:
133 env.clear()
134 env["foo"] = "bar"
135 env["{foo"] = "baz1"
136 env["{foo}"] = "baz2"
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000137 tester('ntpath.expandvars("foo")', "foo")
138 tester('ntpath.expandvars("$foo bar")', "bar bar")
139 tester('ntpath.expandvars("${foo}bar")', "barbar")
140 tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
141 tester('ntpath.expandvars("$bar bar")', "$bar bar")
142 tester('ntpath.expandvars("$?bar")', "$?bar")
143 tester('ntpath.expandvars("${foo}bar")', "barbar")
144 tester('ntpath.expandvars("$foo}bar")', "bar}bar")
145 tester('ntpath.expandvars("${foo")', "${foo")
146 tester('ntpath.expandvars("${{foo}}")', "baz1}")
147 tester('ntpath.expandvars("$foo$foo")', "barbar")
148 tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
149 tester('ntpath.expandvars("%foo% bar")', "bar bar")
150 tester('ntpath.expandvars("%foo%bar")', "barbar")
151 tester('ntpath.expandvars("%foo%%foo%")', "barbar")
152 tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
153 tester('ntpath.expandvars("%?bar%")', "%?bar%")
154 tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
155 tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
Collin Winter6f187742007-03-16 22:16:08 +0000156
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000157 def test_abspath(self):
158 # ntpath.abspath() can only be used on a system with the "nt" module
159 # (reasonably), so we protect this test with "import nt". This allows
160 # the rest of the tests for the ntpath module to be run to completion
161 # on any platform, since most of the module is intended to be usable
162 # from any platform.
Ezio Melotti4cc80ca2010-02-20 08:09:39 +0000163 # XXX this needs more tests
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000164 try:
165 import nt
166 except ImportError:
Ezio Melotti4cc80ca2010-02-20 08:09:39 +0000167 # check that the function is there even if we are not on Windows
168 ntpath.abspath
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000169 else:
170 tester('ntpath.abspath("C:\\")', "C:\\")
171
Ezio Melotti4cc80ca2010-02-20 08:09:39 +0000172 # Issue 3426: check that abspath retuns unicode when the arg is
173 # unicode and str when it's str, with both ASCII and non-ASCII cwds
174 for cwd in (u'cwd', u'\xe7w\xf0'):
175 with test_support.temp_cwd(cwd):
176 for path in ('', 'foo', 'f\xf2\xf2', '/foo', 'C:\\'):
177 self.assertIsInstance(ntpath.abspath(path), str)
178 for upath in (u'', u'fuu', u'f\xf9\xf9', u'/fuu', u'U:\\'):
179 self.assertIsInstance(ntpath.abspath(upath), unicode)
180
181
Jerry Seutterfc7b3e32008-03-26 05:58:14 +0000182 def test_relpath(self):
183 currentdir = os.path.split(os.getcwd())[-1]
184 tester('ntpath.relpath("a")', 'a')
185 tester('ntpath.relpath(os.path.abspath("a"))', 'a')
186 tester('ntpath.relpath("a/b")', 'a\\b')
187 tester('ntpath.relpath("../a/b")', '..\\a\\b')
188 tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
189 tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
190 tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
191 tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
192 tester('ntpath.relpath("a", "a")', '.')
193
194
195def test_main():
196 test_support.run_unittest(TestNtpath)
197
198
199if __name__ == "__main__":
200 unittest.main()