#! /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}

# Set srcdir, which is the directory which contains Execute-Tests (this
# script), programs that run the test, including *.test and helpers that they
# invoke, the list of tests to run ('Test-Order'), and *.ok files that
# indicate the expected results of tests.

srcdir=$(dirname $0)

# Provision to run programs under valgrind.
# export PBM_TESTPREFIX="valgrind --log-fd=4 "${PBM_TESTPREFIX}

# 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) || 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 TESTABLE" "TOTAL TESTABLE")

# Copy test files to the current work directory

if [ ! -f ./testgrid.pbm ]
  then cp -v ${srcdir}/testgrid.pbm ./testgrid.pbm
fi

if [ ! -f ./testimg.ppm ]
  then cp -v ${srcdir}/testimg.ppm  ./testimg.ppm 
fi

# Add PBM_BINPREFIX to PATH.
# This is necessary for Netpbm programs that call other Netpbm programs.

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

export PATH=${srcdir}:$PATH

# 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 default the tests are executed in the order described in the
# file Test-Order.  Copy this file from the source directory
# to the work directory.
#
# The string "target" is a comma-separated list of target programs.
# When set only tests for programs in the list will be run.
# 
# The --no-clobber version comes useful when the user wants a modified
# (pared-down) version of Test-Order.

if [ ! -z $target ]
  then echo $target | sed 's/,/\n/g' | \
                       sed 's/^/\${PBM_TESTPREFIX}/' | \
                       grep -f - ${srcdir}/*.test -l | \
                       while read i ; do echo ${i##*/} ; done | 
                       grep -f - ${srcdir}/Test-Order > ./Test-Order ; 
  else 
       cp ${srcdir}/Test-Order ./Test-Order ;
       #cp --no-clobber ${srcdir}/Test-Order ./Test-Order ;
fi

#let array[5]=0

for t in `grep -v "^#" ./Test-Order | fgrep ".test"`
do
echo == $t ==
${srcdir}/$t >  ${t%.test}.out ; let result=$?
case $result in
0)   cmp -s ${t%.test}.out ${srcdir}/${t%.test}.ok ;
     if [ $? -eq 0 ]
        then let result=0;  rm  ${t%.test}.out ;
        else let result=1;
             grep "^##" ${srcdir}/$t   # Print failure message.
     fi
     let testable=1 ;;
80) let result=4 ; let testable=0;;
*)  let result=1 ; let testable=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]}+$testable

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 || s -eq 5 ]]
    then echo ${status[${s}]} ${array[${s}]}
    fi
  done

echo ==================
echo "All tests done."
date -R -u


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

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