goodbye DistGen.pm and MBTest.pm!
[p5sagit/Module-Metadata.git] / t / metadata.t
index b93cefb..f214651 100644 (file)
@@ -3,14 +3,19 @@
 # vim:ts=8:sw=2:et:sta:sts=2
 
 use strict;
-use lib 't/lib';
+use warnings;
+use Test::More;
 use IO::File;
-use MBTest;
+use File::Spec;
+use File::Temp;
+use File::Basename;
+use Cwd ();
+use File::Path;
 
 my $undef;
 
 # parse various module $VERSION lines
-# these will be reversed later to create %modules
+# format: expected version => code snippet
 my @modules = (
   $undef => <<'---', # no $VERSION line
 package Simple;
@@ -28,6 +33,15 @@ package Simple;
 our $VERSION;
 $VERSION = '1.23';
 ---
+  '1.23' => <<'---', # commented & defined on same line
+package Simple;
+our $VERSION = '1.23'; # our $VERSION = '4.56';
+---
+  '1.23' => <<'---', # commented & defined on separate lines
+package Simple;
+# our $VERSION = '4.56';
+our $VERSION = '1.23';
+---
   '1.23' => <<'---', # use vars
 package Simple;
 use vars qw( $VERSION );
@@ -200,70 +214,175 @@ package Simple v1.2.3_4 {
   1;
 }
 ---
+  '0' => <<'---', # set from separately-initialised variable
+package Simple;
+  our $CVSVERSION   = '$Revision: 1.7 $';
+  our ($VERSION)    = ($CVSVERSION =~ /(\d+\.\d+)/);
+}
+---
 );
-my %modules = reverse @modules;
 
-plan tests => 42 + 2 * keys( %modules );
+# format: expected package name => code snippet
+my @pkg_names = (
+  [ 'Simple' ] => <<'---', # package NAME
+package Simple;
+---
+  [ 'Simple::Edward' ] => <<'---', # package NAME::SUBNAME
+package Simple::Edward;
+---
+  [ 'Simple::Edward::' ] => <<'---', # package NAME::SUBNAME::
+package Simple::Edward::;
+---
+  [ "Simple'Edward" ] => <<'---', # package NAME'SUBNAME
+package Simple'Edward;
+---
+  [ "Simple'Edward::" ] => <<'---', # package NAME'SUBNAME::
+package Simple'Edward::;
+---
+  [ 'Simple::::Edward' ] => <<'---', # package NAME::::SUBNAME
+package Simple::::Edward;
+---
+  [ '::Simple::Edward' ] => <<'---', # package ::NAME::SUBNAME
+package ::Simple::Edward;
+---
+  [ 'main' ] => <<'---', # package NAME:SUBNAME (fail)
+package Simple:Edward;
+---
+  [ 'main' ] => <<'---', # package NAME' (fail)
+package Simple';
+---
+  [ 'main' ] => <<'---', # package NAME::SUBNAME' (fail)
+package Simple::Edward';
+---
+  [ 'main' ] => <<'---', # package NAME''SUBNAME (fail)
+package Simple''Edward;
+---
+  [ 'main' ] => <<'---', # package NAME-SUBNAME (fail)
+package Simple-Edward;
+---
+);
+
+# 2 tests per each pair of @modules, @pkg_names entry
+plan tests => 63 + ( @modules ) + ( @pkg_names );
 
 require_ok('Module::Metadata');
 
-# class method C<find_module_by_name>
-my $module = Module::Metadata->find_module_by_name(
-               'Module::Metadata' );
-ok( -e $module, 'find_module_by_name() succeeds' );
+{
+    # class method C<find_module_by_name>
+    my $module = Module::Metadata->find_module_by_name(
+                   'Module::Metadata' );
+    ok( -e $module, 'find_module_by_name() succeeds' );
+}
 
 #########################
 
-my $tmp = MBTest->tmpdir;
-
-use DistGen;
-my $dist = DistGen->new( dir => $tmp );
-$dist->regen;
-
-$dist->chdir_in;
+BEGIN {
+  my $cwd = File::Spec->rel2abs(Cwd::cwd);
+  sub original_cwd { return $cwd }
+}
 
+# Setup a temp directory
+sub tmpdir {
+  my (@args) = @_;
+  my $dir = $ENV{PERL_CORE} ? original_cwd : File::Spec->tmpdir;
+  return File::Temp::tempdir('MMD-XXXXXXXX', CLEANUP => 0, DIR => $dir, @args);
+}
 
