blob: 32752c463ef0123b084bf2984b3d2124cc8fba47 [file] [log] [blame]
#! /bin/sh
# Copyright (C) 2011-2018 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
: