diff --git a/regress/control-subscriptions.sh b/regress/control-subscriptions.sh index 25c732ac0..f720b0650 100644 --- a/regress/control-subscriptions.sh +++ b/regress/control-subscriptions.sh @@ -7,7 +7,7 @@ LANG=C.UTF-8 export TERM LC_ALL LANG [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) -TMUX="$TEST_TMUX -Ltest -f/dev/null" +TMUX="$TEST_TMUX -Ltest$$ -f/dev/null" TMPDIR=$(mktemp -d) IN="$TMPDIR/in" diff --git a/regress/set-hook-B.sh b/regress/set-hook-B.sh new file mode 100755 index 000000000..0d8eed372 --- /dev/null +++ b/regress/set-hook-B.sh @@ -0,0 +1,150 @@ +#!/bin/sh + +PATH=/bin:/usr/bin +TERM=screen +LC_ALL=C.UTF-8 +LANG=C.UTF-8 +export TERM LC_ALL LANG + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +OUT=$(mktemp -d) +TMUX_TMPDIR="$OUT" +export TMUX_TMPDIR +TMUX="$TEST_TMUX -Ltest-hook-B-$$ -f/dev/null" + +fail() +{ + echo "$*" >&2 + $TMUX kill-server 2>/dev/null || true + rm -rf "$OUT" + exit 1 +} + +cleanup() +{ + $TMUX kill-server 2>/dev/null || true + rm -rf "$OUT" +} +trap cleanup EXIT + +wait_for() +{ + option=$1 + expected=$2 + i=0 + + while [ $i -lt 30 ]; do + value=$($TMUX show -gqv "$option" 2>/dev/null || true) + [ "$value" = "$expected" ] && return 0 + i=$((i + 1)) + sleep 0.2 + done + fail "expected $option to be '$expected' but got '$value'" +} + +assert_unchanged() +{ + option=$1 + expected=$2 + i=0 + + while [ $i -lt 15 ]; do + value=$($TMUX show -gqv "$option" 2>/dev/null || true) + [ "$value" = "$expected" ] || \ + fail "expected $option to remain '$expected' but got '$value'" + i=$((i + 1)) + sleep 0.2 + done +} + +$TMUX new -d -s one || fail "new-session failed" + +$TMUX set -g @seen 0 || fail "set @seen failed" +$TMUX set-hook -g -B '@session-name::#{session_name}' \ + 'set -g @seen "#{hook}:#{hook_value}"' || + fail "set-hook -B failed" +shown=$($TMUX show-hooks -g -B @session-name) || + fail "show-hooks -B failed" +[ "$shown" = '@session-name::#{session_name}' ] || + fail "unexpected show-hooks -B output: $shown" +assert_unchanged @seen 0 + +$TMUX rename-session two || fail "rename-session two failed" +wait_for @seen '@session-name:two' + +$TMUX set -g @seen-last 0 || fail "set @seen-last failed" +$TMUX set-hook -g -B '@session-name::#{session_name}' \ + 'set -g @seen-last "#{hook_last}->#{hook_value}"' || + fail "set-hook -B replacement failed" +assert_unchanged @seen-last 0 +$TMUX rename-session one || fail "rename-session one failed" +wait_for @seen-last 'two->one' + +$TMUX set-hook -gu -B @session-name || fail "set-hook -gu -B failed" +shown=$($TMUX show-hooks -g -B @session-name) || + fail "show-hooks -B after remove failed" +[ -z "$shown" ] || fail "show-hooks -B showed removed monitor: $shown" +last=$($TMUX show -gqv @seen-last) +$TMUX rename-session three || fail "rename-session three failed" +assert_unchanged @seen-last "$last" + +$TMUX set -gu @value || fail "unset @value failed" +$TMUX set -g @empty-seen 0 || fail "set @empty-seen failed" +$TMUX set-hook -g -B '@empty::#{@value}' \ + 'set -g @empty-seen "#{hook_last}->#{hook_value}"' || + fail "set-hook -B empty failed" +assert_unchanged @empty-seen 0 +$TMUX set -g @value changed || fail "set @value failed" +wait_for @empty-seen '->changed' + +if $TMUX set-hook -g -B 'bad::#{session_name}' 'display-message x' \ + >"$OUT/bad.out" 2>"$OUT/bad.err"; then + fail "non-@ monitor hook name was accepted" +fi + +session=$($TMUX display -p '#{session_id}') +window=$($TMUX display -p '#{window_id}') +pane=$($TMUX display -p '#{pane_id}') +pane_number=${pane#%} + +$TMUX set -gu @pane-value || fail "unset @pane-value failed" +$TMUX set -g @pane-seen 0 || fail "set @pane-seen failed" +$TMUX set-hook -g -B "@pane:%$pane_number:#{pane_width}" \ + 'set -g @pane-seen "#{hook_session}:#{hook_window}:#{hook_window_index}:#{hook_pane}:#{hook_value}"' || + fail "set-hook -B pane selector failed" +assert_unchanged @pane-seen 0 +$TMUX set-hook -g -B "@pane:%$pane_number:#{@pane-value}" \ + 'set -g @pane-seen "#{hook_session}:#{hook_window}:#{hook_window_index}:#{hook_pane}:#{hook_value}"' || + fail "set-hook -B pane replacement failed" +assert_unchanged @pane-seen 0 +$TMUX set -g @pane-value changed || fail "set @pane-value failed" +wait_for @pane-seen "$session:$window:0:$pane:changed" + +$TMUX set -g @exact-value one || fail "set @exact-value failed" +$TMUX set -g @exact-seen 0 || fail "set @exact-seen failed" +$TMUX set -gw @foo 'set -g @exact-seen inherited' || + fail "set global @foo failed" +$TMUX set-hook -w -B '@foo::#{@exact-value}' || + fail "set-hook -B exact scope monitor failed" +assert_unchanged @exact-seen 0 +$TMUX set -g @exact-value two || fail "set @exact-value two failed" +assert_unchanged @exact-seen 0 +$TMUX set-hook -w -B '@foo::#{@exact-value}' \ + 'set -g @exact-seen "#{hook_value}"' || + fail "set-hook -B exact scope command failed" +assert_unchanged @exact-seen 0 +$TMUX set -g @exact-value three || fail "set @exact-value three failed" +wait_for @exact-seen three + +target_pane=$($TMUX splitw -P -F '#{pane_id}') || + fail "split-window failed" +$TMUX set -g @target-pane 0 || fail "set @target-pane failed" +$TMUX set-hook -g -B '@target:%*:#{@target-value}' \ + 'set -g @target-pane "#{pane_id}"' || + fail "set-hook -B target pane failed" +assert_unchanged @target-pane 0 +$TMUX set -pt "$target_pane" @target-value changed || + fail "set pane @target-value failed" +wait_for @target-pane "$target_pane" + +exit 0