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;
use HTML::FormHandler::Test;

{
    package Test::Form::Theme;
    use Moose::Role;

    sub build_form_tags {{
        form_tag => 1,
    }}
    sub build_update_subfields {{
        all => { tags => { some_tag => 1, field_tag => 0 } },
        foo => { element_class => ['interesting'] }
    }}
}

{
    package Test::Form;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';
    with 'Test::Form::Theme';

    has_field 'foo' => ( element_class => ['fld_def'] );
    has_field 'bar' => ( tags => { field_tag => 1 } );
    has_field 'rox' => ( wrapper_class => 'frmwrp' );

}

my $form = Test::Form->new;
ok( $form );
my $element_class = $form->field('foo')->element_class;
is_deeply( $element_class, ['interesting', 'fld_def'], 'got both classes' );
is_deeply( $form->field('rox')->tags, { some_tag => 1, field_tag => 0 }, 'correct widget tags' );
is_deeply( $form->field('bar')->tags,
    { some_tag => 1, field_tag => 1 }, 'correct widget tags' );

{
    package Test::ClassForm;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has '+name' => ( default => 'hfhform' );
    sub build_update_subfields {{
        all => { wrapper_class => 'hfh' }
    }}
    has_field 'foo';
    has_field 'bar';
    has_field 'nox';

}

$form = Test::ClassForm->new;
$form->process;
is_deeply( $form->field('foo')->wrapper_class, ['hfh'], 'foo has class' );
is_deeply( $form->field('bar')->wrapper_class, ['hfh'], 'bar has class' );
is_deeply( $form->field('nox')->wrapper_class, ['hfh'], 'nox has class' );
my $rendered = $form->render;
my $expected =
'<form id="hfhform" method="post">
  <div class="form_messages"></div>
  <div class="hfh">
      <label for="foo">Foo</label>
      <input type="text" id="foo" name="foo" value="">
  </div>
  <div class="hfh">
      <label for="bar">Bar</label>
      <input type="text" id="bar" name="bar" value="">
  </div>
  <div class="hfh">
      <label for="nox">Nox</label>
      <input type="text" id="nox" name="nox" value="">
  </div>
</form>';
is_html( $rendered, $expected, 'rendered correctly' );

{
    package Test::ElementClassField;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler::Field::Text';

    sub build_element_class { ['foo'] }
}
{
    package Test::ElementClassForm;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has_field 'foo' => (
        type          => '+Test::ElementClassField',
        element_class => 'bar',
    );

    # Note: all => { element_class => 'baz' } does not
    # override the specific setting on the field. This is
    # deliberate. The idea is that the more specific setting
    # should override the general setting. Like all of these things,
    # sometimes people are going to want it one way and sometimes the
    # other. If you want to set the element_class for all elements
    # at once, don't put a specific element_class on the field.
    sub build_update_subfields {
    {
        foo => { element_class => 'baz' },
    }
};
}
$form = Test::ElementClassForm->new;
$form->process;
is_deeply( $form->field('foo')->element_class, [qw( baz )], 'foo has correct classes' );

done_testing;