@@ -272,6 +272,113 @@ func TestResolvePath(t *testing.T) {
272
272
assert .Equal (t , ResolvePath ("a" , "b" , "../c" ), "a/c" )
273
273
}
274
274
275
+ func TestGetNormalizedAbsolutePath (t * testing.T ) {
276
+ t .Parallel ()
277
+
278
+ assert .Equal (t , GetNormalizedAbsolutePath ("/" , "" ), "/" )
279
+ assert .Equal (t , GetNormalizedAbsolutePath ("/." , "" ), "/" )
280
+ assert .Equal (t , GetNormalizedAbsolutePath ("/./" , "" ), "/" )
281
+ assert .Equal (t , GetNormalizedAbsolutePath ("/../" , "" ), "/" )
282
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a" , "" ), "/a" )
283
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/" , "" ), "/a" )
284
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/." , "" ), "/a" )
285
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/foo." , "" ), "/a/foo." )
286
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/./" , "" ), "/a" )
287
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/./b" , "" ), "/a/b" )
288
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/./b/" , "" ), "/a/b" )
289
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/.." , "" ), "/" )
290
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/../" , "" ), "/" )
291
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/../" , "" ), "/" )
292
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/../b" , "" ), "/b" )
293
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/../b/" , "" ), "/b" )
294
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/.." , "" ), "/" )
295
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/.." , "/" ), "/" )
296
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/.." , "b/" ), "/" )
297
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/.." , "/b" ), "/" )
298
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/." , "b" ), "/a" )
299
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/." , "." ), "/a" )
300
+
301
+ // Tests as above, but with backslashes.
302
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ " , "" ), "/" )
303
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ ." , "" ), "/" )
304
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ .\\ " , "" ), "/" )
305
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ ..\\ " , "" ), "/" )
306
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .\\ " , "" ), "/a" )
307
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .\\ b" , "" ), "/a/b" )
308
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .\\ b\\ " , "" ), "/a/b" )
309
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .." , "" ), "/" )
310
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ ..\\ " , "" ), "/" )
311
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ ..\\ " , "" ), "/" )
312
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ ..\\ b" , "" ), "/b" )
313
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ ..\\ b\\ " , "" ), "/b" )
314
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .." , "" ), "/" )
315
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .." , "\\ " ), "/" )
316
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .." , "b\\ " ), "/" )
317
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ .." , "\\ b" ), "/" )
318
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ ." , "b" ), "/a" )
319
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ ." , "." ), "/a" )
320
+
321
+ // Relative paths on an empty currentDirectory.
322
+ assert .Equal (t , GetNormalizedAbsolutePath ("" , "" ), "" )
323
+ assert .Equal (t , GetNormalizedAbsolutePath ("." , "" ), "" )
324
+ assert .Equal (t , GetNormalizedAbsolutePath ("./" , "" ), "" )
325
+ // Strangely, these do not normalize to the empty string.
326
+ assert .Equal (t , GetNormalizedAbsolutePath (".." , "" ), ".." )
327
+ assert .Equal (t , GetNormalizedAbsolutePath ("../" , "" ), ".." )
328
+
329
+ // Interaction between relative paths and currentDirectory.
330
+ assert .Equal (t , GetNormalizedAbsolutePath ("" , "/home" ), "/home" )
331
+ assert .Equal (t , GetNormalizedAbsolutePath ("." , "/home" ), "/home" )
332
+ assert .Equal (t , GetNormalizedAbsolutePath ("./" , "/home" ), "/home" )
333
+ assert .Equal (t , GetNormalizedAbsolutePath (".." , "/home" ), "/" )
334
+ assert .Equal (t , GetNormalizedAbsolutePath ("../" , "/home" ), "/" )
335
+ assert .Equal (t , GetNormalizedAbsolutePath ("a" , "b" ), "b/a" )
336
+ assert .Equal (t , GetNormalizedAbsolutePath ("a" , "b/c" ), "b/c/a" )
337
+
338
+ // Base names starting or ending with a dot do not affect normalization.
339
+ assert .Equal (t , GetNormalizedAbsolutePath (".a" , "" ), ".a" )
340
+ assert .Equal (t , GetNormalizedAbsolutePath ("..a" , "" ), "..a" )
341
+ assert .Equal (t , GetNormalizedAbsolutePath ("a." , "" ), "a." )
342
+ assert .Equal (t , GetNormalizedAbsolutePath ("a.." , "" ), "a.." )
343
+
344
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/./.a" , "" ), "/base/.a" )
345
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/../.a" , "" ), "/.a" )
346
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/./..a" , "" ), "/base/..a" )
347
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/../..a" , "" ), "/..a" )
348
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/./..a/b" , "" ), "/base/..a/b" )
349
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/../..a/b" , "" ), "/..a/b" )
350
+
351
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/./a." , "" ), "/base/a." )
352
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/../a." , "" ), "/a." )
353
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/./a.." , "" ), "/base/a.." )
354
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/../a.." , "" ), "/a.." )
355
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/./a../b" , "" ), "/base/a../b" )
356
+ assert .Equal (t , GetNormalizedAbsolutePath ("/base/../a../b" , "" ), "/a../b" )
357
+
358
+ // Consecutive intermediate slashes are normalized to a single slash.
359
+ assert .Equal (t , GetNormalizedAbsolutePath ("a//b" , "" ), "a/b" )
360
+ assert .Equal (t , GetNormalizedAbsolutePath ("a///b" , "" ), "a/b" )
361
+ assert .Equal (t , GetNormalizedAbsolutePath ("a/b//c" , "" ), "a/b/c" )
362
+ assert .Equal (t , GetNormalizedAbsolutePath ("/a/b//c" , "" ), "/a/b/c" )
363
+ assert .Equal (t , GetNormalizedAbsolutePath ("//a/b//c" , "" ), "//a/b/c" )
364
+
365
+ // Backslashes are converted to slashes,
366
+ // and then consecutive intermediate slashes are normalized to a single slash
367
+ assert .Equal (t , GetNormalizedAbsolutePath ("a\\ \\ b" , "" ), "a/b" )
368
+ assert .Equal (t , GetNormalizedAbsolutePath ("a\\ \\ \\ b" , "" ), "a/b" )
369
+ assert .Equal (t , GetNormalizedAbsolutePath ("a\\ b\\ \\ c" , "" ), "a/b/c" )
370
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ b\\ \\ c" , "" ), "/a/b/c" )
371
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ \\ a\\ b\\ \\ c" , "" ), "//a/b/c" )
372
+
373
+ // The same occurs for mixed slashes.
374
+ assert .Equal (t , GetNormalizedAbsolutePath ("a/\\ b" , "" ), "a/b" )
375
+ assert .Equal (t , GetNormalizedAbsolutePath ("a\\ /b" , "" ), "a/b" )
376
+ assert .Equal (t , GetNormalizedAbsolutePath ("a\\ /\\ b" , "" ), "a/b" )
377
+ assert .Equal (t , GetNormalizedAbsolutePath ("a\\ b//c" , "" ), "a/b/c" )
378
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ a\\ b\\ \\ c" , "" ), "/a/b/c" )
379
+ assert .Equal (t , GetNormalizedAbsolutePath ("\\ \\ a\\ b\\ \\ c" , "" ), "//a/b/c" )
380
+ }
381
+
275
382
func TestGetRelativePathToDirectoryOrUrl (t * testing.T ) {
276
383
t .Parallel ()
277
384
// !!!
0 commit comments