#!/usr/bin/perl
use warnings;
use strict;
use Test::More qw(no_plan);
use File::Fu;
{
my $d = File::Fu->dir("foo." . $$);
$d->e and $d->rmdir;
is($d->mkdir, $d);
ok($d->e, 'exists');
ok($d->d, 'is a directory');
$d->rmdir;
ok(! $d->e, 'not exists');
eval { $d->touch };
like($@, qr/^cannot/);
# make a file
my $f = $d + 'foo';
eval { $f->touch };
like($@, qr/^cannot.*No such/);
$d->mkdir;
$f->touch;
eval { $d->rmdir };
like($@, qr/^cannot.*not empty/);
$f->unlink;
$d->rmdir;
ok(! $d->e, 'not exists');
{ # check chdir_for(), cwd(), chdir()
$d->mkdir;
$f->touch;
my $cwd = File::Fu->cwd;
my @got = $d->chdir_for(sub {shift->list});
is(scalar(@got), 1);
is($got[0], 'foo', 'chdir_for');
is(File::Fu->cwd, $cwd);
$f->unlink;
$d->rmdir;
}
my $dl = $d->symlink('link.' . $$);
ok($dl->l, 'is a link');
is($dl->readlink, "$d");
ok(! $dl->e, 'not exists');
eval { $dl->mkdir };
like($@, qr/^cannot.*exists/, 'link not dir');
# lstat a broken link is ok, stat isn't
ok($dl->lstat);
eval { $dl->stat };
like($@, qr/^cannot.*No such/);
$d->mkdir;
ok($dl->e, 'exists');
ok($d->e, 'exists');
# cannot change the time of a link?
my $lt = $d->lstat->mtime;
$dl->utime($lt + 8);
my $dt = $lt + 8;
is($dl->lstat->mtime, $lt);
is($d->stat->mtime, $dt);
is($dl->stat->mtime, $dt, 'mtime');
# hmm, what else can I test without sleeping?
$dl->unlink;
$d->rmdir;
}
{
my $d = File::Fu->dir('tmp.' . $$);
$d->e and $d->rmdir;
$d->mkdir;
my @files = map({my $f = $d + $_; $f->touch; $f} qw(bar baz foo));
(my $subdir = $d / 'zonk')->mkdir;
push(@files, $subdir);
is_deeply([sort $d->list], [@files], 'list');
is((sort $d->list)[-1], $d/'zonk');
my $it = $d->lister;
my @got;
while(my $f = $it->()) { push(@got, $f); }
is_deeply([sort @got], [@files], 'lister');
$d->remove;
}
{
my $d = File::Fu->dir('tmp.' . $$);
$d->e and $d->rmdir;
$d->mkdir(0400);
is($d->stat->mode & 07777, 0400) or die;
$d->chmod(0700);
is($d->chdir, './');
chdir('..') or die "oh no!";
$d->remove;
}
# vim:ts=2:sw=2:et:sta