57 lines
1.6 KiB
Bash
57 lines
1.6 KiB
Bash
# `assert_regex`
|
|
#
|
|
# This function is similar to `assert_equal` but uses pattern matching instead
|
|
# of equality, by wrapping `[[ value =~ pattern ]]`.
|
|
#
|
|
# Fail if the value (first parameter) does not match the pattern (second
|
|
# parameter).
|
|
#
|
|
# ```bash
|
|
# @test 'assert_regex()' {
|
|
# assert_regex 'what' 'x$'
|
|
# }
|
|
# ```
|
|
#
|
|
# On failure, the value and the pattern are displayed.
|
|
#
|
|
# ```
|
|
# -- values does not match regular expression --
|
|
# value : what
|
|
# pattern : x$
|
|
# --
|
|
# ```
|
|
#
|
|
# If the value is longer than one line then it is displayed in *multi-line*
|
|
# format.
|
|
#
|
|
# An error is displayed if the specified extended regular expression is invalid.
|
|
#
|
|
# For description of the matching behavior, refer to the documentation of the
|
|
# `=~` operator in the
|
|
# [Bash manual]: https://www.gnu.org/software/bash/manual/html_node/Conditional-Constructs.html.
|
|
# Note that the `BASH_REMATCH` array is available immediately after the
|
|
# assertion succeeds but is fragile, i.e. prone to being overwritten as a side
|
|
# effect of other actions.
|
|
assert_regex() {
|
|
local -r value="${1}"
|
|
local -r pattern="${2}"
|
|
|
|
if [[ '' =~ ${pattern} ]]; (( ${?} == 2 )); then
|
|
echo "Invalid extended regular expression: \`${pattern}'" \
|
|
| batslib_decorate 'ERROR: assert_regex' \
|
|
| fail
|
|
elif ! [[ "${value}" =~ ${pattern} ]]; then
|
|
if shopt -p nocasematch &>/dev/null; then
|
|
local case_sensitive=insensitive
|
|
else
|
|
local case_sensitive=sensitive
|
|
fi
|
|
batslib_print_kv_single_or_multi 8 \
|
|
'value' "${value}" \
|
|
'pattern' "${pattern}" \
|
|
'case' "${case_sensitive}" \
|
|
| batslib_decorate 'value does not match regular expression' \
|
|
| fail
|
|
fi
|
|
}
|