1use strict; 2use warnings; 3use Test::More 0.88; 4 5use CPAN::Meta::Prereqs; 6 7delete $ENV{PERL_YAML_BACKEND}; 8delete $ENV{PERL_JSON_BACKEND}; 9delete $ENV{CPAN_META_JSON_BACKEND}; 10delete $ENV{CPAN_META_JSON_DECODER}; 11 12sub dies_ok (&@) { 13 my ($code, $qr, $comment) = @_; 14 15 if (eval { $code->(); 1 }) { 16 fail("$comment: did not die"); 17 } else { 18 like($@, $qr, $comment); 19 } 20} 21 22my $prereqs_struct = { 23 runtime => { 24 requires => { 25 'Config' => '1.234', 26 'Cwd' => '876.5', 27 'IO::File' => 0, 28 'perl' => '5.005_03', 29 }, 30 recommends => { 31 'Pod::Text' => 0, 32 'YAML' => '0.35', 33 }, 34 }, 35 build => { 36 requires => { 37 'Test' => 0, 38 }, 39 } 40}; 41 42my $prereqs = CPAN::Meta::Prereqs->new($prereqs_struct); 43 44isa_ok($prereqs, 'CPAN::Meta::Prereqs'); 45 46$prereqs->finalize; 47 48ok($prereqs->is_finalized, 'cloned obj is not finalized'); 49 50is_deeply($prereqs->as_string_hash, $prereqs_struct, '...and still round-trip'); 51 52$prereqs->requirements_for(qw(runtime requires))->add_minimum(Cwd => 10); 53 54pass('...we can add a minimum if it has no effect'); 55 56dies_ok 57 { $prereqs->requirements_for(qw(runtime requires))->add_minimum(Cwd => 1000) } 58 qr{finalized req}, 59 '...but we die if it would alter a finalized prereqs'; 60 61$prereqs->requirements_for(qw(develop suggests)); 62 63pass('...we can get a V:R object for a previously unconfigured phase'); 64 65dies_ok 66 { $prereqs->requirements_for(qw(develop suggests))->add_minimum(Foo => 1) } 67 qr{finalized req}, 68 '...but we die if we try to put anything in it'; 69 70my $clone = $prereqs->clone; 71 72isa_ok($clone, 'CPAN::Meta::Prereqs', 'cloned prereqs obj'); 73 74ok(! $clone->is_finalized, 'cloned obj is not finalized'); 75 76is_deeply($clone->as_string_hash, $prereqs_struct, '...it still round-trips'); 77 78$clone->requirements_for(qw(runtime requires))->add_minimum(Cwd => 10); 79 80pass('...we can add minimum if it has no effect'); 81 82$clone->requirements_for(qw(runtime requires))->add_minimum(Cwd => 1000); 83 84pass('...or if it has an effect'); 85 86$clone->requirements_for(qw(develop suggests)); 87 88pass('...we can get a V:R object for a previously unconfigured phase'); 89 90$clone->requirements_for(qw(develop suggests))->add_minimum(Foo => 1); 91 92pass('...and we can add stuff to it'); 93 94done_testing; 95# vim: ts=2 sts=2 sw=2 et : 96