#! /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 [-noerr, -n] EXPECTED-EXIT-STATUS EXPECTED-OUTPUT [PARSER-OPTIONS]
# ----------------------------------------------------------------------
# -noerr: ignore stderr, otherwise merge it into effective output.
# -n: not final end-of-line in expected-output
run ()
{
  noerr=false
  echo=echo
  while true; do
    case $1 in
      (-noerr) noerr=true; shift;;
      (-n)     echo=printf; 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.
  {
    cat out_eff
    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
