The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

# tests for select-one / select-multi
use warnings FATAL => 'all';
use strict;

=for Example:

=item select-one

	source:

	<select name="foo">
		<option>one</option>
		<option>two</option>
	</select>
	<select name="foo">
		<option>one</option>
		<option>two</option>
	</select>

	to fill with data = { foo => [qw(one two)] }
	should be:

	<select name="foo">
		<option selected="selected">one</option>
		<option>two</option>
	</select>
	<select name="foo">
		<option>one</option>
		<option selected="selected">two</option>
	</select>

=item select-multi

	source:

	<select name="foo" multiple="multiple">
		<option>one</option>
		<option>two</option>
	</select>
	<select name="foo">
		<option>one</option>
		<option>two</option>
	</select>

	to fill with data = { foo => [qw(one two)] }
	should be:

	<select name="foo" multiple="multiple">
		<option selected="selected">one</option>
		<option selected="selected">two</option>
	</select>
	<select name="foo">
		<option selected="selected">one</option>
		<option selected="selected">two</option>
	</select>

=cut

use Test::More tests => 29;

my $mod;

$mod = 'HTML::FillInForm::Lite';
#$mod = 'HTML::FillInForm';

require_ok($mod);

my $o = $mod->new();

use constant YES => 1;
use constant NO  => 0;

sub check{
	my($output, $x_ref) = @_;
	foreach my $option(grep{ /option/ } split /\n/, $output){
		my($val, $x) = @{ shift @{$x_ref} };

		my $ok = qr/(?: $val .* selected | selected .* $val )/xmsi;

		if($x){
			like $option, $ok, sprintf '%5s : %3s', $val, 'yes';
		}
		else{
			unlike $option, $ok, sprintf '%5s : %3s', $val, 'no';
		}
	}
}

#use Smart::Comments;


pass "For select-one without option value";

my $src = <<'EOT';
	<select name="foo">
		<option>one</option>
		<option>two</option>
		<option selected="selected">three</option>
	</select>
	<select name="foo">
		<option>one</option>
		<option>two</option>
		<option selected="selected">three</option>
	</select>
EOT

my $data = { foo => [qw(one two)] };

my @expected = (
	# value => expected
	[ one   => YES ],
	[ two   => NO  ],
	[ three => NO  ],

	[ one   => NO  ],
	[ two   => YES ],
	[ three => NO  ],
);
check($o->fill(\$src, $data), \@expected);

### $o

pass "For select-one with option value";

$src = <<'EOT';
	<select name="foo">
		<option value="one">one</option>
		<option value="two">two</option>
		<option value="three" selected="selected">three</option>
	</select>
	<select name="foo">
		<option value="one">one</option>
		<option value="two">two</option>
		<option value="three" selected="selected">three</option>
	</select>
EOT

$data = { foo => [qw(one two)] };

@expected = (
	# value => expected
	[ one   => YES ],
	[ two   => NO  ],
	[ three => NO  ],

	[ one   => NO  ],
	[ two   => YES ],
	[ three => NO  ],
);
check($o->fill(\$src, $data), \@expected);
### $o


pass "For select-multi without option value";

$src = <<'EOT';
	<select name="foo" multiple="multiple">
		<option>one</option>
		<option>two</option>
		<option selected="selected">three</option>
	</select>
	<select name="foo" multiple="multiple">
		<option>one</option>
		<option>two</option>
		<option selected="selected">three</option>
	</select>
EOT


@expected = (
	# value => expected
	[ one   => YES ],
	[ two   => YES ],
	[ three => NO  ],

	[ one   => YES ],
	[ two   => YES ],
	[ three => NO  ],
);

check($o->fill(\$src, $data), \@expected);
### $o

pass "For select-multi with option value";

$src = <<'EOT';
	<select name="foo" multiple="multiple">
		<option value="one">one</option>
		<option value="two">two</option>
		<option value="three" selected="selected">three</option>
	</select>
	<select name="foo" multiple="multiple">
		<option value="one">one</option>
		<option value="two">two</option>
		<option value="three" selected="selected">three</option>
	</select>
EOT


@expected = (
	# value => expected
	[ one   => YES ],
	[ two   => YES ],
	[ three => NO  ],

	[ one   => YES ],
	[ two   => YES ],
	[ three => NO  ],
);

check($o->fill(\$src, $data), \@expected);
### $o