#!/usr/bin/env bash

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

# we always start with no errors
ERROR=0
PASS=0
FAILED_FUNCS=""

export PYTHON=$(which python3 2>/dev/null)

# pass a test, printing out MSG
#  usage: passed message
function passed {
    local lineno
    lineno=$(caller 0 | awk '{print $1}')
    local function
    function=$(caller 0 | awk '{print $2}')
    local msg="$1"
    if [ -z "$msg" ]; then
        msg="OK"
    fi
    PASS=$((PASS+1))
    echo "PASS: $function:L$lineno - $msg"
}

# fail a test, printing out MSG
#  usage: failed message
function failed {
    local lineno
    lineno=$(caller 0 | awk '{print $1}')
    local function
    function=$(caller 0 | awk '{print $2}')
    local msg="$1"
    FAILED_FUNCS+="$function:L$lineno\n"
    echo "ERROR: $function:L$lineno!"
    echo "   $msg"
    ERROR=$((ERROR+1))
}

# assert string comparison of val1 equal val2, printing out msg
#  usage: assert_equal val1 val2 msg
function assert_equal {
    local lineno
    lineno=`caller 0 | awk '{print $1}'`
    local function
    function=`caller 0 | awk '{print $2}'`
    local msg=$3

    if [ -z "$msg" ]; then
        msg="OK"
    fi
    if [[ "$1" != "$2" ]]; then
        FAILED_FUNCS+="$function:L$lineno\n"
        echo "ERROR: $1 != $2 in $function:L$lineno!"
        echo "  $msg"
        ERROR=$((ERROR+1))
    else
        PASS=$((PASS+1))
        echo "PASS: $function:L$lineno - $msg"
    fi
}

# assert variable is empty/blank, printing out msg
#  usage: assert_empty VAR msg
function assert_empty {
    local lineno
    lineno=`caller 0 | awk '{print $1}'`
    local function
    function=`caller 0 | awk '{print $2}'`
    local msg=$2

    if [ -z "$msg" ]; then
        msg="OK"
    fi
    if [[ ! -z ${!1} ]]; then
        FAILED_FUNCS+="$function:L$lineno\n"
        echo "ERROR: $1 not empty in $function:L$lineno!"
        echo "  $msg"
        ERROR=$((ERROR+1))
    else
        PASS=$((PASS+1))
        echo "PASS: $function:L$lineno - $msg"
    fi
}

# assert the arguments evaluate to true
#  assert_true "message" arg1 arg2
function assert_true {
    local lineno
    lineno=`caller 0 | awk '{print $1}'`
    local function
    function=`caller 0 | awk '{print $2}'`
    local msg=$1
    shift

    $@
    if [ $? -eq 0 ]; then
        PASS=$((PASS+1))
        echo "PASS: $function:L$lineno - $msg"
    else
        FAILED_FUNCS+="$function:L$lineno\n"
        echo "ERROR: test failed in $function:L$lineno!"
        echo "  $msg"
        ERROR=$((ERROR+1))
    fi
}

# assert the arguments evaluate to false
#  assert_false "message" arg1 arg2
function assert_false {
    local lineno
    lineno=`caller 0 | awk '{print $1}'`
    local function
    function=`caller 0 | awk '{print $2}'`
    local msg=$1
    shift

    $@
    if [ $? -eq 0 ]; then
        FAILED_FUNCS+="$function:L$lineno\n"
        echo "ERROR: test failed in $function:L$lineno!"
        echo "  $msg"
        ERROR=$((ERROR+1))
    else
        PASS=$((PASS+1))
        echo "PASS: $function:L$lineno - $msg"
    fi
}


# Print a summary of passing and failing tests and exit
# (with an error if we have failed tests)
#  usage: report_results
function report_results {
    echo "$PASS Tests PASSED"
    if [[ $ERROR -gt 0 ]]; then
        echo
        echo "The following $ERROR tests FAILED"
        echo -e "$FAILED_FUNCS"
        echo "---"
        exit 1
    fi
    exit 0
}
