# RUN: env fth=%fish_test_helper %fish %s

set -g SIGUSR1_COUNT 0

function gotsigusr1
    set -g SIGUSR1_COUNT (math $SIGUSR1_COUNT + 1)
    echo "Got USR1: $SIGUSR1_COUNT"

end

function handle1 --on-signal SIGUSR1
    gotsigusr1
end

function handle_us42 --on-signal SIGUSR2
end

kill -USR1 $fish_pid
sleep .1
#CHECK: Got USR1: 1

kill -USR1 $fish_pid
sleep .1
#CHECK: Got USR1: 2

kill -USR2 $fish_pid
sleep .1
kill -USR2 $fish_pid
sleep .1

# Previous signals do not re-trigger handlers.
functions --erase handle1
kill -USR1 $fish_pid
sleep .1
kill -USR1 $fish_pid
sleep .1

kill -USR2 $fish_pid
sleep .1

# Send the signal and immediately define the function; it should not excute.
kill -USR1 $fish_pid
function handle1 --on-signal SIGUSR1
    gotsigusr1
end
echo "Hope it did not run"
#CHECK: Hope it did not run

kill -USR1 $fish_pid
sleep .1
#CHECK: Got USR1: 3

# We can trap SIGINT.
# Trapping it prevents exiting.
function handle_int --on-signal SIGINT
    echo Got SIGINT
end
kill -INT $fish_pid
#CHECK: Got SIGINT

# In non-interactive mode, we have historically treated
# a child process which dies with SIGINT as if we got SIGINT.
# However in this case we don't execute handlers; we just don't exit.
$fth sigint_self
echo "Should not have exited"
#CHECK: Should not have exited

# If a signal is received while handling a signal, that is deferred until the handler is done.
set -g INTCOUNT 0
function handle_int --on-signal SIGINT
    test $INTCOUNT -gt 2 && return
    set -g INTCOUNT (math $INTCOUNT + 1)
    echo "start handle_int $INTCOUNT"
    sleep .1
    kill -INT $fish_pid
    echo "end handle_int $INTCOUNT"
end
kill -INT $fish_pid
# CHECK: start handle_int 1
# CHECK: end handle_int 1
# CHECK: start handle_int 2
# CHECK: end handle_int 2
# CHECK: start handle_int 3
# CHECK: end handle_int 3

# Remove our handler and SIGINT ourselves. Now we should exit.
functions --erase handle_int
kill -INT $fish_pid
echo "I should not run"