xref: /openbsd/gnu/usr.bin/perl/cpan/CPAN-Meta/t/prereqs.t (revision 9f11ffb7)
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