# This script tests validating keys with multiple data
use strict;
use lib ('.','../t');

$^W = 1;

use Test::More tests => 8;

my $input_hash = { 
	single_value => ' Just One ',
	multi_values => [' One ', ' Big ', ' Happy ', ' Family '],
	re_multi_test => [qw/at the circus/],
	constraint_multi_test => [qw/12345 22234 oops/],
};


use Data::FormValidator;

my $input_profile = {
	required => [qw/single_value multi_values re_multi_test constraint_multi_test/],
	filters => [qw/trim/],
	field_filters => {
		single_value => 'lc',
		multi_values => 'uc',
	},
	field_filter_regexp_map => {
		'/_multi_test$/'      => 'ucfirst',
	},
	constraints => {
		constraint_multi_test => 'zip',
	},
};

my $validator = new Data::FormValidator({default => $input_profile});

my ($valids, $missings, $invalids, $unknowns);
eval{
  ($valids, $missings, $invalids, $unknowns) = $validator->validate($input_hash, 'default');
};

is($valids->{single_value},'just one',
 'inconditional filters still work with single values'
);

is(lc $valids->{multi_values}->[0],lc 'one',
 'inconditional filters work with multi values'
);

is($valids->{multi_values}->[0],'ONE',
 'field filters work with multiple values'
);

is($valids->{re_multi_test}->[0] ,'At',
 'Test the filters applied to multiple values by RE work'
);

ok(!$valids->{constraint_multi_test},
'If any of the values fail the constraint, the field becomes invalid'
);

my $r;
eval { $r = Data::FormValidator->check({ undef_multi => [undef] }, { required => 'undef_multi' }) };
diag "error: $@" if $@;
ok($r->missing('undef_multi'), 'multi-valued field containing only undef should be missing'); 

my $v;
eval { $v = $r->valid('undef_multi'); };
diag "error: $@" if $@;
ok(!$v, 'multiple valued fields containing only undefined values should not be valid');


###

eval { $r = Data::FormValidator->check({ 
            cc_type => ['Check'],
        },
        {
            required => 'cc_type',
            dependencies => {
                cc_type => {
                    Check   => [qw( cc_num )],
                    Visa => [qw( cc_num cc_exp cc_name )],
                },
            },
        }) };
diag "error: $@" if $@;

ok($r->missing('cc_num'), 'a single valued array should still trigger the dependency check');