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