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::Repeatable::Array;
    use HTML::FormHandler::Moose;
    extends 'HTML::FormHandler';

    has_field 'foo';
    has_field 'my_array' => ( type => 'Repeatable', num_when_empty => 2,
        do_wrapper => 1, do_label => 1 );
    has_field 'my_array.contains' => ( type => 'Text', do_wrapper => 0, do_label => 0 );
    has_field 'my_array2' => ( type => 'Repeatable', num_when_empty => 2,
        do_wrapper => 1, do_label => 1 );
    has_field 'my_array2.contains' => ( type => 'Text', widget_wrapper => 'None' );
    has_field 'my_rep' => ( type => 'Repeatable', 'num_when_empty' => 2 );
    #  we want a label but not a div wrapper
    has_field 'my_rep.foo' => ( do_wrapper => 0 );
    has_field 'bar';

}

my $form = Test::Repeatable::Array->new;

my $expected =
'<fieldset id="my_array"><legend>My array</legend>
  <input type="text" name="my_array.0" id="my_array.0" value="" />
  <input type="text" name="my_array.1" id="my_array.1" value="" />
</fieldset>';
my $rendered = $form->field('my_array')->render;
is_html($rendered, $expected, 'repeatable array field renders correctly');

$expected =
'<fieldset id="my_array2"><legend>My array2</legend>
  <input type="text" name="my_array2.0" id="my_array2.0" value="" />
  <input type="text" name="my_array2.1" id="my_array2.1" value="" />
</fieldset>';
$rendered = $form->field('my_array2')->render;
is_html($rendered, $expected, 'repeatable array field renders correctly');

$rendered = $form->field('my_rep')->render;
$expected =
'<div class="hfh-repinst" id="my_rep.0">
  <label for="my_rep.0.foo">Foo</label>
  <input type="text" name="my_rep.0.foo" id="my_rep.0.foo" value="" />
</div>
<div class="hfh-repinst" id="my_rep.1">
  <label for="my_rep.1.foo">Foo</label>
  <input type="text" name="my_rep.1.foo" id="my_rep.1.foo" value="" />
</div>';
is_html($rendered, $expected, 'simple repeatable renders correctly');

$form->process( params => {} );
my $rendered_form = $form->render;

$rendered = $form->field('my_array')->render;
$expected =
'<fieldset id="my_array"><legend>My array</legend>
  <input type="text" name="my_array.0" id="my_array.0" value="" />
  <input type="text" name="my_array.1" id="my_array.1" value="" />
</fieldset>';
is_html($rendered, $expected, 'repeatable array renders after process' );

$rendered = $form->field('my_rep')->render;
$expected =
'<div class="hfh-repinst" id="my_rep.0">
  <label for="my_rep.0.foo">Foo</label>
  <input type="text" name="my_rep.0.foo" id="my_rep.0.foo" value="" />
</div>
<div class="hfh-repinst" id="my_rep.1">
  <label for="my_rep.1.foo">Foo</label>
  <input type="text" name="my_rep.1.foo" id="my_rep.1.foo" value="" />
</div>';
is_html($rendered, $expected, 'simple repeatable renders correctly after process');

$form->process( params => { foo => 'xxx', bar => 'yyy',
   'my_array.0' => 'one', 'my_array.1' => 'two',
   'my_rep.0.foo' => 'fee', 'my_rep.1.foo' => 'fie' } );
$rendered = $form->render;
$rendered = $form->field('my_array')->render;
$expected =
'<fieldset id="my_array"><legend>My array</legend>
  <input type="text" name="my_array.0" id="my_array.0" value="one" />
  <input type="text" name="my_array.1" id="my_array.1" value="two" />
</fieldset>';
is_html($rendered, $expected, 'array renders ok after processing with params' );

$rendered = $form->field('my_rep')->render;
$expected =
'<div class="hfh-repinst" id="my_rep.0">
  <label for="my_rep.0.foo">Foo</label>
  <input type="text" name="my_rep.0.foo" id="my_rep.0.foo" value="fee" />
</div>
<div class="hfh-repinst" id="my_rep.1">
  <label for="my_rep.1.foo">Foo</label>
  <input type="text" name="my_rep.1.foo" id="my_rep.1.foo" value="fie" />
</div>';
is_html($rendered, $expected, 'repeatable renders ok after processing with params' );

done_testing;