aboutsummaryrefslogtreecommitdiff
path: root/test/functional/terminal/tui_spec.lua
diff options
context:
space:
mode:
Diffstat (limited to 'test/functional/terminal/tui_spec.lua')
-rw-r--r--test/functional/terminal/tui_spec.lua176
1 files changed, 164 insertions, 12 deletions
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index d38bedcd4a..364ca327a4 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -1,10 +1,10 @@
-- Some sanity checks for the TUI using the builtin terminal emulator
-- as a simple way to send keys and assert screen state.
-local Screen = require('test.functional.ui.screen')
local helpers = require('test.functional.helpers')
local thelpers = require('test.functional.terminal.helpers')
local feed = thelpers.feed_data
local execute = helpers.execute
+local nvim_dir = helpers.nvim_dir
describe('tui', function()
local screen
@@ -41,7 +41,7 @@ describe('tui', function()
-- INSERT -- |
-- TERMINAL -- |
]])
- feed('\x1b')
+ feed('\027')
screen:expect([[
abc |
test1 |
@@ -53,11 +53,11 @@ describe('tui', function()
]])
end)
- it('interprets leading esc byte as the alt modifier', function()
+ it('interprets leading <Esc> byte as ALT modifier in normal-mode', function()
local keys = 'dfghjkl'
for c in keys:gmatch('.') do
execute('nnoremap <a-'..c..'> ialt-'..c..'<cr><esc>')
- feed('\x1b'..c)
+ feed('\027'..c)
end
screen:expect([[
alt-j |
@@ -80,11 +80,30 @@ describe('tui', function()
]])
end)
+ it('does not mangle unmapped ALT-key chord', function()
+ -- Vim represents ALT/META by setting the "high bit" of the modified key;
+ -- we do _not_. #3982
+ --
+ -- Example: for input ALT+j:
+ -- * Vim (Nvim prior to #3982) sets high-bit, inserts "ê".
+ -- * Nvim (after #3982) inserts "j".
+ feed('i\027j')
+ screen:expect([[
+ j{1: } |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] [+] |
+ -- INSERT -- |
+ -- TERMINAL -- |
+ ]])
+ end)
+
it('accepts ascii control sequences', function()
feed('i')
- feed('\x16\x07') -- ctrl+g
- feed('\x16\x16') -- ctrl+v
- feed('\x16\x0d') -- ctrl+m
+ feed('\022\007') -- ctrl+g
+ feed('\022\022') -- ctrl+v
+ feed('\022\013') -- ctrl+m
screen:expect([[
{3:^G^V^M}{1: } |
~ |
@@ -97,7 +116,7 @@ describe('tui', function()
end)
it('automatically sends <Paste> for bracketed paste sequences', function()
- feed('i\x1b[200~')
+ feed('i\027[200~')
screen:expect([[
{1: } |
~ |
@@ -117,7 +136,7 @@ describe('tui', function()
-- INSERT (paste) -- |
-- TERMINAL -- |
]])
- feed('\x1b[201~')
+ feed('\027[201~')
screen:expect([[
pasted from terminal{1: } |
~ |
@@ -135,9 +154,7 @@ describe('tui', function()
for i = 1, 3000 do
t[i] = 'item ' .. tostring(i)
end
- feed('i\x1b[200~')
- feed(table.concat(t, '\n'))
- feed('\x1b[201~')
+ feed('i\027[200~'..table.concat(t, '\n')..'\027[201~')
screen:expect([[
item 2997 |
item 2998 |
@@ -149,3 +166,138 @@ describe('tui', function()
]])
end)
end)
+
+describe('tui with non-tty file descriptors', function()
+ before_each(helpers.clear)
+
+ after_each(function()
+ os.remove('testF') -- ensure test file is removed
+ end)
+
+ it('can handle pipes as stdout and stderr', function()
+ local screen = thelpers.screen_setup(0, '"'..helpers.nvim_prog..' -u NONE -i NONE --cmd \'set noswapfile\' --cmd \'normal iabc\' > /dev/null 2>&1 && cat testF && rm testF"')
+ screen:set_default_attr_ids({})
+ screen:set_default_attr_ignore(true)
+ feed(':w testF\n:q\n')
+ screen:expect([[
+ :w testF |
+ :q |
+ abc |
+ |
+ [Process exited 0] |
+ |
+ -- TERMINAL -- |
+ ]])
+ end)
+end)
+
+describe('tui focus event handling', function()
+ local screen
+
+ before_each(function()
+ helpers.clear()
+ screen = thelpers.screen_setup(0, '["'..helpers.nvim_prog..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile"]')
+ execute('autocmd FocusGained * echo "gained"')
+ execute('autocmd FocusLost * echo "lost"')
+ end)
+
+ it('can handle focus events in normal mode', function()
+ feed('\027[I')
+ screen:expect([[
+ {1: } |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] |
+ gained |
+ -- TERMINAL -- |
+ ]])
+
+ feed('\027[O')
+ screen:expect([[
+ {1: } |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] |
+ lost |
+ -- TERMINAL -- |
+ ]])
+ end)
+
+ it('can handle focus events in insert mode', function()
+ execute('set noshowmode')
+ feed('i')
+ feed('\027[I')
+ screen:expect([[
+ {1: } |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] |
+ gained |
+ -- TERMINAL -- |
+ ]])
+ feed('\027[O')
+ screen:expect([[
+ {1: } |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] |
+ lost |
+ -- TERMINAL -- |
+ ]])
+ end)
+
+ it('can handle focus events in cmdline mode', function()
+ feed(':')
+ feed('\027[I')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] |
+ g{1:a}ined |
+ -- TERMINAL -- |
+ ]])
+ feed('\027[O')
+ screen:expect([[
+ |
+ ~ |
+ ~ |
+ ~ |
+ [No Name] |
+ l{1:o}st |
+ -- TERMINAL -- |
+ ]])
+ end)
+
+ it('can handle focus events in terminal mode', function()
+ execute('set shell='..nvim_dir..'/shell-test')
+ execute('set laststatus=0')
+ execute('set noshowmode')
+ execute('terminal')
+ feed('\027[I')
+ screen:expect([[
+ ready $ |
+ [Process exited 0]{1: } |
+ |
+ |
+ |
+ gained |
+ -- TERMINAL -- |
+ ]])
+ feed('\027[O')
+ screen:expect([[
+ ready $ |
+ [Process exited 0]{1: } |
+ |
+ |
+ |
+ lost |
+ -- TERMINAL -- |
+ ]])
+ end)
+end)