1
1
local Path = require " plenary.path"
2
2
local path = Path .path
3
3
4
+ -- NOTE: breaking this could break tests
4
5
local function new_env ()
5
6
local env , trash = {}, {}
6
7
@@ -414,16 +415,22 @@ describe("Path", function()
414
415
end )
415
416
end )
416
417
417
- -- TODO: tests for bugs, and new behavior, allows rename to self
418
+ -- TODO: tests new behavior, allows rename to self
418
419
describe (" rename" , function ()
419
420
local env = new_env ()
420
421
after_each (env .cleanup )
421
422
422
423
it (" can rename a file" , function ()
423
424
local before , after = env .new_path { touch = true }, env .new_path ()
425
+ -- Can pass another Path object
424
426
before :rename { new_name = after }
425
427
assert .is .False (before :exists ())
426
428
assert .is .True (after :exists ())
429
+ before , after = env .new_path { touch = true }, env .new_path ()
430
+ -- Also works with string
431
+ before :rename { new_name = after .filename }
432
+ assert .is .False (before :exists ())
433
+ assert .is .True (after :exists ())
427
434
end )
428
435
429
436
it (" should throw on invalid args" , function ()
@@ -440,12 +447,19 @@ describe("Path", function()
440
447
assert .is .True (before :exists ())
441
448
end )
442
449
450
+ it (" should throw if old name doesn't exist" , function ()
451
+ local before , after = env .new_path { touch = false }, env .new_path { touch = false }
452
+ assert .errors (function ()
453
+ before :rename { new_name = after }
454
+ end )
455
+ end )
456
+
443
457
it (" can move to parent dir" , function ()
444
458
local before , after = env .new_path { filename = " random_file" }, env .new_path { filename = " ../random_file" }
445
459
assert .is .False (before :exists ())
460
+ assert .is .False (after :exists ())
446
461
before :touch ()
447
462
assert .is .True (before :exists ())
448
- assert .is .False (after :exists ())
449
463
before :rename { new_name = after }
450
464
assert .is .False (before :exists ())
451
465
assert .is .True (after :exists ())
@@ -457,6 +471,50 @@ describe("Path", function()
457
471
before :rename { new_name = after }
458
472
end )
459
473
end )
474
+
475
+ it (" shouldn't throw on rename to same filename" , function ()
476
+ local before = env .new_path { touch = true }
477
+ assert .does .Not .error (function ()
478
+ before :rename { new_name = before }
479
+ end )
480
+ end )
481
+
482
+ -- BUG: introduced in f71ee45 (#90)
483
+ it (" should handle . or .. or ./ or ../ prefix" , function ()
484
+ for _ , pre in ipairs { " ." , " .." , " ./" , " ../" } do
485
+ local before , after =
486
+ env .new_path { filename = " random_file" }, env .new_path { filename = pre .. " random_file2" }
487
+ assert .is .False (before :exists ())
488
+ assert .is .False (after :exists ())
489
+ before :touch ()
490
+ assert .is .True (before :exists ())
491
+ before :rename { new_name = after }
492
+ assert .is .False (before :exists ())
493
+ assert .is .True (after :exists ())
494
+ end
495
+ end )
496
+
497
+ -- BUG: introduced in f71ee45 (#90)
498
+ it (" should consider bad symlink as existing, and throw" , function ()
499
+ local before , after , non_existing = env .new_path { touch = true }, env .new_path (), env .new_path ()
500
+ vim .loop .fs_symlink (non_existing .filename , after .filename )
501
+ assert .is .True (not not vim .loop .fs_lstat (after .filename ))
502
+ assert .errors (function ()
503
+ before :rename { new_name = after }
504
+ end )
505
+ end )
506
+
507
+ it (" should return result as new Path instance with the new filename" , function ()
508
+ local before , after = env .new_path { touch = true }, env .new_path ()
509
+ local before_filename = before .filename
510
+ local new = before :rename { new_name = after }
511
+ assert .is .False (before :exists ())
512
+ assert .is .True (after :exists ())
513
+ assert .is .True (Path .is_path (new ))
514
+ assert .are .equal (before .filename , before_filename )
515
+ assert .are .Not .equal (new , after )
516
+ assert .are .Not .equal (new , before )
517
+ end )
460
518
end )
461
519
462
520
describe (" copy" , function ()
0 commit comments