xref: /openbsd-src/gnu/usr.bin/perl/cpan/CPAN-Meta-Requirements/t/basic.t (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1use strict;
2use warnings;
3
4use CPAN::Meta::Requirements;
5
6use Test::More 0.88;
7
8sub dies_ok (&@) {
9  my ($code, $qr, $comment) = @_;
10
11  my $lived = eval { $code->(); 1 };
12
13  if ($lived) {
14    fail("$comment: did not die");
15  } else {
16    like($@, $qr, $comment);
17  }
18}
19
20{
21  my $req = CPAN::Meta::Requirements->new;
22
23  $req->add_minimum('Foo::Bar' => 10);
24  $req->add_minimum('Foo::Bar' => 0);
25  $req->add_minimum('Foo::Bar' => 2);
26
27  $req->add_minimum('Foo::Baz' => version->declare('v1.2.3'));
28
29  $req->add_minimum('Foo::Undef' => undef);
30
31  is_deeply(
32    $req->as_string_hash,
33    {
34      'Foo::Bar'   => 10,
35      'Foo::Baz'   => 'v1.2.3',
36      'Foo::Undef' => 0,
37    },
38    "some basic minimums",
39  );
40
41  ok($req->is_simple, "just minimums? simple");
42}
43
44{
45  my $req = CPAN::Meta::Requirements->new;
46  $req->add_maximum(Foo => 1);
47  is_deeply($req->as_string_hash, { Foo => '<= 1' }, "max only");
48
49  ok(! $req->is_simple, "maximums? not simple");
50}
51
52{
53  my $req = CPAN::Meta::Requirements->new;
54  $req->add_exclusion(Foo => 1);
55  $req->add_exclusion(Foo => 2);
56
57  # Why would you ever do this?? -- rjbs, 2010-02-20
58  is_deeply($req->as_string_hash, { Foo => '!= 1, != 2' }, "excl only");
59}
60
61{
62  my $req = CPAN::Meta::Requirements->new;
63
64  $req->add_minimum(Foo => 1);
65  $req->add_maximum(Foo => 2);
66
67  is_deeply(
68    $req->as_string_hash,
69    {
70      Foo => '>= 1, <= 2',
71    },
72    "min and max",
73  );
74
75  $req->add_maximum(Foo => 3);
76
77  is_deeply(
78    $req->as_string_hash,
79    {
80      Foo => '>= 1, <= 2',
81    },
82    "exclusions already outside range do not matter",
83  );
84
85  $req->add_exclusion(Foo => 1.5);
86
87  is_deeply(
88    $req->as_string_hash,
89    {
90      Foo => '>= 1, <= 2, != 1.5',
91    },
92    "exclusions",
93  );
94
95  $req->add_minimum(Foo => 1.6);
96
97  is_deeply(
98    $req->as_string_hash,
99    {
100      Foo => '>= 1.6, <= 2',
101    },
102    "exclusions go away when made irrelevant",
103  );
104}
105
106{
107  my $req = CPAN::Meta::Requirements->new;
108
109  $req->add_minimum(Foo => 1);
110  $req->add_exclusion(Foo => 1);
111  $req->add_maximum(Foo => 2);
112
113  is_deeply(
114    $req->as_string_hash,
115    {
116      Foo => '> 1, <= 2',
117    },
118    "we can exclude an endpoint",
119  );
120}
121
122{
123  my $req = CPAN::Meta::Requirements->new;
124  $req->add_minimum(Foo => 1);
125
126  $req->add_exclusion(Foo => 1);
127
128  dies_ok { $req->add_maximum(Foo => 1); }
129    qr/excluded all/,
130    "can't exclude all values" ;
131}
132
133{
134  my $req = CPAN::Meta::Requirements->new;
135  $req->add_minimum(Foo => 1);
136  dies_ok {$req->exact_version(Foo => 0.5); }
137    qr/outside of range/,
138    "can't add outside-range exact spec to range";
139}
140
141{
142  my $req = CPAN::Meta::Requirements->new;
143  $req->add_minimum(Foo => 1);
144  dies_ok { $req->add_maximum(Foo => 0.5); }
145    qr/minimum exceeds maximum/,
146    "maximum must exceed (or equal) minimum";
147
148  $req = CPAN::Meta::Requirements->new;
149  $req->add_maximum(Foo => 0.5);
150  dies_ok { $req->add_minimum(Foo => 1); }
151    qr/minimum exceeds maximum/,
152    "maximum must exceed (or equal) minimum";
153}
154
155{
156  my $req = CPAN::Meta::Requirements->new;
157
158  $req->add_minimum(Foo => 1);
159  $req->add_maximum(Foo => 1);
160
161  $req->add_maximum(Foo => 2); # ignored
162  $req->add_minimum(Foo => 0); # ignored
163  $req->add_exclusion(Foo => .5); # ignored
164
165  is_deeply(
166    $req->as_string_hash,
167    {
168      'Foo' => '== 1',
169    },
170    "if min==max, becomes exact requirement",
171  );
172}
173
174{
175  my $req = CPAN::Meta::Requirements->new;
176  $req->add_minimum(Foo => 1);
177  $req->add_exclusion(Foo => 0);
178  $req->add_maximum(Foo => 3);
179  $req->add_exclusion(Foo => 4);
180
181  $req->add_exclusion(Foo => 2);
182  $req->add_exclusion(Foo => 2);
183
184  is_deeply(
185    $req->as_string_hash,
186    {
187      Foo => '>= 1, <= 3, != 2',
188    },
189    'test exclusion-skipping',
190  );
191}
192
193sub foo_1 {
194  my $req = CPAN::Meta::Requirements->new;
195  $req->exact_version(Foo => 1);
196  return $req;
197}
198
199{
200  my $req = foo_1;
201
202  $req->exact_version(Foo => 1); # ignored
203
204  is_deeply($req->as_string_hash, { Foo => '== 1' }, "exact requirement");
205
206  dies_ok { $req->exact_version(Foo => 2); }
207    qr/unequal/,
208    "can't exactly specify differing versions" ;
209
210  $req = foo_1;
211  $req->add_minimum(Foo => 0); # ignored
212  $req->add_maximum(Foo => 2); # ignored
213
214  dies_ok { $req->add_maximum(Foo => 0); } qr/maximum below/, "max < fixed";
215
216  $req = foo_1;
217  dies_ok { $req->add_minimum(Foo => 2); } qr/minimum above/, "min > fixed";
218
219  $req = foo_1;
220  $req->add_exclusion(Foo => 8); # ignored
221  dies_ok { $req->add_exclusion(Foo => 1); } qr/excluded exact/, "!= && ==";
222}
223
224{
225  my $req = foo_1;
226
227  is($req->requirements_for_module('Foo'), '== 1', 'requirements_for_module');
228
229  # test empty/undef returns
230  my @list = $req->requirements_for_module('FooBarBamBaz');
231  my $scalar = $req->requirements_for_module('FooBarBamBaz');
232  is ( scalar @list, 0, "requirements_for_module() returns empty for not found (list)" );
233  is ( $scalar, undef, "requirements_for_module() returns undef for not found (scalar)" );
234}
235
236done_testing;
237