mirror of https://github.com/python/cpython
GH-103379: Fix up old tests for `pathlib.PurePath._parse_path` (GH-103380)
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
This commit is contained in:
parent
8317d51996
commit
0a675f4bb5
|
@ -24,116 +24,6 @@ except ImportError:
|
|||
grp = pwd = None
|
||||
|
||||
|
||||
class _BaseFlavourTest(object):
|
||||
|
||||
def _check_parse_parts(self, arg, expected):
|
||||
def f(parts):
|
||||
path = self.cls(*parts)._raw_path
|
||||
return self.cls._parse_path(path)
|
||||
sep = self.flavour.sep
|
||||
altsep = self.flavour.altsep
|
||||
actual = f([x.replace('/', sep) for x in arg])
|
||||
self.assertEqual(actual, expected)
|
||||
if altsep:
|
||||
actual = f([x.replace('/', altsep) for x in arg])
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def test_parse_parts_common(self):
|
||||
check = self._check_parse_parts
|
||||
sep = self.flavour.sep
|
||||
# Unanchored parts.
|
||||
check([], ('', '', []))
|
||||
check(['a'], ('', '', ['a']))
|
||||
check(['a/'], ('', '', ['a']))
|
||||
check(['a', 'b'], ('', '', ['a', 'b']))
|
||||
# Expansion.
|
||||
check(['a/b'], ('', '', ['a', 'b']))
|
||||
check(['a/b/'], ('', '', ['a', 'b']))
|
||||
check(['a', 'b/c', 'd'], ('', '', ['a', 'b', 'c', 'd']))
|
||||
# Collapsing and stripping excess slashes.
|
||||
check(['a', 'b//c', 'd'], ('', '', ['a', 'b', 'c', 'd']))
|
||||
check(['a', 'b/c/', 'd'], ('', '', ['a', 'b', 'c', 'd']))
|
||||
# Eliminating standalone dots.
|
||||
check(['.'], ('', '', []))
|
||||
check(['.', '.', 'b'], ('', '', ['b']))
|
||||
check(['a', '.', 'b'], ('', '', ['a', 'b']))
|
||||
check(['a', '.', '.'], ('', '', ['a']))
|
||||
# The first part is anchored.
|
||||
check(['/a/b'], ('', sep, [sep, 'a', 'b']))
|
||||
check(['/a', 'b'], ('', sep, [sep, 'a', 'b']))
|
||||
check(['/a/', 'b'], ('', sep, [sep, 'a', 'b']))
|
||||
# Ignoring parts before an anchored part.
|
||||
check(['a', '/b', 'c'], ('', sep, [sep, 'b', 'c']))
|
||||
check(['a', '/b', '/c'], ('', sep, [sep, 'c']))
|
||||
|
||||
|
||||
class PosixFlavourTest(_BaseFlavourTest, unittest.TestCase):
|
||||
cls = pathlib.PurePosixPath
|
||||
flavour = pathlib.PurePosixPath._flavour
|
||||
|
||||
def test_parse_parts(self):
|
||||
check = self._check_parse_parts
|
||||
# Collapsing of excess leading slashes, except for the double-slash
|
||||
# special case.
|
||||
check(['//a', 'b'], ('', '//', ['//', 'a', 'b']))
|
||||
check(['///a', 'b'], ('', '/', ['/', 'a', 'b']))
|
||||
check(['////a', 'b'], ('', '/', ['/', 'a', 'b']))
|
||||
# Paths which look like NT paths aren't treated specially.
|
||||
check(['c:a'], ('', '', ['c:a']))
|
||||
check(['c:\\a'], ('', '', ['c:\\a']))
|
||||
check(['\\a'], ('', '', ['\\a']))
|
||||
|
||||
|
||||
class NTFlavourTest(_BaseFlavourTest, unittest.TestCase):
|
||||
cls = pathlib.PureWindowsPath
|
||||
flavour = pathlib.PureWindowsPath._flavour
|
||||
|
||||
def test_parse_parts(self):
|
||||
check = self._check_parse_parts
|
||||
# First part is anchored.
|
||||
check(['c:'], ('c:', '', ['c:']))
|
||||
check(['c:/'], ('c:', '\\', ['c:\\']))
|
||||
check(['/'], ('', '\\', ['\\']))
|
||||
check(['c:a'], ('c:', '', ['c:', 'a']))
|
||||
check(['c:/a'], ('c:', '\\', ['c:\\', 'a']))
|
||||
check(['/a'], ('', '\\', ['\\', 'a']))
|
||||
# UNC paths.
|
||||
check(['//a/b'], ('\\\\a\\b', '\\', ['\\\\a\\b\\']))
|
||||
check(['//a/b/'], ('\\\\a\\b', '\\', ['\\\\a\\b\\']))
|
||||
check(['//a/b/c'], ('\\\\a\\b', '\\', ['\\\\a\\b\\', 'c']))
|
||||
# Second part is anchored, so that the first part is ignored.
|
||||
check(['a', 'Z:b', 'c'], ('Z:', '', ['Z:', 'b', 'c']))
|
||||
check(['a', 'Z:/b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c']))
|
||||
# UNC paths.
|
||||
check(['a', '//b/c', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd']))
|
||||
# Collapsing and stripping excess slashes.
|
||||
check(['a', 'Z://b//c/', 'd/'], ('Z:', '\\', ['Z:\\', 'b', 'c', 'd']))
|
||||
# UNC paths.
|
||||
check(['a', '//b/c//', 'd'], ('\\\\b\\c', '\\', ['\\\\b\\c\\', 'd']))
|
||||
# Extended paths.
|
||||
check(['//?/c:/'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\']))
|
||||
check(['//?/c:/a'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'a']))
|
||||
check(['//?/c:/a', '/b'], ('\\\\?\\c:', '\\', ['\\\\?\\c:\\', 'b']))
|
||||
# Extended UNC paths (format is "\\?\UNC\server\share").
|
||||
check(['//?/UNC/b/c'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\']))
|
||||
check(['//?/UNC/b/c/d'], ('\\\\?\\UNC\\b\\c', '\\', ['\\\\?\\UNC\\b\\c\\', 'd']))
|
||||
# Second part has a root but not drive.
|
||||
check(['a', '/b', 'c'], ('', '\\', ['\\', 'b', 'c']))
|
||||
check(['Z:/a', '/b', 'c'], ('Z:', '\\', ['Z:\\', 'b', 'c']))
|
||||
check(['//?/Z:/a', '/b', 'c'], ('\\\\?\\Z:', '\\', ['\\\\?\\Z:\\', 'b', 'c']))
|
||||
# Joining with the same drive => the first path is appended to if
|
||||
# the second path is relative.
|
||||
check(['c:/a/b', 'c:x/y'], ('c:', '\\', ['c:\\', 'a', 'b', 'x', 'y']))
|
||||
check(['c:/a/b', 'c:/x/y'], ('c:', '\\', ['c:\\', 'x', 'y']))
|
||||
# Paths to files with NTFS alternate data streams
|
||||
check(['./c:s'], ('', '', ['c:s']))
|
||||
check(['cc:s'], ('', '', ['cc:s']))
|
||||
check(['C:c:s'], ('C:', '', ['C:', 'c:s']))
|
||||
check(['C:/c:s'], ('C:', '\\', ['C:\\', 'c:s']))
|
||||
check(['D:a', './c:b'], ('D:', '', ['D:', 'a', 'c:b']))
|
||||
check(['D:/a', './c:b'], ('D:', '\\', ['D:\\', 'a', 'c:b']))
|
||||
|
||||
|
||||
#
|
||||
# Tests for the pure classes.
|
||||
#
|
||||
|
@ -246,6 +136,46 @@ class _BasePurePathTest(object):
|
|||
for parent in p.parents:
|
||||
self.assertTrue(parent.init_called)
|
||||
|
||||
def _get_drive_root_parts(self, parts):
|
||||
path = self.cls(*parts)
|
||||
return path.drive, path.root, path.parts
|
||||
|
||||
def _check_drive_root_parts(self, arg, *expected):
|
||||
sep = self.flavour.sep
|
||||
actual = self._get_drive_root_parts([x.replace('/', sep) for x in arg])
|
||||
self.assertEqual(actual, expected)
|
||||
if altsep := self.flavour.altsep:
|
||||
actual = self._get_drive_root_parts([x.replace('/', altsep) for x in arg])
|
||||
self.assertEqual(actual, expected)
|
||||
|
||||
def test_drive_root_parts_common(self):
|
||||
check = self._check_drive_root_parts
|
||||
sep = self.flavour.sep
|
||||
# Unanchored parts.
|
||||
check((), '', '', ())
|
||||
check(('a',), '', '', ('a',))
|
||||
check(('a/',), '', '', ('a',))
|
||||
check(('a', 'b'), '', '', ('a', 'b'))
|
||||
# Expansion.
|
||||
check(('a/b',), '', '', ('a', 'b'))
|
||||
check(('a/b/',), '', '', ('a', 'b'))
|
||||
check(('a', 'b/c', 'd'), '', '', ('a', 'b', 'c', 'd'))
|
||||
# Collapsing and stripping excess slashes.
|
||||
check(('a', 'b//c', 'd'), '', '', ('a', 'b', 'c', 'd'))
|
||||
check(('a', 'b/c/', 'd'), '', '', ('a', 'b', 'c', 'd'))
|
||||
# Eliminating standalone dots.
|
||||
check(('.',), '', '', ())
|
||||
check(('.', '.', 'b'), '', '', ('b',))
|
||||
check(('a', '.', 'b'), '', '', ('a', 'b'))
|
||||
check(('a', '.', '.'), '', '', ('a',))
|
||||
# The first part is anchored.
|
||||
check(('/a/b',), '', sep, (sep, 'a', 'b'))
|
||||
check(('/a', 'b'), '', sep, (sep, 'a', 'b'))
|
||||
check(('/a/', 'b'), '', sep, (sep, 'a', 'b'))
|
||||
# Ignoring parts before an anchored part.
|
||||
check(('a', '/b', 'c'), '', sep, (sep, 'b', 'c'))
|
||||
check(('a', '/b', '/c'), '', sep, (sep, 'c'))
|
||||
|
||||
def test_join_common(self):
|
||||
P = self.cls
|
||||
p = P('a/b')
|
||||
|
@ -770,6 +700,18 @@ class _BasePurePathTest(object):
|
|||
class PurePosixPathTest(_BasePurePathTest, unittest.TestCase):
|
||||
cls = pathlib.PurePosixPath
|
||||
|
||||
def test_drive_root_parts(self):
|
||||
check = self._check_drive_root_parts
|
||||
# Collapsing of excess leading slashes, except for the double-slash
|
||||
# special case.
|
||||
check(('//a', 'b'), '', '//', ('//', 'a', 'b'))
|
||||
check(('///a', 'b'), '', '/', ('/', 'a', 'b'))
|
||||
check(('////a', 'b'), '', '/', ('/', 'a', 'b'))
|
||||
# Paths which look like NT paths aren't treated specially.
|
||||
check(('c:a',), '', '', ('c:a',))
|
||||
check(('c:\\a',), '', '', ('c:\\a',))
|
||||
check(('\\a',), '', '', ('\\a',))
|
||||
|
||||
def test_root(self):
|
||||
P = self.cls
|
||||
self.assertEqual(P('/a/b').root, '/')
|
||||
|
@ -860,6 +802,51 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
|
|||
],
|
||||
})
|
||||
|
||||
def test_drive_root_parts(self):
|
||||
check = self._check_drive_root_parts
|
||||
# First part is anchored.
|
||||
check(('c:',), 'c:', '', ('c:',))
|
||||
check(('c:/',), 'c:', '\\', ('c:\\',))
|
||||
check(('/',), '', '\\', ('\\',))
|
||||
check(('c:a',), 'c:', '', ('c:', 'a'))
|
||||
check(('c:/a',), 'c:', '\\', ('c:\\', 'a'))
|
||||
check(('/a',), '', '\\', ('\\', 'a'))
|
||||
# UNC paths.
|
||||
check(('//a/b',), '\\\\a\\b', '\\', ('\\\\a\\b\\',))
|
||||
check(('//a/b/',), '\\\\a\\b', '\\', ('\\\\a\\b\\',))
|
||||
check(('//a/b/c',), '\\\\a\\b', '\\', ('\\\\a\\b\\', 'c'))
|
||||
# Second part is anchored, so that the first part is ignored.
|
||||
check(('a', 'Z:b', 'c'), 'Z:', '', ('Z:', 'b', 'c'))
|
||||
check(('a', 'Z:/b', 'c'), 'Z:', '\\', ('Z:\\', 'b', 'c'))
|
||||
# UNC paths.
|
||||
check(('a', '//b/c', 'd'), '\\\\b\\c', '\\', ('\\\\b\\c\\', 'd'))
|
||||
# Collapsing and stripping excess slashes.
|
||||
check(('a', 'Z://b//c/', 'd/'), 'Z:', '\\', ('Z:\\', 'b', 'c', 'd'))
|
||||
# UNC paths.
|
||||
check(('a', '//b/c//', 'd'), '\\\\b\\c', '\\', ('\\\\b\\c\\', 'd'))
|
||||
# Extended paths.
|
||||
check(('//?/c:/',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\',))
|
||||
check(('//?/c:/a',), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'a'))
|
||||
check(('//?/c:/a', '/b'), '\\\\?\\c:', '\\', ('\\\\?\\c:\\', 'b'))
|
||||
# Extended UNC paths (format is "\\?\UNC\server\share").
|
||||
check(('//?/UNC/b/c',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\',))
|
||||
check(('//?/UNC/b/c/d',), '\\\\?\\UNC\\b\\c', '\\', ('\\\\?\\UNC\\b\\c\\', 'd'))
|
||||
# Second part has a root but not drive.
|
||||
check(('a', '/b', 'c'), '', '\\', ('\\', 'b', 'c'))
|
||||
check(('Z:/a', '/b', 'c'), 'Z:', '\\', ('Z:\\', 'b', 'c'))
|
||||
check(('//?/Z:/a', '/b', 'c'), '\\\\?\\Z:', '\\', ('\\\\?\\Z:\\', 'b', 'c'))
|
||||
# Joining with the same drive => the first path is appended to if
|
||||
# the second path is relative.
|
||||
check(('c:/a/b', 'c:x/y'), 'c:', '\\', ('c:\\', 'a', 'b', 'x', 'y'))
|
||||
check(('c:/a/b', 'c:/x/y'), 'c:', '\\', ('c:\\', 'x', 'y'))
|
||||
# Paths to files with NTFS alternate data streams
|
||||
check(('./c:s',), '', '', ('c:s',))
|
||||
check(('cc:s',), '', '', ('cc:s',))
|
||||
check(('C:c:s',), 'C:', '', ('C:', 'c:s'))
|
||||
check(('C:/c:s',), 'C:', '\\', ('C:\\', 'c:s'))
|
||||
check(('D:a', './c:b'), 'D:', '', ('D:', 'a', 'c:b'))
|
||||
check(('D:/a', './c:b'), 'D:', '\\', ('D:\\', 'a', 'c:b'))
|
||||
|
||||
def test_str(self):
|
||||
p = self.cls('a/b/c')
|
||||
self.assertEqual(str(p), 'a\\b\\c')
|
||||
|
|
Loading…
Reference in New Issue