--- /dev/null
+
+declare -a _wvbtstack
+
+_wvpushcall()
+{
+ _wvbtstack[${#_wvbtstack[@]}]="$*"
+}
+
+_wvpopcall()
+{
+ unset _wvbtstack[$((${#_wvbtstack[@]} - 1))]
+}
+
+_wvbacktrace()
+{
+ local i loc
+ local call=$((${#_wvbtstack[@]} - 1))
+ for ((i=0; i <= ${#FUNCNAME[@]}; i++)); do
+ local name="${FUNCNAME[$i]}"
+ if test "${name:0:2}" == WV; then
+ loc="${BASH_SOURCE[$i+1]}:${BASH_LINENO[$i]}"
+ echo "called from $loc ${FUNCNAME[$i]} ${_wvbtstack[$call]}" 1>&2
+ ((call--))
+ fi
+ done
+}
+
+_wvfind_caller()
+{
+ WVCALLER_FILE=${BASH_SOURCE[2]}
+ WVCALLER_LINE=${BASH_LINENO[1]}
+}
if [ -n "$BASH_VERSION" ]; then
- _wvfind_caller()
- {
- WVCALLER_FILE=${BASH_SOURCE[2]}
- WVCALLER_LINE=${BASH_LINENO[1]}
- }
+ . ./wvtest-bash.sh # This keeps sh from choking on the syntax.
else
+ _wvbacktrace() { true; }
+ _wvpushcall() { true; }
+ _wvpopcall() { true; }
+
_wvfind_caller()
{
WVCALLER_FILE="unknown"
fi
echo "! $WVCALLER_FILE:$WVCALLER_LINE $TEXT $OK" >&2
if [ "$CODE" -ne 0 ]; then
+ _wvbacktrace
exit $CODE
else
return 0
WVPASS()
{
local TEXT="$*"
+ _wvpushcall "$@"
_wvfind_caller
if "$@"; then
+ _wvpopcall
_wvcheck 0 "$TEXT"
return 0
else
WVFAIL()
{
local TEXT="$*"
+ _wvpushcall "$@"
_wvfind_caller
if "$@"; then
return 1
else
_wvcheck 0 "NOT($TEXT)"
+ _wvpopcall
return 0
fi
}
WVPASSEQ()
{
+ _wvpushcall "$@"
_wvfind_caller
_wvcheck $(_wvgetrv [ "$#" -eq 2 ]) "exactly 2 arguments"
echo "Comparing:" >&2
echo "--" >&2
echo "$2" >&2
_wvcheck $(_wvgetrv [ "$1" = "$2" ]) "'$1' = '$2'"
+ _wvpopcall
}
WVPASSNE()
{
+ _wvpushcall "$@"
_wvfind_caller
_wvcheck $(_wvgetrv [ "$#" -eq 2 ]) "exactly 2 arguments"
echo "Comparing:" >&2
echo "--" >&2
echo "$2" >&2
_wvcheck $(_wvgetrv [ "$1" != "$2" ]) "'$1' != '$2'"
+ _wvpopcall
}
WVPASSRC()
{
local RC=$?
+ _wvpushcall "$@"
_wvfind_caller
_wvcheck $(_wvgetrv [ $RC -eq 0 ]) "return code($RC) == 0"
+ _wvpopcall
}
WVFAILRC()
{
local RC=$?
+ _wvpushcall "$@"
_wvfind_caller
_wvcheck $(_wvgetrv [ $RC -ne 0 ]) "return code($RC) != 0"
+ _wvpopcall
}