use 5.008001;
use strict;
use warnings;
use Test::More 0.96;
use Test::Fatal;
use File::Spec;
use Path::Tiny;
use Cwd;

my $file1 = path('foo.txt');
isa_ok( $file1, "Path::Tiny" );
is $file1, 'foo.txt';
ok $file1->is_relative;
is $file1->dirname, '.';
is $file1->basename, 'foo.txt';

my $file2 = path('dir', 'bar.txt');
is $file2, 'dir/bar.txt';
ok ! $file2->is_absolute;
is $file2->dirname, 'dir/';
is $file2->basename, 'bar.txt';

my $dir = path('tmp');
is $dir, 'tmp';
ok ! $dir->is_absolute;
is $dir->basename, 'tmp';

my $dir2 = path('/tmp');
is $dir2, '/tmp';
ok $dir2->is_absolute;

my $cat = path($dir, 'foo');
is $cat, 'tmp/foo';
$cat = $dir->child('foo');
is $cat, 'tmp/foo';
is $cat->dirname, 'tmp/';
is $cat->basename, 'foo';

$cat = path($dir2, 'foo');
is $cat, '/tmp/foo';
$cat = $dir2->child('foo');
is $cat, '/tmp/foo';
isa_ok $cat, 'Path::Tiny';
is $cat->dirname, '/tmp/';

$cat = $dir2->child('foo');
is $cat, '/tmp/foo';
isa_ok $cat, 'Path::Tiny';
is $cat->basename, 'foo';

my $file = path('/foo//baz/./foo');
is $file, '/foo/baz/foo';
is $file->dirname, '/foo/baz/';
is $file->parent, '/foo/baz';

{
    my $file = path("foo/bar/baz");
    is( $file->canonpath, File::Spec->canonpath("$file"), "canonpath" );
}

{
  my $dir = path('/foo/bar/baz');
  is $dir->parent, '/foo/bar';
  is $dir->parent->parent, '/foo';
  is $dir->parent->parent->parent, '/';
  is $dir->parent->parent->parent->parent, '/';

  $dir = path('foo/bar/baz');
  is $dir->parent, 'foo/bar';
  is $dir->parent->parent, 'foo';
  is $dir->parent->parent->parent, '.';
  is $dir->parent->parent->parent->parent, '..';
  is $dir->parent->parent->parent->parent->parent, '../..';
}

{
  my $dir = path("foo/");
  is $dir, 'foo';
  is $dir->parent, '.';
}

{
  # Special cases
  for my $bad ( [''], [undef], [], ['','var', 'tmp'] ) {
      like( exception { path(@$bad) }, qr/positive-length/, "exception");
  }
  is( Path::Tiny->cwd, path(Cwd::getcwd()));
  is( path('.')->absolute, path(Cwd::getcwd()));
}

{
  my $file = path('/tmp/foo/bar.txt');
  is $file->relative('/tmp'), 'foo/bar.txt';
  is $file->relative('/tmp/foo'), 'bar.txt';
  is $file->relative('/tmp/'), 'foo/bar.txt';
  is $file->relative('/tmp/foo/'), 'bar.txt';

  $file = path('one/two/three');
  is $file->relative('one'), 'two/three';
}

{
    my $file = Path::Tiny->new(File::Spec->rootdir);
    my $root = Path::Tiny->rootdir;
    is( $file, $root, "rootdir is like path('/')");
    is( $file->child("lib"), "/lib", "child of rootdir is correct");
}

# constructor
{
    is( path(qw/foo bar baz/), Path::Tiny->new(qw/foo bar baz/), "path() vs new" );
    is( path(qw/foo bar baz/), path("foo/bar/baz"), "path(a,b,c) vs path('a/b/c')" );
}

# tilde processing
{
    my ($homedir) = glob('~');
    my $dir = path('~');
    is ($dir, $homedir, 'Test my homedir');
    $dir = path('~/');
    is ($dir, $homedir, 'Test my homedir with trailing "/"');
    $dir = path('~/foo/bar');
    is ($dir, $homedir . '/foo/bar', 'Test my homedir with longer path');
    $dir = path('~/foo/bar/');
    is ($dir, $homedir . '/foo/bar', 'Test my homedir, longer path and trailing "/"');

    my ($root_homedir) = glob('~root');
    $dir = path('~root');
    is ($dir, $root_homedir, 'Test root homedir');
    $dir = path('~root');
    is ($dir, $root_homedir, 'Test root homedir with trailing /');
    $dir = path('~root/foo/bar');
    is ($dir, $root_homedir . '/foo/bar', 'Test root homedir with longer path');
    $dir = path('~root/foo/bar/');
    is ($dir, $root_homedir . '/foo/bar', 'Test root homedir, longer path and trailing "/"');

    my ($missing_homedir) = glob('~idontthinkso');
    $dir = path('~idontthinkso');
    is ($dir, '~idontthinkso', 'Test homedir of nonexistant user');
    is ($dir, $missing_homedir, 'Test homedir of nonexistant user (via glob)');
}

done_testing();
