#! /bin/sh # Copyright (C) 2011-2013 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 . # 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 :