| use strict; |
| use warnings; |
| |
| use CPAN::Meta::Requirements; |
| |
| use Test::More 0.88; |
| |
| sub dies_ok (&@) { |
| my ($code, $qr, $comment) = @_; |
| |
| my $lived = eval { $code->(); 1 }; |
| |
| if ($lived) { |
| fail("$comment: did not die"); |
| } else { |
| like($@, $qr, $comment); |
| } |
| } |
| |
| { |
| my $req = CPAN::Meta::Requirements->new; |
| |
| $req->add_minimum('Foo::Bar' => 10); |
| $req->add_minimum('Foo::Bar' => 0); |
| $req->add_minimum('Foo::Bar' => 2); |
| |
| $req->add_minimum('Foo::Baz' => version->declare('v1.2.3')); |
| |
| $req->add_minimum('Foo::Undef' => undef); |
| |
| my $want = { |
| 'Foo::Bar' => 10, |
| 'Foo::Baz' => 'v1.2.3', |
| 'Foo::Undef' => 0, |
| }; |
| |
| is_deeply( |
| $req->as_string_hash, |
| $want, |
| "some basic minimums", |
| ); |
| |
| $req->finalize; |
| |
| $req->add_minimum('Foo::Bar', 2); |
| |
| pass('we can add a Foo::Bar requirement with no effect post finalization'); |
| |
| dies_ok { $req->add_minimum('Foo::Bar', 12) } |
| qr{finalized req}, |
| "can't add a higher Foo::Bar after finalization"; |
| |
| dies_ok { $req->add_minimum('Foo::New', 0) } |
| qr{finalized req}, |
| "can't add a new module prereq after finalization"; |
| |
| dies_ok { $req->clear_requirement('Foo::Bar') } |
| qr{finalized req}, |
| "can't clear an existing prereq after finalization"; |
| |
| $req->clear_requirement('Bogus::Req'); |
| |
| pass('we can clear a prereq that was not set to begin with'); |
| |
| is_deeply( |
| $req->as_string_hash, |
| $want, |
| "none of our attempts to alter the object post-finalization worked", |
| ); |
| |
| my $cloned = $req->clone; |
| |
| $cloned->add_minimum('Foo::Bar', 12); |
| |
| is_deeply( |
| $cloned->as_string_hash, |
| { |
| %$want, |
| 'Foo::Bar' => 12, |
| }, |
| "we can alter a cloned V:R (finalization does not survive cloning)", |
| ); |
| |
| is_deeply( |
| $req->as_string_hash, |
| $want, |
| "...and original requirements are untouched", |
| ); |
| } |
| |
| done_testing; |