summaryrefslogtreecommitdiff
path: root/cpan/Module-Build/t/metadata.t
diff options
context:
space:
mode:
Diffstat (limited to 'cpan/Module-Build/t/metadata.t')
-rw-r--r--cpan/Module-Build/t/metadata.t609
1 files changed, 609 insertions, 0 deletions
diff --git a/cpan/Module-Build/t/metadata.t b/cpan/Module-Build/t/metadata.t
new file mode 100644
index 0000000000..6f53c1d225
--- /dev/null
+++ b/cpan/Module-Build/t/metadata.t
@@ -0,0 +1,609 @@
+#!/usr/bin/perl -w
+
+use strict;
+use lib 't/lib';
+use MBTest tests => 53;
+
+use_ok 'Module::Build';
+ensure_blib('Module::Build');
+
+my $tmp = MBTest->tmpdir;
+
+use Module::Build::ConfigData;
+
+my %metadata =
+ (
+ module_name => 'Simple',
+ dist_version => '3.14159265',
+ dist_author => [ 'Simple Simon <ss\@somewhere.priv>' ],
+ dist_abstract => 'Something interesting',
+ license => 'perl',
+ meta_add => {
+ keywords => [qw(super duper something)],
+ resources => {homepage => 'http://foo.example.com'},
+ },
+ );
+
+
+use DistGen;
+my $dist = DistGen->new( dir => $tmp );
+$dist->change_build_pl( \%metadata );
+$dist->regen;
+
+my $simple_file = 'lib/Simple.pm';
+my $simple2_file = 'lib/Simple2.pm';
+
+ # Traditional VMS will return the file in in lower case, and is_deeply
+ # does exact case comparisons.
+ # When ODS-5 support is active for preserved case file names we do not
+ # change the case.
+ if ($^O eq 'VMS') {
+ my $lower_case_expect = 1;
+ my $vms_efs_case = 0;
+ if (eval 'require VMS::Feature') {
+ $vms_efs_case = VMS::Feature::current("efs_case_preserve");
+ } else {
+ my $efs_case = $ENV{'DECC$EFS_CASE_PRESERVE'} || '';
+ $vms_efs_case = $efs_case =~ /^[ET1]/i;
+ }
+ $lower_case_expect = 0 if $vms_efs_case;
+ if ($lower_case_expect) {
+ $simple_file = lc($simple_file);
+ $simple2_file = lc($simple2_file);
+ }
+ }
+
+
+$dist->chdir_in;
+
+use Module::Build;
+my $mb = Module::Build->new_from_context;
+
+##################################################
+#
+# Test for valid META.yml
+
+{
+ my $mb_prereq = { 'Module::Build' => $Module::Build::VERSION };
+ my $mb_config_req = {
+ 'Module::Build' => int($Module::Build::VERSION * 100)/100
+ };
+ my $node = $mb->prepare_metadata( {} );
+
+ # exists() doesn't seem to work here
+ is $node->{name}, $metadata{module_name};
+ is $node->{version}, $metadata{dist_version};
+ is $node->{abstract}, $metadata{dist_abstract};
+ is_deeply $node->{author}, $metadata{dist_author};
+ is $node->{license}, $metadata{license};
+ is_deeply $node->{configure_requires}, $mb_config_req, 'Add M::B to configure_requires';
+ like $node->{generated_by}, qr{Module::Build};
+ ok defined( $node->{'meta-spec'}{version} ),
+ "'meta-spec' -> 'version' field present in META.yml";
+ ok defined( $node->{'meta-spec'}{url} ),
+ "'meta-spec' -> 'url' field present in META.yml";
+ is_deeply $node->{keywords}, $metadata{meta_add}{keywords};
+ is_deeply $node->{resources}, $metadata{meta_add}{resources};
+}
+
+{
+ my $mb_prereq = { 'Module::Build' => 0 };
+ $mb->configure_requires( $mb_prereq );
+ my $node = $mb->prepare_metadata( {} );
+
+
+ # exists() doesn't seem to work here
+ is_deeply $node->{configure_requires}, $mb_prereq, 'Add M::B to configure_requires';
+}
+
+$dist->clean;
+
+
+##################################################
+#
+# Tests to ensure that the correct packages and versions are
+# recorded for the 'provides' field of META.yml
+
+my $provides; # Used a bunch of times below
+
+sub new_build { return Module::Build->new_from_context( quiet => 1, @_ ) }
+
+############################## Single Module
+
+# File with corresponding package (w/ or w/o version)
+# Simple.pm => Simple v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => {file => $simple_file,
+ version => '1.23'}});
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => {file => $simple_file}});
+
+# File with no corresponding package (w/ or w/o version)
+# Simple.pm => Foo::Bar v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo::Bar;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Foo::Bar' => { file => $simple_file,
+ version => '1.23' }});
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo::Bar;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Foo::Bar' => { file => $simple_file}});
+
+
+# Single file with multiple differing packages (w/ or w/o version)
+# Simple.pm => Simple
+# Simple.pm => Foo::Bar
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+package Foo::Bar;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' },
+ 'Foo::Bar' => { file => $simple_file,
+ version => '1.23' }});
+
+{
+ $dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = version->new('0.60.' . (qw$Revision: 128 $)[1]);
+package Simple::Simon;
+$VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
+---
+ $dist->regen;
+ my $provides = new_build()->prepare_metadata()->{provides};
+ is $provides->{'Simple'}{version}, 'v0.60.128', "Check version";
+ is $provides->{'Simple::Simon'}{version}, 'v0.61.129', "Check version";
+ is ref($provides->{'Simple'}{version}), '', "Versions from prepare_metadata() aren't refs";
+ is ref($provides->{'Simple::Simon'}{version}), '', "Versions from prepare_metadata() aren't refs";
+}
+
+
+# Single file with multiple differing packages, no corresponding package
+# Simple.pm => Foo
+# Simple.pm => Foo::Bar
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+package Foo::Bar;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Foo' => { file => $simple_file,
+ version => '1.23' },
+ 'Foo::Bar' => { file => $simple_file,
+ version => '1.23' }});
+
+
+# Single file with same package appearing multiple times, no version
+# only record a single instance
+# Simple.pm => Simple
+# Simple.pm => Simple
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+package Simple;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file }});
+
+
+# Single file with same package appearing multiple times, single
+# version 1st package:
+# Simple.pm => Simple v1.23
+# Simple.pm => Simple
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+package Simple;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+
+
+# Single file with same package appearing multiple times, single
+# version 2nd package
+# Simple.pm => Simple
+# Simple.pm => Simple v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+package Simple;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+
+
+# Single file with same package appearing multiple times, conflicting versions
+# Simple.pm => Simple v1.23
+# Simple.pm => Simple v2.34
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+package Simple;
+$VERSION = '2.34';
+---
+$dist->regen( clean => 1 );
+my $err = '';
+$err = stderr_of( sub { $mb = new_build() } );
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+is_deeply($provides,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }}); # XXX should be 2.34?
+like( $err, qr/already declared/, ' with conflicting versions reported' );
+
+
+# (Same as above three cases except with no corresponding package)
+# Simple.pm => Foo v1.23
+# Simple.pm => Foo v2.34
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+package Foo;
+$VERSION = '2.34';
+---
+$dist->regen( clean => 1 );
+$err = stderr_of( sub { $mb = new_build() } );
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+is_deeply($provides,
+ {'Foo' => { file => $simple_file,
+ version => '1.23' }}); # XXX should be 2.34?
+like( $err, qr/already declared/, ' with conflicting versions reported' );
+
+
+
+############################## Multiple Modules
+
+# Multiple files with same package, no version
+# Simple.pm => Simple
+# Simple2.pm => Simple
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file }});
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, single version in corresponding package
+# Simple.pm => Simple v1.23
+# Simple2.pm => Simple
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package,
+# single version in non-corresponding package
+# Simple.pm => Simple
+# Simple2.pm => Simple v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple2_file,
+ version => '1.23' }});
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, conflicting versions
+# Simple.pm => Simple v1.23
+# Simple2.pm => Simple v2.34
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+$VERSION = '2.34';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+is_deeply($provides,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+like( $err, qr/Found conflicting versions for package/,
+ ' with conflicting versions reported' );
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, multiple agreeing versions
+# Simple.pm => Simple v1.23
+# Simple2.pm => Simple v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+is_deeply($provides,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+############################################################
+#
+# (Same as above five cases except with non-corresponding package)
+#
+
+# Multiple files with same package, no version
+# Simple.pm => Foo
+# Simple2.pm => Foo
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Foo;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+$provides = $mb->find_dist_packages;
+ok( exists( $provides->{Foo} ) ); # it exist, can't predict which file
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, version in first file
+# Simple.pm => Foo v1.23
+# Simple2.pm => Foo
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Foo;
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Foo' => { file => $simple_file,
+ version => '1.23' }});
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, version in second file
+# Simple.pm => Foo
+# Simple2.pm => Foo v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Foo' => { file => $simple2_file,
+ version => '1.23' }});
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, conflicting versions
+# Simple.pm => Foo v1.23
+# Simple2.pm => Foo v2.34
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Foo;
+$VERSION = '2.34';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+# XXX Should 'Foo' exist ??? Can't predict values for file & version
+ok( exists( $provides->{Foo} ) );
+like( $err, qr/Found conflicting versions for package/,
+ ' with conflicting versions reported' );
+$dist->remove_file( 'lib/Simple2.pm' );
+
+
+# Multiple files with same package, multiple agreeing versions
+# Simple.pm => Foo v1.23
+# Simple2.pm => Foo v1.23
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Foo;
+$VERSION = '1.23';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+ok( exists( $provides->{Foo} ) );
+is( $provides->{Foo}{version}, '1.23' );
+ok( exists( $provides->{Foo}{file} ) ); # Can't predict which file
+is( $err, '', ' no conflicts reported' );
+$dist->remove_file( 'lib/Simple2.pm' );
+
+############################################################
+# Conflicts among primary & multiple alternatives
+
+# multiple files, conflicting version in corresponding file
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+$VERSION = '2.34';
+---
+$dist->add_file( 'lib/Simple3.pm', <<'---' );
+package Simple;
+$VERSION = '2.34';
+---
+$dist->regen( clean => 1 );
+$err = stderr_of( sub {
+ $mb = new_build();
+} );
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+is_deeply($provides,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+like( $err, qr/Found conflicting versions for package/,
+ ' corresponding package conflicts with multiple alternatives' );
+$dist->remove_file( 'lib/Simple2.pm' );
+$dist->remove_file( 'lib/Simple3.pm' );
+
+# multiple files, conflicting version in non-corresponding file
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple2.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+---
+$dist->add_file( 'lib/Simple3.pm', <<'---' );
+package Simple;
+$VERSION = '2.34';
+---
+$dist->regen( clean => 1 );
+$err = stderr_of( sub {
+ $mb = new_build();
+} );
+$err = stderr_of( sub { $provides = $mb->find_dist_packages } );
+is_deeply($provides,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+like( $err, qr/Found conflicting versions for package/,
+ ' only one alternative conflicts with corresponding package' );
+$dist->remove_file( 'lib/Simple2.pm' );
+$dist->remove_file( 'lib/Simple3.pm' );
+
+
+############################################################
+# Don't record private packages (beginning with underscore)
+# Simple.pm => Simple::_private
+# Simple.pm => Simple::_private::too
+
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+package Simple;
+$VERSION = '1.23';
+package Simple::_private;
+$VERSION = '2.34';
+package Simple::_private::too;
+$VERSION = '3.45';
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages,
+ {'Simple' => { file => $simple_file,
+ version => '1.23' }});
+
+
+############################################################
+# Files with no packages?
+
+# Simple.pm => <empty>
+
+$dist->change_file( 'lib/Simple.pm', '' );
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply( $mb->find_dist_packages, {} );
+
+# Simple.pm => =pod..=cut (no package declaration)
+$dist->change_file( 'lib/Simple.pm', <<'---' );
+=pod
+
+=head1 NAME
+
+Simple - Pure Documentation
+
+=head1 DESCRIPTION
+
+Doesn't do anything.
+
+=cut
+---
+$dist->regen( clean => 1 );
+$mb = new_build();
+is_deeply($mb->find_dist_packages, {});
+
+############################################################
+# cleanup
+$dist->remove;