#! /bin/sh
# Copyright (C) 2011-2025 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 <https://www.gnu.org/licenses/>.

# TAP support: more unusual forms for valid TAP input.
# See also related test 'tap-fancy.sh'.

. test-init.sh

. tap-setup.sh

#
# From manpage Test::Harness::TAP(3):
#
#   Lines written to standard output matching /^(not )?ok\b/ must be
#   interpreted as test lines. All other lines must not be considered
#   test output.
#
# Unfortunately, the exact format of TODO and SKIP directives is not as
# clearly described in that manpage; but a simple reverse-engineering of
# the prove(1) utility shows that it is probably given by the perl regex
# /#\s*(TODO|SKIP)\b/.
#

# To avoid problems with backslashes in echo arguments.
xecho () { printf '%s\n' "$*"; }

# There are 34 values for $str ...
for str in \
  \'  \
  '"' \
  '`' \
  '#' \
  '$' \
  '!' \
  '\' \
  '/' \
  '&' \
  '%' \
  '(' \
  ')' \
  '|' \
  '^' \
  '~' \
  '?' \
  '*' \
  '+' \
  '-' \
  ',' \
  ':' \
  ';' \
  '=' \
  '<' \
  '>' \
  '@' \
  '[' \
  ']' \
  '{' \
  '}' \
  '\\' \
  '...' \
  '?[a-zA-Z0-9]*' \
  '*.*' \
; do
  # ... each of them add 1 pass, 1 fail, ...
  xecho "ok${str}"
  xecho "not ok${str}"
  # ... and (generally) 4 skips, 4 xfails, and 4 xpasses ...
  for settings in \
    'result="ok" directive=SKIP' \
    'result="not ok" directive=TODO' \
    'result="ok" directive=TODO' \
  ; do
    eval "$settings"
    xecho "${result}# ${directive}${str}"
    # ... but 6 skips, 6 xpasses and 6 xfails are to be removed, since
    # they might not work with $str = '#' or $str = '\' ...
    if test x"$str" != x'#' && test x"$str" != x'\'; then
      xecho "${result}${str}#${directive}"
      xecho "${result}${str}#   ${tab}${tab} ${directive}"
      xecho "${result}${str}#${directive}${str}"
    fi
  done
done > all.test

# Sanity check against a previous use of unportable usages of backslashes
# with the "echo" builtin.
if grep '[^\\]\\#' all.test; then
  framework_failure_ "writing backslashes in all.test"
fi

# ... so that we finally have:
pass=34
fail=34
xfail=130 # = 4 * 34 - 6
xpass=130 # = 4 * 34 - 6
skip=130  # = 4 * 34 - 6
error=0
total=$(($pass + $fail + $xfail + $xpass + $skip))

# Even nastier!  But accordingly to the specifics, it should still work.
for result in 'ok' 'not ok'; do
  echo "${result}{[(<#${tab}TODO>)]}" >> all.test
done
echo "ok{[(<#${tab}SKIP>)]}" >> all.test

# We have to update some test counts.
xfail=$(($xfail + 1))
xpass=$(($xpass + 1))
skip=$(($skip + 1))
total=$(($total + 3))

# And add the test plan!
echo 1..$total >> all.test

run_make -O -e FAIL check

$EGREP '^(PASS|FAIL|SKIP).*#.*TODO' stdout && exit 1
$EGREP '^X?(PASS|FAIL).*#.*SKIP' stdout && exit 1

count_test_results total=$total pass=$pass fail=$fail skip=$skip \
                   xpass=$xpass xfail=$xfail error=$error

:
