#!/bin/bash
function absdirname() {
  pushd $(dirname $0) >> /dev/null
    pwd
  popd >> /dev/null
}

BINDIR=$(absdirname "$0")
PHP=${PHP:-php}
PHPUNIT=${PHPUNIT:-phpunit}
MODE=standalone
XMLDIR=
JSONDIR=

while [ -n "$1" ]; do
  ARG="$1"
  shift

  case "$ARG" in
    --civi)
      MODE=civi
      ;;
    --civibuild-restore)
      CIVIBUILD_RESTORE="$1"
      shift
      ;;
    --test-dir)
      TESTSUITE="$1"
      shift
      ;;
    --json-dir)
      JSONDIR="$1"
      [ ! -d "$JSONDIR" ] && mkdir -p "$JSONDIR"
      shift
      ;;
    --xml-dir)
      XMLDIR="$1"
      [ ! -d "$XMLDIR" ] && mkdir -p "$XMLDIR"
      shift
      ;;
    *)
      echo "unrecognized option: $ARG"
      ;;
  esac
done


if [ -z "$TESTSUITE" ]; then
  echo "summary: Executes all tests in a suite (individually)"
  echo "usage: $0 --test-dir <dir> [--json-dir <dir>] [--xml-dir <dir>] [--civi] [--civibuild-restore <build-name>]"
  exit 1
fi


#phpunit-ls "$TESTSUITE"
$BINDIR/phpunit-ls "$TESTSUITE" | while read FILE CLASS METHOD ; do
  if [ -z "$FILE" -o ! -f "$FILE" ]; then continue; fi
  echo "[[Processing $FILE $CLASS::$METHOD]]"
  ## Optionally reset DBs
  if [ -n "$CIVIBUILD_RESTORE" ]; then
    civibuild restore "$CIVIBUILD_RESTORE"
  fi

  ## Prepare test command
  PHPUNITARGS="--tap"
  if [ -n "$JSONDIR" ]; then
    PHPUNITARGS="$PHPUNITARGS --log-json $JSONDIR/$CLASS-$METHOD.json"
  fi
  if [ -n "$XMLDIR" ]; then
    PHPUNITARGS="$PHPUNITARGS --log-junit $XMLDIR/$CLASS-$METHOD.xml"
  fi

  ## Run the test!
  if [ "$MODE" == "civi" ]; then
    $PHP ./scripts/phpunit $PHPUNITARGS --filter $METHOD'( with.*)?$' "$CLASS"
  fi
  if [ "$MODE" == "standalone" ]; then
    $PHP $(which $PHPUNIT) $PHPUNITARGS --filter $METHOD'( with.*)?$' "$FILE"
  fi
done
