Improve new testing framework

- add assertGrep function
 - improve --matches option for assertGrep and assertStdoutGrep: now
   accepts [min]-[max] range, eg --matches=1-3, --matches=4-
This commit is contained in:
Andrew Bettison 2012-04-10 17:59:19 +09:30
parent c41d2aaeb1
commit 16941b8ef3

View File

@ -181,7 +181,7 @@ assert() {
_tfw_getopts_assert assert "$@" _tfw_getopts_assert assert "$@"
shift $_tfw_getopts_shift shift $_tfw_getopts_shift
_tfw_assert "$@" || _tfw_failexit _tfw_assert "$@" || _tfw_failexit
echo "# Assertion passed: $*" echo "# assert $*"
return 0 return 0
} }
@ -191,7 +191,7 @@ assertExpr() {
local awkexpr=$(_tfw_expr_to_awkexpr "$@") local awkexpr=$(_tfw_expr_to_awkexpr "$@")
_tfw_message="${_tfw_message+$_tfw_message }($awkexpr)" _tfw_message="${_tfw_message+$_tfw_message }($awkexpr)"
_tfw_assert _tfw_eval_awkexpr "$awkexpr" || _tfw_failexit _tfw_assert _tfw_eval_awkexpr "$awkexpr" || _tfw_failexit
echo "# Assertion passed: $awkexpr" echo "# assert $awkexpr"
return 0 return 0
} }
@ -255,7 +255,7 @@ assertExitStatus() {
shift $_tfw_getopts_shift shift $_tfw_getopts_shift
[ -z "$_tfw_message" ] && _tfw_message="exit status of ${_tfw_last_argv0##*/} ($_tfw_exitStatus) $*" [ -z "$_tfw_message" ] && _tfw_message="exit status of ${_tfw_last_argv0##*/} ($_tfw_exitStatus) $*"
_tfw_assertExpr "$_tfw_exitStatus" "$@" || _tfw_failexit _tfw_assertExpr "$_tfw_exitStatus" "$@" || _tfw_failexit
echo "# Assertion passed: $_tfw_message" echo "# assert $_tfw_message"
return 0 return 0
} }
@ -264,7 +264,7 @@ assertRealTime() {
shift $_tfw_getopts_shift shift $_tfw_getopts_shift
[ -z "$_tfw_message" ] && _tfw_message="real execution time of ${_tfw_last_argv0##*/} ($realtime) $*" [ -z "$_tfw_message" ] && _tfw_message="real execution time of ${_tfw_last_argv0##*/} ($realtime) $*"
_tfw_assertExpr "$realtime" "$@" || _tfw_failexit _tfw_assertExpr "$realtime" "$@" || _tfw_failexit
echo "# Assertion passed: $_tfw_message" echo "# assert $_tfw_message"
return 0 return 0
} }
@ -292,9 +292,54 @@ assertStderrGrep() {
_tfw_assert_stdxxx_grep stderr "$@" || _tfw_failexit _tfw_assert_stdxxx_grep stderr "$@" || _tfw_failexit
} }
assertGrep() {
_tfw_getopts_assert filegrep "$@"
shift $_tfw_getopts_shift
if [ $# -ne 2 ]; then
_tfw_error "incorrect arguments"
return 254
fi
_tfw_assert_grep "$1" "$1" "$2"
return 0
}
# Internal (private) functions that are not to be invoked directly from test # Internal (private) functions that are not to be invoked directly from test
# scripts. # scripts.
# Utility for setting shopt variables and restoring their original value:
# _tfw_shopt -s extglob -u extdebug
# ...
# _tfw_shopt_restore
_tfw_shopt() {
if [ -n "$_tfw_shopt_orig" ]; then
_tfw_fatal "unrestored shopt settings: $_tfw_shopt_orig"
fi
_tfw_shopt_orig=
local op=s
while [ $# -ne 0 ]
do
case "$1" in
-s) op=s;;
-u) op=u;;
*)
local opt="$1"
_tfw_shopt_orig="${restore:+$restore; }shopt -$(shopt -q $opt && echo s || echo u) $opt"
shopt -$op $opt
;;
esac
shift
done
}
_tfw_shopt_restore() {
if [ -n "$_tfw_shopt_orig" ]; then
eval "$_tfw_shopt_orig"
_tfw_shopt_orig=
fi
}
# The rest of this file is parsed for extended glob patterns.
_tfw_shopt -s extglob
# Echo the absolute path of the given path, using only Bash builtins. # Echo the absolute path of the given path, using only Bash builtins.
_tfw_abspath() { _tfw_abspath() {
cdopt=-L cdopt=-L
@ -472,7 +517,7 @@ _tfw_eval_awkexpr() {
_tfw_assertExpr() { _tfw_assertExpr() {
local awkexpr=$(_tfw_expr_to_awkexpr "$@") local awkexpr=$(_tfw_expr_to_awkexpr "$@")
_tfw_assert _tfw_eval_awkexpr "$awkexpr" || _tfw_failexit _tfw_assert _tfw_eval_awkexpr "$awkexpr" || _tfw_failexit
echo "# Assertion passed: $awkexpr" echo "# assert $awkexpr"
} }
_tfw_assert_stdxxx_is() { _tfw_assert_stdxxx_is() {
@ -491,7 +536,7 @@ _tfw_assert_stdxxx_is() {
_tfw_backtrace >&2 _tfw_backtrace >&2
return 1 return 1
fi fi
echo "# Assertion passed: $message" echo "# assert $message"
return 0 return 0
} }
@ -504,29 +549,69 @@ _tfw_assert_stdxxx_grep() {
_tfw_error "incorrect arguments" _tfw_error "incorrect arguments"
return 254 return 254
fi fi
local message="${_tfw_message:-$qual of ${_tfw_last_argv0##*/} contains a line matching \"$1\"}" _tfw_assert_grep "$qual of ${_tfw_last_argv0##*/}" $_tfw_tmp/$qual "$@"
local matches=$(/bin/grep --regexp="$1" $_tfw_tmp/$qual | /usr/bin/wc --lines) }
if [ -z "$_tfw_opt_matches" ]; then
message="${_tfw_message:-$qual of ${_tfw_last_argv0##*/} contains a line matching \"$1\"}" _tfw_assert_grep() {
if [ $matches -eq 0 ]; then local label="$1"
_tfw_failmsg "assertion failed: $message" local file="$2"
_tfw_backtrace >&2 local pattern="$3"
return 1 local message=
fi local matches=$(/bin/grep --regexp="$pattern" "$file" | /usr/bin/wc --lines)
elif [ -z "${_tfw_opt_matches//[0-9]}" ]; then local ret=0
message="${_tfw_message:-$qual of ${_tfw_last_argv0##*/} contains exactly $_tfw_opt_matches line$s matching \"$1\"}" _tfw_shopt -s extglob
if [ $matches -ne $_tfw_opt_matches ]; then case "$_tfw_opt_matches" in
local s=$([ $_tfw_opt_matches -ne 1 ] && echo s) '')
_tfw_failmsg "assertion failed: $message" message="${_tfw_message:-$label contains a line matching \"$pattern\"}"
_tfw_backtrace >&2 if [ $matches -ne 0 ]; then
return 1 echo "# assert $message"
fi
else else
_tfw_error "unsupported value for --matches=$_tfw_opt_matches" _tfw_failmsg "assertion failed: $message"
return 254 ret=1
fi fi
echo "# Assertion passed: $message" ;;
return 0 +([0-9]))
local s=$([ $_tfw_opt_matches -ne 1 ] && echo s)
message="${_tfw_message:-$label contains exactly $_tfw_opt_matches line$s matching \"$pattern\"}"
if [ $matches -eq $_tfw_opt_matches ]; then
echo "# assert $message"
else
_tfw_failmsg "assertion failed: $message"
ret=1
fi
;;
+([0-9])-*([0-9]))
local bound=${_tfw_opt_matches%-*}
local s=$([ $bound -ne 1 ] && echo s)
message="${_tfw_message:-$label contains at least $bound line$s matching \"$pattern\"}"
if [ $matches -ge $bound ]; then
echo "# assert $message"
else
_tfw_failmsg "assertion failed: $message"
ret=1
fi
;;& # Test the next case as well...
*([0-9])-+([0-9]))
local bound=${_tfw_opt_matches#*-}
local s=$([ $bound -ne 1 ] && echo s)
message="${_tfw_message:-$label contains at most $bound line$s matching \"$pattern\"}"
if [ $matches -le $bound ]; then
echo "# assert $message"
else
_tfw_failmsg "assertion failed: $message"
ret=1
fi
;;
*)
_tfw_error "unsupported value for --matches=$_tfw_opt_matches"
ret=254
;;
esac
_tfw_shopt_restore
if [ $ret -ne 0 ]; then
_tfw_backtrace >&2
fi
return $ret
} }
# Write to the real stdout of the test script. # Write to the real stdout of the test script.
@ -555,14 +640,13 @@ _tfw_checkBashVersion() {
# Return a list of test names in the order that the test_TestName functions were # Return a list of test names in the order that the test_TestName functions were
# defined. # defined.
_tfw_find_tests() { _tfw_find_tests() {
local old_extdebug=$(builtin shopt -q extdebug && echo s || echo u) _tfw_shopt -s extdebug
shopt -s extdebug
builtin declare -F | builtin declare -F |
/bin/sed -n -e '/^declare -f test_..*/s/^declare -f test_//p' | /bin/sed -n -e '/^declare -f test_..*/s/^declare -f test_//p' |
while read name; do builtin declare -F "test_$name"; done | while read name; do builtin declare -F "test_$name"; done |
/usr/bin/sort --key 2,2n --key 3,3 | /usr/bin/sort --key 2,2n --key 3,3 |
/bin/sed -e 's/^test_//' -e 's/[ ].*//' /bin/sed -e 's/^test_//' -e 's/[ ].*//'
builtin shopt -$old_extdebug extdebug _tfw_shopt_restore
} }
# A "fail" event occurs when any assertion fails, and indicates that the test # A "fail" event occurs when any assertion fails, and indicates that the test
@ -647,3 +731,6 @@ _tfw_fatal() {
_tfw_fatalexit() { _tfw_fatalexit() {
exit 255 exit 255
} }
# Restore the caller's shopt preferences before returning.
_tfw_shopt_restore