fix installing to directories with spaces and backslashes
[p5sagit/local-lib.git] / t / install.t
index 1ee35d0..874e3e1 100644 (file)
@@ -3,43 +3,61 @@ use warnings;
 use Test::More;
 BEGIN { plan skip_all => "Install Capture::Tiny to test installation"
   unless eval { require Capture::Tiny; 1 } }
-use Capture::Tiny qw(capture);
+use Capture::Tiny qw(capture_merged);
 use File::Spec;
+use File::Path qw(mkpath);
 use Cwd;
 use Config;
 
 use lib 't/lib'; use TempDir;
 
-plan tests => 2;
+use local::lib ();
 
-my $dir = mk_temp_dir('test_local_lib-XXXXX');
+my @dirs = (
+  'plain',
+  'with space',
+  'with\backslash',
+  'with space\and-bs',
+);
 
-use local::lib ();
-local::lib->import($dir);
+my %dist_types = (
+  EUMM => sub {
+    system($^X, 'Makefile.PL') && die "Makefile.PL failed";
+    system($Config{make}, 'install') && die "$Config{make} install failed";
+  },
+  MB => sub {
+    system($^X, 'Build.PL') && die "Build.PL failed";
+    system($^X, 'Build', 'install') && die "Build install failed";
+  },
+);
+
+plan tests => @dirs * keys(%dist_types) * 2;
 
 my $orig_dir = cwd;
-SKIP: for my $dist_type (qw(MB EUMM)) {
-  chdir File::Spec->catdir($orig_dir, qw(t dist), $dist_type);
-  if ($dist_type eq 'EUMM') {
-    my ($stdout, $stderr) = capture { eval {
-      system($^X, 'Makefile.PL') && die "Makefile.PL failed";
-      system($Config{make}, 'install') && die "$Config{make} install failed";
-    } };
-    diag $stdout, $stderr if $@;
-  } else {
-    my ($stdout, $stderr) = capture { eval {
-      system($^X, 'Build.PL') && die "Build.PL failed";
-      system($^X, 'Build', 'install') && die "Build install failed";
+for my $dir_base (@dirs) {
+  for my $dist_type (sort keys %dist_types) {
+    chdir $orig_dir;
+    my $temp = mk_temp_dir('test_local_lib-XXXXX');
+    my $ll_dir = "$dist_type-$dir_base";
+    mkpath(my $ll = "$temp/$ll_dir");
+    local::lib->import($ll);
+
+    chdir File::Spec->catdir($orig_dir, qw(t dist), $dist_type);
+    my $output = capture_merged { eval {
+      $dist_types{$dist_type}->();
     } };
-    diag $stdout, $stderr if $@;
+    is $@, '', "installed $dist_type into '$ll_dir'"
+      or diag $output;
+
+    my $dest_dir = local::lib->install_base_perl_path($ll);
+    my $file = File::Spec->catfile($dest_dir, "$dist_type.pm");
+    (my $short_file = $file) =~ s/^\Q$ll/$ll_dir/;
+    ok(
+      -e $file,
+      "$dist_type - $dir_base - $dist_type.pm installed as '$short_file'",
+    ) or diag 'Files in ' . $dest_dir . ":\n", join("\n", do {
+      my $dh;
+      (opendir $dh, $dest_dir) ? readdir $dh : "doesn't exist";
+    });
   }
-  my $file = File::Spec->catfile($dir, qw(lib perl5), "$dist_type.pm");
-  ok(
-    -e $file,
-    "$dist_type - $dist_type.pm installed as $file",
-  )
-  or do {
-        my $dest_dir = File::Spec->catdir($dir, qw(lib perl5));
-        diag 'Files in ' . $dest_dir . ":\n", join("\n", glob(File::Spec->catfile($dest_dir, '*')));
-  };
 }