automake-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Automake-commit] [SCM] GNU Automake branch, testsuite-work, updated. v1


From: Stefano Lattarini
Subject: [Automake-commit] [SCM] GNU Automake branch, testsuite-work, updated. v1.11-1238-g451ab17
Date: Mon, 22 Aug 2011 15:15:20 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU Automake".

http://git.sv.gnu.org/gitweb/?p=automake.git;a=commitdiff;h=451ab178e635edec7c320034b47bcd96c770d1a4

The branch, testsuite-work has been updated
       via  451ab178e635edec7c320034b47bcd96c770d1a4 (commit)
       via  30913e0eb8ef1f9924b6762d277a561c8de9e622 (commit)
       via  fcab6cddec5f183c7180beb566e83ded67eabf59 (commit)
       via  477abec3777589888ed4a4b4f78d1c13f91cdfcb (commit)
       via  d630a0d4dc7c1af141ab3c61458cdbc690dac88c (commit)
       via  5116cc978798cedd7a522d3fdd3140efde9933b3 (commit)
       via  48b98a63bd53c93a64f43cbcd8ca93f541c7d5ee (commit)
       via  8a4e2afa54cbc1f148d899bd5cea6a2ada39d2e9 (commit)
       via  484ec4ec8d7e07e8a63c920b25f3267754542c8e (commit)
       via  6c20cf0710ef99d0c9b2c1622b18867311cbe78b (commit)
       via  c9ca5f61d87cb0578d32981b2ee32118d934ce21 (commit)
       via  1bc8f828ae07b6a3537ef0ca46cd698ba99659e2 (commit)
       via  fdfe9a1154b9945c71ac92b5c16ffed21e89f2b4 (commit)
       via  82bb64f1d21f6993341a725e75aa5aa00c3e00a1 (commit)
       via  9f833f79c912cef51f4f2f71f2183574cdc43ee4 (commit)
       via  28964e4787b17f0211f9b2aab2776cee163fdb30 (commit)
       via  135cfa3b653af3c4cc9bec95f813237263ae02ef (commit)
       via  38f9c6c7a64a411d2655f985b9929a3bbb2d3beb (commit)
       via  5c74dedc0e0ed50680180259133a02086d5695e6 (commit)
       via  11d8ed522235c2e5c705d6345e7cd55f2a47b316 (commit)
       via  90c6fc18d1b1129e3ced36ddcd7a7ab0899294ad (commit)
       via  40705c5cc5898ff924fea0c6f54f8953205a630d (commit)
      from  31bbce9e64392f9366582d71aeef1805b53208e3 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 451ab178e635edec7c320034b47bcd96c770d1a4
Merge: fcab6cd 30913e0
Author: Stefano Lattarini <address@hidden>
Date:   Mon Aug 22 16:37:15 2011 +0200

    Merge branch 'test-protocols' into testsuite-work
    
    * test-protocols:
      testsuite: avoid spurious failure on Solaris

commit fcab6cddec5f183c7180beb566e83ded67eabf59
Merge: 31bbce9 477abec
Author: Stefano Lattarini <address@hidden>
Date:   Mon Aug 22 15:48:15 2011 +0200

    Merge branch 'test-protocols' into testsuite-work
    
    * test-protocols:
      testsuite: use the new awk+shell TAP driver in our own testsuite
      tap/awk: handle non-zero exit status from the test command
      tap/awk: prepare to fetch the exit status of the test command
      tap/awk: refactor for future changes
      testsuite: avoid spurious failure if rst2html program is missing
      tap/awk: support Solaris /usr/xpg4/bin/awk
      tap/awk: support Solaris /usr/bin/nawk
      tap/awk: correctly extract message from SKIP plans
      tap/awk: support colorized output
      tap: real (but still incomplete) awk implementation of TAP driver
      testsuite: fix spurious failure due to Solaris 'wc' incompatibility
      coverage: keyword "SKIP" in TAP plan is case-insensitive
      coverage: ambiguous use of TAP "TODO"/"SKIP" directives
      coverage: non-directive comments in TAP results are preserved
      coverage: TAP result number followed by non-whitespace word boundary
      coverage: a TAP result numbered "0" is always out-of-order
      cosmetics: fix botched indentation in perl TAP driver
      fix: regenerate tests/Makefile.in
      coverage: some more tests on corner cases of TAP support

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |  177 +++++++
 lib/tap-driver.pl                                  |   31 +-
 lib/tap-driver.sh                                  |  547 ++++++++++++++++++--
 tests/Makefile.am                                  |   13 +-
 tests/Makefile.in                                  |   13 +-
 ...g0-result.test => tap-ambiguous-directive.test} |   41 +-
 tests/tap-html.test                                |    1 +
 ...-msg0-result.test => tap-negative-numbers.test} |   47 +-
 tests/tap-no-spurious-numbers.test                 |   99 ++++
 tests/tap-no-spurious.test                         |   25 +-
 tests/tap-number-wordboundary.test                 |  112 ++++
 tests/tap-numbers-leading-zero.test                |  109 ++++
 .../{tap-plan.test => tap-plan-leading-zero.test}  |   43 +-
 ...ble-hard-error.test => tap-plan-malformed.test} |   44 +-
 ...ty-diagnostic.test => tap-plan-whitespace.test} |   22 +-
 ...out.test => tap-planskip-case-insensitive.test} |   26 +-
 tests/tap-planskip-unplanned-corner.test           |    3 +-
 tests/tap-planskip.test                            |    8 +-
 ...p-later-errors.test => tap-result-comment.test} |   30 +-
 tests/tap-signal.test                              |   26 +-
 ...able-hard-error.test => tap-test-number-0.test} |   41 +-
 tests/tap-todo-skip-together.test                  |    1 +
 22 files changed, 1264 insertions(+), 195 deletions(-)
 copy tests/{tap-msg0-result.test => tap-ambiguous-directive.test} (64%)
 copy tests/{tap-msg0-result.test => tap-negative-numbers.test} (63%)
 create mode 100755 tests/tap-no-spurious-numbers.test
 create mode 100755 tests/tap-number-wordboundary.test
 create mode 100755 tests/tap-numbers-leading-zero.test
 copy tests/{tap-plan.test => tap-plan-leading-zero.test} (54%)
 copy tests/{tap-no-disable-hard-error.test => tap-plan-malformed.test} (58%)
 copy tests/{tap-empty-diagnostic.test => tap-plan-whitespace.test} (72%)
 copy tests/{tap-msg0-bailout.test => tap-planskip-case-insensitive.test} (62%)
 copy tests/{tap-planskip-later-errors.test => tap-result-comment.test} (62%)
 copy tests/{tap-no-disable-hard-error.test => tap-test-number-0.test} (51%)

