@@ -200,25 +200,30 @@ func TestBuilder(t *testing.T) {
200200
201201 t .Run ("WindowsNormalized" , func (t * testing.T ) {
202202 for from , to := range map [string ]string {
203- "" : "." ,
204- "./" : "." ,
205- "./." : "." ,
206- "../" : ".." ,
207- "../." : ".." ,
208- "/." : "\\ " ,
209- "/./" : "\\ " ,
210- "/.." : "\\ " ,
211- "/../" : "\\ " ,
212- "/hello/." : "\\ hello\\ " ,
213- "/hello/../." : "\\ hello\\ .." ,
214- "//Server/Share/hello" : "\\ \\ Server\\ Share\\ hello" ,
215- "//Server/Share/." : "\\ \\ Server\\ Share\\ " ,
216- "//Server/Share/./" : "\\ \\ Server\\ Share\\ " ,
217- "//Server/Share/.." : "\\ \\ Server\\ Share\\ " ,
218- "//Server/Share/../" : "\\ \\ Server\\ Share\\ " ,
219- "//Server/Share/hello/." : "\\ \\ Server\\ Share\\ hello\\ " ,
220- "//Server/Share/hello/../." : "\\ \\ Server\\ Share\\ hello\\ .." ,
221- "/\\ Server\\ Share/hello/../." : "\\ \\ Server\\ Share\\ hello\\ .." ,
203+ "" : "." ,
204+ "./" : "." ,
205+ "./." : "." ,
206+ "../" : ".." ,
207+ "../." : ".." ,
208+ "/." : "\\ " ,
209+ "/./" : "\\ " ,
210+ "/.." : "\\ " ,
211+ "/../" : "\\ " ,
212+ "/hello/." : "\\ hello\\ " ,
213+ "/hello/../." : "\\ hello\\ .." ,
214+ "//Server/Share/hello" : "\\ \\ Server\\ Share\\ hello" ,
215+ "//Server/Share/." : "\\ \\ Server\\ Share\\ " ,
216+ "//Server/Share/./" : "\\ \\ Server\\ Share\\ " ,
217+ "//Server/Share/.." : "\\ \\ Server\\ Share\\ " ,
218+ "//Server/Share/../" : "\\ \\ Server\\ Share\\ " ,
219+ "//Server/Share/hello/." : "\\ \\ Server\\ Share\\ hello\\ " ,
220+ "//Server/Share/hello/../." : "\\ \\ Server\\ Share\\ hello\\ .." ,
221+ "/\\ Server\\ Share/hello/../." : "\\ \\ Server\\ Share\\ hello\\ .." ,
222+ "\\ \\ ?\\ C:\\ hello\\ ." : "C:\\ hello\\ " ,
223+ "\\ \\ ?\\ UNC\\ Server\\ Share\\ hello\\ ." : "\\ \\ Server\\ Share\\ hello\\ " ,
224+ "\\ ??\\ C:\\ hello\\ ." : "C:\\ hello\\ " ,
225+ "\\ ??\\ Z:\\ file0" : "Z:\\ file0" ,
226+ "\\ ??\\ UNC\\ Server\\ Share\\ hello\\ ." : "\\ \\ Server\\ Share\\ hello\\ " ,
222227 } {
223228 t .Run (from , func (t * testing.T ) {
224229 builder1 , scopeWalker1 := path .EmptyBuilder .Join (path .VoidScopeWalker )
@@ -387,4 +392,48 @@ func TestBuilder(t *testing.T) {
387392 require .NoError (t , path .Resolve (path .WindowsFormat .NewParser ("\\ \\ server\\ share\\ file.txt" ), s ))
388393 require .Equal (t , "\\ \\ server\\ share\\ file.txt" , mustGetWindowsString (builder ))
389394 })
395+
396+ t .Run ("ExtendedDrivePath" , func (t * testing.T ) {
397+ scopeWalker := mock .NewMockScopeWalker (ctrl )
398+ componentWalker := mock .NewMockComponentWalker (ctrl )
399+ scopeWalker .EXPECT ().OnDriveLetter ('C' ).Return (componentWalker , nil )
400+ componentWalker .EXPECT ().OnTerminal (path .MustNewComponent ("file.txt" ))
401+
402+ builder , s := path .EmptyBuilder .Join (scopeWalker )
403+ require .NoError (t , path .Resolve (path .WindowsFormat .NewParser ("\\ \\ ?\\ C:\\ file.txt" ), s ))
404+ require .Equal (t , "C:\\ file.txt" , mustGetWindowsString (builder ))
405+ })
406+
407+ t .Run ("ExtendedUNCPath" , func (t * testing.T ) {
408+ scopeWalker := mock .NewMockScopeWalker (ctrl )
409+ componentWalker := mock .NewMockComponentWalker (ctrl )
410+ scopeWalker .EXPECT ().OnShare ("server" , "share" ).Return (componentWalker , nil )
411+ componentWalker .EXPECT ().OnTerminal (path .MustNewComponent ("file.txt" ))
412+
413+ builder , s := path .EmptyBuilder .Join (scopeWalker )
414+ require .NoError (t , path .Resolve (path .WindowsFormat .NewParser ("\\ \\ ?\\ UNC\\ server\\ share\\ file.txt" ), s ))
415+ require .Equal (t , "\\ \\ server\\ share\\ file.txt" , mustGetWindowsString (builder ))
416+ })
417+
418+ t .Run ("NTObjectNamespaceDrivePath" , func (t * testing.T ) {
419+ scopeWalker := mock .NewMockScopeWalker (ctrl )
420+ componentWalker := mock .NewMockComponentWalker (ctrl )
421+ scopeWalker .EXPECT ().OnDriveLetter ('Z' ).Return (componentWalker , nil )
422+ componentWalker .EXPECT ().OnTerminal (path .MustNewComponent ("file0" ))
423+
424+ builder , s := path .EmptyBuilder .Join (scopeWalker )
425+ require .NoError (t , path .Resolve (path .WindowsFormat .NewParser ("\\ ??\\ Z:\\ file0" ), s ))
426+ require .Equal (t , "Z:\\ file0" , mustGetWindowsString (builder ))
427+ })
428+
429+ t .Run ("NTObjectNamespaceUNCPath" , func (t * testing.T ) {
430+ scopeWalker := mock .NewMockScopeWalker (ctrl )
431+ componentWalker := mock .NewMockComponentWalker (ctrl )
432+ scopeWalker .EXPECT ().OnShare ("myserver" , "myshare" ).Return (componentWalker , nil )
433+ componentWalker .EXPECT ().OnTerminal (path .MustNewComponent ("data.txt" ))
434+
435+ builder , s := path .EmptyBuilder .Join (scopeWalker )
436+ require .NoError (t , path .Resolve (path .WindowsFormat .NewParser ("\\ ??\\ UNC\\ myserver\\ myshare\\ data.txt" ), s ))
437+ require .Equal (t , "\\ \\ myserver\\ myshare\\ data.txt" , mustGetWindowsString (builder ))
438+ })
390439}
0 commit comments