diff --git a/tests/bashunit.bash b/tests/bashunit.bash new file mode 100644 index 0000000..59dc5b5 --- /dev/null +++ b/tests/bashunit.bash @@ -0,0 +1,189 @@ +#!/usr/bin/env bash + +######################################################################## +# GLOBALS +######################################################################## + +verbose=2 + +bashunit_passed=0 +bashunit_failed=0 +bashunit_skipped=0 + +######################################################################## +# ASSERT FUNCTIONS +######################################################################## + +# Assert that a given expression evaluates to true. +# +# $1: Expression +assert() { + if test $* ; then _passed ; else _failed "$*" true ; fi +} + +# Assert that a given output string is equal to an expected string. +# +# $1: Output +# $2: Expected +assertEqual() { + echo $1 | grep -E "^$2$" > /dev/null + if [ $? -eq 0 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Assert that a given output string is not equal to an expected string. +# +# $1: Output +# $2: Expected +assertNotEqual() { + echo $1 | grep -E "^$2$" > /dev/null + if [ $? -ne 0 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Assert that a given output string starts with an expected string. +# +# $1: Output +# $2: Expected +assertStartsWith() { + echo $1 | grep -E "^$2" > /dev/null + if [ $? -eq 0 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Assert that the last command's return code is equal to an expected integer. +# +# $1: Output +# $2: Expected +# $?: Provided +assertReturn() { + local code=$? + if [ $code -eq $2 ] ; then _passed ; else _failed "$code" "$2" ; fi +} + +# Assert that the last command's return code is not equal to an expected integer. +# +# $1: Output +# $2: Expected +# $?: Provided +assertNotReturn() { + local code=$? + if [ $code -ne $2 ] ; then _passed ; else _failed "$code" "$2" ; fi +} + +# Assert that a given integer is greater than an expected integer. +# +# $1: Output +# $2: Expected +assertGreaterThan() { + if [ $1 -gt $2 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Assert that a given integer is greater than or equal to an expected integer. +# +# $1: Output +# $2: Expected +assertAtLeast() { + if [ $1 -ge $2 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Assert that a given integer is less than an expected integer. +# +# $1: Output +# $2: Expected +assertLessThan() { + if [ $1 -lt $2 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Assert that a given integer is less than or equal to an expected integer. +# +# $1: Output +# $2: Expected +assertAtMost() { + if [ $1 -le $2 ] ; then _passed ; else _failed "$1" "$2" ; fi +} + +# Skip the current test case. +# +skip() { + _skipped +} + +_failed() { + bashunit_failed=$((bashunit_failed+1)) + + local tc=${FUNCNAME[2]} + local line=${BASH_LINENO[1]} + if [ $verbose -ge 2 ] ; then + echo -e "\033[37;1m$tc\033[0m:$line:\033[31mFailed\033[0m" + fi + if [ $verbose -eq 3 ] ; then + echo -e "\033[31mExpected\033[0m: $2" + echo -e "\033[31mProvided\033[0m: $1" + fi +} + +_passed() { + bashunit_passed=$((bashunit_passed+1)) + + local tc=${FUNCNAME[2]} + local line=${BASH_LINENO[1]} + if [ $verbose -ge 2 ] ; then + echo -e "\033[37;1m$tc\033[0m:$line:\033[32mPassed\033[0m" + fi +} + +_skipped() { + bashunit_skipped=$((bashunit_skipped+1)) + + local tc=${FUNCNAME[2]} + local line=${BASH_LINENO[1]} + if [ $verbose -ge 2 ] ; then + echo -e "\033[37;1m$tc\033[0m:$line:\033[33mSkipped\033[0m" + fi +} + +######################################################################## +# RUN +######################################################################## + +usage() { + echo "Usage: [options...]" + echo + echo "Options:" + echo " -v, --verbose Print exptected and provided values" + echo " -s, --summary Only print summary omitting individual test results" + echo " -q, --quiet Do not print anything to standard output" + echo " -h, --help Show usage screen" +} + +runTests() { + local test_pattern="test[a-zA-Z0-9_]\+" + local testcases=$(grep "^ *\(function \)*$test_pattern *\\(\\)" $0 | \ + grep -o $test_pattern) + + if [ ! "${testcases[*]}" ] ; then + usage + exit 0 + fi + + for tc in $testcases ; do $tc ; done + + if [ $verbose -ge 1 ] ; then + echo "Done. $bashunit_passed passed." \ + "$bashunit_failed failed." \ + "$bashunit_skipped skipped." + fi + exit $bashunit_failed +} + +# Arguments +while [ $# -gt 0 ]; do + arg=$1; shift + case $arg in + "-v"|"--verbose") verbose=3;; + "-s"|"--summary") verbose=1;; + "-q"|"--quiet") verbose=0;; + "-h"|"--help") usage; exit 0;; + *) shift;; + esac +done + +runTests