The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use Test::More tests => 31;

use Config::Strict qw(register_types);
use Declare::Constraints::Simple -All;

# Failure
eval { Config::Strict->register_types( 'Enum' => IsOneOf ) };
like( $@ => qr/already a registered type/i, 'already registered' );
eval { Config::Strict->register_types( 'Blah' => 'Foo' ) };
like( $@ => qr/not a coderef/i, 'bad profile' );

# Okay
Config::Strict->register_types(
    'Private'        => Matches( qr/^_/ ),
    'ArrayOfAllCaps' => IsArrayRef( Matches( qr/^[A-Z]+$/ ) ),
    'LessThan8Chars' => HasLength( 1, 8 ),
    'Size'           => IsOneOf( qw(small medium large) ),
    'PosNum'         => sub { $_[ 0 ] > 0 },
);
my $config = Config::Strict->new( {
        params => {
            Private        => 'myvar',
            ArrayOfAllCaps => 'caps',
            LessThan8Chars => [ qw( short1 short2 ) ],
            Size           => 'size',
            PosNum         => 'posn'
        }
    }
);

for ( qw( myvar caps short1 short2 size posn ) ) {
    ok( $config->param_exists( $_ ),  "$_ exists" );
    ok( !$config->param_is_set( $_ ), "$_ unset" );
}

# PosNum (bare sub)
eval { $config->set( 'posn' => 0 ); };
like( $@ => qr/PosNum constraint/, 'PosNum' );
ok( $config->set( 'posn' => 0.1 ), 'PosNum' );
is( $config->get( 'posn' ) => 0.1, 'PosNum' );
#print Dumper $config;

# Private
eval { $config->set( 'myvar' => 'bad' ); };
like( $@ => qr/regex does not match/i, 'private' );
ok( $config->set( 'myvar' => '_ok' ), 'Private' );
is( $config->get( 'myvar' ) => '_ok', 'Private' );

# Caps Array
eval { $config->set( 'caps' => [ 'NOT', 'GOOd' ] ); };
like( $@ => qr/regex does not match/i, 'caps' );
ok( $config->set( 'caps' => [ 'IZ', 'OK' ] ), 'caps' );
is_deeply( $config->get( 'caps' ) => [ 'IZ', 'OK' ], 'caps' );

# Short values
eval { $config->set( 'short1' => '' ) };
like( $@ => qr/value too short/i, 'short1' );
eval { $config->set( 'short1' => '123456789' ) };
like( $@ => qr/value too long/i, 'short1' );
ok( $config->set( 'short1' => '12345678' ), 'short1' );
ok( $config->set( 'short2' => '1' ),        'short2' );
is_deeply(
    [ $config->get( qw( short1 short2 ) ) ] => [ '12345678', '1' ],
    'shorts'
);

# Size
eval { $config->set( 'size' => 'Small' ) };
like( $@ => qr/no value matches/i, 'size' );
ok( $config->set( 'size' => 'small' ), 'size' );
is( $config->get( 'size' ) => 'small', 'size' );