# Environment variable tests

#Test if variables can be properly set

set smurf blue

if test $smurf = blue
	echo Test 1 pass
else
	echo Test 1 fail
end

# Test if variables can be erased

set -e smurf

if test $smurf
	echo Test 2 fail
else
	echo Test 2 pass
end

# Test if local variables go out of scope

set -e t3
if true
	set -l t3 bar
end

if test $t3
	echo Test 3 fail
else
	echo Test 3 pass
end

# Test if globals can be set in block scope

if true
	set -g baz qux
end

if test $baz = qux
	echo Test 4 pass
else
	echo Test 4 fail
end


#Test that scope is preserved when setting a new value

set t5 a

if true
	set t5 b
end

if test $t5 = b
	echo Test 5 pass
else
	echo Test 5 fail
end

# Test that scope is preserved in double blocks

for i in 1
  set t6 $i
  for j in a
	if test $t6$j = 1a
		echo Test 6 pass
	else
		echo Test 6 fail
	end
  end
end


# Test if variables in for loop blocks do not go out of scope on new laps

set res fail

set -e t7
for i in 1 2
	if test $i = 1
		set t7 lala
	else
		if test $t7
			set res pass
		end
	end
end

echo Test 7 $res

# Test if variables are properly exported

set -e t8
if true
	set -lx t8 foo
	if test (../fish -c "echo $t8") = foo
		echo Test 8 pass
	else
		echo Test 8 fail
	end
end

# Test if exported variables go out of scope

if test (../fish -c "echo $t8")
	echo Test 9 fail
else
	echo Test 9 pass
end

# Test erasing variables in specific scope

set -eU __fish_test_universal_variables_variable_foo
set -g __fish_test_universal_variables_variable_foo bar
begin
	set -l __fish_test_universal_variables_variable_foo baz
	set -eg __fish_test_universal_variables_variable_foo
end

if set -q __fish_test_universal_variables_variable_foo
	echo Test 10 fail
else
	echo Test 10 pass
end


set __fish_test_universal_variables_variable_foo abc def
set -e __fish_test_universal_variables_variable_foo[1]
if test $__fish_test_universal_variables_variable_foo '=' def
	echo Test 11 pass
else
	echo Test 11 fail
end

# Test combinations of export and scope

set -ge __fish_test_universal_variables_variable_foo

set -Ue __fish_test_universal_variables_variable_foo
set -Ux __fish_test_universal_variables_variable_foo bar
set __fish_test_universal_variables_variable_foo baz
if test (/bin/sh -c 'echo $__fish_test_universal_variables_variable_foo') = baz -a (../fish -c 'echo $__fish_test_universal_variables_variable_foo') = baz
  echo Test 12 pass
else
  echo Test 12 fail
end

set -Ue __fish_test_universal_variables_variable_foo

# Should no longer be in environment (#2046)
env | sgrep __fish_test_universal_variables_variable_foo

set -Ux __fish_test_universal_variables_variable_foo bar
set -U __fish_test_universal_variables_variable_foo baz
if test (/bin/sh -c 'echo $__fish_test_universal_variables_variable_foo') = baz -a (../fish -c 'echo $__fish_test_universal_variables_variable_foo') = baz
  echo Test 13 pass
else
  echo Test 13 fail
end

set -Ux __fish_test_universal_variables_variable_foo bar
set -u __fish_test_universal_variables_variable_foo bar
if test (/bin/sh -c 'echo $__fish_test_universal_variables_variable_foo') = '' -a (../fish -c 'echo $__fish_test_universal_variables_variable_foo') = bar
  echo Test 14 pass
else
  echo Test 14 fail
end

set -Ux __fish_test_universal_variables_variable_foo bar
set -Uu __fish_test_universal_variables_variable_foo baz
if test (/bin/sh -c 'echo $__fish_test_universal_variables_variable_foo') = '' -a (../fish -c 'echo $__fish_test_universal_variables_variable_foo') = baz
  echo Test 15 pass
else
  echo Test 15 fail
end

set -eU __fish_test_universal_variables_variable_foo
function watch_foo --on-variable __fish_test_universal_variables_variable_foo
    echo Foo change detected
end

set -U __fish_test_universal_variables_variable_foo 1234
set -eU __fish_test_universal_variables_variable_foo

functions -e watch_foo


# test erasing variables without a specified scope

set -g test16res

set -U __fish_test_universal_variables_variable_foo universal
set -g __fish_test_universal_variables_variable_foo global
begin
  set -l __fish_test_universal_variables_variable_foo blocklocal
  function test16
    set -l __fish_test_universal_variables_variable_foo function
    begin
      set -l __fish_test_universal_variables_variable_foo functionblock

      set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
      set -e __fish_test_universal_variables_variable_foo
      set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
      set -e __fish_test_universal_variables_variable_foo
      set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
      set -e __fish_test_universal_variables_variable_foo
      set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
      set -e __fish_test_universal_variables_variable_foo
      set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
    end
    set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
    set -e __fish_test_universal_variables_variable_foo
  end
  test16
  set test16res $test16res (echo $__fish_test_universal_variables_variable_foo)
end
set test16res $test16res (echo $__fish_test_universal_variables_variable_food)

#echo count: (count $test16res) "content:[$test16res]"

if test (count $test16res) = 8 -a "$test16res" = "functionblock function global universal   blocklocal "
  echo Test 16 pass
else
  echo Test 16 fail
end

# Test that shadowing with a non-exported variable works
set -gx __fish_test_env17 UNSHADOWED
env | sgrep __fish_test_env17
function __fish_test_shadow
  set -l __fish_test_env17
  env | sgrep __fish_test_env17 ; or echo SHADOWED
end
__fish_test_shadow

# clear for other shells
set -eU __fish_test_universal_variables_variable_foo

# Test behavior of universals on startup (#1526)
echo Testing Universal Startup
set -U testu 0
../fish -c 'set -U testu 1'
echo $testu
../fish -c 'echo $testu'

../fish -c 'set -U testu 2'
echo $testu
../fish -c 'echo $testu'

../fish -c 'set -e testu';
echo Missing: $testu
../fish -c 'echo Missing: $testu'

# test SHLVL
# use a subshell to ensure a clean slate
env SHLVL= ../fish -c 'echo SHLVL: $SHLVL; ../fish -c \'echo SHLVL: $SHLVL\''
# exec should decrement SHLVL
env SHLVL= ../fish -c 'echo SHLVL: $SHLVL; exec ../fish -c \'echo SHLVL: $SHLVL\''
# garbage SHLVLs should be treated as garbage
env SHLVL=3foo ../fish -c 'echo SHLVL: $SHLVL'
# whitespace is allowed though (for bash compatibility)
env SHLVL="3  " ../fish -c 'echo SHLVL: $SHLVL'
env SHLVL="  3" ../fish -c 'echo SHLVL: $SHLVL'

# Test transformation of inherited variables
env DISPLAY="localhost:0.0" ../fish -c 'echo Elements in DISPLAY: (count $DISPLAY)'
# We can't use PATH for this because the global configuration will modify PATH
# based on /etc/paths and /etc/paths.d.
# Exported arrays should use record separator, with a few exceptions. So we can use an arbitrary variable for this.
env FOO=one\x1etwo\x1ethree\x1efour ../fish -c 'echo Elements in FOO: (count $FOO)'
# some must use colon separators!
set -lx MANPATH man1 man2 man3 ; env | grep MANPATH

true
