#!/usr/bin/perl -w
use strict;

use Test::More tests => 21;
use Test::Exception;

use Data::Dumper;

use lib "../lib";

use_ok("Devel::PerlySense::Project");
use_ok("Devel::PerlySense::Project::Unknown");
use_ok("Devel::PerlySense");


BEGIN { -d "t" and chdir("t"); }



ok(
    my $oProjectUnknown = Devel::PerlySense::Project::Unknown->new(),
    "Created Unknown project ok",
);
isa_ok($oProjectUnknown, "Devel::PerlySense::Project");
isa_ok($oProjectUnknown, "Devel::PerlySense::Project::Unknown");


ok(
    my $oPerlySense = Devel::PerlySense->new(),
    "New PerlySense object ok",
);



is(
    Devel::PerlySense::Project->newFromLocation(
        oPerlySense => $oPerlySense,
        dir => "/",
    ),
    undef,
    "Found nothing, looking at the / dir",
);




note("Look for dirs that indicate a project");
{

    #This is to avoid identifying the .PerlySenseProject directory
    #_of_the_development_project_ to interfere with the test which
    #expects a free way all the way up to the root without any
    #projects.
    no warnings;
    local *Devel::PerlySense::Project::newFindExplicit = sub {
        undef;
    };

    my $dirBase = "data/project/with-dir";
    my $dirProject = "$dirBase/source";

    my $rexDirProject = $dirProject;
    $rexDirProject =~ s|\W|.|g;


    my $dirTest = "$dirProject/lib/Game";
    my $fileTest = "$dirTest/Lawn.pm";

    ok(
        my $oProjectDir = Devel::PerlySense::Project->newFromLocation(
            dir => $dirTest,
            oPerlySense => $oPerlySense,
        ),
        "Found Project using dir",
    );
    like($oProjectDir->dirProject, qr/$rexDirProject$/, "  Correct Project dir");
    like(
        $oProjectDir->dirProjectImplicitDir,
        qr/$rexDirProject$/,
        "  Correct Project dir property",
    );

    ok(
        my $oProjectFile = Devel::PerlySense::Project->newFromLocation(
            file => $fileTest,
            oPerlySense => $oPerlySense,
        ),
        "Found Project using file",
    );
    like($oProjectFile->dirProject, qr/$rexDirProject$/, "  Correct Project dir");
    is(
        $oProjectFile->dirProjectImplicitDir,
        "",
        "  Correct Project dir property",
    );
    like(
        $oProjectFile->dirProjectImplicitUse,
        qr/$rexDirProject$/,
        "  Correct Project dir property",
    );

}




note("Look for the modules itself that indicate a project");
{
    #See above.
    no warnings;
    local *Devel::PerlySense::Project::newFindExplicit = sub {
        undef;
    };

    my $dirBase = "data/project/with-use";
    my $dirProject = "$dirBase/source/lib";

    my $rexDirProject = $dirProject;
    $rexDirProject =~ s|\W|.|g;

    my $dirTest = "$dirProject/modules/Game";
    my $fileTest = "$dirTest/Lawn.pm";

    ok(
        my $oProjectFile = Devel::PerlySense::Project->newFromLocation(
            file => $fileTest,
            oPerlySense => $oPerlySense,
        ),
        "Found Project using file",
    );
    like($oProjectFile->dirProject, qr/$rexDirProject$/, "  Correct Project dir");
    like(
        $oProjectFile->dirProjectImplicitUse,
        qr/$rexDirProject$/,
        "  Correct Project dir property",
    );

}





note("Look for a .PerlySenseProject indicate a project");
{

    my $dirBase = "data/project/with-perlysenseproject";
    my $dirProject = "$dirBase/source";

    my $rexDirProject = $dirProject;
    $rexDirProject =~ s|\W|.|g;

    my $dirTest = "$dirProject/bogus/lib/Game";
    my $fileTest = "$dirTest/Lawn.pm";

    ok(
        my $oProjectFile = Devel::PerlySense::Project->newFromLocation(
            file => $fileTest,
            oPerlySense => $oPerlySense,
        ),
        "Found Project using .PerlySenseProject",
    );
    like($oProjectFile->dirProject, qr/$rexDirProject$/, "  Correct Project dir");
    like(
        $oProjectFile->dirProjectExplicitDir,
        qr/$rexDirProject$/,
        "  Correct Project dir property",
    );

}





__END__
