@@ -329,9 +329,106 @@ func TestToNorm(t *testing.T) {
329
329
for _ , test := range tests {
330
330
got , err := filepath .ToNorm (test .arg , stubBase )
331
331
if err != nil {
332
- t .Errorf ("unexpected toNorm error, arg: %s, err : %v\n " , test .arg , err )
332
+ t .Errorf ("toNorm(%s) failed : %v\n " , test .arg , err )
333
333
} else if got != test .want {
334
- t .Errorf ("toNorm error, arg: %s, want: %s, got: %s\n " , test .arg , test .want , got )
334
+ t .Errorf ("toNorm(%s) returns %s, but %s expected\n " , test .arg , got , test .want )
335
+ }
336
+ }
337
+
338
+ testPath := `{{tmp}}\test\foo\bar`
339
+
340
+ testsDir := []struct {
341
+ wd string
342
+ arg string
343
+ want string
344
+ }{
345
+ // test absolute paths
346
+ {"." , `{{tmp}}\test\foo\bar` , `{{tmp}}\test\foo\bar` },
347
+ {"." , `{{tmp}}\.\test/foo\bar` , `{{tmp}}\test\foo\bar` },
348
+ {"." , `{{tmp}}\test\..\test\foo\bar` , `{{tmp}}\test\foo\bar` },
349
+ {"." , `{{tmp}}\TEST\FOO\BAR` , `{{tmp}}\test\foo\bar` },
350
+
351
+ // test relative paths begin with drive letter
352
+ {`{{tmp}}\test` , `{{tmpvol}}.` , `{{tmpvol}}.` },
353
+ {`{{tmp}}\test` , `{{tmpvol}}..` , `{{tmpvol}}..` },
354
+ {`{{tmp}}\test` , `{{tmpvol}}foo\bar` , `{{tmpvol}}foo\bar` },
355
+ {`{{tmp}}\test` , `{{tmpvol}}.\foo\bar` , `{{tmpvol}}foo\bar` },
356
+ {`{{tmp}}\test` , `{{tmpvol}}foo\..\foo\bar` , `{{tmpvol}}foo\bar` },
357
+ {`{{tmp}}\test` , `{{tmpvol}}FOO\BAR` , `{{tmpvol}}foo\bar` },
358
+
359
+ // test relative paths begin with '\'
360
+ {"." , `{{tmpnovol}}\test\foo\bar` , `{{tmpnovol}}\test\foo\bar` },
361
+ {"." , `{{tmpnovol}}\.\test\foo\bar` , `{{tmpnovol}}\test\foo\bar` },
362
+ {"." , `{{tmpnovol}}\test\..\test\foo\bar` , `{{tmpnovol}}\test\foo\bar` },
363
+ {"." , `{{tmpnovol}}\TEST\FOO\BAR` , `{{tmpnovol}}\test\foo\bar` },
364
+
365
+ // test relative paths begin without '\'
366
+ {`{{tmp}}\test` , "." , `.` },
367
+ {`{{tmp}}\test` , ".." , `..` },
368
+ {`{{tmp}}\test` , `foo\bar` , `foo\bar` },
369
+ {`{{tmp}}\test` , `.\foo\bar` , `foo\bar` },
370
+ {`{{tmp}}\test` , `foo\..\foo\bar` , `foo\bar` },
371
+ {`{{tmp}}\test` , `FOO\BAR` , `foo\bar` },
372
+ }
373
+
374
+ cwd , err := os .Getwd ()
375
+ if err != nil {
376
+ t .Fatal (err )
377
+ }
378
+
379
+ defer func () {
380
+ err := os .Chdir (cwd )
381
+ if err != nil {
382
+ t .Fatal (err )
383
+ }
384
+ }()
385
+
386
+ tmp , err := ioutil .TempDir ("" , "testToNorm" )
387
+ if err != nil {
388
+ t .Fatal (err )
389
+ }
390
+ defer os .RemoveAll (tmp )
391
+
392
+ // ioutil.TempDir might return "non-canonical" name.
393
+ tmp , err = filepath .EvalSymlinks (tmp )
394
+ if err != nil {
395
+ t .Fatal (err )
396
+ }
397
+
398
+ err = os .MkdirAll (strings .Replace (testPath , "{{tmp}}" , tmp , - 1 ), 0777 )
399
+ if err != nil {
400
+ t .Fatal (err )
401
+ }
402
+
403
+ tmpVol := filepath .VolumeName (tmp )
404
+ tmpNoVol := tmp [len (tmpVol ):]
405
+
406
+ for _ , test := range testsDir {
407
+ wd := strings .Replace (strings .Replace (strings .Replace (test .wd , "{{tmp}}" , tmp , - 1 ), "{{tmpvol}}" , tmpVol , - 1 ), "{{tmpnovol}}" , tmpNoVol , - 1 )
408
+ arg := strings .Replace (strings .Replace (strings .Replace (test .arg , "{{tmp}}" , tmp , - 1 ), "{{tmpvol}}" , tmpVol , - 1 ), "{{tmpnovol}}" , tmpNoVol , - 1 )
409
+ want := strings .Replace (strings .Replace (strings .Replace (test .want , "{{tmp}}" , tmp , - 1 ), "{{tmpvol}}" , tmpVol , - 1 ), "{{tmpnovol}}" , tmpNoVol , - 1 )
410
+
411
+ if test .wd == "." {
412
+ err := os .Chdir (cwd )
413
+ if err != nil {
414
+ t .Error (err )
415
+
416
+ continue
417
+ }
418
+ } else {
419
+ err := os .Chdir (wd )
420
+ if err != nil {
421
+ t .Error (err )
422
+
423
+ continue
424
+ }
425
+ }
426
+
427
+ got , err := filepath .ToNorm (arg , filepath .NormBase )
428
+ if err != nil {
429
+ t .Errorf ("toNorm(%s) failed: %v (wd=%s)\n " , arg , err , wd )
430
+ } else if got != want {
431
+ t .Errorf ("toNorm(%s) returns %s, but %s expected (wd=%s)\n " , arg , got , want , wd )
335
432
}
336
433
}
337
434
}
0 commit comments