mirror of
https://github.com/tmux/tmux.git
synced 2026-09-14 09:11:59 +00:00
127 lines
4.4 KiB
Bash
127 lines
4.4 KiB
Bash
#!/bin/sh
|
|
|
|
# Exercise every predefined layout, next/previous cycling, lookup and restore
|
|
# paths, one-pane early returns, minimum-size handling and floating panes.
|
|
|
|
PATH=/bin:/usr/bin
|
|
TERM=screen
|
|
export PATH TERM
|
|
|
|
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
|
|
DIR=$(mktemp -d) || exit 1
|
|
TMUX_TMPDIR=$DIR
|
|
export TMUX_TMPDIR
|
|
TMUX="$TEST_TMUX -Ltest$$ -f/dev/null"
|
|
SEEN="$DIR/layouts"
|
|
|
|
fail()
|
|
{
|
|
echo "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
cleanup()
|
|
{
|
|
$TMUX kill-server 2>/dev/null
|
|
rm -rf "$DIR"
|
|
}
|
|
trap cleanup 0 1 15
|
|
|
|
layout()
|
|
{
|
|
$TMUX display-message -p -t layouts:many '#{window_layout}'
|
|
}
|
|
|
|
check_layout()
|
|
{
|
|
name=$1
|
|
$TMUX select-layout -t layouts:many "$name" ||
|
|
fail "select-layout $name failed"
|
|
value=$(layout)
|
|
[ -n "$value" ] || fail "$name produced an empty layout"
|
|
if grep -Fxq "$value" "$SEEN"; then
|
|
fail "$name produced the same layout as an earlier preset"
|
|
fi
|
|
printf '%s\n' "$value" >>"$SEEN"
|
|
[ "$($TMUX list-panes -t layouts:many -F x | wc -l)" -eq 5 ] ||
|
|
fail "$name lost a pane"
|
|
[ "$($TMUX list-panes -t layouts:many -F '#{pane_floating_flag}' | \
|
|
grep -c '^1$')" -eq 1 ] || fail "$name did not preserve the floating pane"
|
|
}
|
|
|
|
$TMUX new-session -d -s layouts -n many -x100 -y40 'exec sleep 100' || exit 1
|
|
$TMUX set-option -g window-size manual || exit 1
|
|
$TMUX split-window -d -h -t layouts:many 'exec sleep 100' || exit 1
|
|
$TMUX split-window -d -v -t layouts:many 'exec sleep 100' || exit 1
|
|
$TMUX split-window -d -h -t layouts:many 'exec sleep 100' || exit 1
|
|
floating=$($TMUX new-pane -dP -F '#{pane_id}' -t layouts:many \
|
|
-x20 -y8 -X10 -Y5 'exec sleep 100') || exit 1
|
|
: >"$SEEN"
|
|
|
|
# Options exercise percentage and explicit secondary-size calculations.
|
|
$TMUX set-option -w -t layouts:many main-pane-height 30% || exit 1
|
|
$TMUX set-option -w -t layouts:many other-pane-height 12 || exit 1
|
|
$TMUX set-option -w -t layouts:many main-pane-width 35% || exit 1
|
|
$TMUX set-option -w -t layouts:many other-pane-width 20 || exit 1
|
|
|
|
for name in even-horizontal even-vertical main-horizontal \
|
|
main-horizontal-mirrored main-vertical main-vertical-mirrored tiled; do
|
|
check_layout "$name"
|
|
done
|
|
|
|
# Exact and unique-prefix lookup work; ambiguous and invalid names fail.
|
|
$TMUX select-layout -t layouts:many even-h || fail "unique layout prefix failed"
|
|
$TMUX select-layout -t layouts:many main >/dev/null 2>&1 &&
|
|
fail "ambiguous layout prefix succeeded"
|
|
$TMUX select-layout -t layouts:many no-such-layout >/dev/null 2>&1 &&
|
|
fail "invalid layout name succeeded"
|
|
|
|
# Cycle through all layouts in both directions, including wraparound. The
|
|
# aliases and select-layout flags share layout_set_next/previous.
|
|
first=$(layout)
|
|
i=0
|
|
while [ "$i" -lt 7 ]; do
|
|
$TMUX next-layout -t layouts:many || exit 1
|
|
i=$((i + 1))
|
|
done
|
|
[ "$(layout)" = "$first" ] || fail "next-layout did not wrap"
|
|
i=0
|
|
while [ "$i" -lt 7 ]; do
|
|
$TMUX previous-layout -t layouts:many || exit 1
|
|
i=$((i + 1))
|
|
done
|
|
[ "$(layout)" = "$first" ] || fail "previous-layout did not wrap"
|
|
$TMUX select-layout -t layouts:many -n || exit 1
|
|
$TMUX select-layout -t layouts:many -p || exit 1
|
|
|
|
# No argument reapplies the last preset; -o restores the previous layout; -E
|
|
# spreads the current cell without changing the pane set.
|
|
$TMUX kill-pane -t "$floating" || exit 1
|
|
$TMUX select-layout -t layouts:many tiled || exit 1
|
|
tiled=$(layout)
|
|
$TMUX select-layout -t layouts:many even-horizontal || exit 1
|
|
$TMUX select-layout -t layouts:many -o || exit 1
|
|
[ "$(layout)" = "$tiled" ] || fail "select-layout -o did not restore layout"
|
|
$TMUX select-layout -t layouts:many || exit 1
|
|
$TMUX select-layout -t layouts:many -E || exit 1
|
|
|
|
# Each arranger has a deliberate one-pane early return.
|
|
$TMUX new-window -d -t layouts: -n one 'exec sleep 100' || exit 1
|
|
one=$($TMUX display-message -p -t layouts:one '#{window_layout}')
|
|
for name in even-horizontal even-vertical main-horizontal \
|
|
main-horizontal-mirrored main-vertical main-vertical-mirrored tiled; do
|
|
$TMUX select-layout -t layouts:one "$name" || exit 1
|
|
[ "$($TMUX display-message -p -t layouts:one '#{window_layout}')" = "$one" ] ||
|
|
fail "$name changed a one-pane layout"
|
|
done
|
|
|
|
# Force the minimum-size paths without requiring a terminal client.
|
|
$TMUX resize-window -t layouts:many -x10 -y6 || exit 1
|
|
for name in even-horizontal even-vertical main-horizontal \
|
|
main-horizontal-mirrored main-vertical main-vertical-mirrored tiled; do
|
|
$TMUX select-layout -t layouts:many "$name" || exit 1
|
|
done
|
|
|
|
$TMUX has-session -t layouts || fail "server died during layout tests"
|
|
exit 0
|