mirror of
https://github.com/tmux/tmux.git
synced 2024-12-04 19:58:48 +00:00
Add format string test, from "sadie-parayno" in GitHub issue 1358.
This commit is contained in:
parent
7448b38327
commit
8f8e0975f1
183
regress/format-strings.sh
Normal file
183
regress/format-strings.sh
Normal file
@ -0,0 +1,183 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Tests of formats as described in tmux(1) FORMATS
|
||||
|
||||
PATH=/bin:/usr/bin
|
||||
TERM=screen
|
||||
|
||||
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
|
||||
TMUX="$TEST_TMUX -Ltest"
|
||||
|
||||
# test_format $format $expected_result
|
||||
test_format()
|
||||
{
|
||||
fmt="$1"
|
||||
exp="$2"
|
||||
|
||||
out=$($TMUX display-message -p "$fmt")
|
||||
|
||||
if [ "$out" != "$exp" ]; then
|
||||
echo "Format test failed for '$fmt'."
|
||||
echo "Expected: '$exp'"
|
||||
echo "But got '$out'"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# test_conditional_with_pane_in_mode $format $exp1 $exp2
|
||||
#
|
||||
# Tests the format string $format to yield $exp1 if #{pane_in_mode} is true and
|
||||
# $exp2 when #{pane_in_mode} is false.
|
||||
test_conditional_with_pane_in_mode()
|
||||
{
|
||||
fmt="$1"
|
||||
exp_true="$2"
|
||||
exp_false="$3"
|
||||
|
||||
$TMUX copy-mode # enter copy mode
|
||||
test_format "$fmt" "$exp_true"
|
||||
$TMUX send-keys -X cancel # leave copy mode
|
||||
test_format "$fmt" "$exp_false"
|
||||
}
|
||||
|
||||
# test_conditional_with_session_name #format $exp_summer $exp_winter
|
||||
#
|
||||
# Tests the format string $format to yield $exp_summer if the session name is
|
||||
# 'Summer' and $exp_winter if the session name is 'Winter'.
|
||||
test_conditional_with_session_name()
|
||||
{
|
||||
fmt="$1"
|
||||
exp_summer="$2"
|
||||
exp_winter="$3"
|
||||
|
||||
$TMUX rename-session "Summer"
|
||||
test_format "$fmt" "$exp_summer"
|
||||
$TMUX rename-session "Winter"
|
||||
test_format "$fmt" "$exp_winter"
|
||||
$TMUX rename-session "Summer" # restore default
|
||||
}
|
||||
|
||||
|
||||
$TMUX kill-server 2>/dev/null
|
||||
$TMUX -f/dev/null new-session -d || exit 1
|
||||
$TMUX rename-session "Summer" || exit 1 # used later in conditionals
|
||||
|
||||
# Plain string without substitutions et al
|
||||
test_format "abc xyz" "abc xyz"
|
||||
|
||||
# Test basic escapes for "#", "{", "#{" "}", "#}", ","
|
||||
test_format "##" "#"
|
||||
test_format "#," ","
|
||||
test_format "{" "{"
|
||||
test_format "##{" "#{"
|
||||
test_format "#}" "}"
|
||||
test_format "###}" "#}" # not a "basic" one but interesting nevertheless
|
||||
|
||||
# Simple expansion
|
||||
test_format "#{pane_in_mode}" "0"
|
||||
|
||||
# Simple conditionals
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,xyz}" "abc" "xyz"
|
||||
|
||||
# Expansion in conditionals
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#{session_name},xyz}" "Summer" "xyz"
|
||||
|
||||
# Basic escapes in conditionals
|
||||
# First argument
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,##,xyz}" "#" "xyz"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#,,xyz}" "," "xyz"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,{,xyz}" "{" "xyz"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,##{,xyz}" "#{" "xyz"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#},xyz}" "}" "xyz"
|
||||
# not a "basic" one but interesting nevertheless
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,###},xyz}" "#}" "xyz"
|
||||
# Second argument
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,##}" "abc" "#"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,#,}" "abc" ","
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,{}" "abc" "{"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,##{}" "abc" "#{"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,#}}" "abc" "}"
|
||||
# not a "basic" one but interesting nevertheless
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,###}}" "abc" "#}"
|
||||
# mixed
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,{,#}}" "{" "}"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#},{}" "}" "{"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,##{,###}}" "#{" "#}"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,###},##{}" "#}" "#{"
|
||||
|
||||
# Conditionals split on the second comma (this is not documented)
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,xyz,bonus}" "abc" "xyz,bonus"
|
||||
|
||||
# Curly brackets {...} do not capture a comma inside of conditionals as the
|
||||
# conditional ends on the first '}'
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,{abc,xyz},bonus}" "{abc,bonus}" "xyz,bonus}"
|
||||
|
||||
# Substitutions '#{...}' capture the comma
|
||||
# invalid format: #{abc,xyz} is not a known variable name.
|
||||
#test_conditional_with_pane_in_mode "#{?pane_in_mode,#{abc,xyz},bonus}" "" "bonus"
|
||||
|
||||
# Parenthesis (...) do not captura a comma
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,(abc,xyz),bonus}" "(abc" "xyz),bonus"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,(abc#,xyz),bonus}" "(abc,xyz)" "bonus"
|
||||
|
||||
# Brackets [...] do not captura a comma
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,[abc,xyz],bonus}" "[abc" "xyz],bonus"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,[abc#,xyz],bonus}" "[abc,xyz]" "bonus"
|
||||
|
||||
|
||||
# Escape comma inside of #(...)
|
||||
# Note: #() commands are run asynchronous and are substituted with result of the
|
||||
# *previous* run or a placeholder (like "<'echo ,' not ready") if the command
|
||||
# has not been run before. The format is updated as soon as the command
|
||||
# finishes. As we are printing the message only once it never gets updated
|
||||
# and the displayed message is "<'echo ,' not ready>"
|
||||
test_format "#{?pane_in_mode,#(echo #,),xyz}" "xyz"
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#(echo #,),xyz}" "<'echo ,' not ready>" "xyz"
|
||||
# This caching does not work :-(
|
||||
#$TMUX display-message -p "#(echo #,)" > /dev/null
|
||||
#test_conditional_with_pane_in_mode "#{?pane_in_mode,#(echo #,),xyz}" "," "xyz"
|
||||
#test_conditional_with_pane_in_mode "#{?pane_in_mode,#(echo #,),xyz}" "," "xyz"
|
||||
|
||||
# invalid format: '#(' is not closed in the first argument of #{?,,}.
|
||||
#test_conditional_with_pane_in_mode "#{?pane_in_mode,#(echo ,),xyz}" "" "),xyz"
|
||||
|
||||
# Escape comma inside of #[...]
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#[fg=default#,bg=default]abc,xyz}" "#[fg=default,bg=default]abc" "xyz"
|
||||
# invalid format: '#[' is not closed in the first argument of #{?,,}
|
||||
#test_conditional_with_pane_in_mode "#{?pane_in_mode,#[fg=default,bg=default]abc,xyz}" "" "bg=default]abc,xyz"
|
||||
|
||||
# Conditionals with comparison
|
||||
test_conditional_with_session_name "#{?#{==:#{session_name},Summer},abc,xyz}" "abc" "xyz"
|
||||
# Conditionals with comparison and escaped commas
|
||||
$TMUX rename-session ","
|
||||
test_format "#{?#{==:#,,#{session_name}},abc,xyz}" "abc"
|
||||
$TMUX rename-session "Summer" # reset to default
|
||||
|
||||
# Conditional in conditional
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,#{?#{==:#{session_name},Summer},ABC,XYZ},xyz}" "ABC" "xyz"
|
||||
test_conditional_with_session_name "#{?pane_in_mode,#{?#{==:#{session_name},Summer},ABC,XYZ},xyz}" "xyz" "xyz"
|
||||
|
||||
test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,#{?#{==:#{session_name},Summer},ABC,XYZ}}" "abc" "ABC"
|
||||
test_conditional_with_session_name "#{?pane_in_mode,abc,#{?#{==:#{session_name},Summer},ABC,XYZ}}" "ABC" "XYZ"
|
||||
|
||||
# Some fancy stackings
|
||||
test_conditional_with_pane_in_mode "#{?#{==:#{?pane_in_mode,#{session_name},#(echo Spring)},Summer},abc,xyz}" "abc" "xyz"
|
||||
|
||||
|
||||
|
||||
# Format test for the literal option
|
||||
# Note: The behavior for #{l:...} with escapes is sometimes weird as #{l:...}
|
||||
# respects the escapes.
|
||||
test_format "#{l:#{}}" "#{}"
|
||||
test_format "#{l:#{pane_in_mode}}" "#{pane_in_mode}"
|
||||
test_format "#{l:#{?pane_in_mode,#{?#{==:#{session_name},Summer},ABC,XYZ},xyz}}" "#{?pane_in_mode,#{?#{==:#{session_name},Summer},ABC,XYZ},xyz}"
|
||||
|
||||
# With escapes (which escape but are returned literally)
|
||||
test_format "#{l:##{}" "##{"
|
||||
test_format "#{l:#{#}}}" "#{#}}"
|
||||
|
||||
# Invalid formats:
|
||||
#test_format "#{l:#{}" ""
|
||||
#test_format "#{l:#{#}}" ""
|
||||
|
||||
exit 0
|
Loading…
Reference in New Issue
Block a user