From 38feebb5d2a5b2be475aca56c406fbdf57cee13d Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 23 Jul 2026 08:06:09 +0100 Subject: [PATCH] Show options tests. --- regress/options-array.sh | 33 ++++++++ regress/options-values.sh | 24 ++++++ regress/set-hook-B.sh | 11 +++ regress/show-options-output.sh | 136 +++++++++++++++++++++++++++++++++ 4 files changed, 204 insertions(+) create mode 100644 regress/show-options-output.sh diff --git a/regress/options-array.sh b/regress/options-array.sh index fbaff6ae2..d707fb7d9 100644 --- a/regress/options-array.sh +++ b/regress/options-array.sh @@ -140,6 +140,24 @@ update-environment[notify] EEE" # sorts by ascending numeric key and keeps the gap at [1]. check_ok set -g status-format "" check_array "-g status-format" "status-format" +out=$($TMUX show -gF \ + '#{option_name}:#{option_has_value}:#{option_value}:#{option_is_array}:#{option_has_array_key}:#{option_array_key}' \ + status-format 2>&1) +[ "$out" = "status-format:0::1:0:" ] || { + echo "show -F empty status-format failed." + echo "Expected: 'status-format:0::1:0:'" + echo "But got: '$out'" + exit 1 +} +out=$($TMUX show -gvF \ + '#{option_name}:#{option_value_only}:#{option_has_value}:#{option_value}' \ + status-format 2>&1) +[ "$out" = "status-format:1:0:" ] || { + echo "show -vF empty status-format failed." + echo "Expected: 'status-format:1:0:'" + echo "But got: '$out'" + exit 1 +} check_ok set -g status-format[5] "five" check_ok set -g status-format[0] "zero" check_ok set -g status-format[2] "two" @@ -154,6 +172,21 @@ status-format[5] five status-format[foo-bar] foo-bar status-format[xterm-256color] xterm status-format[zoom] zoom" +out=$($TMUX show -gF \ + '#{option_name}:#{option_array_key}:#{option_is_array}:#{option_has_value}:#{option_has_array_key}:#{option_value}' \ + status-format 2>&1) +[ "$out" = "$(printf '%s' 'status-format:0:1:1:1:zero +status-format:1:1:1:1:one +status-format:2:1:1:1:two +status-format:5:1:1:1:five +status-format:foo-bar:1:1:1:foo-bar +status-format:xterm-256color:1:1:1:xterm +status-format:zoom:1:1:1:zoom')" ] || { + echo "show -F status-format failed." + echo "Expected formatted array output" + echo "But got:"; printf '%s\n' "$out" + exit 1 +} check_value "-gv status-format[01]" "one" check_ok set -gu status-format[zoom] check_value "-gv status-format[zoom]" "" diff --git a/regress/options-values.sh b/regress/options-values.sh index 75da52e01..be08cc136 100644 --- a/regress/options-values.sh +++ b/regress/options-values.sh @@ -168,6 +168,30 @@ check_ok set -g @str "foo" check_ok set -ga @str "bar" check_value "-gv @str" "foobar" +# --- show -F custom format ------------------------------------------------ +# +# show-options and show-hooks use a format for their output, with the default +# format preserving the traditional output. +check_ok set -g @str "two words" +check_value "-g @str" '@str "two words"' +out=$($TMUX show -gF \ + '#{option_name}=#{option_value}=#{option_is_user}=#{option_is_string}=#{option_value_only}' \ + @str 2>&1) +[ "$out" = "@str=two words=1=1=0" ] || { + echo "show -F @str failed." + echo "Expected: '@str=two words=1=1=0'" + echo "But got: '$out'" + exit 1 +} +out=$($TMUX show -gvF '#{option_name}=#{option_value}=#{option_value_only}' \ + @str 2>&1) +[ "$out" = "@str=two words=1" ] || { + echo "show -vF @str failed." + echo "Expected: '@str=two words=1'" + echo "But got: '$out'" + exit 1 +} + # --- -F expands at set time ----------------------------------------------- # # With -F the value is expanded as a format once, at set time; without -F it is diff --git a/regress/set-hook-B.sh b/regress/set-hook-B.sh index 0226cad00..a6b93ce04 100644 --- a/regress/set-hook-B.sh +++ b/regress/set-hook-B.sh @@ -67,6 +67,12 @@ 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" +shown=$($TMUX show-hooks -g -BF \ + '#{option_name}:#{hook_monitor_target}:#{hook_monitor_format}:#{option_value}:#{option_is_hook}:#{option_is_user}' \ + @session-name) || + fail "show-hooks -BF failed" +[ "$shown" = '@session-name::#{session_name}:@session-name::#{session_name}:1:1' ] || + fail "unexpected show-hooks -BF output: $shown" shown=$($TMUX show-hooks -g) || fail "show-hooks -g failed" echo "$shown" | grep -q '^@session-name ' || @@ -116,6 +122,11 @@ $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" +shown=$($TMUX show-hooks -g -BF \ + '#{option_name}:#{hook_monitor_target}:#{hook_monitor_format}' @pane) || + fail "show-hooks -BF pane failed" +[ "$shown" = "@pane:%$pane_number:#{pane_width}" ] || + fail "unexpected show-hooks -BF pane output: $shown" 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}"' || diff --git a/regress/show-options-output.sh b/regress/show-options-output.sh new file mode 100644 index 000000000..6b36da5d1 --- /dev/null +++ b/regress/show-options-output.sh @@ -0,0 +1,136 @@ +#!/bin/sh + +# Tests of the default output from show-options and show-hooks. This is +# intended to guard the output compatibility when the implementation is changed +# to use formats internally, so it deliberately does not use show -F. + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -LtestA$$ -f/dev/null" +$TMUX kill-server 2>/dev/null + +check_value() +{ + out=$($TMUX show $1 2>&1) + if [ "$out" != "$(printf '%s' "$2")" ]; then + echo "show $1 failed." + echo "Expected:"; printf '%s\n' "$2" + echo "But got:"; printf '%s\n' "$out" + exit 1 + fi +} + +check_hooks() +{ + out=$($TMUX show-hooks $1 2>&1) + if [ "$out" != "$(printf '%s' "$2")" ]; then + echo "show-hooks $1 failed." + echo "Expected:"; printf '%s\n' "$2" + echo "But got:"; printf '%s\n' "$out" + exit 1 + fi +} + +check_ok() +{ + if ! $TMUX "$@"; then + echo "Command failed (expected success): $*" + exit 1 + fi +} + +assert_alive() +{ + if [ "$($TMUX display-message -p alive)" != "alive" ]; then + echo "Server died: $1" + exit 1 + fi +} + +$TMUX new-session -d -s main -x 80 -y 24 || exit 1 + +# Scalar options: strings are escaped, non-strings are not, and -v suppresses +# the option name. +check_ok set -g @words "two words" +check_value "-g @words" '@words "two words"' +check_value "-gv @words" 'two words' +check_ok set -g display-time 1234 +check_value "-g display-time" 'display-time 1234' +check_value "-gv display-time" '1234' + +# Inherited options shown with -A are marked with an asterisk. +check_ok set -g status-left "GLOBAL" +check_ok set -u status-left +out=$($TMUX show -A 2>/dev/null | grep '^status-left\*') +if [ "$out" != "status-left* GLOBAL" ]; then + echo "show -A did not mark inherited status-left." + echo "But got:"; printf '%s\n' "$out" + exit 1 +fi + +# Arrays: an empty array prints just the name unless -v is used; populated +# arrays include every key, including key 0. +check_ok set -g status-format "" +check_value "-g status-format" 'status-format' +check_value "-gv status-format" '' +out=$($TMUX show -A 2>/dev/null | grep '^status-format\*') +if [ "$out" != "status-format*" ]; then + echo "show -A did not mark inherited empty status-format." + echo "But got:"; printf '%s\n' "$out" + exit 1 +fi +check_value "-A status-format" 'status-format' +check_ok set -g update-environment "AAA BBB,CCC" +check_value "-g update-environment" 'update-environment[0] AAA +update-environment[1] BBB +update-environment[2] CCC' +check_value "-gv update-environment[0]" 'AAA' + +# Hooks use the same array output style, and monitor hooks have their own +# default output form. +check_ok set-hook -g window-renamed[first] "display-message renamed" +check_hooks "-g window-renamed" 'window-renamed[first] display-message renamed' +check_ok set-hook -g -B '@monitor:%*:#{pane_width}' +check_hooks "-g -B @monitor" '@monitor:%*:#{pane_width}' +check_ok set-hook -g @user-hook "display-message user" +check_hooks "-g @user-hook" '@user-hook "display-message user"' +out=$($TMUX show -g 2>&1) +echo "$out" | grep -q "^@monitor ''$" && { + echo "show -g showed monitor hook without -H." + echo "But got:"; printf '%s\n' "$out" + exit 1 +} +echo "$out" | grep -q '^@user-hook "display-message user"$' && { + echo "show -g showed user hook without -H." + echo "But got:"; printf '%s\n' "$out" + exit 1 +} +out=$($TMUX show -gH 2>&1) +echo "$out" | grep -q "^@monitor ''$" || { + echo "show -gH did not show monitor hook." + echo "But got:"; printf '%s\n' "$out" + exit 1 +} +echo "$out" | grep -q '^@user-hook "display-message user"$' || { + echo "show -gH did not show user hook." + echo "But got:"; printf '%s\n' "$out" + exit 1 +} +out=$($TMUX show-hooks -g 2>&1) +echo "$out" | grep -q "^@monitor ''$" || { + echo "show-hooks -g did not show monitor hook." + echo "But got:"; printf '%s\n' "$out" + exit 1 +} +echo "$out" | grep -q '^@user-hook "display-message user"$' || { + echo "show-hooks -g did not show user hook." + echo "But got:"; printf '%s\n' "$out" + exit 1 +} + +assert_alive "after show-options output tests" + +$TMUX kill-server 2>/dev/null +exit 0