@@ -810,6 +810,9 @@ def test_drive_root_parts(self):
810
810
check (('c:/a' ,), 'c:' , '\\ ' , ('c:\\ ' , 'a' ))
811
811
check (('/a' ,), '' , '\\ ' , ('\\ ' , 'a' ))
812
812
# UNC paths.
813
+ check (('//' ,), '\\ \\ ' , '' , ('\\ \\ ' ,))
814
+ check (('//a' ,), '\\ \\ a' , '' , ('\\ \\ a' ,))
815
+ check (('//a/' ,), '\\ \\ a\\ ' , '' , ('\\ \\ a\\ ' ,))
813
816
check (('//a/b' ,), '\\ \\ a\\ b' , '\\ ' , ('\\ \\ a\\ b\\ ' ,))
814
817
check (('//a/b/' ,), '\\ \\ a\\ b' , '\\ ' , ('\\ \\ a\\ b\\ ' ,))
815
818
check (('//a/b/c' ,), '\\ \\ a\\ b' , '\\ ' , ('\\ \\ a\\ b\\ ' , 'c' ))
@@ -823,12 +826,26 @@ def test_drive_root_parts(self):
823
826
# UNC paths.
824
827
check (('a' , '//b/c//' , 'd' ), '\\ \\ b\\ c' , '\\ ' , ('\\ \\ b\\ c\\ ' , 'd' ))
825
828
# Extended paths.
829
+ check (('//./c:' ,), '\\ \\ .\\ c:' , '' , ('\\ \\ .\\ c:' ,))
826
830
check (('//?/c:/' ,), '\\ \\ ?\\ c:' , '\\ ' , ('\\ \\ ?\\ c:\\ ' ,))
827
831
check (('//?/c:/a' ,), '\\ \\ ?\\ c:' , '\\ ' , ('\\ \\ ?\\ c:\\ ' , 'a' ))
828
832
check (('//?/c:/a' , '/b' ), '\\ \\ ?\\ c:' , '\\ ' , ('\\ \\ ?\\ c:\\ ' , 'b' ))
829
833
# 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\\ ' ,))
830
840
check (('//?/UNC/b/c' ,), '\\ \\ ?\\ UNC\\ b\\ c' , '\\ ' , ('\\ \\ ?\\ UNC\\ b\\ c\\ ' ,))
841
+ check (('//?/UNC/b/c/' ,), '\\ \\ ?\\ UNC\\ b\\ c' , '\\ ' , ('\\ \\ ?\\ UNC\\ b\\ c\\ ' ,))
831
842
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' ,))
832
849
# Second part has a root but not drive.
833
850
check (('a' , '/b' , 'c' ), '' , '\\ ' , ('\\ ' , 'b' , 'c' ))
834
851
check (('Z:/a' , '/b' , 'c' ), 'Z:' , '\\ ' , ('Z:\\ ' , 'b' , 'c' ))
@@ -1371,6 +1388,13 @@ def test_join(self):
1371
1388
self .assertEqual (pp , P ('C:/a/b/dd:s' ))
1372
1389
pp = p .joinpath (P ('E:d:s' ))
1373
1390
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' ))
1374
1398
1375
1399
def test_div (self ):
1376
1400
# Basically the same as joinpath().
0 commit comments