-# fail on invalid module name
-my $pm_info = Module::Metadata->new_from_module(
-               'Foo::Bar', inc => [] );
-ok( !defined( $pm_info ), 'fail if can\'t find module by module name' );
+my $tmp;
+BEGIN { $tmp = tmpdir; diag "using temp dir $tmp"; }
 
+END {
+  die "tests failed; leaving temp dir $tmp behind"
+    if $ENV{AUTHOR_TESTING} and not Test::Builder->new->is_passing;
+  diag "removing temp dir $tmp";
+  chdir original_cwd;
+  File::Path::remove_tree($tmp);
+}
 
-# fail on invalid filename
-my $file = File::Spec->catfile( 'Foo', 'Bar.pm' );
-$pm_info = Module::Metadata->new_from_file( $file, inc => [] );
-ok( !defined( $pm_info ), 'fail if can\'t find module by file name' );
+# generates a new distribution:
+# files => { relative filename => $content ... }
+# returns the name of the distribution (not including version),
+# and the absolute path name to the dist.
+{
+  my $test_num = 0;
+  sub new_dist {
+    my %opts = @_;
+
+    my $distname = 'Simple' . $test_num++;
+    my $distdir = File::Spec->catdir($tmp, $distname);
+    note "using dist $distname in $distdir";
+
+    File::Path::mkpath($distdir) or die "failed to create '$distdir'";
+
+    foreach my $rel_filename (keys %{$opts{files}})
+    {
+      my $abs_filename = File::Spec->catfile($distdir, $rel_filename);
+      my $dirname = File::Basename::dirname($abs_filename);
+      unless (-d $dirname) {
+        File::Path::mkpath($dirname) or die "Can't create '$dirname'";
+      }
+
+      note "creating $abs_filename";
+      my $fh = IO::File->new(">$abs_filename") or die "Can't write '$abs_filename'\n";
+      print $fh $opts{files}{$rel_filename};
+      close $fh;
+    }
 
+    chdir $distdir;
+    return ($distname, $distdir);
+  }
+}
 
-# construct from module filename
-$file = File::Spec->catfile( 'lib', split( /::/, $dist->name ) ) . '.pm';
-$pm_info = Module::Metadata->new_from_file( $file );
-ok( defined( $pm_info ), 'new_from_file() succeeds' );
+{
+  # fail on invalid module name
+  my $pm_info = Module::Metadata->new_from_module(
+                  'Foo::Bar', inc => [] );
+  ok( !defined( $pm_info ), 'fail if can\'t find module by module name' );
+}
 
-# construct from filehandle
-my $handle = IO::File->new($file);
-$pm_info = Module::Metadata->new_from_handle( $handle, $file );
-ok( defined( $pm_info ), 'new_from_handle() succeeds' );
-$pm_info = Module::Metadata->new_from_handle( $handle );
-is( $pm_info, undef, "new_from_handle() without filename returns undef" );
+{
+  # fail on invalid filename
+  my $file = File::Spec->catfile( 'Foo', 'Bar.pm' );
+  my $pm_info = Module::Metadata->new_from_file( $file, inc => [] );
+  ok( !defined( $pm_info ), 'fail if can\'t find module by file name' );
+}
 
+{
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => "package Simple;\n" });
+
+  # construct from module filename
+  my $pm_info = Module::Metadata->new_from_file( $file );
+  ok( defined( $pm_info ), 'new_from_file() succeeds' );
+
+  # construct from filehandle
+  my $handle = IO::File->new($file);
+  $pm_info = Module::Metadata->new_from_handle( $handle, $file );
+  ok( defined( $pm_info ), 'new_from_handle() succeeds' );
+  $pm_info = Module::Metadata->new_from_handle( $handle );
+  is( $pm_info, undef, "new_from_handle() without filename returns undef" );
+  close($handle);
+}
 