diff --git a/ChangeLog b/ChangeLog
index fb6bc35..4a72485 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,180 @@
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       testsuite: avoid spurious failure on Solaris
+       * tests/tap-signal.test (signal_caught): Fix a regression from
+       commit `v1.11-1052-gd630a0d' that was causing this test to fail
+       spuriously on Solaris (due to an already worked-around Solaris
+       /bin/sh bug, see commit `v1.11-981-g0ef3ef5').
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       testsuite: use the new awk+shell TAP driver in our own testsuite
+       * tests/Makefile.am (TAP_LOG_DRIVER): Redefine to use the new
+       awk+shell tap driver, which should be complete enough for use in
+       a "controlled" production environment.
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       tap/awk: handle non-zero exit status from the test command
+       * lib/tap-driver.sh (get_test_exit_message): New function in the
+       awk script, used to extract the exit status of the test program,
+       or at least a good guess of it.
+       (write_test_results): Use it, reporting an ERROR result if it
+       detects that the test program exited with a non-zero status.
+       * tests/tap-signal.test: Account for the differences in the
+       error messages generated by the awk and perl TAP drivers.  Fix
+       an unrelated typo in comments since we are at it.
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       tap/awk: prepare to fetch the exit status of the test command
+       * lib/tap-driver.sh: Rewrite some logic in the main parsing loop,
+       to make it possible to read the exit status of the test command
+       from the last line of the input stream.
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       tap/awk: refactor for future changes
+       * lib/tap-driver.sh: Rewrite the awk script so that the parsing
+       of the input stream is implemented as a hand-rolled loop in the
+       BEGIN block, using the `getline' builtin.
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       testsuite: avoid spurious failure if rst2html program is missing
+       * tests/tap-html.test ($required): Require `rst2html'.
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       tap/awk: support Solaris /usr/xpg4/bin/awk
+       * lib/tap-driver.sh: Use `\t', not `\\t', to represent tabulation
+       character in regexps, even when inside double-quoted strings; that
+       seems to be more portable to Solaris 10 XPG4 awk.
+
+2011-08-22  Stefano Lattarini  <address@hidden>
+
+       tap/awk: support Solaris /usr/bin/nawk
+       * lib/tap-driver.sh (close_or_die): Remove, the use of the `close'
+       builtin in there was confusing /usr/bin/nawk from Solaris 10 into
+       a syntax error.
+       (write_test_results): Simply use `close' on the `*.trs' file, that
+       should be enough.
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       tap/awk: correctly extract message from SKIP plans
+       * lib/tap-driver.sh (/^1\.\.0+[ \t]*#/): Add a forgotten `?' to
+       the regex used to extract the skip message from a "1..0" TAP plan.
+       * tests/planskip.test: Check for the just-fixed bug.
+       * tests/tap-planskip-unplanned-corner.test: Don't be too strict
+       w.r.t. the formatting of the "skip whole test" message, to avoid
+       failing due to bugs irrelevant for this test (like the one just
+       fixed).
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       tap/awk: support colorized output
+       * lib/tap-driver.sh: Pass definition of colors to the BEGIN block
+       of the awk script, using ...
+       ($init_colors): ... this new variable, which supersedes ...
+       ($red, $grn, $lgn, $blu, $mgn, $std): ... these variables, which
+       have been consequently removed.
+       ($color_tests): We don't have to pass this anymore to the awk
+       script, so do not convert it to a numeric boolean.
+       (decorate_result): Implement for real.
+       With this change, the test 'tap-color.test' now passes.
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       tap: real (but still incomplete) awk implementation of TAP driver
+       * lib/tap-driver.sh: Add an incomplete, but mostly working,
+       implementation of a TAP parser and driver in awk.  It doesn't yet
+       support colorized output, fetching of exit status from test
+       programs, nor a way to escape TAP directives in TAP result lines,
+       but passes all the tests of TAP support in the automake testsuite,
+       apart from the following ones:
+         - tap-color.test
+         - tap-escape-directive.test
+         - tap-exit.test
+         - tap-missing-plan-and-bad-exit.test
+         - tap-passthrough-exit.test
+         - tap-planskip-badexit.test
+         - tap-planskip-unplanned-corner.test
+         - tap-signal.test
+       Tested on Debian GNU/Linux with GNU awk 3.1.7 and 3.0.2, "original
+       awk" 2010-05-23-1, and mawk 1.3.3-15 (with which also the test
+       `tap-realtime.test' fails, in addition to those listed above).
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       testsuite: fix spurious failure due to Solaris 'wc' incompatibility
+       * tests/tap-number-wordboundary.test ($planned): Strip any extra
+       whitespace from the output of `wc', to cater to Solaris 10.
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       coverage: keyword "SKIP" in TAP plan is case-insensitive
+       * tests/tap-planskip-case-insensitive.test: New test.
+       * tests/tap-planskip.test: Remove now-duplicated checks.
+       * tests/Makefile.am (tap_with_common_setup_tests): Update.
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       coverage: ambiguous use of TAP "TODO"/"SKIP" directives
+       * tests/tap-ambiguous-directive.test: New test.
+       * tests/tap-todo-skip-together.test: Reference it in heading
+       comments.
+       * tests/Makefile.am (tap_with_common_setup_tests): Update.
+
+2011-08-21  Stefano Lattarini  <address@hidden>
+
+       coverage: non-directive comments in TAP results are preserved
+       * tests/tap-result-comment.test: New test.
+       * tests/Makefile.am (tap_with_common_setup_tests): Update.
+
+2011-08-20  Stefano Lattarini  <address@hidden>
+
+       coverage: TAP result number followed by non-whitespace word boundary
+       * tests/tap-number-wordboundary.test: New test.
+       * tests/Makefile.am (tap_with_common_setup_tests): Update.
+
+2011-08-20  Stefano Lattarini  <address@hidden>
+
+       coverage: a TAP result numbered "0" is always out-of-order
+       * tests/tap-test-number-0.test: New, checks that a test result
+       numbered as 0 is to be considered out-of-order; this is
+       consistent with the behaviour of the `prove' utility.
+       * tests/Makefile.am (tap_with_common_setup_tests): Update.
+
+2011-08-20  Stefano Lattarini  <address@hidden>
+
+       cosmetics: fix botched indentation in perl TAP driver
+       * lib/tap-driver.pl (main, Getopt::Long::GetOptions): Fix
+       improper or botched indentation.
+
+2011-08-20  Stefano Lattarini  <address@hidden>
+
+       coverage: some more tests on corner cases of TAP support
+       * tests/tap-no-spurious.test: Extend checks verifying that a line
+       matching, say, the regex "^ok[a-zA-Z0-9_]" is *not* considered a
+       TAP result.
+       * tests/tap-no-spurious-numbers.test: New test, checking that our
+       TAP driver doesn't spuriously recognize as TAP result numbers what
+       is not (even if it seems pretty close).
+       * tests/tap-negative-numbers.test: New test, checking that our
+       TAP driver doesn't spuriously recognize negative TAP result
+       numbers, but correctly interprets them as test descriptions
+       instead.
+       * tests/tap-plan-leading-zero.test, tap-numbers-leading-zero.test:
+       New tests, checking how our driver fares in recognizing numbers
+       with leading zeroes in TAP results or TAP plans.
+       * tests/tap-planskip-malformed.test: New test, checking that a
+       malformed TAP plan is not recognized as a valid plan.
+       * tests/tap-plan-whitespace.test: New test, checking that a TAP
+       plan line with trailing whitespace is recognized and handled
+       correctly.
+       * tests/Makefile.am (tap_with_common_setup_tests): Update.
+
 2011-08-19  Stefano Lattarini  <address@hidden>
 
        testsuite: various fixlets and tweakings
diff --git a/lib/tap-driver.pl b/lib/tap-driver.pl
index 7043815..9e1ece4 100755
--- a/lib/tap-driver.pl
+++ b/lib/tap-driver.pl
@@ -73,7 +73,8 @@ my $log_file = undef;
 my $trs_file = undef;
 my $diag_string = "#";
 
-Getopt::Long::GetOptions (
+Getopt::Long::GetOptions
+  (
     'help' => sub { print $HELP; exit 0; },
     'version' => sub { print "$ME $VERSION\n"; exit 0; },
     'test-name=s' => \$test_script_name,
@@ -450,22 +451,22 @@ sub main (@)
   if (!$bailed_out)
     {
       if (!$plan_seen)
-      {
-        testsuite_error "missing test plan";
-      }
-    elsif ($parser->tests_planned != $parser->tests_run)
-      {
-        my ($planned, $run) = ($parser->tests_planned, $parser->tests_run);
-        my $bad_amount = $run > $planned ? "many" : "few";
-        testsuite_error (sprintf "too %s tests run (expected %d, got %d)",
-                                 $bad_amount, $planned, $run);
-      }
+        {
+          testsuite_error "missing test plan";
+        }
+      elsif ($parser->tests_planned != $parser->tests_run)
+        {
+          my ($planned, $run) = ($parser->tests_planned, $parser->tests_run);
+          my $bad_amount = $run > $planned ? "many" : "few";
+          testsuite_error (sprintf "too %s tests run (expected %d, got %d)",
+                                   $bad_amount, $planned, $run);
+        }
     }
   if (!$cfg{"ignore-exit"} && !$bailed_out)
-  {
-    my $msg = get_test_exit_message ();
-    testsuite_error $msg if $msg;
-  }
+    {
+      my $msg = get_test_exit_message ();
+      testsuite_error $msg if $msg;
+    }
   write_test_results;
   close LOG or die "closing $log_file: $!\n";
   exit 0;
diff --git a/lib/tap-driver.sh b/lib/tap-driver.sh
index 322e3c4..1255662 100755
--- a/lib/tap-driver.sh
+++ b/lib/tap-driver.sh
@@ -23,21 +23,23 @@
 # bugs to <address@hidden> or send patches to
 # <address@hidden>.
 
-scriptversion=2011-08-17.14; # UTC
+scriptversion=2011-08-21.21; # UTC
 
 # Make unconditional expansion of undefined variables an error.  This
 # helps a lot in preventing typo-related bugs.
 set -u
 
+me=tap-driver.sh
+
 fatal ()
 {
-  echo "$0: fatal: $*" >&2
+  echo "$me: fatal: $*" >&2
   exit 1
 }
 
 usage_error ()
 {
-  echo "$0: $*" >&2
+  echo "$me: $*" >&2
   print_usage >&2
   exit 2
 }
@@ -46,11 +48,11 @@ print_usage ()
 {
   cat <<END
 Usage:
-  tap-driver --test-name=NAME --log-file=PATH --trs-file=PATH
-             [--expect-failure={yes|no}] [--color-tests={yes|no}]
-             [--enable-hard-errors={yes|no}] [--ignore-exit]
-             [--diagnostic-string=STRING] [--merge|--no-merge]
-             [--comments|--no-comments] [--] TEST-COMMAND
+  tap-driver.sh --test-name=NAME --log-file=PATH --trs-file=PATH
+                [--expect-failure={yes|no}] [--color-tests={yes|no}]
+                [--enable-hard-errors={yes|no}] [--ignore-exit]
+                [--diagnostic-string=STRING] [--merge|--no-merge]
+                [--comments|--no-comments] [--] TEST-COMMAND
 The \`--test-name', \`--log-file' and \`--trs-file' options are mandatory.
 END
 }
@@ -60,28 +62,28 @@ END
 test_name= # Used for reporting.
 log_file=  # Where to save the result and output of the test script.
 trs_file=  # Where to save the metadata of the test run.
-expect_failure=no
-color_tests=no
-merge=no
-ignore_exit=no
-comments=no
+expect_failure=0
+color_tests=0
+merge=0
+ignore_exit=0
+comments=0
 diag_string='#'
 while test $# -gt 0; do
   case $1 in
   --help) print_usage; exit $?;;
-  --version) echo "tap-driver $scriptversion"; exit $?;;
+  --version) echo "$me $scriptversion"; exit $?;;
   --test-name) test_name=$2; shift;;
   --log-file) log_file=$2; shift;;
   --trs-file) trs_file=$2; shift;;
   --color-tests) color_tests=$2; shift;;
   --expect-failure) expect_failure=$2; shift;;
   --enable-hard-errors) shift;; # No-op.
-  --merge) merge=yes;;
-  --no-merge) merge=no;;
-  --ignore-exit) ignore_exit=yes;;
-  --comments) comments=yes;;
-  --no-comments) comments=no;;
-  --diag-string) diag_string=$2; shift;;
+  --merge) merge=1;;
+  --no-merge) merge=0;;
+  --ignore-exit) ignore_exit=1;;
+  --comments) comments=1;;
+  --no-comments) comments=0;;
+  --diagnostic-string) diag_string=$2; shift;;
   --) shift; break;;
   -*) usage_error "invalid option: '$1'";;
   esac
@@ -96,21 +98,504 @@ case $expect_failure in
 esac
 
 if test $color_tests = yes; then
-  red='' # Red.
-  grn='' # Green.
-  lgn='' # Light green.
-  blu='' # Blue.
-  mgn='' # Magenta.
-  std=''     # No color.
+  init_colors='
+    color_map["red"]="" # Red.
+    color_map["grn"]="" # Green.
+    color_map["lgn"]="" # Light green.
+    color_map["blu"]="" # Blue.
+    color_map["mgn"]="" # Magenta.
+    color_map["std"]=""     # No color.
+    color_for_result["ERROR"] = "mgn"
+    color_for_result["PASS"]  = "grn"
+    color_for_result["XPASS"] = "red"
+    color_for_result["FAIL"]  = "red"
+    color_for_result["XFAIL"] = "lgn"
+    color_for_result["SKIP"]  = "blu"'
 else
-  red= grn= lgn= blu= mgn= std=
+  init_colors=''
 fi
 
-# TODO: test script is run here.
-# "$@" | [our magic awk script]
+{
+  # FIXME: this usage loses the test program exit status.  We should
+  # probably rewrite the awk script to use the
+  #   expression | getline [var]
+  # idiom, which should allow us to obtain the final exit status from
+  # <expression> when closing it.
+  { test $merge -eq 0 || exec 2>&1; "$@"; echo $?; } \
+    | LC_ALL=C ${AM_TAP_AWK-awk} \
+        -v me="$me" \
+        -v test_script_name="$test_name" \
+        -v log_file="$log_file" \
+        -v trs_file="$trs_file" \
+        -v expect_failure="$expect_failure" \
+        -v merge="$merge" \
+        -v ignore_exit="$ignore_exit" \
+        -v comments="$comments" \
+        -v diag_string="$diag_string" \
+'
+# FIXME: the usages of "cat >&3" below could be optimized whne using
+# FIXME: GNU awk, and/on on systems that supports /dev/fd/.
+
+# Implementation note: in what follows, `result_obj` will be an
+# associative array that (partly) simulates a TAP result object
+# from the `TAP::Parser` perl module.
+
+## ----------- ##
+##  FUNCTIONS  ##
+## ----------- ##
+
+function fatal(msg)
+{
+  print me ": " msg | "cat >&3"
+  exit 1
+}
+
+function abort(where)
+{
+  fatal("internal error " where)
+}
+
+# Convert a boolean to a "yes"/"no" string.
+function yn(bool)
+{
+  return bool ? "yes" : "no";
+}
+
+function add_test_result(result)
+{
+  if (!test_results_index)
+    test_results_index = 0
+  test_results_list[test_results_index] = result
+  test_results_index += 1
+  test_results_seen[result] = 1;
+}
+
+# Whether the test script should be re-run by "make recheck".
+function must_recheck()
+{
+  for (k in test_results_seen)
+    if (k != "XFAIL" && k != "PASS" && k != "SKIP")
+      return 1
+  return 0
+}
+
+# Whether the content of the log file associated to this test should
+# be copied into the "global" test-suite.log.
+function copy_in_global_log()
+{
+  for (k in test_results_seen)
+    if (k != "PASS")
+      return 1
+  return 0
+}
+
+# FIXME: this can certainly be improved ...
+function get_global_test_result()
+{
+    if ("ERROR" in test_results_seen)
+      return "ERROR"
+    all_skipped = 1
+    for (k in test_results_seen)
+      if (k != "SKIP")
+        all_skipped = 0
+    if (all_skipped)
+      return "SKIP"
+    if ("FAIL" in test_results_seen || "XPASS" in test_results_seen)
+      return "FAIL"
+    return "PASS";
+}
+
+function stringify_result_obj(obj)
+{
+  if (obj["is_unplanned"] || obj["number"] != testno)
+    return "ERROR"
+
+  if (plan_seen == LATE_PLAN)
+    return "ERROR"
+
+  if (result_obj["directive"] == "TODO")
+    return obj["is_ok"] ? "XPASS" : "XFAIL"
+
+  if (result_obj["directive"] == "SKIP")
+    return obj["is_ok"] ? "SKIP" : COOKED_FAIL;
+
+  if (length(result_obj["directive"]))
+      abort("in function stringify_result_obj()")
+
+  return obj["is_ok"] ? COOKED_PASS : COOKED_FAIL
+}
+
+function decorate_result(result)
+{
+  color_name = color_for_result[result]
+  if (color_name)
+    return color_map[color_name] "" result "" color_map["std"]
+  # If we are not using colorized output, or if we do not know how
+  # to colorize the given result, we should return it unchanged.
+  return result
+}
+
+function report(result, details)
+{
+  if (result ~ /^(X?(PASS|FAIL)|SKIP|ERROR)/)
+    {
+      msg = ": " test_script_name
+      add_test_result(result)
+    }
+  else if (result == "#")
+    {
+      msg = " " test_script_name ":"
+    }
+  else
+    {
+      abort("in function report()")
+    }
+  if (length(details))
+    msg = msg " " details
+  # Output on console might be colorized.
+  print decorate_result(result) msg | "cat >&3";
+  # Log the result in the log file too, to help debugging (this is
+  # especially true when said result is a TAP error or "Bail out!").
+  print result msg;
+}
+
+function testsuite_error(error_message)
+{
+  report("ERROR", "- " error_message)
+}
+
+function handle_tap_result()
+{
+  details = result_obj["number"];
+  if (length(result_obj["description"]))
+    details = details " " result_obj["description"]
+
+  if (plan_seen == LATE_PLAN)
+    {
+      details = details " # AFTER LATE PLAN";
+    }
+  else if (result_obj["is_unplanned"])
+    {
+       details = details " # UNPLANNED";
+    }
+  else if (result_obj["number"] != testno)
+    {
+       details = sprintf("%s # OUT-OF-ORDER (expecting %d)",
+                         details, testno);
+    }
+  else if (result_obj["directive"])
+    {
+      details = details " # " result_obj["directive"];
+      if (length(result_obj["explanation"]))
+        details = details " " result_obj["explanation"]
+    }
+
+  report(stringify_result_obj(result_obj), details)
+}
+
+# `skip_reason` should be emprty whenever planned > 0.
+function handle_tap_plan(planned, skip_reason)
+{
+  planned += 0 # Avoid getting confused if, say, `planned` is "00"
+  if (length(skip_reason) && planned > 0)
+    abort("in function handle_tap_plan()")
+  if (plan_seen)
+    {
+      # Error, only one plan per stream is acceptable.
+      testsuite_error("multiple test plans")
+      return;
+    }
+  planned_tests = planned
+  # The TAP plan can come before or after *all* the TAP results; we speak
+  # respectively of an "early" or a "late" plan.  If we see the plan line
+  # after at least one TAP result has been seen, assume we have a late
+  # plan; in this case, any further test result seen after the plan will
+  # be flagged as an error.
+  plan_seen = (testno >= 1 ? LATE_PLAN : EARLY_PLAN)
+  # If testno > 0, we have an error ("too many tests run") that will be
+  # automatically dealt with later, so do not worry about it here.  If
+  # $plan_seen is true, we have an error due to a repeated plan, and that
+  # has already been dealt with above.  Otherwise, we have a valid "plan
+  # with SKIP" specification, and should report it as a particular kind
+  # of SKIP result.
+  if (planned == 0 && testno == 0)
+    {
+      if (length(skip_reason))
+        skip_reason = "- "  skip_reason;
+      report("SKIP", skip_reason);
+    }
+}
+
+function extract_tap_comment(line)
+{
+  # FIXME: verify there is not an off-by-one bug here.
+  if (index(line, diag_string) == 1)
+    {
+      # Strip leading `diag_string` from `line`.
+      # FIXME: verify there is not an off-by-one bug here.
+      line = substr(line, length(diag_string) + 1)
+      # And strip any leading and trailing whitespace left.
+      sub("^[ \t]*", "", line)
+      sub("[ \t]*$", "", line)
+      # Return what is left (if any).
+      return line;
+    }
+  return "";
+}
+
+# When this function is called, we know that line is a TAP result line,
+# so that it matches the (perl) RE "^(not )?ok\b".
+function setup_result_obj(line)
+{
+  # Get the result, and remove it from the line.
+  result_obj["is_ok"] = (substr(line, 1, 2) == "ok" ? 1 : 0)
+  sub("^(not )?ok[ \t]*", "", line)
+
+  # If the result has an explicit number, get it and strip it; otherwise,
+  # automatically assing the next progresive number to it.
+  if (line ~ /^[0-9]+$/ || line ~ /^[0-9]+[^a-zA-Z0-9_]/)
+    {
+      match(line, "^[0-9]+")
+      # The final `+ 0` is to normalize numbers with leading zeros.
+      result_obj["number"] = substr(line, 1, RLENGTH) + 0
+      line = substr(line, RLENGTH + 1)
+    }
+  else
+    {
+      result_obj["number"] = testno
+    }
+
+  if (plan_seen == LATE_PLAN)
+    # No further test results are acceptable after a "late" TAP plan
+    # has been seen.
+    result_obj["is_unplanned"] = 1
+  else if (plan_seen && testno > planned_tests)
+    result_obj["is_unplanned"] = 1
+  else
+    result_obj["is_unplanned"] = 0
+
+  # Strip trailing and leading whitespace.
+  sub("^[ \t]*", "", line)
+  sub("[ \t]*$", "", line)
+
+  # This will have to be corrected if we have a "TODO"/"SKIP" directive.
+  result_obj["description"] = line
+  result_obj["directive"] = ""
+  result_obj["explanation"] = ""
+
+  # TODO: maybe we should allow a way to escape "#"?
+  if (index(line, "#") == 0)
+    return # No possible directive, nothing more to do.
+
+  # Directives are case-insensitive.
+  rx = "[ \t]*#[ \t]*([tT][oO][dD][oO]|[sS][kK][iI][pP])[ \t]*"
+
+  # See whether we have the directive, and if yes, where.
+  pos = match(line, rx "$")
+  if (!pos)
+    pos = match(line, rx "[^a-zA-Z0-9_]")
+
+  # If there was no TAP directive, we have nothing more to do.
+  if (!pos)
+    return
+
+  # Strip the directive and its explanation (if any) from the test
+  # description.
+  result_obj["description"] = substr(line, 1, pos - 1)
+  # Now remove the test description from the line, that has been dealt
+  # with already.
+  line = substr(line, pos)
+  # Strip the directive, and save its value (normalized to upper case).
+  sub("^[ \t]*#[ \t]*", "", line)
+  result_obj["directive"] = toupper(substr(line, 1, 4))
+  line = substr(line, 5)
+  # Now get the explanation for the directive (if any), with leading
+  # and trailing whitespace removed.
+  sub("^[ \t]*", "", line)
+  sub("[ \t]*$", "", line)
+  result_obj["explanation"] = line
+}
+
+function get_test_exit_message(status)
+{
+  if (status == 0)
+    return ""
+  if (status !~ /^[1-9][0-9]*$/)
+    abort("getting exit status")
+  if (status < 127)
+    exit_details = ""
+  else if (status == 127)
+    exit_details = " (command not found?)"
+  else if (status >= 128 && status <= 255)
+    exit_details = sprintf(" (terminated by signal %d?)", status - 128)
+  else if (status >= 256)
+    exit_details = " (abnormal termination)"
+  return sprintf("exited with status %d%s", status, exit_details)
+}
+
+function write_test_results()
+{
+  print ":global-test-result: " get_global_test_result() > trs_file
+  print ":recheck: "  yn(must_recheck()) > trs_file
+  print ":copy-in-global-log: " yn(copy_in_global_log()) > trs_file
+  for (i = 0; i < test_results_index; i += 1)
+    print ":test-result: " test_results_list[i] > trs_file
+  close(trs_file);
+}
+
+BEGIN {
+
+## ------- ##
+##  SETUP  ##
+## ------- ##
+
+'"$init_colors"'
+
+# Properly initialized once the TAP plan is seen.
+planned_tests = 0
+
+COOKED_PASS = expect_failure ? "XPASS": "PASS";
+COOKED_FAIL = expect_failure ? "XFAIL": "FAIL";
+
+# Enumeration-like constants to remember which kind of plan (if any)
+# has been seen.  It is important that NO_PLAN evaluates "false" as
+# a boolean.
+NO_PLAN = 0
+EARLY_PLAN = 1
+LATE_PLAN = 2
+
+testno = 0     # Number of test results seen so far.
+bailed_out = 0 # Whether a "Bail out!" directive has been seen.
+
+# Whether the TAP plan has been seen or not, and if yes, which kind
+# it is ("early" is seen before any test result, "late" otherwise).
+plan_seen = NO_PLAN
+
+## --------- ##
+##  PARSING  ##
+## --------- ##
+
+is_first_read = 1
+
+while (1)
+  {
+    # Involutions required so that we are able to read the exit status
+    # from the last input line.
+    st = getline
+    if (st < 0) # I/O error.
+      fatal("I/O error while reading from input stream")
+    else if (st == 0) # End-of-input
+      {
+        if (is_first_read)
+          abort("in input loop: only one input line")
+        break
+      }
+    if (is_first_read)
+      {
+        is_first_read = 0
+        nextline = $0
+        continue
+      }
+    else
+      {
+        curline = nextline
+        nextline = $0
+        $0 = curline
+      }
+    # Copy any input line verbatim into the log file.
+    print
+    # Parsing of TAP input should stop after a "Bail out!" directive.
+    if (bailed_out)
+      continue
+
+    # TAP test result.
+    if ($0 ~ /^(not )?ok$/ || $0 ~ /^(not )?ok[^a-zA-Z0-9_]/)
+      {
+        testno += 1
+        setup_result_obj($0)
+        handle_tap_result()
+      }
+    # TAP plan (normal or "SKIP" without explanation).
+    else if ($0 ~ /^1\.\.[0-9]+[ \t]*$/)
+      {
+        # The next two lines will put the number of planned tests in $0.
+        sub("^1\\.\\.", "")
+        sub("[^0-9]*$", "")
+        handle_tap_plan($0, "")
+        continue
+      }
+    # TAP "SKIP" plan, with an explanation.
+    else if ($0 ~ /^1\.\.0+[ \t]*#/)
+      {
+        # The next lines will put the skip explanation in $0, stripping
+        # any leading and trailing whitespace.  This is a little more
+        # tricky in truth, since we want to also strip a potential leading
+        # "SKIP" string from the message.
+        sub("^[^#]*#[ \t]*(SKIP[: \t][ \t]*)?", "")
+        sub("[ \t]*$", "");
+        handle_tap_plan(0, $0)
+      }
+    # "Bail out!" magic.
+    else if ($0 ~ /^Bail out!/)
+      {
+        bailed_out = 1
+        # Get the bailout message (if any), with leading and trailing
+        # whitespace stripped.  The message remains stored in `$0`.
+        sub("^Bail out![ \t]*", "");
+        sub("[ \t]*$", "");
+        # Format the error message for the
+        bailout_message = "Bail out!"
+        if (length($0))
+          bailout_message = bailout_message " " $0
+        testsuite_error(bailout_message)
+      }
+    # Maybe we have too look for dianogtic comments too.
+    else if (comments != 0)
+      {
+        comment = extract_tap_comment($0);
+        if (length(comment))
+          report("#", comment);
+      }
+  }
+
+## -------- ##
+##  FINISH  ##
+## -------- ##
+
+# A "Bail out!" directive should cause us to ignore any following TAP
+# error, as well as a non-zero exit status from the TAP producer.
+if (!bailed_out)
+  {
+    if (!plan_seen)
+      {
+        testsuite_error("missing test plan")
+      }
+    else if (planned_tests != testno)
+      {
+        bad_amount = testno > planned_tests ? "many" : "few"
+        testsuite_error(sprintf("too %s tests run (expected %d, got %d)",
+                                bad_amount, planned_tests, testno))
+      }
+    if (!ignore_exit)
+      {
+        # Fetch exit status from the last line.
+        exit_message = get_test_exit_message(nextline)
+        if (exit_message)
+          testsuite_error(exit_message)
+      }
+  }
+
+write_test_results()
+
+exit 0
+
+} # End of "BEGIN" block.
+'
+
+# TODO: document that we consume the file descriptor 3 :-(
+} 3>&1 >"$log_file" 2>&1
 
-echo "$0: still to be implemented, sorry" >&2
-exit 255
+test $? -eq 0 || fatal "I/O or internal error"
 
 # Local Variables:
 # mode: shell-script
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 337f8c6..c75e5d4 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -23,7 +23,7 @@ TEST_EXTENSIONS = .test .tap
 TEST_LOG_COMPILER = $(LOG_COMPILER)
 TAP_LOG_COMPILER = $(LOG_COMPILER)
 
-TAP_LOG_DRIVER = $(PERL) $(top_srcdir)/lib/tap-driver.pl
+TAP_LOG_DRIVER = AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/lib/tap-driver.sh
 TAP_LOG_DRIVER_FLAGS = --merge --comments
 ## Avoid spurious TAP diagnostic.  We use an awful indirection with a
 ## shell command substitution here, since the string needs to contain
@@ -1151,6 +1151,7 @@ testsuite-summary-count-many.log: 
extract-testsuite-summary
 # `tap-common-setup.test', and sources the `tap-setup.sh' helper
 # script.
 tap_with_common_setup_tests = \
+tap-ambiguous-directive.test \
 tap-autonumber.test \
 tap-bailout.test \
 tap-bailout-and-logging.test \
@@ -1180,9 +1181,13 @@ tap-merge-stdout-stderr.test \
 tap-no-merge-stdout-stderr.test \
 tap-no-disable-hard-error.test \
 tap-no-spurious-summary.test \
+tap-no-spurious-numbers.test \
 tap-no-spurious.test \
 tap-not-ok-skip.test \
+tap-number-wordboundary.test \
 tap-numeric-description.test \
+tap-negative-numbers.test \
+tap-numbers-leading-zero.test \
 tap-out-of-order.test \
 tap-passthrough.test \
 tap-passthrough-exit.test \
@@ -1190,18 +1195,24 @@ tap-plan.test \
 tap-plan-corner.test \
 tap-plan-errors.test \
 tap-plan-middle.test \
+tap-plan-whitespace.test \
+tap-plan-leading-zero.test \
+tap-plan-malformed.test \
 tap-missing-plan-and-bad-exit.test \
 tap-planskip.test \
 tap-planskip-late.test \
 tap-planskip-and-logging.test \
 tap-planskip-unplanned.test \
 tap-planskip-unplanned-corner.test \
+tap-planskip-case-insensitive.test \
 tap-planskip-whitespace.test \
 tap-planskip-badexit.test \
 tap-planskip-bailout.test \
 tap-planskip-later-errors.test \
 tap-realtime.test \
+tap-test-number-0.test \
 tap-recheck-logs.test \
+tap-result-comment.test \
 tap-todo-skip-together.test \
 tap-todo-skip-whitespace.test \
 tap-todo-skip.test \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index beada3f..1f2565a 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -298,7 +298,7 @@ LOG_COMPILER = $(SHELL)
 TEST_EXTENSIONS = .test .tap .ptest .shtst
 TEST_LOG_COMPILER = $(LOG_COMPILER)
 TAP_LOG_COMPILER = $(LOG_COMPILER)
-TAP_LOG_DRIVER = $(PERL) $(top_srcdir)/lib/tap-driver.pl
+TAP_LOG_DRIVER = AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/lib/tap-driver.sh
 TAP_LOG_DRIVER_FLAGS = --merge --comments --diagnostic-string `printf \
        '\043%%\043\n'`
 MAINTAINERCLEANFILES = 
@@ -1378,6 +1378,7 @@ yflags-var-expand.test
 # `tap-common-setup.test', and sources the `tap-setup.sh' helper
 # script.
 tap_with_common_setup_tests = \
+tap-ambiguous-directive.test \
 tap-autonumber.test \
 tap-bailout.test \
 tap-bailout-and-logging.test \
@@ -1407,9 +1408,13 @@ tap-merge-stdout-stderr.test \
 tap-no-merge-stdout-stderr.test \
 tap-no-disable-hard-error.test \
 tap-no-spurious-summary.test \
+tap-no-spurious-numbers.test \
 tap-no-spurious.test \
 tap-not-ok-skip.test \
+tap-number-wordboundary.test \
 tap-numeric-description.test \
+tap-negative-numbers.test \
+tap-numbers-leading-zero.test \
 tap-out-of-order.test \
 tap-passthrough.test \
 tap-passthrough-exit.test \
@@ -1417,18 +1422,24 @@ tap-plan.test \
 tap-plan-corner.test \
 tap-plan-errors.test \
 tap-plan-middle.test \
+tap-plan-whitespace.test \
+tap-plan-leading-zero.test \
+tap-plan-malformed.test \
 tap-missing-plan-and-bad-exit.test \
 tap-planskip.test \
 tap-planskip-late.test \
 tap-planskip-and-logging.test \
 tap-planskip-unplanned.test \
 tap-planskip-unplanned-corner.test \
+tap-planskip-case-insensitive.test \
 tap-planskip-whitespace.test \
 tap-planskip-badexit.test \
 tap-planskip-bailout.test \
 tap-planskip-later-errors.test \
 tap-realtime.test \
+tap-test-number-0.test \
 tap-recheck-logs.test \
+tap-result-comment.test \
 tap-todo-skip-together.test \
 tap-todo-skip-whitespace.test \
 tap-todo-skip.test \
diff --git a/tests/tap-msg0-result.test b/tests/tap-ambiguous-directive.test
similarity index 64%
copy from tests/tap-msg0-result.test
copy to tests/tap-ambiguous-directive.test
index 86259e5..78f9684 100755
--- a/tests/tap-msg0-result.test
+++ b/tests/tap-ambiguous-directive.test
@@ -15,43 +15,36 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - the string "0" as a test description
+#  - handling of "ambiguous" TODO and SKIP directives
+# See also related test 'tap-todo-skip-together.test'.
 
 parallel_tests=yes
 . ./defs || Exit 1
 
 . "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
 
-cat > all.test << 'END'
-1..10
-ok 1 0
-ok - 0
-not ok 3 0
-not ok - 0
-ok 5 0 # TODO
-ok - 0 # TODO
-not ok 7 0 # TODO
-not ok - 0 # TODO
-ok 9 0 # SKIP
-ok - 0 # SKIP
+cat > all.test <<END
+1..6
+ok 1 # foo SKIP
+not ok 2 # bar TODO
+ok 3 # :SKIP
+not ok 4 # :TODO
+ok 5 # SKIP SKIP
+not ok 6 # TODO TODO
 END
 
 $MAKE check >stdout && { cat stdout; Exit 1; }
 cat stdout
 
-count_test_results total=10 pass=2 fail=2 xpass=2 xfail=2 skip=2 error=0
+count_test_results total=6 pass=2 fail=2 xpass=0 xfail=1 skip=1 error=0
 
 cat > exp << 'END'
-PASS: all.test 1 0
-PASS: all.test 2 - 0
-FAIL: all.test 3 0
-FAIL: all.test 4 - 0
-XPASS: all.test 5 0 # TODO
-XPASS: all.test 6 - 0 # TODO
-XFAIL: all.test 7 0 # TODO
-XFAIL: all.test 8 - 0 # TODO
-SKIP: all.test 9 0 # SKIP
-SKIP: all.test 10 - 0 # SKIP
+PASS: all.test 1 # foo SKIP
+FAIL: all.test 2 # bar TODO
+PASS: all.test 3 # :SKIP
+FAIL: all.test 4 # :TODO
+SKIP: all.test 5 # SKIP SKIP
+XFAIL: all.test 6 # TODO TODO
 END
 
 $FGREP ': all.test' stdout > got
diff --git a/tests/tap-html.test b/tests/tap-html.test
index b5a1beb..07c0294 100755
--- a/tests/tap-html.test
+++ b/tests/tap-html.test
@@ -19,6 +19,7 @@
 #  - reStructuredText -> HTML conversion
 
 parallel_tests=yes
+required=rst2html
 . ./defs || Exit 1
 
 cat > Makefile.am << 'END'
diff --git a/tests/tap-msg0-result.test b/tests/tap-negative-numbers.test
similarity index 63%
copy from tests/tap-msg0-result.test
copy to tests/tap-negative-numbers.test
index 86259e5..9fdee87 100755
--- a/tests/tap-msg0-result.test
+++ b/tests/tap-negative-numbers.test
@@ -15,43 +15,38 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - the string "0" as a test description
+#  - don't spuriously recognize negative TAP result numbers, but correctly
+#    interpret them as test descriptions instead
 
 parallel_tests=yes
 . ./defs || Exit 1
 
 . "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
 
-cat > all.test << 'END'
-1..10
-ok 1 0
-ok - 0
-not ok 3 0
-not ok - 0
-ok 5 0 # TODO
-ok - 0 # TODO
-not ok 7 0 # TODO
-not ok - 0 # TODO
-ok 9 0 # SKIP
-ok - 0 # SKIP
+cat > all.test <<'END'
+1..7
+ok -1
+not ok -3
+ok -2 # SKIP
+not ok -5 # TODO
+ok -04 # TODO
+ok -121
+not ok -50000
 END
 
 $MAKE check >stdout && { cat stdout; Exit 1; }
 cat stdout
 
-count_test_results total=10 pass=2 fail=2 xpass=2 xfail=2 skip=2 error=0
-
-cat > exp << 'END'
-PASS: all.test 1 0
-PASS: all.test 2 - 0
-FAIL: all.test 3 0
-FAIL: all.test 4 - 0
-XPASS: all.test 5 0 # TODO
-XPASS: all.test 6 - 0 # TODO
-XFAIL: all.test 7 0 # TODO
-XFAIL: all.test 8 - 0 # TODO
-SKIP: all.test 9 0 # SKIP
-SKIP: all.test 10 - 0 # SKIP
+count_test_results total=7 pass=2 fail=2 xpass=1 xfail=1 skip=1 error=0
+
+cat > exp <<'END'
+PASS: all.test 1 -1
+FAIL: all.test 2 -3
+SKIP: all.test 3 -2 # SKIP
+XFAIL: all.test 4 -5 # TODO
+XPASS: all.test 5 -04 # TODO
+PASS: all.test 6 -121
+FAIL: all.test 7 -50000
 END
 
 $FGREP ': all.test' stdout > got
diff --git a/tests/tap-no-spurious-numbers.test 
b/tests/tap-no-spurious-numbers.test
new file mode 100755
index 0000000..e3ee0c8
--- /dev/null
+++ b/tests/tap-no-spurious-numbers.test
@@ -0,0 +1,99 @@
+#! /bin/sh
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# TAP support:
+#  - we shouldn't spuriously recognize as TAP result numbers what it
+#    not, even if it seems pretty close
+
+parallel_tests=yes
+. ./defs || Exit 1
+
+. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+
+cat > prefixes <<'END'
+A
+a
+_
++
+-
+=
+/
+*
+.
+:
+,
+;
+$
+@
+%
+&
+#
+?
+!
+|
+\
+"
+`
+'
+(
+)
+[
+]
+{
+}
+<
+>
+END
+
+n=`wc -l <prefixes`
+
+# See the loop below to understand this initialization.
+pass=`expr $n '*' 3`
+fail=$pass
+skip=`expr $pass - 3`
+xfail=$skip
+xpass=$xfail
+error=0
+total=`expr $pass + $fail + $skip + $xfail + $xpass`
+
+echo 1..$total > all.test
+
+highno=1000
+
+for result in 'ok' 'not ok'; do
+  for spacing in "" " " "$tab"; do
+    subst="$result &$spacing$higno"
+    sed -e "s|.*|$subst|" prefixes
+    for directive in TODO SKIP; do
+      test "$result $directive" != "not ok SKIP" || continue
+      sed -e '/^#$/d' -e "s|.*|$subst # $directive|" prefixes
+    done
+  done
+done >> all.test
+
+cat all.test # For debugging.
+
+# Sanity checks.
+grep '#.*#' all.test && framework_failure_ "creating all.test"
+test `wc -l <all.test` -lt $highno || framework_failure_ "creating all.test"
+
+$MAKE check >stdout || :
+cat stdout
+
+count_test_results total=$total pass=$pass fail=$fail skip=$skip \
+                   xpass=$xpass xfail=$xfail error=$error
+
+:
diff --git a/tests/tap-no-spurious.test b/tests/tap-no-spurious.test
index 11e2d1a..3e2afac 100755
--- a/tests/tap-no-spurious.test
+++ b/tests/tap-no-spurious.test
@@ -46,14 +46,10 @@ cat >> all.test <<END
  ok 1
 ${tab}ok
 ${tab}ok 1
-ok1
-ok23
  not ok
  not ok 1
 ${tab}not ok
 ${tab}not ok 1
-not ok1
-not ok23
 notok
 notok 1
 not${tab}ok
@@ -72,6 +68,20 @@ no ok 1
 #not ok 1
 END
 
+set +x # Don't pollute logs too much.
+for r in 'ok' 'not ok'; do
+  for s1 in \
+    a b c d e f g h i j k l m n o p q r s t u v w x y z \
+    A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
+    0 1 2 3 4 5 6 7 8 9 _ ab 0a 23 a1B2c _o _x_y_
+  do
+    for s2 in '' @ % + - = / . : \; \* \? \& \! \# \$ \< \> \\; do
+      printf '%s\n' "$r$s1$s2"
+    done
+  done
+done >> all.test
+set -x # Reset shell xtraces.
+
 # The prove(1) utility doesn't bail out on these, so our driver
 # shouldn't either.
 cat >> all.test <<'END'
@@ -88,6 +98,13 @@ Bail out
 # Bail out!
 END
 
+cat all.test # For debugging.
+
+# Minor sanity check.
+test `grep -c '^ok1$' all.test` -eq 1 \
+  && test `grep -c '^not ok1$' all.test` -eq 1 \
+  || framework_failure_ "creating all.test"
+
 $MAKE check >stdout || { cat stdout; Exit 1; }
 cat stdout
 
diff --git a/tests/tap-number-wordboundary.test 
b/tests/tap-number-wordboundary.test
new file mode 100755
index 0000000..74cddc1
--- /dev/null
+++ b/tests/tap-number-wordboundary.test
@@ -0,0 +1,112 @@
+#! /bin/sh
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# TAP support:
+#  - TAP result numbers terminated by a non-whitespace "word boundary"
+#    character are recognized
+
+parallel_tests=yes
+. ./defs || Exit 1
+
+. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+
+cat > all.test <<'END'
+1..5
+ok 1: foo1
+not ok 2- foo2
+ok 3@ foo3 # SKIP
+not ok 4?&%$ foo4 # TODO
+ok 5"`!! foo5 # TODO
+END
+
+$MAKE check >stdout && { cat stdout; Exit 1; }
+cat stdout
+
+count_test_results total=5 pass=1 fail=1 skip=1 xpass=1 xfail=1 error=0
+
+$EGREP '^PASS: all\.test 1 ?: foo1$' stdout
+$EGREP '^FAIL: all\.test 2 ?- foo2$' stdout
+$EGREP '^SKIP: all\.test 3 ?@ foo3 # SKIP$' stdout
+$EGREP '^XFAIL: all\.test 4 ?\?&%\$ foo4 # TODO$' stdout
+$EGREP '^XPASS: all\.test 5 ?"`!! foo5 # TODO$' stdout
+
+cat > all.test <<'END'
+1..3
+ok 2: quux
+not ok 1!
+ok 476$ # SKIP
+END
+
+$MAKE check >stdout && { cat stdout; Exit 1; }
+cat stdout
+
+count_test_results total=3 pass=0 fail=0 skip=0 xpass=0 xfail=0 error=3
+
+$EGREP '^ERROR: all\.test 2 ?: quux # OUT-OF-ORDER \(expecting 1\)$' stdout
+$EGREP '^ERROR: all\.test 1 ?! # OUT-OF-ORDER \(expecting 2\)$' stdout
+$EGREP '^ERROR: all\.test 476 ?\$ # OUT-OF-ORDER \(expecting 3\)$' stdout
+
+cat > punctuation <<'END'
+'
+"
+`
+#
+$
+!
+\
+/
+&
+%
+(
+)
+|
+^
+~
+?
+*
++
+-
+,
+:
+;
+=
+<
+>
+@
+[
+]
+{
+}
+\
+END
+
+# Strip any extra whitespace, for Solaris' wc.
+planned=`wc -l <punctuation | tr -d " $tab"`
+
+echo 1..$planned > all.test
+awk '{print "ok " NR $0 }' punctuation >> all.test
+# For debugging.
+cat all.test
+# Sanity check.
+grep "^ok 1'$" all.test || framework_failure_ "creating all.test"
+
+$MAKE check >stdout || { cat stdout; Exit 1; }
+cat stdout
+
+count_test_results total=$planned pass=$planned \
+                   fail=0 skip=0 xpass=0 xfail=0 error=0
+
+:
diff --git a/tests/tap-numbers-leading-zero.test 
b/tests/tap-numbers-leading-zero.test
new file mode 100755
index 0000000..81c9797
--- /dev/null
+++ b/tests/tap-numbers-leading-zero.test
@@ -0,0 +1,109 @@
+#! /bin/sh
+# Copyright (C) 2011 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# TAP support:
+#  - how does TAP result numbers with leading zero fares?
+
+parallel_tests=yes
+. ./defs || Exit 1
+
+. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+
+do_checks ()
+{
+  $MAKE check >stdout && { cat stdout; Exit 1; }
+  cat stdout
+  count_test_results "$@"
+  # Allow some normalization of leading zeros, without forcing it.
+  LC_ALL=C sed -n 's/: all\.test 0*\([0-9]\)/: all.test \1/p' stdout > got
+  cat exp
+  cat got
+  diff exp got
+}
+
+cat > all.test <<END
+1..15
+
+ok 01
+ok 0002
+
+not ok 03
+not ok 0004
+
+ok 05 # SKIP
+ok 0006 # SKIP
+
+not ok 07 # TODO
+not ok 0008 # TODO
+
+ok 009
+ok 010
+
+ok 00000011
+not ok 0012
+ok 00000013 # SKIP
+not ok 0014 # TODO
+ok 00000015 # TODO
+END
+
+cat > exp <<END
+PASS: all.test 1
+PASS: all.test 2
+FAIL: all.test 3
+FAIL: all.test 4
+SKIP: all.test 5 # SKIP
+SKIP: all.test 6 # SKIP
+XFAIL: all.test 7 # TODO
+XFAIL: all.test 8 # TODO
+PASS: all.test 9
+PASS: all.test 10
+PASS: all.test 11
+FAIL: all.test 12
+SKIP: all.test 13 # SKIP
+XFAIL: all.test 14 # TODO
+XPASS: all.test 15 # TODO
+END
+
+do_checks total=15 pass=5 fail=3 xpass=1 xfail=3 skip=3 error=0
+
+cat > all.test <<END
+1..8
+
+ok 010
+not ok 003
+ok 0001 # SKIP
+not ok 010 # TODO
+ok 00100 # TODO
+
+ok 06
+ok 00007
+ok 8
+END
+
+cat > exp <<END
+ERROR: all.test 10 # OUT-OF-ORDER (expecting 1)
+ERROR: all.test 3 # OUT-OF-ORDER (expecting 2)
+ERROR: all.test 1 # OUT-OF-ORDER (expecting 3)
+ERROR: all.test 10 # OUT-OF-ORDER (expecting 4)
+ERROR: all.test 100 # OUT-OF-ORDER (expecting 5)
+PASS: all.test 6
+PASS: all.test 7
+PASS: all.test 8
+END
+
+do_checks total=8 pass=3 fail=0 xpass=0 xfail=0 skip=0 error=5
+
+:
diff --git a/tests/tap-plan.test b/tests/tap-plan-leading-zero.test
similarity index 54%
copy from tests/tap-plan.test
copy to tests/tap-plan-leading-zero.test
index e2fda35..4c54649 100755
--- a/tests/tap-plan.test
+++ b/tests/tap-plan-leading-zero.test
@@ -15,38 +15,43 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - test scripts with the test plan at the beginning
-#  - test scripts with the test plan at the end
+#  - TAP plans with numbers having leading zeroes, as in "1..01"
+#  - TAP "SKIP" plans with multiple zeroes, as in "1..00 # SKIP"
+# This is consistent with the behaviour of the `prove' utility.
 
 parallel_tests=yes
 . ./defs || Exit 1
 
 . "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
 
-cat > top.test <<END
-1..3
+cat > a.test <<END
+1..01
 ok 1
-ok 2 # SKIP
-ok 3
-# a trailing comment
 END
 
-cat > bot.test <<END
+cat > b.test <<END
+1..0002
 ok 1
-# a comment
 ok 2
-not ok 3 # TODO
-# another comment
-ok
-1..4
 END
 
-for tap_flags in "" "--comments"; do
-  env TEST_LOG_DRIVER_FLAGS="$tap_flags" TESTS='top.test bot.test' \
-    $MAKE -e check >stdout || { cat stdout; Exit 1; }
-  cat stdout
-  count_test_results total=7 pass=5 xfail=1 skip=1 fail=0 xpass=0 error=0
-done
+echo 1..010 > c.test
+for i in 1 2 3 4 5 6 7 8 9 10; do echo ok $i; done >> c.test
 
+echo 1..00100 > d.test
+for i in 1 2 3 4 5 6 7 8 9 10; do
+  for j in 1 2 3 4 5 6 7 8 9 10; do
+    echo ok
+  done
+done >> d.test
+
+echo 1..00 > e.test
+echo '1..000 # SKIP' > f.test
+
+env TESTS='a.test b.test c.test d.test e.test f.test' \
+  $MAKE -e check >stdout || { cat stdout; Exit 1; }
+cat stdout
+
+count_test_results total=115 pass=113 xfail=0 skip=2 fail=0 xpass=0 error=0
 
 :
diff --git a/tests/tap-no-disable-hard-error.test 
b/tests/tap-plan-malformed.test
similarity index 58%
copy from tests/tap-no-disable-hard-error.test
copy to tests/tap-plan-malformed.test
index 678e184..9eb8698 100755
--- a/tests/tap-no-disable-hard-error.test
+++ b/tests/tap-plan-malformed.test
@@ -14,37 +14,47 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-# TAP support:
-#  - "Bail out!" magic and TAP parse errors are not disabled nor turned
-#    into simple failures by the definition DISABLE_HARD_ERRORS.
+# TAP support: a malformed TAP plan is not recognized.  The checks in
+# here should be consistent with the behaviour of the `prove' utility.
 
 parallel_tests=yes
 . ./defs || Exit 1
 
-cat > Makefile.am << 'END'
-DISABLE_HARD_ERRORS = yes
-TEST_LOG_COMPILER = cat
-TESTS = bail.test few.test noplan.test
+. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+
+cat > a.test <<END
+1..1 foo
 END
 
-. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+cat > b.test <<END
+ 1..2
+ok 1
+ok 2
+END
 
-cat > bail.test <<END
-1..1
-Bail out!
+cat > c.test <<END
+1..1 # SKIP
 END
 
-cat > few.test <<END
-1..1
+cat > d.test <<END
+1..2 # foo bar
+not ok 1 # TODO
+not ok 2 # TODO
 END
 
-cat > noplan.test <<END
-# nothing here
+cat > e.test <<END
+0..0
 END
 
-$MAKE check >stdout && { cat stdout; Exit 1; }
+tests_list=`echo *.test`
+
+TESTS="$tests_list" $MAKE -e check >stdout && { cat stdout; Exit 1; }
 cat stdout
 
-count_test_results total=3 pass=0 fail=0 xpass=0 xfail=0 skip=0 error=3
+count_test_results total=9 pass=2 fail=0 xpass=0 xfail=2 skip=0 error=5
+
+for tst in $tests_list; do
+  grep "^ERROR: $tst - missing test plan$" stdout
+done
 
 :
diff --git a/tests/tap-empty-diagnostic.test b/tests/tap-plan-whitespace.test
similarity index 72%
copy from tests/tap-empty-diagnostic.test
copy to tests/tap-plan-whitespace.test
index 6bcb8ce..3cdd79d 100755
--- a/tests/tap-empty-diagnostic.test
+++ b/tests/tap-plan-whitespace.test
@@ -15,27 +15,27 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - empty diagnostic messages are discarder
+#  - plan line with trailing whitespace is recognized and handled correctly
 
 parallel_tests=yes
 . ./defs || Exit 1
 
 . "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
 
-sed 's/\$$//' > all.test <<END
-1..1$
+sed 's/\$$//' > foo.test <<END
+1..2 $
 ok 1$
-#$
-# $
-#${tab}$
-#   ${tab} $tab${tab}$
+ok 2$
 END
 
-$MAKE check >stdout || { cat stdout; Exit 1; }
+cat > bar.test <<END
+1..1$tab   $tab$tab
+ok 1
+END
+
+TESTS='foo.test bar.test' $MAKE -e check >stdout || { cat stdout; Exit 1; }
 cat stdout
 
-grep '^PASS:.*all\.test' stdout # Sanity check.
-grep '#.*all\.test' stdout && Exit 1
-grep "all\.test[ $tab]*:[ $tab]*$" stdout && Exit 1
+count_test_results total=3 pass=3 fail=0 error=0 xpass=0 xfail=0 skip=0
 
 :
diff --git a/tests/tap-msg0-bailout.test 
b/tests/tap-planskip-case-insensitive.test
similarity index 62%
copy from tests/tap-msg0-bailout.test
copy to tests/tap-planskip-case-insensitive.test
index 6aa6d60..2ed2626 100755
--- a/tests/tap-msg0-bailout.test
+++ b/tests/tap-planskip-case-insensitive.test
@@ -15,24 +15,32 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - literal strings "0" and "0.0" as a test description in the message
-#    of a "plan with skip" TAP plan
-# generally true!
+#  - "SKIP" keyword in a TAP plan is case-insensitive
 
 parallel_tests=yes
 . ./defs || Exit 1
 
 . "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
 
-echo 'Bail out! 0' > a.test
-echo 'Bail out! 0.0' > b.test
+# These nested loops are clearer without indentation.
 
-TESTS='a.test b.test' $MAKE -e check >stdout && { cat stdout; Exit 1; }
+i=0
+for c1 in s S; do
+for c2 in k K; do
+for c3 in i I; do
+for c4 in p P; do
+  i=`expr $i + 1`
+  case $i in ?) i=0$i; esac
+  echo "1..0 # $c1$c2$c3$c4 foobar" > $i.test
+done; done; done; done
+
+TESTS="`echo *.test`" $MAKE -e check >stdout || { cat stdout; Exit 1; }
 cat stdout
 
