aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/functional/api/server_requests_spec.lua3
-rw-r--r--test/functional/eval/timer_spec.lua68
-rw-r--r--test/functional/ex_cmds/arg_spec.lua30
-rw-r--r--test/functional/ex_cmds/edit_spec.lua26
-rw-r--r--test/functional/terminal/ex_terminal_spec.lua26
-rw-r--r--test/functional/terminal/tui_spec.lua2
6 files changed, 144 insertions, 11 deletions
diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua
index 480f099b4d..3245e1b52d 100644
--- a/test/functional/api/server_requests_spec.lua
+++ b/test/functional/api/server_requests_spec.lua
@@ -164,7 +164,8 @@ describe('server -> client', function()
it('can communicate buffers, tabpages, and windows', function()
eq({1}, eval("rpcrequest(vim, 'nvim_list_tabpages')"))
- eq({1}, eval("rpcrequest(vim, 'nvim_list_wins')"))
+ -- Window IDs start at 1000 (LOWEST_WIN_ID in vim.h)
+ eq({1000}, eval("rpcrequest(vim, 'nvim_list_wins')"))
local buf = eval("rpcrequest(vim, 'nvim_list_bufs')")[1]
eq(1, buf)
diff --git a/test/functional/eval/timer_spec.lua b/test/functional/eval/timer_spec.lua
index 295c763d74..fba9466b78 100644
--- a/test/functional/eval/timer_spec.lua
+++ b/test/functional/eval/timer_spec.lua
@@ -3,6 +3,7 @@ local Screen = require('test.functional.ui.screen')
local ok, feed, eq, eval = helpers.ok, helpers.feed, helpers.eq, helpers.eval
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
local clear, execute, funcs = helpers.clear, helpers.execute, helpers.funcs
+local curbufmeths = helpers.curbufmeths
describe('timers', function()
before_each(function()
@@ -62,19 +63,76 @@ describe('timers', function()
end)
it('are paused when event processing is disabled', function()
- -- this is not the intended behavior, but at least there will
- -- not be a burst of queued up callbacks
- execute("call timer_start(50, 'MyHandler', {'repeat': 2})")
+ execute("call timer_start(50, 'MyHandler', {'repeat': -1})")
run(nil, nil, nil, 100)
local count = eval("g:val")
+ -- shows two line error message and thus invokes the return prompt.
+ -- if we start to allow event processing here, we need to change this test.
+ execute("throw 'fatal error'")
+ run(nil, nil, nil, 300)
+ feed("<cr>")
+ local diff = eval("g:val") - count
+ ok(0 <= diff and diff <= 4)
+ end)
+
+ it('are triggered in blocking getchar() call', function()
+ execute("call timer_start(50, 'MyHandler', {'repeat': -1})")
nvim_async("command", "let g:c = getchar()")
run(nil, nil, nil, 300)
feed("c")
- local diff = eval("g:val") - count
- ok(0 <= diff and diff <= 2)
+ local count = eval("g:val")
+ ok(count >= 5)
eq(99, eval("g:c"))
end)
+ it('can invoke redraw in blocking getchar() call', function()
+ local screen = Screen.new(40, 6)
+ screen:attach()
+ screen:set_default_attr_ids({
+ [1] = {bold=true, foreground=Screen.colors.Blue},
+ })
+
+ curbufmeths.set_lines(0, -1, true, {"ITEM 1", "ITEM 2"})
+ source([[
+ func! AddItem(timer)
+ call nvim_buf_set_lines(0, 2, 2, v:true, ['ITEM 3'])
+ redraw
+ endfunc
+ call timer_start(200, 'AddItem')
+ ]])
+ nvim_async("command", "let g:c2 = getchar()")
+
+ screen:expect([[
+ ITEM 1 |
+ ITEM 2 |
+ {1:~ }|
+ {1:~ }|
+ {1:~ }|
+ ^ |
+ ]])
+
+ screen:sleep(200)
+ screen:expect([[
+ ITEM 1 |
+ ITEM 2 |
+ ITEM 3 |
+ {1:~ }|
+ {1:~ }|
+ ^ |
+ ]])
+
+ feed("3")
+ eq(51, eval("g:c2"))
+ screen:expect([[
+ ^ITEM 1 |
+ ITEM 2 |
+ ITEM 3 |
+ {1:~ }|
+ {1:~ }|
+ |
+ ]])
+ end)
+
it('can be stopped', function()
local t = eval("timer_start(50, 'MyHandler', {'repeat': -1})")
eq(0,eval("g:val"))
diff --git a/test/functional/ex_cmds/arg_spec.lua b/test/functional/ex_cmds/arg_spec.lua
new file mode 100644
index 0000000000..e66dc62491
--- /dev/null
+++ b/test/functional/ex_cmds/arg_spec.lua
@@ -0,0 +1,30 @@
+local helpers = require("test.functional.helpers")(after_each)
+local eq, execute, funcs = helpers.eq, helpers.execute, helpers.funcs
+local ok = helpers.ok
+local clear = helpers.clear
+
+describe(":argument", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("does not restart :terminal buffer", function()
+ execute("terminal")
+ helpers.feed([[<C-\><C-N>]])
+ execute("argadd")
+ helpers.feed([[<C-\><C-N>]])
+ local bufname_before = funcs.bufname("%")
+ local bufnr_before = funcs.bufnr("%")
+ helpers.ok(nil ~= string.find(bufname_before, "^term://")) -- sanity
+
+ execute("argument 1")
+ helpers.feed([[<C-\><C-N>]])
+
+ local bufname_after = funcs.bufname("%")
+ local bufnr_after = funcs.bufnr("%")
+ eq("\n["..bufname_before.."] ", helpers.eval('execute("args")'))
+ ok(funcs.line('$') > 1)
+ eq(bufname_before, bufname_after)
+ eq(bufnr_before, bufnr_after)
+ end)
+end)
diff --git a/test/functional/ex_cmds/edit_spec.lua b/test/functional/ex_cmds/edit_spec.lua
new file mode 100644
index 0000000000..9e197d7466
--- /dev/null
+++ b/test/functional/ex_cmds/edit_spec.lua
@@ -0,0 +1,26 @@
+local helpers = require("test.functional.helpers")(after_each)
+local eq, execute, funcs = helpers.eq, helpers.execute, helpers.funcs
+local ok = helpers.ok
+local clear = helpers.clear
+
+describe(":edit", function()
+ before_each(function()
+ clear()
+ end)
+
+ it("without arguments does not restart :terminal buffer", function()
+ execute("terminal")
+ helpers.feed([[<C-\><C-N>]])
+ local bufname_before = funcs.bufname("%")
+ local bufnr_before = funcs.bufnr("%")
+ helpers.ok(nil ~= string.find(bufname_before, "^term://")) -- sanity
+
+ execute("edit")
+
+ local bufname_after = funcs.bufname("%")
+ local bufnr_after = funcs.bufnr("%")
+ ok(funcs.line('$') > 1)
+ eq(bufname_before, bufname_after)
+ eq(bufnr_before, bufnr_after)
+ end)
+end)
diff --git a/test/functional/terminal/ex_terminal_spec.lua b/test/functional/terminal/ex_terminal_spec.lua
index 6f929f17e4..09b4eaa8d5 100644
--- a/test/functional/terminal/ex_terminal_spec.lua
+++ b/test/functional/terminal/ex_terminal_spec.lua
@@ -13,13 +13,19 @@ describe(':terminal', function()
clear()
screen = Screen.new(50, 4)
screen:attach({rgb=false})
+ -- shell-test.c is a fake shell that prints its arguments and exits.
nvim('set_option', 'shell', nvim_dir..'/shell-test')
nvim('set_option', 'shellcmdflag', 'EXE')
-
end)
+ -- Invokes `:terminal {cmd}` using a fake shell (shell-test.c) which prints
+ -- the {cmd} and exits immediately .
+ local function terminal_run_fake_shell_cmd(cmd)
+ execute("terminal "..(cmd and cmd or ""))
+ end
+
it('with no argument, acts like termopen()', function()
- execute('terminal')
+ terminal_run_fake_shell_cmd()
wait()
screen:expect([[
ready $ |
@@ -30,7 +36,7 @@ describe(':terminal', function()
end)
it('executes a given command through the shell', function()
- execute('terminal echo hi')
+ terminal_run_fake_shell_cmd('echo hi')
wait()
screen:expect([[
ready $ echo hi |
@@ -41,7 +47,7 @@ describe(':terminal', function()
end)
it('allows quotes and slashes', function()
- execute([[terminal echo 'hello' \ "world"]])
+ terminal_run_fake_shell_cmd([[echo 'hello' \ "world"]])
wait()
screen:expect([[
ready $ echo 'hello' \ "world" |
@@ -58,4 +64,16 @@ describe(':terminal', function()
-- Verify that BufNew actually fired (else the test is invalid).
eq('foo', eval('&shell'))
end)
+
+ it('ignores writes if the backing stream closes', function()
+ terminal_run_fake_shell_cmd()
+ helpers.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')
+ wait()
+ end)
+
end)
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index 27f00e8550..60f989d701 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -313,7 +313,7 @@ describe("tui 't_Co' (terminal colors)", function()
-- 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', 'TERM=%s %s %s -u NONE -i NONE --cmd "silent set noswapfile"']]=],
+ [=[['sh', '-c', 'LANG=C TERM=%s %s %s -u NONE -i NONE --cmd "silent set noswapfile"']]=],
term,
(colorterm ~= nil and "COLORTERM="..colorterm or ""),
helpers.nvim_prog))