191f110e0Safresh1use strict;
291f110e0Safresh1use warnings;
391f110e0Safresh1
491f110e0Safresh1use CPAN::Meta::Requirements;
5*3d61058aSafresh1use CPAN::Meta::Requirements::Range;
691f110e0Safresh1
791f110e0Safresh1use Test::More 0.88;
891f110e0Safresh1
991f110e0Safresh1sub dies_ok (&@) {
1091f110e0Safresh1  my ($code, $qr, $comment) = @_;
1191f110e0Safresh1
12b8851fccSafresh1  no warnings 'redefine';
13b8851fccSafresh1  local *Regexp::CARP_TRACE  = sub { "<regexp>" };
1491f110e0Safresh1  my $lived = eval { $code->(); 1 };
1591f110e0Safresh1
1691f110e0Safresh1  if ($lived) {
1791f110e0Safresh1    fail("$comment: did not die");
1891f110e0Safresh1  } else {
1991f110e0Safresh1    like($@, $qr, $comment);
2091f110e0Safresh1  }
2191f110e0Safresh1}
2291f110e0Safresh1
23*3d61058aSafresh1for my $string (10, '>= 2, <= 9, != 7') {
24*3d61058aSafresh1  my $range = CPAN::Meta::Requirements::Range->with_string_requirement($string);
25*3d61058aSafresh1  is ($range->as_string, $string, "'$string' roundtrips");
26*3d61058aSafresh1}
27*3d61058aSafresh1
2891f110e0Safresh1{
2991f110e0Safresh1  my $string_hash = {
3091f110e0Safresh1    Left   => 10,
3191f110e0Safresh1    Shared => '>= 2, <= 9, != 7',
3291f110e0Safresh1    Right  => 18,
3391f110e0Safresh1  };
3491f110e0Safresh1
3591f110e0Safresh1  my $req = CPAN::Meta::Requirements->from_string_hash($string_hash);
3691f110e0Safresh1
3791f110e0Safresh1  is_deeply(
3891f110e0Safresh1    $req->as_string_hash,
3991f110e0Safresh1    $string_hash,
4091f110e0Safresh1    "we can load from a string hash",
4191f110e0Safresh1  );
4291f110e0Safresh1}
4391f110e0Safresh1
44b8851fccSafresh1SKIP: {
45b8851fccSafresh1  skip "Can't tell v-strings from strings until 5.8.1", 1
46b8851fccSafresh1    unless $] gt '5.008';
4791f110e0Safresh1  my $string_hash = {
4891f110e0Safresh1    Left   => 10,
4991f110e0Safresh1    Shared => '= 2',
5091f110e0Safresh1    Right  => 18,
5191f110e0Safresh1  };
5291f110e0Safresh1
5391f110e0Safresh1  dies_ok { CPAN::Meta::Requirements->from_string_hash($string_hash) }
5491f110e0Safresh1    qr/Can't convert/,
5591f110e0Safresh1    "we die when we can't understand a version spec";
5691f110e0Safresh1}
5791f110e0Safresh1
5891f110e0Safresh1{
59*3d61058aSafresh1  my $warning;
60*3d61058aSafresh1  local $SIG{__WARN__} = sub { $warning = join("\n",@_) };
61*3d61058aSafresh1
62*3d61058aSafresh1  my $range = CPAN::Meta::Requirements::Range->with_string_requirement(undef);
63*3d61058aSafresh1  like ($warning, qr/Undefined requirement.*treated as '0'/, "undef requirement warns");
64*3d61058aSafresh1  $range->with_string_requirement('');
65*3d61058aSafresh1  like ($warning, qr/Undefined requirement.*treated as '0'/, "'' requirement warns");
66*3d61058aSafresh1
67*3d61058aSafresh1}
68*3d61058aSafresh1
69*3d61058aSafresh1{
70b8851fccSafresh1  my $undef_hash = { Undef => undef };
71b8851fccSafresh1  my $z_hash = { ZeroLength => '' };
72b8851fccSafresh1
73b8851fccSafresh1  my $warning;
74b8851fccSafresh1  local $SIG{__WARN__} = sub { $warning = join("\n",@_) };
75b8851fccSafresh1
76b8851fccSafresh1  my $req = CPAN::Meta::Requirements->from_string_hash($undef_hash);
77b8851fccSafresh1  like ($warning, qr/Undefined requirement.*treated as '0'/, "undef requirement warns");
78b8851fccSafresh1  $req->add_string_requirement(%$z_hash);
79b8851fccSafresh1  like ($warning, qr/Undefined requirement.*treated as '0'/, "'' requirement warns");
80b8851fccSafresh1
81b8851fccSafresh1  is_deeply(
82b8851fccSafresh1    $req->as_string_hash,
83b8851fccSafresh1    { map { ($_ => 0) } keys(%$undef_hash), keys(%$z_hash) },
84b8851fccSafresh1    "undef/'' requirements treated as '0'",
85b8851fccSafresh1  );
86b8851fccSafresh1}
87b8851fccSafresh1
88b8851fccSafresh1SKIP: {
89b8851fccSafresh1  skip "Can't tell v-strings from strings until 5.8.1", 2
90b8851fccSafresh1    unless $] gt '5.008';
9191f110e0Safresh1  my $string_hash = {
9291f110e0Safresh1    Left   => 10,
93b8851fccSafresh1    Shared => v50.44.60,
9491f110e0Safresh1    Right  => 18,
9591f110e0Safresh1  };
9691f110e0Safresh1
9791f110e0Safresh1  my $warning;
9891f110e0Safresh1  local $SIG{__WARN__} = sub { $warning = join("\n",@_) };
9991f110e0Safresh1
100b8851fccSafresh1  my $req = eval { CPAN::Meta::Requirements->from_string_hash($string_hash); };
101b8851fccSafresh1  is( $@, '', "vstring in string hash lives" );
10291f110e0Safresh1
103b8851fccSafresh1  ok(
104b8851fccSafresh1    $req->accepts_module(Shared => 'v50.44.60'),
105b8851fccSafresh1    "vstring treated as if string",
106b8851fccSafresh1  );
107b8851fccSafresh1}
108b8851fccSafresh1
109b8851fccSafresh1
110b8851fccSafresh1{
111b8851fccSafresh1  my $req = CPAN::Meta::Requirements->from_string_hash(
112b8851fccSafresh1    { Bad => 'invalid', },
113b8851fccSafresh1    { bad_version_hook => sub { version->new(42) } },
11491f110e0Safresh1  );
11591f110e0Safresh1
116b8851fccSafresh1  ok(
117b8851fccSafresh1    $req->accepts_module(Bad => 42),
118b8851fccSafresh1    "options work 2nd arg to f_s_h",
119b8851fccSafresh1  );
12091f110e0Safresh1}
12191f110e0Safresh1
12291f110e0Safresh1done_testing;
123