-count_test_results total=2 pass=0 fail=0 xpass=0 xfail=0 skip=0 error=2
+count_test_results total=16 pass=0 fail=0 xpass=0 xfail=0 skip=16 error=0
 
-grep '^ERROR: a.test - Bail out! 0$' stdout
-grep '^ERROR: b.test - Bail out! 0\.0$' stdout
+for tst in *.test; do
+  grep "^SKIP: $tst .* foobar$" stdout
+done
 
 :
diff --git a/tests/tap-planskip-unplanned-corner.test 
b/tests/tap-planskip-unplanned-corner.test
index cf9f49e..4e825d5 100755
--- a/tests/tap-planskip-unplanned-corner.test
+++ b/tests/tap-planskip-unplanned-corner.test
@@ -38,7 +38,8 @@ cat stdout
 
 count_test_results total=5 pass=0 fail=0 xpass=0 xfail=0 skip=2 error=3
 
-grep '^SKIP: foo\.test$' stdout
+# Don't be too strict w.r.t. the format of the "skip whole test" message.
+grep '^SKIP: foo\.test$' stdout || grep '^SKIP: foo\.test [^0-9]' stdout
 grep '^ERROR: foo\.test 1 # UNPLANNED$' stdout
 grep '^ERROR: foo\.test - too many tests run (expected 0, got 1)$' stdout
 grep '^SKIP: bar\.test 1 # SKIP$' stdout
