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