#
# Test function, loops, conditionals and some basic elements
#

logmsg "Comments in odd places don't cause problems"
for i in 1 2 # Comment on same line as command
# Comment inside loop
    for j in a b
		# Double loop
        echo $i$j
	end;
end

logmsg Bracket expansion
echo x-{1}
echo x-{1,2}
echo foo-{1,2{3,4}}

echo foo-{} # literal "{}" expands to itself
echo foo-{{},{}} # the inner "{}" expand to themselves, the outer pair expands normally.
echo foo-{""} # still expands to foo-
echo foo-{$undefinedvar} # still expands to nothing

echo foo-{,,,} # four empty items in the braces.
echo foo-{,\,,} # an empty item, a "," and an empty item.

logmsg Escaped newlines
echo foo\ bar
echo foo\
bar
echo "foo\
bar"
echo 'foo\
bar'

for i in \
    a b c
    echo $i
end


logmsg Simple function tests

function foo
    echo >../test/temp/fish_foo.txt $argv
end

foo hello

cat ../test/temp/fish_foo.txt |read foo

if test $foo = hello;
  echo Test 2 pass
else
  echo Test 2 fail
end

function foo
    printf 'Test %s' $argv[1]; echo ' pass'
end

foo 3a

for i in Test for continue break and switch builtins problems;
	switch $i
		case Test
			printf "%s " $i
		case "for"
			printf "%s " 3b
		case "c*"
			echo pass
		case break
			continue
			echo fail
		case and
			break
			echo fail
		case "*"
			echo fail
	end
end

set -l sta
if eval true
	if eval false
		set sta fail
	else
		set sta pass
	end
else
	set sta fail
end
echo Test 4 $sta

logmsg "Ensure eval doesn't unnecessarily mess with the exit status"
function empty_func ; end
false ; eval empty_func ; echo $status
true ; eval empty_func ; echo $status

function test_builtin_status
	return 1
end
test_builtin_status
if [ $status -eq 1 ]
	set sta pass
else
	set sta fail
end
echo Test 5 $sta

logmsg Verify that we can turn stderr into stdout and then pipe it
# Note that the order here has historically been unspecified - 'errput' could conceivably appear before 'output'.
begin ; echo output ; echo errput 1>&2  ; end 2>&1 | tee ../test/temp/tee_test.txt ; cat ../test/temp/tee_test.txt

logmsg "Test that trailing ^ doesn't trigger redirection, see #1873"
echo caret_no_redirect 12345^

logmsg Verify that we can pipe something other than stdout
# The first line should be printed, since we output to stdout but pipe stderr to /dev/null
# The second line should not be printed, since we output to stderr and pipe it to /dev/null
begin ; echo is_stdout ; end 2>| cat > /dev/null
begin ; echo is_stderr 1>&2 ; end 2>| cat > /dev/null

####################
logmsg echo tests
echo 'abc\ndef'
echo -e 'abc\ndef'
echo -e 'abc\zdef'
echo -e 'abc\41def'
echo -e 'abc\041def'
echo -e 'abc\121def'
echo -e 'abc\1212def'
echo -e 'abc\cdef' # won't output a newline!
echo ''
echo -
echo -h
echo -ne '\376' | display_bytes
echo -e Catch your breath
echo -e 'abc\x21def'
echo -e 'abc\x211def'

logmsg "Verify that pipes don't conflict with fd redirections"
# This code is very similar to eval. We go over a bunch of fads
# to make it likely that we will nominally conflict with a pipe
# fish is supposed to detect this case and dup the pipe to something else
echo "/bin/echo pipe 3 <&3 3<&-" | source 3<&0
echo "/bin/echo pipe 4 <&4 4<&-" | source 4<&0
echo "/bin/echo pipe 5 <&5 5<&-" | source 5<&0
echo "/bin/echo pipe 6 <&6 6<&-" | source 6<&0
echo "/bin/echo pipe 7 <&7 7<&-" | source 7<&0
echo "/bin/echo pipe 8 <&8 8<&-" | source 8<&0
echo "/bin/echo pipe 9 <&9 9<&-" | source 9<&0
echo "/bin/echo pipe 10 <&10 10<&-" | source 10<&0
echo "/bin/echo pipe 11 <&11 11<&-" | source 11<&0
echo "/bin/echo pipe 12 <&12 12<&-" | source 12<&0

logmsg "Make sure while loops don't run forever with no-exec (#1543)"
echo "Checking for infinite loops in no-execute"
echo "while true; end" | ../test/root/bin/fish --no-execute

logmsg "For loops with read-only vars is an error (#4342)"
for status in a b c
  echo $status
end

logmsg "That goes for non-electric ones as well (#5548)"
for hostname in a b c
    echo $hostname
end

logmsg For loop control vars available outside the for block
begin
  set -l loop_var initial-value
  for loop_var in a b c
    # do nothing
  end
  set --show loop_var
end

set -g loop_var global_val
function loop_test
  for loop_var in a b c
    if test $loop_var = b
      break
    end
  end
  set --show loop_var
end
loop_test
set --show loop_var

begin
  set -l loop_var
  for loop_var in aa bb cc
  end
  set --show loop_var
end
set --show loop_var

logmsg 'Comments allowed in between lines (#1987)'
echo before comment \
  # comment
  after comment

logmsg 'Backslashes are part of comments and do not join lines (#1255)'
# This should execute false, not echo it
echo -n # comment\
false

function always_fails
    if true
        return 1
    end
end

logmsg 'Verify $argv set correctly in sourced scripts (#139)'
echo 'echo "source argv {$argv}"' | source
echo 'echo "source argv {$argv}"' | source -
echo 'echo "source argv {$argv}"' | source - abc
echo 'echo "source argv {$argv}"' | source - abc def

always_fails
echo $status