#! /bin/sh # Copyright (C) 2005-2015, 2018-2022 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 . 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 "$@" - 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 # Ignore informational messages from the JVM. if ! $noerr; then sed \ -e '/^Picked up _JAVA_OPTIONS: /d' \ -e 's/Reducing stack by rule .* (line .*):/Reducing stack by rule XX (line XXX):/g' \ -e 's/^/err: /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