Skip to content

Commit

Permalink
[GH-26] Added tests to ensure that long options can start with a hyph…
Browse files Browse the repository at this point in the history
…en character (#29)

This resolves #26 by ensuring that it is possible to define the hyphen (`-`) and options starting with a hyphen (`-XXX`) as valid long options in getopts_long OPTSPEC. 

On the command line, this allows getopts_long to support both: the `---` as a standalone option, and options starting with three hyphens, such as `—XXX`.
  • Loading branch information
UrsaDK authored Dec 14, 2024
1 parent 7248752 commit 449d7d1
Show file tree
Hide file tree
Showing 8 changed files with 227 additions and 1 deletion.
28 changes: 28 additions & 0 deletions test/bats/github_26a.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#!/usr/bin/env bats

load ../test_helper
export GETOPTS_LONG_TEST_BIN='getopts_long-longspec_with_dash'

@test "${FEATURE}: toggle, silent" {
compare '-t' \
'---'
}
@test "${FEATURE}: toggle, verbose" {
compare '-t' \
'---'
}

@test "${FEATURE}: double toggle, silent" {
compare '-tt' \
'--- --toggle' \
'/^OPTIND: /d'
expect "${bash_getopts[6]}" == 'OPTIND: 2'
expect "${getopts_long[6]}" == 'OPTIND: 3'
}
@test "${FEATURE}: double toggle, verbose" {
compare '-tt' \
'--- --toggle' \
'/^OPTIND: /d'
expect "${bash_getopts[6]}" == 'OPTIND: 2'
expect "${getopts_long[6]}" == 'OPTIND: 3'
}
30 changes: 30 additions & 0 deletions test/bats/github_26b.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
#!/usr/bin/env bats

load ../test_helper
export GETOPTS_LONG_TEST_BIN='getopts_long-longspec_with_dash_colon'

@test "${FEATURE}: option, silent" {
compare '-o user_val' \
'--- user_val'
}
@test "${FEATURE}: option, verbose" {
compare '-o user_val' \
'--- user_val'
}

# geopts_long does not support option-value adjoined syntax for long options.
# Thus, let's compare it to bash getopts command that uses an invalid option.
@test "${FEATURE}: option with adjacent value, silent" {
compare '-z' \
'---zz' \
'/^INVALID OPTION/d'
expect "${bash_getopts[1]}" == 'INVALID OPTION -- OPTARG=z'
expect "${getopts_long[1]}" == 'INVALID OPTION -- OPTARG=-zz'
}
@test "${FEATURE}: option with adjacent value, verbose" {
compare '-z' \
'---zz' \
'/-verbose: illegal option --/d'
expect "${bash_getopts[1]}" =~ '-verbose: illegal option -- z'
expect "${getopts_long[1]}" =~ '-verbose: illegal option -- -zz'
}
22 changes: 22 additions & 0 deletions test/bats/github_26c.bats
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
#!/usr/bin/env bats

load ../test_helper
export GETOPTS_LONG_TEST_BIN='getopts_long-github_26'

@test "${FEATURE}: toggle, silent" {
compare '-t user_arg' \
'---toggle user_arg'
}
@test "${FEATURE}: toggle, verbose" {
compare '-t user_arg' \
'---toggle user_arg'
}

@test "${FEATURE}: option, silent" {
compare '-o user_val' \
'---option user_val'
}
@test "${FEATURE}: option, verbose" {
compare '-o user_val' \
'---option user_val'
}
38 changes: 38 additions & 0 deletions test/bin/getopts_long-github_26-silent
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env bash

TOPDIR="$(cd "$(dirname "${0}")"/../.. && pwd)"
# shellcheck disable=SC1090
source "${TOPDIR}/lib/getopts_long.bash"

while getopts_long ':to:v: toggle option: variable: -toggle -option:' OPTKEY; do
case ${OPTKEY} in
't'|'toggle'|'-toggle')
printf 'toggle triggered'
;;
'-'|'o'|'option'|'-option')
printf 'option supplied'
;;
'v'|'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 ))

echo "OPTERR: ${OPTERR}"
echo "OPTKEY: ${OPTKEY}"
echo "OPTARG: ${OPTARG}"
echo "OPTIND: ${OPTIND}"
echo "\$@: ${*}"
35 changes: 35 additions & 0 deletions test/bin/getopts_long-github_26-verbose
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/usr/bin/env bash

TOPDIR="$(cd "$(dirname "${0}")"/../.. && pwd)"
# shellcheck disable=SC1090
source "${TOPDIR}/lib/getopts_long.bash"

while getopts_long 'to:v: toggle option: variable: -toggle -option:' OPTKEY; do
case ${OPTKEY} in
't'|'toggle'|'-toggle')
printf 'toggle triggered'
;;
'-'|'o'|'option'|'-option')
printf 'option supplied'
;;
'v'|'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 ))

echo "OPTERR: ${OPTERR}"
echo "OPTKEY: ${OPTKEY}"
echo "OPTARG: ${OPTARG}"
echo "OPTIND: ${OPTIND}"
echo "\$@: ${*}"
38 changes: 38 additions & 0 deletions test/bin/getopts_long-longspec_with_dash_colon-silent
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env bash

TOPDIR="$(cd "$(dirname "${0}")"/../.. && pwd)"
# shellcheck disable=SC1090
source "${TOPDIR}/lib/getopts_long.bash"

while getopts_long ':to:v: -: toggle option: variable:' OPTKEY; do
case ${OPTKEY} in
't'|'toggle')
printf 'toggle triggered'
;;
'-'|'o'|'option')
printf 'option supplied'
;;
'v'|'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 ))

echo "OPTERR: ${OPTERR}"
echo "OPTKEY: ${OPTKEY}"
echo "OPTARG: ${OPTARG}"
echo "OPTIND: ${OPTIND}"
echo "\$@: ${*}"
35 changes: 35 additions & 0 deletions test/bin/getopts_long-longspec_with_dash_colon-verbose
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#!/usr/bin/env bash

TOPDIR="$(cd "$(dirname "${0}")"/../.. && pwd)"
# shellcheck disable=SC1090
source "${TOPDIR}/lib/getopts_long.bash"

while getopts_long 'to:v: -: toggle option: variable:' OPTKEY; do
case ${OPTKEY} in
't'|'toggle')
printf 'toggle triggered'
;;
'-'|'o'|'option')
printf 'option supplied'
;;
'v'|'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 ))

echo "OPTERR: ${OPTERR}"
echo "OPTKEY: ${OPTKEY}"
echo "OPTARG: ${OPTARG}"
echo "OPTIND: ${OPTIND}"
echo "\$@: ${*}"
2 changes: 1 addition & 1 deletion test/test_helper.bash
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,5 @@ compare() {
fi

expect "${getopts_long_output}" == "${bash_getopts_output}"
expect "${getopts_long[0]}" == "${bash_getopts[0]}"
expect "Exit status: ${getopts_long[0]}" == "Exit status: ${bash_getopts[0]}"
}

0 comments on commit 449d7d1

Please sign in to comment.