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

use Test::More tests => 37;
use DateTime;
use DateTime::Duration;
use HTML::Tested::Test::Request;
use Data::Dumper;
use Carp;

BEGIN { use_ok('HTML::Tested', 'HTV');
	use_ok('HTML::Tested::Value');
	use_ok('HTML::Tested::Test::Value');
	use_ok('HTML::Tested::Value::DropDown');
	use_ok('HTML::Tested::Test::DateTime');
	use_ok('HTML::Tested::Value::Marked');
	use_ok('HTML::Tested::Test');
}

$SIG{__DIE__} = sub { confess(@_); };
HTML::Tested::Seal->instance('boo boo boo');

package T;
use base 'HTML::Tested';

__PACKAGE__->ht_add_widget(::HTV, d => is_datetime => '%b %d, %Y');

package main;

my $dt = DateTime->new(year => 1964, month => 10, day => 16);
my $obj = T->new({ d => $dt });
my $stash = {};
$obj->ht_render($stash);
is_deeply($stash, { d => 'Oct 16, 1964' });

$obj->d(undef);
$obj->ht_render($stash);
is_deeply($stash, { d => '' });

$obj = T->ht_load_from_params(d => 'Oct 27, 1976');
$obj->ht_render($stash);
is_deeply($stash, { d => 'Oct 27, 1976' }) or exit 1;

package T2;
use base 'HTML::Tested';
__PACKAGE__->ht_add_widget(::HTV, e => is_datetime => {
		pattern => '%x', locale => 'ru_RU' });

package main;

$obj = T2->ht_load_from_params(e => '27.10.1976');
$stash = {};
$obj->ht_render($stash);
is_deeply($stash, { e => '27.10.1976' });

T2->ht_add_widget(::HTV, id => is_sealed => 1);
$obj->id(555555);

my $qs = $obj->ht_make_query_string("hello", "id", "e");
like($qs, qr/^hello\?id/);
unlike($qs, qr/555555/);
like($qs, qr/&e=27\.10\.1976/);

is($obj->ht_make_query_string("hello"), 'hello');

my $qs2 = $obj->ht_make_query_string("hello?a=b", "id", "e");
like($qs2, qr/a=b&id/);
unlike($qs2, qr/\?.*\?/);

my $r = HTML::Tested::Test::Request->new;
$r->parse_url($qs);
isnt($r->param('id'), undef);

$obj = T2->ht_load_from_params(map { $_, $r->param($_) } $r->param);
is($obj->id, 555555);
is($obj->e->year, '1976');

is($r->dir_config("Moo"), undef);
$r->dir_config("Moo", "boo");
is($r->dir_config("Moo"), "boo");
$r->dir_config("Moo", undef);
is($r->dir_config("Moo"), undef);

T2->ht_add_widget(::HTV, 'd');
T2->ht_set_widget_option(id => skip_undef => 1);
T2->ht_find_widget('d')->setup_datetime_option('%x');
is(T2->ht_find_widget('d')->options->{is_datetime}->pattern, '%x');

$obj = T2->new({ d => $dt });
$stash = {};
$obj->ht_render($stash);
is_deeply($stash, { d => 'Oct 16, 1964', e => '' });

my $opts = {};
T2->ht_find_widget('d')->setup_datetime_option('%c', $opts);
is(T2->ht_find_widget('d')->options->{is_datetime}->pattern, '%x');
is($opts->{is_datetime}->pattern, '%c');

package T3;
use base 'HTML::Tested';
__PACKAGE__->ht_add_widget(::HTV . "::DropDown", dd => 0 => { is_sealed => 1 }
		, 1 => { is_datetime => '%x' });

package main;

my $dt1 = DateTime->new(year => 1980, month => 2, day => 14);
my $dt2 = DateTime->new(year => 1985, month => 7, day => 18);
$obj = T3->new({ dd => [ [ 1, $dt1 ] , [ 2, $dt2, 1 ] ] });

$stash = {};
$obj->ht_render($stash);
like($stash->{dd}, qr/Feb 14/);
unlike($stash->{dd}, qr/"2"/);
is_deeply([ HTML::Tested::Test->check_stash(ref($obj), $stash,
		{ HT_SEALED_dd => [ [ 1, $dt1 ], [ 2, $dt2, 1 ] ] }) ], [])
	or diag(Dumper($stash));

$dt = HTML::Tested::Test::DateTime->now(10);
my $now = DateTime->now(time_zone => POSIX::strftime('%z', localtime));

package T4;
use base 'HTML::Tested';
__PACKAGE__->ht_add_widget(::HTV, d => 'is_datetime' => '%c');

package main;
$obj = T4->new({ d => $now });
$stash = {};
$obj->ht_render($stash);

# check range comparison
is_deeply([ HTML::Tested::Test->check_stash(ref($obj), $stash
		, { d => $now }) ], []);

my $dur = DateTime::Duration->new(seconds => 5);
$obj->d($obj->d + $dur);
$obj->ht_render($stash);
is_deeply([ HTML::Tested::Test->check_stash(ref($obj), $stash, { d => $dt }) ], []) or die;

package T5;
use base 'HTML::Tested';
__PACKAGE__->ht_add_widget(::HTV . "::Marked", d => 'is_datetime' => '%c');

package main;
$obj = T5->new({ d => ($now + $dur) });
$stash = {};
$obj->ht_render($stash);

is_deeply([ HTML::Tested::Test->check_stash(ref($obj), $stash
		, { d => HTML::Tested::Test::DateTime->now(10) }) ], []);

my @res = HTML::Tested::Test->check_stash(ref($obj), $stash
		, { d => HTML::Tested::Test::DateTime->now(3) });
is(@res, 1);

my $str = "<html>$stash->{d}</html>";
is_deeply([ HTML::Tested::Test->check_text(ref($obj), $str
		, { d => HTML::Tested::Test::DateTime->now(10) }) ], []);
my (undef, undef, $h) = localtime(time);
like(HTML::Tested::Test::DateTime->now->strftime('%H'), qr/$h/);


$dt = HTML::Tested::Test::DateTime->now(3);
sleep 1;
$now = DateTime->now(time_zone => POSIX::strftime('%z', localtime));
$obj = T5->new({ d => $now });
$stash = {};
$obj->ht_render($stash);
is_deeply([ HTML::Tested::Test->check_stash(ref($obj), $stash, { d => $dt }) ], []);