aboutsummaryrefslogtreecommitdiff
path: root/test/functional/terminal
diff options
context:
space:
mode:
authorJames McCoy <jamessan@jamessan.com>2018-03-28 21:52:06 -0400
committerJames McCoy <jamessan@jamessan.com>2018-03-28 21:54:39 -0400
commit79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1 (patch)
tree4e0589d75801f3ff6a9678f84f5009102766661e /test/functional/terminal
parent4403864da3c48412595d439f36458d1e6ccfc49f (diff)
parent3f3de9b1a95d273463a87516365510dbffcaf3d2 (diff)
downloadrneovim-79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1.tar.gz
rneovim-79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1.tar.bz2
rneovim-79f9c2d9c650ceab27cdc6707fd6d7fa1de29fc1.zip
Merge branch 'master' into yagebu/option-fixes
Diffstat (limited to 'test/functional/terminal')
-rw-r--r--test/functional/terminal/buffer_spec.lua4
-rw-r--r--test/functional/terminal/cursor_spec.lua19
-rw-r--r--test/functional/terminal/edit_spec.lua1
-rw-r--r--test/functional/terminal/ex_terminal_spec.lua113
-rw-r--r--test/functional/terminal/helpers.lua1
-rw-r--r--test/functional/terminal/highlight_spec.lua5
-rw-r--r--test/functional/terminal/mouse_spec.lua85
-rw-r--r--test/functional/terminal/scrollback_spec.lua90
-rw-r--r--test/functional/terminal/tui_spec.lua505
-rw-r--r--test/functional/terminal/window_spec.lua66
-rw-r--r--test/functional/terminal/window_split_tab_spec.lua100
11 files changed, 763 insertions, 226 deletions
diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua
index 48b8512bf0..4ce33fef7b 100644
--- a/test/functional/terminal/buffer_spec.lua
+++ b/test/functional/terminal/buffer_spec.lua
@@ -6,8 +6,6 @@ local eval, feed_command, source = helpers.eval, helpers.feed_command, helpers.s
local eq, neq = helpers.eq, helpers.neq
local write_file = helpers.write_file
-if helpers.pending_win32(pending) then return end
-
describe('terminal buffer', function()
local screen
@@ -160,6 +158,7 @@ describe('terminal buffer', function()
end)
it('handles loss of focus gracefully', function()
+ if helpers.pending_win32(pending) then return end
-- Change the statusline to avoid printing the file name, which varies.
nvim('set_option', 'statusline', '==========')
feed_command('set laststatus=0')
@@ -205,7 +204,6 @@ describe('terminal buffer', function()
end)
describe('No heap-buffer-overflow when using', function()
-
local testfilename = 'Xtestfile-functional-terminal-buffers_spec'
before_each(function()
diff --git a/test/functional/terminal/cursor_spec.lua b/test/functional/terminal/cursor_spec.lua
index 84d0322f12..d942723d02 100644
--- a/test/functional/terminal/cursor_spec.lua
+++ b/test/functional/terminal/cursor_spec.lua
@@ -7,8 +7,6 @@ local feed_command = helpers.feed_command
local hide_cursor = thelpers.hide_cursor
local show_cursor = thelpers.show_cursor
-if helpers.pending_win32(pending) then return end
-
describe('terminal cursor', function()
local screen
@@ -52,8 +50,8 @@ describe('terminal cursor', function()
it('is positioned correctly when unfocused', function()
screen:expect([[
{7: 1 }tty ready |
- {7: 2 }{2:^ } |
- {7: 3 } |
+ {7: 2 }^rows: 6, cols: 46 |
+ {7: 3 }{2: } |
{7: 4 } |
{7: 5 } |
{7: 6 } |
@@ -62,12 +60,21 @@ describe('terminal cursor', function()
end)
it('is positioned correctly when focused', function()
+ screen:expect([[
+ {7: 1 }tty ready |
+ {7: 2 }^rows: 6, cols: 46 |
+ {7: 3 }{2: } |
+ {7: 4 } |
+ {7: 5 } |
+ {7: 6 } |
+ :set number |
+ ]])
feed('i')
helpers.wait()
screen:expect([[
{7: 1 }tty ready |
- {7: 2 }{1: } |
- {7: 3 } |
+ {7: 2 }rows: 6, cols: 46 |
+ {7: 3 }{1: } |
{7: 4 } |
{7: 5 } |
{7: 6 } |
diff --git a/test/functional/terminal/edit_spec.lua b/test/functional/terminal/edit_spec.lua
index d2b2d8a60c..84d7ae6e9c 100644
--- a/test/functional/terminal/edit_spec.lua
+++ b/test/functional/terminal/edit_spec.lua
@@ -36,6 +36,7 @@ describe(':edit term://*', function()
local scr = get_screen(columns, lines)
local rep = 'a'
meths.set_option('shellcmdflag', 'REP ' .. rep)
+ command('set shellxquote=') -- win: avoid extra quotes
local rep_size = rep:byte() -- 'a' => 97
local sb = 10
command('autocmd TermOpen * :setlocal scrollback='..tostring(sb)
diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua
index be0fd9f8ff..4f22f7385d 100644
--- a/test/functional/terminal/ex_terminal_spec.lua
+++ b/test/functional/terminal/ex_terminal_spec.lua
@@ -2,9 +2,13 @@ local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
local clear, wait, nvim = helpers.clear, helpers.wait, helpers.nvim
local nvim_dir, source, eq = helpers.nvim_dir, helpers.source, helpers.eq
+local feed = helpers.feed
local feed_command, eval = helpers.feed_command, helpers.eval
-
-if helpers.pending_win32(pending) then return end
+local funcs = helpers.funcs
+local retry = helpers.retry
+local ok = helpers.ok
+local iswin = helpers.iswin
+local command = helpers.command
describe(':terminal', function()
local screen
@@ -23,10 +27,17 @@ describe(':terminal', function()
echomsg "msg3"
]])
-- Invoke a command that emits frequent terminal activity.
- feed_command([[terminal while true; do echo X; done]])
- helpers.feed([[<C-\><C-N>]])
+ if iswin() then
+ feed_command([[terminal for /L \%I in (1,0,2) do echo \%I]])
+ else
+ feed_command([[terminal while true; do echo X; done]])
+ end
+ feed([[<C-\><C-N>]])
wait()
- screen:sleep(10) -- Let some terminal activity happen.
+ -- Wait for some terminal activity.
+ retry(nil, 4000, function()
+ ok(funcs.line('$') > 6)
+ end)
feed_command("messages")
screen:expect([[
msg1 |
@@ -37,8 +48,12 @@ describe(':terminal', function()
end)
it("in normal-mode :split does not move cursor", function()
- feed_command([[terminal while true; do echo foo; sleep .1; done]])
- helpers.feed([[<C-\><C-N>M]]) -- move cursor away from last line
+ if iswin() then
+ feed_command([[terminal for /L \\%I in (1,0,2) do ( echo foo & ping -w 100 -n 1 127.0.0.1 > nul )]])
+ else
+ feed_command([[terminal while true; do echo foo; sleep .1; done]])
+ end
+ feed([[<C-\><C-N>M]]) -- move cursor away from last line
wait()
eq(3, eval("line('$')")) -- window height
eq(2, eval("line('.')")) -- cursor is in the middle
@@ -48,6 +63,32 @@ describe(':terminal', function()
eq(2, eval("line('.')")) -- cursor stays where we put it
end)
+ it('Enter/Leave does not increment jumplist #3723', function()
+ feed_command('terminal')
+ local function enter_and_leave()
+ local lines_before = funcs.line('$')
+ -- Create a new line (in the shell). For a normal buffer this
+ -- increments the jumplist; for a terminal-buffer it should not. #3723
+ feed('i')
+ wait()
+ feed('<CR><CR><CR><CR>')
+ wait()
+ feed([[<C-\><C-N>]])
+ wait()
+ -- Wait for >=1 lines to be created.
+ retry(nil, 4000, function()
+ ok(funcs.line('$') > lines_before)
+ end)
+ end
+ enter_and_leave()
+ enter_and_leave()
+ enter_and_leave()
+ ok(funcs.line('$') > 6) -- Verify assumption.
+ local jumps = funcs.split(funcs.execute('jumps'), '\n')
+ eq(' jump line col file/text', jumps[1])
+ eq(3, #jumps)
+ end)
+
end)
describe(':terminal (with fake shell)', function()
@@ -70,19 +111,19 @@ describe(':terminal (with fake shell)', function()
it('with no argument, acts like termopen()', function()
terminal_with_fake_shell()
- wait()
+ retry(3, 4 * screen.timeout, function()
screen:expect([[
- ready $ |
+ ^ready $ |
[Process exited 0] |
|
- -- TERMINAL -- |
+ :terminal |
]])
+ end)
end)
it("with no argument, and 'shell' is set to empty string", function()
nvim('set_option', 'shell', '')
terminal_with_fake_shell()
- wait()
screen:expect([[
^ |
~ |
@@ -94,46 +135,45 @@ describe(':terminal (with fake shell)', function()
it("with no argument, but 'shell' has arguments, acts like termopen()", function()
nvim('set_option', 'shell', nvim_dir..'/shell-test -t jeff')
terminal_with_fake_shell()
- wait()
screen:expect([[
- jeff $ |
+ ^jeff $ |
[Process exited 0] |
|
- -- TERMINAL -- |
+ :terminal |
]])
end)
it('executes a given command through the shell', function()
+ command('set shellxquote=') -- win: avoid extra quotes
terminal_with_fake_shell('echo hi')
- wait()
screen:expect([[
- ready $ echo hi |
+ ^ready $ echo hi |
|
[Process exited 0] |
- -- TERMINAL -- |
+ :terminal echo hi |
]])
end)
it("executes a given command through the shell, when 'shell' has arguments", function()
nvim('set_option', 'shell', nvim_dir..'/shell-test -t jeff')
+ command('set shellxquote=') -- win: avoid extra quotes
terminal_with_fake_shell('echo hi')
- wait()
screen:expect([[
- jeff $ echo hi |
+ ^jeff $ echo hi |
|
[Process exited 0] |
- -- TERMINAL -- |
+ :terminal echo hi |
]])
end)
it('allows quotes and slashes', function()
+ command('set shellxquote=') -- win: avoid extra quotes
terminal_with_fake_shell([[echo 'hello' \ "world"]])
- wait()
screen:expect([[
- ready $ echo 'hello' \ "world" |
+ ^ready $ echo 'hello' \ "world" |
|
[Process exited 0] |
- -- TERMINAL -- |
+ :terminal echo 'hello' \ "world" |
]])
end)
@@ -147,12 +187,12 @@ describe(':terminal (with fake shell)', function()
it('ignores writes if the backing stream closes', function()
terminal_with_fake_shell()
- helpers.feed('iiXXXXXXX')
+ feed('iiXXXXXXX')
wait()
-- Race: Though the shell exited (and streams were closed by SIGCHLD
-- handler), :terminal cleanup is pending on the main-loop.
-- This write should be ignored (not crash, #5445).
- helpers.feed('iiYYYYYYY')
+ feed('iiYYYYYYY')
eq(2, eval("1+1")) -- Still alive?
end)
@@ -164,31 +204,34 @@ describe(':terminal (with fake shell)', function()
it('works with :find', function()
terminal_with_fake_shell()
- wait()
screen:expect([[
- ready $ |
+ ^ready $ |
[Process exited 0] |
|
- -- TERMINAL -- |
+ :terminal |
]])
eq('term://', string.match(eval('bufname("%")'), "^term://"))
- helpers.feed([[<C-\><C-N>]])
+ feed([[<C-\><C-N>]])
feed_command([[find */shadacat.py]])
- eq('scripts/shadacat.py', eval('bufname("%")'))
+ if iswin() then
+ eq('scripts\\shadacat.py', eval('bufname("%")'))
+ else
+ eq('scripts/shadacat.py', eval('bufname("%")'))
+ end
end)
it('works with gf', function()
+ command('set shellxquote=') -- win: avoid extra quotes
terminal_with_fake_shell([[echo "scripts/shadacat.py"]])
- wait()
screen:expect([[
- ready $ echo "scripts/shadacat.py" |
+ ^ready $ echo "scripts/shadacat.py" |
|
[Process exited 0] |
- -- TERMINAL -- |
+ :terminal echo "scripts/shadacat.py" |
]])
- helpers.feed([[<C-\><C-N>]])
+ feed([[<C-\><C-N>]])
eq('term://', string.match(eval('bufname("%")'), "^term://"))
- helpers.feed([[ggf"lgf]])
+ feed([[ggf"lgf]])
eq('scripts/shadacat.py', eval('bufname("%")'))
end)
diff --git a/test/functional/terminal/helpers.lua b/test/functional/terminal/helpers.lua
index 3b04d17705..bd24b9785d 100644
--- a/test/functional/terminal/helpers.lua
+++ b/test/functional/terminal/helpers.lua
@@ -33,7 +33,6 @@ local function disable_mouse() feed_termcode('[?1002l') end
local default_command = '["'..nvim_dir..'/tty-test'..'"]'
-
local function screen_setup(extra_rows, command, cols)
extra_rows = extra_rows and extra_rows or 0
command = command and command or default_command
diff --git a/test/functional/terminal/highlight_spec.lua b/test/functional/terminal/highlight_spec.lua
index bb40770235..fddc0bbb71 100644
--- a/test/functional/terminal/highlight_spec.lua
+++ b/test/functional/terminal/highlight_spec.lua
@@ -5,8 +5,6 @@ local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
local nvim_dir, command = helpers.nvim_dir, helpers.command
local eq, eval = helpers.eq, helpers.eval
-if helpers.pending_win32(pending) then return end
-
describe('terminal window highlighting', function()
local screen
@@ -55,6 +53,7 @@ describe('terminal window highlighting', function()
end)
local function pass_attrs()
+ if helpers.pending_win32(pending) then return end
screen:expect(sub([[
tty ready |
{NUM:text}text{10: } |
@@ -69,6 +68,7 @@ describe('terminal window highlighting', function()
it('will pass the corresponding attributes', pass_attrs)
it('will pass the corresponding attributes on scrollback', function()
+ if helpers.pending_win32(pending) then return end
pass_attrs()
local lines = {}
for i = 1, 8 do
@@ -145,6 +145,7 @@ describe('terminal window highlighting with custom palette', function()
end)
it('will use the custom color', function()
+ if helpers.pending_win32(pending) then return end
thelpers.set_fg(3)
thelpers.feed_data('text')
thelpers.clear_attrs()
diff --git a/test/functional/terminal/mouse_spec.lua b/test/functional/terminal/mouse_spec.lua
index 9239c2ad31..a21d9f0a56 100644
--- a/test/functional/terminal/mouse_spec.lua
+++ b/test/functional/terminal/mouse_spec.lua
@@ -4,8 +4,6 @@ local clear, eq, eval = helpers.clear, helpers.eq, helpers.eval
local feed, nvim = helpers.feed, helpers.nvim
local feed_data = thelpers.feed_data
-if helpers.pending_win32(pending) then return end
-
describe('terminal mouse', function()
local screen
@@ -67,6 +65,7 @@ describe('terminal mouse', function()
end)
it('will forward mouse clicks to the program', function()
+ if helpers.pending_win32(pending) then return end
feed('<LeftMouse><1,2>')
screen:expect([[
line27 |
@@ -80,6 +79,7 @@ describe('terminal mouse', function()
end)
it('will forward mouse scroll to the program', function()
+ if helpers.pending_win32(pending) then return end
feed('<ScrollWheelUp><0,0>')
screen:expect([[
line27 |
@@ -94,44 +94,45 @@ describe('terminal mouse', function()
end)
describe('with a split window and other buffer', function()
+ if helpers.pending_win32(pending) then return end
before_each(function()
feed('<c-\\><c-n>:vsp<cr>')
screen:expect([[
- line28 |line28 |
- line29 |line29 |
- line30 |line30 |
- rows: 5, cols: 25 |rows: 5, cols: 25 |
- {2:^ } |{2: } |
+ line28 │line28 |
+ line29 │line29 |
+ line30 │line30 |
+ rows: 5, cols: 24 │rows: 5, cols: 24 |
+ {2:^ } │{2: } |
========== ========== |
:vsp |
]])
feed(':enew | set number<cr>')
screen:expect([[
- {7: 1 }^ |line28 |
- {4:~ }|line29 |
- {4:~ }|line30 |
- {4:~ }|rows: 5, cols: 25 |
- {4:~ }|{2: } |
+ {7: 1 }^ │line28 |
+ {4:~ }│line29 |
+ {4:~ }│line30 |
+ {4:~ }│rows: 5, cols: 24 |
+ {4:~ }│{2: } |
========== ========== |
:enew | set number |
]])
feed('30iline\n<esc>')
screen:expect([[
- {7: 27 }line |line28 |
- {7: 28 }line |line29 |
- {7: 29 }line |line30 |
- {7: 30 }line |rows: 5, cols: 25 |
- {7: 31 }^ |{2: } |
+ {7: 27 }line │line28 |
+ {7: 28 }line │line29 |
+ {7: 29 }line │line30 |
+ {7: 30 }line │rows: 5, cols: 24 |
+ {7: 31 }^ │{2: } |
========== ========== |
|
]])
feed('<c-w>li')
screen:expect([[
- {7: 27 }line |line29 |
- {7: 28 }line |line30 |
- {7: 29 }line |rows: 5, cols: 25 |
- {7: 30 }line |rows: 5, cols: 24 |
- {7: 31 } |{1: } |
+ {7: 27 }line │line28 |
+ {7: 28 }line │line29 |
+ {7: 29 }line │line30 |
+ {7: 30 }line │rows: 5, cols: 24 |
+ {7: 31 } │{1: } |
========== ========== |
{3:-- TERMINAL --} |
]])
@@ -139,11 +140,11 @@ describe('terminal mouse', function()
thelpers.enable_mouse()
thelpers.feed_data('mouse enabled\n')
screen:expect([[
- {7: 27 }line |line30 |
- {7: 28 }line |rows: 5, cols: 25 |
- {7: 29 }line |rows: 5, cols: 24 |
- {7: 30 }line |mouse enabled |
- {7: 31 } |{1: } |
+ {7: 27 }line │line29 |
+ {7: 28 }line │line30 |
+ {7: 29 }line │rows: 5, cols: 24 |
+ {7: 30 }line │mouse enabled |
+ {7: 31 } │{1: } |
========== ========== |
{3:-- TERMINAL --} |
]])
@@ -152,21 +153,21 @@ describe('terminal mouse', function()
it('wont lose focus if another window is scrolled', function()
feed('<ScrollWheelUp><0,0><ScrollWheelUp><0,0>')
screen:expect([[
- {7: 21 }line |line30 |
- {7: 22 }line |rows: 5, cols: 25 |
- {7: 23 }line |rows: 5, cols: 24 |
- {7: 24 }line |mouse enabled |
- {7: 25 }line |{1: } |
+ {7: 21 }line │line29 |
+ {7: 22 }line │line30 |
+ {7: 23 }line │rows: 5, cols: 24 |
+ {7: 24 }line │mouse enabled |
+ {7: 25 }line │{1: } |
========== ========== |
{3:-- TERMINAL --} |
]])
feed('<S-ScrollWheelDown><0,0>')
screen:expect([[
- {7: 26 }line |line30 |
- {7: 27 }line |rows: 5, cols: 25 |
- {7: 28 }line |rows: 5, cols: 24 |
- {7: 29 }line |mouse enabled |
- {7: 30 }line |{1: } |
+ {7: 26 }line │line29 |
+ {7: 27 }line │line30 |
+ {7: 28 }line │rows: 5, cols: 24 |
+ {7: 29 }line │mouse enabled |
+ {7: 30 }line │{1: } |
========== ========== |
{3:-- TERMINAL --} |
]])
@@ -175,11 +176,11 @@ describe('terminal mouse', function()
it('will lose focus if another window is clicked', function()
feed('<LeftMouse><5,1>')
screen:expect([[
- {7: 27 }line |line30 |
- {7: 28 }l^ine |rows: 5, cols: 25 |
- {7: 29 }line |rows: 5, cols: 24 |
- {7: 30 }line |mouse enabled |
- {7: 31 } |{2: } |
+ {7: 27 }line │line29 |
+ {7: 28 }l^ine │line30 |
+ {7: 29 }line │rows: 5, cols: 24 |
+ {7: 30 }line │mouse enabled |
+ {7: 31 } │{2: } |
========== ========== |
|
]])
diff --git a/test/functional/terminal/scrollback_spec.lua b/test/functional/terminal/scrollback_spec.lua
index 05f81295c2..c665e64a80 100644
--- a/test/functional/terminal/scrollback_spec.lua
+++ b/test/functional/terminal/scrollback_spec.lua
@@ -3,6 +3,7 @@ local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
local clear, eq, curbuf = helpers.clear, helpers.eq, helpers.curbuf
local feed, nvim_dir, feed_command = helpers.feed, helpers.nvim_dir, helpers.feed_command
+local iswin = helpers.iswin
local eval = helpers.eval
local command = helpers.command
local wait = helpers.wait
@@ -11,8 +12,6 @@ local curbufmeths = helpers.curbufmeths
local nvim = helpers.nvim
local feed_data = thelpers.feed_data
-if helpers.pending_win32(pending) then return end
-
describe('terminal scrollback', function()
local screen
@@ -58,7 +57,7 @@ describe('terminal scrollback', function()
end)
end)
- describe('with the cursor at the last row', function()
+ describe('with cursor at last row', function()
before_each(function()
feed_data({'line1', 'line2', 'line3', 'line4', ''})
screen:expect([[
@@ -139,16 +138,18 @@ describe('terminal scrollback', function()
end)
- describe('and the height is decreased by 1', function()
+ describe('and height decreased by 1', function()
+ if helpers.pending_win32(pending) then return end
local function will_hide_top_line()
- screen:try_resize(screen._width, screen._height - 1)
+ feed([[<C-\><C-N>:]]) -- Go to cmdline-mode, so cursor is at bottom.
+ screen:try_resize(screen._width - 2, screen._height - 1)
screen:expect([[
- line2 |
- line3 |
- line4 |
- rows: 5, cols: 30 |
- {1: } |
- {3:-- TERMINAL --} |
+ line2 |
+ line3 |
+ line4 |
+ rows: 5, cols: 28 |
+ {2: } |
+ :^ |
]])
end
@@ -157,23 +158,23 @@ describe('terminal scrollback', function()
describe('and then decreased by 2', function()
before_each(function()
will_hide_top_line()
- screen:try_resize(screen._width, screen._height - 2)
+ screen:try_resize(screen._width - 2, screen._height - 2)
end)
it('will hide the top 3 lines', function()
screen:expect([[
- rows: 5, cols: 30 |
- rows: 3, cols: 30 |
- {1: } |
- {3:-- TERMINAL --} |
+ rows: 5, cols: 28 |
+ rows: 3, cols: 26 |
+ {2: } |
+ :^ |
]])
eq(8, curbuf('line_count'))
- feed('<c-\\><c-n>3k')
+ feed([[<C-\><C-N>3k]])
screen:expect([[
- ^line4 |
- rows: 5, cols: 30 |
- rows: 3, cols: 30 |
- |
+ ^line4 |
+ rows: 5, cols: 28 |
+ rows: 3, cols: 26 |
+ |
]])
end)
end)
@@ -181,6 +182,11 @@ describe('terminal scrollback', function()
end)
describe('with empty lines after the cursor', function()
+ -- XXX: Can't test this reliably on Windows unless the cursor is _moved_
+ -- by the resize. http://docs.libuv.org/en/v1.x/signal.html
+ -- See also: https://github.com/rprichard/winpty/issues/110
+ if helpers.pending_win32(pending) then return end
+
describe('and the height is decreased by 2', function()
before_each(function()
screen:try_resize(screen._width, screen._height - 2)
@@ -255,6 +261,10 @@ describe('terminal scrollback', function()
end)
describe('and the height is increased by 1', function()
+ -- XXX: Can't test this reliably on Windows unless the cursor is _moved_
+ -- by the resize. http://docs.libuv.org/en/v1.x/signal.html
+ -- See also: https://github.com/rprichard/winpty/issues/110
+ if helpers.pending_win32(pending) then return end
local function pop_then_push()
screen:try_resize(screen._width, screen._height + 1)
screen:expect([[
@@ -384,10 +394,20 @@ describe("'scrollback' option", function()
end
it('set to 0 behaves as 1', function()
- local screen = thelpers.screen_setup(nil, "['sh']", 30)
+ local screen
+ if iswin() then
+ screen = thelpers.screen_setup(nil,
+ "['powershell.exe', '-NoLogo', '-NoProfile', '-NoExit', '-Command', 'function global:prompt {return "..'"$"'.."}']", 30)
+ else
+ screen = thelpers.screen_setup(nil, "['sh']", 30)
+ end
curbufmeths.set_option('scrollback', 0)
- feed_data('for i in $(seq 1 30); do echo "line$i"; done\n')
+ if iswin() then
+ feed_data('for($i=1;$i -le 30;$i++){Write-Host \"line$i\"}\r')
+ else
+ feed_data('for i in $(seq 1 30); do echo "line$i"; done\n')
+ end
screen:expect('line30 ', nil, nil, nil, true)
retry(nil, nil, function() expect_lines(7) end)
@@ -395,7 +415,13 @@ describe("'scrollback' option", function()
end)
it('deletes lines (only) if necessary', function()
- local screen = thelpers.screen_setup(nil, "['sh']", 30)
+ local screen
+ if iswin() then
+ screen = thelpers.screen_setup(nil,
+ "['powershell.exe', '-NoLogo', '-NoProfile', '-NoExit', '-Command', 'function global:prompt {return "..'"$"'.."}']", 30)
+ else
+ screen = thelpers.screen_setup(nil, "['sh']", 30)
+ end
curbufmeths.set_option('scrollback', 200)
@@ -403,7 +429,11 @@ describe("'scrollback' option", function()
screen:expect('$', nil, nil, nil, true)
wait()
- feed_data('for i in $(seq 1 30); do echo "line$i"; done\n')
+ if iswin() then
+ feed_data('for($i=1;$i -le 30;$i++){Write-Host \"line$i\"}\r')
+ else
+ feed_data('for i in $(seq 1 30); do echo "line$i"; done\n')
+ end
screen:expect('line30 ', nil, nil, nil, true)
@@ -416,7 +446,11 @@ describe("'scrollback' option", function()
-- Terminal job data is received asynchronously, may happen before the
-- 'scrollback' option is synchronized with the internal sb_buffer.
command('sleep 100m')
- feed_data('for i in $(seq 1 40); do echo "line$i"; done\n')
+ if iswin() then
+ feed_data('for($i=1;$i -le 40;$i++){Write-Host \"line$i\"}\r')
+ else
+ feed_data('for i in $(seq 1 40); do echo "line$i"; done\n')
+ end
screen:expect('line40 ', nil, nil, nil, true)
@@ -428,10 +462,10 @@ describe("'scrollback' option", function()
screen:detach()
end)
- it('defaults to 1000 in terminal buffers', function()
+ it('defaults to 10000 in terminal buffers', function()
set_fake_shell()
command('terminal')
- eq(1000, curbufmeths.get_option('scrollback'))
+ eq(10000, curbufmeths.get_option('scrollback'))
end)
it('error if set to invalid value', function()
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index 3ed63f68e9..171745eb57 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -1,11 +1,23 @@
--- Some sanity checks for the TUI using the builtin terminal emulator
--- as a simple way to send keys and assert screen state.
+-- TUI acceptance tests.
+-- Uses :terminal as a way to send keys and assert screen state.
+local global_helpers = require('test.helpers')
+local uname = global_helpers.uname
local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
-local feed_data = thelpers.feed_data
+local Screen = require('test.functional.ui.screen')
+local eq = helpers.eq
local feed_command = helpers.feed_command
+local feed_data = thelpers.feed_data
+local clear = helpers.clear
+local command = helpers.command
+local eval = helpers.eval
local nvim_dir = helpers.nvim_dir
local retry = helpers.retry
+local nvim_prog = helpers.nvim_prog
+local nvim_set = helpers.nvim_set
+local ok = helpers.ok
+local read_file = helpers.read_file
+local wait = helpers.wait
if helpers.pending_win32(pending) then return end
@@ -13,12 +25,9 @@ describe('tui', function()
local screen
before_each(function()
- helpers.clear()
- screen = thelpers.screen_setup(0, '["'..helpers.nvim_prog
- ..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile noshowcmd noruler"]')
- -- right now pasting can be really slow in the TUI, especially in ASAN.
- -- this will be fixed later but for now we require a high timeout.
- screen.timeout = 60000
+ clear()
+ screen = thelpers.screen_setup(0, '["'..nvim_prog
+ ..'", "-u", "NONE", "-i", "NONE", "--cmd", "set noswapfile noshowcmd noruler undodir=. directory=. viewdir=. backupdir=."]')
screen:expect([[
{1: } |
{4:~ }|
@@ -34,6 +43,28 @@ describe('tui', function()
screen:detach()
end)
+ it('rapid resize #7572 #7628', function()
+ -- Need buffer rows to provoke the behavior.
+ feed_data(":edit test/functional/fixtures/bigfile.txt:")
+ command('call jobresize(b:terminal_job_id, 58, 9)')
+ command('call jobresize(b:terminal_job_id, 62, 13)')
+ command('call jobresize(b:terminal_job_id, 100, 42)')
+ command('call jobresize(b:terminal_job_id, 37, 1000)')
+ -- Resize to <5 columns.
+ screen:try_resize(4, 44)
+ command('call jobresize(b:terminal_job_id, 4, 1000)')
+ -- Resize to 1 row, then to 1 column, then increase rows to 4.
+ screen:try_resize(44, 1)
+ command('call jobresize(b:terminal_job_id, 44, 1)')
+ screen:try_resize(1, 1)
+ command('call jobresize(b:terminal_job_id, 1, 1)')
+ screen:try_resize(1, 4)
+ command('call jobresize(b:terminal_job_id, 1, 4)')
+ screen:try_resize(57, 17)
+ command('call jobresize(b:terminal_job_id, 57, 17)')
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+
it('accepts basic utf-8 input', function()
feed_data('iabc\ntest1\ntest2')
screen:expect([[
@@ -120,6 +151,9 @@ describe('tui', function()
end)
it('automatically sends <Paste> for bracketed paste sequences', function()
+ -- Pasting can be really slow in the TUI, specially in ASAN.
+ -- This will be fixed later but for now we require a high timeout.
+ screen.timeout = 60000
feed_data('i\027[200~')
screen:expect([[
{1: } |
@@ -153,6 +187,8 @@ describe('tui', function()
end)
it('can handle arbitrarily long bursts of input', function()
+ -- Need extra time for this test, specially in ASAN.
+ screen.timeout = 60000
feed_command('set ruler')
local t = {}
for i = 1, 3000 do
@@ -169,6 +205,58 @@ describe('tui', function()
{3:-- TERMINAL --} |
]])
end)
+
+ it('allows termguicolors to be set at runtime', function()
+ screen:set_option('rgb', true)
+ screen:set_default_attr_ids({
+ [1] = {reverse = true},
+ [2] = {foreground = 13, special = Screen.colors.Grey0},
+ [3] = {special = Screen.colors.Grey0, bold = true, reverse = true},
+ [4] = {bold = true},
+ [5] = {special = Screen.colors.Grey0, reverse = true, foreground = 4},
+ [6] = {foreground = 4, special = Screen.colors.Grey0},
+ [7] = {special = Screen.colors.Grey0, reverse = true, foreground = Screen.colors.SeaGreen4},
+ [8] = {foreground = Screen.colors.SeaGreen4, special = Screen.colors.Grey0},
+ [9] = {special = Screen.colors.Grey0, bold = true, foreground = Screen.colors.Blue1},
+ })
+
+ feed_data(':hi SpecialKey ctermfg=3 guifg=SeaGreen\n')
+ feed_data('i')
+ feed_data('\022\007') -- ctrl+g
+ feed_data('\028\014') -- crtl+\ ctrl+N
+ feed_data(':set termguicolors?\n')
+ screen:expect([[
+ {5:^}{6:G} |
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ notermguicolors |
+ {4:-- TERMINAL --} |
+ ]])
+
+ feed_data(':set termguicolors\n')
+ screen:expect([[
+ {7:^}{8:G} |
+ {9:~ }|
+ {9:~ }|
+ {9:~ }|
+ {3:[No Name] [+] }|
+ :set termguicolors |
+ {4:-- TERMINAL --} |
+ ]])
+
+ feed_data(':set notermguicolors\n')
+ screen:expect([[
+ {5:^}{6:G} |
+ {2:~ }|
+ {2:~ }|
+ {2:~ }|
+ {3:[No Name] [+] }|
+ :set notermguicolors |
+ {4:-- TERMINAL --} |
+ ]])
+ end)
end)
describe('tui with non-tty file descriptors', function()
@@ -194,7 +282,7 @@ describe('tui with non-tty file descriptors', function()
end)
end)
-describe('tui focus event handling', function()
+describe('tui FocusGained/FocusLost', function()
local screen
before_each(function()
@@ -206,7 +294,8 @@ describe('tui focus event handling', function()
feed_data("\034\016") -- CTRL-\ CTRL-N
end)
- it('can handle focus events in normal mode', function()
+ it('in normal-mode', function()
+ retry(2, 3 * screen.timeout, function()
feed_data('\027[I')
screen:expect([[
{1: } |
@@ -228,11 +317,13 @@ describe('tui focus event handling', function()
lost |
{3:-- TERMINAL --} |
]])
+ end)
end)
- it('can handle focus events in insert mode', function()
+ it('in insert-mode', function()
feed_command('set noshowmode')
feed_data('i')
+ retry(2, 3 * screen.timeout, function()
feed_data('\027[I')
screen:expect([[
{1: } |
@@ -253,9 +344,12 @@ describe('tui focus event handling', function()
lost |
{3:-- TERMINAL --} |
]])
+ end)
end)
- it('can handle focus events in cmdline mode', function()
+ -- During cmdline-mode we ignore :echo invoked by timers/events.
+ -- See commit: 5cc87d4dabd02167117be7a978b5c8faaa975419.
+ it('in cmdline-mode does NOT :echo', function()
feed_data(':')
feed_data('\027[I')
screen:expect([[
@@ -264,7 +358,7 @@ describe('tui focus event handling', function()
{4:~ }|
{4:~ }|
{5:[No Name] }|
- g{1:a}ined |
+ :{1: } |
{3:-- TERMINAL --} |
]])
feed_data('\027[O')
@@ -274,21 +368,52 @@ describe('tui focus event handling', function()
{4:~ }|
{4:~ }|
{5:[No Name] }|
- l{1:o}st |
+ :{1: } |
{3:-- TERMINAL --} |
]])
end)
- it('can handle focus events in terminal mode', function()
+ it('in cmdline-mode', function()
+ -- Set up autocmds that modify the buffer, instead of just calling :echo.
+ -- This is how we can test handling of focus gained/lost during cmdline-mode.
+ -- See commit: 5cc87d4dabd02167117be7a978b5c8faaa975419.
+ feed_data(":autocmd!\n")
+ feed_data(":autocmd FocusLost * call append(line('$'), 'lost')\n")
+ feed_data(":autocmd FocusGained * call append(line('$'), 'gained')\n")
+ retry(2, 3 * screen.timeout, function()
+ -- Enter cmdline-mode.
+ feed_data(':')
+ screen:sleep(1)
+ -- Send focus lost/gained termcodes.
+ feed_data('\027[O')
+ feed_data('\027[I')
+ screen:sleep(1)
+ -- Exit cmdline-mode. Redraws from timers/events are blocked during
+ -- cmdline-mode, so the buffer won't be updated until we exit cmdline-mode.
+ feed_data('\n')
+ screen:expect([[
+ {1: } |
+ lost |
+ gained |
+ {4:~ }|
+ {5:[No Name] [+] }|
+ : |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
+ end)
+
+ it('in terminal-mode', function()
feed_data(':set shell='..nvim_dir..'/shell-test\n')
feed_data(':set noshowmode laststatus=0\n')
retry(2, 3 * screen.timeout, function()
feed_data(':terminal\n')
+ screen:sleep(1)
feed_data('\027[I')
screen:expect([[
- ready $ |
- [Process exited 0]{1: } |
+ {1:r}eady $ |
+ [Process exited 0] |
|
|
|
@@ -297,8 +422,8 @@ describe('tui focus event handling', function()
]])
feed_data('\027[O')
screen:expect([[
- ready $ |
- [Process exited 0]{1: } |
+ {1:r}eady $ |
+ [Process exited 0] |
|
|
|
@@ -311,28 +436,46 @@ describe('tui focus event handling', function()
feed_data(':bwipeout!\n')
end)
end)
+
+ it('in press-enter prompt', function()
+ feed_data(":echom 'msg1'|echom 'msg2'|echom 'msg3'|echom 'msg4'|echom 'msg5'\n")
+ -- Execute :messages to provoke the press-enter prompt.
+ feed_data(":messages\n")
+ feed_data('\027[I')
+ feed_data('\027[I')
+ screen:expect([[
+ msg1 |
+ msg2 |
+ msg3 |
+ msg4 |
+ msg5 |
+ {10:Press ENTER or type command to continue}{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
end)
-- These tests require `thelpers` because --headless/--embed
-- does not initialize the TUI.
describe("tui 't_Co' (terminal colors)", function()
local screen
- local is_linux = (helpers.eval("system('uname') =~? 'linux'") == 1)
+ local is_freebsd = (string.lower(uname()) == 'freebsd')
local function assert_term_colors(term, colorterm, maxcolors)
helpers.clear({env={TERM=term}, args={}})
-- This is ugly because :term/termopen() forces TERM=xterm-256color.
-- TODO: Revisit this after jobstart/termopen accept `env` dict.
screen = thelpers.screen_setup(0, string.format(
- [=[['sh', '-c', 'LANG=C TERM=%s %s %s -u NONE -i NONE --cmd "silent set noswapfile noshowcmd noruler"']]=],
- term,
+ [=[['sh', '-c', 'LANG=C TERM=%s %s %s -u NONE -i NONE --cmd "%s"']]=],
+ term or "",
(colorterm ~= nil and "COLORTERM="..colorterm or ""),
- helpers.nvim_prog))
+ nvim_prog,
+ nvim_set))
- thelpers.feed_data(":echo &t_Co\n")
- helpers.wait()
+ feed_data(":echo &t_Co\n")
+ wait()
local tline
- if maxcolors == 8 then
+ if maxcolors == 8 or maxcolors == 16 then
tline = "~ "
else
tline = "{4:~ }"
@@ -342,41 +485,85 @@ describe("tui 't_Co' (terminal colors)", function()
%s|
%s|
%s|
- {5:[No Name] }|
+ %s|
%-3s |
{3:-- TERMINAL --} |
- ]], tline, tline, tline, tostring(maxcolors and maxcolors or "")))
+ ]], tline, tline, tline, tline, tostring(maxcolors and maxcolors or "")))
end
- it("unknown TERM sets empty 't_Co'", function()
- assert_term_colors("yet-another-term", nil, nil)
+ -- ansi and no terminal type at all:
+
+ it("no TERM uses 8 colors", function()
+ assert_term_colors(nil, nil, 8)
+ end)
+
+ it("TERM=ansi no COLORTERM uses 8 colors", function()
+ assert_term_colors("ansi", nil, 8)
+ end)
+
+ it("TERM=ansi with COLORTERM=anything-no-number uses 16 colors", function()
+ assert_term_colors("ansi", "yet-another-term", 16)
+ end)
+
+ it("unknown TERM COLORTERM with 256 in name uses 256 colors", function()
+ assert_term_colors("ansi", "yet-another-term-256color", 256)
+ end)
+
+ it("TERM=ansi-256color sets 256 colours", function()
+ assert_term_colors("ansi-256color", nil, 256)
end)
- it("unknown TERM with COLORTERM=screen-256color uses 256 colors", function()
- assert_term_colors("yet-another-term", "screen-256color", 256)
+ -- Unknown terminal types:
+
+ it("unknown TERM no COLORTERM sets 8 colours", function()
+ assert_term_colors("yet-another-term", nil, 8)
+ end)
+
+ it("unknown TERM with COLORTERM=anything-no-number uses 16 colors", function()
+ assert_term_colors("yet-another-term", "yet-another-term", 16)
end)
+ it("unknown TERM with 256 in name sets 256 colours", function()
+ assert_term_colors("yet-another-term-256color", nil, 256)
+ end)
+
+ it("unknown TERM COLORTERM with 256 in name uses 256 colors", function()
+ assert_term_colors("yet-another-term", "yet-another-term-256color", 256)
+ end)
+
+ -- Linux kernel terminal emulator:
+
it("TERM=linux uses 256 colors", function()
- if is_linux then
- assert_term_colors("linux", nil, 256)
- else
- pending()
- end
+ assert_term_colors("linux", nil, 256)
end)
it("TERM=linux-16color uses 256 colors", function()
- if is_linux then
- assert_term_colors("linux-16color", nil, 256)
+ assert_term_colors("linux-16color", nil, 256)
+ end)
+
+ it("TERM=linux-256color uses 256 colors", function()
+ assert_term_colors("linux-256color", nil, 256)
+ end)
+
+ -- screen:
+ --
+ -- FreeBSD falls back to the built-in screen-256colour entry.
+ -- Linux and MacOS have a screen entry in external terminfo with 8 colours,
+ -- which is raised to 16 by COLORTERM.
+
+ it("TERM=screen no COLORTERM uses 8/256 colors", function()
+ if is_freebsd then
+ assert_term_colors("screen", nil, 256)
else
- pending()
+ assert_term_colors("screen", nil, 8)
end
end)
- it("TERM=screen uses 8 colors", function()
- if is_linux then
- assert_term_colors("screen", nil, 8)
+ it("TERM=screen COLORTERM=screen uses 16/256 colors", function()
+ if is_freebsd then
+ assert_term_colors("screen", "screen", 256)
else
- pending()
+ assert_term_colors("screen", "screen", 16)
end
end)
@@ -384,15 +571,239 @@ describe("tui 't_Co' (terminal colors)", function()
assert_term_colors("screen", "screen-256color", 256)
end)
- it("TERM=yet-another-term COLORTERM=screen-256color uses 256 colors", function()
- assert_term_colors("screen", "screen-256color", 256)
+ it("TERM=screen-256color no COLORTERM uses 256 colors", function()
+ assert_term_colors("screen-256color", nil, 256)
+ end)
+
+ -- tmux:
+ --
+ -- FreeBSD and MacOS fall back to the built-in tmux-256colour entry.
+ -- Linux has a tmux entry in external terminfo with 8 colours,
+ -- which is raised to 256.
+
+ it("TERM=tmux no COLORTERM uses 256 colors", function()
+ assert_term_colors("tmux", nil, 256)
+ end)
+
+ it("TERM=tmux COLORTERM=tmux uses 256 colors", function()
+ assert_term_colors("tmux", "tmux", 256)
+ end)
+
+ it("TERM=tmux COLORTERM=tmux-256color uses 256 colors", function()
+ assert_term_colors("tmux", "tmux-256color", 256)
end)
+ it("TERM=tmux-256color no COLORTERM uses 256 colors", function()
+ assert_term_colors("tmux-256color", nil, 256)
+ end)
+
+ -- xterm and imitators:
+
it("TERM=xterm uses 256 colors", function()
assert_term_colors("xterm", nil, 256)
end)
+ it("TERM=xterm COLORTERM=gnome-terminal uses 256 colors", function()
+ assert_term_colors("xterm", "gnome-terminal", 256)
+ end)
+
+ it("TERM=xterm COLORTERM=mate-terminal uses 256 colors", function()
+ assert_term_colors("xterm", "mate-terminal", 256)
+ end)
+
it("TERM=xterm-256color uses 256 colors", function()
assert_term_colors("xterm-256color", nil, 256)
end)
+
+ -- rxvt and stterm:
+ --
+ -- FreeBSD and MacOS fall back to the built-in rxvt-256color and
+ -- st-256colour entries.
+ -- Linux has an rxvt, an st, and an st-16color entry in external terminfo
+ -- with 8, 8, and 16 colours respectively, which are raised to 256.
+
+ it("TERM=rxvt no COLORTERM uses 256 colors", function()
+ assert_term_colors("rxvt", nil, 256)
+ end)
+
+ it("TERM=rxvt COLORTERM=rxvt uses 256 colors", function()
+ assert_term_colors("rxvt", "rxvt", 256)
+ end)
+
+ it("TERM=rxvt-256color uses 256 colors", function()
+ assert_term_colors("rxvt-256color", nil, 256)
+ end)
+
+ it("TERM=st no COLORTERM uses 256 colors", function()
+ assert_term_colors("st", nil, 256)
+ end)
+
+ it("TERM=st COLORTERM=st uses 256 colors", function()
+ assert_term_colors("st", "st", 256)
+ end)
+
+ it("TERM=st COLORTERM=st-256color uses 256 colors", function()
+ assert_term_colors("st", "st-256color", 256)
+ end)
+
+ it("TERM=st-16color no COLORTERM uses 8/256 colors", function()
+ assert_term_colors("st", nil, 256)
+ end)
+
+ it("TERM=st-16color COLORTERM=st uses 16/256 colors", function()
+ assert_term_colors("st", "st", 256)
+ end)
+
+ it("TERM=st-16color COLORTERM=st-256color uses 256 colors", function()
+ assert_term_colors("st", "st-256color", 256)
+ end)
+
+ it("TERM=st-256color uses 256 colors", function()
+ assert_term_colors("st-256color", nil, 256)
+ end)
+
+ -- gnome and vte:
+ --
+ -- FreeBSD and MacOS fall back to the built-in vte-256color entry.
+ -- Linux has a gnome, a vte, a gnome-256color, and a vte-256color entry in
+ -- external terminfo with 8, 8, 256, and 256 colours respectively, which are
+ -- raised to 256.
+
+ it("TERM=gnome no COLORTERM uses 256 colors", function()
+ assert_term_colors("gnome", nil, 256)
+ end)
+
+ it("TERM=gnome COLORTERM=gnome uses 256 colors", function()
+ assert_term_colors("gnome", "gnome", 256)
+ end)
+
+ it("TERM=gnome COLORTERM=gnome-256color uses 256 colors", function()
+ assert_term_colors("gnome", "gnome-256color", 256)
+ end)
+
+ it("TERM=gnome-256color uses 256 colors", function()
+ assert_term_colors("gnome-256color", nil, 256)
+ end)
+
+ it("TERM=vte no COLORTERM uses 256 colors", function()
+ assert_term_colors("vte", nil, 256)
+ end)
+
+ it("TERM=vte COLORTERM=vte uses 256 colors", function()
+ assert_term_colors("vte", "vte", 256)
+ end)
+
+ it("TERM=vte COLORTERM=vte-256color uses 256 colors", function()
+ assert_term_colors("vte", "vte-256color", 256)
+ end)
+
+ it("TERM=vte-256color uses 256 colors", function()
+ assert_term_colors("vte-256color", nil, 256)
+ end)
+
+ -- others:
+
+ it("TERM=interix uses 8 colors", function()
+ assert_term_colors("interix", nil, 8)
+ end)
+
+ it("TERM=iTerm.app uses 256 colors", function()
+ assert_term_colors("iTerm.app", nil, 256)
+ end)
+
+ it("TERM=iterm uses 256 colors", function()
+ assert_term_colors("iterm", nil, 256)
+ end)
+
+end)
+
+-- These tests require `thelpers` because --headless/--embed
+-- does not initialize the TUI.
+describe("tui 'term' option", function()
+ local screen
+ local is_bsd = not not string.find(string.lower(uname()), 'bsd')
+ local is_macos = not not string.find(string.lower(uname()), 'darwin')
+
+ local function assert_term(term_envvar, term_expected)
+ clear()
+ -- This is ugly because :term/termopen() forces TERM=xterm-256color.
+ -- TODO: Revisit this after jobstart/termopen accept `env` dict.
+ local cmd = string.format(
+ [=[['sh', '-c', 'LANG=C TERM=%s %s -u NONE -i NONE --cmd "%s"']]=],
+ term_envvar or "",
+ nvim_prog,
+ nvim_set)
+ screen = thelpers.screen_setup(0, cmd)
+
+ local full_timeout = screen.timeout
+ screen.timeout = 250 -- We want screen:expect() to fail quickly.
+ retry(nil, 2 * full_timeout, function() -- Wait for TUI thread to set 'term'.
+ feed_data(":echo 'term='.(&term)\n")
+ screen:expect('term='..term_expected, nil, nil, nil, true)
+ end)
+ end
+
+ it('gets builtin term if $TERM is invalid', function()
+ assert_term("foo", "builtin_ansi")
+ end)
+
+ it('gets system-provided term if $TERM is valid', function()
+ if is_bsd then -- BSD lacks terminfo, builtin is always used.
+ assert_term("xterm", "builtin_xterm")
+ elseif is_macos then
+ local status, _ = pcall(assert_term, "xterm", "xterm")
+ if not status then
+ pending("macOS: unibilium could not find terminfo", function() end)
+ end
+ else
+ assert_term("xterm", "xterm")
+ end
+ end)
+
+end)
+
+-- These tests require `thelpers` because --headless/--embed
+-- does not initialize the TUI.
+describe("tui", function()
+ local screen
+ local logfile = 'Xtest_tui_verbose_log'
+ after_each(function()
+ os.remove(logfile)
+ end)
+
+ -- Runs (child) `nvim` in a TTY (:terminal), to start the builtin TUI.
+ local function nvim_tui(extra_args)
+ clear()
+ -- This is ugly because :term/termopen() forces TERM=xterm-256color.
+ -- TODO: Revisit this after jobstart/termopen accept `env` dict.
+ local cmd = string.format(
+ [=[['sh', '-c', 'LANG=C %s -u NONE -i NONE %s --cmd "%s"']]=],
+ nvim_prog,
+ extra_args or "",
+ nvim_set)
+ screen = thelpers.screen_setup(0, cmd)
+ end
+
+ it('-V3log logs terminfo values', function()
+ nvim_tui('-V3'..logfile)
+
+ -- Wait for TUI to start.
+ feed_data('Gitext')
+ screen:expect([[
+ text{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+
+ retry(nil, 3000, function() -- Wait for log file to be flushed.
+ local log = read_file('Xtest_tui_verbose_log') or ''
+ eq('--- Terminal info --- {{{\n', string.match(log, '--- Terminal.-\n'))
+ ok(#log > 50)
+ end)
+ end)
+
end)
diff --git a/test/functional/terminal/window_spec.lua b/test/functional/terminal/window_spec.lua
index 888b1e1328..842a81872e 100644
--- a/test/functional/terminal/window_spec.lua
+++ b/test/functional/terminal/window_spec.lua
@@ -2,8 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
local thelpers = require('test.functional.terminal.helpers')
local feed, clear = helpers.feed, helpers.clear
local wait = helpers.wait
-
-if helpers.pending_win32(pending) then return end
+local iswin = helpers.iswin
describe('terminal window', function()
local screen
@@ -13,9 +12,62 @@ describe('terminal window', function()
screen = thelpers.screen_setup()
end)
- describe('with colorcolumn set', function()
+ describe("with 'number'", function()
+ it('wraps text', function()
+ feed([[<C-\><C-N>]])
+ feed([[:set numberwidth=1 number<CR>i]])
+ screen:expect([[
+ {7:1 }tty ready |
+ {7:2 }rows: 6, cols: 48 |
+ {7:3 }{1: } |
+ {7:4 } |
+ {7:5 } |
+ {7:6 } |
+ {3:-- TERMINAL --} |
+ ]])
+ thelpers.feed_data({'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'})
+ screen:expect([[
+ {7:1 }tty ready |
+ {7:2 }rows: 6, cols: 48 |
+ {7:3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUV|
+ {7:4 }WXYZ{1: } |
+ {7:5 } |
+ {7:6 } |
+ {3:-- TERMINAL --} |
+ ]])
+
+ if iswin() then
+ return -- win: :terminal resize is unreliable #7007
+ end
+
+ -- numberwidth=9
+ feed([[<C-\><C-N>]])
+ feed([[:set numberwidth=9 number<CR>i]])
+ screen:expect([[
+ {7: 1 }tty ready |
+ {7: 2 }rows: 6, cols: 48 |
+ {7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO|
+ {7: 4 }WXYZrows: 6, cols: 41 |
+ {7: 5 }{1: } |
+ {7: 6 } |
+ {3:-- TERMINAL --} |
+ ]])
+ thelpers.feed_data({' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'})
+ screen:expect([[
+ {7: 1 }tty ready |
+ {7: 2 }rows: 6, cols: 48 |
+ {7: 3 }abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNO|
+ {7: 4 }WXYZrows: 6, cols: 41 |
+ {7: 5 } abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMN|
+ {7: 6 }OPQRSTUVWXYZ{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ end)
+ end)
+
+ describe("with 'colorcolumn'", function()
before_each(function()
- feed('<c-\\><c-n>')
+ feed([[<C-\><C-N>]])
screen:expect([[
tty ready |
{2:^ } |
@@ -25,7 +77,7 @@ describe('terminal window', function()
|
|
]])
- feed(':set colorcolumn=20<cr>i')
+ feed(':set colorcolumn=20<CR>i')
end)
it('wont show the color column', function()
@@ -43,7 +95,7 @@ describe('terminal window', function()
describe('with fold set', function()
before_each(function()
- feed('<c-\\><c-n>:set foldenable foldmethod=manual<cr>i')
+ feed([[<C-\><C-N>:set foldenable foldmethod=manual<CR>i]])
thelpers.feed_data({'line1', 'line2', 'line3', 'line4', ''})
screen:expect([[
tty ready |
@@ -57,7 +109,7 @@ describe('terminal window', function()
end)
it('wont show any folds', function()
- feed('<c-\\><c-n>ggvGzf')
+ feed([[<C-\><C-N>ggvGzf]])
wait()
screen:expect([[
^tty ready |
diff --git a/test/functional/terminal/window_split_tab_spec.lua b/test/functional/terminal/window_split_tab_spec.lua
index 4867e0d9fa..714c2476ce 100644
--- a/test/functional/terminal/window_split_tab_spec.lua
+++ b/test/functional/terminal/window_split_tab_spec.lua
@@ -3,8 +3,9 @@ local thelpers = require('test.functional.terminal.helpers')
local clear = helpers.clear
local feed, nvim = helpers.feed, helpers.nvim
local feed_command = helpers.feed_command
-
-if helpers.pending_win32(pending) then return end
+local command = helpers.command
+local eq = helpers.eq
+local eval = helpers.eval
describe('terminal', function()
local screen
@@ -24,77 +25,66 @@ describe('terminal', function()
screen:detach()
end)
- it('resets its size when entering terminal window', function()
+ it('next to a closing window', function()
+ command('split')
+ command('terminal')
+ command('vsplit foo')
+ eq(3, eval("winnr('$')"))
+ feed('ZQ') -- Close split, should not crash. #7538
+ eq(2, eval("1+1")) -- Still alive?
+ end)
+
+ it('does not change size on WinEnter', function()
+ if helpers.pending_win32(pending) then return end
feed('<c-\\><c-n>')
feed_command('2split')
screen:expect([[
- rows: 2, cols: 50 |
- {2:^ } |
- ========== |
- rows: 2, cols: 50 |
- {2: } |
- {4:~ }|
- {4:~ }|
- {4:~ }|
- ========== |
- :2split |
- ]])
- feed_command('wincmd p')
- screen:expect([[
tty ready |
- rows: 2, cols: 50 |
+ ^rows: 5, cols: 50 |
========== |
tty ready |
- rows: 2, cols: 50 |
rows: 5, cols: 50 |
{2: } |
- ^ |
+ |
+ |
========== |
- :wincmd p |
+ :2split |
]])
feed_command('wincmd p')
screen:expect([[
- rows: 2, cols: 50 |
- {2:^ } |
+ tty ready |
+ rows: 5, cols: 50 |
========== |
- rows: 2, cols: 50 |
+ tty ready |
+ ^rows: 5, cols: 50 |
{2: } |
- {4:~ }|
- {4:~ }|
- {4:~ }|
+ |
+ |
========== |
:wincmd p |
]])
end)
- describe('when the screen is resized', function()
- it('will forward a resize request to the program', function()
- screen:try_resize(screen._width + 3, screen._height + 5)
- screen:expect([[
- tty ready |
- rows: 14, cols: 53 |
- {1: } |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- {3:-- TERMINAL --} |
- ]])
- screen:try_resize(screen._width - 6, screen._height - 10)
- screen:expect([[
- tty ready |
- rows: 14, cols: 53 |
- rows: 4, cols: 47 |
- {1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
+ it('forwards resize request to the program', function()
+ feed([[<C-\><C-N>:]]) -- Go to cmdline-mode, so cursor is at bottom.
+ screen:try_resize(screen._width - 3, screen._height - 2)
+ screen:expect([[
+ tty ready |
+ rows: 7, cols: 47 |
+ {2: } |
+ |
+ |
+ |
+ |
+ :^ |
+ ]])
+ screen:try_resize(screen._width - 6, screen._height - 3)
+ screen:expect([[
+ tty ready |
+ rows: 7, cols: 47 |
+ rows: 4, cols: 41 |
+ {2: } |
+ :^ |
+ ]])
end)
end)