# vim: set filetype=fish:
#
# Test the `function` builtin

logmsg Test the -V flag
set -g foo 'global foo'
set -l foo 'local foo'
set bar one 'two    2' \t '' 3
set baz
function frob -V foo -V bar -V baz
    set --show foo bar baz
end

logmsg Testing -V
frob

logmsg Testing -V with changed variables
set foo 'bad foo'
set bar 'bad bar'
set baz 'bad baz'
frob

# This sequence of tests originally verified that functions `name2` and
# `name4` were created. See issue #2068. That behavior is not what we want.
# The function name must always be the first argument of the `function`
# command. See issue #2827.
function name1 -a arg1 arg2 ; echo hello; end
function -a arg1 arg2 name2 ; end
function name3 --argument-names arg1 arg2 ; echo hello; echo goodbye; end
function --argument-names arg1 arg2 name4 ; end
function name5 abc --argument-names def ; end
functions -q name1; and echo "Function name1 found"
functions -q name2; or echo "Function name2 not found as expected"
functions -q name3; and echo "Function name3 found"
functions -q name4; or echo "Function name4 not found as expected"

logmsg Verify that functions can be copied. Tests against regression of issue \#3601
functions -c name1 name1a
functions --copy name3 name3a
functions -q name1a
or echo "Function name1a not found as expected"
functions -q name3a
or echo "Function name3a not found as expected"

logmsg Checking that the copied functions are identical other than the name
# Poor man's diff because on some systems diff defaults to unified output, but that prints filenames.
#
set -l name1 (functions name1)
set -l name1a (functions name1a)
set -l name3 (functions name3)
set -l name3a (functions name3a)
echo $name1[1]
echo $name1a[1]
test "$name1[2..-1]" = "$name1a[2..-1]"; and echo "1 = 1a"
echo $name3[1]
echo $name3a[1]
test "$name3[2..-1]" = "$name3a[2..-1]"; and echo "3 = 3a"

logmsg Checking reserved names
function test; echo banana; end

logmsg Checking `functions -q` without arguments
functions -q; or echo "False"
exit 0
