#!/usr/bin/env bash testCase() { echo "Input: $1" echo "Expected: $2" } indirect() { unset -v "$1" printf -v "$1" '%s' "$2" } getValue() { local name temp len hardSpace name=$2 hardSpace=" " if declare -f "$name" &> /dev/null; then temp=$("$name"; echo -n "$hardSpace") len=$((${#temp} - 1)) if [[ "${temp:$len}" == "$hardSpace" ]]; then temp=${temp:0:$len} fi else temp=${!name} fi local "$1" && indirect "$1" "$temp" } runTest() ( local testTemplate testExpected testActual hardSpace len testReturnCode testFail hardSpace=" " . ../mo getValue testTemplate template getValue testExpected expected testActual=$(echo -n "$testTemplate" | mo ${arguments[@]+"${arguments[@]}"} 2>&1; echo -n "$hardSpace$?") testReturnCode=${testActual##*$hardSpace} testActual=${testActual%$hardSpace*} testFail=false if [[ "$testActual" != "$testExpected" ]]; then echo "Failure" echo "Expected:" echo "$testExpected" echo "Actual:" echo "$testActual" if [[ -n "${MO_DEBUG_TEST-}" ]]; then declare -p testExpected # Align the two declare outputs echo -n " " declare -p testActual fi testFail=true fi if [[ "$testReturnCode" != "$returnCode" ]]; then echo "Expected return code $returnCode, but got $testReturnCode" testFail=true fi if [[ "$testFail" == "true" ]]; then return 1 fi return 0 ) runTestFile() ( local file=$1 echo "Test: $file" "$file" ) runTests() ( PASS=0 FAIL=0 if [[ $# -gt 0 ]]; then for TEST in "$@"; do runTestFile "$TEST" && PASS=$((PASS + 1)) || FAIL=$((FAIL + 1)) done else cd "${0%/*}" for TEST in tests/*; do if [[ -f "$TEST" ]]; then runTestFile "$TEST" && PASS=$((PASS + 1)) || FAIL=$((FAIL + 1)) fi done fi echo "" echo "Pass: $PASS" echo "Fail: $FAIL" if [[ $FAIL -gt 0 ]]; then exit 1 fi ) # Clear test related variables template="Template not defined" expected="Expected not defined" returnCode=0 arguments=() # If sourced, load functions. # If executed, perform the actions as expected. if [[ "$0" == "${BASH_SOURCE[0]}" ]] || [[ -z "${BASH_SOURCE[0]}" ]]; then runTests ${@+"${@}"} fi