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 'no_plan';
use File::Remove qw{ remove trash };





# Set up the tests
my @dirs = ("$0.tmp", map { "$0.tmp/$_" } qw(a a/b c c/d e e/f g));

for my $path ( reverse @dirs ) {
	if ( -e $path ) {
		ok( rmdir($path), "rmdir: $path" );
		ok( !-e $path,    "!-e: $path"   );
	}
}

for my $path ( @dirs ) {
	ok( ! -e $path,   "!-e: $path"   );
	ok( mkdir($path, 0777), "mkdir: $path" );
	chmod 0777, $path;
	ok( -e $path,     "-e: $path"    );
}

for my $path (reverse @dirs) {
	ok( -e $path,     "-e: $path"    );
	ok( rmdir($path), "rmdir: $path" );
	ok( !-e $path,    "!-e: $path"   );
}

for my $path ( @dirs ) {
	ok( ! -e $path,   "!-e: $path"   );
	ok( mkdir($path, 0777), "mkdir: $path" );
	chmod 0777, $path;
	ok( -e $path,     "-e: $path"    );
}

for my $path (reverse @dirs) {
	ok( -e $path,          "-e: $path"         );
	ok( remove(\1, $path), "remove \\1: $path" );
	ok( !-e $path,         "!-e: $path"        );
}

for my $path (@dirs) {
	ok( !-e $path,    "!-e: $path"   );
	ok( mkdir($path, 0777), "mkdir: $path" );
	chmod 0777, $path;
	ok( -e $path,     "-e: $path"    );
}

for my $path (reverse @dirs) {
	ok( -e $path,      "-e: $path"     );
	ok( remove($path), "remove: $path" );
	ok( !-e $path,     "!-e: $path"    );
}

for my $path (reverse @dirs) {
	ok( !-e $path, "-e: $path" );
	if (-e _) {
		ok( rmdir($path), "rmdir: $path" );
		ok( !-e $path,    "!-e: $path"   );
	}
}

SKIP: {
	if ($^O eq 'darwin') {
		eval 'use Mac::Glue ();';
		skip "Undelete support requires Mac::Glue", 0 if length $@;
		eval 'Mac::Glue->new("Finder")';
		skip "Undelete support requires Mac::Glue with Finder support", 0 if length $@;
	} elsif ($^O eq 'cygwin' || $^O =~ /^MSWin/) {
		eval 'use Win32::FileOp::Recycle;';
		skip "Undelete support requires Win32::FileOp::Recycle", 0 if length $@;
	} else {
		skip "Undelete support not available by default", 0;
	}

	for my $path (@dirs) {
		ok( !-e $path,    "!-e: $path"   );
		ok( mkdir($path, 0777), "mkdir: $path" );
		chmod 0777, $path;
		ok( -e $path,     "-e: $path"    );
	}

	for my $path (reverse @dirs) {
		ok( -e $path,              "-e: $path"    );
		ok( eval { trash($path) }, "trash: $path" );
		is( $@, '',                "trash: \$@"   );
		ok( !-e $path,             "!-e: $path"   );
	}

	for my $path (reverse @dirs) {
		ok( !-e $path, "-e: $path" );
		if (-e _) {
			ok( rmdir($path), "rmdir: $path" );
			ok( !-e $path,    "!-e: $path"   );
		}
	}

	for my $path (@dirs) {
		ok( !-e $path,    "!-e: $path"   );
		ok( mkdir($path, 0777), "mkdir: $path" );
		chmod 0777, $path;
		ok( -e $path,     "-e: $path"    );
	}

	for my $path (reverse @dirs) {
		ok( -e $path,      "-e: $path"     );
		ok( remove($path), "remove: $path" );
		ok( !-e $path,     "!-e: $path"    );
	}

	for my $path (reverse @dirs) {
		ok( !-e $path, "-e: $path" );
		if (-e _) {
			ok( rmdir($path), "rmdir: $path" );
			ok( !-e $path,    "!-e: $path"   );
		}
	}

	for my $path (@dirs) {
		ok( !-e $path,    "!-e: $path"   );
		ok( mkdir($path, 0777), "mkdir: $path" );
		chmod 0777, $path;
		ok( -e $path,     "-e: $path"    );
	}

	for my $path (reverse @dirs) {
		ok( -e $path, "-e: $path"        );
		ok(
			# Fake callbacks will not remove directories, so trash() would return empty list
			eval { trash({ 'rmdir' => sub { 1 }, 'unlink' => sub { 1 } }, $path); 1 },
			"trash: $path",
		);
		ok( -e $path, "-e: $path"        );
		ok( rmdir($path), "rmdir: $path" );
		ok( !-e $path, "!-e: $path"      );
	}

	UNDELETE: 1;
}