The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use Test::More;
use Data::Validator;

my $v = Data::Validator->new(
    uri        => { xor => [qw(schema host path_query)] },

    schema     => { default => 'http' },
    host       => { default => '127.0.0.1' },
    path_query => { default => '/' },

    method     => { default => 'GET' },
);

note( $v->dump );

my $args;

note 'success cases';

$args = $v->validate({ uri => 'https://example.com/' });
is_deeply $args, {
    uri        => 'https://example.com/',
    method     => 'GET',
};

$args = $v->validate({
    schema     => 'https',
    host       => 'example.com',
    path_query => '/index.html',
});
is_deeply $args, {
    schema     => 'https',
    host       => 'example.com',
    path_query => '/index.html',
    method     => 'GET',
};

$args = $v->validate({
    host => 'example.com',
});
is_deeply $args, {
    schema     => 'http',
    host       => 'example.com',
    path_query => '/',
    method     => 'GET',
};

$args = $v->validate();
is_deeply $args, {
    schema     => 'http',
    host       => '127.0.0.1',
    path_query => '/',
    method     => 'GET',
};

note 'failure cases';

eval {
    $v->validate({ uri => 'foo', schema => 'http' });
};
like $@, qr/Exclusive parameters passed together: 'uri' v.s. 'schema'/;

eval {
    $v->validate(uri => 'foo', schema => 'http', host => 'example.com');
};
like $@, qr/Exclusive parameters passed together: 'uri' v.s. 'host'/;
like $@, qr/Exclusive parameters passed together: 'uri' v.s. 'schema'/;

note 'case without defaults';
$v = Data::Validator->new(
    uri        => { xor => [qw(schema host path_query)] },

    schema     => { default => 'http' },
    host       => { },
    path_query => { default => '/' },

    method     => { default => 'GET' },
);

$args = $v->validate(
    uri => 'http://example.com/',
);
is_deeply $args, {
    uri        => 'http://example.com/',
    method     => 'GET',
};

$args = $v->validate(
    host => 'example.com',
);
is_deeply $args, {
    schema     => 'http',
    host       => 'example.com',
    path_query => '/',
    method     => 'GET',
};

eval {
    $v->validate();
};
like $@, qr/Missing parameter: 'host' \(or 'uri'\)/;

done_testing;