diff --git a/tests/tap-planskip.test b/tests/tap-planskip.test
index 2852305..35f7976 100755
--- a/tests/tap-planskip.test
+++ b/tests/tap-planskip.test
@@ -49,12 +49,12 @@ cat > wget.test <<END
 END
 
 cat > curl.test <<END
-1..0 # skip: Can't connect to gnu.org!
+1..0 # SKIP: Can't connect to gnu.org!
 # See also wget.test
 END
 
 cat > mu.test <<END
-1..0 # Skip $weirdchars
+1..0 # SKIP $weirdchars
 END
 
 env TESTS='foo.test bar.test baz.test wget.test curl.test mu.test' \
@@ -63,6 +63,10 @@ cat stdout
 
 count_test_results total=6 pass=0 fail=0 xpass=0 xfail=0 skip=6 error=0
 
+# Look for a regression where the "1..0" wasn't being stripped from the
+# SKIP message.
+$FGREP '1..0' stdout && Exit 1
+
 grep '^SKIP: foo\.test$' stdout
 grep '^SKIP: bar\.test$' stdout
 grep '^SKIP: baz\.test' stdout # Deliberately laxer, see above for why.
diff --git a/tests/tap-planskip-later-errors.test 
b/tests/tap-result-comment.test
similarity index 62%
copy from tests/tap-planskip-later-errors.test
copy to tests/tap-result-comment.test
index eb2ee26..0cfee01 100755
--- a/tests/tap-planskip-later-errors.test
+++ b/tests/tap-result-comment.test
@@ -15,7 +15,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - TAP errors following a "TAP plan with SKIP" are still diagnosed.
+#  - non-directive comments in TAP results are kept verbatim
 
 parallel_tests=yes
 . ./defs || Exit 1
