The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use lib '../lib';
use Data::Dumper;
use Test::More tests => 115;
use URI;
use URI::duri;

my @uris = (
	URI->new('duri:2000:http://example.com/'), ####################### 0
	URI->new('duri:2000-01:http://example.com/'),                    # 1
	URI->new('duri:2000-01-01:http://example.com/'), ################# 2
	URI->new('duri:2000-01-01T12:34:http://example.com/'),           # 3
	URI->new('duri:2000-01-01T12:34:56:http://example.com/'), ######## 4
	URI->new('duri:2000-01-01T12:34:56.789:http://example.com/'),    # 5
	URI->new('duri:2000-01-01Z:http://example.com/'), ################ 6
	URI->new('duri:2000-01-01T12:34Z:http://example.com/'),          # 7
	URI->new('duri:2000-01-01T12:34:56Z:http://example.com/'), ####### 8
	URI->new('duri:2000-01-01T12:34:56.789Z:http://example.com/'),   # 9
);

foreach (0 .. 9)
{	
	ok(
		$uris[$_]->datetime->has_year,
		"$uris[$_] has year",
	);
	is(
		$uris[$_]->datetime->year,
		'2000',
		"$uris[$_] has correct year",
	);
}

foreach (1 .. 9)
{	
	ok(
		$uris[$_]->datetime->has_month,
		"$uris[$_] has month",
	);
	is(
		$uris[$_]->datetime->month,
		'01',
		"$uris[$_] has correct month",
	);
}

foreach (2 .. 9)
{	
	ok(
		$uris[$_]->datetime->has_day,
		"$uris[$_] has day",
	);
	is(
		$uris[$_]->datetime->day,
		'01',
		"$uris[$_] has correct day",
	);
}


foreach (3, 4, 5, 7, 8, 9)
{	
	ok(
		$uris[$_]->datetime->has_hour &&
		$uris[$_]->datetime->has_minute,
		"$uris[$_] has hour and minute",
	);
	is(
		$uris[$_]->datetime->hour,
		'12',
		"$uris[$_] has correct hour",
	);
	is(
		$uris[$_]->datetime->minute,
		'34',
		"$uris[$_] has correct minute",
	);
}

foreach (4, 5, 8, 9)
{	
	ok(
		$uris[$_]->datetime->has_second,
		"$uris[$_] has second",
	);
	is(
		$uris[$_]->datetime->second,
		'56',
		"$uris[$_] has correct second",
	);
}

foreach (5, 9)
{	
	ok(
		$uris[$_]->datetime->has_nanosecond,
		"$uris[$_] has nanosecond",
	);
	ok(
		abs($uris[$_]->datetime->nanosecond - 789_000_000) < 5,
		"$uris[$_] has correct second",
	);
}

foreach (6 .. 9)
{	
	ok(
		$uris[$_]->datetime->has_time_zone,
		"$uris[$_] has time zone",
	);
	ok(
		$uris[$_]->datetime->time_zone->is_utc,
		"$uris[$_] has correct time zone",
	);
}

foreach (0 .. 9)
{
	my $emb = $uris[$_]->embedded_uri;
	isa_ok $emb => 'URI';
	is("$emb", "http://example.com/");
}

my $complex = URI->new('duri:2000-01-01T12:34:56.789+00:00:urn:example:foo');

is(
	$complex->datetime->year,
	'2000',
);
is(
	$complex->datetime->second,
	'56',
);
is(
	$complex->embedded_uri,
	'urn:example:foo',
);

done_testing();