#!/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 # used later in conditionals $TMUX rename-session "Summer" || exit 1 $TMUX set @true 1 || exit 1 $TMUX set @false 0 || exit 1 $TMUX set @warm Summer || exit 1 $TMUX set @cold Winter || exit 1 # 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_format "#{?}" "" test_format "#{?abc}" "abc" test_conditional_with_pane_in_mode "#{?pane_in_mode,abc}" "abc" "" test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,xyz}" "abc" "xyz" test_conditional_with_pane_in_mode "#{?pane_in_mode,abc,@true,xyz}" "abc" "xyz" test_format "#{?@false,abc,@false,xyz}" "" test_format "#{?@false,abc,@false,xyz,default}" "default" # Expansion in conditionals test_format "#{?#{@warm}}" "Summer" test_conditional_with_pane_in_mode "#{?#{pane_in_mode},#{@warm}}" "Summer" "" test_conditional_with_pane_in_mode "#{?#{pane_in_mode},#{@warm},#{@cold}}" "Summer" "Winter" # Basic escapes in conditionals # Value of an (else-)if-condition 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" # Default value if no condition matches 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,###},##{}" "#}" "#{" # 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, and "xyz)" is a false condition test_conditional_with_pane_in_mode "#{?pane_in_mode,(abc,xyz),bonus}" "(abc" "" test_conditional_with_pane_in_mode "#{?pane_in_mode,(abc#,xyz),bonus}" "(abc,xyz)" "bonus" # Brackets [...] do not captura a comma, and "xyz]" is a false condition test_conditional_with_pane_in_mode "#{?pane_in_mode,[abc,xyz],bonus}" "[abc" "" 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 style: '#[' is not closed in the first argument of #{?,,} test_conditional_with_pane_in_mode "#{?pane_in_mode,#[fg=default,bg=default]abc}" "#[fg=default" "bg=default]abc" # 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" # Tests for boolean expressions # "0" and the empty string are false, everything else is true. test_format "#{!!:0}" "0" test_format "#{!!:}" "0" test_format "#{!!:1}" "1" test_format "#{!!:2}" "1" test_format "#{!!:non-empty string}" "1" test_format "#{!!:-0}" "1" test_format "#{!!:0.0}" "1" # Logical operators test_format "#{!:0}" "1" test_format "#{!:1}" "0" test_format "#{&&:0}" "0" test_format "#{&&:1}" "1" test_format "#{&&:0,0}" "0" test_format "#{&&:0,1}" "0" test_format "#{&&:1,0}" "0" test_format "#{&&:1,1}" "1" test_format "#{&&:0,0,0}" "0" test_format "#{&&:0,1,1}" "0" test_format "#{&&:1,0,1}" "0" test_format "#{&&:1,1,0}" "0" test_format "#{&&:1,1,1}" "1" test_format "#{||:0}" "0" test_format "#{||:1}" "1" test_format "#{||:0,0}" "0" test_format "#{||:0,1}" "1" test_format "#{||:1,0}" "1" test_format "#{||:1,1}" "1" test_format "#{||:0,0,0}" "0" test_format "#{||:1,0,0}" "1" test_format "#{||:0,1,0}" "1" test_format "#{||:0,0,1}" "1" test_format "#{||:1,1,1}" "1" # 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