#!/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;
}
