The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 24;
use CGI;

BEGIN { use_ok("FormValidator::Simple"); }

my $q = CGI->new;
$q->param(text1 => 'HOGEHOGE'           );
$q->param(text2 => 'HOGEHOGEHOGE'       );
$q->param(int   => 7                    );
$q->param(blank => ""                   );
$q->param(email => 'lyo.kato@gmail.com' );

my $results = FormValidator::Simple->check( $q, [
    text1 => [qw/NOT_BLANK/],
    text2 => [qw/NOT_BLANK/],
    int   => [qw/INT/],
    blank => [qw/NOT_BLANK/],
    email => [qw/EMAIL_LOOSE/],
] );

isa_ok( $results, "FormValidator::Simple::Results" );
ok($results->missing('blank'));
ok(!$results->valid('blank'));
ok(!$results->invalid('blank'));
ok($results->has_missing);
ok(!$results->has_invalid);
is($results->valid('text1'), 'HOGEHOGE'          );
is($results->valid('int'),   7                   );
is($results->valid('email'), 'lyo.kato@gmail.com');
ok(!$results->invalid('text1'));
ok(!$results->invalid('int'));
ok(!$results->invalid('email'));
ok(!$results->missing('text1'));
ok(!$results->missing('int'));
ok(!$results->missing('email'));

my @missings = $results->missing;
my @invalids = $results->invalid;
my $valids   = $results->valid;

is(scalar(@missings), 1);
is(scalar(@invalids), 0);
is(scalar(keys %$valids),   4);

my $valid = FormValidator::Simple->new;

$valid->check( $q => [
    text1 => [qw/NOT_BLANK ASCII/],
] );

$valid->check( $q => [
    text2 => [qw/NOT_BLANK NOT_ASCII/],
] );

my $results2 = $valid->results;

ok(!$results2->invalid('text1'));
ok($results2->invalid('text2'));

$valid->set_invalid( hoge => 'HOGE' );

my $results3 = $valid->results;

ok($results3->invalid('hoge'));
ok($results3->invalid( hoge => 'HOGE' ));

# make sure check doesn't eat the profile
my $profile = [
  text => [qw/NOT_BLANK INT/],
  int  => [qw/NOT_BLANK INT/],
];

my $r3 = FormValidator::Simple->check( $q => $profile );
is_deeply( $profile, [
  text => [qw/NOT_BLANK INT/],
  int  => [qw/NOT_BLANK INT/],
] );