The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 36;

use HTML::FormFu;

my $form = HTML::FormFu->new(
    { tt_args => { INCLUDE_PATH => 'share/templates/tt/xhtml' } } );

$form->element('Checkbox')->name('bar')->value('y');

$form->auto_fieldset(1);

$form->default_model('HashRef');

$form->populate( {
        elements => [ {
                type         => "DateTime",
                name         => "datetime",
                auto_inflate => 1,
                year         => { list => [1999] }
            },
            {   name     => "inflator",
                deflator => { type => 'Strftime', strftime => '%F %H:%M' },
                inflator =>
                    { type => "DateTime", parser => { strptime => '%F' } }
            },
            {   type        => "Repeatable",
                nested_name => "many",
                elements    => [
                    { name => "id" },
                    {   type     => "Block",
                        name     => "nested",
                        elements => [ { type => "Text", name => "foo" } ] } ]
            },
            {   type    => "Select",
                name    => "single-select",
                options => [ [qw(1 foo)], [qw(2 bar)] ]
            },
            {   type    => "Select",
                name    => "multi-select",
                options => [ [qw(1 foo)], [qw(2 bar)] ]
            },
            {   type        => "Block",
                nested_name => "nested",
                elements    => [ { type => "Text", name => "foo" } ]
            },
            {   type     => "Multi",
                name     => "address",
                elements => [ { name => "street" }, { name => "number" } ]
            },
            {   type     => "Multi",
                name     => "address-split",
                elements => [ { name => "street" }, { name => "number" } ],
                deflators => [ { type => "CompoundSplit" } ]
            },
            {   type => "SimpleTable",
                rows => [ [ { name => "table1" } ] ] } ] } );

for ( 0 .. 1 ) {

    $form->auto_fieldset($_);
    $form->model->default_values( {
            datetime => '30-08-1999 22:00',
            bar      => 'y',
            many => [ { id => 1, foo => "bar" }, { id => 2, foo => "baz" } ],
            'single-select' => 1,
            'inflator'      => '2008-09-22',
            'multi-select'  => [ 1, 2 ],
            nested          => { foo => "bar" },
            address         => { street => "Lombardstreet", number => 22 },
            'address-split' => "Lombardstreet 22",
            table1          => "test"
        } );

    $form->process;

    like( $form->get_field('datetime_minute'),
        qr/<option value="00" selected="selected">00<\/option>/ );
    like( $form->get_field('datetime_hour'),
        qr/<option value="22" selected="selected">22<\/option>/ );
    like( $form->get_field('datetime_year'),
        qr/<option value="1999" selected="selected">1999<\/option>/ );

    like( $form->get_field('bar'), qr/value="y"/ );
    like( $form->get_field('bar'), qr/checked="checked"/ );

    like( $form->get_field('single-select'),
        qr/value="1" selected="selected"/ );
    like( $form->get_field('single-select'), qr/value="2">/ );

    like( $form->get_field('multi-select'), qr/value="1" selected="selected"/ );
    like( $form->get_field('multi-select'), qr/value="2" selected="selected"/ );

    like( $form->get_field('address'),
        qr/name="address.street" type="text" value="Lombardstreet"/ );
    like( $form->get_field('address'),
        qr/name="address.number" type="text" value="22"/ );

    like( $form->get_field('address-split'),
        qr/name="address-split.street" type="text" value="Lombardstreet"/ );
    like( $form->get_field('address-split'),
        qr/name="address-split.number" type="text" value="22"/ );

    like( $form->get_field('table1'),
        qr/name="table1" type="text" value="test"/ );

    like(
        $form->get_all_element( { nested_name => 'many' } ),
        qr/name="many_1.id" type="text" value="1"/
    );
    like(
        $form->get_all_element( { nested_name => 'many' } ),
        qr/name="many_2.id" type="text" value="2"/
    );
    like(
        $form->get_all_element( { nested_name => 'many' } ),
        qr/name="many_1.foo" type="text" value="bar"/
    );
    like(
        $form->get_all_element( { nested_name => 'many' } ),
        qr/name="many_2.foo" type="text" value="baz"/
    );

}