From 12f8dddc7ca6f988a3c2ae7813154f280f0e8ca8 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 12 Oct 2026 10:37:25 +0100 Subject: [PATCH] =?UTF-8?q?Tests=20for=205730=20from=20Joan=20Fabr=C3=A9ga?= =?UTF-8?q?t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- regress/input-combine-width.sh | 88 ++++++++++++++++++++++++++++ regress/tty-keys-backtab.sh | 101 +++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+) create mode 100644 regress/input-combine-width.sh create mode 100644 regress/tty-keys-backtab.sh diff --git a/regress/input-combine-width.sh b/regress/input-combine-width.sh new file mode 100644 index 000000000..4584d6b71 --- /dev/null +++ b/regress/input-combine-width.sh @@ -0,0 +1,88 @@ +#!/bin/sh + +. ./input-common.inc + +# Exercise expansion by VS16, a skin tone modifier and a regional indicator. +for kind in variation modifier flag; do + case "$kind" in + variation) + combine_seq='\342\234\224\357\270\217' + text='✔️' + ;; + modifier) + combine_seq='\342\230\235\360\237\217\273' + text='☝🏻' + ;; + flag) + combine_seq='\360\237\207\254\360\237\207\247' + text='🇬🇧' + ;; + esac + + start_pane "$kind-overwrite" 10 3 "A\347\225\214BC\r${combine_seq}X" + check_capture "$kind-overwrite" "${text}XBC" + check_cursor "$kind-overwrite" '3,0' + check_raw_matches "$kind-overwrite" \ + "C 0,0 data=\(2,[0-9]+,$text\) flags=NONE\[0\]" \ + 'C 0,1 .*flags=PADDING\[[0-9a-f]+\]' \ + 'C 0,2 data=\(1,1,X\) flags=NONE\[0\]' + + start_pane "$kind-edge" 5 3 "abcd${combine_seq}X" + check_capture "$kind-edge" "abcd +${text}X" + check_cursor "$kind-edge" '3,1' + check_raw_matches "$kind-edge" \ + 'L 0 \(0\) flags=.*WRAPPED' \ + 'C 0,4 data=\(1,1, \)' \ + "C 1,0 data=\(2,[0-9]+,$text\) flags=NONE\[0\]" \ + 'C 1,1 .*flags=PADDING\[[0-9a-f]+\]' \ + 'C 1,2 data=\(1,1,X\) flags=NONE\[0\]' + + start_pane "$kind-fit" 5 3 "abc${combine_seq}X" + check_capture "$kind-fit" "abc${text} +X" + check_cursor "$kind-fit" '1,1' + + start_pane "$kind-scroll" 5 2 "11111\r\nabcd${combine_seq}X" + check_capture "$kind-scroll" "abcd +${text}X" + check_cursor "$kind-scroll" '3,1' + + start_pane "$kind-region" 5 4 \ + "top\033[2;1Hold\033[4;1Hend\033[2;3r\033[3;1Habcd${combine_seq}X" + check_capture "$kind-region" "top +abcd +${text}X +end" + check_cursor "$kind-region" '3,2' + + start_pane "$kind-insert" 10 3 "ABCDE\r\033[4h${combine_seq}X" + check_capture "$kind-insert" "${text}XABCDE" + check_cursor "$kind-insert" '3,0' + + start_pane "$kind-insert-edge" 5 3 \ + "\033[2;1HABCDE\033[1;1Habcd\033[4h${combine_seq}X" + check_capture "$kind-insert-edge" "abcd +${text}XAB" + check_cursor "$kind-insert-edge" '3,1' + + start_pane "$kind-nowrap" 5 3 "\033[?7labc${combine_seq}" + check_capture "$kind-nowrap" "abc${text}" + check_cursor "$kind-nowrap" '4,0' + check_raw_matches "$kind-nowrap" \ + "C 0,3 data=\(2,[0-9]+,$text\) flags=NONE\[0\]" \ + 'C 0,4 .*flags=PADDING\[[0-9a-f]+\]' +done + +# A two-column cluster cannot fit in a one-column pane. Keep its narrow base. +start_pane one-column 1 3 '\342\234\224\357\270\217' +check_capture one-column '✔' +check_cursor one-column '1,0' +check_raw_no_matches one-column 'data=\(2,' + +# Without wrapping, even a wide cell filling the pane leaves the cursor inside. +start_pane two-columns-nowrap 2 3 '\033[?7l\342\234\224\357\270\217' +check_capture two-columns-nowrap '✔️' +check_cursor two-columns-nowrap '1,0' + +exit $exit_status diff --git a/regress/tty-keys-backtab.sh b/regress/tty-keys-backtab.sh new file mode 100644 index 000000000..b0d447533 --- /dev/null +++ b/regress/tty-keys-backtab.sh @@ -0,0 +1,101 @@ +#!/bin/sh + +# Extended Shift+Tab must remain BackTab when the pane does not request +# modifyOtherKeys=2, including when the input carries implied Meta. + +PATH=/bin:/usr/bin +TERM=screen +export PATH TERM + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +INNER="$TEST_TMUX -LtestI$$ -f/dev/null" +OUTER="$TEST_TMUX -LtestO$$ -f/dev/null" + +fail() +{ + echo "$*" >&2 + exit 1 +} + +cleanup() +{ + $OUTER kill-server 2>/dev/null + $INNER kill-server 2>/dev/null +} +trap cleanup 0 +trap 'exit 1' 1 2 15 + +$INNER new-session -d -s inner -x80 -y24 \ + 'stty raw -echo; exec cat -tv' || exit 1 +$INNER set-option -g status off || exit 1 +$INNER set-option -g assume-paste-time 0 || exit 1 +$INNER set-option -s extended-keys on || exit 1 +$INNER set-option -s escape-time 1000 || exit 1 +$INNER unbind-key -a -T root || exit 1 +$OUTER new-session -d -s outer -x80 -y24 "$INNER attach -t inner" || + exit 1 +$OUTER set-option -g assume-paste-time 0 || exit 1 + +i=0 +while [ -z "$($INNER list-clients -F '#{client_name}')" ]; do + [ "$i" -lt 100 ] || fail 'inner client did not attach' + sleep 0.05 + i=$((i + 1)) +done + +expected_output= + +assert_key() +{ + name=$1 + expected_output=$expected_output$2 + bytes=$(printf '%s' "$3" | od -An -v -tx1) + $OUTER send-keys -H $bytes || exit 1 + i=0 + while [ "$i" -lt 100 ]; do + actual=$($INNER capture-pane -p | tr -d '\n') + [ "$actual" = "$expected_output" ] && return 0 + sleep 0.05 + i=$((i + 1)) + done + fail "$name: got '$actual', expected '$expected_output'" +} + +pane_state='#{pane_key_mode}:#{pane_current_command}' +for mode in 0 1 2; do + for format in xterm csi-u; do + $INNER new-window \ + "printf '\033[>4;${mode}m'; stty raw -echo; exec cat -tv" || + exit 1 + key_mode="Ext $mode" + [ "$mode" -eq 0 ] && key_mode=VT10x + i=0 + while [ "$($INNER display-message -p "$pane_state")" != \ + "$key_mode:cat" ]; do + [ "$i" -lt 100 ] || fail "pane did not enter mode $mode" + sleep 0.05 + i=$((i + 1)) + done + $INNER set-option -s extended-keys-format "$format" || exit 1 + expected_output= + # Every modifier combination containing Shift. + for modifier in 2 4 6 8; do + if [ "$mode" -eq 2 ]; then + if [ "$format" = xterm ]; then + expected="^[[27;${modifier};9~" + else + expected="^[[9;${modifier}u" + fi + else + expected='^[[Z' + fi + case_name="mode $mode, $format, modifier $modifier" + assert_key "$case_name, CSI u input" "$expected" \ + "$(printf '\033[9;%su' "$modifier")" + assert_key "$case_name, xterm input" "$expected" \ + "$(printf '\033[27;%s;9~' "$modifier")" + done + done +done + +exit 0