diff --git a/lib/getopts_long.bash b/lib/getopts_long.bash index 99c2f79..1a9187a 100644 --- a/lib/getopts_long.bash +++ b/lib/getopts_long.bash @@ -17,7 +17,7 @@ getopts_long() { set -- "${args[@]}" fi - builtin getopts "${optspec_short}" "${optvar}" "${@}" || return 1 + builtin getopts -- "${optspec_short}" "${optvar}" "${@}" || return 1 [[ "${!optvar}" == '-' ]] || return 0 if [[ "${OPTARG}" == *=* ]]; then diff --git a/test/bats/github_13.bats b/test/bats/github_13.bats new file mode 100644 index 0000000..16a5d3d --- /dev/null +++ b/test/bats/github_13.bats @@ -0,0 +1,92 @@ +#!/usr/bin/env bats + +load ../test_helper +export GETOPTS_LONG_TEST_BIN='getopts_long-github_13' + +@test "${FEATURE}: long option, silent" { + compare '-o user_val' \ + '--option user_val' +} +@test "${FEATURE}: long option, verbose" { + compare '-o user_val' \ + '--option user_val' +} + +@test "${FEATURE}: long variable, silent" { + compare '-v user_val' \ + '--variable=user_val' \ + '/^OPTIND: /d' + expect "${bash_getopts_lines[4]}" == 'OPTIND: 3' + expect "${getopts_long_lines[4]}" == 'OPTIND: 2' +} +@test "${FEATURE}: long variable, verbose" { + compare '-v user_val' \ + '--variable=user_val' \ + '/^OPTIND: /d' + expect "${bash_getopts_lines[4]}" == 'OPTIND: 3' + expect "${getopts_long_lines[4]}" == 'OPTIND: 2' +} + +@test "${FEATURE}: toggle followed by long variable, silent" { + compare '-t -v user_val' \ + '--toggle --variable=user_val' \ + '/^OPTIND: /d' + expect "${bash_getopts_lines[5]}" == 'OPTIND: 4' + expect "${getopts_long_lines[5]}" == 'OPTIND: 3' +} +@test "${FEATURE}: toggle followed by long variable, verbose" { + compare '-t -v user_val' \ + '--toggle --variable=user_val' \ + '/^OPTIND: /d' + expect "${bash_getopts_lines[5]}" == 'OPTIND: 4' + expect "${getopts_long_lines[5]}" == 'OPTIND: 3' +} + +@test "${FEATURE}: long variable followed by toggle, silent" { + compare '-v user_val -t' \ + '--variable=user_val --toggle' \ + '/^OPTIND: /d' + expect "${bash_getopts_lines[5]}" == 'OPTIND: 4' + expect "${getopts_long_lines[5]}" == 'OPTIND: 3' +} +@test "${FEATURE}: long variable followed by toggle, verbose" { + compare '-v user_val -t' \ + '--variable=user_val --toggle' \ + '/^OPTIND: /d' + expect "${bash_getopts_lines[5]}" == 'OPTIND: 4' + expect "${getopts_long_lines[5]}" == 'OPTIND: 3' +} + +@test "${FEATURE}: terminator followed by long variable, silent" { + compare '-t -- -v user_val' \ + '--toggle -- --variable=user_val' \ + '/^\$@: /d' + expect "${bash_getopts_lines[5]}" == '$@: -v user_val' + expect "${getopts_long_lines[5]}" == '$@: --variable=user_val' +} +@test "${FEATURE}: terminator followed by long variable, verbose" { + compare '-t -- -v user_val' \ + '--toggle -- --variable=user_val' \ + '/^\$@: /d' + expect "${bash_getopts_lines[5]}" == '$@: -v user_val' + expect "${getopts_long_lines[5]}" == '$@: --variable=user_val' +} + +@test "${FEATURE}: long variable followed by terminator, silent" { + compare '-v user_val -- -t' \ + '--variable=user_val -- --toggle' \ + '/^(OPTIND|\$@): /d' + expect "${bash_getopts_lines[4]}" == 'OPTIND: 4' + expect "${getopts_long_lines[4]}" == 'OPTIND: 3' + expect "${bash_getopts_lines[5]}" == '$@: -t' + expect "${getopts_long_lines[5]}" == '$@: --toggle' +} +@test "${FEATURE}: long variable followed by terminator, verbose" { + compare '-v user_val -- -t' \ + '--variable=user_val -- --toggle' \ + '/^(OPTIND|\$@): /d' + expect "${bash_getopts_lines[4]}" == 'OPTIND: 4' + expect "${getopts_long_lines[4]}" == 'OPTIND: 3' + expect "${bash_getopts_lines[5]}" == '$@: -t' + expect "${getopts_long_lines[5]}" == '$@: --toggle' +} diff --git a/test/bin/getopts_long-github_13-silent b/test/bin/getopts_long-github_13-silent new file mode 100755 index 0000000..13b178f --- /dev/null +++ b/test/bin/getopts_long-github_13-silent @@ -0,0 +1,39 @@ +#!/usr/bin/env bash + +TOPDIR="$(cd "$(dirname "${0}")"/../.. && pwd)" +# shellcheck disable=SC1090 +source "${TOPDIR}/lib/getopts_long.bash" + +while getopts_long ': toggle option: variable:' OPTKEY; do + case ${OPTKEY} in + 'toggle') + printf 'toggle triggered' + ;; + 'option') + printf 'option supplied' + ;; + 'variable') + printf 'value supplied' + ;; + '?') + printf "INVALID OPTION" + ;; + ':') + printf "MISSING ARGUMENT" + ;; + *) + printf "NEVER REACHED" + ;; + esac + printf ' -- ' + [[ -z "${OPTARG+SET}" ]] && echo 'OPTARG is unset' || echo "OPTARG=${OPTARG}" +done + +shift $(( OPTIND - 1 )) +[[ "${1}" == "--" ]] && shift + +echo "OPTERR: ${OPTERR}" +echo "OPTKEY: ${OPTKEY}" +echo "OPTARG: ${OPTARG}" +echo "OPTIND: ${OPTIND}" +echo "\$@: ${*}" diff --git a/test/bin/getopts_long-github_13-verbose b/test/bin/getopts_long-github_13-verbose new file mode 100755 index 0000000..9bc2841 --- /dev/null +++ b/test/bin/getopts_long-github_13-verbose @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +TOPDIR="$(cd "$(dirname "${0}")"/../.. && pwd)" +# shellcheck disable=SC1090 +source "${TOPDIR}/lib/getopts_long.bash" + +while getopts_long ' toggle option: variable:' OPTKEY; do + case ${OPTKEY} in + 'toggle') + printf 'toggle triggered' + ;; + 'option') + printf 'option supplied' + ;; + 'variable') + printf 'value supplied' + ;; + '?') + printf "INVALID OPTION or MISSING ARGUMENT" + ;; + *) + printf "NEVER REACHED" + ;; + esac + printf ' -- ' + [[ -z "${OPTARG+SET}" ]] && echo 'OPTARG is unset' || echo "OPTARG=${OPTARG}" +done + +shift $(( OPTIND - 1 )) +[[ "${1}" == "--" ]] && shift + +echo "OPTERR: ${OPTERR}" +echo "OPTKEY: ${OPTKEY}" +echo "OPTARG: ${OPTARG}" +echo "OPTIND: ${OPTIND}" +echo "\$@: ${*}" diff --git a/test/test_helper.bash b/test/test_helper.bash index bf7abdc..b8f0a4a 100644 --- a/test/test_helper.bash +++ b/test/test_helper.bash @@ -9,29 +9,29 @@ PATH="${TOPDIR}/bin:${PATH}" debug() { cat >&3 <