fish-shell/tests/test6.in
ridiculousfish e395a0eb69 Migrate PATH-completion logic from complete.cpp to expand.cpp
Prior to this fix, when completing a command that doesn't have a /, we
would prepend each component of PATH and then expand the whole thing. So
any special characters in the PATH would be interpreted when performing
tab completion.

With this fix, we pull the PATH resolution out of complete.cpp and
migrate it to expand.cpp. This unifies nicely with the CDPATH resolution
already in that file. This requires introducing a new expand flag
EXPAND_SPECIAL_FOR_COMMAND, which is analogous to EXPAND_SPECIAL_CD
(which is renamed to EXPAND_SPECIAL_FOR_CD). This flag tells expand to
resolve paths against PATH instead of the working directory.

Fixes #952
2016-04-07 20:15:32 -07:00

108 lines
3.3 KiB
Fish

# vim: set filetype=fish:
# Test that conditions that add or remove completions don't deadlock, etc.
# We actually encountered some case that was effectively like this (Issue 2 in github)
complete --command AAAA -l abcd --condition 'complete -c AAAA -l efgh'
echo "AAAA:"
complete -C'AAAA -' | sort
echo "AAAA:"
complete -C'AAAA -' | sort
complete --command BBBB -l abcd --condition 'complete -e --command BBBB -l abcd'
echo "BBBB:"
complete -C'BBBB -'
echo "BBBB:"
complete -C'BBBB -'
# Test that erasing completions works correctly
echo
function sort
# GNU sort is really stupid, a non-C locale seems to make it assume --dictionary-order
# If I wanted --dictionary-order, I would have specified --dictionary-order!
env LC_ALL=C sort $argv
end
complete -c CCCC -l bar
complete -c CCCC -l baz
complete -c CCCC -o bar
complete -c CCCC -o foo
complete -c CCCC -s a
complete -c CCCC -s b
echo "CCCC:"
complete -C'CCCC -' | sort
complete -c CCCC -l bar -e
echo "CCCC:"
complete -C'CCCC -' | sort
complete -c CCCC -o foo -e
echo "CCCC:"
complete -C'CCCC -' | sort
complete -c CCCC -s a -e
echo "CCCC:"
complete -C'CCCC -' | sort
complete -c CCCC -e
echo "CCCC:"
complete -C'CCCC -' | sort
# Test that directory completions work correctly
if begin; rm -rf test6.tmp.dir; and mkdir test6.tmp.dir; end
pushd test6.tmp.dir
set -l dir (mktemp -d XXXXXXXX)
if complete -C$dir | grep "^$dir/.*Directory" >/dev/null
echo "implicit cd complete works"
else
echo "no implicit cd complete"
end
if complete -C"command $dir" | grep "^$dir/.*Directory" >/dev/null
echo "implicit cd complete incorrect after 'command'"
else
echo "no implicit cd complete after 'command'"
end
popd
if begin
set -l PATH $PWD/test6.tmp.dir $PATH ^/dev/null
complete -C$dir | grep "^$dir/.*Directory" >/dev/null
end
echo "incorrect implicit cd from PATH"
else
echo "PATH does not cause incorrect implicit cd"
end
rm -rf test6.tmp.dir
else
echo "error: could not create temp environment" >&2
end
# Test command expansion with parened PATHs (#952)
begin
set -l parened_path $PWD/'test6.tmp2.(paren).dir'
set -l parened_subpath $parened_path/subdir
if not begin
rm -rf $parened_path
and mkdir $parened_path
and mkdir $parened_subpath
and ln -s /bin/ls $parened_path/'__test6_(paren)_command'
and ln -s /bin/ls $parened_subpath/'__test6_subdir_(paren)_command'
end
echo "error: could not create command expansion temp environment" >&2
end
# Verify that we can expand commands when PATH has parens
set -l PATH $parened_path $PATH
set -l completed (complete -C__test6_ | cut -f 1 -d \t)
if test "$completed" = '__test6_(paren)_command'
echo "Command completion with parened PATHs test passed"
else
echo "Command completion with parened PATHs test failed. Expected __test6_(paren)_command, got $completed" >&2
end
# Verify that commands with intermediate slashes do NOT expand with respect to PATH
set -l completed (complete -Csubdir/__test6_subdir)
if test -z "$completed"
echo "Command completion with intermediate slashes passed"
else
echo "Command completion with intermediate slashes: should output nothing, instead got $completed" >&2
end
rm -rf $parened_path
end