-# construct from module name, using custom include path
-$pm_info = Module::Metadata->new_from_module(
-            $dist->name, inc => [ 'lib', @INC ] );
-ok( defined( $pm_info ), 'new_from_module() succeeds' );
+{
+  # construct from module name, using custom include path
+  my $pm_info = Module::Metadata->new_from_module(
+               'Simple', inc => [ 'lib', @INC ] );
+  ok( defined( $pm_info ), 'new_from_module() succeeds' );
+}
 
 
-foreach my $module ( sort keys %modules ) {
-    my $expected = $modules{$module};
+# iterate through @modules pairwise
+my $test_case = 0;
+while (++$test_case and my ($expected_version, $code) = splice @modules, 0, 2 ) {
  SKIP: {
     skip( "No our() support until perl 5.6", 2 )
-        if $] < 5.006 && $module =~ /\bour\b/;
+        if $] < 5.006 && $code =~ /\bour\b/;
     skip( "No package NAME VERSION support until perl 5.11.1", 2 )
-        if $] < 5.011001 && $module =~ /package\s+[\w\:\']+\s+v?[0-9._]+/;
+        if $] < 5.011001 && $code =~ /package\s+[\w\:\']+\s+v?[0-9._]+/;
 
-    $dist->change_file( 'lib/Simple.pm', $module );
-    $dist->regen;
+    my $file = File::Spec->catfile('lib', 'Simple.pm');
+    my ($dist_name, $dist_dir) = new_dist(files => { $file => $code });
 
     my $warnings = '';
     local $SIG{__WARN__} = sub { $warnings .= $_ for @_ };
@@ -272,25 +391,44 @@ foreach my $module ( sort keys %modules ) {
     # Test::Builder will prematurely numify objects, so use this form
     my $errs;
     my $got = $pm_info->version;
-    if ( defined $expected ) {
-        ok( $got eq $expected,
-            "correct module version (expected '$expected')" )
-            or $errs++;
-    } else {
-        ok( !defined($got),
-            "correct module version (expected undef)" )
-            or $errs++;
-    }
-    is( $warnings, '', 'no warnings from parsing' ) or $errs++;
-    diag "Got: '$got'\nModule contents:\n$module" if $errs;
+
+    is(
+      $got,
+      $expected_version,
+      "case $test_case: correct module version ("
+        . (defined $expected_version? "'$expected_version'" : 'undef')
+        . ')'
+    )
+    or $errs++;
+
+    is( $warnings, '', "case $test_case: no warnings from parsing" ) or $errs++;
+    diag "Got: '$got'\nModule contents:\n$code" if $errs;
   }
 }
 
-# revert to pristine state
-$dist->regen( clean => 1 );
+$test_case = 0;
+while (++$test_case and my ($expected_name, $code) = splice @pkg_names, 0, 2) {
+    my $file = File::Spec->catfile('lib', 'Simple.pm');
+    my ($dist_name, $dist_dir) = new_dist(files => { $file => $code });
 
-# Find each package only once
-$dist->change_file( 'lib/Simple.pm', <<'---' );
+    my $warnings = '';
+    local $SIG{__WARN__} = sub { $warnings .= $_ for @_ };
+    my $pm_info = Module::Metadata->new_from_file( $file );
+
+    # Test::Builder will prematurely numify objects, so use this form
+    my $errs;
+    my @got = $pm_info->packages_inside();
+    is_deeply( \@got, $expected_name,
+               "case $test_case: correct package names (expected '" . join(', ', @$expected_name) . "')" )
+            or $errs++;
+    is( $warnings, '', "case $test_case: no warnings from parsing" ) or $errs++;
+    diag "Got: '" . join(', ', @got) . "'\nModule contents:\n$code" if $errs;
+}
+
+{
+  # Find each package only once
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 package Simple;
 $VERSION = '1.23';
 package Error::Simple;
@@ -298,50 +436,49 @@ $VERSION = '2.34';
 package Simple;
 ---
 
-$dist->regen;
-
-$pm_info = Module::Metadata->new_from_file( $file );
-
-my @packages = $pm_info->packages_inside;
-is( @packages, 2, 'record only one occurence of each package' );
+  my $pm_info = Module::Metadata->new_from_file( $file );
 
+  my @packages = $pm_info->packages_inside;
+  is( @packages, 2, 'record only one occurence of each package' );
+}
 
