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

# Custom test drivers: check that we can easily support test protocols
# that allow multiple testcases in a single test script.  This test not
# only checks implementation details in Automake's custom test drivers
# support, but also serves as a "usability test" for our APIs.

. test-init.sh

cp "$am_testaux_srcdir"/trivial-test-driver . \
  || fatal_ "failed to fetch auxiliary script trivial-test-driver"

cat >> configure.ac << 'END'
AC_OUTPUT
END

cat > Makefile.am << 'END'
TEST_EXTENSIONS = .t
T_LOG_DRIVER = $(SHELL) $(srcdir)/trivial-test-driver

TESTS = \
  pass.t \
  fail.t \
  fail2.t \
  pass-fail.t \
  pass4-skip.t \
  pass3-skip2-xfail.t \
  pass-xpass-fail-xfail-skip-error.t
END

cat > pass.t << 'END'
echo %% pass %%
echo PASS: pass
END

cat > fail.t << 'END'
echo %% fail %%
echo FAIL: fail
END

cat > fail2.t << 'END'
echo %% fail2 %%
echo FAIL: stdout >&1
echo FAIL: stderr >&2
echo :PASS: this should be ignored
END

cat > pass-fail.t << 'END'
echo %% pass-fail %%
echo 'FAIL: this fails :-('
echo 'some random message'
echo 'some random warning' >&2
echo 'PASS: this passes :-)'
echo 'INFO: blah'
echo 'WARNING: blah blah' >&2
END

cat > pass4-skip.t << 'END'
echo %% pass4-skip %%
echo PASS: on stdout >&1
echo PASS: on stderr >&2
echo PASS: 3
echo PASS: 4
echo SKIP: 1
echo this FAIL: should be ignored
echo FAIL as should this
exit 99
END

cat > pass3-skip2-xfail.t << 'END'
echo %% pass4-skip2-xfail %%
echo 'PASS: -v'
echo 'PASS: --verbose'
echo 'SKIP: Oops, unsupported system.'
echo 'PASS: -#-#-#-'
cp || echo "SKIP: cp cannot read users' mind" >&2
mv || echo "XFAIL: mv cannot read users' mind yet"
exit 127
END

cat > pass-xpass-fail-xfail-skip-error.t << 'END'
echo PASS:
echo FAIL:
echo XFAIL:
echo XPASS:
echo SKIP:
echo ERROR:
echo %% pass-xpass-fail-xfail-skip-error %%
END

chmod a+x *.t

$ACLOCAL
$AUTOCONF
$AUTOMAKE

for vpath in : false; do
  if $vpath; then
    mkdir build
    cd build
    srcdir=..
  else
    srcdir=.
  fi

  $srcdir/configure

  run_make -O -e FAIL check || { cat test-suite.log; exit 1; }
  cat test-suite.log
  # Couple of sanity checks.  These might need to be updated if the
  # 'trivial-test-driver' script is changed.
  $FGREP INVALID.NAME stdout test-suite.log && exit 1
  test -f BAD.LOG && exit 1
  test -f BAD.TRS && exit 1
  # These log files must all have been created by the testsuite.
  cat pass.log
  cat fail.log
  cat fail2.log
  cat pass-fail.log
  cat pass4-skip.log
  cat pass3-skip2-xfail.log
  cat pass-xpass-fail-xfail-skip-error.log

  count_test_results total=23 pass=10 fail=5 skip=4 xfail=2 xpass=1 error=1

  tst=pass-xpass-fail-xfail-skip-error
  grep  "^PASS: $tst\.t, testcase 1" stdout
  grep  "^FAIL: $tst\.t, testcase 2" stdout
  grep "^XFAIL: $tst\.t, testcase 3" stdout
  grep "^XPASS: $tst\.t, testcase 4" stdout
  grep  "^SKIP: $tst\.t, testcase 5" stdout
  grep "^ERROR: $tst\.t, testcase 6" stdout

  # Check that the content of, and only of, the test logs with at least
  # one failing test case has been copied into 'test-suite.log'.  Note
  # that test logs containing skipped or xfailed test cases are *not*
  # copied into 'test-suite.log' -- a behavior that deliberately differs
  # from the one of the built-in Automake test drivers.
  grep '%%' test-suite.log # For debugging.
  grep '%% fail %%' test-suite.log
  grep '%% fail2 %%' test-suite.log
  grep '%% pass-fail %%' test-suite.log
  grep '%% pass-xpass-fail-xfail-skip-error %%' test-suite.log
  test $(grep -c '%% ' test-suite.log) -eq 4

  run_make -O TESTS='pass.t pass3-skip2-xfail.t' check
  cat test-suite.log
  count_test_results total=7 pass=4 fail=0 skip=2 xfail=1 xpass=0 error=0

  cd $srcdir

done

:
