The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use File::Spec;
use File::Basename;
use Test::More tests => 11;

{
    package App;
    use Moo;
    with 'Dancer2::Core::Role::HasLocation';
}

note 'Defaults:'; {
    my $app = App->new();
    isa_ok( $app, 'App' );
    can_ok( $app, qw<caller location> ); # attributes
    can_ok( $app, '_build_location'   ); # methods

    ok(
        $app->DOES('Dancer2::Core::Role::HasLocation'),
        'App consumes Dancer2::Core::Role::HasLocation',
    );

    my $path = File::Spec->catfile(qw<
        t classes Dancer2-Core-Role-HasLocation with.t
    >);

    is(
        File::Spec->canonpath( $app->caller ),
        $path,
        'Default caller',
    );

}

my $basedir = dirname( File::Spec->rel2abs(__FILE__) );

note 'With lib/ and bin/:'; {
    my $app = App->new(
        caller => File::Spec->catfile(
            $basedir, qw<FakeDancerDir fake inner dir fakescript.pl>
        )
    );

    isa_ok( $app, 'App' );

    my $location = $app->location;
    $location =~ s/\/$//;

    my $path = File::Spec->rel2abs(
        File::Spec->catdir(
            File::Spec->curdir,
            qw<t classes Dancer2-Core-Role-HasLocation FakeDancerDir>,
        )
    );

    is(
        $location,
        $path,
        'Got correct location with lib/ and bin/',
    );
}

note 'With .dancer file:'; {
    my $app = App->new(
        caller => File::Spec->catfile(
            $basedir, qw<FakeDancerFile script.pl>
        )
    );

    isa_ok( $app, 'App' );

    my $location = $app->location;

    my $path = File::Spec->rel2abs(
        File::Spec->catdir(
            File::Spec->curdir,
            qw<t classes Dancer2-Core-Role-HasLocation FakeDancerFile>,
        )
    );

    is( $location, $path, 'Got correct location with .dancer file' );
}

note 'blib/ ignored:'; {
    my $app = App->new(
        caller => File::Spec->catfile(
            $basedir, qw<FakeDancerDir blib lib fakescript.pl>
        )
    );

    isa_ok( $app, 'App' );

    my $location = $app->location;
    $location =~ s/\/$//;

    my $path = File::Spec->rel2abs(
        File::Spec->catdir(
            File::Spec->curdir,
            qw<t classes Dancer2-Core-Role-HasLocation FakeDancerDir>,
        )
    );

    is( $location, $path, 'blib/ dir is ignored' );
}