fish-shell/tests/checks/loops.fish
Johannes Altmanninger 8bf8b10f68 Extended & human-friendly keys
See the changelog additions for user-visible changes.

Since we enable/disable terminal protocols whenever we pass terminal ownership,
tests can no longer run in parallel on the same terminal.

For the same reason, readline shortcuts in the gdb REPL will not work anymore.
As a remedy, use gdbserver, or lobby for CSI u support in libreadline.

Add sleep to some tests, otherwise they fall (both in CI and locally).

There are two weird failures on FreeBSD remaining, disable them for now
https://github.com/fish-shell/fish-shell/pull/10359/checks?check_run_id=23330096362

Design and implementation borrows heavily from Kakoune.

In future, we should try to implement more of the kitty progressive
enhancements.

Closes #10359
2024-04-02 14:35:16 +02:00

163 lines
3.5 KiB
Fish

#RUN: %fish -C 'set -g fish %fish' %s | %filter-ctrlseqs
function never_runs
while false
end
end
function early_return
while true
return 2
end
end
function runs_once
set -l i 1
while test $i -ne 0 && set i (math $i - 1)
end
end
# this should return 0
never_runs
echo "Empty Loop in Function: $status"
#CHECK: Empty Loop in Function: 0
# this should return 0
runs_once
echo "Runs Once: $status"
#CHECK: Runs Once: 0
# this should return 2
early_return
echo "Early Return: $status"
#CHECK: Early Return: 2
function set_status
return $argv[1]
end
# The previous status is visible in the loop condition.
# This includes both the incoming status, and the last command in the
# loop body.
set_status 36
while begin
set -l saved $status
echo "Condition Status: $status"
set_status $saved
end
true
end
#CHECK: Condition Status: 36
# The condition status IS visible in the loop body.
set_status 55
while true
echo "Body Status: $status"
break
end
#CHECK: Body Status: 0
# The status of the last command is visible in the loop condition
set_status 13
while begin
set -l saved $status
echo "Condition 2 Status: $saved"
test $saved -ne 5
end
set_status 5
end
#CHECK: Condition 2 Status: 13
#CHECK: Condition 2 Status: 5
# The status of the last command is visible outside the loop
set rem 5 7 11
while [ (count $rem) -gt 0 ]
set_status $rem[1]
set rem $rem[2..-1]
end
echo "Loop Exit Status: $status"
#CHECK: Loop Exit Status: 11
# Empty loops succeed.
false
while false
end
echo "Empty Loop Status: $status"
#CHECK: Empty Loop Status: 0
# Loop control in conditions, should have no output.
for i in 1 2 3
while break
end
echo $i
end
for i in 1 2 3
while continue
end
echo $i
end
if false; or --help
end
# Make sure while loops don't run forever with no-exec (#1543)
echo "while true; end" | $fish --no-execute
# For loops with read-only vars is an error (#4342)
for status in a b c
echo $status
end
#CHECKERR: {{.*}}loops.fish (line {{\d+}}): for: status: cannot overwrite read-only variable
#CHECKERR: for status in a b c
#CHECKERR: ^~~~~^
# "That goes for non-electric ones as well (#5548)"
for hostname in a b c
echo $hostname
end
#CHECKERR: {{.*}}loops.fish (line {{\d+}}): for: hostname: cannot overwrite read-only variable
#CHECKERR: for hostname in a b c
#CHECKERR: ^~~~~~~^
# 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
#CHECK: $loop_var: set in local scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |c|
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
#CHECK: $loop_var: set in local scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |b|
begin
set -l loop_var
for loop_var in aa bb cc
end
set --show loop_var
end
set --show loop_var
#CHECK: $loop_var: set in global scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |global_val|
#CHECK: $loop_var: set in global scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |global_val|
#CHECK: $loop_var: set in local scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |cc|
#CHECK: $loop_var: set in global scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |global_val|
#CHECK: $loop_var: set in global scope, unexported, with 1 elements
#CHECK: $loop_var[1]: |global_val|