The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use strict;
use warnings;
use Test::More;
use Path::Extended;
use File::Path;
use File::Temp qw/tempdir/;

my $tmpdir = tempdir();

subtest 'copy' => sub {
  for my $flag (0, 1) {
    my $file = file("$tmpdir/copy.txt");
    $file->save('content');
    my $size = $file->size;

    ok $file->exists, 'original file created';
    ok $size,         'and not zero sized';

    $file->openr if $flag;

    $file->copy_to("$tmpdir/copied.txt");

    my $original = file("$tmpdir/copy.txt");
    my $copied   = file("$tmpdir/copied.txt");

    ok $original->exists, 'original file still exists';
    ok $original->size == $size, 'and the same size';
    ok $copied->exists, 'copied file exists';
    ok $copied->size == $size, 'and the same size';

    ok $file->absolute eq $original->absolute, 'file is not moved';

    $file->close;

    ok $original->unlink;
    $copied->unlink;
  }
};

subtest 'move' => sub {
  for my $flag (0, 1) {
    my $file = file("$tmpdir/move.txt");
    $file->save('content');
    my $size = $file->size;

    ok $file->exists, 'original file created';
    ok $size,         'and not zero sized';

    $file->openr if $flag;

    $file->move_to("$tmpdir/moved.txt");

    my $original = file("$tmpdir/move.txt");
    my $moved    = file("$tmpdir/moved.txt");

    ok !$original->exists, 'original file does not exist';
    ok $moved->exists, 'moved file exists';
    ok $moved->size == $size, 'and the same size';

    ok $file->absolute eq $moved->absolute, 'file is moved';

    $file->close;

    $original->unlink;
    $moved->unlink;
  }
};

subtest 'rename' => sub {
  for my $flag (0, 1) {
    my $file = file("$tmpdir/rename.txt");
    $file->save('content');
    my $size = $file->size;

    ok $file->exists, 'original file created';
    ok $size,         'and not zero sized';

    $file->openr if $flag;

    $file->rename_to("$tmpdir/renamed.txt");

    my $original = file("$tmpdir/rename.txt");
    my $renamed  = file("$tmpdir/renamed.txt");

    ok !$original->exists, 'original file does not exist';
    ok $renamed->exists, 'renamed file exists';
    ok $renamed->size == $size, 'and the same size';

    ok $file->absolute eq $renamed->absolute, 'file is renamed';

    $file->close;

    $original->unlink;
    $renamed->unlink;
  }
};

subtest 'errors' => sub {
  my $file = file("$tmpdir/errors.txt");
     $file->logger(0);

  ok !$file->copy_to, 'requires destination';
  ok !$file->move_to, 'requires destination';
  ok !$file->rename_to, 'requires destination';
};

done_testing;

END {
  rmtree $tmpdir if $tmpdir && -d $tmpdir;
}