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
CommitLineData
bb4e9162 1#!/usr/bin/perl -w
2
3use strict;
4use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
738349a8 5use MBTest tests => 51;
bb4e9162 6
738349a8 7use_ok 'Module::Build';
8ensure_blib('Module::Build');
bb4e9162 9
738349a8 10my $tmp = MBTest->tmpdir;
bb4e9162 11
bb4e9162 12use Module::Build::ConfigData;
7a827510 13
14my %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 );
bb4e9162 26
27
28use DistGen;
29my $dist = DistGen->new( dir => $tmp );
7a827510 30$dist->change_build_pl( \%metadata );
bb4e9162 31$dist->regen;
32
d1bd4ef0 33my $simple_file = 'lib/Simple.pm';
34my $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
738349a8 47$dist->chdir_in;
bb4e9162 48
49use Module::Build;
50my $mb = Module::Build->new_from_context;
51
52##################################################
53#
54# Test for valid META.yml
55
7a827510 56{
57 my $node = $mb->prepare_metadata( {} );
bb4e9162 58
59 # exists() doesn't seem to work here
7a827510 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};
bb4e9162 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";
7a827510 70 is_deeply $node->{keywords}, $metadata{meta_add}{keywords};
71 is_deeply $node->{resources}, $metadata{meta_add}{resources};
bb4e9162 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
82my $provides; # Used a bunch of times below
83
84sub 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', <<'---' );
92package Simple;
93$VERSION = '1.23';
94---
95$dist->regen( clean => 1 );
96$mb = new_build();
97is_deeply($mb->find_dist_packages,
d1bd4ef0 98 {'Simple' => {file => $simple_file,
bb4e9162 99 version => '1.23'}});
100
101$dist->change_file( 'lib/Simple.pm', <<'---' );
102package Simple;
103---
104$dist->regen( clean => 1 );
105$mb = new_build();
106is_deeply($mb->find_dist_packages,
d1bd4ef0 107 {'Simple' => {file => $simple_file}});
bb4e9162 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', <<'---' );
113package Foo::Bar;
114$VERSION = '1.23';
115---
116$dist->regen( clean => 1 );
117$mb = new_build();
118is_deeply($mb->find_dist_packages,
d1bd4ef0 119 {'Foo::Bar' => { file => $simple_file,
bb4e9162 120 version => '1.23' }});
121
122$dist->change_file( 'lib/Simple.pm', <<'---' );
123package Foo::Bar;
124---
125$dist->regen( clean => 1 );
126$mb = new_build();
127is_deeply($mb->find_dist_packages,
d1bd4ef0 128 {'Foo::Bar' => { file => $simple_file}});
bb4e9162 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', <<'---' );
136package Simple;
137$VERSION = '1.23';
138package Foo::Bar;
139$VERSION = '1.23';
140---
141$dist->regen( clean => 1 );
142$mb = new_build();
143is_deeply($mb->find_dist_packages,
d1bd4ef0 144 {'Simple' => { file => $simple_file,
bb4e9162 145 version => '1.23' },
d1bd4ef0 146 'Foo::Bar' => { file => $simple_file,
bb4e9162 147 version => '1.23' }});
148
77e96e88 149{
150 $dist->change_file( 'lib/Simple.pm', <<'---' );
151package Simple;
7253302f 152$VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
77e96e88 153package Simple::Simon;
7253302f 154$VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
77e96e88 155---
156 $dist->regen;
157 my $provides = new_build()->prepare_metadata()->{provides};
8cb289bd 158 is $provides->{'Simple'}{version}, '0.60.128', "Check version";
159 is $provides->{'Simple::Simon'}{version}, '0.61.129', "Check version";
77e96e88 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
bb4e9162 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', <<'---' );
170package Foo;
171$VERSION = '1.23';
172package Foo::Bar;
173$VERSION = '1.23';
174---
175$dist->regen( clean => 1 );
176$mb = new_build();
177is_deeply($mb->find_dist_packages,
d1bd4ef0 178 {'Foo' => { file => $simple_file,
bb4e9162 179 version => '1.23' },
d1bd4ef0 180 'Foo::Bar' => { file => $simple_file,
bb4e9162 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', <<'---' );
190package Simple;
191package Simple;
192---
193$dist->regen( clean => 1 );
194$mb = new_build();
195is_deeply($mb->find_dist_packages,
d1bd4ef0 196 {'Simple' => { file => $simple_file }});
bb4e9162 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', <<'---' );
205package Simple;
206$VERSION = '1.23';
207package Simple;
208---
209$dist->regen( clean => 1 );
210$mb = new_build();
211is_deeply($mb->find_dist_packages,
d1bd4ef0 212 {'Simple' => { file => $simple_file,
bb4e9162 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', <<'---' );
222package Simple;
223package Simple;
224$VERSION = '1.23';
225---
226$dist->regen( clean => 1 );
227$mb = new_build();
228is_deeply($mb->find_dist_packages,
d1bd4ef0 229 {'Simple' => { file => $simple_file,
bb4e9162 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', <<'---' );
238package Simple;
239$VERSION = '1.23';
240package Simple;
241$VERSION = '2.34';
242---
243$dist->regen( clean => 1 );
244my $err = '';
245$err = stderr_of( sub { $mb = new_build() } );
246$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
247is_deeply($provides,
d1bd4ef0 248 {'Simple' => { file => $simple_file,
bb4e9162 249 version => '1.23' }}); # XXX should be 2.34?
250like( $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', <<'---' );
258package Foo;
259$VERSION = '1.23';
260package 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 } );
266is_deeply($provides,
d1bd4ef0 267 {'Foo' => { file => $simple_file,
bb4e9162 268 version => '1.23' }}); # XXX should be 2.34?
269like( $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', <<'---' );
280package Simple;
281---
282$dist->add_file( 'lib/Simple2.pm', <<'---' );
283package Simple;
284---
285$dist->regen( clean => 1 );
286$mb = new_build();
287is_deeply($mb->find_dist_packages,
d1bd4ef0 288 {'Simple' => { file => $simple_file }});
bb4e9162 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', <<'---' );
297package Simple;
298$VERSION = '1.23';
299---
300$dist->add_file( 'lib/Simple2.pm', <<'---' );
301package Simple;
302---
303$dist->regen( clean => 1 );
304$mb = new_build();
305is_deeply($mb->find_dist_packages,
d1bd4ef0 306 {'Simple' => { file => $simple_file,
bb4e9162 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', <<'---' );
317package Simple;
318---
319$dist->add_file( 'lib/Simple2.pm', <<'---' );
320package Simple;
321$VERSION = '1.23';
322---
323$dist->regen( clean => 1 );
324$mb = new_build();
325is_deeply($mb->find_dist_packages,
d1bd4ef0 326 {'Simple' => { file => $simple2_file,
bb4e9162 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', <<'---' );
336package Simple;
337$VERSION = '1.23';
338---
339$dist->add_file( 'lib/Simple2.pm', <<'---' );
340package 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 } );
346is_deeply($provides,
d1bd4ef0 347 {'Simple' => { file => $simple_file,
bb4e9162 348 version => '1.23' }});
349like( $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', <<'---' );
359package Simple;
360$VERSION = '1.23';
361---
362$dist->add_file( 'lib/Simple2.pm', <<'---' );
363package 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 } );
369is_deeply($provides,
d1bd4ef0 370 {'Simple' => { file => $simple_file,
bb4e9162 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', <<'---' );
385package Foo;
386---
387$dist->add_file( 'lib/Simple2.pm', <<'---' );
388package Foo;
389---
390$dist->regen( clean => 1 );
391$mb = new_build();
392$provides = $mb->find_dist_packages;
393ok( 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', <<'---' );
402package Foo;
403$VERSION = '1.23';
404---
405$dist->add_file( 'lib/Simple2.pm', <<'---' );
406package Foo;
407---
408$dist->regen( clean => 1 );
409$mb = new_build();
410is_deeply($mb->find_dist_packages,
d1bd4ef0 411 {'Foo' => { file => $simple_file,
bb4e9162 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', <<'---' );
421package Foo;
422---
423$dist->add_file( 'lib/Simple2.pm', <<'---' );
424package Foo;
425$VERSION = '1.23';
426---
427$dist->regen( clean => 1 );
428$mb = new_build();
429is_deeply($mb->find_dist_packages,
d1bd4ef0 430 {'Foo' => { file => $simple2_file,
bb4e9162 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', <<'---' );
440package Foo;
441$VERSION = '1.23';
442---
443$dist->add_file( 'lib/Simple2.pm', <<'---' );
444package 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
451ok( exists( $provides->{Foo} ) );
452like( $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', <<'---' );
462package Foo;
463$VERSION = '1.23';
464---
465$dist->add_file( 'lib/Simple2.pm', <<'---' );
466package 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 } );
472ok( exists( $provides->{Foo} ) );
473is( $provides->{Foo}{version}, '1.23' );
474ok( exists( $provides->{Foo}{file} ) ); # Can't predict which file
475is( $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', <<'---' );
483package Simple;
484$VERSION = '1.23';
485---
486$dist->add_file( 'lib/Simple2.pm', <<'---' );
487package Simple;
488$VERSION = '2.34';
489---
490$dist->add_file( 'lib/Simple3.pm', <<'---' );
491package 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 } );
499is_deeply($provides,
d1bd4ef0 500 {'Simple' => { file => $simple_file,
bb4e9162 501 version => '1.23' }});
502like( $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', <<'---' );
509package Simple;
510$VERSION = '1.23';
511---
512$dist->add_file( 'lib/Simple2.pm', <<'---' );
513package Simple;
514$VERSION = '1.23';
515---
516$dist->add_file( 'lib/Simple3.pm', <<'---' );
517package 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 } );
525is_deeply($provides,
d1bd4ef0 526 {'Simple' => { file => $simple_file,
bb4e9162 527 version => '1.23' }});
528like( $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', <<'---' );
540package Simple;
541$VERSION = '1.23';
542package Simple::_private;
543$VERSION = '2.34';
544package Simple::_private::too;
545$VERSION = '3.45';
546---
547$dist->regen( clean => 1 );
548$mb = new_build();
549is_deeply($mb->find_dist_packages,
d1bd4ef0 550 {'Simple' => { file => $simple_file,
bb4e9162 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();
562is_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
570Simple - Pure Documentation
571
572=head1 DESCRIPTION
573
574Doesn't do anything.
575
576=cut
577---
578$dist->regen( clean => 1 );
579$mb = new_build();
580is_deeply($mb->find_dist_packages, {});
581
bb4e9162 582############################################################
583# cleanup
bb4e9162 584$dist->remove;