The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
BEGIN {
	$|  = 1;
	$^W = 1;
}

use Test::More tests => 13;
use File::Spec::Functions ':ALL';
use File::Remove ();
use Cwd          ();

# Create the test directories
my $base = Cwd::abs_path(Cwd::cwd());
my $cwd  = rel2abs(catdir('t', 'cwd'));
my $foo  = rel2abs(catdir('t', 'cwd', 'foo'));
my $file = rel2abs(catdir('t', 'cwd', 'foo', 'bar.txt'));
File::Remove::clear($cwd);
mkdir($cwd,0777)  or die "mkdir($cwd): $!";
mkdir($foo,0777)  or die "mkdir($foo): $!";
open( FILE, ">$file" ) or die "open($file): $!";
print FILE "blah\n";
close( FILE ) or die "close($file): $!";
ok( -d $cwd,  "$cwd directory exists" );
ok( -d $foo,  "$foo directory exists" );
ok( -f $file, "$file file exists"     );

# Test that _moveto behaves as expected
SCOPE: {
	is(
		File::Remove::_moveto(
			File::Spec->catdir($base, 't'), # remove
			File::Spec->catdir($base), # cwd
		),
		'',
		'_moveto returns correct for normal case',
	);

	my $moveto1 = File::Remove::_moveto(
		File::Spec->catdir($base, 't'), # remove
		File::Spec->catdir($base, 't'), # cwd
	);
	$moveto1 =~ s/\\/\//g;
	is( $moveto1, $base, '_moveto returns correct for normal case' );

	my $moveto2 = File::Remove::_moveto(
		File::Spec->catdir($base, 't'),        # remove
		File::Spec->catdir($base, 't', 'cwd'), # cwd
	);
	$moveto2 =~ s/\\/\//g;
	is( $moveto2, $base, '_moveto returns correct for normal case' );

	# Regression: _moveto generates false positives
	# cwd:      /tmp/cpan2/PITA-Image/PITA-Image-0.50
	# remove:   /tmp/eBtQxTPGHC
	# moveto:   /tmp
	# expected: ''
	is(
		File::Remove::_moveto(
			File::Spec->catdir($base, 't'),           # remove
			File::Spec->catdir($base, 'lib', 'File'), # cwd
		),
		'',
		'_moveto returns null as expected',
	);
}

# Change the current working directory into the first
# test directory and store the absolute path.
chdir($cwd) or die "chdir($cwd): $!";
my $cwdabs = Cwd::abs_path(Cwd::cwd());
ok( $cwdabs =~ /\bcwd$/, "Expected abs path is $cwdabs" );

# Change into the directory that should be deleted
chdir('foo') or die "chdir($foo): $!";
my $fooabs = Cwd::abs_path(Cwd::cwd());
ok( $fooabs =~ /\bfoo$/, "Deleting from abs path is $fooabs" );

# Delete the foo directory
ok( File::Remove::remove(\1, $foo), "remove($foo) ok" );

# We should now be in the bottom directory again
is( Cwd::abs_path(Cwd::cwd()), $cwdabs, "We are now back in the original directory" );

# Move back to the base dir and confirm everything was deleted.
chdir($base) or die "chdir($base): $!";
ok( ! -e $foo,  "$foo does not exist"  );
ok( ! -e $file, "$file does not exist" );