#!/bin/bash
# assert.sh 1.0 - bash unit testing framework
# Copyright (C) 2009, 2010, 2011, 2012 Robert Lehmann
#
# http://github.com/lehmannro/assert.sh
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with this program. If not, see .
export DISCOVERONLY=${DISCOVERONLY:-}
export DEBUG=${DEBUG:-}
export STOP=${STOP:-}
export INVARIANT=${INVARIANT:-}
args="$(getopt -n "$0" -l verbose,help,stop,discover,invariant vhxdi $*)" \
|| exit -1
for arg in $args; do
case "$arg" in
-h)
echo "$0 [-vxid] [--verbose] [--stop] [--invariant] [--discover]"
echo "`sed 's/./ /g' <<< "$0"` [-h] [--help]"
exit 0;;
--help)
cat < [stdin]
(( tests_ran++ ))
[[ -n "$DISCOVERONLY" ]] && return
# printf required for formatting
printf -v expected "x${2:-}" # x required to overwrite older results
result="$(eval 2>/dev/null $1 <<< ${3:-})"
# Note: $expected is already decorated
if [[ "x$result" == "$expected" ]]; then
[[ -n "$DEBUG" ]] && echo -n .
return
fi
[[ -n "$DEBUG" ]] && echo -n X
result="$(sed -e :a -e '$!N;s/\n/\\n/;ta' <<< "$result")"
[[ -z "$result" ]] && result="nothing" || result="\"$result\""
[[ -z "$2" ]] && expected="nothing" || expected="\"$2\""
failure="expected $expected${_indent}got $result"
report="test #$tests_ran \"$1${3:+ <<< $3}\" failed:${_indent}$failure"
tests_errors[$tests_failed]="$report"
(( tests_failed++ ))
if [[ -n "$STOP" ]]; then
[[ -n "$DEBUG" ]] && echo
echo "$report"
exit 1
fi
}
assert_raises() {
# assert_raises [stdin]
(( tests_ran++ ))
[[ -n "$DISCOVERONLY" ]] && return
(eval $1 <<< ${3:-}) > /dev/null 2>&1
status=$?
expected=${2:-0}
if [[ "$status" -eq "$expected" ]]; then
[[ -n "$DEBUG" ]] && echo -n .
return
fi
[[ -n "$DEBUG" ]] && echo -n X
failure="program terminated with code $status instead of $expected"
report="test #$tests_ran \"$1${3:+ <<< $3}\" failed:${_indent}$failure"
tests_errors[$tests_failed]="$report"
(( tests_failed++ ))
if [[ -n "$STOP" ]]; then
[[ -n "$DEBUG" ]] && echo
echo "$report"
exit 1
fi
}
_assert_reset