4 use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
5 use MBTest tests => 49;
9 my $tmp = MBTest->tmpdir;
13 use Module::Build::ConfigData;
17 module_name => 'Simple',
18 dist_version => '3.14159265',
19 dist_author => [ 'Simple Simon <ss\@somewhere.priv>' ],
20 dist_abstract => 'Something interesting',
23 keywords => [qw(super duper something)],
24 resources => {homepage => 'http://foo.example.com'},
30 my $dist = DistGen->new( dir => $tmp );
31 $dist->change_build_pl( \%metadata );
34 my $simple_file = 'lib/Simple.pm';
35 my $simple2_file = 'lib/Simple2.pm';
38 # Traditional VMS will return the file in in lower case, and is_deeply
39 # does exact case comparisons.
40 # When ODS-5 support is active for preserved case file names, this will
43 $simple_file = lc($simple_file);
44 $simple2_file = lc($simple2_file);
48 chdir( $dist->dirname ) or die "Can't chdir to '@{[$dist->dirname]}': $!";
51 my $mb = Module::Build->new_from_context;
53 ##################################################
55 # Test for valid META.yml
58 my $node = $mb->prepare_metadata( {} );
60 # exists() doesn't seem to work here
61 is $node->{name}, $metadata{module_name};
62 is $node->{version}, $metadata{dist_version};
63 is $node->{abstract}, $metadata{dist_abstract};
64 is_deeply $node->{author}, $metadata{dist_author};
65 is $node->{license}, $metadata{license};
66 like $node->{generated_by}, qr{Module::Build};
67 ok defined( $node->{'meta-spec'}{version} ),
68 "'meta-spec' -> 'version' field present in META.yml";
69 ok defined( $node->{'meta-spec'}{url} ),
70 "'meta-spec' -> 'url' field present in META.yml";
71 is_deeply $node->{keywords}, $metadata{meta_add}{keywords};
72 is_deeply $node->{resources}, $metadata{meta_add}{resources};
78 ##################################################
80 # Tests to ensure that the correct packages and versions are
81 # recorded for the 'provides' field of META.yml
83 my $provides; # Used a bunch of times below
85 sub new_build { return Module::Build->new_from_context( quiet => 1, @_ ) }
87 ############################## Single Module
89 # File with corresponding package (w/ or w/o version)
90 # Simple.pm => Simple v1.23
92 $dist->change_file( 'lib/Simple.pm', <<'---' );
96 $dist->regen( clean => 1 );
98 is_deeply($mb->find_dist_packages,
99 {'Simple' => {file => $simple_file,
100 version => '1.23'}});
102 $dist->change_file( 'lib/Simple.pm', <<'---' );
105 $dist->regen( clean => 1 );
107 is_deeply($mb->find_dist_packages,
108 {'Simple' => {file => $simple_file}});
110 # File with no corresponding package (w/ or w/o version)
111 # Simple.pm => Foo::Bar v1.23
113 $dist->change_file( 'lib/Simple.pm', <<'---' );
117 $dist->regen( clean => 1 );
119 is_deeply($mb->find_dist_packages,
120 {'Foo::Bar' => { file => $simple_file,
121 version => '1.23' }});
123 $dist->change_file( 'lib/Simple.pm', <<'---' );
126 $dist->regen( clean => 1 );
128 is_deeply($mb->find_dist_packages,
129 {'Foo::Bar' => { file => $simple_file}});
132 # Single file with multiple differing packages (w/ or w/o version)
133 # Simple.pm => Simple
134 # Simple.pm => Foo::Bar
136 $dist->change_file( 'lib/Simple.pm', <<'---' );
142 $dist->regen( clean => 1 );
144 is_deeply($mb->find_dist_packages,
145 {'Simple' => { file => $simple_file,
147 'Foo::Bar' => { file => $simple_file,
148 version => '1.23' }});
151 $dist->change_file( 'lib/Simple.pm', <<'---' );
153 $VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
154 package Simple::Simon;
155 $VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
158 my $provides = new_build()->prepare_metadata()->{provides};
159 is $provides->{'Simple'}{version}, '0.60.128', "Check version";
160 is $provides->{'Simple::Simon'}{version}, '0.61.129', "Check version";
161 is ref($provides->{'Simple'}{version}), '', "Versions from prepare_metadata() aren't refs";
162 is ref($provides->{'Simple::Simon'}{version}), '', "Versions from prepare_metadata() aren't refs";
166 # Single file with multiple differing packages, no corresponding package
168 # Simple.pm => Foo::Bar
170 $dist->change_file( 'lib/Simple.pm', <<'---' );
176 $dist->regen( clean => 1 );
178 is_deeply($mb->find_dist_packages,
179 {'Foo' => { file => $simple_file,
181 'Foo::Bar' => { file => $simple_file,
182 version => '1.23' }});
185 # Single file with same package appearing multiple times, no version
186 # only record a single instance
187 # Simple.pm => Simple
188 # Simple.pm => Simple
190 $dist->change_file( 'lib/Simple.pm', <<'---' );
194 $dist->regen( clean => 1 );
196 is_deeply($mb->find_dist_packages,
197 {'Simple' => { file => $simple_file }});
200 # Single file with same package appearing multiple times, single
201 # version 1st package:
202 # Simple.pm => Simple v1.23
203 # Simple.pm => Simple
205 $dist->change_file( 'lib/Simple.pm', <<'---' );
210 $dist->regen( clean => 1 );
212 is_deeply($mb->find_dist_packages,
213 {'Simple' => { file => $simple_file,
214 version => '1.23' }});
217 # Single file with same package appearing multiple times, single
218 # version 2nd package
219 # Simple.pm => Simple
220 # Simple.pm => Simple v1.23
222 $dist->change_file( 'lib/Simple.pm', <<'---' );
227 $dist->regen( clean => 1 );
229 is_deeply($mb->find_dist_packages,
230 {'Simple' => { file => $simple_file,
231 version => '1.23' }});
234 # Single file with same package appearing multiple times, conflicting versions
235 # Simple.pm => Simple v1.23
236 # Simple.pm => Simple v2.34
238 $dist->change_file( 'lib/Simple.pm', <<'---' );
244 $dist->regen( clean => 1 );
246 $err = stderr_of( sub { $mb = new_build() } );
247 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
249 {'Simple' => { file => $simple_file,
250 version => '1.23' }}); # XXX should be 2.34?
251 like( $err, qr/already declared/, ' with conflicting versions reported' );
254 # (Same as above three cases except with no corresponding package)
255 # Simple.pm => Foo v1.23
256 # Simple.pm => Foo v2.34
258 $dist->change_file( 'lib/Simple.pm', <<'---' );
264 $dist->regen( clean => 1 );
265 $err = stderr_of( sub { $mb = new_build() } );
266 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
268 {'Foo' => { file => $simple_file,
269 version => '1.23' }}); # XXX should be 2.34?
270 like( $err, qr/already declared/, ' with conflicting versions reported' );
274 ############################## Multiple Modules
276 # Multiple files with same package, no version
277 # Simple.pm => Simple
278 # Simple2.pm => Simple
280 $dist->change_file( 'lib/Simple.pm', <<'---' );
283 $dist->add_file( 'lib/Simple2.pm', <<'---' );
286 $dist->regen( clean => 1 );
288 is_deeply($mb->find_dist_packages,
289 {'Simple' => { file => $simple_file }});
290 $dist->remove_file( 'lib/Simple2.pm' );
293 # Multiple files with same package, single version in corresponding package
294 # Simple.pm => Simple v1.23
295 # Simple2.pm => Simple
297 $dist->change_file( 'lib/Simple.pm', <<'---' );
301 $dist->add_file( 'lib/Simple2.pm', <<'---' );
304 $dist->regen( clean => 1 );
306 is_deeply($mb->find_dist_packages,
307 {'Simple' => { file => $simple_file,
308 version => '1.23' }});
309 $dist->remove_file( 'lib/Simple2.pm' );
312 # Multiple files with same package,
313 # single version in non-corresponding package
314 # Simple.pm => Simple
315 # Simple2.pm => Simple v1.23
317 $dist->change_file( 'lib/Simple.pm', <<'---' );
320 $dist->add_file( 'lib/Simple2.pm', <<'---' );
324 $dist->regen( clean => 1 );
326 is_deeply($mb->find_dist_packages,
327 {'Simple' => { file => $simple2_file,
328 version => '1.23' }});
329 $dist->remove_file( 'lib/Simple2.pm' );
332 # Multiple files with same package, conflicting versions
333 # Simple.pm => Simple v1.23
334 # Simple2.pm => Simple v2.34
336 $dist->change_file( 'lib/Simple.pm', <<'---' );
340 $dist->add_file( 'lib/Simple2.pm', <<'---' );
344 $dist->regen( clean => 1 );
346 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
348 {'Simple' => { file => $simple_file,
349 version => '1.23' }});
350 like( $err, qr/Found conflicting versions for package/,
351 ' with conflicting versions reported' );
352 $dist->remove_file( 'lib/Simple2.pm' );
355 # Multiple files with same package, multiple agreeing versions
356 # Simple.pm => Simple v1.23
357 # Simple2.pm => Simple v1.23
359 $dist->change_file( 'lib/Simple.pm', <<'---' );
363 $dist->add_file( 'lib/Simple2.pm', <<'---' );
367 $dist->regen( clean => 1 );
369 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
371 {'Simple' => { file => $simple_file,
372 version => '1.23' }});
373 $dist->remove_file( 'lib/Simple2.pm' );
376 ############################################################
378 # (Same as above five cases except with non-corresponding package)
381 # Multiple files with same package, no version
385 $dist->change_file( 'lib/Simple.pm', <<'---' );
388 $dist->add_file( 'lib/Simple2.pm', <<'---' );
391 $dist->regen( clean => 1 );
393 $provides = $mb->find_dist_packages;
394 ok( exists( $provides->{Foo} ) ); # it exist, can't predict which file
395 $dist->remove_file( 'lib/Simple2.pm' );
398 # Multiple files with same package, version in first file
399 # Simple.pm => Foo v1.23
402 $dist->change_file( 'lib/Simple.pm', <<'---' );
406 $dist->add_file( 'lib/Simple2.pm', <<'---' );
409 $dist->regen( clean => 1 );
411 is_deeply($mb->find_dist_packages,
412 {'Foo' => { file => $simple_file,
413 version => '1.23' }});
414 $dist->remove_file( 'lib/Simple2.pm' );
417 # Multiple files with same package, version in second file
419 # Simple2.pm => Foo v1.23
421 $dist->change_file( 'lib/Simple.pm', <<'---' );
424 $dist->add_file( 'lib/Simple2.pm', <<'---' );
428 $dist->regen( clean => 1 );
430 is_deeply($mb->find_dist_packages,
431 {'Foo' => { file => $simple2_file,
432 version => '1.23' }});
433 $dist->remove_file( 'lib/Simple2.pm' );
436 # Multiple files with same package, conflicting versions
437 # Simple.pm => Foo v1.23
438 # Simple2.pm => Foo v2.34
440 $dist->change_file( 'lib/Simple.pm', <<'---' );
444 $dist->add_file( 'lib/Simple2.pm', <<'---' );
448 $dist->regen( clean => 1 );
450 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
451 # XXX Should 'Foo' exist ??? Can't predict values for file & version
452 ok( exists( $provides->{Foo} ) );
453 like( $err, qr/Found conflicting versions for package/,
454 ' with conflicting versions reported' );
455 $dist->remove_file( 'lib/Simple2.pm' );
458 # Multiple files with same package, multiple agreeing versions
459 # Simple.pm => Foo v1.23
460 # Simple2.pm => Foo v1.23
462 $dist->change_file( 'lib/Simple.pm', <<'---' );
466 $dist->add_file( 'lib/Simple2.pm', <<'---' );
470 $dist->regen( clean => 1 );
472 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
473 ok( exists( $provides->{Foo} ) );
474 is( $provides->{Foo}{version}, '1.23' );
475 ok( exists( $provides->{Foo}{file} ) ); # Can't predict which file
476 is( $err, '', ' no conflicts reported' );
477 $dist->remove_file( 'lib/Simple2.pm' );
479 ############################################################
480 # Conflicts among primary & multiple alternatives
482 # multiple files, conflicting version in corresponding file
483 $dist->change_file( 'lib/Simple.pm', <<'---' );
487 $dist->add_file( 'lib/Simple2.pm', <<'---' );
491 $dist->add_file( 'lib/Simple3.pm', <<'---' );
495 $dist->regen( clean => 1 );
496 $err = stderr_of( sub {
499 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
501 {'Simple' => { file => $simple_file,
502 version => '1.23' }});
503 like( $err, qr/Found conflicting versions for package/,
504 ' corresponding package conflicts with multiple alternatives' );
505 $dist->remove_file( 'lib/Simple2.pm' );
506 $dist->remove_file( 'lib/Simple3.pm' );
508 # multiple files, conflicting version in non-corresponding file
509 $dist->change_file( 'lib/Simple.pm', <<'---' );
513 $dist->add_file( 'lib/Simple2.pm', <<'---' );
517 $dist->add_file( 'lib/Simple3.pm', <<'---' );
521 $dist->regen( clean => 1 );
522 $err = stderr_of( sub {
525 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
527 {'Simple' => { file => $simple_file,
528 version => '1.23' }});
529 like( $err, qr/Found conflicting versions for package/,
530 ' only one alternative conflicts with corresponding package' );
531 $dist->remove_file( 'lib/Simple2.pm' );
532 $dist->remove_file( 'lib/Simple3.pm' );
535 ############################################################
536 # Don't record private packages (beginning with underscore)
537 # Simple.pm => Simple::_private
538 # Simple.pm => Simple::_private::too
540 $dist->change_file( 'lib/Simple.pm', <<'---' );
543 package Simple::_private;
545 package Simple::_private::too;
548 $dist->regen( clean => 1 );
550 is_deeply($mb->find_dist_packages,
551 {'Simple' => { file => $simple_file,
552 version => '1.23' }});
555 ############################################################
556 # Files with no packages?
558 # Simple.pm => <empty>
560 $dist->change_file( 'lib/Simple.pm', '' );
561 $dist->regen( clean => 1 );
563 is_deeply( $mb->find_dist_packages, {} );
565 # Simple.pm => =pod..=cut (no package declaration)
566 $dist->change_file( 'lib/Simple.pm', <<'---' );
571 Simple - Pure Documentation
579 $dist->regen( clean => 1 );
581 is_deeply($mb->find_dist_packages, {});
583 ############################################################
585 chdir( $cwd ) or die "Can't chdir to '$cwd': $!";