nulib/bash/src/tests.sh

161 lines
5.3 KiB
Bash

# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
##@cooked nocomments
module: tests "tests unitaires"
require: base
function tests__get_line() {
# obtenir le nom du script depuis lequel les fonctions de ce module ont été
# appelées
local mysource="${BASH_SOURCE[0]}"
local i=1
while [ "${BASH_SOURCE[$i]}" == "$mysource" ]; do
let i=i+1
done
echo "${BASH_SOURCE[$i]}:${BASH_LINENO[$((i-1))]}"
}
function tests__set_message() {
if [ "$1" == -m ]; then
message="$2"
return 2
elif [[ "$1" == -m* ]]; then
message="${1#-m}"
return 1
else
return 0
fi
}
function: assert_ok "faire un test unitaire. la syntaxe est
assert_ok [-m message] cmd
la commande doit retourner vrai pour que le test soit réussi"
function assert_ok() {
local message; tests__set_message "$@" || shift $?
"$@" && return 0
[ -n "$message" ] && message="$message: "
message="${message}test failed at $(tests__get_line)"
die "$message"
}
function assert() { assert_ok "$@"; }
function: assert_ko "faire un test unitaire. la syntaxe est
assert_ko [-m message] cmd
la commande doit retourner faux pour que le test soit réussi"
function assert_ko() {
local message; tests__set_message "$@" || shift $?
"$@" || return 0
[ -n "$message" ] && message="$message: "
message="${message}test failed at $(tests__get_line)"
die "$message"
}
function tests__assert() {
local message="$1"; shift
"assert_${1#assert_}" -m "$message" "${@:2}"
}
function assert_n() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$2"
[ -n "$message" ] || message="value is empty"
tests__assert "$message" ok [ -n "$1" ]
}
function assert_z() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$2"
[ -n "$message" ] || message="value is not empty"
tests__assert "$message" ok [ -z "$1" ]
}
function assert_same() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' and '$2' are different"
tests__assert "$message" ok [ "$1" == "$2" ]
}
function assert_diff() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' and '$2' are the same"
tests__assert "$message" ok [ "$1" != "$2" ]
}
function assert_eq() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' and '$2' are not equals"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -eq "$2" ]
}
function assert_ne() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' and '$2' are equals"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -ne "$2" ]
}
function assert_gt() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not greater than '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -gt "$2" ]
}
function assert_ge() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not greater than or equals to '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -ge "$2" ]
}
function assert_lt() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not less than '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -lt "$2" ]
}
function assert_le() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$3"
[ -n "$message" ] || message="'$1' is not less than or equals to '$2'"
tests__assert "'$1' must be a number" ok isnum "$1"
tests__assert "$message" ok [ "$1" -le "$2" ]
}
function assert_is_defined() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$2"
[ -n "$message" ] || message="'$1' is not defined"
tests__assert "$message" ok is_defined "$1"
}
function assert_not_defined() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$2"
[ -n "$message" ] || message="'$1' is defined"
tests__assert "$message" ko is_defined "$1"
}
function assert_is_array() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$2"
[ -n "$message" ] || message="'$1' is not an array"
tests__assert "$message" ok is_array "$1"
}
function assert_not_array() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="$2"
[ -n "$message" ] || message="'$1' is an array"
tests__assert "$message" ko is_array "$1"
}
function assert_array_same() {
local message; tests__set_message "$@" || shift $?
[ -n "$message" ] || message="'$1' is not an array or not equals to (${*:2})"
assert_is_array "$1" "$message"
eval "actual=\"\$(qvals \"\${$1[@]}\")\""; shift
eval "expected=\"\$(qvals \"\$@\")\""
assert_same "$actual" "$expected" "$message"
}