t/regress: perl conversion of file loop
[barcat.git] / t / regress.t
index b8d05ddcc8a3170072dd2681c3ec99fadf6647d4..7980b84bde4de1add470350e9d5bcc1f8a3caab8 100755 (executable)
@@ -1,75 +1,54 @@
-#!/bin/sh
-
-cd "${0%/*}" || exit 1
-
-test_count=0
-fail_count=0
-
-COLUMNS=40
-colorize=
-test -t 1 && colorize=1
-color () {
-       test -n "$colorize" &&
-       printf '\e[%sm' $@
+#!/usr/bin/env perl
+use 5.014;
+use warnings;
+use re '/ms';
+use Getopt::Long qw(2.32 :config gnu_getopt);
+use Test::More;
+use File::Basename;
+use IPC::Run 'run';
+use Data::Dump 'pp';
+
+chdir dirname($0) or exit 1;
+
+GetOptions(\my %opt,
+       'regenerate|G!',
+) or do {
+       say "Usage: $0 [-G] [<files>...]";
+       exit 64;  # EX_USAGE
+};
+
+local $ENV{COLUMNS} = 40;
+
+my @params = @ARGV ? @ARGV : glob 't*.out';
+plan(tests => int @params);
+
+for my $candidate (@params) {
+       my $file = basename($candidate, '.out');
+       (my $name = $file =~ s/^[^-]*-//r) =~ tr/_/ /;
+       my $todo = $name =~ s/ #TODO$//;
+
+       my $diff;
+       if ($opt{regenerate}) {
+               if (-e "$file.sh") {
+                       skip("$file.out", 1);
+                       next;
+               }
+               #run(\@run, '>&', "$file.out");
+       }
+       elsif (!-e "$file.out") {
+               local $TODO = 'missing output';
+               fail($name);
+               next;
+       }
+       else {
+               run(['./cmddiff', "$file.out"], '>', \$diff);
+       }
+
+       local $TODO = $todo ? ' ' : undef;
+       is($? >> 8, 0, $name) or do {
+               #diag('command: ', pp(@run));
+               diag($diff);  #TODO native
+       };
 }
-regenerate=
-diffcmd () {
-       comm --nocheck-order --output-delimiter=::: -3 $@ |
-       perl -pe"END{exit !!\$.} s/^:::/$(color 31)>/ || s/^/$(color 32)</"
-}
-
-for option in "$@"
-do
-       case "$option" in
-       -G) regenerate=1 && shift;;
-       -*) echo "Usage: $0 [-G] [<files>...]"; exit 64;;
-       esac
-done
-
-for candidate in ${@:-t*.in}
-do
-       test_count=$((test_count+1))
-       file="${candidate%.in}"
-       test -r "$file.in" || continue
-
-       name="$(echo ${file#*-} | tr _ \ )"
-       cmd="barcat $file.in"
-       case "$name" in *\ -*) cmd="$cmd -${name#* -}";; esac
-
-       if test -n "$regenerate"
-       then
-               if test -e $file.sh
-               then
-                       echo "ok $test_count # skip $file.out"
-                       continue
-               fi
-               $cmd >$file.out 2>&1
-       else
-               if test -e $file.sh;  then $cmd 2>&1 | ./$file.sh; fi &&
-               if test -e $file.out; then $cmd 2>&1 | diffcmd "$file.out" -; fi
-       fi
-
-       if test 0 != $?
-       then
-               fail_count=$((fail_count+1))
-               color 1\;31
-               printf 'not '
-       fi
-       echo "ok $test_count - $name"
-       color 0
-done
-
-if test $fail_count = 0
-then
-       color 32
-       echo "# passed all $test_count test(s)"
-else
-       color 31
-       echo "# failed $fail_count among $test_count test(s)"
-       fail_count=1  # exit code
-fi
 
-color 0\;36
-echo "1..$test_count"
-color 0
-exit $fail_count
+done_testing();