@@ -23,18 +23,32 @@ parallel_tests=yes
 . "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
 
 cat > all.test <<END
-1..0
-a non-TAP line
-1..3
 1..5
-# a comment
-1..1
+ok 1 # TDO
+not ok 2 # SKP
+ok #SIKP${tab}${sp}
+not ok #    TOD${tab}
+ok 5 # ${tab}${tab}TOOD${tab}${sp}${sp}
 END
 
 $MAKE check >stdout && { cat stdout; Exit 1; }
 cat stdout
 
-count_test_results total=4 pass=0 fail=0 xpass=0 xfail=0 skip=1 error=3
-test `grep -c '^ERROR: all\.test - multiple test plans' stdout` -eq 3
+count_test_results total=5 pass=3 fail=2 xpass=0 xfail=0 skip=0 error=0
+
+# Don't be too strict about trailing white space.
+$FGREP ': all.test' stdout | sed "s/[$sp$tab]*$//" > got
+
+cat > exp <<END
+PASS: all.test 1 # TDO
+FAIL: all.test 2 # SKP
+PASS: all.test 3 #SIKP
+FAIL: all.test 4 #    TOD
+PASS: all.test 5 # ${tab}${tab}TOOD
+END
+
+cat exp
+cat got
+diff exp got
 
 :
