aboutsummaryrefslogtreecommitdiff
path: root/lib/test
diff options
context:
space:
mode:
Diffstat (limited to 'lib/test')
-rw-r--r--lib/test/asserts.sh68
-rw-r--r--lib/test/output.sh130
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
+}