mirror of
https://github.com/junegunn/fzf.git
synced 2026-07-10 10:36:28 +08:00
81 lines
3.0 KiB
Ruby
81 lines
3.0 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'shellwords'
|
|
require 'tmpdir'
|
|
require_relative 'lib/common'
|
|
|
|
# Tests for running fzf in a tmux floating pane (--popup on tmux 3.7 or above)
|
|
class TestTmux < TestInteractive
|
|
def setup
|
|
super
|
|
# Cannot rely on the exit status; tmux versions before 3.7 exit
|
|
# normally with empty output for an unknown command name
|
|
supported = IO.popen(%w[tmux list-commands new-pane], err: File::NULL, &:read).include?('new-pane')
|
|
skip('floating panes not supported') unless supported
|
|
end
|
|
|
|
def test_floating_pane
|
|
tmux.send_keys "seq 100 | #{fzf('--popup center,80% --margin 0')}", :Enter
|
|
tmux.until { |lines| assert_equal 100, lines.item_count }
|
|
# Border text is cleared when no label is given
|
|
format = IO.popen(['tmux', 'show-options', '-p', '-t', floating_pane, 'pane-border-format'], &:read)
|
|
assert_includes format, "''"
|
|
tmux.send_keys '99'
|
|
tmux.until { |lines| assert_equal 1, lines.match_count }
|
|
tmux.send_keys :Enter
|
|
assert_equal '99', fzf_output
|
|
end
|
|
|
|
def test_floating_pane_killed
|
|
tmux.send_keys "seq 100 | #{FZF} --popup bottom,50% --margin 0; echo code:$?", :Enter
|
|
tmux.until { |lines| assert_equal 100, lines.item_count }
|
|
pane = floating_pane
|
|
refute_nil pane
|
|
assert system('tmux', 'kill-pane', '-t', pane)
|
|
tmux.until { |lines| assert lines.any_include?('code:130') }
|
|
end
|
|
|
|
def test_floating_pane_border_label
|
|
tmux.send_keys "seq 100 | #{fzf(%(--popup center,80% --margin 0 --border-label ' #fzf-label 100% '))}", :Enter
|
|
tmux.until { |lines| assert_equal 100, lines.item_count }
|
|
pane = floating_pane
|
|
refute_nil pane
|
|
title = IO.popen(['tmux', 'display-message', '-p', '-t', pane, "\#{pane_title}"], &:read)
|
|
assert_equal ' #fzf-label 100% ', title.chomp
|
|
format = IO.popen(['tmux', 'show-options', '-p', '-t', pane, 'pane-border-format'], &:read)
|
|
assert_includes format, "\#{pane_title}"
|
|
tmux.send_keys :Enter
|
|
assert_equal '1', fzf_output
|
|
end
|
|
|
|
def test_explicit_border_falls_back_to_popup
|
|
# display-popup requires an attached client, which the test environment
|
|
# may not have; intercept it with a tmux shim on PATH
|
|
dir = Dir.mktmpdir
|
|
real = `command -v tmux`.chomp
|
|
shim = File.join(dir, 'tmux')
|
|
File.write(shim, <<~SH)
|
|
#!/bin/sh
|
|
if [ "$1" = display-popup ]; then
|
|
echo popup-used >&2
|
|
exit 0
|
|
fi
|
|
exec #{real.shellescape} "$@"
|
|
SH
|
|
FileUtils.chmod(0o755, shim)
|
|
tmux.send_keys "seq 100 | PATH=#{dir.shellescape}:$PATH #{FZF} --popup center --border rounded", :Enter
|
|
tmux.until { |lines| assert lines.any_include?('popup-used') }
|
|
refute floating_pane
|
|
ensure
|
|
FileUtils.remove_entry(dir) if dir
|
|
end
|
|
|
|
private
|
|
|
|
def floating_pane
|
|
format = "\#{pane_id} \#{pane_floating_flag}"
|
|
lines = IO.popen(['tmux', 'list-panes', '-t', tmux.win, '-F', format]) { |io| io.readlines(chomp: true) }
|
|
lines.filter_map { |line| line.split.first if line.end_with?(' 1') }.first
|
|
end
|
|
end
|