#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 20;

use lib 't/lib';

{

    package Faux::Plugin;

    sub new { bless {}, shift }
    my $count = 1;
    sub count { $count++ }
}

{

    package PluginTestApp;
    use Test::More;

    use Catalyst qw(
      Test::Plugin
      +TestApp::Plugin::FullyQualified
    );

    sub compile_time_plugins : Local {
        my ( $self, $c ) = @_;

        isa_ok $c, 'Catalyst::Plugin::Test::Plugin';
        isa_ok $c, 'TestApp::Plugin::FullyQualified';

        can_ok $c, 'registered_plugins';
        $c->_test_plugins;

        $c->res->body("ok");
    }

    sub run_time_plugins : Local {
        my ( $self, $c ) = @_;

        $c->_test_plugins;
        my $faux_plugin = 'Faux::Plugin';

        # Trick perl into thinking the plugin is already loaded
        $INC{'Faux/Plugin.pm'} = 1;

        __PACKAGE__->plugin( faux => $faux_plugin );

        isa_ok $c, 'Catalyst::Plugin::Test::Plugin';
        isa_ok $c, 'TestApp::Plugin::FullyQualified';
        ok !$c->isa($faux_plugin),
          '... and it should not inherit from the instant plugin';
        can_ok $c, 'faux';
        is $c->faux->count, 1, '... and it should behave correctly';
        is_deeply [ $c->registered_plugins ],
            [
                qw/Catalyst::Plugin::Test::Plugin
                   Faux::Plugin
                   TestApp::Plugin::FullyQualified/
            ],
            'registered_plugins() should report all plugins';
        ok $c->registered_plugins('Faux::Plugin'),
            '... and even the specific instant plugin';

        $c->res->body("ok");
    }

    sub _test_plugins {
        my $c = shift;
        is_deeply [ $c->registered_plugins ],
            [
                qw/Catalyst::Plugin::Test::Plugin
                   TestApp::Plugin::FullyQualified/
            ],
            '... and it should report the correct plugins';
        ok $c->registered_plugins('Catalyst::Plugin::Test::Plugin'),
            '... or if we have a particular plugin';
        ok $c->registered_plugins('Test::Plugin'),
            '... even if it is not fully qualified';
        ok !$c->registered_plugins('No::Such::Plugin'),
            '... and it should return false if the plugin does not exist';
    }

    __PACKAGE__->setup;
}

use Catalyst::Test qw/PluginTestApp/;

ok( get("/compile_time_plugins"), "get ok" );
ok( get("/run_time_plugins"),     "get ok" );
