diff options
Diffstat (limited to 'lib/test')
-rw-r--r-- | lib/test/asserts.sh | 68 | ||||
-rw-r--r-- | lib/test/output.sh | 130 |
2 files changed, 198 insertions, 0 deletions
diff --git a/lib/test/asserts.sh b/lib/test/asserts.sh new file mode 100644 index 0000000..b1f538e --- /dev/null +++ b/lib/test/asserts.sh @@ -0,0 +1,68 @@ +#!/bin/sh + +fail() { + message=${1:-"fail called without message"} + echo -e " ${red}fail:${_rst} ${reason}" + exit 1 +} + +_assert_warn= + +assert_warn() { + if ! is_true "${_assert_warn}"; then _assert_warn=y; fi +} + +assert_exited() { + status=${1} + expected=${2:-0} + message=${3:-"exit status"} + assert_compare "=" "$status" "$expected" "$message" +} + +assert_compare() { + expression=$1 + left=$2 + right=$3 + message=$4 + #cloyster_test_log "assert_compare 'test \"$left\" $expression \"$right\" && echo \"OK\" || echo \"$right\"'" + assert "test \"$left\" $expression \"$right\" && echo \"\$?\" || echo \"\$?\"" "0" "${message}" +} + +assert() { + assertion=$1 + expected=$2 + message=${3:-assertion} + status= + assertion_eval="$(eval $(echo "$1"))" && status=0 || status=$?; true + cloyster_test_log "assert: assertion={$(echo "$1" | head -c 30 | sed "s:\\n: :g")} expected=${expected} evaluated=${assertion_eval} status=${status}" + if [ ! "$status" = "0" ]; then + _assert_failed "exited: ${status}" + _assert_exit + elif [ ! "$assertion_eval" = "$expected" ]; then + _assert_failed "${message}" + echo -e "${_bold}Expected:${_rst} ${expected}\n${_bold}Got :${_rst} ${assertion_eval}" + _assert_exit + fi + _test_asserts_counter=$(( ${_test_asserts_counter:-0} + 1 )) + _assert_warn= +} + +_assert_count() { + echo "$_test_asserts_counter" +} +_assert_reset_count() { + _test_asserts_counter=0 +} +_assert_failed() { + name=$1 + reason=$2; if [ -n "${reason}" ]; then reason=" ${reason}"; fi + line=; if [ -n "${_assert_line}" ]; then line=" at line ${_bold}${_assert_line}"; fi + emoji="💥"; text= + if is_true "$_assert_warn"; then emoji="🔥"; text=" (WARNING)"; fi + echo -e "${emoji} $(tput AF 214)Assertion ${_test_asserts_counter} failed${text}${line}: ${_bold}$name${_rst}${reason}" +} + +_assert_exit() { + if ! is_true "$_assert_warn"; then exit 99; fi + _assert_warn= +} diff --git a/lib/test/output.sh b/lib/test/output.sh new file mode 100644 index 0000000..4b09685 --- /dev/null +++ b/lib/test/output.sh @@ -0,0 +1,130 @@ +#!/bin/sh + + _bold=$(tput md) + _rst=$(tput me) + _red=$(tput AF 202) + _redb=$(tput AF 202) + _green=$(tput AF 2) + _yellow=$(tput AF 3) + _blue=$(tput AF 111) + _darkgray=$(tput AF 8) + _gray=$(tput AF 102) + _orange=$(tput AF 214) + +cloyster_test_log() { +# >&2 echo -e "${_ctx}[${_logcontext}]${_rst} $@${_rst}" + >&2 echo -e "$@${_rst}" + } + cloyster_test_debug() { + if is_true "${DEBUG}"; then cloyster_test_log "🔵 ${_blue}${@}"; fi + } + cloyster_test_info() { + cloyster_test_log "👍 ${@}" + } + cloyster_test_warn() { + cloyster_test_log "⚠️ ${_bold}${_yellow}${@}" + } + cloyster_test_error() { + cloyster_test_log "❌ ${_redb}${@}" + } + + +_echo_block= +_echo_block_per_line=25 +_echo_block_count= +_echo_block_init() { + _echo_block=y + _echo_block_count=1 +} +_echo_block() { + if is_true "${_echo_block}"; then + _echo_block_count=$((${_echo_block_count} + 1)) + case $1 in + success) e="🟩";; + skipped) e="🟦";; + failed) e="🟥";; + ignored) e="🟧";; + *) e="⬛";; + esac + if [ "${_echo_block_count}" -le "${_echo_block_per_line}" ]; then + echo -n "${e}" + else + _echo_block_count=1 + echo "${e}" + fi + fi +} +_echo_block_flush() { + if is_true "${_echo_block}"; then + _echo_block= + _echo_block_count= + echo "" + fi +} + +_test_output_overview() { + if [ -n "${_cloyster_test_tests_failed}" ]; then + color="${_redb}" + accent="${_bold}${_redb}" + emoji="❌" + title="FAILED" + else + color="${_green}" + accent="${_bold}${_green}" + emoji="✅" + title="PASSED" + fi + + cloyster_test_log "${emoji} ${_bold}${_yellow}${CLOYSTER_COMMAND}${_rst} ${color}tests${_rst} ${accent}${title}${_rst}" + _greenb=$(tput AF 154) + _gray=$(tput AF 8) + echo -n "${emoji} ${_bold}${_cloyster_test_tests_counter_count} tests${_rst}, ${_bold}${_greenb}${_cloyster_test_tests_counter_success} ok${_rst}" + if [ ! "${_cloyster_test_tests_counter_failed}" = "0" ]; then + echo -n ", ${_bold}${_redb}${_cloyster_test_tests_counter_failed} failed${_rst}" + fi + if [ ! "${_cloyster_test_tests_counter_ignored}" = "0" ]; then + echo -n ", ${_bold}${_orange}${_cloyster_test_tests_counter_ignored} ignored${_rst}" + fi + if [ ! "${_cloyster_test_tests_counter_skipped}" = "0" ]; then + echo -n ", ${_bold}${_blue}${_cloyster_test_tests_counter_skipped} skipped${_rst}" + fi + echo -n " ${_gray}in ${duration}ms${_rst}" + echo -e "${_rst}" +} + +_test_output_results() { + list=${1:-"success skipped ignored failed"} + for t in ${list}; do _test_output_results_one "${t}"; done +} + +_test_output_results_one() { + key=$1 + cnt=0 + count=$(readvar "_cloyster_test_tests_counter_${key}") + + case $key in + success) color="${_green}"; type="SUCCESS"; emoji="👍"; logcolor=$(tput AF 64);; + skipped) color="${_blue}"; type="SKIPPED"; emoji="🙈"; logcolor=$(tput AF 111);; + failed) color="${_red}"; type="FAILED"; emoji="😡"; logcolor=$(tput AF 181);; + ignored) color="${_orange}"; type="IGNORED"; emoji="🥲"; logcolor=$(tput 130);; + *) color="${_yellow}"; type="TEST"; emoji="💩"; logcolor=${_yellow};; + esac + + for id in $(readvar "_cloyster_test_tests_${key}"); do + cnt=$(( $cnt + 1 )) + name=$(readvar "_cloyster_test_tests_${id}__name") + args=$(readvar "_cloyster_test_tests_${id}__args") + lineno=$(readvar "_cloyster_test_tests_${id}__line") + status=$(readvar "_cloyster_test_tests_${id}__status") + args_s=; lineno_s=; status_s=; line= + args_s=" [${args}]" + if [ -n "${lineno}" ] && [ ! "${lineno}" = "0" ]; then lineno_s=" L#${lineno}"; fi + if [ -n "${status}" ]; then status_s=" !${status}"; fi + line="\n${emoji} ${_bold}${color}${type} ${cnt}/${count}:${_rst} ${_bold}${name}${_rst}" + line="${line}${_gray}${args_s}${_darkgray}${lineno_s}${status_s}${_rst}" + echo -e "${line}" + cat "${_tmp_dir}/test_${id}.log" | while read -r line; do + echo -e " ${logcolor}> ${line}${_rst}" + done + done +} |