|
Packit |
f40462 |
use strict;
|
|
Packit |
f40462 |
use warnings;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
use CPAN::Meta::Requirements;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
use Test::More 0.88;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
sub dies_ok (&@) {
|
|
Packit |
f40462 |
my ($code, $qr, $comment) = @_;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
no warnings 'redefine';
|
|
Packit |
f40462 |
local *Regexp::CARP_TRACE = sub { "<regexp>" };
|
|
Packit |
f40462 |
my $lived = eval { $code->(); 1 };
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
if ($lived) {
|
|
Packit |
f40462 |
fail("$comment: did not die");
|
|
Packit |
f40462 |
} else {
|
|
Packit |
f40462 |
like($@, $qr, $comment);
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum('Foo::Bar' => 10);
|
|
Packit |
f40462 |
$req->add_minimum('Foo::Bar' => 0);
|
|
Packit |
f40462 |
$req->add_minimum('Foo::Bar' => 2);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum('Foo::Baz' => version->declare('v1.2.3'));
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum('Foo::Undef' => undef);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
'Foo::Bar' => 10,
|
|
Packit |
f40462 |
'Foo::Baz' => 'v1.2.3',
|
|
Packit |
f40462 |
'Foo::Undef' => 0,
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"some basic minimums",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
ok($req->is_simple, "just minimums? simple");
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 1);
|
|
Packit |
f40462 |
is_deeply($req->as_string_hash, { Foo => '<= 1' }, "max only");
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
ok(! $req->is_simple, "maximums? not simple");
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 1);
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 2);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
# Why would you ever do this?? -- rjbs, 2010-02-20
|
|
Packit |
f40462 |
is_deeply($req->as_string_hash, { Foo => '!= 1, != 2' }, "excl only");
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 2);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '>= 1, <= 2',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"min and max",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 3);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '>= 1, <= 2',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"exclusions already outside range do not matter",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 1.5);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '>= 1, <= 2, != 1.5',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"exclusions",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1.6);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '>= 1.6, <= 2',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"exclusions go away when made irrelevant",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 1);
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 2);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '> 1, <= 2',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"we can exclude an endpoint",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 1);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
dies_ok { $req->add_maximum(Foo => 1); }
|
|
Packit |
f40462 |
qr/both 1, which is excluded/,
|
|
Packit |
f40462 |
"can't exclude all values" ;
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
dies_ok {$req->exact_version(Foo => 0.5); }
|
|
Packit |
f40462 |
qr/outside of range/,
|
|
Packit |
f40462 |
"can't add outside-range exact spec to range";
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
dies_ok { $req->add_maximum(Foo => 0.5); }
|
|
Packit |
f40462 |
qr/minimum 1 exceeds maximum/,
|
|
Packit |
f40462 |
"maximum must exceed (or equal) minimum";
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 0.5);
|
|
Packit |
f40462 |
dies_ok { $req->add_minimum(Foo => 1); }
|
|
Packit |
f40462 |
qr/minimum 1 exceeds maximum/,
|
|
Packit |
f40462 |
"maximum must exceed (or equal) minimum";
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 1);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 2); # ignored
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 0); # ignored
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => .5); # ignored
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
'Foo' => '== 1',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"if min==max, becomes exact requirement",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 1);
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 0);
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 3);
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 4);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 2);
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 2);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '>= 1, <= 3, != 2',
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
'test exclusion-skipping',
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->structured_requirements_for_module('Foo'),
|
|
Packit |
f40462 |
# remember, it's okay to change the exact results, as long as the meaning
|
|
Packit |
f40462 |
# is unchanged -- rjbs, 2012-07-11
|
|
Packit |
f40462 |
[
|
|
Packit |
f40462 |
[ '>=', '1' ],
|
|
Packit |
f40462 |
[ '<=', '3' ],
|
|
Packit |
f40462 |
[ '!=', '2' ],
|
|
Packit |
f40462 |
],
|
|
Packit |
f40462 |
"structured requirements for Foo",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
sub foo_1 {
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req->exact_version(Foo => 1);
|
|
Packit |
f40462 |
return $req;
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = foo_1;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->exact_version(Foo => 1); # ignored
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply($req->as_string_hash, { Foo => '== 1' }, "exact requirement");
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
dies_ok { $req->exact_version(Foo => 2); }
|
|
Packit |
f40462 |
qr/can't be exactly 2.+already/,
|
|
Packit |
f40462 |
"can't exactly specify differing versions" ;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req = foo_1;
|
|
Packit |
f40462 |
$req->add_minimum(Foo => 0); # ignored
|
|
Packit |
f40462 |
$req->add_maximum(Foo => 2); # ignored
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
dies_ok { $req->add_maximum(Foo => 0); } qr/maximum 0 below exact/, "max < fixed";
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req = foo_1;
|
|
Packit |
f40462 |
dies_ok { $req->add_minimum(Foo => 2); } qr/minimum 2 exceeds exact/, "min > fixed";
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req = foo_1;
|
|
Packit |
f40462 |
$req->add_exclusion(Foo => 8); # ignored
|
|
Packit |
f40462 |
dies_ok { $req->add_exclusion(Foo => 1); } qr/tried to exclude/, "!= && ==";
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = foo_1;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is($req->requirements_for_module('Foo'), '== 1', 'requirements_for_module');
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req->structured_requirements_for_module('Foo'),
|
|
Packit |
f40462 |
[ [ '==', '1' ] ],
|
|
Packit |
f40462 |
'structured_requirements_for_module'
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
# test empty/undef returns
|
|
Packit |
f40462 |
my @list = $req->requirements_for_module('FooBarBamBaz');
|
|
Packit |
f40462 |
my $scalar = $req->requirements_for_module('FooBarBamBaz');
|
|
Packit |
f40462 |
is ( scalar @list, 0, "requirements_for_module() returns empty for not found (list)" );
|
|
Packit |
f40462 |
is ( $scalar, undef, "requirements_for_module() returns undef for not found (scalar)" );
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
my $req = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
$req->add_minimum(Foo => "0.00");
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
my $req2 = CPAN::Meta::Requirements->new;
|
|
Packit |
f40462 |
$req2->add_requirements($req);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
is_deeply(
|
|
Packit |
f40462 |
$req2->as_string_hash,
|
|
Packit |
f40462 |
{
|
|
Packit |
f40462 |
Foo => '0.00'
|
|
Packit |
f40462 |
},
|
|
Packit |
f40462 |
"0.00 precision preserved",
|
|
Packit |
f40462 |
);
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
}
|
|
Packit |
f40462 |
|
|
Packit |
f40462 |
done_testing;
|