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