#Test scoping rules for functions

set -e smurf

function setter
set smurf green
end

function unsetter
set -e smurf
end

function call1
set smurf blue; setter; if test $smurf = blue; echo Test 1 pass; else; echo Test 1 fail; end
end

function call2
set smurf blue; unsetter; if test $smurf = blue; echo Test 2 pass; else; echo Test 2 fail; end
end

call1
call2

function call3
setter; if test $smurf = green; echo Test 3 pass; else; echo Test 3 fail; end
end

function call4
unsetter; if not set -q smurf; echo Test 4 pass; else; echo Test 4 fail; end
end

set -g smurf yellow
call3
call4

set -l foo 1 
set -g bar 2 
set -U baz 3 

set -l -q foo 

if test $status -ne 0
    echo Test 5 fail 
else
    echo Test 5 pass
end;

if not set -g -q bar 
    echo Test 6 fail 
else
    echo Test 6 pass
end;

if not set -U -q baz 
    echo Test 7 fail 
else
    echo Test 7 pass
end;

set -u -l -q foo 
if test $status -ne 0 
    echo Test 8 fail 
else
    echo Test 8 pass

end;

if not set -u -g -q bar 
    echo Test 9 fail 
else
    echo Test 9 pass
end;

if not set -u -U -q baz 
    echo Test 10 fail 
else
    echo Test 10 pass
end;

set -x -l -q foo 
if test $status -eq 0
    echo Test 11 fail 
else
    echo Test 11 pass
end;

if set -x -g -q bar 
    echo Test 12 fail 
else
    echo Test 12 pass
end;

if set -x -U -q baz 
    echo Test 13 fail 
else
    echo Test 13 pass
end;

set -x -l foo 1
set -x -g bar 2
set -x -U baz 3

set -l -q foo 
if test $status -ne 0 
    echo Test 14 fail 
else
    echo Test 14 pass
end;

if not set -g -q bar 
    echo Test 15 fail 
else
    echo Test 15 pass
end;

if not set -U -q baz 
    echo Test 16 fail 
else
    echo Test 16 pass

end;

set -u -l -q foo 
if test $status -ne 1 
    echo Test 17 fail 
else
    echo Test 17 pass
end;

if set -u -g -q bar 
    echo Test 18 fail 
else
    echo Test 18 pass
end;

if set -u -U -q baz 
    echo Test 19 fail 
else
    echo Test 19 pass

end;

set -x -l -q foo 
if test $status -ne 0 
    echo Test 20 fail 
else
    echo Test 20 pass
end;

if not set -x -g -q bar 
    echo Test 21 fail 
else
    echo Test 21 pass
end;

if not set -x -U -q baz 
    echo Test 22 fail 
else
    echo Test 22 pass
end;

set -U -e baz

echo "Verify subcommand statuses"
echo (false) $status (true) $status (false) $status

echo "Verify that set passes through exit status, except when passed -n or -q or -e"
false ; set foo bar ; echo 1 $status # passthrough
true ; set foo bar ; echo 2 $status # passthrough
false ; set -q foo ; echo 3 $status # no passthrough
true ; set -q foo ; echo 4 $status  # no passthrough
false ; set -n > /dev/null ; echo 5 $status # no passthrough
false ; set -e foo ; echo 6 $status # no passthrough
true ; set -e foo ; echo 7 $status # no passthrough
false ; set -h > /dev/null ; echo 8 $status # no passthrough
true ; set -NOT_AN_OPTION 2> /dev/null ; echo 9 $status # no passthrough
false ; set foo (echo A; true) ; echo 10 $status $foo
true ; set foo (echo B; false) ; echo 11 $status $foo
true
