Update Module::Load::Conditional to CPAN version 0.38
[p5sagit/p5-mst-13.2.git] / cpan / Module-Build / t / metadata.t
1 #!/usr/bin/perl -w
2
3 use strict;
4 use lib 't/lib';
5 use MBTest tests => 51;
6
7 blib_load('Module::Build');
8 blib_load('Module::Build::ConfigData');
9
10 my $tmp = MBTest->tmpdir;
11
12 my %metadata =
13   (
14    module_name   => 'Simple',
15    dist_version  => '3.14159265',
16    dist_author   => [ 'Simple Simon <ss\@somewhere.priv>' ],
17    dist_abstract => 'Something interesting',
18    license       => 'perl',
19    meta_add => {
20                 keywords  => [qw(super duper something)],
21                 resources => {homepage => 'http://foo.example.com'},
22                },
23   );
24
25
26 use DistGen;
27 my $dist = DistGen->new( dir => $tmp );
28 $dist->change_build_pl( \%metadata );
29 $dist->regen;
30
31 my $simple_file = 'lib/Simple.pm';
32 my $simple2_file = 'lib/Simple2.pm';
33
34    # Traditional VMS will return the file in in lower case, and is_deeply
35    # does exact case comparisons.
36    # When ODS-5 support is active for preserved case file names we do not
37    # change the case.
38    if ($^O eq 'VMS') {
39        my $lower_case_expect = 1;
40        my $vms_efs_case = 0;
41        if (eval 'require VMS::Feature') {
42            $vms_efs_case = VMS::Feature::current("efs_case_preserve");
43        } else {
44            my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
45            $vms_efs_case = $efs_case =~ /^[ET1]/i;
46        }
47        $lower_case_expect = 0 if $vms_efs_case;
48        if ($lower_case_expect) {
49            $simple_file = lc($simple_file);
50            $simple2_file = lc($simple2_file);
51        }
52    }
53
54
55 $dist->chdir_in;
56
57 my $mb = Module::Build->new_from_context;
58
59 ##################################################
60 #
61 # Test for valid META.yml
62
63 {
64   my $mb_prereq = { 'Module::Build' => $Module::Build::VERSION };
65   my $mb_config_req = {
66     'Module::Build' => int($Module::Build::VERSION * 100)/100
67   };
68   my $node = $mb->get_metadata( );
69
70   # exists() doesn't seem to work here
71   is $node->{name}, $metadata{module_name};
72   is $node->{version}, $metadata{dist_version};
73   is $node->{abstract}, $metadata{dist_abstract};
74   is_deeply $node->{author}, $metadata{dist_author};
75   is $node->{license}, $metadata{license};
76   is_deeply $node->{configure_requires}, $mb_config_req, 'Add M::B to configure_requires';
77   like $node->{generated_by}, qr{Module::Build};
78   ok defined( $node->{'meta-spec'}{version} ),
79       "'meta-spec' -> 'version' field present in META.yml";
80   ok defined( $node->{'meta-spec'}{url} ),
81       "'meta-spec' -> 'url' field present in META.yml";
82   is_deeply $node->{keywords}, $metadata{meta_add}{keywords};
83   is_deeply $node->{resources}, $metadata{meta_add}{resources};
84 }
85
86 {
87   my $mb_prereq = { 'Module::Build' => 0 };
88   $mb->configure_requires( $mb_prereq );
89   my $node = $mb->get_metadata( );
90
91
92   # exists() doesn't seem to work here
93   is_deeply $node->{configure_requires}, $mb_prereq, 'Add M::B to configure_requires';
94 }
95
96 $dist->clean;
97
98
99 ##################################################
100 #
101 # Tests to ensure that the correct packages and versions are
102 # recorded for the 'provides' field of META.yml
103
104 my $provides; # Used a bunch of times below
105
106 sub new_build { return Module::Build->new_from_context( quiet => 1, @_ ) }
107
108 ############################## Single Module
109
110 # File with corresponding package (w/ or w/o version)
111 # Simple.pm => Simple v1.23
112
113 $dist->change_file( 'lib/Simple.pm', <<'---' );
114 package Simple;
115 $VERSION = '1.23';
116 ---
117 $dist->regen( clean => 1 );
118 $mb = new_build();
119 is_deeply($mb->find_dist_packages,
120           {'Simple' => {file => $simple_file,
121                         version => '1.23'}});
122
123 $dist->change_file( 'lib/Simple.pm', <<'---' );
124 package Simple;
125 ---
126 $dist->regen( clean => 1 );
127 $mb = new_build();
128 is_deeply($mb->find_dist_packages,
129           {'Simple' => {file => $simple_file}});
130
131 # File with no corresponding package (w/ or w/o version)
132 # Simple.pm => Foo::Bar v1.23
133
134 $dist->change_file( 'lib/Simple.pm', <<'---' );
135 package Foo::Bar;
136 $VERSION = '1.23';
137 ---
138 $dist->regen( clean => 1 );
139 $mb = new_build();
140 is_deeply($mb->find_dist_packages,
141           {'Foo::Bar' => { file => $simple_file,
142                            version => '1.23' }});
143
144 $dist->change_file( 'lib/Simple.pm', <<'---' );
145 package Foo::Bar;
146 ---
147 $dist->regen( clean => 1 );
148 $mb = new_build();
149 is_deeply($mb->find_dist_packages,
150           {'Foo::Bar' => { file => $simple_file}});
151
152
153 # Single file with multiple differing packages (w/ or w/o version)
154 # Simple.pm => Simple
155 # Simple.pm => Foo::Bar
156
157 $dist->change_file( 'lib/Simple.pm', <<'---' );
158 package Simple;
159 $VERSION = '1.23';
160 package Foo::Bar;
161 $VERSION = '1.23';
162 ---
163 $dist->regen( clean => 1 );
164 $mb = new_build();
165 is_deeply($mb->find_dist_packages,
166           {'Simple'   => { file => $simple_file,
167                            version => '1.23' },
168            'Foo::Bar' => { file => $simple_file,
169                            version => '1.23' }});
170
171 {
172   $dist->change_file( 'lib/Simple.pm', <<'---' );
173 package Simple;
174 $VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
175 package Simple::Simon;
176 $VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
177 ---
178   $dist->regen;
179   my $provides = new_build()->get_metadata()->{provides};
180   is $provides->{'Simple'}{version}, 'v0.60.128', "Check version";
181   is $provides->{'Simple::Simon'}{version}, 'v0.61.129', "Check version";
182   is ref($provides->{'Simple'}{version}), '', "Versions from get_metadata() aren't refs";
183   is ref($provides->{'Simple::Simon'}{version}), '', "Versions from get_metadata() aren't refs";
184 }
185
186
187 # Single file with multiple differing packages, no corresponding package
188 # Simple.pm => Foo
189 # Simple.pm => Foo::Bar
190
191 $dist->change_file( 'lib/Simple.pm', <<'---' );
192 package Foo;
193 $VERSION = '1.23';
194 package Foo::Bar;
195 $VERSION = '1.23';
196 ---
197 $dist->regen( clean => 1 );
198 $mb = new_build();
199 is_deeply($mb->find_dist_packages,
200           {'Foo'      => { file => $simple_file,
201                            version => '1.23' },
202            'Foo::Bar' => { file => $simple_file,
203                            version => '1.23' }});
204
205
206 # Single file with same package appearing multiple times, no version
207 #   only record a single instance
208 # Simple.pm => Simple
209 # Simple.pm => Simple
210
211 $dist->change_file( 'lib/Simple.pm', <<'---' );
212 package Simple;
213 package Simple;
214 ---
215 $dist->regen( clean => 1 );
216 $mb = new_build();
217 is_deeply($mb->find_dist_packages,
218           {'Simple' => { file => $simple_file }});
219
220
221 # Single file with same package appearing multiple times, single
222 # version 1st package:
223 # Simple.pm => Simple v1.23
224 # Simple.pm => Simple
225
226 $dist->change_file( 'lib/Simple.pm', <<'---' );
227 package Simple;
228 $VERSION = '1.23';
229 package Simple;
230 ---
231 $dist->regen( clean => 1 );
232 $mb = new_build();
233 is_deeply($mb->find_dist_packages,
234           {'Simple' => { file => $simple_file,
235                          version => '1.23' }});
236
237
238 # Single file with same package appearing multiple times, single
239 # version 2nd package
240 # Simple.pm => Simple
241 # Simple.pm => Simple v1.23
242
243 $dist->change_file( 'lib/Simple.pm', <<'---' );
244 package Simple;
245 package Simple;
246 $VERSION = '1.23';
247 ---
248 $dist->regen( clean => 1 );
249 $mb = new_build();
250 is_deeply($mb->find_dist_packages,
251           {'Simple' => { file => $simple_file,
252                          version => '1.23' }});
253
254
255 # Single file with same package appearing multiple times, conflicting versions
256 # Simple.pm => Simple v1.23
257 # Simple.pm => Simple v2.34
258
259 $dist->change_file( 'lib/Simple.pm', <<'---' );
260 package Simple;
261 $VERSION = '1.23';
262 package Simple;
263 $VERSION = '2.34';
264 ---
265 $dist->regen( clean => 1 );
266 my $err = '';
267 $err = stderr_of( sub { $mb = new_build() } );
268 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
269 is_deeply($provides,
270           {'Simple' => { file => $simple_file,
271                          version => '1.23' }}); # XXX should be 2.34?
272 like( $err, qr/already declared/, '  with conflicting versions reported' );
273
274
275 # (Same as above three cases except with no corresponding package)
276 # Simple.pm => Foo v1.23
277 # Simple.pm => Foo v2.34
278
279 $dist->change_file( 'lib/Simple.pm', <<'---' );
280 package Foo;
281 $VERSION = '1.23';
282 package Foo;
283 $VERSION = '2.34';
284 ---
285 $dist->regen( clean => 1 );
286 $err = stderr_of( sub { $mb = new_build() } );
287 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
288 is_deeply($provides,
289           {'Foo' => { file => $simple_file,
290                       version => '1.23' }}); # XXX should be 2.34?
291 like( $err, qr/already declared/, '  with conflicting versions reported' );
292
293
294
295 ############################## Multiple Modules
296
297 # Multiple files with same package, no version
298 # Simple.pm  => Simple
299 # Simple2.pm => Simple
300
301 $dist->change_file( 'lib/Simple.pm', <<'---' );
302 package Simple;
303 ---
304 $dist->add_file( 'lib/Simple2.pm', <<'---' );
305 package Simple;
306 ---
307 $dist->regen( clean => 1 );
308 $mb = new_build();
309 is_deeply($mb->find_dist_packages,
310           {'Simple' => { file => $simple_file }});
311 $dist->remove_file( 'lib/Simple2.pm' );
312
313
314 # Multiple files with same package, single version in corresponding package
315 # Simple.pm  => Simple v1.23
316 # Simple2.pm => Simple
317
318 $dist->change_file( 'lib/Simple.pm', <<'---' );
319 package Simple;
320 $VERSION = '1.23';
321 ---
322 $dist->add_file( 'lib/Simple2.pm', <<'---' );
323 package Simple;
324 ---
325 $dist->regen( clean => 1 );
326 $mb = new_build();
327 is_deeply($mb->find_dist_packages,
328           {'Simple' => { file => $simple_file,
329                          version => '1.23' }});
330 $dist->remove_file( 'lib/Simple2.pm' );
331
332
333 # Multiple files with same package,
334 #   single version in non-corresponding package
335 # Simple.pm  => Simple
336 # Simple2.pm => Simple v1.23
337
338 $dist->change_file( 'lib/Simple.pm', <<'---' );
339 package Simple;
340 ---
341 $dist->add_file( 'lib/Simple2.pm', <<'---' );
342 package Simple;
343 $VERSION = '1.23';
344 ---
345 $dist->regen( clean => 1 );
346 $mb = new_build();
347 is_deeply($mb->find_dist_packages,
348           {'Simple' => { file => $simple2_file,
349                          version => '1.23' }});
350 $dist->remove_file( 'lib/Simple2.pm' );
351
352
353 # Multiple files with same package, conflicting versions
354 # Simple.pm  => Simple v1.23
355 # Simple2.pm => Simple v2.34
356
357 $dist->change_file( 'lib/Simple.pm', <<'---' );
358 package Simple;
359 $VERSION = '1.23';
360 ---
361 $dist->add_file( 'lib/Simple2.pm', <<'---' );
362 package Simple;
363 $VERSION = '2.34';
364 ---
365 $dist->regen( clean => 1 );
366 stderr_of( sub { $mb = new_build(); } );
367 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
368 is_deeply($provides,
369           {'Simple' => { file => $simple_file,
370                          version => '1.23' }});
371 like( $err, qr/Found conflicting versions for package/,
372       '  with conflicting versions reported' );
373 $dist->remove_file( 'lib/Simple2.pm' );
374
375
376 # Multiple files with same package, multiple agreeing versions
377 # Simple.pm  => Simple v1.23
378 # Simple2.pm => Simple v1.23
379
380 $dist->change_file( 'lib/Simple.pm', <<'---' );
381 package Simple;
382 $VERSION = '1.23';
383 ---
384 $dist->add_file( 'lib/Simple2.pm', <<'---' );
385 package Simple;
386 $VERSION = '1.23';
387 ---
388 $dist->regen( clean => 1 );
389 $mb = new_build();
390 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
391 is_deeply($provides,
392           {'Simple' => { file => $simple_file,
393                          version => '1.23' }});
394 $dist->remove_file( 'lib/Simple2.pm' );
395
396
397 ############################################################
398 #
399 # (Same as above five cases except with non-corresponding package)
400 #
401
402 # Multiple files with same package, no version
403 # Simple.pm  => Foo
404 # Simple2.pm => Foo
405
406 $dist->change_file( 'lib/Simple.pm', <<'---' );
407 package Foo;
408 ---
409 $dist->add_file( 'lib/Simple2.pm', <<'---' );
410 package Foo;
411 ---
412 $dist->regen( clean => 1 );
413 $mb = new_build();
414 $provides = $mb->find_dist_packages;
415 ok( exists( $provides->{Foo} ) ); # it exist, can't predict which file
416 $dist->remove_file( 'lib/Simple2.pm' );
417
418
419 # Multiple files with same package, version in first file
420 # Simple.pm  => Foo v1.23
421 # Simple2.pm => Foo
422
423 $dist->change_file( 'lib/Simple.pm', <<'---' );
424 package Foo;
425 $VERSION = '1.23';
426 ---
427 $dist->add_file( 'lib/Simple2.pm', <<'---' );
428 package Foo;
429 ---
430 $dist->regen( clean => 1 );
431 $mb = new_build();
432 is_deeply($mb->find_dist_packages,
433           {'Foo' => { file => $simple_file,
434                       version => '1.23' }});
435 $dist->remove_file( 'lib/Simple2.pm' );
436
437
438 # Multiple files with same package, version in second file
439 # Simple.pm  => Foo
440 # Simple2.pm => Foo v1.23
441
442 $dist->change_file( 'lib/Simple.pm', <<'---' );
443 package Foo;
444 ---
445 $dist->add_file( 'lib/Simple2.pm', <<'---' );
446 package Foo;
447 $VERSION = '1.23';
448 ---
449 $dist->regen( clean => 1 );
450 $mb = new_build();
451 is_deeply($mb->find_dist_packages,
452           {'Foo' => { file => $simple2_file,
453                       version => '1.23' }});
454 $dist->remove_file( 'lib/Simple2.pm' );
455
456
457 # Multiple files with same package, conflicting versions
458 # Simple.pm  => Foo v1.23
459 # Simple2.pm => Foo v2.34
460
461 $dist->change_file( 'lib/Simple.pm', <<'---' );
462 package Foo;
463 $VERSION = '1.23';
464 ---
465 $dist->add_file( 'lib/Simple2.pm', <<'---' );
466 package Foo;
467 $VERSION = '2.34';
468 ---
469 $dist->regen( clean => 1 );
470 stderr_of( sub { $mb = new_build(); } );
471 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
472 # XXX Should 'Foo' exist ??? Can't predict values for file & version
473 ok( exists( $provides->{Foo} ) );
474 like( $err, qr/Found conflicting versions for package/,
475       '  with conflicting versions reported' );
476 $dist->remove_file( 'lib/Simple2.pm' );
477
478
479 # Multiple files with same package, multiple agreeing versions
480 # Simple.pm  => Foo v1.23
481 # Simple2.pm => Foo v1.23
482
483 $dist->change_file( 'lib/Simple.pm', <<'---' );
484 package Foo;
485 $VERSION = '1.23';
486 ---
487 $dist->add_file( 'lib/Simple2.pm', <<'---' );
488 package Foo;
489 $VERSION = '1.23';
490 ---
491 $dist->regen( clean => 1 );
492 $mb = new_build();
493 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
494 ok( exists( $provides->{Foo} ) );
495 is( $provides->{Foo}{version}, '1.23' );
496 ok( exists( $provides->{Foo}{file} ) ); # Can't predict which file
497 is( $err, '', '  no conflicts reported' );
498 $dist->remove_file( 'lib/Simple2.pm' );
499
500 ############################################################
501 # Conflicts among primary & multiple alternatives
502
503 # multiple files, conflicting version in corresponding file
504 $dist->change_file( 'lib/Simple.pm', <<'---' );
505 package Simple;
506 $VERSION = '1.23';
507 ---
508 $dist->add_file( 'lib/Simple2.pm', <<'---' );
509 package Simple;
510 $VERSION = '2.34';
511 ---
512 $dist->add_file( 'lib/Simple3.pm', <<'---' );
513 package Simple;
514 $VERSION = '2.34';
515 ---
516 $dist->regen( clean => 1 );
517 $err = stderr_of( sub {
518   $mb = new_build();
519 } );
520 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
521 is_deeply($provides,
522           {'Simple' => { file => $simple_file,
523                          version => '1.23' }});
524 like( $err, qr/Found conflicting versions for package/,
525       '  corresponding package conflicts with multiple alternatives' );
526 $dist->remove_file( 'lib/Simple2.pm' );
527 $dist->remove_file( 'lib/Simple3.pm' );
528
529 # multiple files, conflicting version in non-corresponding file
530 $dist->change_file( 'lib/Simple.pm', <<'---' );
531 package Simple;
532 $VERSION = '1.23';
533 ---
534 $dist->add_file( 'lib/Simple2.pm', <<'---' );
535 package Simple;
536 $VERSION = '1.23';
537 ---
538 $dist->add_file( 'lib/Simple3.pm', <<'---' );
539 package Simple;
540 $VERSION = '2.34';
541 ---
542 $dist->regen( clean => 1 );
543 $err = stderr_of( sub {
544   $mb = new_build();
545 } );
546 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
547 is_deeply($provides,
548           {'Simple' => { file => $simple_file,
549                          version => '1.23' }});
550 like( $err, qr/Found conflicting versions for package/,
551       '  only one alternative conflicts with corresponding package' );
552 $dist->remove_file( 'lib/Simple2.pm' );
553 $dist->remove_file( 'lib/Simple3.pm' );
554
555
556 ############################################################
557 # Don't record private packages (beginning with underscore)
558 # Simple.pm => Simple::_private
559 # Simple.pm => Simple::_private::too
560
561 $dist->change_file( 'lib/Simple.pm', <<'---' );
562 package Simple;
563 $VERSION = '1.23';
564 package Simple::_private;
565 $VERSION = '2.34';
566 package Simple::_private::too;
567 $VERSION = '3.45';
568 ---
569 $dist->regen( clean => 1 );
570 $mb = new_build();
571 is_deeply($mb->find_dist_packages,
572           {'Simple' => { file => $simple_file,
573                          version => '1.23' }});
574
575
576 ############################################################
577 # Files with no packages?
578
579 # Simple.pm => <empty>
580
581 $dist->change_file( 'lib/Simple.pm', '' );
582 $dist->regen( clean => 1 );
583 $mb = new_build();
584 is_deeply( $mb->find_dist_packages, {} );
585
586 # Simple.pm => =pod..=cut (no package declaration)
587 $dist->change_file( 'lib/Simple.pm', <<'---' );
588 =pod
589
590 =head1 NAME
591
592 Simple - Pure Documentation
593
594 =head1 DESCRIPTION
595
596 Doesn't do anything.
597
598 =cut
599 ---
600 $dist->regen( clean => 1 );
601 $mb = new_build();
602 is_deeply($mb->find_dist_packages, {});
603