@@ -810,6 +810,9 @@ def test_drive_root_parts(self):
810810 check (('c:/a' ,), 'c:' , '\\ ' , ('c:\\ ' , 'a' ))
811811 check (('/a' ,), '' , '\\ ' , ('\\ ' , 'a' ))
812812 # UNC paths.
813+ check (('//' ,), '\\ \\ ' , '' , ('\\ \\ ' ,))
814+ check (('//a' ,), '\\ \\ a' , '' , ('\\ \\ a' ,))
815+ check (('//a/' ,), '\\ \\ a\\ ' , '' , ('\\ \\ a\\ ' ,))
813816 check (('//a/b' ,), '\\ \\ a\\ b' , '\\ ' , ('\\ \\ a\\ b\\ ' ,))
814817 check (('//a/b/' ,), '\\ \\ a\\ b' , '\\ ' , ('\\ \\ a\\ b\\ ' ,))
815818 check (('//a/b/c' ,), '\\ \\ a\\ b' , '\\ ' , ('\\ \\ a\\ b\\ ' , 'c' ))
@@ -823,12 +826,26 @@ def test_drive_root_parts(self):
823826 # UNC paths.
824827 check (('a' , '//b/c//' , 'd' ), '\\ \\ b\\ c' , '\\ ' , ('\\ \\ b\\ c\\ ' , 'd' ))
825828 # Extended paths.
829+ check (('//./c:' ,), '\\ \\ .\\ c:' , '' , ('\\ \\ .\\ c:' ,))
826830 check (('//?/c:/' ,), '\\ \\ ?\\ c:' , '\\ ' , ('\\ \\ ?\\ c:\\ ' ,))
827831 check (('//?/c:/a' ,), '\\ \\ ?\\ c:' , '\\ ' , ('\\ \\ ?\\ c:\\ ' , 'a' ))
828832 check (('//?/c:/a' , '/b' ), '\\ \\ ?\\ c:' , '\\ ' , ('\\ \\ ?\\ c:\\ ' , 'b' ))
829833 # Extended UNC paths (format is "\\?\UNC\server\share").
834+ check (('//?' ,), '\\ \\ ?' , '' , ('\\ \\ ?' ,))
835+ check (('//?/' ,), '\\ \\ ?\\ ' , '' , ('\\ \\ ?\\ ' ,))
836+ check (('//?/UNC' ,), '\\ \\ ?\\ UNC' , '' , ('\\ \\ ?\\ UNC' ,))
837+ check (('//?/UNC/' ,), '\\ \\ ?\\ UNC\\ ' , '' , ('\\ \\ ?\\ UNC\\ ' ,))
838+ check (('//?/UNC/b' ,), '\\ \\ ?\\ UNC\\ b' , '' , ('\\ \\ ?\\ UNC\\ b' ,))
839+ check (('//?/UNC/b/' ,), '\\ \\ ?\\ UNC\\ b\\ ' , '' , ('\\ \\ ?\\ UNC\\ b\\ ' ,))
830840 check (('//?/UNC/b/c' ,), '\\ \\ ?\\ UNC\\ b\\ c' , '\\ ' , ('\\ \\ ?\\ UNC\\ b\\ c\\ ' ,))
841+ check (('//?/UNC/b/c/' ,), '\\ \\ ?\\ UNC\\ b\\ c' , '\\ ' , ('\\ \\ ?\\ UNC\\ b\\ c\\ ' ,))
831842 check (('//?/UNC/b/c/d' ,), '\\ \\ ?\\ UNC\\ b\\ c' , '\\ ' , ('\\ \\ ?\\ UNC\\ b\\ c\\ ' , 'd' ))
843+ # UNC device paths
844+ check (('//./BootPartition/' ,), '\\ \\ .\\ BootPartition' , '\\ ' , ('\\ \\ .\\ BootPartition\\ ' ,))
845+ check (('//?/BootPartition/' ,), '\\ \\ ?\\ BootPartition' , '\\ ' , ('\\ \\ ?\\ BootPartition\\ ' ,))
846+ check (('//./PhysicalDrive0' ,), '\\ \\ .\\ PhysicalDrive0' , '' , ('\\ \\ .\\ PhysicalDrive0' ,))
847+ check (('//?/Volume{}/' ,), '\\ \\ ?\\ Volume{}' , '\\ ' , ('\\ \\ ?\\ Volume{}\\ ' ,))
848+ check (('//./nul' ,), '\\ \\ .\\ nul' , '' , ('\\ \\ .\\ nul' ,))
832849 # Second part has a root but not drive.
833850 check (('a' , '/b' , 'c' ), '' , '\\ ' , ('\\ ' , 'b' , 'c' ))
834851 check (('Z:/a' , '/b' , 'c' ), 'Z:' , '\\ ' , ('Z:\\ ' , 'b' , 'c' ))
@@ -1371,6 +1388,13 @@ def test_join(self):
13711388 self .assertEqual (pp , P ('C:/a/b/dd:s' ))
13721389 pp = p .joinpath (P ('E:d:s' ))
13731390 self .assertEqual (pp , P ('E:d:s' ))
1391+ # Joining onto a UNC path with no root
1392+ pp = P ('//' ).joinpath ('server' )
1393+ self .assertEqual (pp , P ('//server' ))
1394+ pp = P ('//server' ).joinpath ('share' )
1395+ self .assertEqual (pp , P ('//server/share' ))
1396+ pp = P ('//./BootPartition' ).joinpath ('Windows' )
1397+ self .assertEqual (pp , P ('//./BootPartition/Windows' ))
13741398
13751399 def test_div (self ):
13761400 # Basically the same as joinpath().
0 commit comments