| #!/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, an empty string if the command |
| # is new, or a placeholder after a few seconds. 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 empty. |
| test_format "#{?pane_in_mode,#(echo #,),xyz}" "xyz" |
| test_conditional_with_pane_in_mode "#{?pane_in_mode,#(echo #,),xyz}" "" "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 |