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 9my $prereq_struct = { 10 runtime => { 11 requires => { 12 'Config' => 0, 13 'Cwd' => 0, 14 'Data::Dumper' => 0, 15 'ExtUtils::Install' => 0, 16 'File::Basename' => 0, 17 'File::Compare' => 0, 18 'File::Copy' => 0, 19 'File::Find' => 0, 20 'File::Path' => 0, 21 'File::Spec' => 0, 22 'IO::File' => 0, 23 'perl' => '5.005_03', 24 }, 25 recommends => { 26 'Archive::Tar' => '1.00', 27 'ExtUtils::Install' => 0.3, 28 'ExtUtils::ParseXS' => 2.02, 29 'Pod::Text' => 0, 30 'YAML' => 0.35, 31 }, 32 }, 33 build => { 34 requires => { 35 'Test' => 0, 36 }, 37 } 38}; 39 40my $prereq = CPAN::Meta::Prereqs->new($prereq_struct); 41 42isa_ok($prereq, 'CPAN::Meta::Prereqs'); 43 44is_deeply($prereq->as_string_hash, $prereq_struct, "round-trip okay"); 45 46{ 47 my $req = $prereq->requirements_for(qw(runtime requires)); 48 my @req_mod = $req->required_modules; 49 50 ok( 51 (grep { 'Cwd' eq $_ } @req_mod), 52 "we got the runtime requirements", 53 ); 54 55 ok( 56 (! grep { 'YAML' eq $_ } @req_mod), 57 "...but not the runtime recommendations", 58 ); 59 60 ok( 61 (! grep { 'Test' eq $_ } @req_mod), 62 "...nor the build requirements", 63 ); 64} 65 66{ 67 my $req = $prereq->requirements_for(qw(runtime requires)); 68 my $rec = $prereq->requirements_for(qw(runtime recommends)); 69 70 my $merged = $req->clone->add_requirements($rec); 71 72 my @req_mod = $merged->required_modules; 73 74 ok( 75 (grep { 'Cwd' eq $_ } @req_mod), 76 "we got the runtime requirements", 77 ); 78 79 ok( 80 (grep { 'YAML' eq $_ } @req_mod), 81 "...and the runtime recommendations", 82 ); 83 84 ok( 85 (! grep { 'Test' eq $_ } @req_mod), 86 "...but not the build requirements", 87 ); 88 89} 90 91{ 92 my $req = $prereq->requirements_for(qw(runtime suggests)); 93 my @req_mod = $req->required_modules; 94 95 is(@req_mod, 0, "empty set of runtime/suggests requirements"); 96} 97 98{ 99 my $req = $prereq->requirements_for(qw(develop suggests)); 100 my @req_mod = $req->required_modules; 101 102 is(@req_mod, 0, "empty set of develop/suggests requirements"); 103} 104 105{ 106 my $new_prereq = CPAN::Meta::Prereqs->new; 107 108 $new_prereq 109 ->requirements_for(qw(runtime requires)) 110 ->add_minimum(Foo => '1.000'); 111 112 $new_prereq 113 ->requirements_for(qw(runtime requires)) 114 ->add_minimum(Bar => '2.976'); 115 116 $new_prereq 117 ->requirements_for(qw(test requires)) 118 ->add_minimum(Baz => '3.1416'); 119 120 $new_prereq 121 ->requirements_for(qw(build recommends)) 122 ->add_minimum(Bar => '3.000'); 123 124 my $expect = { 125 runtime => { requires => { Foo => '1.000', Bar => '2.976' } }, 126 test => { requires => { Baz => '3.1416' } }, 127 build => { recommends => { Bar => '3.000' } }, 128 }; 129 130 is_deeply( 131 $new_prereq->as_string_hash, 132 $expect, 133 'we can accumulate new requirements on a prereq object', 134 ); 135 136 my $merged_requires = { 137 Foo => '1.000', 138 Bar => '2.976', 139 Baz => '3.1416', 140 }; 141 142 my $merged_all = { 143 Foo => '1.000', 144 Bar => '3.000', 145 Baz => '3.1416', 146 }; 147 148 is_deeply( 149 $new_prereq->merged_requirements( 150 [qw/runtime test build/], [qw/requires/] 151 )->as_string_hash, 152 $merged_requires, 153 "we can merge requirements for phases/types" 154 ); 155 156 is_deeply( 157 $new_prereq->merged_requirements->as_string_hash, 158 $merged_all, 159 "default merging is runtime/build/test for requires/recommends" 160 ); 161} 162 163done_testing; 164 165