Files
tmux/regress/screen-redraw-scrollbars.sh
Nicholas Marriott 43f2ecb030 More tests.
2026-06-19 18:03:52 +01:00

143 lines
5.1 KiB
Bash

#!/bin/sh
# Exercise screen-redraw.c drawing of pane scrollbars: position (right/left),
# width, and pad (which is handled separately from width). Scrollbars are drawn
# as styled (coloured) cells rather than glyphs, so these scenes are captured
# with escape sequences (-e); without that the scrollbar is invisible.
#
# Each scene is rendered in an inner tmux attached inside an outer tmux pane.
# The outer pane is captured and compared with a golden in screen_redraw_results/.
#
# 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="$TEST_TMUX -Ltest -f/dev/null"
TMUX2="$TEST_TMUX -Ltest2 -f/dev/null"
RESULTS=screen-redraw-results
TMP=$(mktemp)
trap "rm -f $TMP; $TMUX kill-server 2>/dev/null; $TMUX2 kill-server 2>/dev/null" \
0 1 15
fail() {
echo "$*" >&2
exit 1
}
# compare <name>: capture the outer pane with escapes and compare (or generate).
compare() {
sleep 1
$TMUX capturep -pe >$TMP || exit 1
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
}
# new_scene: fresh inner window, single full-size pane.
new_scene() {
$TMUX2 neww -d "sh -c 'printf base; exec sleep 100'" || exit 1
$TMUX2 selectw -t:\$ || exit 1
$TMUX2 resizew -x40 -y12 || exit 1
}
$TMUX kill-server 2>/dev/null
$TMUX2 kill-server 2>/dev/null
$TMUX2 new -d -x40 -y12 "sh -c 'printf base; exec sleep 100'" || exit 1
$TMUX2 set -g status off || exit 1
$TMUX2 set -g window-size manual || exit 1
$TMUX2 set -g pane-scrollbars on || exit 1
$TMUX new -d -x40 -y12 || 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
# Right, width 1, no pad.
new_scene
$TMUX2 setw pane-scrollbars-position right || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1
compare scrollbar-right-w1
# Left, width 1, no pad.
new_scene
$TMUX2 setw pane-scrollbars-position left || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1
compare scrollbar-left-w1
# Right, width 2, no pad.
new_scene
$TMUX2 setw pane-scrollbars-position right || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=2,pad=0" || exit 1
compare scrollbar-right-w2
# Right, width 1, pad 1. The pad is drawn between the pane content and the
# scrollbar; for a right scrollbar that pad cell is at the right edge, so capture
# trims it and this matches scrollbar-right-w1. The golden still pins that
# behaviour (and the pad draw path runs); the left scene below shows pad visibly.
new_scene
$TMUX2 setw pane-scrollbars-position right || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=1" || exit 1
compare scrollbar-right-pad
# Left, width 1, pad 1: the pad cell sits between the slider and the content, so
# it is visible (one extra column before the pane content).
new_scene
$TMUX2 setw pane-scrollbars-position left || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=1" || exit 1
compare scrollbar-left-pad
# Floating pane with a scrollbar.
new_scene
$TMUX2 setw pane-scrollbars-position right || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1
$TMUX2 new-pane -x20 -y6 -X8 -Y3 "sh -c 'printf FLOAT; exec sleep 100'" || exit 1
compare scrollbar-floating
# Two tiled panes side by side, each with a right scrollbar. The left pane's
# scrollbar sits between its content and the shared border, so the border is
# extended outward over the scrollbar gap (the right += sb_w path in
# redraw_mark_pane_borders) and must still join cleanly. The right pane's
# scrollbar abuts the window edge.
new_scene
$TMUX2 setw pane-scrollbars-position right || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1
$TMUX2 splitw -h "sh -c 'printf base; exec sleep 100'" || exit 1
$TMUX2 selectp -t0 || exit 1
compare scrollbar-split-right
# Same split with the scrollbars on the left: the right pane's scrollbar now sits
# between the shared border and its content (the left -= sb_w path).
new_scene
$TMUX2 setw pane-scrollbars-position left || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1
$TMUX2 splitw -h "sh -c 'printf base; exec sleep 100'" || exit 1
$TMUX2 selectp -t0 || exit 1
compare scrollbar-split-left
# Scrollbar slider in copy mode: with scrollback the slider is shorter than the
# track, so this exercises the slider geometry (which only runs when the pane is
# in a mode). copy-mode -H hides the position indicator, which is not stable.
$TMUX2 neww -d "sh -c 'seq 40; exec sleep 100'" || exit 1
$TMUX2 selectw -t:\$ || exit 1
$TMUX2 resizew -x40 -y12 || exit 1
$TMUX2 setw pane-scrollbars-position right || exit 1
$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1
$TMUX2 copy-mode -H || exit 1
$TMUX2 send -X history-top || exit 1
compare scrollbar-copy-mode -e
exit 0