mirror of
https://github.com/junegunn/fzf.git
synced 2026-07-13 03:50:51 +08:00
f7392a8b63
Prevents another user on a shared TMPDIR from planting a file or a symbolic link at the predictable path while fzf is running, like the exit status file of the floating pane. Reject an empty become command.
88 lines
3.2 KiB
Ruby
88 lines
3.2 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_floating_pane_become
|
|
tmux.send_keys "seq 100 | #{fzf(%(--popup center,80% --margin 0 --bind 'enter:become(echo became-{})'))}", :Enter
|
|
tmux.until { |lines| assert_equal 100, lines.item_count }
|
|
tmux.send_keys :Enter
|
|
assert_equal 'became-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
|