5 use MBTest tests => 51;
7 blib_load('Module::Build');
8 blib_load('Module::Build::ConfigData');
10 my $tmp = MBTest->tmpdir;
14 module_name => 'Simple',
15 dist_version => '3.14159265',
16 dist_author => [ 'Simple Simon <ss\@somewhere.priv>' ],
17 dist_abstract => 'Something interesting',
20 keywords => [qw(super duper something)],
21 resources => {homepage => 'http://foo.example.com'},
27 my $dist = DistGen->new( dir => $tmp );
28 $dist->change_build_pl( \%metadata );
31 my $simple_file = 'lib/Simple.pm';
32 my $simple2_file = 'lib/Simple2.pm';
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
39 my $lower_case_expect = 1;
41 if (eval 'require VMS::Feature') {
42 $vms_efs_case = VMS::Feature::current("efs_case_preserve");
44 my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
45 $vms_efs_case = $efs_case =~ /^[ET1]/i;
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);
57 my $mb = Module::Build->new_from_context;
59 ##################################################
61 # Test for valid META.yml
64 my $mb_prereq = { 'Module::Build' => $Module::Build::VERSION };
66 'Module::Build' => int($Module::Build::VERSION * 100)/100
68 my $node = $mb->prepare_metadata( );
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};
87 my $mb_prereq = { 'Module::Build' => 0 };
88 $mb->configure_requires( $mb_prereq );
89 my $node = $mb->prepare_metadata( );
92 # exists() doesn't seem to work here
93 is_deeply $node->{configure_requires}, $mb_prereq, 'Add M::B to configure_requires';
99 ##################################################
101 # Tests to ensure that the correct packages and versions are
102 # recorded for the 'provides' field of META.yml
104 my $provides; # Used a bunch of times below
106 sub new_build { return Module::Build->new_from_context( quiet => 1, @_ ) }
108 ############################## Single Module
110 # File with corresponding package (w/ or w/o version)
111 # Simple.pm => Simple v1.23
113 $dist->change_file( 'lib/Simple.pm', <<'---' );
117 $dist->regen( clean => 1 );
119 is_deeply($mb->find_dist_packages,
120 {'Simple' => {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 {'Simple' => {file => $simple_file}});
131 # File with no corresponding package (w/ or w/o version)
132 # Simple.pm => Foo::Bar v1.23
134 $dist->change_file( 'lib/Simple.pm', <<'---' );
138 $dist->regen( clean => 1 );
140 is_deeply($mb->find_dist_packages,
141 {'Foo::Bar' => { file => $simple_file,
142 version => '1.23' }});
144 $dist->change_file( 'lib/Simple.pm', <<'---' );
147 $dist->regen( clean => 1 );
149 is_deeply($mb->find_dist_packages,
150 {'Foo::Bar' => { file => $simple_file}});
153 # Single file with multiple differing packages (w/ or w/o version)
154 # Simple.pm => Simple
155 # Simple.pm => Foo::Bar
157 $dist->change_file( 'lib/Simple.pm', <<'---' );
163 $dist->regen( clean => 1 );
165 is_deeply($mb->find_dist_packages,
166 {'Simple' => { file => $simple_file,
168 'Foo::Bar' => { file => $simple_file,
169 version => '1.23' }});
172 $dist->change_file( 'lib/Simple.pm', <<'---' );
174 $VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
175 package Simple::Simon;
176 $VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
179 my $provides = new_build()->prepare_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 prepare_metadata() aren't refs";
183 is ref($provides->{'Simple::Simon'}{version}), '', "Versions from prepare_metadata() aren't refs";
187 # Single file with multiple differing packages, no corresponding package
189 # Simple.pm => Foo::Bar
191 $dist->change_file( 'lib/Simple.pm', <<'---' );
197 $dist->regen( clean => 1 );
199 is_deeply($mb->find_dist_packages,
200 {'Foo' => { file => $simple_file,
202 'Foo::Bar' => { file => $simple_file,
203 version => '1.23' }});
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
211 $dist->change_file( 'lib/Simple.pm', <<'---' );
215 $dist->regen( clean => 1 );
217 is_deeply($mb->find_dist_packages,
218 {'Simple' => { file => $simple_file }});
221 # Single file with same package appearing multiple times, single
222 # version 1st package:
223 # Simple.pm => Simple v1.23
224 # Simple.pm => Simple
226 $dist->change_file( 'lib/Simple.pm', <<'---' );
231 $dist->regen( clean => 1 );
233 is_deeply($mb->find_dist_packages,
234 {'Simple' => { file => $simple_file,
235 version => '1.23' }});
238 # Single file with same package appearing multiple times, single
239 # version 2nd package
240 # Simple.pm => Simple
241 # Simple.pm => Simple v1.23
243 $dist->change_file( 'lib/Simple.pm', <<'---' );
248 $dist->regen( clean => 1 );
250 is_deeply($mb->find_dist_packages,
251 {'Simple' => { file => $simple_file,
252 version => '1.23' }});
255 # Single file with same package appearing multiple times, conflicting versions
256 # Simple.pm => Simple v1.23
257 # Simple.pm => Simple v2.34
259 $dist->change_file( 'lib/Simple.pm', <<'---' );
265 $dist->regen( clean => 1 );
267 $err = stderr_of( sub { $mb = new_build() } );
268 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
270 {'Simple' => { file => $simple_file,
271 version => '1.23' }}); # XXX should be 2.34?
272 like( $err, qr/already declared/, ' with conflicting versions reported' );
275 # (Same as above three cases except with no corresponding package)
276 # Simple.pm => Foo v1.23
277 # Simple.pm => Foo v2.34
279 $dist->change_file( 'lib/Simple.pm', <<'---' );
285 $dist->regen( clean => 1 );
286 $err = stderr_of( sub { $mb = new_build() } );
287 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
289 {'Foo' => { file => $simple_file,
290 version => '1.23' }}); # XXX should be 2.34?
291 like( $err, qr/already declared/, ' with conflicting versions reported' );
295 ############################## Multiple Modules
297 # Multiple files with same package, no version
298 # Simple.pm => Simple
299 # Simple2.pm => Simple
301 $dist->change_file( 'lib/Simple.pm', <<'---' );
304 $dist->add_file( 'lib/Simple2.pm', <<'---' );
307 $dist->regen( clean => 1 );
309 is_deeply($mb->find_dist_packages,
310 {'Simple' => { file => $simple_file }});
311 $dist->remove_file( 'lib/Simple2.pm' );
314 # Multiple files with same package, single version in corresponding package
315 # Simple.pm => Simple v1.23
316 # Simple2.pm => Simple
318 $dist->change_file( 'lib/Simple.pm', <<'---' );
322 $dist->add_file( 'lib/Simple2.pm', <<'---' );
325 $dist->regen( clean => 1 );
327 is_deeply($mb->find_dist_packages,
328 {'Simple' => { file => $simple_file,
329 version => '1.23' }});
330 $dist->remove_file( 'lib/Simple2.pm' );
333 # Multiple files with same package,
334 # single version in non-corresponding package
335 # Simple.pm => Simple
336 # Simple2.pm => Simple v1.23
338 $dist->change_file( 'lib/Simple.pm', <<'---' );
341 $dist->add_file( 'lib/Simple2.pm', <<'---' );
345 $dist->regen( clean => 1 );
347 is_deeply($mb->find_dist_packages,
348 {'Simple' => { file => $simple2_file,
349 version => '1.23' }});
350 $dist->remove_file( 'lib/Simple2.pm' );
353 # Multiple files with same package, conflicting versions
354 # Simple.pm => Simple v1.23
355 # Simple2.pm => Simple v2.34
357 $dist->change_file( 'lib/Simple.pm', <<'---' );
361 $dist->add_file( 'lib/Simple2.pm', <<'---' );
365 $dist->regen( clean => 1 );
366 stderr_of( sub { $mb = new_build(); } );
367 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
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' );
376 # Multiple files with same package, multiple agreeing versions
377 # Simple.pm => Simple v1.23
378 # Simple2.pm => Simple v1.23
380 $dist->change_file( 'lib/Simple.pm', <<'---' );
384 $dist->add_file( 'lib/Simple2.pm', <<'---' );
388 $dist->regen( clean => 1 );
390 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
392 {'Simple' => { file => $simple_file,
393 version => '1.23' }});
394 $dist->remove_file( 'lib/Simple2.pm' );
397 ############################################################
399 # (Same as above five cases except with non-corresponding package)
402 # Multiple files with same package, no version
406 $dist->change_file( 'lib/Simple.pm', <<'---' );
409 $dist->add_file( 'lib/Simple2.pm', <<'---' );
412 $dist->regen( clean => 1 );
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' );
419 # Multiple files with same package, version in first file
420 # Simple.pm => Foo v1.23
423 $dist->change_file( 'lib/Simple.pm', <<'---' );
427 $dist->add_file( 'lib/Simple2.pm', <<'---' );
430 $dist->regen( clean => 1 );
432 is_deeply($mb->find_dist_packages,
433 {'Foo' => { file => $simple_file,
434 version => '1.23' }});
435 $dist->remove_file( 'lib/Simple2.pm' );
438 # Multiple files with same package, version in second file
440 # Simple2.pm => Foo v1.23
442 $dist->change_file( 'lib/Simple.pm', <<'---' );
445 $dist->add_file( 'lib/Simple2.pm', <<'---' );
449 $dist->regen( clean => 1 );
451 is_deeply($mb->find_dist_packages,
452 {'Foo' => { file => $simple2_file,
453 version => '1.23' }});
454 $dist->remove_file( 'lib/Simple2.pm' );
457 # Multiple files with same package, conflicting versions
458 # Simple.pm => Foo v1.23
459 # Simple2.pm => Foo v2.34
461 $dist->change_file( 'lib/Simple.pm', <<'---' );
465 $dist->add_file( 'lib/Simple2.pm', <<'---' );
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' );
479 # Multiple files with same package, multiple agreeing versions
480 # Simple.pm => Foo v1.23
481 # Simple2.pm => Foo v1.23
483 $dist->change_file( 'lib/Simple.pm', <<'---' );
487 $dist->add_file( 'lib/Simple2.pm', <<'---' );
491 $dist->regen( clean => 1 );
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' );
500 ############################################################
501 # Conflicts among primary & multiple alternatives
503 # multiple files, conflicting version in corresponding file
504 $dist->change_file( 'lib/Simple.pm', <<'---' );
508 $dist->add_file( 'lib/Simple2.pm', <<'---' );
512 $dist->add_file( 'lib/Simple3.pm', <<'---' );
516 $dist->regen( clean => 1 );
517 $err = stderr_of( sub {
520 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
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' );
529 # multiple files, conflicting version in non-corresponding file
530 $dist->change_file( 'lib/Simple.pm', <<'---' );
534 $dist->add_file( 'lib/Simple2.pm', <<'---' );
538 $dist->add_file( 'lib/Simple3.pm', <<'---' );
542 $dist->regen( clean => 1 );
543 $err = stderr_of( sub {
546 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
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' );
556 ############################################################
557 # Don't record private packages (beginning with underscore)
558 # Simple.pm => Simple::_private
559 # Simple.pm => Simple::_private::too
561 $dist->change_file( 'lib/Simple.pm', <<'---' );
564 package Simple::_private;
566 package Simple::_private::too;
569 $dist->regen( clean => 1 );
571 is_deeply($mb->find_dist_packages,
572 {'Simple' => { file => $simple_file,
573 version => '1.23' }});
576 ############################################################
577 # Files with no packages?
579 # Simple.pm => <empty>
581 $dist->change_file( 'lib/Simple.pm', '' );
582 $dist->regen( clean => 1 );
584 is_deeply( $mb->find_dist_packages, {} );
586 # Simple.pm => =pod..=cut (no package declaration)
587 $dist->change_file( 'lib/Simple.pm', <<'---' );
592 Simple - Pure Documentation
600 $dist->regen( clean => 1 );
602 is_deeply($mb->find_dist_packages, {});