mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	GH-89812: Clean up pathlib tests. (#104829)
Clean up pathlib tests. Merge `PurePathTest` into `_BasePurePathTest`, and `PathTest` into `_BasePathTest`.
This commit is contained in:
		
							parent
							
								
									b95de96268
								
							
						
					
					
						commit
						dab5a3ebe8
					
				
					 1 changed files with 96 additions and 84 deletions
				
			
		|  | @ -5,6 +5,7 @@ | ||||||
| import errno | import errno | ||||||
| import pathlib | import pathlib | ||||||
| import pickle | import pickle | ||||||
|  | import posixpath | ||||||
| import socket | import socket | ||||||
| import stat | import stat | ||||||
| import tempfile | import tempfile | ||||||
|  | @ -23,20 +24,23 @@ | ||||||
|     grp = pwd = None |     grp = pwd = None | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | # Make sure any symbolic links in the base test path are resolved. | ||||||
|  | BASE = os.path.realpath(TESTFN) | ||||||
|  | join = lambda *x: os.path.join(BASE, *x) | ||||||
|  | rel_join = lambda *x: os.path.join(TESTFN, *x) | ||||||
|  | 
 | ||||||
|  | only_nt = unittest.skipIf(os.name != 'nt', | ||||||
|  |                           'test requires a Windows-compatible system') | ||||||
|  | only_posix = unittest.skipIf(os.name == 'nt', | ||||||
|  |                              'test requires a POSIX-compatible system') | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| # | # | ||||||
| # Tests for the pure classes. | # Tests for the pure classes. | ||||||
| # | # | ||||||
| 
 | 
 | ||||||
| class _BasePurePathSubclass(object): | class PurePathTest(unittest.TestCase): | ||||||
|     def __init__(self, *pathsegments, session_id): |     cls = pathlib.PurePath | ||||||
|         super().__init__(*pathsegments) |  | ||||||
|         self.session_id = session_id |  | ||||||
| 
 |  | ||||||
|     def with_segments(self, *pathsegments): |  | ||||||
|         return type(self)(*pathsegments, session_id=self.session_id) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class _BasePurePathTest(object): |  | ||||||
| 
 | 
 | ||||||
|     # Keys are canonical paths, values are list of tuples of arguments |     # Keys are canonical paths, values are list of tuples of arguments | ||||||
|     # supposed to produce equal paths. |     # supposed to produce equal paths. | ||||||
|  | @ -75,6 +79,37 @@ def test_constructor_common(self): | ||||||
|         self.assertEqual(P(P('a'), P('b'), P('c')), P(FakePath("a/b/c"))) |         self.assertEqual(P(P('a'), P('b'), P('c')), P(FakePath("a/b/c"))) | ||||||
|         self.assertEqual(P(P('./a:b')), P('./a:b')) |         self.assertEqual(P(P('./a:b')), P('./a:b')) | ||||||
| 
 | 
 | ||||||
|  |     def test_concrete_class(self): | ||||||
|  |         if self.cls is pathlib.PurePath: | ||||||
|  |             expected = pathlib.PureWindowsPath if os.name == 'nt' else pathlib.PurePosixPath | ||||||
|  |         else: | ||||||
|  |             expected = self.cls | ||||||
|  |         p = self.cls('a') | ||||||
|  |         self.assertIs(type(p), expected) | ||||||
|  | 
 | ||||||
|  |     def test_different_flavours_unequal(self): | ||||||
|  |         p = self.cls('a') | ||||||
|  |         if p._flavour is posixpath: | ||||||
|  |             q = pathlib.PureWindowsPath('a') | ||||||
|  |         else: | ||||||
|  |             q = pathlib.PurePosixPath('a') | ||||||
|  |         self.assertNotEqual(p, q) | ||||||
|  | 
 | ||||||
|  |     def test_different_flavours_unordered(self): | ||||||
|  |         p = self.cls('a') | ||||||
|  |         if p._flavour is posixpath: | ||||||
|  |             q = pathlib.PureWindowsPath('a') | ||||||
|  |         else: | ||||||
|  |             q = pathlib.PurePosixPath('a') | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             p < q | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             p <= q | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             p > q | ||||||
|  |         with self.assertRaises(TypeError): | ||||||
|  |             p >= q | ||||||
|  | 
 | ||||||
|     def test_bytes(self): |     def test_bytes(self): | ||||||
|         P = self.cls |         P = self.cls | ||||||
|         message = (r"argument should be a str or an os\.PathLike object " |         message = (r"argument should be a str or an os\.PathLike object " | ||||||
|  | @ -122,8 +157,13 @@ def test_str_subclass_common(self): | ||||||
|         self._check_str_subclass('/a/b.txt') |         self._check_str_subclass('/a/b.txt') | ||||||
| 
 | 
 | ||||||
|     def test_with_segments_common(self): |     def test_with_segments_common(self): | ||||||
|         class P(_BasePurePathSubclass, self.cls): |         class P(self.cls): | ||||||
|             pass |             def __init__(self, *pathsegments, session_id): | ||||||
|  |                 super().__init__(*pathsegments) | ||||||
|  |                 self.session_id = session_id | ||||||
|  | 
 | ||||||
|  |             def with_segments(self, *pathsegments): | ||||||
|  |                 return type(self)(*pathsegments, session_id=self.session_id) | ||||||
|         p = P('foo', 'bar', session_id=42) |         p = P('foo', 'bar', session_id=42) | ||||||
|         self.assertEqual(42, (p / 'foo').session_id) |         self.assertEqual(42, (p / 'foo').session_id) | ||||||
|         self.assertEqual(42, ('foo' / p).session_id) |         self.assertEqual(42, ('foo' / p).session_id) | ||||||
|  | @ -723,7 +763,7 @@ def test_pickling_common(self): | ||||||
|             self.assertEqual(str(pp), str(p)) |             self.assertEqual(str(pp), str(p)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PurePosixPathTest(_BasePurePathTest, unittest.TestCase): | class PurePosixPathTest(PurePathTest): | ||||||
|     cls = pathlib.PurePosixPath |     cls = pathlib.PurePosixPath | ||||||
| 
 | 
 | ||||||
|     def test_drive_root_parts(self): |     def test_drive_root_parts(self): | ||||||
|  | @ -817,10 +857,10 @@ def test_parse_windows_path(self): | ||||||
|         self.assertEqual(p, pp) |         self.assertEqual(p, pp) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase): | class PureWindowsPathTest(PurePathTest): | ||||||
|     cls = pathlib.PureWindowsPath |     cls = pathlib.PureWindowsPath | ||||||
| 
 | 
 | ||||||
|     equivalences = _BasePurePathTest.equivalences.copy() |     equivalences = PurePathTest.equivalences.copy() | ||||||
|     equivalences.update({ |     equivalences.update({ | ||||||
|         './a:b': [ ('./a:b',) ], |         './a:b': [ ('./a:b',) ], | ||||||
|         'c:a': [ ('c:', 'a'), ('c:', 'a/'), ('.', 'c:', 'a') ], |         'c:a': [ ('c:', 'a'), ('c:', 'a/'), ('.', 'c:', 'a') ], | ||||||
|  | @ -1491,45 +1531,14 @@ def test_is_reserved(self): | ||||||
|         self.assertIs(True, P('c:/baz/con/NUL').is_reserved()) |         self.assertIs(True, P('c:/baz/con/NUL').is_reserved()) | ||||||
|         self.assertIs(False, P('c:/NUL/con/baz').is_reserved()) |         self.assertIs(False, P('c:/NUL/con/baz').is_reserved()) | ||||||
| 
 | 
 | ||||||
| class PurePathTest(_BasePurePathTest, unittest.TestCase): |  | ||||||
|     cls = pathlib.PurePath |  | ||||||
| 
 | 
 | ||||||
|     def test_concrete_class(self): | class PurePathSubclassTest(PurePathTest): | ||||||
|         p = self.cls('a') |     class cls(pathlib.PurePath): | ||||||
|         self.assertIs(type(p), |         pass | ||||||
|             pathlib.PureWindowsPath if os.name == 'nt' else pathlib.PurePosixPath) |  | ||||||
| 
 | 
 | ||||||
|     def test_different_flavours_unequal(self): |     # repr() roundtripping is not supported in custom subclass. | ||||||
|         p = pathlib.PurePosixPath('a') |     test_repr_roundtrips = None | ||||||
|         q = pathlib.PureWindowsPath('a') |  | ||||||
|         self.assertNotEqual(p, q) |  | ||||||
| 
 | 
 | ||||||
|     def test_different_flavours_unordered(self): |  | ||||||
|         p = pathlib.PurePosixPath('a') |  | ||||||
|         q = pathlib.PureWindowsPath('a') |  | ||||||
|         with self.assertRaises(TypeError): |  | ||||||
|             p < q |  | ||||||
|         with self.assertRaises(TypeError): |  | ||||||
|             p <= q |  | ||||||
|         with self.assertRaises(TypeError): |  | ||||||
|             p > q |  | ||||||
|         with self.assertRaises(TypeError): |  | ||||||
|             p >= q |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| # |  | ||||||
| # Tests for the concrete classes. |  | ||||||
| # |  | ||||||
| 
 |  | ||||||
| # Make sure any symbolic links in the base test path are resolved. |  | ||||||
| BASE = os.path.realpath(TESTFN) |  | ||||||
| join = lambda *x: os.path.join(BASE, *x) |  | ||||||
| rel_join = lambda *x: os.path.join(TESTFN, *x) |  | ||||||
| 
 |  | ||||||
| only_nt = unittest.skipIf(os.name != 'nt', |  | ||||||
|                           'test requires a Windows-compatible system') |  | ||||||
| only_posix = unittest.skipIf(os.name == 'nt', |  | ||||||
|                              'test requires a POSIX-compatible system') |  | ||||||
| 
 | 
 | ||||||
| @only_posix | @only_posix | ||||||
| class PosixPathAsPureTest(PurePosixPathTest): | class PosixPathAsPureTest(PurePosixPathTest): | ||||||
|  | @ -1550,9 +1559,15 @@ def test_group(self): | ||||||
|             P('c:/').group() |             P('c:/').group() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class _BasePathTest(object): | # | ||||||
|  | # Tests for the concrete classes. | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | class PathTest(unittest.TestCase): | ||||||
|     """Tests for the FS-accessing functionalities of the Path classes.""" |     """Tests for the FS-accessing functionalities of the Path classes.""" | ||||||
| 
 | 
 | ||||||
|  |     cls = pathlib.Path | ||||||
|  | 
 | ||||||
|     # (BASE) |     # (BASE) | ||||||
|     #  | |     #  | | ||||||
|     #  |-- brokenLink -> non-existing |     #  |-- brokenLink -> non-existing | ||||||
|  | @ -1627,6 +1642,20 @@ def assertFileNotFound(self, func, *args, **kwargs): | ||||||
|     def assertEqualNormCase(self, path_a, path_b): |     def assertEqualNormCase(self, path_a, path_b): | ||||||
|         self.assertEqual(os.path.normcase(path_a), os.path.normcase(path_b)) |         self.assertEqual(os.path.normcase(path_a), os.path.normcase(path_b)) | ||||||
| 
 | 
 | ||||||
|  |     def test_concrete_class(self): | ||||||
|  |         if self.cls is pathlib.Path: | ||||||
|  |             expected = pathlib.WindowsPath if os.name == 'nt' else pathlib.PosixPath | ||||||
|  |         else: | ||||||
|  |             expected = self.cls | ||||||
|  |         p = self.cls('a') | ||||||
|  |         self.assertIs(type(p), expected) | ||||||
|  | 
 | ||||||
|  |     def test_unsupported_flavour(self): | ||||||
|  |         if self.cls._flavour is os.path: | ||||||
|  |             self.skipTest("path flavour is supported") | ||||||
|  |         else: | ||||||
|  |             self.assertRaises(NotImplementedError, self.cls) | ||||||
|  | 
 | ||||||
|     def _test_cwd(self, p): |     def _test_cwd(self, p): | ||||||
|         q = self.cls(os.getcwd()) |         q = self.cls(os.getcwd()) | ||||||
|         self.assertEqual(p, q) |         self.assertEqual(p, q) | ||||||
|  | @ -1683,8 +1712,13 @@ def test_home(self): | ||||||
|             self._test_home(self.cls.home()) |             self._test_home(self.cls.home()) | ||||||
| 
 | 
 | ||||||
|     def test_with_segments(self): |     def test_with_segments(self): | ||||||
|         class P(_BasePurePathSubclass, self.cls): |         class P(self.cls): | ||||||
|             pass |             def __init__(self, *pathsegments, session_id): | ||||||
|  |                 super().__init__(*pathsegments) | ||||||
|  |                 self.session_id = session_id | ||||||
|  | 
 | ||||||
|  |             def with_segments(self, *pathsegments): | ||||||
|  |                 return type(self)(*pathsegments, session_id=self.session_id) | ||||||
|         p = P(BASE, session_id=42) |         p = P(BASE, session_id=42) | ||||||
|         self.assertEqual(42, p.absolute().session_id) |         self.assertEqual(42, p.absolute().session_id) | ||||||
|         self.assertEqual(42, p.resolve().session_id) |         self.assertEqual(42, p.resolve().session_id) | ||||||
|  | @ -1872,6 +1906,11 @@ def _check(glob, expected): | ||||||
|         else: |         else: | ||||||
|             _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE", "linkB"]) |             _check(p.glob("*/"), ["dirA", "dirB", "dirC", "dirE", "linkB"]) | ||||||
| 
 | 
 | ||||||
|  |     def test_glob_empty_pattern(self): | ||||||
|  |         p = self.cls() | ||||||
|  |         with self.assertRaisesRegex(ValueError, 'Unacceptable pattern'): | ||||||
|  |             list(p.glob('')) | ||||||
|  | 
 | ||||||
|     def test_glob_case_sensitive(self): |     def test_glob_case_sensitive(self): | ||||||
|         P = self.cls |         P = self.cls | ||||||
|         def _check(path, pattern, case_sensitive, expected): |         def _check(path, pattern, case_sensitive, expected): | ||||||
|  | @ -3022,28 +3061,8 @@ def test_walk_above_recursion_limit(self): | ||||||
|             list(base.walk(top_down=False)) |             list(base.walk(top_down=False)) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PathTest(_BasePathTest, unittest.TestCase): |  | ||||||
|     cls = pathlib.Path |  | ||||||
| 
 |  | ||||||
|     def test_concrete_class(self): |  | ||||||
|         p = self.cls('a') |  | ||||||
|         self.assertIs(type(p), |  | ||||||
|             pathlib.WindowsPath if os.name == 'nt' else pathlib.PosixPath) |  | ||||||
| 
 |  | ||||||
|     def test_unsupported_flavour(self): |  | ||||||
|         if os.name == 'nt': |  | ||||||
|             self.assertRaises(NotImplementedError, pathlib.PosixPath) |  | ||||||
|         else: |  | ||||||
|             self.assertRaises(NotImplementedError, pathlib.WindowsPath) |  | ||||||
| 
 |  | ||||||
|     def test_glob_empty_pattern(self): |  | ||||||
|         p = self.cls() |  | ||||||
|         with self.assertRaisesRegex(ValueError, 'Unacceptable pattern'): |  | ||||||
|             list(p.glob('')) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @only_posix | @only_posix | ||||||
| class PosixPathTest(_BasePathTest, unittest.TestCase): | class PosixPathTest(PathTest): | ||||||
|     cls = pathlib.PosixPath |     cls = pathlib.PosixPath | ||||||
| 
 | 
 | ||||||
|     def test_absolute(self): |     def test_absolute(self): | ||||||
|  | @ -3227,7 +3246,7 @@ def test_handling_bad_descriptor(self): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| @only_nt | @only_nt | ||||||
| class WindowsPathTest(_BasePathTest, unittest.TestCase): | class WindowsPathTest(PathTest): | ||||||
|     cls = pathlib.WindowsPath |     cls = pathlib.WindowsPath | ||||||
| 
 | 
 | ||||||
|     def test_absolute(self): |     def test_absolute(self): | ||||||
|  | @ -3345,15 +3364,8 @@ def check(): | ||||||
|             check() |             check() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class PurePathSubclassTest(_BasePurePathTest, unittest.TestCase): |  | ||||||
|     class cls(pathlib.PurePath): |  | ||||||
|         pass |  | ||||||
| 
 | 
 | ||||||
|     # repr() roundtripping is not supported in custom subclass. | class PathSubclassTest(PathTest): | ||||||
|     test_repr_roundtrips = None |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class PathSubclassTest(_BasePathTest, unittest.TestCase): |  | ||||||
|     class cls(pathlib.Path): |     class cls(pathlib.Path): | ||||||
|         pass |         pass | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Barney Gale
						Barney Gale