-# Module 'Simple.pm' does not contain package 'Simple';
-# constructor should not complain, no default module name or version
-$dist->change_file( 'lib/Simple.pm', <<'---' );
+{
+  # Module 'Simple.pm' does not contain package 'Simple';
+  # constructor should not complain, no default module name or version
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 package Simple::Not;
 $VERSION = '1.23';
 ---
 
-$dist->regen;
-$pm_info = Module::Metadata->new_from_file( $file );
+  my $pm_info = Module::Metadata->new_from_file( $file );
 
-is( $pm_info->name, undef, 'no default package' );
-is( $pm_info->version, undef, 'no version w/o default package' );
+  is( $pm_info->name, undef, 'no default package' );
+  is( $pm_info->version, undef, 'no version w/o default package' );
+}
 
-# Module 'Simple.pm' contains an alpha version
-# constructor should report first $VERSION found
-$dist->change_file( 'lib/Simple.pm', <<'---' );
+{
+  # Module 'Simple.pm' contains an alpha version
+  # constructor should report first $VERSION found
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 package Simple;
 $VERSION = '1.23_01';
 $VERSION = eval $VERSION;
 ---
 
-$dist->regen;
-$pm_info = Module::Metadata->new_from_file( $file );
-
-is( $pm_info->version, '1.23_01', 'alpha version reported');
+  my $pm_info = Module::Metadata->new_from_file( $file );
 
-# NOTE the following test has be done this way because Test::Builder is
-# too smart for our own good and tries to see if the version object is a
-# dual-var, which breaks with alpha versions:
-#    Argument "1.23_0100" isn't numeric in addition (+) at
-#    /usr/lib/perl5/5.8.7/Test/Builder.pm line 505.
+  is( $pm_info->version, '1.23_01', 'alpha version reported');
 
-ok( $pm_info->version > 1.23, 'alpha version greater than non');
+  # NOTE the following test has be done this way because Test::Builder is
+  # too smart for our own good and tries to see if the version object is a
+  # dual-var, which breaks with alpha versions:
+  #    Argument "1.23_0100" isn't numeric in addition (+) at
+  #    /usr/lib/perl5/5.8.7/Test/Builder.pm line 505.
 
-# revert to pristine state
-$dist->regen( clean => 1 );
+  ok( $pm_info->version > 1.23, 'alpha version greater than non');
+}
 
 # parse $VERSION lines scripts for package main
 my @scripts = (
@@ -395,18 +532,18 @@ $::VERSION = 0.01;
 
 my ( $i, $n ) = ( 1, scalar( @scripts ) );
 foreach my $script ( @scripts ) {
-  $dist->change_file( 'bin/simple.plx', $script );
-  $dist->regen;
-  $pm_info = Module::Metadata->new_from_file(
-              File::Spec->catfile( 'bin', 'simple.plx' ) );
+  my $file = File::Spec->catfile('bin', 'simple.plx');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => $script } );
+  my $pm_info = Module::Metadata->new_from_file( $file );
 
   is( $pm_info->version, '0.01', "correct script version ($i of $n)" );
   $i++;
 }
 
