mirror of
https://github.com/python/cpython.git
synced 2024-12-15 21:04:00 +08:00
1ab6c2d2c2
Unicode filenames instead of bytes filenames to not depend on the ANSI code page anymore and to support any filename.
271 lines
12 KiB
Python
271 lines
12 KiB
Python
import ntpath
|
|
import os
|
|
import sys
|
|
import unittest
|
|
import warnings
|
|
from test.support import TestFailed
|
|
from test import support, test_genericpath
|
|
from tempfile import TemporaryFile
|
|
|
|
|
|
def tester(fn, wantResult):
|
|
fn = fn.replace("\\", "\\\\")
|
|
gotResult = eval(fn)
|
|
if wantResult != gotResult:
|
|
raise TestFailed("%s should return: %s but returned: %s" \
|
|
%(str(fn), str(wantResult), str(gotResult)))
|
|
|
|
# then with bytes
|
|
fn = fn.replace("('", "(b'")
|
|
fn = fn.replace('("', '(b"')
|
|
fn = fn.replace("['", "[b'")
|
|
fn = fn.replace('["', '[b"')
|
|
fn = fn.replace(", '", ", b'")
|
|
fn = fn.replace(', "', ', b"')
|
|
with warnings.catch_warnings():
|
|
warnings.simplefilter("ignore", DeprecationWarning)
|
|
gotResult = eval(fn)
|
|
if isinstance(wantResult, str):
|
|
wantResult = wantResult.encode('ascii')
|
|
elif isinstance(wantResult, tuple):
|
|
wantResult = tuple(r.encode('ascii') for r in wantResult)
|
|
|
|
gotResult = eval(fn)
|
|
if wantResult != gotResult:
|
|
raise TestFailed("%s should return: %s but returned: %s" \
|
|
%(str(fn), str(wantResult), repr(gotResult)))
|
|
|
|
|
|
class TestNtpath(unittest.TestCase):
|
|
def test_splitext(self):
|
|
tester('ntpath.splitext("foo.ext")', ('foo', '.ext'))
|
|
tester('ntpath.splitext("/foo/foo.ext")', ('/foo/foo', '.ext'))
|
|
tester('ntpath.splitext(".ext")', ('.ext', ''))
|
|
tester('ntpath.splitext("\\foo.ext\\foo")', ('\\foo.ext\\foo', ''))
|
|
tester('ntpath.splitext("foo.ext\\")', ('foo.ext\\', ''))
|
|
tester('ntpath.splitext("")', ('', ''))
|
|
tester('ntpath.splitext("foo.bar.ext")', ('foo.bar', '.ext'))
|
|
tester('ntpath.splitext("xx/foo.bar.ext")', ('xx/foo.bar', '.ext'))
|
|
tester('ntpath.splitext("xx\\foo.bar.ext")', ('xx\\foo.bar', '.ext'))
|
|
tester('ntpath.splitext("c:a/b\\c.d")', ('c:a/b\\c', '.d'))
|
|
|
|
def test_splitdrive(self):
|
|
tester('ntpath.splitdrive("c:\\foo\\bar")',
|
|
('c:', '\\foo\\bar'))
|
|
tester('ntpath.splitdrive("c:/foo/bar")',
|
|
('c:', '/foo/bar'))
|
|
tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")',
|
|
('\\\\conky\\mountpoint', '\\foo\\bar'))
|
|
tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")',
|
|
('//conky/mountpoint', '/foo/bar'))
|
|
tester('ntpath.splitdrive("\\\\\\conky\\mountpoint\\foo\\bar")',
|
|
('', '\\\\\\conky\\mountpoint\\foo\\bar'))
|
|
tester('ntpath.splitdrive("///conky/mountpoint/foo/bar")',
|
|
('', '///conky/mountpoint/foo/bar'))
|
|
tester('ntpath.splitdrive("\\\\conky\\\\mountpoint\\foo\\bar")',
|
|
('', '\\\\conky\\\\mountpoint\\foo\\bar'))
|
|
tester('ntpath.splitdrive("//conky//mountpoint/foo/bar")',
|
|
('', '//conky//mountpoint/foo/bar'))
|
|
|
|
def test_split(self):
|
|
tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
|
|
tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")',
|
|
('\\\\conky\\mountpoint\\foo', 'bar'))
|
|
|
|
tester('ntpath.split("c:\\")', ('c:\\', ''))
|
|
tester('ntpath.split("\\\\conky\\mountpoint\\")',
|
|
('\\\\conky\\mountpoint\\', ''))
|
|
|
|
tester('ntpath.split("c:/")', ('c:/', ''))
|
|
tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
|
|
|
|
def test_isabs(self):
|
|
tester('ntpath.isabs("c:\\")', 1)
|
|
tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
|
|
tester('ntpath.isabs("\\foo")', 1)
|
|
tester('ntpath.isabs("\\foo\\bar")', 1)
|
|
|
|
def test_commonprefix(self):
|
|
tester('ntpath.commonprefix(["/home/swenson/spam", "/home/swen/spam"])',
|
|
"/home/swen")
|
|
tester('ntpath.commonprefix(["\\home\\swen\\spam", "\\home\\swen\\eggs"])',
|
|
"\\home\\swen\\")
|
|
tester('ntpath.commonprefix(["/home/swen/spam", "/home/swen/spam"])',
|
|
"/home/swen/spam")
|
|
|
|
def test_join(self):
|
|
tester('ntpath.join("")', '')
|
|
tester('ntpath.join("", "", "")', '')
|
|
tester('ntpath.join("a")', 'a')
|
|
tester('ntpath.join("/a")', '/a')
|
|
tester('ntpath.join("\\a")', '\\a')
|
|
tester('ntpath.join("a:")', 'a:')
|
|
tester('ntpath.join("a:", "b")', 'a:b')
|
|
tester('ntpath.join("a:", "/b")', 'a:/b')
|
|
tester('ntpath.join("a:", "\\b")', 'a:\\b')
|
|
tester('ntpath.join("a", "/b")', '/b')
|
|
tester('ntpath.join("a", "\\b")', '\\b')
|
|
tester('ntpath.join("a", "b", "c")', 'a\\b\\c')
|
|
tester('ntpath.join("a\\", "b", "c")', 'a\\b\\c')
|
|
tester('ntpath.join("a", "b\\", "c")', 'a\\b\\c')
|
|
tester('ntpath.join("a", "b", "\\c")', '\\c')
|
|
tester('ntpath.join("d:\\", "\\pleep")', 'd:\\pleep')
|
|
tester('ntpath.join("d:\\", "a", "b")', 'd:\\a\\b')
|
|
tester("ntpath.join('c:', '/a')", 'c:/a')
|
|
tester("ntpath.join('c:/', '/a')", 'c:/a')
|
|
tester("ntpath.join('c:/a', '/b')", '/b')
|
|
tester("ntpath.join('c:', 'd:/')", 'd:/')
|
|
tester("ntpath.join('c:/', 'd:/')", 'd:/')
|
|
tester("ntpath.join('c:/', 'd:/a/b')", 'd:/a/b')
|
|
|
|
tester("ntpath.join('')", '')
|
|
tester("ntpath.join('', '', '', '', '')", '')
|
|
tester("ntpath.join('a')", 'a')
|
|
tester("ntpath.join('', 'a')", 'a')
|
|
tester("ntpath.join('', '', '', '', 'a')", 'a')
|
|
tester("ntpath.join('a', '')", 'a\\')
|
|
tester("ntpath.join('a', '', '', '', '')", 'a\\')
|
|
tester("ntpath.join('a\\', '')", 'a\\')
|
|
tester("ntpath.join('a\\', '', '', '', '')", 'a\\')
|
|
|
|
# from comment in ntpath.join
|
|
tester("ntpath.join('c:', '/a')", 'c:/a')
|
|
tester("ntpath.join('//computer/share', '/a')", '//computer/share/a')
|
|
tester("ntpath.join('c:/', '/a')", 'c:/a')
|
|
tester("ntpath.join('//computer/share/', '/a')", '//computer/share/a')
|
|
tester("ntpath.join('c:/a', '/b')", '/b')
|
|
tester("ntpath.join('//computer/share/a', '/b')", '/b')
|
|
tester("ntpath.join('c:', 'd:/')", 'd:/')
|
|
tester("ntpath.join('c:', '//computer/share/')", '//computer/share/')
|
|
tester("ntpath.join('//computer/share', 'd:/')", 'd:/')
|
|
tester("ntpath.join('//computer/share', '//computer/share/')", '//computer/share/')
|
|
tester("ntpath.join('c:/', 'd:/')", 'd:/')
|
|
tester("ntpath.join('c:/', '//computer/share/')", '//computer/share/')
|
|
tester("ntpath.join('//computer/share/', 'd:/')", 'd:/')
|
|
tester("ntpath.join('//computer/share/', '//computer/share/')", '//computer/share/')
|
|
|
|
tester("ntpath.join('c:', '//computer/share/')", '//computer/share/')
|
|
tester("ntpath.join('c:/', '//computer/share/')", '//computer/share/')
|
|
tester("ntpath.join('c:/', '//computer/share/a/b')", '//computer/share/a/b')
|
|
|
|
tester("ntpath.join('\\\\computer\\share\\', 'a', 'b')", '\\\\computer\\share\\a\\b')
|
|
tester("ntpath.join('\\\\computer\\share', 'a', 'b')", '\\\\computer\\share\\a\\b')
|
|
tester("ntpath.join('\\\\computer\\share', 'a\\b')", '\\\\computer\\share\\a\\b')
|
|
tester("ntpath.join('//computer/share/', 'a', 'b')", '//computer/share/a\\b')
|
|
tester("ntpath.join('//computer/share', 'a', 'b')", '//computer/share\\a\\b')
|
|
tester("ntpath.join('//computer/share', 'a/b')", '//computer/share\\a/b')
|
|
|
|
def test_normpath(self):
|
|
tester("ntpath.normpath('A//////././//.//B')", r'A\B')
|
|
tester("ntpath.normpath('A/./B')", r'A\B')
|
|
tester("ntpath.normpath('A/foo/../B')", r'A\B')
|
|
tester("ntpath.normpath('C:A//B')", r'C:A\B')
|
|
tester("ntpath.normpath('D:A/./B')", r'D:A\B')
|
|
tester("ntpath.normpath('e:A/foo/../B')", r'e:A\B')
|
|
|
|
tester("ntpath.normpath('C:///A//B')", r'C:\A\B')
|
|
tester("ntpath.normpath('D:///A/./B')", r'D:\A\B')
|
|
tester("ntpath.normpath('e:///A/foo/../B')", r'e:\A\B')
|
|
|
|
tester("ntpath.normpath('..')", r'..')
|
|
tester("ntpath.normpath('.')", r'.')
|
|
tester("ntpath.normpath('')", r'.')
|
|
tester("ntpath.normpath('/')", '\\')
|
|
tester("ntpath.normpath('c:/')", 'c:\\')
|
|
tester("ntpath.normpath('/../.././..')", '\\')
|
|
tester("ntpath.normpath('c:/../../..')", 'c:\\')
|
|
tester("ntpath.normpath('../.././..')", r'..\..\..')
|
|
tester("ntpath.normpath('K:../.././..')", r'K:..\..\..')
|
|
tester("ntpath.normpath('C:////a/b')", r'C:\a\b')
|
|
tester("ntpath.normpath('//machine/share//a/b')", r'\\machine\share\a\b')
|
|
|
|
tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL')
|
|
tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z')
|
|
|
|
def test_expandvars(self):
|
|
with support.EnvironmentVarGuard() as env:
|
|
env.clear()
|
|
env["foo"] = "bar"
|
|
env["{foo"] = "baz1"
|
|
env["{foo}"] = "baz2"
|
|
tester('ntpath.expandvars("foo")', "foo")
|
|
tester('ntpath.expandvars("$foo bar")', "bar bar")
|
|
tester('ntpath.expandvars("${foo}bar")', "barbar")
|
|
tester('ntpath.expandvars("$[foo]bar")', "$[foo]bar")
|
|
tester('ntpath.expandvars("$bar bar")', "$bar bar")
|
|
tester('ntpath.expandvars("$?bar")', "$?bar")
|
|
tester('ntpath.expandvars("${foo}bar")', "barbar")
|
|
tester('ntpath.expandvars("$foo}bar")', "bar}bar")
|
|
tester('ntpath.expandvars("${foo")', "${foo")
|
|
tester('ntpath.expandvars("${{foo}}")', "baz1}")
|
|
tester('ntpath.expandvars("$foo$foo")', "barbar")
|
|
tester('ntpath.expandvars("$bar$bar")', "$bar$bar")
|
|
tester('ntpath.expandvars("%foo% bar")', "bar bar")
|
|
tester('ntpath.expandvars("%foo%bar")', "barbar")
|
|
tester('ntpath.expandvars("%foo%%foo%")', "barbar")
|
|
tester('ntpath.expandvars("%%foo%%foo%foo%")', "%foo%foobar")
|
|
tester('ntpath.expandvars("%?bar%")', "%?bar%")
|
|
tester('ntpath.expandvars("%foo%%bar")', "bar%bar")
|
|
tester('ntpath.expandvars("\'%foo%\'%bar")', "\'%foo%\'%bar")
|
|
|
|
def test_abspath(self):
|
|
# ntpath.abspath() can only be used on a system with the "nt" module
|
|
# (reasonably), so we protect this test with "import nt". This allows
|
|
# the rest of the tests for the ntpath module to be run to completion
|
|
# on any platform, since most of the module is intended to be usable
|
|
# from any platform.
|
|
try:
|
|
import nt
|
|
tester('ntpath.abspath("C:\\")', "C:\\")
|
|
except ImportError:
|
|
pass
|
|
|
|
def test_relpath(self):
|
|
currentdir = os.path.split(os.getcwd())[-1]
|
|
tester('ntpath.relpath("a")', 'a')
|
|
tester('ntpath.relpath(os.path.abspath("a"))', 'a')
|
|
tester('ntpath.relpath("a/b")', 'a\\b')
|
|
tester('ntpath.relpath("../a/b")', '..\\a\\b')
|
|
tester('ntpath.relpath("a", "../b")', '..\\'+currentdir+'\\a')
|
|
tester('ntpath.relpath("a/b", "../c")', '..\\'+currentdir+'\\a\\b')
|
|
tester('ntpath.relpath("a", "b/c")', '..\\..\\a')
|
|
tester('ntpath.relpath("c:/foo/bar/bat", "c:/x/y")', '..\\..\\foo\\bar\\bat')
|
|
tester('ntpath.relpath("//conky/mountpoint/a", "//conky/mountpoint/b/c")', '..\\..\\a')
|
|
tester('ntpath.relpath("a", "a")', '.')
|
|
tester('ntpath.relpath("/foo/bar/bat", "/x/y/z")', '..\\..\\..\\foo\\bar\\bat')
|
|
tester('ntpath.relpath("/foo/bar/bat", "/foo/bar")', 'bat')
|
|
tester('ntpath.relpath("/foo/bar/bat", "/")', 'foo\\bar\\bat')
|
|
tester('ntpath.relpath("/", "/foo/bar/bat")', '..\\..\\..')
|
|
tester('ntpath.relpath("/foo/bar/bat", "/x")', '..\\foo\\bar\\bat')
|
|
tester('ntpath.relpath("/x", "/foo/bar/bat")', '..\\..\\..\\x')
|
|
tester('ntpath.relpath("/", "/")', '.')
|
|
tester('ntpath.relpath("/a", "/a")', '.')
|
|
tester('ntpath.relpath("/a/b", "/a/b")', '.')
|
|
tester('ntpath.relpath("c:/foo", "C:/FOO")', '.')
|
|
|
|
def test_sameopenfile(self):
|
|
with TemporaryFile() as tf1, TemporaryFile() as tf2:
|
|
# Make sure the same file is really the same
|
|
self.assertTrue(ntpath.sameopenfile(tf1.fileno(), tf1.fileno()))
|
|
# Make sure different files are really different
|
|
self.assertFalse(ntpath.sameopenfile(tf1.fileno(), tf2.fileno()))
|
|
# Make sure invalid values don't cause issues on win32
|
|
if sys.platform == "win32":
|
|
with self.assertRaises(OSError):
|
|
# Invalid file descriptors shouldn't display assert
|
|
# dialogs (#4804)
|
|
ntpath.sameopenfile(-1, -1)
|
|
|
|
|
|
class NtCommonTest(test_genericpath.CommonTest):
|
|
pathmodule = ntpath
|
|
attributes = ['relpath', 'splitunc']
|
|
|
|
|
|
def test_main():
|
|
support.run_unittest(TestNtpath, NtCommonTest)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|