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

use 5.008;
use strict;
use warnings 'all';

##############################################################################
# TEST MODULES
use Test::Most;

##############################################################################
# MODULES
use URI;

##############################################################################
# TEST PLAN
plan tests => 30;

{
	# Make a new URI object
	my $uri = new_ok('URI', ['pack://http:,,www.mysite.com,my.package/a/b/foo.xml'], 'URI::pack');

	ok($uri->has_package_uri, '... and it has a package');
	is($uri->package_uri, 'http://www.mysite.com/my.package', '... and package URI is correct');
	ok($uri->has_part_name, '... and it has a part name');
	is($uri->part_name, '/a/b/foo.xml', '... and part name is correct');
	is_deeply([$uri->part_name_segments], [qw(a b foo.xml)], '... and part name has three segments');

	# Making changes to part_name
	lives_ok {$uri->part_name('/apples/inv.xml')} '... and setting new part name works';
	is($uri->part_name, '/apples/inv.xml', '... and new part name is there');
	is_deeply([$uri->part_name_segments], [qw(apples inv.xml)], '... and new part name is in segments');

	# Making changes to part_name_segments
	lives_ok {$uri->part_name_segments(qw(trees have apples.txt))} '... and setting new part name segments works';
	is($uri->part_name, '/trees/have/apples.txt', '... and new part name is there');
	is_deeply([$uri->part_name_segments], [qw(trees have apples.txt)], '... and new part name is in segments');
}

{
	# Make a new URI object without the package
	my $uri = new_ok('URI', ['/a/b/foo.xml', 'pack'], 'URI::pack');

	ok(!$uri->has_package_uri, '... and it does not have a package');
	ok($uri->has_part_name, '... and it has a part name');
	is($uri->part_name, '/a/b/foo.xml', '... and part name is correct');

	lives_ok {$uri->part_name('/a/%D1%86.xml')} '... and setting new part name to /a/%D1%86.xml works';
	is($uri->part_name, '/a/%D1%86.xml', '... and new part name is there');

	dies_ok {$uri->part_name('//xml/.')} '... and setting new part name to //xml/. fails';
	is($uri->part_name, '/a/%D1%86.xml', '... and part name is still the old');

	# Test failures
	throws_ok {$uri->part_name('')} qr{not be empty}, '... and new empty part fails';
	throws_ok {$uri->part_name('wow')} qr{start with a forward slash}, '... and new part not starting with a / fails';
	throws_ok {$uri->part_name('/wow/')} qr{forward slash as the last character}, '... and new part ending with a / fails';
	throws_ok {$uri->part_name('/\test')} qr{other than pchar characters}, '... and new part containing a non-pchar fails';
	throws_ok {$uri->part_name('/te%2fst.xml')} qr{not contain percent-encoded forward slash}, '... and new part containing a precent-encoded / fails';
	throws_ok {$uri->part_name('/te%5cst.xml')} qr{not contain percent-encoded .+? backward slash}, '... and new part containing a precent-encoded \ fails';
	throws_ok {$uri->part_name('/te%36st.xml')} qr{not contain percent-encoded unreserved characters}, '... and new part containing a precent-encoded unreserved character fails';
	throws_ok {$uri->part_name('/xml/test.')} qr{not end with a dot}, '... and new part ending in a dot fails';
	throws_ok {$uri->part_name('//xml/test.xml')} qr{empty segment}, '... and new part with empty segment fails';
	throws_ok {$uri->part_name('/./test')} qr{not end with a dot}, '... and new part with a segment of only a dot fails';
}

exit 0;