Refactor t/porting/regen.t to check everything (and the return values!).
authorNicholas Clark <nick@ccl4.org>
Thu, 18 Jul 2013 14:57:00 +0000 (16:57 +0200)
committerNicholas Clark <nick@ccl4.org>
Wed, 24 Jul 2013 07:00:50 +0000 (09:00 +0200)
Previously it was fire-and-forget for the 3 programs it ran (and for the
programs that regen.pl ran). Now we die if any program fails to return 0.

Also regen.t had an explicit list of programs to test. It turned out that it
was not testing regen/mk_invlists.pl. Now regen.t has a skip list of what
not to test, and everything not skipped it tested. This way any new
additions will not get missed.

This was implemented by refactoring regen.pl to read the list of programs it
runs from <DATA>, so that regen.t can open regen.pl to extract the same
list.

regen.pl
t/porting/regen.t

index 1b3ae5e..8788668 100644 (file)
--- a/regen.pl
+++ b/regen.pl
@@ -13,9 +13,15 @@ require 5.004;       # keep this compatible, an old perl is all we may have before
 
 use strict;
 
-# Which scripts to run.
+my $tap = $ARGV[0] && $ARGV[0] eq '--tap' ? '# ' : '';
+foreach my $pl (map {chomp; "regen/$_"} <DATA>) {
+  my @command =  ($^X, $pl, @ARGV);
+  print "$tap@command\n";
+  system @command
+    and die "@command failed: $?" 
+}
 
-my @scripts = qw(
+__END__
 mg_vtable.pl
 opcode.pl
 overload.pl
@@ -24,11 +30,3 @@ regcomp.pl
 warnings.pl
 embed.pl
 feature.pl
-);
-
-my $tap = $ARGV[0] && $ARGV[0] eq '--tap' ? '# ' : '';
-foreach my $pl (map {"regen/$_"} @scripts) {
-  my @command =  ($^X, $pl, @ARGV);
-  print "$tap@command\n";
-  system @command;
-}
index 78fd64f..f7ec411 100644 (file)
@@ -16,13 +16,37 @@ if ( $^O eq "VMS" ) {
   skip_all( "- regen.pl needs porting." );
 }
 
-my $in_regen_pl = 24; # I can't see a clean way to calculate this automatically.
-my @files = qw(perly.act perly.h perly.tab keywords.c keywords.h uconfig.h);
-my @progs = qw(regen/regcharclass.pl regen/mk_PL_charclass.pl
-               regen/unicode_constants.pl regen/genpacksizetables.pl
-               regen/miniperlmain.pl);
+my $tests = 23; # I can't see a clean way to calculate this automatically.
 
-plan (tests => $in_regen_pl + @files + @progs + 2);
+my %skip = ("regen_perly.pl"    => [qw(perly.act perly.h perly.tab)],
+            "regen/keywords.pl" => [qw(keywords.c keywords.h)],
+            "regen/uconfig_h.h" => [qw(uconfig.h)],
+           );
+
+my @files = map {@$_} sort values %skip;
+
+open my $fh, '<', 'regen.pl'
+    or die "Can't open regen.pl: $!";
+
+while (<$fh>) {
+    last if /^__END__/;
+}
+die "Can't find __END__ in regen.pl"
+    if eof $fh;
+
+foreach (qw(embed_lib.pl regen_lib.pl uconfig_h.pl
+            regcharclass_multi_char_folds.pl),
+         map {chomp $_; $_} <$fh>) {
+    ++$skip{"regen/$_"};
+}
+
+close $fh
+    or die "Can't close regen.pl: $!";
+
+my @progs = grep {!$skip{$_}} <regen/*.pl>;
+push @progs, 'regen.pl', map {"Porting/makemeta $_"} qw(-j -y);
+
+plan (tests => $tests + @files + @progs);
 
 OUTER: foreach my $file (@files) {
     open my $fh, '<', $file or die "Can't open $file: $!";
@@ -46,10 +70,8 @@ OUTER: foreach my $file (@files) {
     is("@bad", '', "generated $file is up to date");
 }
 
-foreach (@progs, 'regen.pl') {
-  system "$^X $_ --tap";
-}
-
-foreach ( '-y', '-j' ) {
-  system "$^X Porting/makemeta --tap $_";
+foreach (@progs) {
+    my $command = "$^X $_ --tap";
+    system $command
+        and die "Failed to run $command: $?";
 }