-
-# examine properties of a module: name, pod, etc
-$dist->change_file( 'lib/Simple.pm', <<'---' );
+{
+  # examine properties of a module: name, pod, etc
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 package Simple;
 $VERSION = '0.01';
 package Simple::Ex;
@@ -420,56 +557,104 @@ Simple - It's easy.
 
 Simple Simon
 
+You can find me on the IRC channel
+#simon on irc.perl.org.
+
 =cut
 ---
-$dist->regen;
 
-$pm_info = Module::Metadata->new_from_module(
-             $dist->name, inc => [ 'lib', @INC ] );
+  my $pm_info = Module::Metadata->new_from_module(
+             'Simple', inc => [ 'lib', @INC ] );
+
+  is( $pm_info->name, 'Simple', 'found default package' );
+  is( $pm_info->version, '0.01', 'version for default package' );
 
-is( $pm_info->name, 'Simple', 'found default package' );
-is( $pm_info->version, '0.01', 'version for default package' );
+  # got correct version for secondary package
+  is( $pm_info->version( 'Simple::Ex' ), '0.02',
+      'version for secondary package' );
 
-# got correct version for secondary package
-is( $pm_info->version( 'Simple::Ex' ), '0.02',
-    'version for secondary package' );
+  my $filename = $pm_info->filename;
+  ok( defined( $filename ) && -e $filename,
+      'filename() returns valid path to module file' );
 
-my $filename = $pm_info->filename;
-ok( defined( $filename ) && -e $filename,
-    'filename() returns valid path to module file' );
+  my @packages = $pm_info->packages_inside;
+  is( @packages, 2, 'found correct number of packages' );
+  is( $packages[0], 'Simple', 'packages stored in order found' );
 
-@packages = $pm_info->packages_inside;
-is( @packages, 2, 'found correct number of packages' );
-is( $packages[0], 'Simple', 'packages stored in order found' );
+  # we can detect presence of pod regardless of whether we are collecting it
+  ok( $pm_info->contains_pod, 'contains_pod() succeeds' );
 
-# we can detect presence of pod regardless of whether we are collecting it
-ok( $pm_info->contains_pod, 'contains_pod() succeeds' );
+  my @pod = $pm_info->pod_inside;
+  is_deeply( \@pod, [qw(NAME AUTHOR)], 'found all pod sections' );
 
-my @pod = $pm_info->pod_inside;
-is_deeply( \@pod, [qw(NAME AUTHOR)], 'found all pod sections' );
+  is( $pm_info->pod('NONE') , undef,
+      'return undef() if pod section not present' );
 
-is( $pm_info->pod('NONE') , undef,
-    'return undef() if pod section not present' );
+  is( $pm_info->pod('NAME'), undef,
+      'return undef() if pod section not collected' );
 
-is( $pm_info->pod('NAME'), undef,
-    'return undef() if pod section not collected' );
 
+  # collect_pod
+  $pm_info = Module::Metadata->new_from_module(
+               'Simple', inc => [ 'lib', @INC ], collect_pod => 1 );
 
-# collect_pod
-$pm_info = Module::Metadata->new_from_module(
-             $dist->name, inc => [ 'lib', @INC ], collect_pod => 1 );
+  my %pod;
+  for my $section (qw(NAME AUTHOR)) {
+    my $content = $pm_info->pod( $section );
+    if ( $content ) {
+      $content =~ s/^\s+//;
+      $content =~ s/\s+$//;
+    }
+    $pod{$section} = $content;
+  }
+  my %expected = (
+    NAME   => q|Simple - It's easy.|,
+    AUTHOR => <<'EXPECTED'
+Simple Simon
 
-my $name = $pm_info->pod('NAME');
-if ( $name ) {
-  $name =~ s/^\s+//;
-  $name =~ s/\s+$//;
+You can find me on the IRC channel
+#simon on irc.perl.org.
+EXPECTED
+  );
+  for my $text (values %expected) {
+    $text =~ s/^\s+//;
+    $text =~ s/\s+$//;
+  }
+  is( $pod{NAME},   $expected{NAME},   'collected NAME pod section' );
+  is( $pod{AUTHOR}, $expected{AUTHOR}, 'collected AUTHOR pod section' );
 }
-is( $name, q|Simple - It's easy.|, 'collected pod section' );
 
+{
+  # test things that look like POD, but aren't
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
+package Simple;
+
+=YES THIS STARTS POD
+
+our $VERSION = '999';
+
+=cute
+
+our $VERSION = '666';
+
+=cut
+
+*foo
+=*no_this_does_not_start_pod;
+
+our $VERSION = '1.23';
+
+---
+  my $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
+  is( $pm_info->name, 'Simple', 'found default package' );
+  is( $pm_info->version, '1.23', 'version for default package' );
+}
 
 {
   # Make sure processing stops after __DATA__
-  $dist->change_file( 'lib/Simple.pm', <<'---' );
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 package Simple;
 $VERSION = '0.01';
 __DATA__
@@ -477,9 +662,8 @@ __DATA__
   foo();
 };
 ---
-  $dist->regen;
 
-  $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
+  my $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
   is( $pm_info->name, 'Simple', 'found default package' );
   is( $pm_info->version, '0.01', 'version for default package' );
   my @packages = $pm_info->packages_inside;
@@ -488,15 +672,15 @@ __DATA__
 
 {
   # Make sure we handle version.pm $VERSIONs well
-  $dist->change_file( 'lib/Simple.pm', <<'---' );
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 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;
 
-  $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
+  my $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
   is( $pm_info->name, 'Simple', 'found default package' );
   is( $pm_info->version, '0.60.128', 'version for default package' );
   my @packages = $pm_info->packages_inside;
@@ -506,7 +690,9 @@ $VERSION = version->new('0.61.' . (qw$Revision: 129 $)[1]);
 
 # check that package_versions_from_directory works
 
-$dist->change_file( 'lib/Simple.pm', <<'---' );
+{
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
 package Simple;
 $VERSION = '0.01';
 package Simple::Ex;
@@ -531,26 +717,25 @@ Simple Simon
 
 =cut
 ---
-$dist->regen;
 
-my $exp_pvfd = {
-  'Simple' => {
-    'file' => 'Simple.pm',
-    'version' => '0.01'
-  },
-  'Simple::Ex' => {
-    'file' => 'Simple.pm',
-    'version' => '0.02'
-  }
-};
+  my $exp_pvfd = {
+    'Simple' => {
+      'file' => 'Simple.pm',
+      'version' => '0.01'
+    },
+    'Simple::Ex' => {
+      'file' => 'Simple.pm',
+      'version' => '0.02'
+    }
+  };
 
-my $got_pvfd = Module::Metadata->package_versions_from_directory('lib');
+  my $got_pvfd = Module::Metadata->package_versions_from_directory('lib');
 
-is_deeply( $got_pvfd, $exp_pvfd, "package_version_from_directory()" )
-  or diag explain $got_pvfd;
+  is_deeply( $got_pvfd, $exp_pvfd, "package_version_from_directory()" )
+    or diag explain $got_pvfd;
 
 {
-  my $got_provides = Module::Metadata->provides(dir => 'lib');
+  my $got_provides = Module::Metadata->provides(dir => 'lib', version => 2);
   my $exp_provides = {
     'Simple' => {
       'file' => 'lib/Simple.pm',
@@ -567,7 +752,7 @@ is_deeply( $got_pvfd, $exp_pvfd, "package_version_from_directory()" )
 }
 
 {
-  my $got_provides = Module::Metadata->provides(dir => 'lib', prefix => 'other');
+  my $got_provides = Module::Metadata->provides(dir => 'lib', prefix => 'other', version => 1.4);
   my $exp_provides = {
     'Simple' => {
       'file' => 'other/Simple.pm',
@@ -582,3 +767,58 @@ is_deeply( $got_pvfd, $exp_pvfd, "package_version_from_directory()" )
   is_deeply( $got_provides, $exp_provides, "provides()" )
     or diag explain $got_provides;
 }
+}
+
+# Check package_versions_from_directory with regard to case-sensitivity
+{
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
+package simple;
+$VERSION = '0.01';
+---
+
+  my $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
+  is( $pm_info->name, undef, 'no default package' );
+  is( $pm_info->version, undef, 'version for default package' );
+  is( $pm_info->version('simple'), '0.01', 'version for lower-case package' );
+  is( $pm_info->version('Simple'), undef, 'version for capitalized package' );
+  ok( $pm_info->is_indexable(), 'an indexable package is found' );
+  ok( $pm_info->is_indexable('simple'), 'the simple package is indexable' );
+  ok( !$pm_info->is_indexable('Simple'), 'the Simple package would not be indexed' );
+}
+
+{
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
+package simple;
+$VERSION = '0.01';
+package Simple;
+$VERSION = '0.02';
+package SiMpLe;
+$VERSION = '0.03';
+---
+
+  my $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
+  is( $pm_info->name, 'Simple', 'found default package' );
+  is( $pm_info->version, '0.02', 'version for default package' );
+  is( $pm_info->version('simple'), '0.01', 'version for lower-case package' );
+  is( $pm_info->version('Simple'), '0.02', 'version for capitalized package' );
+  is( $pm_info->version('SiMpLe'), '0.03', 'version for mixed-case package' );
+  ok( $pm_info->is_indexable('simple'), 'the simple package is indexable' );
+  ok( $pm_info->is_indexable('Simple'), 'the Simple package is indexable' );
+}
+
+{
+  my $file = File::Spec->catfile('lib', 'Simple.pm');
+  my ($dist_name, $dist_dir) = new_dist(files => { $file => <<'---' } );
+package ## hide from PAUSE
+   simple;
+$VERSION = '0.01';
+---
+
+  my $pm_info = Module::Metadata->new_from_file('lib/Simple.pm');
+  is( $pm_info->name, undef, 'no package names found' );
+  ok( !$pm_info->is_indexable('simple'), 'the simple package would not be indexed' );
+  ok( !$pm_info->is_indexable('Simple'), 'the Simple package would not be indexed' );
+  ok( !$pm_info->is_indexable(), 'no indexable package is found' );
+}