#! /bin/bash

# Confirm that PBM_TESTPREFIX is set.
# PBM_TESTPREFIX is the directory with the Netpbm programs you want to
# test.  If set to null, executables will be sought from the default
# execution path ($PATH).  Usually you should explicitly set this.
#
# You can set it here by de-commenting and modifying the next line:
#export PBM_TESTPREFIX="/usr/local/bin/"

if [ -z $PBM_TESTPREFIX ]
  then
  echo "Warning: PBM_TESTPREFIX is not set."
  echo "Programs in the default execution path:"
  echo $PATH
  echo "will be tested."
elif [ ! -d $PBM_TESTPREFIX ]
  then
  echo "Error: No directory named $PBM_TESTPREFIX"
  exit 1
else
  # append "/" to end of string if necessary
  export PBM_TESTPREFIX=$(echo $PBM_TESTPREFIX | sed '/\/$/!s@$@/@')
fi

# Set PBM_BINPREFIX.
# PBM_BINPREFIX is the directory where Netpbm programs which play
# auxiliary roles in tests (such as image generators for producing
# test images, analyzers to summarize output and so forth).
#
# If testing a fresh install, this should be the same as PBM_TESTPREFIX.
# If you are developing a single Netpbm program, you may want to
# set this to a directory with stable executables.  (Final "/" is
# mandatory.)
# If set to null, executables in the default execution path will
# be used.

# export PBM_BINPREFIX="/usr/local/bin/"
# export PBM_BINPREFIX=""
export PBM_BINPREFIX=${PBM_TESTPREFIX}

# Add PBM_BINPREFIX to PATH.
# This is necessary for Netpbm programs (mosly scripts) that call
# other Netpbm programs.

if [ ! -z $PBM_BINPREFIX ]
  then
  export PATH=${PBM_BINPREFIX}:$PATH
fi

# Set srcdir, which is the directory which contains Execute-Tests
# (this script), Test-Order *.test and *.ok files.

srcdir=$(dirname $0)

# Set tmpdir, which is used in some of the test scripts.  By default
# this is created by mktemp.  The user can override and specify tmpdir,
# but in this case it must be an existing directory and must not be
# either $srcdir or current work.

if [ -z $tmpdir ]
  then
  tmpdir_created=$(mktemp -d TestPBM-XXXXXXX) || exit 1;
  export tmpdir=${tmpdir_created}
  else
  tmpdir_created="";
  if [ ! -d ${tmpdir} ]
     then echo "Specified temporary directory $tmpdir does not exist."
     exit 1;
  elif [ ${tmpdir} -ef ${srcdir} ]
     then echo "Temporary directory must not be $srcdir."
     exit 1;
  elif [ ${tmpdir} -ef $PWD ]
     then echo "Temporary directory must not be current directory."
     exit 1;
  fi
fi


# If necessary set the RGBDEF environment variable.
#export RGBDEF=/etc/rgb.txt
#export RGBDEF=/usr/local/netpbm/lib/rgb.txt
#export RGBDEF=/usr/share/emacs/*/etc/rgb.txt

# Declare arrays used to count and report test results.
# For now only "SUCCESS" and "FAILURE" are used.
declare -a array=(0 0 0 0 0 0)
declare -a status=("SUCCESS" "FAILURE" "UNEXPECTED SUCCESS"
                   "EXPECTED FAILURE" "NOT SUPPORTED" "TOTAL SUPPORTED")

# Copy test files to the current work directory

cp -n -t . ${srcdir}/testgrid.pbm ${srcdir}/testimg.ppm 

# Execute the tests, as described in the "Test-Order" file.
#
# Each test outputs a ".out" file, which is compared against a
# corresponding ".ok" file.  For example the output from "pbmmake.test"
# is "pbmmake.out" and when this matches "pbmmake.ok" we declare the
# test a success.
# In the error case the ".out" file is retained in the current work
# directory.
#
# All tests are self-contained.
#
# By defeault the tests are executed in the order described in the
# file Test-Order.  Normally the Test-Order in the source directory
# will be used, but the user can override this with a file named
# Test-Order placed in the work directory.  (This feature comes useful
# when you want to pare down the list.)

if [ ! -f ./Test-Order ]
then cp ${srcdir}/Test-Order ./Test-Order
fi

for t in `grep -v "^#" ./Test-Order | fgrep ".test"`
do
echo == $t ==
${srcdir}/$t >  ${t%.test}.out ; let result=$?
case $result in
0)   cmp --quiet ${t%.test}.out ${srcdir}/${t%.test}.ok ;
     if [ $? -eq 0 ]
        then let result=0;  rm  ${t%.test}.out ;
        else let result=1;
     fi
     let supported=1 ;;
*) let result=1 ; let supported=1;;
esac


# Report whether a single test succeeded or failed.
# Increment counters.

echo $t: ${status[${result}]}; echo
let array[${result}]=${array[${result}]}+1
let array[5]=${array[5]}+$supported

done


# Erase temporary directory and its contents, if it was created.

if [ -n $tmpdir_created ]
    then rm -rf $tmpdir_created
fi


# Erase test image files in the current (work) directory.
# (Do not erase them if we are working from the source directory.)

if [ ! $PWD -ef ${srcdir} ]
    then rm ./testimg.ppm ./testgrid.pbm
fi


# Calculate success / failure totals and print a summary report.
# Report date and time of completion.

echo "Test summary:"
echo ==================

for s in 0 1 2 3 4 5
  do
    if [[ ${array[${s}]} -gt 0 || s -eq 1 ]]
    then echo ${status[${s}]} ${array[${s}]}
    fi
  done

echo ==================
echo "All tests done."
date --rfc-3339=seconds


# Exit with status 0 if all supported tests succeeded, 1 otherwise.

if [[ ${array[0]} -eq ${array[5]} ]]
then exit 0
else exit 1
fi
