4 use lib $ENV{PERL_CORE} ? '../lib/Module/Build/t/lib' : 't/lib';
5 use MBTest tests => 47;
9 my $tmp = File::Spec->catdir( $cwd, 't', '_tmp' );
13 use Module::Build::ConfigData;
14 my $has_YAML = Module::Build::ConfigData->feature('YAML_support');
18 my $dist = DistGen->new( dir => $tmp );
19 $dist->change_file( 'Build.PL', <<"---" );
21 my \$builder = Module::Build->new(
22 module_name => '@{[$dist->name]}',
23 dist_version => '3.14159265',
24 dist_author => [ 'Simple Simon <ss\@somewhere.priv>' ],
25 dist_abstract => 'Something interesting',
29 \$builder->create_build_script();
33 chdir( $dist->dirname ) or die "Can't chdir to '@{[$dist->dirname]}': $!";
36 my $mb = Module::Build->new_from_context;
38 ##################################################
40 # Test for valid META.yml
43 skip( 'YAML_support feature is not enabled', 8 ) unless $has_YAML;
47 my $node = YAML::Node->new({});
48 $node = $mb->prepare_metadata( $node );
50 # exists() doesn't seem to work here
51 ok defined( $node->{name} ), "'name' field present in META.yml";
52 ok defined( $node->{version} ), "'version' field present in META.yml";
53 ok defined( $node->{abstract} ), "'abstract' field present in META.yml";
54 ok defined( $node->{author} ), "'author' field present in META.yml";
55 ok defined( $node->{license} ), "'license' field present in META.yml";
56 ok defined( $node->{generated_by} ),
57 "'generated_by' field present in META.yml";
58 ok defined( $node->{'meta-spec'}{version} ),
59 "'meta-spec' -> 'version' field present in META.yml";
60 ok defined( $node->{'meta-spec'}{url} ),
61 "'meta-spec' -> 'url' field present in META.yml";
63 # TODO : find a way to test for failure when above fields are not present
69 ##################################################
71 # Tests to ensure that the correct packages and versions are
72 # recorded for the 'provides' field of META.yml
74 my $provides; # Used a bunch of times below
76 sub new_build { return Module::Build->new_from_context( quiet => 1, @_ ) }
78 ############################## Single Module
80 # File with corresponding package (w/ or w/o version)
81 # Simple.pm => Simple v1.23
83 $dist->change_file( 'lib/Simple.pm', <<'---' );
87 $dist->regen( clean => 1 );
89 is_deeply($mb->find_dist_packages,
90 {'Simple' => {file => 'lib/Simple.pm',
93 $dist->change_file( 'lib/Simple.pm', <<'---' );
96 $dist->regen( clean => 1 );
98 is_deeply($mb->find_dist_packages,
99 {'Simple' => {file => 'lib/Simple.pm'}});
101 # File with no corresponding package (w/ or w/o version)
102 # Simple.pm => Foo::Bar v1.23
104 $dist->change_file( 'lib/Simple.pm', <<'---' );
108 $dist->regen( clean => 1 );
110 is_deeply($mb->find_dist_packages,
111 {'Foo::Bar' => { file => 'lib/Simple.pm',
112 version => '1.23' }});
114 $dist->change_file( 'lib/Simple.pm', <<'---' );
117 $dist->regen( clean => 1 );
119 is_deeply($mb->find_dist_packages,
120 {'Foo::Bar' => { file => 'lib/Simple.pm'}});
123 # Single file with multiple differing packages (w/ or w/o version)
124 # Simple.pm => Simple
125 # Simple.pm => Foo::Bar
127 $dist->change_file( 'lib/Simple.pm', <<'---' );
133 $dist->regen( clean => 1 );
135 is_deeply($mb->find_dist_packages,
136 {'Simple' => { file => 'lib/Simple.pm',
138 'Foo::Bar' => { file => 'lib/Simple.pm',
139 version => '1.23' }});
142 $dist->change_file( 'lib/Simple.pm', <<'---' );
144 $VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
145 package Simple::Simon;
146 $VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
149 my $provides = new_build()->prepare_metadata()->{provides};
150 is $provides->{'Simple'}{version}, '0.60.128', "Check version";
151 is $provides->{'Simple::Simon'}{version}, '0.61.129', "Check version";
152 is ref($provides->{'Simple'}{version}), '', "Versions from prepare_metadata() aren't refs";
153 is ref($provides->{'Simple::Simon'}{version}), '', "Versions from prepare_metadata() aren't refs";
157 # Single file with multiple differing packages, no corresponding package
159 # Simple.pm => Foo::Bar
161 $dist->change_file( 'lib/Simple.pm', <<'---' );
167 $dist->regen( clean => 1 );
169 is_deeply($mb->find_dist_packages,
170 {'Foo' => { file => 'lib/Simple.pm',
172 'Foo::Bar' => { file => 'lib/Simple.pm',
173 version => '1.23' }});
176 # Single file with same package appearing multiple times, no version
177 # only record a single instance
178 # Simple.pm => Simple
179 # Simple.pm => Simple
181 $dist->change_file( 'lib/Simple.pm', <<'---' );
185 $dist->regen( clean => 1 );
187 is_deeply($mb->find_dist_packages,
188 {'Simple' => { file => 'lib/Simple.pm' }});
191 # Single file with same package appearing multiple times, single
192 # version 1st package:
193 # Simple.pm => Simple v1.23
194 # Simple.pm => Simple
196 $dist->change_file( 'lib/Simple.pm', <<'---' );
201 $dist->regen( clean => 1 );
203 is_deeply($mb->find_dist_packages,
204 {'Simple' => { file => 'lib/Simple.pm',
205 version => '1.23' }});
208 # Single file with same package appearing multiple times, single
209 # version 2nd package
210 # Simple.pm => Simple
211 # Simple.pm => Simple v1.23
213 $dist->change_file( 'lib/Simple.pm', <<'---' );
218 $dist->regen( clean => 1 );
220 is_deeply($mb->find_dist_packages,
221 {'Simple' => { file => 'lib/Simple.pm',
222 version => '1.23' }});
225 # Single file with same package appearing multiple times, conflicting versions
226 # Simple.pm => Simple v1.23
227 # Simple.pm => Simple v2.34
229 $dist->change_file( 'lib/Simple.pm', <<'---' );
235 $dist->regen( clean => 1 );
237 $err = stderr_of( sub { $mb = new_build() } );
238 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
240 {'Simple' => { file => 'lib/Simple.pm',
241 version => '1.23' }}); # XXX should be 2.34?
242 like( $err, qr/already declared/, ' with conflicting versions reported' );
245 # (Same as above three cases except with no corresponding package)
246 # Simple.pm => Foo v1.23
247 # Simple.pm => Foo v2.34
249 $dist->change_file( 'lib/Simple.pm', <<'---' );
255 $dist->regen( clean => 1 );
256 $err = stderr_of( sub { $mb = new_build() } );
257 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
259 {'Foo' => { file => 'lib/Simple.pm',
260 version => '1.23' }}); # XXX should be 2.34?
261 like( $err, qr/already declared/, ' with conflicting versions reported' );
265 ############################## Multiple Modules
267 # Multiple files with same package, no version
268 # Simple.pm => Simple
269 # Simple2.pm => Simple
271 $dist->change_file( 'lib/Simple.pm', <<'---' );
274 $dist->add_file( 'lib/Simple2.pm', <<'---' );
277 $dist->regen( clean => 1 );
279 is_deeply($mb->find_dist_packages,
280 {'Simple' => { file => 'lib/Simple.pm' }});
281 $dist->remove_file( 'lib/Simple2.pm' );
284 # Multiple files with same package, single version in corresponding package
285 # Simple.pm => Simple v1.23
286 # Simple2.pm => Simple
288 $dist->change_file( 'lib/Simple.pm', <<'---' );
292 $dist->add_file( 'lib/Simple2.pm', <<'---' );
295 $dist->regen( clean => 1 );
297 is_deeply($mb->find_dist_packages,
298 {'Simple' => { file => 'lib/Simple.pm',
299 version => '1.23' }});
300 $dist->remove_file( 'lib/Simple2.pm' );
303 # Multiple files with same package,
304 # single version in non-corresponding package
305 # Simple.pm => Simple
306 # Simple2.pm => Simple v1.23
308 $dist->change_file( 'lib/Simple.pm', <<'---' );
311 $dist->add_file( 'lib/Simple2.pm', <<'---' );
315 $dist->regen( clean => 1 );
317 is_deeply($mb->find_dist_packages,
318 {'Simple' => { file => 'lib/Simple2.pm',
319 version => '1.23' }});
320 $dist->remove_file( 'lib/Simple2.pm' );
323 # Multiple files with same package, conflicting versions
324 # Simple.pm => Simple v1.23
325 # Simple2.pm => Simple v2.34
327 $dist->change_file( 'lib/Simple.pm', <<'---' );
331 $dist->add_file( 'lib/Simple2.pm', <<'---' );
335 $dist->regen( clean => 1 );
337 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
339 {'Simple' => { file => 'lib/Simple.pm',
340 version => '1.23' }});
341 like( $err, qr/Found conflicting versions for package/,
342 ' with conflicting versions reported' );
343 $dist->remove_file( 'lib/Simple2.pm' );
346 # Multiple files with same package, multiple agreeing versions
347 # Simple.pm => Simple v1.23
348 # Simple2.pm => Simple v1.23
350 $dist->change_file( 'lib/Simple.pm', <<'---' );
354 $dist->add_file( 'lib/Simple2.pm', <<'---' );
358 $dist->regen( clean => 1 );
360 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
362 {'Simple' => { file => 'lib/Simple.pm',
363 version => '1.23' }});
364 $dist->remove_file( 'lib/Simple2.pm' );
367 ############################################################
369 # (Same as above five cases except with non-corresponding package)
372 # Multiple files with same package, no version
376 $dist->change_file( 'lib/Simple.pm', <<'---' );
379 $dist->add_file( 'lib/Simple2.pm', <<'---' );
382 $dist->regen( clean => 1 );
384 $provides = $mb->find_dist_packages;
385 ok( exists( $provides->{Foo} ) ); # it exist, can't predict which file
386 $dist->remove_file( 'lib/Simple2.pm' );
389 # Multiple files with same package, version in first file
390 # Simple.pm => Foo v1.23
393 $dist->change_file( 'lib/Simple.pm', <<'---' );
397 $dist->add_file( 'lib/Simple2.pm', <<'---' );
400 $dist->regen( clean => 1 );
402 is_deeply($mb->find_dist_packages,
403 {'Foo' => { file => 'lib/Simple.pm',
404 version => '1.23' }});
405 $dist->remove_file( 'lib/Simple2.pm' );
408 # Multiple files with same package, version in second file
410 # Simple2.pm => Foo v1.23
412 $dist->change_file( 'lib/Simple.pm', <<'---' );
415 $dist->add_file( 'lib/Simple2.pm', <<'---' );
419 $dist->regen( clean => 1 );
421 is_deeply($mb->find_dist_packages,
422 {'Foo' => { file => 'lib/Simple2.pm',
423 version => '1.23' }});
424 $dist->remove_file( 'lib/Simple2.pm' );
427 # Multiple files with same package, conflicting versions
428 # Simple.pm => Foo v1.23
429 # Simple2.pm => Foo v2.34
431 $dist->change_file( 'lib/Simple.pm', <<'---' );
435 $dist->add_file( 'lib/Simple2.pm', <<'---' );
439 $dist->regen( clean => 1 );
441 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
442 # XXX Should 'Foo' exist ??? Can't predict values for file & version
443 ok( exists( $provides->{Foo} ) );
444 like( $err, qr/Found conflicting versions for package/,
445 ' with conflicting versions reported' );
446 $dist->remove_file( 'lib/Simple2.pm' );
449 # Multiple files with same package, multiple agreeing versions
450 # Simple.pm => Foo v1.23
451 # Simple2.pm => Foo v1.23
453 $dist->change_file( 'lib/Simple.pm', <<'---' );
457 $dist->add_file( 'lib/Simple2.pm', <<'---' );
461 $dist->regen( clean => 1 );
463 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
464 ok( exists( $provides->{Foo} ) );
465 is( $provides->{Foo}{version}, '1.23' );
466 ok( exists( $provides->{Foo}{file} ) ); # Can't predict which file
467 is( $err, '', ' no conflicts reported' );
468 $dist->remove_file( 'lib/Simple2.pm' );
470 ############################################################
471 # Conflicts among primary & multiple alternatives
473 # multiple files, conflicting version in corresponding file
474 $dist->change_file( 'lib/Simple.pm', <<'---' );
478 $dist->add_file( 'lib/Simple2.pm', <<'---' );
482 $dist->add_file( 'lib/Simple3.pm', <<'---' );
486 $dist->regen( clean => 1 );
487 $err = stderr_of( sub {
490 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
492 {'Simple' => { file => 'lib/Simple.pm',
493 version => '1.23' }});
494 like( $err, qr/Found conflicting versions for package/,
495 ' corresponding package conflicts with multiple alternatives' );
496 $dist->remove_file( 'lib/Simple2.pm' );
497 $dist->remove_file( 'lib/Simple3.pm' );
499 # multiple files, conflicting version in non-corresponding file
500 $dist->change_file( 'lib/Simple.pm', <<'---' );
504 $dist->add_file( 'lib/Simple2.pm', <<'---' );
508 $dist->add_file( 'lib/Simple3.pm', <<'---' );
512 $dist->regen( clean => 1 );
513 $err = stderr_of( sub {
516 $err = stderr_of( sub { $provides = $mb->find_dist_packages } );
518 {'Simple' => { file => 'lib/Simple.pm',
519 version => '1.23' }});
520 like( $err, qr/Found conflicting versions for package/,
521 ' only one alternative conflicts with corresponding package' );
522 $dist->remove_file( 'lib/Simple2.pm' );
523 $dist->remove_file( 'lib/Simple3.pm' );
526 ############################################################
527 # Don't record private packages (beginning with underscore)
528 # Simple.pm => Simple::_private
529 # Simple.pm => Simple::_private::too
531 $dist->change_file( 'lib/Simple.pm', <<'---' );
534 package Simple::_private;
536 package Simple::_private::too;
539 $dist->regen( clean => 1 );
541 is_deeply($mb->find_dist_packages,
542 {'Simple' => { file => 'lib/Simple.pm',
543 version => '1.23' }});
546 ############################################################
547 # Files with no packages?
549 # Simple.pm => <empty>
551 $dist->change_file( 'lib/Simple.pm', '' );
552 $dist->regen( clean => 1 );
554 is_deeply( $mb->find_dist_packages, {} );
556 # Simple.pm => =pod..=cut (no package declaration)
557 $dist->change_file( 'lib/Simple.pm', <<'---' );
562 Simple - Pure Documentation
570 $dist->regen( clean => 1 );
572 is_deeply($mb->find_dist_packages, {});
574 ############################################################
576 chdir( $cwd ) or die "Can't chdir to '$cwd': $!";