#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 22;

BEGIN
{
    use File::Spec;
    use lib File::Spec->catdir( File::Spec->curdir(), "t", "lib" );
}

use File::Path;

use File::Find::Object::TreeCreate;

{
    my $t = File::Find::Object::TreeCreate->new();

    # TEST
    ok( $t, "TreeCreate object was initialized" );

    # TEST
    is( $t->get_path("./t/file.txt"),
        File::Spec->catfile( File::Spec->curdir(), "t", "file.txt" ) );

    # TEST
    is( $t->get_path("./t/mydir/"),
        File::Spec->catdir( File::Spec->curdir(), "t", "mydir" ) );

    # TEST
    is(
        $t->get_path("./t/hello/there/world.jpg"),
        File::Spec->catfile(
            File::Spec->curdir(), "t", "hello", "there", "world.jpg"
        )
    );

    # TEST
    is(
        $t->get_path("./one/two/three/four/"),
        File::Spec->catdir(
            File::Spec->curdir(), "one", "two", "three", "four"
        )
    );
}

{
    my $t = File::Find::Object::TreeCreate->new();

    # TEST
    ok( $t->exist("./MANIFEST"), "Checking the exist() method" );

    # TEST
    ok( !$t->exist("./BKLASDJASFDJODIJASDOJASODJ.wok"),
        "Checking the exist() method" );

    # TEST
    ok( $t->is_file("./MANIFEST"), "Checking the is_file method" );

    # TEST
    ok( !$t->is_file("./t"), "Checking the is_file method - 2" );

    # TEST
    ok( !$t->is_dir("./MANIFEST"), "Checking the is_dir method - false" );

    # TEST
    ok( $t->is_dir("./t"), "Checking the is_dir method - true" );

    # TEST
    is( $t->cat("./t/sample-data/h.txt"), "Hello.", "Checking the cat method" );

    {
        mkdir( $t->get_path("./t/sample-data/tree-create-ls-test") );
        mkdir( $t->get_path("./t/sample-data/tree-create-ls-test/a") );
        {
            open my $out_fh, ">",
                $t->get_path("./t/sample-data/tree-create-ls-test/b.txt");
            print {$out_fh} "Yowza";
            close($out_fh);
        }
        mkdir( $t->get_path("./t/sample-data/tree-create-ls-test/c") );
        {
            open my $out_fh, ">",
                $t->get_path("./t/sample-data/tree-create-ls-test/h.xls");
            print {$out_fh} "FooBardom!\n";
            close($out_fh);
        }

        # TEST
        is_deeply(
            $t->ls("./t/sample-data/tree-create-ls-test"),
            [ "a", "b.txt", "c", "h.xls" ],
            "Testing the ls method",
        );

        # Cleanup
        rmtree( $t->get_path("./t/sample-data/tree-create-ls-test") );
    }

    {
        my $tree = {
            'name' => "tree-create--tree-test-1/",
            'subs' => [
                {
                    'name'     => "b.doc",
                    'contents' => "This file was spotted in the wild.",
                },
                {
                    'name' => "a/",
                },
                {
                    'name' => "foo/",
                    'subs' => [
                        {
                            'name' => "yet/",
                        },
                    ],
                },
            ],
        };

        $t->create_tree( "./t/sample-data/", $tree );

        # TEST
        is_deeply(
            $t->ls("./t/sample-data/tree-create--tree-test-1"),
            [ "a", "b.doc", "foo" ],
            "Testing the contents of the root tree"
        );

        # TEST
        ok( $t->is_dir("./t/sample-data/tree-create--tree-test-1/a"),
            "a is a dir" );

        # TEST
        is_deeply( $t->ls("./t/sample-data/tree-create--tree-test-1/a"),
            [], "Testing the contents of a" );

        # TEST
        is_deeply( $t->ls("./t/sample-data/tree-create--tree-test-1/foo"),
            ["yet"], "Testing the contents of foo" );

        # TEST
        ok( $t->is_dir("./t/sample-data/tree-create--tree-test-1/foo/yet"),
            "Testing that foo/yet is a dir" );

        # TEST
        is_deeply( $t->ls("./t/sample-data/tree-create--tree-test-1/foo/yet"),
            [], "Testing that foo/yet is a dir" );

        # TEST
        ok( $t->is_file("./t/sample-data/tree-create--tree-test-1/b.doc"),
            "Checking that b.doc is a file" );

        # TEST
        is(
            $t->cat("./t/sample-data/tree-create--tree-test-1/b.doc"),
            "This file was spotted in the wild.",
            "Checking for contents of b.doc"
        );

        # Cleanup
        rmtree( $t->get_path("./t/sample-data/tree-create--tree-test-1") );
    }
    {
        # TEST
        is(
            $t->get_path("s/hello"),
            File::Spec->catfile( "s", "hello" ),
            "Bug that eliminated ^[AnyChar]/ instead of ^\\./"
        );
    }
}

