#!/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