| #! /bin/sh | |
| # Copyright (C) 2005-2015, 2018-2021 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 3 of the License, 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/>. | |
| SHELL=/bin/sh | |
| export SHELL | |
| me=$(basename "$1" .test) | |
| medir=$(dirname "$1" | sed -e 's,.*examples/,,') | |
| # Number of the current test. | |
| number=1 | |
| # Exit status of this script. | |
| status=0 | |
| # top_builddir. | |
| cwd=$(pwd) | |
| # Whether to strip '> ...' lines from the expected output. | |
| # See bistromathic.test. | |
| strip_prompt=false | |
| # If diff supports --strip-trailing-cr, use it, to avoid EOL issues | |
| # when testing Java programs on Windows. | |
| echo "checking for diff --strip-trailing-cr..." | |
| diff_opts= | |
| if diff --strip-trailing-cr "$1" "$1"; then | |
| diff_opts=--strip-trailing-cr | |
| fi | |
| echo "checking for diff --strip-trailing-cr... $diff_opts" | |
| # The exercised program. | |
| abs_medir=$cwd/examples/$medir | |
| if test -x "$abs_medir/$me"; then | |
| prog () | |
| { | |
| "$abs_medir/$me" "$@" | |
| } | |
| elif test -f "$abs_medir/$me.class"; then | |
| prog () | |
| { | |
| "$SHELL" "$cwd/javaexec.sh" -cp "$abs_medir" "$me" "$@" | |
| } | |
| else | |
| echo "$me: ERROR: cannot find program to exercise in:" | |
| echo "$me: ERROR: $cwd/examples/$medir/$me" | |
| exit 1 | |
| fi | |
| # cleanup | |
| # ------- | |
| cleanup () | |
| { | |
| status=$? | |
| if test -z "$DEBUG"; then | |
| cd "$cwd" | |
| rm -rf $$.dir | |
| fi | |
| exit $status | |
| } | |
| trap cleanup 0 1 2 13 15 | |
| mkdir $$.dir | |
| cd $$.dir | |
| # skip [MSG] | |
| # ---------- | |
| # Skip this test. | |
| skip () | |
| { | |
| if test x"$1" != x; then | |
| echo "SKIP: $1" | |
| fi | |
| # See Autoconf's doc on 'trap'. | |
| (exit 77); exit 77 | |
| } | |
| # run [-n, -noerr, -t] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS] | |
| # -------------------------------------------------------------------------- | |
| # -n: no final end-of-line in expected-output | |
| # -noerr: ignore stderr, otherwise merge it into effective output. | |
| # -t: nuke the possible trailing white spaces in the effective output. | |
| run () | |
| { | |
| echo=echo | |
| noerr=false | |
| rstrip=false | |
| while true; do | |
| case $1 in | |
| (-n) echo=printf; shift;; | |
| (-noerr) noerr=true; shift;; | |
| (-t) rstrip=true; shift;; | |
| (*) break;; | |
| esac | |
| done | |
| # Expected exit status. | |
| sta_exp=$1 | |
| shift | |
| # Expected output. | |
| $echo "$1" | | |
| sed -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' | | |
| if $strip_prompt; then | |
| # An extra EOL added in bistromathic's main. Keep that empty line. | |
| sed -e '/^> ./d;s/^> $//g' | |
| else | |
| cat | |
| fi >exp | |
| shift | |
| # Effective exit status. | |
| sta_eff=0 | |
| prog "$@" - <input >out_eff 2>err_eff || sta_eff=$? | |
| # Combine effective output and error streams. | |
| { | |
| if $rstrip; then | |
| sed -e 's/ *$//g' out_eff | |
| else | |
| cat out_eff | |
| fi | |
| if ! $noerr; then | |
| sed -e 's/^/err: /g' \ | |
| -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' \ | |
| err_eff | |
| fi | |
| } >eff | |
| if test $sta_eff -eq $sta_exp; then | |
| if diff $diff_opts eff exp >/dev/null 2>&1; then | |
| echo "$me: PASS: $number" | |
| else | |
| echo "$me: FAIL: $number" | |
| echo "$me: input:" | |
| sed -e 's/^/ /' input | |
| echo "$me: expected output:" | |
| sed -e 's/^/ /' exp | |
| echo "$me: effective output:" | |
| sed -e 's/^/ /' eff | |
| echo "$me: diff:" | |
| diff $diff_opts -u exp eff | sed -e 's/^/ /' | |
| status=1 | |
| fi | |
| else | |
| echo "$me: FAIL: $number (expected status: $sta_exp, effective: $sta_eff)" | |
| cat err_eff | |
| status=1 | |
| fi | |
| number=$(expr $number + 1) | |
| } | |
| # We have cd'd one level deeper. | |
| case $1 in | |
| /*) . "$1" || status=2;; | |
| *) . "../$1" || status=2;; | |
| esac | |
| exit $status |