# vim: cindent ft=perl sm sw=4

use warnings;
use strict;

use Test::More tests => 8;

BEGIN { use_ok('Config::Scoped') }
my ( $p, $cfg );

my $text = <<'eot';
{ #1
    { #2
	{ #3
	     a=3
	}
	a=2
    }
    a=1
}
foo{}
eot

my $expected = { foo => {} };


isa_ok( $p = Config::Scoped->new(), 'Config::Scoped' );
is_deeply( $p->parse( text => $text ), $expected, 'lexically scoped' );

$text = <<'eot';
{ #1
    { #2
	{ #3
	    a=3
	    foo{}
	}
	a=2
	bar{}
    }
    a=1
    baz{}
}
eot

$expected = {
    'foo' => { 'a' => '3' },
    'bar' => { 'a' => '2' },
    'baz' => { 'a' => '1' },
};

$p = Config::Scoped->new;
is_deeply( $p->parse( text => $text ), $expected, 'lexically scoped' );

$text = <<'eot';
a = default;
foo { %warnings param off; a = 1 }
bar { }
eot

$expected = {
    'foo' => { 'a' => '1' },
    'bar' => { 'a' => 'default' },
};

$p = Config::Scoped->new;
is_deeply( $p->parse( text => $text ), $expected, 'parameter redefinition' );

$text = <<'eot';
a = default;
foo { a = 1 }
bar { }
eot

$p = Config::Scoped->new;
eval { $p->parse( text => $text ) };
isa_ok($@, 'Config::Scoped::Error::Validate::Parameter');
like($@, qr/redefinition/i, "$@");

$text = <<'eot';
LowerCase = 'Values dont convert'
eot

$expected = { _GLOBAL => { 'lowercase' => 'Values dont convert', }, };

$p = Config::Scoped->new(lc => 1);
is_deeply( $p->parse( text => $text ), $expected, 'lowercase conversion' );