require 'minitest'
require 'minitest/autorun'
require 'ttytest'
class FzyTest < Minitest::Test
FZY_PATH = File.expand_path('../../../fzy', __FILE__)
def setup
# fzy is fast.
# This is never hit in a (passing) test suite, but helps speed up development
TTYtest.default_max_wait_time = 0.2
end
def test_empty_list
@tty = TTYtest.new_terminal(%{echo placeholder;echo -n "" | #{FZY_PATH}})
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '>')
@tty.assert_row(2, '')
@tty.assert_cursor_position(y: 1, x: 2)
@tty.send_keys('t')
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> t')
@tty.assert_row(2, '')
@tty.assert_cursor_position(y: 1, x: 3)
@tty.send_keys('z')
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> tz')
@tty.assert_row(2, '')
@tty.assert_cursor_position(y: 1, x: 4)
@tty.send_keys("\r")
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, 'tz')
@tty.assert_cursor_position(y: 2, x: 0)
end
def test_one_item
@tty = TTYtest.new_terminal(%{echo placeholder;echo -n "test" | #{FZY_PATH}})
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '>')
@tty.assert_row(2, 'test')
@tty.assert_row(3, '')
@tty.assert_cursor_position(y: 1, x: 2)
@tty.send_keys('t')
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> t')
@tty.assert_row(2, 'test')
@tty.assert_row(3, '')
@tty.assert_cursor_position(y: 1, x: 3)
@tty.send_keys('z')
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> tz')
@tty.assert_row(2, '')
@tty.assert_row(3, '')
@tty.assert_cursor_position(y: 1, x: 4)
@tty.send_keys("\r")
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, 'tz')
@tty.assert_cursor_position(y: 2, x: 0)
end
def test_two_items
@tty = TTYtest.new_terminal(%{echo placeholder;echo -n "test\nfoo" | #{FZY_PATH}})
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '>')
@tty.assert_row(2, 'test')
@tty.assert_row(3, 'foo')
@tty.assert_row(4, '')
@tty.assert_cursor_position(y: 1, x: 2)
@tty.send_keys('t')
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> t')
@tty.assert_row(2, 'test')
@tty.assert_row(3, '')
@tty.assert_cursor_position(y: 1, x: 3)
@tty.send_keys('z')
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> tz')
@tty.assert_row(2, '')
@tty.assert_row(3, '')
@tty.assert_cursor_position(y: 1, x: 4)
@tty.send_keys("\r")
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, 'tz')
@tty.assert_cursor_position(y: 2, x: 0)
end
def ctrl(key)
((key.upcase.ord) - ('A'.ord) + 1).chr
end
def test_editing
@tty = TTYtest.new_terminal(%{echo placeholder;echo -n "test\nfoo" | #{FZY_PATH}})
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '>')
@tty.assert_cursor_position(y: 1, x: 2)
@tty.send_keys("foo bar baz")
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> foo bar baz')
@tty.assert_cursor_position(y: 1, x: 13)
@tty.send_keys(ctrl('H'))
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> foo bar ba')
@tty.assert_cursor_position(y: 1, x: 12)
@tty.send_keys(ctrl('W'))
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '> foo bar')
@tty.assert_cursor_position(y: 1, x: 10)
@tty.send_keys(ctrl('U'))
@tty.assert_row(0, 'placeholder')
@tty.assert_row(1, '>')
@tty.assert_cursor_position(y: 1, x: 2)
end
def test_ctrl_d
@tty = TTYtest.new_terminal(%{echo -n "foo\nbar" | #{FZY_PATH}})
@tty.assert_row(0, '>')
@tty.send_keys('foo')
@tty.assert_row(0, '> foo')
@tty.send_keys(ctrl('D'))
@tty.assert_row(0, '')
@tty.assert_row(1, '')
@tty.assert_row(2, '')
@tty.assert_cursor_position(y: 0, x: 0)
end
def test_ctrl_c
@tty = TTYtest.new_terminal(%{echo -n "foo\nbar" | #{FZY_PATH}})
@tty.assert_row(0, '>')
@tty.send_keys('foo')
@tty.assert_row(0, '> foo')
@tty.send_keys(ctrl('C'))
@tty.assert_row(0, '')
@tty.assert_row(1, '')
@tty.assert_row(2, '')
@tty.assert_cursor_position(y: 0, x: 0)
end
end