#!/system/bin/sh
#
# Copyright 2015 Nest Labs, Inc. All rights reserved.

PACKAGE="google-double-conversion-tests"
TEST_ROOT="$(dirname $0)"
grep -vE "^/" "$TEST_ROOT" &> /dev/null
if [ $? -eq 0 ] ; then
    TEST_ROOT="$(pwd)/${TEST_ROOT}"
fi

###
### GLOBAL VARIABLES
###
### only export variables that mutate
###

# Increment when a test passes
export GLOBAL_PASS=0
# Increment when a test fails
export GLOBAL_FAIL=0
# The directory where helper test programs are installed
TEST_BIN="${TEST_ROOT}/bin"
# The directory where helper test data is installed
TEST_DATA="${TEST_ROOT}/data"
# The temporary directory where raw program output is placed
TMPDIR=/storage
# The log file with all raw program output
LOGFILE=$(mktemp --tmpdir="${TMPDIR}" ${PACKAGE}-log.XXXXXXXX)
# A temporary file, usually used for staging raw program output for grep
TMPFILE=$(mktemp --tmpdir="${TMPDIR}" ${PACKAGE}-tmp.XXXXXXXX)

# The scripts need their PATH set, too
export PATH="${TEST_BIN}:${PATH}"

# run_test
#
# Usage: run_test <test-name> <expected-return-code> <expected-text-output> <unexpected-text-output> <cmd> [args...]
#
# test-name: A symbolic name for the test for logging
#
# expected-return-code: the number passed back to the operating system. default: 0
# if a blank string is given.
#
# expected-text-output: if a non-empty string, it is expected that the command will
# output this string. It must be seen in order to pass.
#
# unexpected-text-output: if a non-empty string, it is expected that the command
# will NOT output this string. If it is seen, the test will fail.
#
# cmd: executable to run (full path or in $PATH)
#
# args: all arguments that need to be passed on to the executable.
#
run_test()
{
    TEST_NAME="$1"
    shift
    EXPECTED_RC="$1"
    shift
    EXPECTED_OUTPUT="$1"
    shift
    UNEXPECTED_OUTPUT="$1"
    shift

    if [ $# -eq 0 ] ; then
	GLOBAL_RETURN_CODE=1
	echo "FATAL ERROR: invalid arguments passed to run_test for test='$TEST_NAME'"
	return 1
    fi

    if [ -z "$EXPECTED_RC" ] ; then
	EXPECTED_RC="0"
    fi

    VERDICT="pass"
    REASON="default"

    echo "RUNNING TEST '${TEST_NAME}' >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" > "$TMPFILE"
    echo "CMDLINE: $@" >> "$TMPFILE"
    "$@" &>> "$TMPFILE"
    RC=$?
    echo "RC=$RC" >> "$TMPFILE"
    echo "END OF TEST '${TEST_NAME}' <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" >> "$TMPFILE"

    EXPECTED_FOUND=1
    UNEXPECTED_FOUND=0

    if [ -n "$EXPECTED_OUTPUT" ] ; then
	grep -- "$EXPECTED_OUTPUT" "$TMPFILE" &> /dev/null
	if [ $? -ne 0 ] ; then
	    EXPECTED_FOUND=0
	fi
    fi

    if [ -n "$UNEXPECTED_OUTPUT" ] ; then
	grep -- "$UNEXPECTED_OUTPUT" "$TMPFILE" &> /dev/null
	if [ $? -eq 0 ] ; then
	    UNEXPECTED_FOUND=1
	fi
    fi

    if [ "$RC" != "$EXPECTED_RC" ] ; then
	VERDICT="fail"
	REASON="unexpected return code (got ${RC}, expected ${EXPECTED_RC})"
    elif [ "$EXPECTED_FOUND" = "0" ] ; then
	VERDICT="fail"
	REASON="missing expected output, expected '${EXPECTED_OUTPUT}', see '$LOGFILE'"
    elif [ "$UNEXPECTED_FOUND" = "1" ] ; then
	VERDICT="fail"
	REASON="Unexpected output detected: '${UNEXPECTED_OUTPUT}', see '$LOGFILE'"
    fi

    cat "$TMPFILE" >> "$LOGFILE"

    if [ "$VERDICT" = "pass" ] ; then
	echo "${TEST_NAME}: pass"
	GLOBAL_PASS=$(($GLOBAL_PASS + 1))
	return 0
    else
	echo "${TEST_NAME}: fail ($REASON)"
	GLOBAL_FAIL=$(($GLOBAL_FAIL + 1))
	return 1
    fi
}

# Tests must be executed from here:
cd "$TEST_ROOT"

###
### TEST CASES
###

# Test this script
run_test "the_truth" 0 "" "" true
run_test "the_lie" 1 "" "" false
run_test "the_word" "" "really unlikely" "" echo "really unlikely"

# Test cases from test/cctest/CMakeLists.txt
run_test test-bignum            0 "" "" cctest test-bignum
run_test test-bignum-dtoa       0 "" "" cctest test-bignum-dtoa
run_test test-conversions       0 "" "" cctest test-conversions
run_test test-diy-fp            0 "" "" cctest test-diy-fp
run_test test-dtoa              0 "" "" cctest test-dtoa
run_test test-fast-dtoa         0 "" "" cctest test-fast-dtoa
run_test test-fixed-dtoa        0 "" "" cctest test-fixed-dtoa
run_test test-ieee              0 "" "" cctest test-ieee
run_test test-strtod            0 "" "" cctest test-strtod

###
### RESULTS
###

if [ $GLOBAL_FAIL -ne 0 ] ; then
    RETURN_CODE=1
else
    RETURN_CODE=0
fi
TOTAL_TESTS=$(($GLOBAL_PASS + $GLOBAL_FAIL))

echo "${GLOBAL_PASS}/${TOTAL_TESTS} passed. See '$LOGFILE'"
rm "$TMPFILE"

exit $RETURN_CODE
