Files
tmux/regress/screen-redraw-menus.sh
Nicholas Marriott e54785ddd6 Add menu tests.
2026-07-14 22:09:52 +01:00

134 lines
3.2 KiB
Bash

#!/bin/sh
# Exercise drawing of window menus in the screen-redraw.c scene. Menus are
# window-owned and drawn as REDRAW_MENU spans over panes. Captures use -e so
# menu-style, menu-selected-style, and menu-border-style are included.
#
# Run with GENERATE=1 to (re)create the golden files.
PATH=/bin:/usr/bin
TERM=screen
LC_ALL=C.UTF-8
export TERM LC_ALL
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
TMUX=
TMUX2=
SETUP=0
RESULTS=screen-redraw-results
TMP=$(mktemp)
TMP2=$(mktemp)
cleanup() {
rm -f "$TMP" "$TMP2"
[ -n "$TMUX" ] && $TMUX kill-server 2>/dev/null
[ -n "$TMUX2" ] && $TMUX2 kill-server 2>/dev/null
}
trap cleanup 0 1 15
fail() {
echo "$*" >&2
exit 1
}
trim() {
awk '
{ lines[NR] = $0 }
END {
n = NR
while (n > 0 && lines[n] == "")
n--
for (i = 1; i <= n; i++)
print lines[i]
}
' "$TMP" >"$TMP2" || exit 1
mv "$TMP2" "$TMP" || exit 1
}
compare() {
sleep 1
$TMUX capturep -pe >$TMP || exit 1
trim
if [ -n "$GENERATE" ]; then
cp $TMP "$RESULTS/$1.result" || exit 1
echo "generated $1"
else
cmp -s $TMP "$RESULTS/$1.result" || \
fail "scene $1 differs from $RESULTS/$1.result"
fi
}
C="sh -c 'i=0; while [ \$i -lt 13 ]; do printf \"MENU%02d abcdefghij\n\" \$i; i=\$((i + 1)); done; exec sleep 100'"
setup() {
[ -n "$TMUX" ] && $TMUX kill-server 2>/dev/null
[ -n "$TMUX2" ] && $TMUX2 kill-server 2>/dev/null
SETUP=$((SETUP + 1))
TMUX="$TEST_TMUX -LtestA$$-$SETUP -f/dev/null"
TMUX2="$TEST_TMUX -LtestB$$-$SETUP -f/dev/null"
$TMUX2 new -d -x"$1" -y"$2" "$C" || exit 1
$TMUX2 set -g status off || exit 1
$TMUX2 set -g window-size manual || exit 1
$TMUX2 resizew -x"$1" -y"$2" || exit 1
$TMUX2 setw menu-style "fg=colour250,bg=colour235" || exit 1
$TMUX2 setw menu-selected-style "fg=colour16,bg=colour220" || exit 1
$TMUX2 setw menu-border-style "fg=colour45,bg=colour235" || exit 1
$TMUX new -d -x"$1" -y"$2" || exit 1
$TMUX set -g status off || exit 1
$TMUX set -g window-size manual || exit 1
$TMUX set -g default-terminal "tmux-256color" || exit 1
$TMUX send -l "$TMUX2 attach" || exit 1
$TMUX send Enter || exit 1
sleep 1
}
menu() {
$TMUX2 display-menu -T "Menu" -C 1 "$@" \
"Alpha item" a "" \
"Beta item" b "" \
"" "" "" \
"Gamma item" g "" || exit 1
sleep 1
}
# Basic menu over a single pane.
setup 40 14
menu -x6 -y8
compare menu-basic
# Menu over a split: drawn on top of the pane border.
setup 40 14
$TMUX2 splitw -h "$C" || exit 1
menu -x8 -y9
compare menu-over-split
# Menu with no border lines.
setup 40 14
menu -b none -x6 -y8
compare menu-noborder
# Menu with double border lines.
setup 40 14
menu -b double -x6 -y8
compare menu-double
# Window menu styles are re-expanded from window options when redrawn.
setup 40 14
menu -x6 -y8
$TMUX2 setw menu-style "fg=colour196,bg=colour22" || exit 1
$TMUX2 setw menu-selected-style "fg=colour231,bg=colour88" || exit 1
$TMUX2 setw menu-border-style "fg=colour51,bg=colour22" || exit 1
$TMUX2 refresh-client -S || exit 1
compare menu-restyled
# Menu wider than the window: it should be accepted and clipped by the scene.
setup 12 6
$TMUX2 display-menu -T "Menu" -C 0 -x0 -y5 \
"This item is much wider than the window" t "" \
"Second item is also too wide" s "" || exit 1
compare menu-clipped
exit 0