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