#!/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' )
    {
        ## no critic
        eval 'use Mac::Glue ();';
        skip "Undelete support requires Mac::Glue", 0 if length $@;
        eval 'Mac::Glue->new("Finder")';
        ## use critic
        skip "Undelete support requires Mac::Glue with Finder support", 0
            if length $@;
    }
    elsif ( $^O eq 'cygwin' || $^O =~ /^MSWin/ )
    {
        ## no critic
        eval 'use Win32::FileOp::Recycle;';
        ## use critic
        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;
}
