1#!/usr/bin/perl
2
3use strict;
4BEGIN {
5    $| = 1;
6    $^W = 1;
7}
8
9use Test::More 'no_plan';
10use File::Remove qw{ remove trash };
11
12
13
14
15
16# Set up the tests
17my @dirs = ("$0.tmp", map { "$0.tmp/$_" } qw(a a/b c c/d e e/f g));
18
19for my $path ( reverse @dirs ) {
20    if ( -e $path ) {
21        ok( rmdir($path), "rmdir: $path" );
22        ok( !-e $path,    "!-e: $path"   );
23    }
24}
25
26for my $path ( @dirs ) {
27    ok( ! -e $path,   "!-e: $path"   );
28    ok( mkdir($path, 0777), "mkdir: $path" );
29    chmod 0777, $path;
30    ok( -e $path,     "-e: $path"    );
31}
32
33for my $path (reverse @dirs) {
34    ok( -e $path,     "-e: $path"    );
35    ok( rmdir($path), "rmdir: $path" );
36    ok( !-e $path,    "!-e: $path"   );
37}
38
39for my $path ( @dirs ) {
40    ok( ! -e $path,   "!-e: $path"   );
41    ok( mkdir($path, 0777), "mkdir: $path" );
42    chmod 0777, $path;
43    ok( -e $path,     "-e: $path"    );
44}
45
46for my $path (reverse @dirs) {
47    ok( -e $path,          "-e: $path"         );
48    ok( remove(\1, $path), "remove \\1: $path" );
49    ok( !-e $path,         "!-e: $path"        );
50}
51
52for my $path (@dirs) {
53    ok( !-e $path,    "!-e: $path"   );
54    ok( mkdir($path, 0777), "mkdir: $path" );
55    chmod 0777, $path;
56    ok( -e $path,     "-e: $path"    );
57}
58
59for my $path (reverse @dirs) {
60    ok( -e $path,      "-e: $path"     );
61    ok( remove($path), "remove: $path" );
62    ok( !-e $path,     "!-e: $path"    );
63}
64
65for my $path (reverse @dirs) {
66    ok( !-e $path, "-e: $path" );
67    if (-e _) {
68        ok( rmdir($path), "rmdir: $path" );
69        ok( !-e $path,    "!-e: $path"   );
70    }
71}
72
73SKIP: {
74    if ($^O eq 'darwin') {
75        eval 'use Mac::Glue ();';
76        skip "Undelete support requires Mac::Glue", 0 if length $@;
77        eval 'Mac::Glue->new("Finder")';
78        skip "Undelete support requires Mac::Glue with Finder support", 0 if length $@;
79    } elsif ($^O eq 'cygwin' || $^O =~ /^MSWin/) {
80        eval 'use Win32::FileOp::Recycle;';
81        skip "Undelete support requires Win32::FileOp::Recycle", 0 if length $@;
82    } else {
83        skip "Undelete support not available by default", 0;
84    }
85
86    for my $path (@dirs) {
87        ok( !-e $path,    "!-e: $path"   );
88        ok( mkdir($path, 0777), "mkdir: $path" );
89        chmod 0777, $path;
90        ok( -e $path,     "-e: $path"    );
91    }
92
93    for my $path (reverse @dirs) {
94        ok( -e $path,              "-e: $path"    );
95        ok( eval { trash($path) }, "trash: $path" );
96        is( $@, '',                "trash: \$@"   );
97        ok( !-e $path,             "!-e: $path"   );
98    }
99
100    for my $path (reverse @dirs) {
101        ok( !-e $path, "-e: $path" );
102        if (-e _) {
103            ok( rmdir($path), "rmdir: $path" );
104            ok( !-e $path,    "!-e: $path"   );
105        }
106    }
107
108    for my $path (@dirs) {
109        ok( !-e $path,    "!-e: $path"   );
110        ok( mkdir($path, 0777), "mkdir: $path" );
111        chmod 0777, $path;
112        ok( -e $path,     "-e: $path"    );
113    }
114
115    for my $path (reverse @dirs) {
116        ok( -e $path,      "-e: $path"     );
117        ok( remove($path), "remove: $path" );
118        ok( !-e $path,     "!-e: $path"    );
119    }
120
121    for my $path (reverse @dirs) {
122        ok( !-e $path, "-e: $path" );
123        if (-e _) {
124            ok( rmdir($path), "rmdir: $path" );
125            ok( !-e $path,    "!-e: $path"   );
126        }
127    }
128
129    for my $path (@dirs) {
130        ok( !-e $path,    "!-e: $path"   );
131        ok( mkdir($path, 0777), "mkdir: $path" );
132        chmod 0777, $path;
133        ok( -e $path,     "-e: $path"    );
134    }
135
136    for my $path (reverse @dirs) {
137        ok( -e $path, "-e: $path"        );
138        ok(
139            # Fake callbacks will not remove directories, so trash() would return empty list
140            eval { trash({ 'rmdir' => sub { 1 }, 'unlink' => sub { 1 } }, $path); 1 },
141            "trash: $path",
142        );
143        ok( -e $path, "-e: $path"        );
144        ok( rmdir($path), "rmdir: $path" );
145        ok( !-e $path, "!-e: $path"      );
146    }
147
148    UNDELETE: 1;
149}
150