1use strict; 2use warnings; 3 4use CPAN::Meta::Requirements; 5 6use Test::More 0.88; 7 8sub dies_ok (&@) { 9 my ($code, $qr, $comment) = @_; 10 11 my $lived = eval { $code->(); 1 }; 12 13 if ($lived) { 14 fail("$comment: did not die"); 15 } else { 16 like($@, $qr, $comment); 17 } 18} 19 20{ 21 my $req = CPAN::Meta::Requirements->new; 22 23 $req->add_minimum('Foo::Bar' => 10); 24 $req->add_minimum('Foo::Bar' => 0); 25 $req->add_minimum('Foo::Bar' => 2); 26 27 $req->add_minimum('Foo::Baz' => version->declare('v1.2.3')); 28 29 $req->add_minimum('Foo::Undef' => undef); 30 31 is_deeply( 32 $req->as_string_hash, 33 { 34 'Foo::Bar' => 10, 35 'Foo::Baz' => 'v1.2.3', 36 'Foo::Undef' => 0, 37 }, 38 "some basic minimums", 39 ); 40 41 ok($req->is_simple, "just minimums? simple"); 42} 43 44{ 45 my $req = CPAN::Meta::Requirements->new; 46 $req->add_maximum(Foo => 1); 47 is_deeply($req->as_string_hash, { Foo => '<= 1' }, "max only"); 48 49 ok(! $req->is_simple, "maximums? not simple"); 50} 51 52{ 53 my $req = CPAN::Meta::Requirements->new; 54 $req->add_exclusion(Foo => 1); 55 $req->add_exclusion(Foo => 2); 56 57 # Why would you ever do this?? -- rjbs, 2010-02-20 58 is_deeply($req->as_string_hash, { Foo => '!= 1, != 2' }, "excl only"); 59} 60 61{ 62 my $req = CPAN::Meta::Requirements->new; 63 64 $req->add_minimum(Foo => 1); 65 $req->add_maximum(Foo => 2); 66 67 is_deeply( 68 $req->as_string_hash, 69 { 70 Foo => '>= 1, <= 2', 71 }, 72 "min and max", 73 ); 74 75 $req->add_maximum(Foo => 3); 76 77 is_deeply( 78 $req->as_string_hash, 79 { 80 Foo => '>= 1, <= 2', 81 }, 82 "exclusions already outside range do not matter", 83 ); 84 85 $req->add_exclusion(Foo => 1.5); 86 87 is_deeply( 88 $req->as_string_hash, 89 { 90 Foo => '>= 1, <= 2, != 1.5', 91 }, 92 "exclusions", 93 ); 94 95 $req->add_minimum(Foo => 1.6); 96 97 is_deeply( 98 $req->as_string_hash, 99 { 100 Foo => '>= 1.6, <= 2', 101 }, 102 "exclusions go away when made irrelevant", 103 ); 104} 105 106{ 107 my $req = CPAN::Meta::Requirements->new; 108 109 $req->add_minimum(Foo => 1); 110 $req->add_exclusion(Foo => 1); 111 $req->add_maximum(Foo => 2); 112 113 is_deeply( 114 $req->as_string_hash, 115 { 116 Foo => '> 1, <= 2', 117 }, 118 "we can exclude an endpoint", 119 ); 120} 121 122{ 123 my $req = CPAN::Meta::Requirements->new; 124 $req->add_minimum(Foo => 1); 125 126 $req->add_exclusion(Foo => 1); 127 128 dies_ok { $req->add_maximum(Foo => 1); } 129 qr/excluded all/, 130 "can't exclude all values" ; 131} 132 133{ 134 my $req = CPAN::Meta::Requirements->new; 135 $req->add_minimum(Foo => 1); 136 dies_ok {$req->exact_version(Foo => 0.5); } 137 qr/outside of range/, 138 "can't add outside-range exact spec to range"; 139} 140 141{ 142 my $req = CPAN::Meta::Requirements->new; 143 $req->add_minimum(Foo => 1); 144 dies_ok { $req->add_maximum(Foo => 0.5); } 145 qr/minimum exceeds maximum/, 146 "maximum must exceed (or equal) minimum"; 147 148 $req = CPAN::Meta::Requirements->new; 149 $req->add_maximum(Foo => 0.5); 150 dies_ok { $req->add_minimum(Foo => 1); } 151 qr/minimum exceeds maximum/, 152 "maximum must exceed (or equal) minimum"; 153} 154 155{ 156 my $req = CPAN::Meta::Requirements->new; 157 158 $req->add_minimum(Foo => 1); 159 $req->add_maximum(Foo => 1); 160 161 $req->add_maximum(Foo => 2); # ignored 162 $req->add_minimum(Foo => 0); # ignored 163 $req->add_exclusion(Foo => .5); # ignored 164 165 is_deeply( 166 $req->as_string_hash, 167 { 168 'Foo' => '== 1', 169 }, 170 "if min==max, becomes exact requirement", 171 ); 172} 173 174{ 175 my $req = CPAN::Meta::Requirements->new; 176 $req->add_minimum(Foo => 1); 177 $req->add_exclusion(Foo => 0); 178 $req->add_maximum(Foo => 3); 179 $req->add_exclusion(Foo => 4); 180 181 $req->add_exclusion(Foo => 2); 182 $req->add_exclusion(Foo => 2); 183 184 is_deeply( 185 $req->as_string_hash, 186 { 187 Foo => '>= 1, <= 3, != 2', 188 }, 189 'test exclusion-skipping', 190 ); 191} 192 193sub foo_1 { 194 my $req = CPAN::Meta::Requirements->new; 195 $req->exact_version(Foo => 1); 196 return $req; 197} 198 199{ 200 my $req = foo_1; 201 202 $req->exact_version(Foo => 1); # ignored 203 204 is_deeply($req->as_string_hash, { Foo => '== 1' }, "exact requirement"); 205 206 dies_ok { $req->exact_version(Foo => 2); } 207 qr/unequal/, 208 "can't exactly specify differing versions" ; 209 210 $req = foo_1; 211 $req->add_minimum(Foo => 0); # ignored 212 $req->add_maximum(Foo => 2); # ignored 213 214 dies_ok { $req->add_maximum(Foo => 0); } qr/maximum below/, "max < fixed"; 215 216 $req = foo_1; 217 dies_ok { $req->add_minimum(Foo => 2); } qr/minimum above/, "min > fixed"; 218 219 $req = foo_1; 220 $req->add_exclusion(Foo => 8); # ignored 221 dies_ok { $req->add_exclusion(Foo => 1); } qr/excluded exact/, "!= && =="; 222} 223 224{ 225 my $req = foo_1; 226 227 is($req->requirements_for_module('Foo'), '== 1', 'requirements_for_module'); 228 229 # test empty/undef returns 230 my @list = $req->requirements_for_module('FooBarBamBaz'); 231 my $scalar = $req->requirements_for_module('FooBarBamBaz'); 232 is ( scalar @list, 0, "requirements_for_module() returns empty for not found (list)" ); 233 is ( $scalar, undef, "requirements_for_module() returns undef for not found (scalar)" ); 234} 235 236done_testing; 237