#!/bin/bash
#  check - System Testing Support
set -e
lib_load 'core/math'
######
# Library Configuration
sys_check_config_init() {
	# $check_list[] - Stack of checks being performed.
	lib_setting_arrays check_list
}
######
# Internal Functions
# check_start() - Prints message indicating a check ($1) has started
check_start() {
	has_args 1 "$@";
	int_inc check_count_start
	app_echo_n "$check_list: $1"
}
# check_finish() - Prints message indicating a check ($1) has finished.
check_finish() {
	has_args 1 "$@";
	int_inc check_count_finish
	echo "$1"
}
# check_pass() - Prints a message indicating a check passed.
check_pass() { int_inc check_count_pass; check_finish "PASS"; }
# check_fail() - Prints a message ($1) indicating a check failed.
check_fail() { int_inc check_count_fail; check_finish "FAIL"; echo "$1"; }
######
# Checks
# check_run() - Runs a single check ($@) with a given message ($1)
# and error message ($2).
# $1 - Informational message to pass to ``check_start()``.
# $2 - Error message to pass to ``check_fail()``.
# $@ - Command to execute.
check_run() {
	min_args 2 "$@"
	local _msg="$1"
	local _err="$2"
	shift 2
	check_start "$_msg: "
	run "$@" && check_pass || check_fail "$_err"
}
######
# Tests
# check_for_pass() - Runs a check that is expected to pass.
# $1 - Informational message to pass to ``check_start()``.
# $@ - Command to execute.
check_for_pass() {
	local _msg=$1
	shift
	check_run "$_msg" "FAIL" "$@"
}
# check_for_fail() - Runs a check that is expected to fail.
# $1 - Informational message to pass to ``check_start()``.
# $@ - Command to execute.
check_for_fail() {
	local _msg=$1
	shift
	check_start "$_msg: "
	local -a _args=( "$@" )
	local out=$(check_run "$_msg" "FAIL" "${_args[@]}" 2>&1)
	(echo "$out" | grep FAIL >/dev/null) && check_pass || check_fail "$out"
}
# check_is_expected() - Runs a check that verifies a given variable ($1)
# produce an expected value ($2).
# $1 - Variable to check
# $2 - Expected value
check_is_expected() {
	has_args 2 "$@"
	local _var=$1
	local _expected=$2
	local _value
	eval "_value=\"\$$_var\""
	local _msg="$_var: '$_value' == '$_expected'"
	check_run "$_msg" 'values do not match' [ "$_value" = "$_expected" ]
}
######
# Test Suites
# check_list_start() - Starts a test suite.
# $1 - The name of the testsuite.  If `null`, the caller function name
# well be used.  The name must be a valid symbol.
check_list_start() {
	local fname=${1:-${FUNCNAME[1]}}
	list_insert check_list $fname
	check_count_start=0
	check_count_finish=0
	check_count_pass=0
	check_count_fail=0
	app_echo "$fname: Starting..."
}
# check_list_finish() - Finishs a test suite and reports the results.
check_list_finish() {
	local fname
	fname=$(list_fpop check_list)
	local msg
	msg=$(printf "%s: ... finished: %d/%d passed (%d/%d finished)" \
		"$fname" "$(($check_count_pass - $check_count_fail))" "$check_count_pass" \
		"$check_count_finish" "$check_count_start")
	app_echo "$msg"
}
 
Generated on Tue Jul  4 17:00:58 PDT 2017 by mcsh d14 v0.21.0.