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

use Test::More tests => 86;

use RPC::ExtDirect::Test::Util;

# A stub for testing global vars handling
package RPC::ExtDirect::API;

our $DEBUG;

package main;

use RPC::ExtDirect::Config;

my $cfg_class = 'RPC::ExtDirect::Config';
my $defs      = RPC::ExtDirect::Config::_get_definitions;

for my $def ( @$defs ) {
    my $accessor = $def->{accessor};
    my $package  = $def->{package};
    my $var      = $def->{var};
    my $type     = $def->{type};
    my $specific = $def->{setter};
    my $fallback = $def->{fallback};
    my $default  = $def->{default};
    my $have_def = exists $def->{default};
    
    # Simple accessor, test existence and default value
    if ($accessor) {
        my $config = $cfg_class->new();
        my $value = eval { $config->$accessor() };
        
        is $@, '', "$accessor: simple accessor exists";
        
        if ($have_def) {
            is $value, $default, "$accessor: simple accessor default value";
        }
    }
    
    # Defaultable accessor, check existence of specific getter
    if ( $specific ) {
        my $setters = 'ARRAY' eq ref($specific) ? $specific
                    :                             [ $specific ]
                    ;

        my $config = $cfg_class->new();
        
        for my $setter ( @$setters ) {
            eval { $config->$setter() };
            
            is $@, '', "$setter: defaultable specific accessor exists";
        }
    }
    
    if ($fallback) {
        my $config = $cfg_class->new();
        
        eval { $config->$fallback() };
        
        is $@, '', "$fallback: defaultable fallback accessor exists";
    }
}

# Adding accessors on the fly

my $config = $cfg_class->new();

$config->add_accessors(
    simple  => 'blerg',
    complex => [{
        accessor => 'frob',
        fallback => 'blerg',
    }],
);

ok $config->can('blerg'), "Added simple accessor";
ok $config->can('frob'),  "Added complex accessor";

$config->blerg('cluck');

is $config->frob(), 'cluck', "Complex accessor fallback value matches";

$config->frob('blurb');

is $config->frob(), 'blurb', "Complex accessor own value matches";

# Setting options in bulk

$config->set_options(
    blerg => 'blam',
    frob  => 'frab',
);

is $config->blerg(), 'blam', "Bulk setter value 1 matches";
is $config->frob(),  'frab', "Bulk setter value 2 matches";

# Cloning
$config = $cfg_class->new();
my $clone  = $config->clone();

ok      $config ne $clone,      "Clone is not self";
is_deep $clone, $config, "Clone values match";

$SIG{__WARN__} = sub {};

package main;

is $config->debug_api, !1, "Default global var value";

$RPC::ExtDirect::API::DEBUG = 'foo';

$config->read_global_vars();

is $config->debug_api, 'foo', "Changed global var value";