| # `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 |
| } |