aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/functional/api/vim_spec.lua69
-rw-r--r--test/functional/terminal/tui_spec.lua35
2 files changed, 101 insertions, 3 deletions
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index b35ccb0c40..1b34945f13 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -1358,9 +1358,72 @@ describe('API', function()
test_paste_repeat_visual_select(true)
end)
end)
- it('vim.paste() failure', function()
- api.nvim_exec_lua('vim.paste = (function(lines, phase) error("fake fail") end)', {})
- eq('fake fail', pcall_err(request, 'nvim_paste', 'line 1\nline 2\nline 3', false, 1))
+ local function test_paste_cancel_error(is_error)
+ before_each(function()
+ exec_lua(([[
+ vim.paste = (function(overridden)
+ return function(lines, phase)
+ for i, line in ipairs(lines) do
+ if line == 'CANCEL' then
+ %s
+ end
+ end
+ return overridden(lines, phase)
+ end
+ end)(vim.paste)
+ ]]):format(is_error and 'error("fake fail")' or 'return false'))
+ end)
+ local function check_paste_cancel_error(data, crlf, phase)
+ if is_error then
+ eq('fake fail', pcall_err(api.nvim_paste, data, crlf, phase))
+ else
+ eq(false, api.nvim_paste(data, crlf, phase))
+ end
+ end
+ it('in phase -1', function()
+ feed('A')
+ check_paste_cancel_error('CANCEL', true, -1)
+ feed('<Esc>')
+ expect('')
+ feed('.')
+ expect('')
+ end)
+ it('in phase 1', function()
+ feed('A')
+ check_paste_cancel_error('CANCEL', true, 1)
+ feed('<Esc>')
+ expect('')
+ feed('.')
+ expect('')
+ end)
+ it('in phase 2', function()
+ feed('A')
+ eq(true, api.nvim_paste('aaa', true, 1))
+ expect('aaa')
+ check_paste_cancel_error('CANCEL', true, 2)
+ feed('<Esc>')
+ expect('aaa')
+ feed('.')
+ expect('aaaaaa')
+ end)
+ it('in phase 3', function()
+ feed('A')
+ eq(true, api.nvim_paste('aaa', true, 1))
+ expect('aaa')
+ eq(true, api.nvim_paste('bbb', true, 2))
+ expect('aaabbb')
+ check_paste_cancel_error('CANCEL', true, 3)
+ feed('<Esc>')
+ expect('aaabbb')
+ feed('.')
+ expect('aaabbbaaabbb')
+ end)
+ end
+ describe('vim.paste() cancel', function()
+ test_paste_cancel_error(false)
+ end)
+ describe('vim.paste() error', function()
+ test_paste_cancel_error(true)
end)
end)
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index b85ddec0f0..a7d87bb231 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -1298,6 +1298,41 @@ describe('TUI', function()
expect_child_buf_lines({ 'foo', '' })
end)
+ it('paste: vim.paste() cancel (retval=false) with streaming #30462', function()
+ child_session:request(
+ 'nvim_exec_lua',
+ [[
+ vim.paste = (function(overridden)
+ return function(lines, phase)
+ for i, line in ipairs(lines) do
+ if line:find('!') then
+ return false
+ end
+ end
+ return overridden(lines, phase)
+ end
+ end)(vim.paste)
+ ]],
+ {}
+ )
+ feed_data('A')
+ wait_for_mode('i')
+ feed_data('\027[200~aaa')
+ expect_child_buf_lines({ 'aaa' })
+ feed_data('bbb')
+ expect_child_buf_lines({ 'aaabbb' })
+ feed_data('ccc!') -- This chunk is cancelled.
+ expect_child_buf_lines({ 'aaabbb' })
+ feed_data('ddd\027[201~') -- This chunk is ignored.
+ expect_child_buf_lines({ 'aaabbb' })
+ feed_data('\027[27u')
+ wait_for_mode('n')
+ feed_data('.') -- Dot-repeat only includes chunks actually pasted.
+ expect_child_buf_lines({ 'aaabbbaaabbb' })
+ feed_data('$\027[200~eee\027[201~') -- A following paste works normally.
+ expect_child_buf_lines({ 'aaabbbaaabbbeee' })
+ end)
+
it("paste: 'nomodifiable' buffer", function()
child_session:request('nvim_command', 'set nomodifiable')
child_session:request(