The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use Storable qw(dclone);

use_ok('Form::Diva');

# need to test field level class over-ride in here.

my $diva1 = Form::Diva->new(
    form_name   => 'DIVA1',
    label_class => 'testclass',
    input_class => 'form-control',
    form        => [
        { n => 'name', t => 'text', p => 'Your Name', l => 'Full Name' },
        {   name  => 'phone',
            type  => 'tel',
            extra => 'required',
            id    => 'not name',
        },
        {qw / n email t email l Email c form-email placeholder doormat/},
        {   name    => 'our_id',
            type    => 'number',
            extra   => 'disabled',
            default => 57,
            class   => 'other-class shaded-green',
        },
        {   n           => 'longtext',
            type        => 'TextArea',
            placeholder => 'Type some stuff here',
        },
    ],
    hidden =>
        [ { n => 'secret' }, 
        { n => 'hush', default => 'very secret' }, ],
);

my @fields  = @{ $diva1->{FormMap} };
my @hiddens = @{ $diva1->{HiddenMap} };
my $data1   = {
    name  => 'Baloney',
    phone => '232-432-2744',
};
my $data2 = {
    name     => 'Salami',
    email    => 'salami@yapc.org',
    our_id   => 91,
    longtext => 'I typed things in here!',
    hush     => 'Let me Tell You',
};

my %name_no_data  = $diva1->_field_bits( $fields[0] );
my %name_data1    = $diva1->_field_bits( $fields[0], $data1 );
my %name_data2    = $diva1->_field_bits( $fields[0], $data2 );
my %phone_no_data = $diva1->_field_bits( $fields[1] );
my %phone_data1   = $diva1->_field_bits( $fields[1], $data1 );
my %phone_data2   = $diva1->_field_bits( $fields[1], $data2 );
my %email_no_data = $diva1->_field_bits( $fields[2] );
my %email_data1   = $diva1->_field_bits( $fields[2], $data1 );
my %email_data2   = $diva1->_field_bits( $fields[2], $data2 );
my %ourid_no_data = $diva1->_field_bits( $fields[3] );
my %ourid_data1   = $diva1->_field_bits( $fields[3], $data1 );
my %ourid_data2   = $diva1->_field_bits( $fields[3], $data2 );
my %TextArea      = $diva1->_field_bits( $fields[4] );
my %TextAreaData2 = $diva1->_field_bits( $fields[4], $data2 );

my %secret      = $diva1->_field_bits( $hiddens[0] );
my %secretData2 = $diva1->_field_bits( $hiddens[0], $data2 );
my %hush        = $diva1->_field_bits( $hiddens[1] );
my %hushData2   = $diva1->_field_bits( $hiddens[1], $data2 );

sub tester {
    my $test_results = shift;
    my $test_name    = shift;
    my $test0        = shift;
    my $test1        = shift;
    my $note1        = $test1 || qq!ZERO or NULL VALUE!;
    is( $test_results->{$test0}, $test1, "$test_name : $test0 : $note1" );
}

foreach my $nametest (
    [ 'input_class', 'class="form-control"' ],
    [ 'placeholder', 'placeholder="Your Name"' ],
    [ 'rawvalue',    '' ],
    [ 'value',       'value=""' ],
    [ 'textarea',    0 ],
    [ 'id',          'id="formdiva_name"' ],
    )
{
    tester( \%name_no_data, 'Name No Data', $nametest->[0], $nametest->[1] );
}

foreach my $test (
    [ 'input_class', 'class="form-control"' ],
    [ 'placeholder', '' ],
    [ 'rawvalue',    'Baloney' ],
    [ 'value',       'value="Baloney"' ],
    )
{
    tester( \%name_data1, 'name_data1', $test->[0], $test->[1] );
}
foreach my $test (
    [ 'placeholder', '' ],
    [ 'rawvalue',    'Salami' ],
    [ 'value',       'value="Salami"' ],
    )
{
    tester( \%name_data2, 'name_data2', $test->[0], $test->[1] );
}

foreach my $phonetest (
    [ 'type',  'type="tel"' ],
    [ 'extra', 'required' ],
    [ 'name',  'name="phone"' ],
    [ 'id',    'id="not name"' ],
    )
{
    tester( \%phone_no_data, 'Phone No Data',
        $phonetest->[0], $phonetest->[1] );
}

tester( \%phone_data1, 'phone_data1', 'rawvalue', '232-432-2744' );
tester( \%phone_data2, 'phone_data2', 'rawvalue', '' );
tester( \%phone_data1, 'phone_data1', 'value',    'value="232-432-2744"' );
tester( \%phone_data2, 'phone_data2', 'value',    'value=""' );
tester( \%phone_data2, 'phone_data2', 'id',       'id="not name"' );

foreach my $emailtest (
    [ 'type',        'type="email"' ],
    [ 'placeholder', 'placeholder="doormat"' ],
    [ 'value',       'value=""' ],
    )
{
    tester( \%email_no_data, 'Email No Data',
        $emailtest->[0], $emailtest->[1] );
}

foreach my $emailtest2 (
    [ 'type',        'type="email"' ],
    [ 'placeholder', '' ],
    [ 'id',          'id="formdiva_email"' ],
    [ 'name',        'name="email"' ],
    [ 'rawvalue',    'salami@yapc.org' ],
    [ 'value',       'value="salami@yapc.org"' ],
    )
{
    tester( \%email_data2, 'email_data2',
        $emailtest2->[0], $emailtest2->[1] );
}

foreach my $ouridtest (
    [ 'type',        'type="number"' ],
    [ 'extra',       'disabled' ],
    [ 'name',        'name="our_id"' ],
    [ 'rawvalue',    57 ],
    [ 'value',       'value="57"' ],
    [ 'input_class', 'class="other-class shaded-green"' ],
    )
{
    tester( \%ourid_no_data, 'OurId No Data',
        $ouridtest->[0], $ouridtest->[1] );
}

foreach my $hidtest ( [ 'name', 'name="secret"' ], [ 'value', 'value=""' ], )
{
    tester( \%secret, 'Hidden - Secret', $hidtest->[0], $hidtest->[1] );
}

foreach my $hidtest ( [ 'name', 'name="hush"' ],
    [ 'value', 'value="very secret"' ], )
{
    tester( \%hush, 'Hidden - Hush Default', $hidtest->[0], $hidtest->[1] );
}

foreach my $hidtest ( [ 'name', 'name="hush"' ],
    [ 'value', 'value="Let me Tell You"' ], )
{
    tester( \%hushData2, 'Hidden - Hush with data',
        $hidtest->[0], $hidtest->[1] );
}

tester( \%ourid_data2, 'ourid_data2', 'rawvalue', 91 );
tester( \%ourid_data2, 'ourid_data2', 'value',    'value="91"' );
tester( \%TextArea,    'textarea',    'textarea', 1 );
tester( \%TextArea, 'textarea', 'placeholder',
    'placeholder="Type some stuff here"' );
tester(
    \%TextAreaData2, 'textarea data2',
    'rawvalue',      'I typed things in here!'
);

done_testing;