This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update Devel::Peek docs with Dump changes
[perl5.git] / cpan / CPAN-Meta-Requirements / t / basic.t
1 use strict;
2 use warnings;
3
4 use CPAN::Meta::Requirements;
5
6 use Test::More 0.88;
7
8 sub 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
193 sub 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
236 done_testing;