summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_pathlib.py
diff options
context:
space:
mode:
authorBarney Gale <barney.gale@gmail.com>2023-04-09 15:48:45 (GMT)
committerGitHub <noreply@github.com>2023-04-09 15:48:45 (GMT)
commit0a675f4bb57d01a5e69f8f58ae934ad7ca501a8d (patch)
tree4a03150acb99557093a6b11ab201eab2c5a5d4e1 /Lib/test/test_pathlib.py
parent8317d51996e68d8bb205385c1d47a9edcd128e7b (diff)
downloadcpython-0a675f4bb57d01a5e69f8f58ae934ad7ca501a8d.zip
cpython-0a675f4bb57d01a5e69f8f58ae934ad7ca501a8d.tar.gz
cpython-0a675f4bb57d01a5e69f8f58ae934ad7ca501a8d.tar.bz2
GH-103379: Fix up old tests for `pathlib.PurePath._parse_path` (GH-103380)
Co-authored-by: Terry Jan Reedy <tjreedy@udel.edu>
Diffstat (limited to 'Lib/test/test_pathlib.py')
-rw-r--r--Lib/test/test_pathlib.py207
1 files changed, 97 insertions, 110 deletions
diff --git a/Lib/test/test_pathlib.py b/Lib/test/test_pathlib.py
index 8b6e012..fe75f1c 100644
--- a/Lib/test/test_pathlib.py
+++ b/Lib/test/test_pathlib.py
@@ -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')