#!/bin/bash
####################################################################
function show_help() {
  echo "Jeanine Matthews - Divergent Hunter"
  echo "summary: Execute test suite in multiple ways and compare results"
  echo "usage: env [var1=... var2=...] $0 [--bundled-full|--bf] [--bundled-indiv|--bi] [--standalone-full|--sf] [--standalone-indiv|--si] [--compare]"
  echo "Optional variables:"
  echo "  - CIVI: Path to Civi installation [$CIVI]"
  echo "  - PHP: Path to PHP binary [$PHP]"
  echo "  - PHPUNIT: Path to phpunit binary [$PHPUNIT]"
  echo "  - TESTCLASS: PHP class name for the test case/suite [$TESTCLASS]"
  echo "  - TESTPATH: Path for the test file/directory (Note: MUST match TESTCLASS) [$TESTPATH]"
  echo "  - OUTDIR: Folder to which outputs are written [$OUTDIR]"
}

function reset_dir() {
  [ -d "$1" ] && rm -rf "$1"
  mkdir -p "$1"
}

####################################################################
## Env
export PHP=${PHP:-php}
export PHPUNIT=${PHPUNIT:-phpunit}
export TESTCLASS=${TESTCLASS:-api_v3_AllTests}
export TESTPATH=${TESTPATH:-tests/phpunit/api/v3}
export CIVI=$(realpath "${CIVI:-.}")
export OUTDIR=$(realpath "${OUTDIR:-output}")

####################################################################
## Main
if [ -z "$1" ];then
  show_help
  exit 1
fi

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

  case "$OPTION" in
    --bundled-full|--bf)
      echo "[[ Prepare $OUTDIR/bundled-full ]]"

      [ -d "packages/PHPUnit.bak" ] && mv "packages/PHPUnit.bak" "packages/PHPUnit"
      if [ ! -d "$CIVI/packages/PHPUnit" ]; then
        echo "Missing $CIVI/packages/PHPUnit"
        exit 2
      fi

      reset_dir "$OUTDIR/bundled-full"

      pushd "$CIVI/tools"
        $PHP ./scripts/phpunit --tap --log-json "$OUTDIR/bundled-full/all.json" "$TESTCLASS"
      popd
      ;;

    --bundled-indiv|--bi)
      echo "[[ Prepare $OUTDIR/bundled-indiv ]]"

      [ -d "packages/PHPUnit.bak" ] && mv "packages/PHPUnit.bak" "packages/PHPUnit"
      if [ ! -d "$CIVI/packages/PHPUnit" ]; then
        echo "Missing $CIVI/packages/PHPUnit"
        exit 2
      fi

      reset_dir "$OUTDIR/bundled-indiv"

      pushd "$CIVI/tools"
        ./scripts/phpunit-indiv --civi --test-dir "../$TESTPATH" --json-dir "$OUTDIR/bundled-indiv"
      popd

      cat "$OUTDIR"/bundled-indiv/*-*.json > "$OUTDIR/bundled-indiv/all.json"
      ;;

    --standalone-full|--sf)
      echo "[[ Prepare $OUTDIR/standalone-full ]]"
      reset_dir "$OUTDIR/standalone-full"

      pushd "$CIVI"
        [ -d "packages/PHPUnit" ] && mv "packages/PHPUnit" "packages/PHPUnit.bak"
        $PHP $(which $PHPUNIT) --tap --log-json "$OUTDIR/standalone-full/all.json" "$TESTPATH"
        [ -d "packages/PHPUnit.bak" ] && mv "packages/PHPUnit.bak" "packages/PHPUnit"
      popd
      ;;

    --standalone-indiv|--si)
      echo "[[ Prepare $OUTDIR/standalone-indiv ]]"
      reset_dir "$OUTDIR/standalone-indiv"

      pushd "$CIVI"
        [ -d "packages/PHPUnit" ] && mv "packages/PHPUnit" "packages/PHPUnit.bak"
        ./tools/scripts/phpunit-indiv --test-dir "$TESTPATH" --json-dir "$OUTDIR/standalone-indiv"
        [ -d "packages/PHPUnit.bak" ] && mv "packages/PHPUnit.bak" "packages/PHPUnit"
      popd

      cat "$OUTDIR"/standalone-indiv/*-*.json > "$OUTDIR/standalone-indiv/all.json"
      ;;

    --compare)
      echo "[[ Compare all results in $OUTDIR ]]"
      phpunit-compare "$OUTDIR"/*/all.json
      ;;
  esac
done
