
use Data::FormValidator;
use Test::More tests => 8;
use strict;
use lib ('.','../t');

my $input_profile = {
	required => ['my_zipcode_field'],
	constraints => {
		my_zipcode_field => [
			'zip',
			{ 
				constraint =>  '/^406/', 
				name 	   =>  'starts_with_406',
			}
		],
	},
};

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

my $input_hashref = {
	my_zipcode_field => '402015', # born to lose
};

my ($valids, $missings, $invalids, $unknowns);

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

ok(!$@, 'survived eval');

ok((grep { (ref $_) eq 'ARRAY' } @$invalids));


# Test that the array ref in the invalids array contains three elements,
my @zip_failures;
for (@$invalids) {
	if (ref $_ eq 'ARRAY') {
		if (scalar @$_ == 3) {	 
			@zip_failures = @$_;	
            # This is cheesy, and could be further refactored.
            ok(1);
			last;
		}
	}
}

# Test that the first element of the array is 'my_zipcode_field'
my $t = shift @zip_failures;

ok($t eq 'my_zipcode_field');

# Test that the two elements are 'zip' and 'starts_with_406'
ok(eq_set(\@zip_failures, [qw/zip starts_with_406/]));



# The next three tests are to confirm that an input field is deleted
# from the valids under the following conditions

# 1. the input field has multiple constraints
# 2. one or more constraint fails

my %data = (
  multiple => 'to fail',
  #multiple => [qw{this multi-value input will fail on the constraint below}],
  single   => 'to pass',
);

my %profile = (
  required => [qw/
    multiple
    single 
    /],
  constraints => {
      multiple => [
        { name => 'constraint_1', constraint => qr/\w/ }, # pass
        { name => 'constraint_2', constraint => qr/\d/ }, # force fail 
      ],
  },
);


my $results = Data::FormValidator->check(\%data, \%profile);

ok(!$results->valid('multiple'), "expect 'multiple' not to appear in valid");
is_deeply($results->invalid('multiple'), ['constraint_2'], "list of failed constraints for 'multiple'");
is($results->valid('single'), 'to pass', "single is valid");