diff --git a/tests/tap-signal.test b/tests/tap-signal.test
index 8ceeddd..7821a2a 100755
--- a/tests/tap-signal.test
+++ b/tests/tap-signal.test
@@ -55,22 +55,24 @@ signal_caught ()
   numeric=$1
   symbolic=$2
   sig_re="((SIG)?$symbolic|$numeric)"
-  tst_re="signal-$numeric\\.test"
-  if $EGREP "^ERROR: $tst_re - terminated by signal $sig_re$" stdout; then
-    return 0
-  elif test $have_solaris_bug = yes; then
-    case $symbolic in
-      INT|TERM) $EGREP "^ERROR: $tst_re - exited with status 208$" stdout;;
-             *) return 1;;
-    esac
-  else
-    return 1
-  fi
+  wbound_re="($|[^a-zA-Z0-9_-])"
+  pfx_re="^ERROR: signal-$numeric\\.test"
+  case $am_tap_implementation in
+    perl) rx="$pfx_re - terminated by signal $sig_re$";;
+    shell) rx="$pfx_re .*terminated by signal $sig_re$wbound_re";;
+    *) fatal_ "invalid \$am_tap_implementation '$am_tap_implementation'";;
+  esac
+  LC_ALL=C $EGREP "$rx" stdout && return 0
+  case $have_solaris_bug,$symbolic in
+    yes,INT|yes,TERM)
+      $EGREP "$pfx_re - exited with status 208( |$)" stdout && return 0;;
+  esac
+  return 1
 }
 
 all_signals_caught ()
 {
-  # This are the only signals that are portably trappable.
+  # These are the only signals that are portably trappable.
   signal_caught  1 HUP
   signal_caught  2 INT
   signal_caught 13 PIPE
diff --git a/tests/tap-no-disable-hard-error.test b/tests/tap-test-number-0.test
similarity index 51%
copy from tests/tap-no-disable-hard-error.test
copy to tests/tap-test-number-0.test
index 678e184..abce60e 100755
--- a/tests/tap-no-disable-hard-error.test
+++ b/tests/tap-test-number-0.test
@@ -15,36 +15,49 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # TAP support:
-#  - "Bail out!" magic and TAP parse errors are not disabled nor turned
-#    into simple failures by the definition DISABLE_HARD_ERRORS.
+#  - a test result numbered as 0 is to be considered out-of-order
+# This is consistent with the behaviour of the `prove' utility.
 
 parallel_tests=yes
 . ./defs || Exit 1
 
-cat > Makefile.am << 'END'
-DISABLE_HARD_ERRORS = yes
-TEST_LOG_COMPILER = cat
-TESTS = bail.test few.test noplan.test
+. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+
+cat > a.test <<END
+1..1
+ok 0
 END
 
-. "$testsrcdir"/tap-setup.sh || fatal_ "sourcing tap-setup.sh"
+cat > b.test <<END
+1..1
+not ok 0
+END
 
-cat > bail.test <<END
+cat > c.test <<END
 1..1
-Bail out!
+ok 0 foo # SKIP
 END
 
-cat > few.test <<END
+cat > d.test <<END
 1..1
+not ok 0 bar # TODO
 END
 
-cat > noplan.test <<END
-# nothing here
+cat > e.test <<END
+1..1
+ok 0 # TODO
 END
 
-$MAKE check >stdout && { cat stdout; Exit 1; }
+TESTS='a.test b.test c.test d.test e.test' $MAKE -e check >stdout \
+  && { cat stdout; Exit 1; }
 cat stdout
 
-count_test_results total=3 pass=0 fail=0 xpass=0 xfail=0 skip=0 error=3
+count_test_results total=5 pass=0 fail=0 xpass=0 xfail=0 skip=0 error=5
+
+grep '^ERROR: a\.test 0 # OUT-OF-ORDER (expecting 1)$' stdout
+grep '^ERROR: b\.test 0 # OUT-OF-ORDER (expecting 1)$' stdout
+grep '^ERROR: c\.test 0 foo # OUT-OF-ORDER (expecting 1)$' stdout
+grep '^ERROR: d\.test 0 bar # OUT-OF-ORDER (expecting 1)$' stdout
+grep '^ERROR: e\.test 0 # OUT-OF-ORDER (expecting 1)$' stdout
 
 :
diff --git a/tests/tap-todo-skip-together.test 
b/tests/tap-todo-skip-together.test
index 14b8ed5..0f4a943 100755
--- a/tests/tap-todo-skip-together.test
+++ b/tests/tap-todo-skip-together.test
@@ -16,6 +16,7 @@
 
 # TAP support:
 #  - TODO and SKIP directives on the same line: the first one wins
+# See also related test 'tap-ambiguous-directive.test'.
 
 parallel_tests=yes
 . ./defs || Exit 1


hooks/post-receive
-- 
GNU Automake



reply via email to

[Prev in Thread] Current Thread [Next in Thread]