This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Get t/uni/gv.t working under minitest
[perl5.git] / t / TEST
diff --git a/t/TEST b/t/TEST
index 28690db..5d25af6 100755 (executable)
--- a/t/TEST
+++ b/t/TEST
 # In which case, we need to stop t/TEST actually running tests, as all
 # t/harness needs are its subroutines.
 
+# If we're doing deparse tests, ignore failures for these
+my $deparse_failures;
+
+# And skip even running these
+my $deparse_skips;
 
 # directories with special sets of test switches
 my %dir_to_switch =
@@ -31,26 +36,24 @@ my %abs = (
           '../cpan/Archive-Tar' => 1,
           '../cpan/AutoLoader' => 1,
           '../cpan/CPAN' => 1,
-          '../cpan/Class-ISA' => 1,
           '../cpan/Devel-PPPort' => 1,
           '../cpan/Encode' => 1,
+          '../cpan/ExtUtils-Command' => 1,
           '../cpan/ExtUtils-Constant' => 1,
+          '../cpan/ExtUtils-Install' => 1,
           '../cpan/ExtUtils-MakeMaker' => 1,
+          '../cpan/ExtUtils-Manifest' => 1,
           '../cpan/File-Fetch' => 1,
           '../cpan/IPC-Cmd' => 1,
           '../cpan/IPC-SysV' => 1,
           '../cpan/Locale-Codes' => 1,
           '../cpan/Module-Load' => 1,
           '../cpan/Module-Load-Conditional' => 1,
-          '../cpan/Package-Constants' => 1,
           '../cpan/Parse-CPAN-Meta' => 1,
           '../cpan/Pod-Simple' => 1,
           '../cpan/Test-Simple' => 1,
           '../cpan/podlators' => 1,
           '../dist/Cwd' => 1,
-          '../dist/ExtUtils-Command' => 1,
-          '../dist/ExtUtils-Install' => 1,
-          '../dist/ExtUtils-Manifest' => 1,
           '../dist/ExtUtils-ParseXS' => 1,
           '../dist/Tie-File' => 1,
          );
@@ -135,6 +138,7 @@ our $show_elapsed_time = $ENV{HARNESS_TIMER} || 0;
        if ($1 =~ /^deparse(,.+)?$/) {
            $::deparse = 1;
            $::deparse_opts = $1;
+            _process_deparse_config();
        }
     }
     @ARGV = @argv;
@@ -547,15 +551,8 @@ EOT
        if ($test =~ /^$/) {
            next;
        }
-       if ($type eq 'deparse') {
-           if ($test eq "comp/redef.t") {
-               # Redefinition happens at compile time
-               next;
-           }
-           elsif ($test =~ m{lib/Switch/t/}) {
-               # B::Deparse doesn't support source filtering
-               next;
-           }
+       if ($type eq 'deparse' && $test =~ $deparse_skips) {
+           next;
        }
        my $te = $::path_to_name{$test} . '.'
                    x ($dotdotdot - length($::path_to_name{$test})) .' ';
@@ -668,7 +665,7 @@ EOT
 
        _check_valgrind(\$toolnm, \$grind_ct, \$test);
 
-       if ($type eq 'deparse') {
+       if ($type eq 'deparse' && !$ENV{KEEP_DEPARSE_FILES}) {
            unlink "./$test.dp";
        }
        if (not defined $failure and $next != $max) {
@@ -681,6 +678,19 @@ EOT
            $failure = "FAILED--non-zero wait status: $?";
        }
 
+       # Deparse? Should it have passed or failed?
+       if ($type eq 'deparse' && $test =~ $deparse_failures) {
+           if (!$failure) {
+               # Wait, it didn't fail? Great news! Tell someone!
+               $failure = "FAILED--all tests passed but test should have failed";
+           } else {
+               # Bah, still failing. Mask it.
+               print "${te}skipped\n";
+               $tested_files = $tested_files - 1;
+               next;
+           }
+       }
+
        if (defined $failure) {
            print "${te}$failure\n";
            $::bad_files = $::bad_files + 1;
@@ -903,4 +913,51 @@ sub _cleanup_valgrind {
     }
 }
 
+# Generate regexps of known bad filenames / skips from Porting/deparse-skips.txt
+my $in;
+
+sub _process_deparse_config {
+    my @deparse_failures;
+    my @deparse_skips;
+
+    my $f = '../Porting/deparse-skips.txt';
+
+    my $skips;
+    if (!open($skips, '<', $f)) {
+        warn "Failed to find $f: $!\n";
+        return;
+    }
+
+    while(<$skips>) {
+        if (/__DEPARSE_FAILURES__/) {
+            $in = \@deparse_failures; next;
+        } elsif (/__DEPARSE_SKIPS__/) {
+            $in = \@deparse_skips; next;
+        } elsif (!$in) {
+            next;
+       }
+
+        s/#.*$//; # Kill comments
+        s/\s+$//; # And trailing whitespace
+
+        next unless $_;
+
+        push @$in, $_;
+    }
+
+    for my $f (@deparse_failures, @deparse_skips) {
+        if ($f =~ m|/$|) { # Dir? Skip everything below it
+            $f = qr/\Q$f\E.*/;
+        } else {
+            $f = qr/\Q$f\E/;
+        }
+    }
+
+    $deparse_failures = join('|', @deparse_failures);
+    $deparse_failures = qr/^(?:$deparse_failures)$/;
+
+    $deparse_skips = join('|', @deparse_skips);
+    $deparse_skips = qr/^(?:$deparse_skips)$/;
+}
+
 # ex: set ts=8 sts=4 sw=4 noet: