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