@@ -114,7 +114,6 @@ def test_parse_parts(self):
114
114
check (['//a/b/' ], ('\\ \\ a\\ b' , '\\ ' , ['\\ \\ a\\ b\\ ' ]))
115
115
check (['//a/b/c' ], ('\\ \\ a\\ b' , '\\ ' , ['\\ \\ a\\ b\\ ' , 'c' ]))
116
116
# Second part is anchored, so that the first part is ignored.
117
- check (['a' , 'Z:b' , 'c' ], ('Z:' , '' , ['Z:' , 'b' , 'c' ]))
118
117
check (['a' , 'Z:/b' , 'c' ], ('Z:' , '\\ ' , ['Z:\\ ' , 'b' , 'c' ]))
119
118
# UNC paths.
120
119
check (['a' , '//b/c' , 'd' ], ('\\ \\ b\\ c' , '\\ ' , ['\\ \\ b\\ c\\ ' , 'd' ]))
@@ -133,6 +132,16 @@ def test_parse_parts(self):
133
132
check (['a' , '/b' , 'c' ], ('' , '\\ ' , ['\\ ' , 'b' , 'c' ]))
134
133
check (['Z:/a' , '/b' , 'c' ], ('Z:' , '\\ ' , ['Z:\\ ' , 'b' , 'c' ]))
135
134
check (['//?/Z:/a' , '/b' , 'c' ], ('\\ \\ ?\\ Z:' , '\\ ' , ['\\ \\ ?\\ Z:\\ ' , 'b' , 'c' ]))
135
+ # Second part has a drive but not root.
136
+ check (['a' , 'Z:b' , 'c' ], ('Z:' , '' , ['Z:' , 'a' , 'b' , 'c' ]))
137
+ check (['Y:a' , 'Z:b' , 'c' ], ('Z:' , '' , ['Z:' , 'a' , 'b' , 'c' ]))
138
+ # Paths to files with NTFS alternate data streams
139
+ check (['./c:s' ], ('' , '' , ['c:s' ]))
140
+ check (['cc:s' ], ('' , '' , ['cc:s' ]))
141
+ check (['C:c:s' ], ('C:' , '' , ['C:' , 'c:s' ]))
142
+ check (['C:/c:s' ], ('C:' , '\\ ' , ['C:\\ ' , 'c:s' ]))
143
+ check (['D:a' , './c:b' ], ('D:' , '' , ['D:' , 'a' , 'c:b' ]))
144
+ check (['D:/a' , './c:b' ], ('D:' , '\\ ' , ['D:\\ ' , 'a' , 'c:b' ]))
136
145
137
146
def test_splitroot (self ):
138
147
f = self .flavour .splitroot
@@ -201,6 +210,7 @@ def test_constructor_common(self):
201
210
self .assertEqual (P (P ('a' ), 'b' ), P ('a/b' ))
202
211
self .assertEqual (P (P ('a' ), P ('b' )), P ('a/b' ))
203
212
self .assertEqual (P (P ('a' ), P ('b' ), P ('c' )), P (FakePath ("a/b/c" )))
213
+ self .assertEqual (P (P ('./a:b' )), P ('./a:b' ))
204
214
205
215
def _check_str_subclass (self , * args ):
206
216
# Issue #21127: it should be possible to construct a PurePath object
@@ -712,7 +722,9 @@ class PureWindowsPathTest(_BasePurePathTest, unittest.TestCase):
712
722
713
723
equivalences = _BasePurePathTest .equivalences .copy ()
714
724
equivalences .update ({
715
- 'c:a' : [ ('c:' , 'a' ), ('c:' , 'a/' ), ('/' , 'c:' , 'a' ) ],
725
+ './a:b' : [ ('./a:b' ,) ],
726
+ 'a:b:c' : [ ('./b:c' , 'a:' ), ('b:' , 'a:b:c' ) ],
727
+ 'c:a' : [ ('c:' , 'a' ), ('c:' , 'a/' ), ('.' , 'c:' , 'a' ) ],
716
728
'c:/a' : [
717
729
('c:/' , 'a' ), ('c:' , '/' , 'a' ), ('c:' , '/a' ),
718
730
('/z' , 'c:/' , 'a' ), ('//x/y' , 'c:/' , 'a' ),
@@ -736,6 +748,7 @@ def test_str(self):
736
748
self .assertEqual (str (p ), '\\ \\ a\\ b\\ c\\ d' )
737
749
738
750
def test_str_subclass (self ):
751
+ self ._check_str_subclass ('.\\ a:b' )
739
752
self ._check_str_subclass ('c:' )
740
753
self ._check_str_subclass ('c:a' )
741
754
self ._check_str_subclass ('c:a\\ b.txt' )
@@ -882,6 +895,7 @@ def test_drive(self):
882
895
self .assertEqual (P ('//a/b' ).drive , '\\ \\ a\\ b' )
883
896
self .assertEqual (P ('//a/b/' ).drive , '\\ \\ a\\ b' )
884
897
self .assertEqual (P ('//a/b/c/d' ).drive , '\\ \\ a\\ b' )
898
+ self .assertEqual (P ('./c:a' ).drive , '' )
885
899
886
900
def test_root (self ):
887
901
P = self .cls
@@ -1104,6 +1118,14 @@ def test_join(self):
1104
1118
self .assertEqual (pp , P ('C:/a/b/x/y' ))
1105
1119
pp = p .joinpath ('c:/x/y' )
1106
1120
self .assertEqual (pp , P ('C:/x/y' ))
1121
+ # Joining with files with NTFS data streams => the filename should
1122
+ # not be parsed as a drive letter
1123
+ pp = p .joinpath (P ('./d:s' ))
1124
+ self .assertEqual (pp , P ('C:/a/b/d:s' ))
1125
+ pp = p .joinpath (P ('./dd:s' ))
1126
+ self .assertEqual (pp , P ('C:/a/b/dd:s' ))
1127
+ pp = p .joinpath (P ('E:d:s' ))
1128
+ self .assertEqual (pp , P ('E:d:s' ))
1107
1129
1108
1130
def test_div (self ):
1109
1131
# Basically the same as joinpath().
@@ -1124,6 +1146,11 @@ def test_div(self):
1124
1146
# the second path is relative.
1125
1147
self .assertEqual (p / 'c:x/y' , P ('C:/a/b/x/y' ))
1126
1148
self .assertEqual (p / 'c:/x/y' , P ('C:/x/y' ))
1149
+ # Joining with files with NTFS data streams => the filename should
1150
+ # not be parsed as a drive letter
1151
+ self .assertEqual (p / P ('./d:s' ), P ('C:/a/b/d:s' ))
1152
+ self .assertEqual (p / P ('./dd:s' ), P ('C:/a/b/dd:s' ))
1153
+ self .assertEqual (p / P ('E:d:s' ), P ('E:d:s' ))
1127
1154
1128
1155
def test_is_reserved (self ):
1129
1156
P = self .cls
@@ -1333,6 +1360,8 @@ def test_expanduser_common(self):
1333
1360
self .assertEqual (p .expanduser (), p )
1334
1361
p = P (P ('' ).absolute ().anchor ) / '~'
1335
1362
self .assertEqual (p .expanduser (), p )
1363
+ p = P ('~/a:b' )
1364
+ self .assertEqual (p .expanduser (), P (os .path .expanduser ('~' ), './a:b' ))
1336
1365
1337
1366
def test_exists (self ):
1338
1367
P = self .cls
@@ -2328,6 +2357,11 @@ def check():
2328
2357
env ['USERPROFILE' ] = 'C:\\ Users\\ alice'
2329
2358
check ()
2330
2359
2360
+ def test_resolve (self ):
2361
+ P = self .cls
2362
+ p = P (BASE , './a:b' )
2363
+ self .assertEqual (str (p .resolve (strict = False )), f'{ BASE } \\ a:b' )
2364
+
2331
2365
2332
2366
if __name__ == "__main__" :
2333
2367
unittest .main ()
0 commit comments