The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MockApp;
use strict;
use warnings;

$|++;

use Test::More tests => 14;
use Scalar::Util qw(blessed reftype);

use Config::Any;
use Config::Any::INI;

our $cfg_file = 't/conf/conf.foo';

eval { Config::Any::INI->load( $cfg_file ); };

SKIP: {
    skip "File loading backend for INI not found", 14 if $@;

    my $struct;    # used to make sure parsing works for arrays and hashes

    # force_plugins
    {
        my $result = Config::Any->load_files(
            {   files         => [ $cfg_file ],
                force_plugins => [ qw(Config::Any::INI) ]
            }
        );

        ok( $result, 'load file with parser forced' );

        ok( my $first = $result->[ 0 ], 'load_files returns an arrayref' );
        ok( ref $first, 'load_files arrayref contains a ref' );

        my $ref = blessed $first ? reftype $first : ref $first;
        is( substr( $ref, 0, 4 ), 'HASH', 'hashref' );

        $struct = $first;

        my ( $name, $cfg ) = %$first;
        is( $name, $cfg_file, 'filenames match' );

        my $cfgref = blessed $cfg ? reftype $cfg : ref $cfg;
        is( substr( $cfgref, 0, 4 ), 'HASH', 'hashref cfg' );

        is( $cfg->{ name }, 'TestApp', 'appname parses' );
        is( $cfg->{ Component }{ "Controller::Foo" }->{ foo },
            'bar', 'component->cntrlr->foo = bar' );
        is( $cfg->{ Model }{ "Model::Baz" }->{ qux },
            'xyzzy', 'model->model::baz->qux = xyzzy' );
    }

    # flatten_to_hash
    {
        my $result = Config::Any->load_files(
            {   files           => [ $cfg_file ],
                force_plugins   => [ qw(Config::Any::INI) ],
                flatten_to_hash => 1
            }
        );

        ok( $result,     'load file with parser forced, flatten to hash' );
        ok( ref $result, 'load_files hashref contains a ref' );

        my $ref = blessed $result ? reftype $result : ref $result;
        is( substr( $ref, 0, 4 ), 'HASH', 'hashref' );

        is_deeply( $result, $struct,
            'load_files return an hashref (flatten_to_hash)' );
    }

    # use_ext
    {
        ok( my $result = Config::Any->load_files(
                {   files         => [ $cfg_file ],
                    force_plugins => [ qw(Config::Any::INI) ],
                    use_ext       => 1
                }
            ),
            "load file with parser forced"
        );
    }
}