The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./perl -w

use Test::More tests => 23;

use strict;

require overload;

use File::CheckTree;
use File::Spec;          # used to get absolute paths

# We assume that we start from the dist/File-CheckTree in the perl repository,
# or the dist root directory for the CPAN version.


#### TEST 1 -- No warnings ####
# usings both relative and full paths, indented comments

{
    my ($num_warnings, $path_to_libFileCheckTree);
    $path_to_libFileCheckTree = File::Spec->rel2abs(
        File::Spec->catfile('lib', 'File', 'CheckTree.pm'),
    );

    my @warnings;
    local $SIG{__WARN__} = sub { push @warnings, "@_" };

    eval {
        $num_warnings = validate qq{
            lib  -d
# comment, followed "blank" line (w/ whitespace):

            # indented comment, followed blank line (w/o whitespace):

            lib/File/CheckTree.pm -f
            '$path_to_libFileCheckTree' -e || warn
        };
    };

    diag($_) for @warnings;
    is( $@, '' );
    is( scalar @warnings, 0 );
    is( $num_warnings, 0 );
}


#### TEST 2 -- One warning ####

{
    my ($num_warnings, @warnings);

    local $SIG{__WARN__} = sub { push @warnings, "@_" };

    eval {
        $num_warnings = validate qq{
            lib    -f
            lib/File/CheckTree.pm -f
        };
    };

    is( $@, '' );
    is( scalar @warnings, 1 );
    like( $warnings[0], qr/lib is not a plain file/);
    is( $num_warnings, 1 );
}


#### TEST 3 -- Multiple warnings ####
# including first warning only from a bundle of tests,
# generic "|| warn", default "|| warn" and "|| warn '...' "

{
    my ($num_warnings, @warnings);

    local $SIG{__WARN__} = sub { push @warnings, "@_" };

    eval {
        $num_warnings = validate q{
            lib     -effd
            lib/File/CheckTree.pm -f || die
            lib/File/CheckTree.pm -d || warn
            lib    -f || warn "my warning: $file\n"
        };
    };

    is( $@, '' );
    is( scalar @warnings, 3 );
    like( $warnings[0], qr/lib is not a plain file/);
    like( $warnings[1], qr{lib/File/CheckTree.pm is not a directory});
    like( $warnings[2], qr/my warning: lib/);
    is( $num_warnings, 3 );
}


#### TEST 4 -- cd directive ####
# cd directive followed by relative paths, followed by full paths
{
    my ($num_warnings, @warnings, $path_to_lib, $path_to_dist);
    $path_to_lib  = File::Spec->rel2abs(File::Spec->catdir('lib'));
    $path_to_dist = File::Spec->rel2abs(File::Spec->curdir);

    local $SIG{__WARN__} = sub { push @warnings, "@_" };

    eval {
        $num_warnings = validate qq{
            lib                   -d || die
            '$path_to_lib'        cd
            File                  -e
            File                  -f
            '$path_to_dist'       cd
            lib/File/CheckTree.pm -ef
            lib/File/CheckTree.pm -d || warn
            '$path_to_lib'        -d || die
        };
    };

    is( $@, '' );
    is( scalar @warnings, 2 );
    like( $warnings[0], qr/File is not a plain file/);
    like( $warnings[1], qr/CheckTree\.pm is not a directory/);
    is( $num_warnings, 2 );
}


#### TEST 5 -- Exception ####
# test with generic "|| die"
{
    my $num_warnings;

    eval {
        $num_warnings = validate q{
            lib                    -ef || die
            lib/File/CheckTree.pm  -d
        };
    };

    like($@, qr/lib is not a plain file/);
}


#### TEST 6 -- Exception ####
# test with "|| die 'my error message'"
{
    my $num_warnings;

    eval {
        $num_warnings = validate q{
            lib                    -ef || die "yadda $file yadda...\n"
            lib/File/CheckTree.pm  -d
        };
    };

    like($@, qr/yadda lib yadda/);
    is( $num_warnings, undef );
}

#### TEST 7 -- Quoted file names ####
{
    my $num_warnings;
    eval {
        $num_warnings = validate q{
            "a file with whitespace" !-ef
            'a file with whitespace' !-ef
        };
    };

    is ( $@, '', 'No errors mean we compile correctly');
}

#### TEST 8 -- Malformed query ####
{
    my $num_warnings;
    eval {
        $num_warnings = validate q{
            a file with whitespace !-ef
        };
    };

    like( $@, qr/syntax error/,
          'We got a syntax error for a malformed file query' );
}