# @file        helper-functions.incl
#              Library helper functions to improve Peter shell script testing and test readability 
# 
# @author      Eli Deluzio, elijah@distributive.network
# @author      Wes Garland, wes@distributive.network
# @date        Oct 2023

cd `dirname "$0"`
topDir=`pwd`/../..
ESC=`printf "\e"`

if [ ! "${PETER:-}" ]; then
  echo "Warning: PETER not set; Using Peter at $topDir/peter" >&2
  PETER="$topDir/peter"
fi

peter()
{
  TERM=ansi FORCE_COLOR=1 $PETER $* 2>&1
}

panic()
{
  echo "$*" >&2
  exit 3
}

test=0
exitCode=0
set -u

function showre()
{
  echo "$*" | sed "s/${ESC}/<esc>/g"
}

function pass()
{
  test=$[$test + 1]

  name="$1"
  mode="$2"
  re="$3"
  shift 3
  cmd="$@"
  
  if ($cmd) 2>&1 | grep -q "$re"; then
    case "${mode}" in
      "if_match")
        echo "pass ${test} ${name}"
      ;;
      *)
        panic "1/unknown mode ${mode}!"
      ;;
    esac
  else
    case "${mode}" in
      if_match)
        echo "fail ${test} ${name}, no match for '$(showre $re)'" >&2
        exitCode=1
        ;;
      *)
        panic "2/unknown mode ${mode}!"
      ;;
    esac
  fi  
}

function fail()
{
  test=$[$test + 1]

  name="$1"
  mode="$2"
  re="$3"
  shift 3
  cmd="$@"
  
  echo -n "Test ${test} ($name): "
  if ($cmd) | grep -q "$re"; then
    case "${mode}" in
      "if_match")
        echo "fail ${test} ${name}, matched /$re/" >&2
        exitCode=1
      ;;
      *)
        panic "3/unknown mode ${mode}!"
      ;;
    esac
  else
    case "${mode}" in
      if_match)
        echo "pass ${test} ${name}, no match for '$(showre $re)'"
      ;;
      *)
        panic "4/unknown mode ${mode}!"
      ;;
    esac
  fi
}
