#!perl

# tests for Extented form object

use strict;
use warnings;
use Test::More tests => 18;

BEGIN{ use_ok('HTML::FillInForm::Lite') }

use Time::localtime;
use File::stat;

sub field2re{
	my($struct, $field) = @_;
	my $src = sprintf q{name="%s" \s+ value="%s"}, $field, $struct->$field();
	return qr/$src/xms;
}

# Name Value to regexp
sub nv2re{
	return qr/name="$_[0]" \s+ value="$_[1]"/xms;
}

my $tm = localtime();
my $st = stat(__FILE__);

my $o = HTML::FillInForm::Lite->new();

my $tmf = <<'EOT';
<input name="year"/>
<input name="mon"/>
<input name="mday"/>
<input name="hour"/>
<input name="min"/>
<input name="sec"/>
<input name="no_such_field" value="x"/>
EOT

my $stf = <<'EOT';
<input name="size"/>
<input name="atime"/>
<input name="mtime"/>
<input name="ctime"/>
<input name="no_such_field" value="x"/>
EOT

my $output = $o->fill(\$tmf, $tm);
foreach my $field qw(year mon mday hour min sec){
	like $output, field2re($tm, $field), "field: tm->$field";
}
like $output, nv2re("no_such_field", "x"), "no such field";

$output = $o->fill(\$stf, $st);

foreach my $field qw(size atime mtime ctime){
	like $output, field2re($st, $field), "field: st->$field";
}
like $output, nv2re("no_such_field", "x"), "no such field";
{
	package MyObject;
	sub new{ bless {} };
	sub return_undef{ undef  }
	sub return_empty{ return }
	sub return_list { return qw(foo bar) };
}

my $myobj = MyObject->new;

my $objf = <<'EOT';
<input name="return_undef" value="x"/>
<input name="return_empty" value="x"/>
<input name="return_list" id="0" value="x"/>
<input name="return_list" id="1" value="x"/>
<input name="return_list" id="2" value="x"/>
EOT

$output = $o->fill(\$objf, $myobj);

like $output, nv2re("return_undef", "x"), "accessor returning undef";
like $output, nv2re("return_empty", "x"), "accessor returning null list";

my @expected = qw(foo bar x);
for my $i (0 .. 2){
	like $output,  qr/name="return_list" \s+id="$i" \s+ value="$expected[$i]"/xms,
		"accessor returning list($i)";
}