11local Path = require " plenary.path"
22local path = Path .path
33
4+ -- NOTE: breaking this could break tests
45local function new_env ()
56 local env , trash = {}, {}
67
@@ -414,16 +415,22 @@ describe("Path", function()
414415 end )
415416 end )
416417
417- -- TODO: tests for bugs, and new behavior, allows rename to self
418+ -- TODO: tests new behavior, allows rename to self
418419 describe (" rename" , function ()
419420 local env = new_env ()
420421 after_each (env .cleanup )
421422
422423 it (" can rename a file" , function ()
423424 local before , after = env .new_path { touch = true }, env .new_path ()
425+ -- Can pass another Path object
424426 before :rename { new_name = after }
425427 assert .is .False (before :exists ())
426428 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 ())
427434 end )
428435
429436 it (" should throw on invalid args" , function ()
@@ -440,12 +447,19 @@ describe("Path", function()
440447 assert .is .True (before :exists ())
441448 end )
442449
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+
443457 it (" can move to parent dir" , function ()
444458 local before , after = env .new_path { filename = " random_file" }, env .new_path { filename = " ../random_file" }
445459 assert .is .False (before :exists ())
460+ assert .is .False (after :exists ())
446461 before :touch ()
447462 assert .is .True (before :exists ())
448- assert .is .False (after :exists ())
449463 before :rename { new_name = after }
450464 assert .is .False (before :exists ())
451465 assert .is .True (after :exists ())
@@ -457,6 +471,50 @@ describe("Path", function()
457471 before :rename { new_name = after }
458472 end )
459473 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 )
460518 end )
461519
462520 describe (" copy" , function ()
0 commit comments