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