mirror of
https://github.com/fish-shell/fish-shell.git
synced 2026-04-25 20:41:15 -03:00
This new flag causes fish_opt to generrate an option spec with ! (e.g. "fish_opt -s s -rv some code" will output "s=!some code"). Such validation scripts are not particular useful (they are highly limited as they cannot access the values for other options, and must be quoted appropriately so they can be passed to argparse). I merely added the option to fish_opt so that it can now generate any valid option spec.
800 lines
23 KiB
Fish
800 lines
23 KiB
Fish
#RUN: %fish %s
|
|
##########
|
|
|
|
# NOTE: This uses argparse, which touches the local variables.
|
|
# Any call that isn't an error should be enclosed in a begin/end block!
|
|
|
|
# Start by verifying a bunch of error conditions.
|
|
# These are *argparse* errors, and therefore bugs in the script,
|
|
# so they print a stack trace.
|
|
|
|
# No args (not even --) is an error
|
|
argparse
|
|
#CHECKERR: argparse: Missing -- separator
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
|
|
# Missing -- is an error
|
|
argparse h/help
|
|
#CHECKERR: argparse: Missing -- separator
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse h/help
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
|
|
# Flags but no option specs is not an error
|
|
begin
|
|
argparse -s -- hello
|
|
echo $status
|
|
# CHECK: 0
|
|
set -l
|
|
# CHECK: argv hello
|
|
# CHECK: argv_opts
|
|
end
|
|
|
|
# Invalid option specs
|
|
argparse h-
|
|
argparse /
|
|
argparse +help
|
|
argparse h/help:
|
|
argparse h-help::
|
|
argparse h-help=x
|
|
#CHECKERR: argparse: Invalid option spec 'h-' at char '-'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse h-
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
#CHECKERR: argparse: Short flag '/' invalid, must be alphanum or '#'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse /
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
#CHECKERR: argparse: Short flag '+' invalid, must be alphanum or '#'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse +help
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
#CHECKERR: argparse: Invalid option spec 'h/help:' at char ':'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse h/help:
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
#CHECKERR: argparse: Invalid option spec 'h-help::' at char ':'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse h-help::
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
#CHECKERR: argparse: Invalid option spec 'h-help=x' at char 'x'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse h-help=x
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
|
|
# --max-args and --min-args work
|
|
begin
|
|
argparse --name min-max --min-args 1 h/help --
|
|
#CHECKERR: min-max: expected >= 1 arguments; got 0
|
|
argparse --name min-max --min-args 1 --
|
|
#CHECKERR: min-max: expected >= 1 arguments; got 0
|
|
argparse --name min-max --min-args 1 --max-args 3 h/help -- arg1
|
|
argparse --name min-max --min-args 1 --max-args 3 -- arg1
|
|
argparse --name min-max --min-args 1 --max-args 3 h/help -- arg1 arg2
|
|
argparse --name min-max --min-args 1 --max-args 3 h/help -- --help arg1 arg2 arg3
|
|
argparse --name min-max --min-args 1 --max-args 3 h/help -- arg1 arg2 -h arg3 arg4
|
|
#CHECKERR: min-max: expected <= 3 arguments; got 4
|
|
argparse --name min-max --max-args 1 h/help --
|
|
argparse --name min-max --max-args 1 h/help -- arg1
|
|
argparse --name min-max --max-args 1 h/help -- arg1 arg2
|
|
#CHECKERR: min-max: expected <= 1 arguments; got 2
|
|
argparse --name min-max --max-args 1 -- arg1 arg2
|
|
#CHECKERR: min-max: expected <= 1 arguments; got 2
|
|
end
|
|
|
|
# Invalid \"#-val\" spec
|
|
begin
|
|
argparse '#-val=' -- abc -x def
|
|
# CHECKERR: argparse: Implicit int short flag '#' does not allow modifiers like '='
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse '#-val=' -- abc -x def
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
# Invalid arg in the face of a \"#-val\" spec
|
|
begin
|
|
argparse '#-val' -- abc -x def
|
|
# CHECKERR: argparse: -x: unknown option
|
|
end
|
|
|
|
# Defining a short flag more than once
|
|
begin
|
|
argparse s/short x/xray s/long -- -s -x --long
|
|
# CHECKERR: argparse: Short flag 's' already defined
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse s/short x/xray s/long -- -s -x --long
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
# Defining a long flag more than once
|
|
begin
|
|
argparse s/short x/xray l/short -- -s -x --long
|
|
# CHECKERR: argparse: Long flag 'short' already defined
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse s/short x/xray l/short -- -s -x --long
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
# Defining an implicit int flag more than once
|
|
begin
|
|
argparse '#-val' x/xray 'v#val' -- -s -x --long
|
|
# CHECKERR: argparse: Implicit int flag '#' already defined
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse '#-val' x/xray 'v#val' -- -s -x --long
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
# Defining an implicit int flag with modifiers
|
|
begin
|
|
argparse 'v#val=' --
|
|
# CHECKERR: argparse: Implicit int short flag 'v' does not allow modifiers like '='
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse 'v#val=' --
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
##########
|
|
# Now verify that validly formed invocations work as expected.
|
|
|
|
# No args
|
|
begin
|
|
argparse h/help --
|
|
end
|
|
|
|
# One arg and no matching flags
|
|
begin
|
|
argparse h/help -- help
|
|
set -l
|
|
# CHECK: argv help
|
|
# CHECK: argv_opts
|
|
end
|
|
|
|
# Five args with two matching a flag
|
|
begin
|
|
argparse h/help -- help --help me -h 'a lot more'
|
|
set -l
|
|
# CHECK: _flag_h '--help' '-h'
|
|
# CHECK: _flag_help '--help' '-h'
|
|
# CHECK: argv 'help' 'me' 'a lot more'
|
|
# CHECK: argv_opts '--help' '-h'
|
|
end
|
|
|
|
# Required, optional, and multiple flags
|
|
begin
|
|
argparse h/help 'a/abc=' 'd/def=?' 'g/ghk=+' -- help --help me --ghk=g1 --abc=ABC --ghk g2 -d -g g3
|
|
set -lL
|
|
# CHECK: _flag_a ABC
|
|
# CHECK: _flag_abc ABC
|
|
# CHECK: _flag_d
|
|
# CHECK: _flag_def
|
|
# CHECK: _flag_g 'g1' 'g2' 'g3'
|
|
# CHECK: _flag_ghk 'g1' 'g2' 'g3'
|
|
# CHECK: _flag_h --help
|
|
# CHECK: _flag_help --help
|
|
# CHECK: argv 'help' 'me'
|
|
# CHECK: argv_opts '--help' '--ghk=g1' '--abc=ABC' '--ghk' 'g2' '-d' '-g' 'g3'
|
|
end
|
|
|
|
# --stop-nonopt works
|
|
begin
|
|
argparse --stop-nonopt h/help 'a/abc=' -- -a A1 -h --abc A2 non-opt 'second non-opt' --help
|
|
set -l
|
|
# CHECK: _flag_a A2
|
|
# CHECK: _flag_abc A2
|
|
# CHECK: _flag_h -h
|
|
# CHECK: _flag_help -h
|
|
# CHECK: argv 'non-opt' 'second non-opt' '--help'
|
|
# CHECK: argv_opts '-a' 'A1' '-h' '--abc' 'A2'
|
|
end
|
|
|
|
# Implicit int flags work
|
|
begin
|
|
argparse '#-val' -- abc -123 def
|
|
set -l
|
|
# CHECK: _flag_val 123
|
|
# CHECK: argv 'abc' 'def'
|
|
# CHECK: argv_opts -123
|
|
end
|
|
begin
|
|
argparse v/verbose '#-val' 't/token=' -- -123 a1 --token woohoo --234 -v a2 --verbose
|
|
set -l
|
|
# CHECK: _flag_t woohoo
|
|
# CHECK: _flag_token woohoo
|
|
# CHECK: _flag_v '-v' '--verbose'
|
|
# CHECK: _flag_val -234
|
|
# CHECK: _flag_verbose '-v' '--verbose'
|
|
# CHECK: argv 'a1' 'a2'
|
|
# CHECK: argv_opts '-123' '--token' 'woohoo' '--234' '-v' '--verbose'
|
|
end
|
|
|
|
# Should be set to 987
|
|
begin
|
|
argparse 'm#max' -- argle -987 bargle
|
|
set -l
|
|
# CHECK: _flag_m 987
|
|
# CHECK: _flag_max 987
|
|
# CHECK: argv 'argle' 'bargle'
|
|
# CHECK: argv_opts -987
|
|
end
|
|
|
|
# Should be set to 765
|
|
begin
|
|
argparse 'm#max' -- argle -987 bargle --max 765
|
|
set -l
|
|
# CHECK: _flag_m 765
|
|
# CHECK: _flag_max 765
|
|
# CHECK: argv 'argle' 'bargle'
|
|
# CHECK: argv_opts '-987' '--max' '765'
|
|
end
|
|
|
|
# Bool short flag only
|
|
begin
|
|
argparse C v -- -C -v arg1 -v arg2
|
|
set -l
|
|
# CHECK: _flag_C -C
|
|
# CHECK: _flag_v '-v' '-v'
|
|
# CHECK: argv 'arg1' 'arg2'
|
|
# CHECK: argv_opts '-C' '-v' '-v'
|
|
end
|
|
|
|
# Value taking short flag only
|
|
begin
|
|
argparse 'x=' v/verbose -- --verbose arg1 -v -x arg2
|
|
set -l
|
|
# CHECK: _flag_v '--verbose' '-v'
|
|
# CHECK: _flag_verbose '--verbose' '-v'
|
|
# CHECK: _flag_x arg2
|
|
# CHECK: argv arg1
|
|
# CHECK: argv_opts '--verbose' '-v' '-x' 'arg2'
|
|
end
|
|
|
|
# Implicit int short flag only
|
|
begin
|
|
argparse 'x#' v/verbose -- -v -v argle -v -x 321 bargle
|
|
set -l
|
|
# CHECK: _flag_v '-v' '-v' '-v'
|
|
# CHECK: _flag_verbose '-v' '-v' '-v'
|
|
# CHECK: _flag_x 321
|
|
# CHECK: argv 'argle' 'bargle'
|
|
# CHECK: argv_opts '-v' '-v' '-v' '-x' '321'
|
|
end
|
|
|
|
# Implicit int short flag only with custom validation passes
|
|
begin
|
|
argparse 'x#!_validate_int --max 500' v/verbose -- -v -v -x 499 -v
|
|
set -l
|
|
# CHECK: _flag_v '-v' '-v' '-v'
|
|
# CHECK: _flag_verbose '-v' '-v' '-v'
|
|
# CHECK: _flag_x 499
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '-v' '-v' '-x' '499' '-v'
|
|
end
|
|
|
|
# Implicit int short flag only with custom validation fails
|
|
begin
|
|
argparse 'x#!_validate_int --min 500' v/verbose -- -v -v -x 499 -v
|
|
set -l
|
|
# CHECKERR: argparse: Value '499' for flag 'x' less than min allowed of '500'
|
|
end
|
|
|
|
##########
|
|
# Verify that flag value validation works.
|
|
|
|
# Implicit int flag validation fails
|
|
argparse 'm#max' -- argle --max 765x bargle
|
|
and echo unexpected argparse return status >&2
|
|
argparse 'm#max' -- argle -ma1 bargle
|
|
and echo unexpected argparse return status >&2
|
|
# CHECKERR: argparse: Value '765x' for flag 'max' is not an integer
|
|
# CHECKERR: argparse: Value 'a1' for flag 'm' is not an integer
|
|
|
|
begin
|
|
# Check the exit status from argparse validation
|
|
argparse 'm#max!set -l | grep "^_flag_"; function x; return 57; end; x' -- argle --max=83 bargle 2>&1
|
|
set -l saved_status $status
|
|
test $saved_status -eq 57
|
|
and echo expected argparse return status $saved_status
|
|
# CHECK: _flag_name max
|
|
# CHECK: _flag_value 83
|
|
# CHECK: expected argparse return status 57
|
|
end
|
|
|
|
begin
|
|
# Explicit int flag validation
|
|
# These should fail
|
|
argparse 'm#max!_validate_int --min 1 --max 1' -- argle -m2 bargle
|
|
and echo unexpected argparse return status $status >&2
|
|
argparse 'm#max!_validate_int --min 0 --max 1' -- argle --max=-1 bargle
|
|
and echo unexpected argparse return status $status >&2
|
|
# CHECKERR: argparse: Value '2' for flag 'm' greater than max allowed of '1'
|
|
# CHECKERR: argparse: Value '-1' for flag 'max' less than min allowed of '0'
|
|
# These should succeed
|
|
argparse 'm/max=!_validate_int --min 0 --max 1' -- argle --max=0 bargle
|
|
or echo unexpected argparse return status $status >&2
|
|
argparse 'm/max=!_validate_int --min 0 --max 1' -- argle --max=1 bargle
|
|
or echo unexpected argparse return status $status >&2
|
|
end
|
|
|
|
# Errors use function name by default
|
|
function notargparse
|
|
argparse a/alpha -- --banana
|
|
end
|
|
notargparse
|
|
# CHECKERR: notargparse: --banana: unknown option
|
|
|
|
true
|
|
|
|
begin
|
|
# Ignoring unknown options
|
|
argparse -i a=+ b=+ -- -a alpha -b bravo -t tango -a aaaa --wurst
|
|
or echo unexpected argparse return status $status >&2
|
|
# The unknown options are removed _entirely_.
|
|
echo $argv
|
|
echo $argv_opts
|
|
echo $_flag_a
|
|
# CHECK: -t tango --wurst
|
|
# CHECK: -a alpha -b bravo -a aaaa
|
|
# CHECK: alpha aaaa
|
|
end
|
|
|
|
begin
|
|
# Ignoring unknown long options that share a character with a known short options
|
|
argparse -i o -- --long=value --long
|
|
or echo unexpected argparse return status $status >&2
|
|
set -l
|
|
# CHECK: argv '--long=value' '--long'
|
|
# CHECK: argv_opts
|
|
end
|
|
|
|
begin
|
|
# Check for crash when last option is unknown
|
|
# Note that because of the quotation marks, there is a single argument
|
|
# starting with the known short option '-b', and continuing with an unknown short option
|
|
# that starts with a space
|
|
argparse -i b/break -- "-b kubectl get pods -l name=foo"
|
|
set -l
|
|
# CHECK: _flag_b -b
|
|
# CHECK: _flag_break -b
|
|
# CHECK: argv '- kubectl get pods -l name=foo'
|
|
# CHECK: argv_opts -b
|
|
end
|
|
|
|
begin
|
|
# Ignore unknown and move unknown are mutually exclusive
|
|
argparse -i --move-unknown --
|
|
#CHECKERR: argparse: --ignore-unknown --move-unknown: options cannot be used together
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse -i --move-unknown --
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
begin
|
|
# Moving unknown options
|
|
argparse --move-unknown --unknown-arguments=optional h i -- -hoa -oia
|
|
echo -- $argv
|
|
#CHECK:
|
|
echo -- $argv_opts
|
|
#CHECK: -hoa -oia
|
|
echo $_flag_h
|
|
#CHECK: -h
|
|
set -q _flag_i
|
|
or echo No flag I
|
|
#CHECK: No flag I
|
|
end
|
|
|
|
begin
|
|
# Moving unknown options
|
|
argparse -u a=+ b=+ -- -a alpha -b bravo -t tango -a aaaa --wurst
|
|
or echo unexpected argparse return status $status >&2
|
|
# The unknown options are removed _entirely_.
|
|
echo $argv
|
|
echo $argv_opts
|
|
echo $_flag_a
|
|
# CHECK: tango
|
|
# CHECK: -a alpha -b bravo -t -a aaaa --wurst
|
|
# CHECK: alpha aaaa
|
|
end
|
|
|
|
begin
|
|
# Move unknown long options that share a character with a known short options
|
|
argparse -u o -- --long=value --long
|
|
or echo unexpected argparse return status $status >&2
|
|
set -l
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '--long=value' '--long'
|
|
end
|
|
|
|
|
|
begin
|
|
argparse -u b/break -- "-b kubectl get pods -l name=foo"
|
|
set -l
|
|
# CHECK: _flag_b -b
|
|
# CHECK: _flag_break -b
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '-b kubectl get pods -l name=foo'
|
|
end
|
|
|
|
begin
|
|
# Checking unknown-arguments, with errors
|
|
argparse -i -U none -- --long=value
|
|
# CHECKERR: argparse: --long=value: option does not take an argument
|
|
argparse -i -U required -- -u
|
|
# CHECKERR: argparse: -u: option requires an argument
|
|
argparse -i -U required -- --long
|
|
# CHECKERR: argparse: --long: option requires an argument
|
|
end
|
|
|
|
begin
|
|
argparse -U none -i b= -- -abv=val in --long between -u
|
|
set -l
|
|
# CHECK: _flag_b v=val
|
|
# CHECK: argv '-a' 'in' '--long' 'between' '-u'
|
|
# CHECK: argv_opts -bv=val
|
|
end
|
|
|
|
begin
|
|
argparse -U none b= -- -abv in --long between -u
|
|
set -l
|
|
# CHECK: _flag_b v
|
|
# CHECK: argv 'in' 'between'
|
|
# CHECK: argv_opts '-abv' '--long' '-u'
|
|
end
|
|
|
|
begin
|
|
argparse -iU required b= -- -abv -b -b --long -b -u -b
|
|
set -l
|
|
# CHECK: _flag_b -b
|
|
# CHECK: argv '-abv' '--long' '-b' '-u' '-b'
|
|
# CHECK: argv_opts '-b' '-b'
|
|
end
|
|
|
|
begin
|
|
argparse -uU required b= -- -abv -b -b --long -b -u -b
|
|
set -l
|
|
# CHECK: _flag_b -b
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '-abv' '-b' '-b' '--long' '-b' '-u' '-b'
|
|
end
|
|
|
|
begin
|
|
# Checking arguments after "--"
|
|
argparse a/alpha -- a --alpha -- b -a
|
|
printf '%s\n' $argv
|
|
# CHECK: a
|
|
# CHECK: b
|
|
printf '%s\n' $argv_opts
|
|
# CHECK: -a
|
|
# CHECK: --alpha
|
|
end
|
|
|
|
begin
|
|
# #5864 - short flag only with same validation function.
|
|
# Checking validation for short flags only
|
|
argparse 'i=!_validate_int' 'o=!_validate_int' -- -i 2 -o banana
|
|
argparse 'i=!_validate_int' 'o=!_validate_int' -- -i -o banana
|
|
# CHECKERR: argparse: Value 'banana' for flag 'o' is not an integer
|
|
# CHECKERR: argparse: Value '-o' for flag 'i' is not an integer
|
|
argparse 'i=!_validate_int' 'o=!_validate_int' -- -i 2 -o 3
|
|
set -l
|
|
# CHECK: _flag_i 2
|
|
# CHECK: _flag_o 3
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '-i' '2' '-o' '3'
|
|
end
|
|
|
|
# long-only flags
|
|
begin
|
|
argparse installed= foo -- --installed=no --foo
|
|
set -l
|
|
# CHECK: _flag_foo --foo
|
|
# CHECK: _flag_installed no
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '--installed=no' '--foo'
|
|
end
|
|
|
|
# long-only flags with one letter
|
|
begin
|
|
argparse i-i= /f -- --i=no --f
|
|
set -l
|
|
# CHECK: _flag_f --f
|
|
# CHECK: _flag_i no
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '--i=no' '--f'
|
|
end
|
|
|
|
begin
|
|
argparse installed='!_validate_int --max 12' foo -- --installed=5 --foo
|
|
set -l
|
|
# CHECK: _flag_foo --foo
|
|
# CHECK: _flag_installed 5
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '--installed=5' '--foo'
|
|
end
|
|
|
|
begin
|
|
argparse '#num' installed= -- --installed=5 -5
|
|
set -l
|
|
# CHECK: _flag_installed 5
|
|
# CHECK: _flag_num 5
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '--installed=5' '-5'
|
|
end
|
|
|
|
begin
|
|
argparse installed='!_validate_int --max 12' foo -- --foo --installed=error --foo
|
|
# CHECKERR: argparse: Value 'error' for flag 'installed' is not an integer
|
|
end
|
|
|
|
# #6483 - error messages for missing arguments
|
|
argparse -n foo q r/required= -- foo -qr
|
|
# CHECKERR: foo: -r: option requires an argument
|
|
|
|
argparse r/required= -- foo --required
|
|
# CHECKERR: argparse: --required: option requires an argument
|
|
|
|
### The fish_opt wrapper:
|
|
# No args is an error
|
|
fish_opt
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: Either the --short or --long flag must be provided
|
|
|
|
# Long-only with no long makes no sense
|
|
fish_opt -s h --long-only
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: The --long-only flag requires the --long flag
|
|
|
|
fish_opt -s help
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: The --short flag must be a single character
|
|
|
|
# A required and optional arg makes no sense
|
|
fish_opt -s h -l help -r --optional-val
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: o/optional-val r/required-val: options cannot be used together
|
|
# XXX FIXME the error should output -r and --optional-val: what the user used
|
|
|
|
# An unexpected arg not associated with a flag is an error
|
|
fish_opt -s h -l help hello
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: Extra non-option arguments were provided
|
|
|
|
# A -v / --validate without any arguments is an error
|
|
fish_opt -s h -l help -rv
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: The --validate flag requires subsequent arguments
|
|
|
|
# A -v / --validate for boolean options is an error
|
|
fish_opt -s h -l help -v echo hello
|
|
and echo unexpected status $status
|
|
#CHECKERR: fish_opt: The --validate flag requires the --required-val, --optional-value, or --multiple-vals flag
|
|
|
|
# Now verify that valid combinations of options produces the correct output.
|
|
|
|
# Bool, short only
|
|
fish_opt -s h
|
|
or echo unexpected status $status
|
|
#CHECK: h
|
|
|
|
# Long flag only
|
|
fish_opt -l help
|
|
or echo unexpected status $status
|
|
#CHECK: /help
|
|
|
|
# One character long flag
|
|
fish_opt -l h
|
|
or echo unexpected status $status
|
|
#CHECK: /h
|
|
|
|
# Bool, short and long
|
|
fish_opt --short h --long help
|
|
or echo unexpected status $status
|
|
#CHECK: h/help
|
|
|
|
# Bool, short and long but the short var cannot be used
|
|
fish_opt --short h --long help --long-only
|
|
#CHECK: h-help
|
|
|
|
# Required val and long
|
|
fish_opt --long help -r
|
|
or echo unexpected status $status
|
|
#CHECK: /help=
|
|
|
|
# Optional val, short and long valid, and delete
|
|
fish_opt --short h -l help --optional-val --delete
|
|
or echo unexpected status $status
|
|
#CHECK: h/help=?&
|
|
|
|
# Optional val, short and long but the short var cannot be used
|
|
fish_opt --short h -l help --optional-val --long-only
|
|
or echo unexpected status $status
|
|
#CHECK: h-help=?
|
|
|
|
# Repeated val, short and long valid, with validate
|
|
fish_opt --short h -l help --multiple-vals --validate _validate_int --max 500
|
|
or echo unexpected status $status
|
|
#CHECK: h/help=+!_validate_int --max 500
|
|
|
|
# Repeated and optional val, short and long valid
|
|
fish_opt --short h -l help --optional-val -m
|
|
or echo unexpected status $status
|
|
#CHECK: h/help=*
|
|
|
|
# Repeated val and short, with validate
|
|
fish_opt -ml help --long-only -v test \$_flag_value != "' '"
|
|
or echo unexpected status $status
|
|
#CHECK: /help=+!test $_flag_value != ' '
|
|
|
|
# Repeated and optional val, short and long but short not valid
|
|
fish_opt --short h -l help --long-only -mo
|
|
or echo unexpected status $status
|
|
#CHECK: h-help=*
|
|
|
|
# Repeated val, short only, and deleted
|
|
fish_opt -ms h -md
|
|
or echo unexpected status $status
|
|
#CHECK: h=+&
|
|
|
|
# Repeated and optional val, short only
|
|
fish_opt -s h -om
|
|
or echo unexpected status $status
|
|
#CHECK: h=*
|
|
|
|
function wrongargparse
|
|
argparse -foo -- banana
|
|
argparse a-b
|
|
argparse
|
|
end
|
|
|
|
begin
|
|
argparse ''
|
|
#CHECKERR: argparse: An option spec must have at least a short or a long flag
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse ''
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
begin
|
|
argparse -U
|
|
#CHECKERR: argparse: -U: option requires an argument
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse -U
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
begin
|
|
argparse --unknown-arguments what --
|
|
#CHECKERR: argparse: Invalid --unknown-arguments value 'what'
|
|
#CHECKERR: {{.*}}checks/argparse.fish (line {{\d+}}):
|
|
#CHECKERR: argparse --unknown-arguments what --
|
|
#CHECKERR: ^
|
|
#CHECKERR: (Type 'help argparse' for related documentation)
|
|
end
|
|
|
|
begin
|
|
argparse f!echo hello -- -f
|
|
#CHECKERR: argparse: Invalid option spec 'f!echo' at char '!'
|
|
end
|
|
|
|
begin
|
|
argparse --ignore-unknown h i -- -hoa -oia
|
|
echo -- $argv
|
|
#CHECK: -oa -oia
|
|
echo -- $argv_opts
|
|
#CHECK: -h
|
|
echo $_flag_h
|
|
#CHECK: -h
|
|
set -q _flag_i
|
|
or echo No flag I
|
|
#CHECK: No flag I
|
|
end
|
|
|
|
# Tests for --delete
|
|
begin
|
|
argparse 'a/long&' -- before -a inbetween --long after
|
|
set -l
|
|
# CHECK: _flag_a '-a' '--long'
|
|
# CHECK: _flag_long '-a' '--long'
|
|
# CHECK: argv 'before' 'inbetween' 'after'
|
|
# CHECK: argv_opts
|
|
end
|
|
|
|
begin
|
|
argparse 'a/long=+&' '#int&' -- -123 before -a -a inbetween -astuck ater -long=long
|
|
set -l
|
|
# CHECK: _flag_a '-a' 'stuck' 'long'
|
|
# CHECK: _flag_int 123
|
|
# CHECK: _flag_long '-a' 'stuck' 'long'
|
|
# CHECK: argv 'before' 'inbetween' 'ater'
|
|
# CHECK: argv_opts
|
|
end
|
|
|
|
|
|
begin
|
|
argparse 'd=?&' a b -- -d -d3 -ad -bd345
|
|
set -l
|
|
# CHECK: _flag_a -a
|
|
# CHECK: _flag_b -b
|
|
# CHECK: _flag_d 345
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '-a' '-b'
|
|
end
|
|
|
|
begin
|
|
argparse 'd&' a b 'v=' -- 0 -adbv124 1 -abdv125 2 -dabv124 3 -vd3
|
|
set -l
|
|
# CHECK: _flag_a '-a' '-a' '-a'
|
|
# CHECK: _flag_b '-b' '-b' '-b'
|
|
# CHECK: _flag_d '-d' '-d' '-d'
|
|
# CHECK: _flag_v d3
|
|
# CHECK: argv '0' '1' '2' '3'
|
|
# CHECK: argv_opts '-abv124' '-abv125' '-abv124' '-vd3'
|
|
end
|
|
|
|
argparse a/alpha -- --banna=value
|
|
# CHECKERR: argparse: --banna=value: unknown option
|
|
# But this gives a better message
|
|
argparse a/alpha -- --alpha=value --banna=value
|
|
# CHECKERR: argparse: --alpha=value: option does not take an argument
|
|
|
|
# Check behaviour without -S/--strict-longopts option
|
|
begin
|
|
argparse long valu=+ -- --lon -long -lon -valu=3 -valu 4 -val=3 -val 4
|
|
set -lL
|
|
# CHECK: _flag_long '--long' '--long' '--long'
|
|
# CHECK: _flag_valu '3' '4' '3' '4'
|
|
# CHECK: argv
|
|
# CHECK: argv_opts '--lon' '-long' '-lon' '-valu=3' '-valu' '4' '-val=3' '-val' '4'
|
|
argparse amb ambig -- -am
|
|
# CHECKERR: argparse: -am: unknown option
|
|
argparse a ambig -- -ambig
|
|
# CHECKERR: argparse: -ambig: unknown option
|
|
argparse long -- -long3
|
|
# CHECKERR: argparse: -long3: unknown option
|
|
end
|
|
|
|
# Check behaviour with -S/--strict-longopts option
|
|
begin
|
|
argparse -S long -- --lon
|
|
# CHECKERR: argparse: --lon: unknown option
|
|
argparse -S long -- -long
|
|
# CHECKERR: argparse: -long: unknown option
|
|
argparse --strict-longopts long -- -lon
|
|
# CHECKERR: argparse: -lon: unknown option
|
|
argparse -S value=+ -- -valu=3
|
|
# CHECKERR: argparse: -valu=3: unknown option
|
|
argparse --strict-longopts value=+ -- -valu 4
|
|
# CHECKERR: argparse: -valu: unknown option
|
|
end
|
|
|
|
# Check =* options
|
|
begin
|
|
set -l _flag_o previous value
|
|
argparse 'o/opt=*' -- -o non-value -oval --opt arg --opt=456
|
|
set -l
|
|
# CHECK: _flag_o '' 'val' '' '456'
|
|
# CHECK: _flag_opt '' 'val' '' '456'
|
|
# CHECK: argv 'non-value' 'arg'
|
|
# CHECK: argv_opts '-o' '-oval' '--opt' '--opt=456'
|
|
end
|
|
|
|
# Check that the argparse's are properly wrapped in begin blocks
|
|
set -l
|