Blame t/basic.t

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;