diff options
| author | Justin M. Keyes <justinkz@gmail.com> | 2024-01-03 03:05:22 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-01-03 03:05:22 -0800 |
| commit | a064ed622927b4c5e30165abbe54db841359c71f (patch) | |
| tree | 76973648e9ad684068457ff021b4d13281bfad84 /test/functional/api | |
| parent | ee2127363463b89ba9d5071babcb9bd16c4db691 (diff) | |
| parent | 04f2f864e270e772c6326cefdf24947f0130e492 (diff) | |
| download | rneovim-a064ed622927b4c5e30165abbe54db841359c71f.tar.gz rneovim-a064ed622927b4c5e30165abbe54db841359c71f.tar.bz2 rneovim-a064ed622927b4c5e30165abbe54db841359c71f.zip | |
Merge #26398 lintlua for test/ dir
Diffstat (limited to 'test/functional/api')
| -rw-r--r-- | test/functional/api/autocmd_spec.lua | 962 | ||||
| -rw-r--r-- | test/functional/api/buffer_spec.lua | 1200 | ||||
| -rw-r--r-- | test/functional/api/buffer_updates_spec.lua | 464 | ||||
| -rw-r--r-- | test/functional/api/command_spec.lua | 921 | ||||
| -rw-r--r-- | test/functional/api/extmark_spec.lua | 860 | ||||
| -rw-r--r-- | test/functional/api/highlight_spec.lua | 344 | ||||
| -rw-r--r-- | test/functional/api/keymap_spec.lua | 750 | ||||
| -rw-r--r-- | test/functional/api/menu_spec.lua | 29 | ||||
| -rw-r--r-- | test/functional/api/proc_spec.lua | 20 | ||||
| -rw-r--r-- | test/functional/api/rpc_fixture.lua | 10 | ||||
| -rw-r--r-- | test/functional/api/server_notifications_spec.lua | 45 | ||||
| -rw-r--r-- | test/functional/api/server_requests_spec.lua | 121 | ||||
| -rw-r--r-- | test/functional/api/tabpage_spec.lua | 23 | ||||
| -rw-r--r-- | test/functional/api/ui_spec.lua | 90 | ||||
| -rw-r--r-- | test/functional/api/version_spec.lua | 155 | ||||
| -rw-r--r-- | test/functional/api/vim_spec.lua | 2585 | ||||
| -rw-r--r-- | test/functional/api/window_spec.lua | 730 |
17 files changed, 5294 insertions, 4015 deletions
diff --git a/test/functional/api/autocmd_spec.lua b/test/functional/api/autocmd_spec.lua index fd46a1dcfa..1590ca2eda 100644 --- a/test/functional/api/autocmd_spec.lua +++ b/test/functional/api/autocmd_spec.lua @@ -15,43 +15,74 @@ before_each(clear) describe('autocmd api', function() describe('nvim_create_autocmd', function() it('validation', function() - eq("Cannot use both 'callback' and 'command'", pcall_err(meths.create_autocmd, 'BufReadPost', { - pattern = '*.py,*.pyi', - command = "echo 'Should Have Errored", - callback = 'NotAllowed', - })) - eq("Cannot use both 'pattern' and 'buffer' for the same autocmd", pcall_err(meths.create_autocmd, 'FileType', { - command = 'let g:called = g:called + 1', - buffer = 0, - pattern = '*.py', - })) - eq("Required: 'event'", pcall_err(meths.create_autocmd, {}, { - command = 'ls', - })) - eq("Required: 'command' or 'callback'", pcall_err(meths.create_autocmd, 'FileType', { - })) - eq("Invalid 'desc': expected String, got Integer", pcall_err(meths.create_autocmd, 'FileType', { - command = 'ls', - desc = 42, - })) - eq("Invalid 'callback': expected Lua function or Vim function name, got Integer", pcall_err(meths.create_autocmd, 'FileType', { - callback = 0, - })) - eq("Invalid 'event' item: expected String, got Array", pcall_err(meths.create_autocmd, - {'FileType', {}}, {})) - eq("Invalid 'group': 0", pcall_err(meths.create_autocmd, 'FileType', { - group = 0, - command = 'ls', - })) + eq( + "Cannot use both 'callback' and 'command'", + pcall_err(meths.create_autocmd, 'BufReadPost', { + pattern = '*.py,*.pyi', + command = "echo 'Should Have Errored", + callback = 'NotAllowed', + }) + ) + eq( + "Cannot use both 'pattern' and 'buffer' for the same autocmd", + pcall_err(meths.create_autocmd, 'FileType', { + command = 'let g:called = g:called + 1', + buffer = 0, + pattern = '*.py', + }) + ) + eq( + "Required: 'event'", + pcall_err(meths.create_autocmd, {}, { + command = 'ls', + }) + ) + eq("Required: 'command' or 'callback'", pcall_err(meths.create_autocmd, 'FileType', {})) + eq( + "Invalid 'desc': expected String, got Integer", + pcall_err(meths.create_autocmd, 'FileType', { + command = 'ls', + desc = 42, + }) + ) + eq( + "Invalid 'callback': expected Lua function or Vim function name, got Integer", + pcall_err(meths.create_autocmd, 'FileType', { + callback = 0, + }) + ) + eq( + "Invalid 'event' item: expected String, got Array", + pcall_err(meths.create_autocmd, { 'FileType', {} }, {}) + ) + eq( + "Invalid 'group': 0", + pcall_err(meths.create_autocmd, 'FileType', { + group = 0, + command = 'ls', + }) + ) eq("Invalid 'event': 'foo'", pcall_err(meths.create_autocmd, 'foo', { command = '' })) - eq("Invalid 'event': 'VimEnter '", pcall_err(meths.create_autocmd, 'VimEnter ', { command = '' })) - eq("Invalid 'event': 'VimEnter foo'", pcall_err(meths.create_autocmd, 'VimEnter foo', { command = '' })) - eq("Invalid 'event': 'BufAdd,BufDelete'", pcall_err(meths.create_autocmd, 'BufAdd,BufDelete', { command = '' })) + eq( + "Invalid 'event': 'VimEnter '", + pcall_err(meths.create_autocmd, 'VimEnter ', { command = '' }) + ) + eq( + "Invalid 'event': 'VimEnter foo'", + pcall_err(meths.create_autocmd, 'VimEnter foo', { command = '' }) + ) + eq( + "Invalid 'event': 'BufAdd,BufDelete'", + pcall_err(meths.create_autocmd, 'BufAdd,BufDelete', { command = '' }) + ) end) it('doesnt leak when you use ++once', function() - eq(1, exec_lua([[ + eq( + 1, + exec_lua( + [[ local count = 0 vim.api.nvim_create_autocmd("FileType", { @@ -64,30 +95,33 @@ describe('autocmd api', function() vim.cmd "set filetype=python" return count - ]], {})) + ]], + {} + ) + ) end) it('allows passing buffer by key', function() meths.set_var('called', 0) - meths.create_autocmd("FileType", { - command = "let g:called = g:called + 1", + meths.create_autocmd('FileType', { + command = 'let g:called = g:called + 1', buffer = 0, }) - meths.command "set filetype=txt" + meths.command 'set filetype=txt' eq(1, meths.get_var('called')) -- switch to a new buffer - meths.command "new" - meths.command "set filetype=python" + meths.command 'new' + meths.command 'set filetype=python' eq(1, meths.get_var('called')) end) it('does not allow passing invalid buffers', function() local ok, msg = pcall(meths.create_autocmd, 'FileType', { - command = "let g:called = g:called + 1", + command = 'let g:called = g:called + 1', buffer = -1, }) @@ -96,55 +130,61 @@ describe('autocmd api', function() end) it('errors on non-functions for cb', function() - eq(false, pcall(exec_lua, [[ + eq( + false, + pcall( + exec_lua, + [[ vim.api.nvim_create_autocmd("BufReadPost", { pattern = "*.py,*.pyi", callback = 5, }) - ]])) + ]] + ) + ) end) it('allow passing pattern and <buffer> in same pattern', function() - local ok = pcall(meths.create_autocmd, "BufReadPost", { - pattern = "*.py,<buffer>", - command = "echo 'Should Not Error'" + local ok = pcall(meths.create_autocmd, 'BufReadPost', { + pattern = '*.py,<buffer>', + command = "echo 'Should Not Error'", }) eq(true, ok) end) it('should handle multiple values as comma separated list', function() - meths.create_autocmd("BufReadPost", { - pattern = "*.py,*.pyi", - command = "echo 'Should Not Have Errored'" + meths.create_autocmd('BufReadPost', { + pattern = '*.py,*.pyi', + command = "echo 'Should Not Have Errored'", }) -- We should have one autocmd for *.py and one for *.pyi - eq(2, #meths.get_autocmds { event = "BufReadPost" }) + eq(2, #meths.get_autocmds { event = 'BufReadPost' }) end) it('should handle multiple values as array', function() - meths.create_autocmd("BufReadPost", { - pattern = { "*.py", "*.pyi", }, - command = "echo 'Should Not Have Errored'" + meths.create_autocmd('BufReadPost', { + pattern = { '*.py', '*.pyi' }, + command = "echo 'Should Not Have Errored'", }) -- We should have one autocmd for *.py and one for *.pyi - eq(2, #meths.get_autocmds { event = "BufReadPost" }) + eq(2, #meths.get_autocmds { event = 'BufReadPost' }) end) describe('desc', function() it('can add description to one autocmd', function() - local cmd = "echo 'Should Not Have Errored'" - local desc = "Can show description" - meths.create_autocmd("BufReadPost", { - pattern = "*.py", + local cmd = "echo 'Should Not Have Errored'" + local desc = 'Can show description' + meths.create_autocmd('BufReadPost', { + pattern = '*.py', command = cmd, desc = desc, }) - eq(desc, meths.get_autocmds { event = "BufReadPost" }[1].desc) - eq(cmd, meths.get_autocmds { event = "BufReadPost" }[1].command) + eq(desc, meths.get_autocmds { event = 'BufReadPost' }[1].desc) + eq(cmd, meths.get_autocmds { event = 'BufReadPost' }[1].command) end) it('can add description to one autocmd that uses a callback', function() @@ -182,34 +222,34 @@ describe('autocmd api', function() end) it('can add description to multiple autocmd', function() - meths.create_autocmd("BufReadPost", { - pattern = {"*.py", "*.pyi"}, + meths.create_autocmd('BufReadPost', { + pattern = { '*.py', '*.pyi' }, command = "echo 'Should Not Have Errored'", - desc = "Can show description", + desc = 'Can show description', }) - local aus = meths.get_autocmds { event = "BufReadPost" } + local aus = meths.get_autocmds { event = 'BufReadPost' } eq(2, #aus) - eq("Can show description", aus[1].desc) - eq("Can show description", aus[2].desc) + eq('Can show description', aus[1].desc) + eq('Can show description', aus[2].desc) end) end) pending('script and verbose settings', function() it('marks API client', function() - meths.create_autocmd("BufReadPost", { - pattern = "*.py", + meths.create_autocmd('BufReadPost', { + pattern = '*.py', command = "echo 'Should Not Have Errored'", - desc = "Can show description", + desc = 'Can show description', }) - local aus = meths.get_autocmds { event = "BufReadPost" } + local aus = meths.get_autocmds { event = 'BufReadPost' } eq(1, #aus, aus) end) end) it('removes an autocommand if the callback returns true', function() - meths.set_var("some_condition", false) + meths.set_var('some_condition', false) exec_lua [[ vim.api.nvim_create_autocmd("User", { @@ -221,19 +261,19 @@ describe('autocmd api', function() }) ]] - meths.exec_autocmds("User", {pattern = "Test"}) + meths.exec_autocmds('User', { pattern = 'Test' }) local aus = meths.get_autocmds({ event = 'User', pattern = 'Test' }) local first = aus[1] eq(true, first.id > 0) - meths.set_var("some_condition", true) - meths.exec_autocmds("User", {pattern = "Test"}) - eq({}, meths.get_autocmds({event = "User", pattern = "Test"})) + meths.set_var('some_condition', true) + meths.exec_autocmds('User', { pattern = 'Test' }) + eq({}, meths.get_autocmds({ event = 'User', pattern = 'Test' })) end) it('receives an args table', function() - local group_id = meths.create_augroup("TestGroup", {}) + local group_id = meths.create_augroup('TestGroup', {}) -- Having an existing autocmd calling expand("<afile>") shouldn't change args #18964 meths.create_autocmd('User', { group = 'TestGroup', @@ -251,15 +291,15 @@ describe('autocmd api', function() }) ]] - meths.exec_autocmds("User", {pattern = "Test pattern"}) + meths.exec_autocmds('User', { pattern = 'Test pattern' }) eq({ id = autocmd_id, group = group_id, - event = "User", - match = "Test pattern", - file = "Test pattern", + event = 'User', + match = 'Test pattern', + file = 'Test pattern', buf = 1, - }, meths.get_var("autocmd_args")) + }, meths.get_var('autocmd_args')) -- Test without a group autocmd_id = exec_lua [[ @@ -271,20 +311,23 @@ describe('autocmd api', function() }) ]] - meths.exec_autocmds("User", {pattern = "some_pat"}) + meths.exec_autocmds('User', { pattern = 'some_pat' }) eq({ id = autocmd_id, group = nil, - event = "User", - match = "some_pat", - file = "some_pat", + event = 'User', + match = 'some_pat', + file = 'some_pat', buf = 1, - }, meths.get_var("autocmd_args")) + }, meths.get_var('autocmd_args')) end) it('can receive arbitrary data', function() local function test(data) - eq(data, exec_lua([[ + eq( + data, + exec_lua( + [[ local input = ... local output vim.api.nvim_create_autocmd("User", { @@ -300,40 +343,64 @@ describe('autocmd api', function() }) return output - ]], data)) + ]], + data + ) + ) end - test("Hello") + test('Hello') test(42) test(true) - test({ "list" }) - test({ foo = "bar" }) + test({ 'list' }) + test({ foo = 'bar' }) end) end) describe('nvim_get_autocmds', function() it('validation', function() - eq("Invalid 'group': 9997999", pcall_err(meths.get_autocmds, { - group = 9997999, - })) - eq("Invalid 'group': 'bogus'", pcall_err(meths.get_autocmds, { - group = 'bogus', - })) - eq("Invalid 'group': 0", pcall_err(meths.get_autocmds, { - group = 0, - })) - eq("Invalid 'group': expected String or Integer, got Array", pcall_err(meths.get_autocmds, { - group = {}, - })) - eq("Invalid 'buffer': expected Integer or Array, got Boolean", pcall_err(meths.get_autocmds, { - buffer = true, - })) - eq("Invalid 'event': expected String or Array", pcall_err(meths.get_autocmds, { - event = true, - })) - eq("Invalid 'pattern': expected String or Array, got Boolean", pcall_err(meths.get_autocmds, { - pattern = true, - })) + eq( + "Invalid 'group': 9997999", + pcall_err(meths.get_autocmds, { + group = 9997999, + }) + ) + eq( + "Invalid 'group': 'bogus'", + pcall_err(meths.get_autocmds, { + group = 'bogus', + }) + ) + eq( + "Invalid 'group': 0", + pcall_err(meths.get_autocmds, { + group = 0, + }) + ) + eq( + "Invalid 'group': expected String or Integer, got Array", + pcall_err(meths.get_autocmds, { + group = {}, + }) + ) + eq( + "Invalid 'buffer': expected Integer or Array, got Boolean", + pcall_err(meths.get_autocmds, { + buffer = true, + }) + ) + eq( + "Invalid 'event': expected String or Array", + pcall_err(meths.get_autocmds, { + event = true, + }) + ) + eq( + "Invalid 'pattern': expected String or Array, got Boolean", + pcall_err(meths.get_autocmds, { + pattern = true, + }) + ) end) describe('events', function() @@ -341,7 +408,7 @@ describe('autocmd api', function() command [[au! InsertEnter]] command [[au InsertEnter * :echo "1"]] - local aus = meths.get_autocmds { event = "InsertEnter" } + local aus = meths.get_autocmds { event = 'InsertEnter' } eq(1, #aus) end) @@ -350,7 +417,7 @@ describe('autocmd api', function() command [[au InsertEnter * :echo "1"]] command [[au InsertEnter * :echo "2"]] - local aus = meths.get_autocmds { event = "InsertEnter" } + local aus = meths.get_autocmds { event = 'InsertEnter' } eq(2, #aus) end) @@ -359,8 +426,8 @@ describe('autocmd api', function() command [[au InsertEnter * :echo "1"]] command [[au InsertEnter * :echo "2"]] - local string_aus = meths.get_autocmds { event = "InsertEnter" } - local array_aus = meths.get_autocmds { event = { "InsertEnter" } } + local string_aus = meths.get_autocmds { event = 'InsertEnter' } + local array_aus = meths.get_autocmds { event = { 'InsertEnter' } } eq(string_aus, array_aus) end) @@ -370,7 +437,7 @@ describe('autocmd api', function() command [[au InsertEnter * :echo "1"]] command [[au InsertEnter * :echo "2"]] - local aus = meths.get_autocmds { event = { "InsertEnter", "InsertLeave" } } + local aus = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(2, #aus) end) @@ -384,7 +451,7 @@ describe('autocmd api', function() \ }) ]] - local aus = meths.get_autocmds { event = { "InsertEnter", "InsertLeave" } } + local aus = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } local first = aus[1] eq(first.id, nil) @@ -393,7 +460,7 @@ describe('autocmd api', function() neq(second.id, nil) meths.del_autocmd(second.id) - local new_aus = meths.get_autocmds { event = { "InsertEnter", "InsertLeave" } } + local new_aus = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(1, #new_aus) eq(first, new_aus[1]) end) @@ -402,8 +469,16 @@ describe('autocmd api', function() command [[au! InsertEnter]] command [[au InsertEnter * :echo "1"]] - local aus = meths.get_autocmds { event = "InsertEnter" } - eq({ { buflocal = false, command = ':echo "1"', event = "InsertEnter", once = false, pattern = "*" } }, aus) + local aus = meths.get_autocmds { event = 'InsertEnter' } + eq({ + { + buflocal = false, + command = ':echo "1"', + event = 'InsertEnter', + once = false, + pattern = '*', + }, + }, aus) end) it('works with buffer numbers', function() @@ -412,77 +487,96 @@ describe('autocmd api', function() command [[au InsertEnter <buffer=1> :echo "1"]] command [[au InsertEnter <buffer=2> :echo "2"]] - local aus = meths.get_autocmds { event = "InsertEnter", buffer = 0 } - eq({{ - buffer = 2, - buflocal = true, - command = ':echo "2"', - event = 'InsertEnter', - once = false, - pattern = '<buffer=2>', - }}, aus) - - aus = meths.get_autocmds { event = "InsertEnter", buffer = 1 } - eq({{ - buffer = 1, - buflocal = true, - command = ':echo "1"', - event = "InsertEnter", - once = false, - pattern = "<buffer=1>", - }}, aus) - - aus = meths.get_autocmds { event = "InsertEnter", buffer = { 1, 2 } } - eq({{ - buffer = 1, - buflocal = true, - command = ':echo "1"', - event = "InsertEnter", - once = false, - pattern = "<buffer=1>", - }, { - buffer = 2, - buflocal = true, - command = ':echo "2"', - event = "InsertEnter", - once = false, - pattern = "<buffer=2>", - }}, aus) - - eq("Invalid 'buffer': expected Integer or Array, got String", pcall_err(meths.get_autocmds, { event = "InsertEnter", buffer = "foo" })) - eq("Invalid 'buffer': expected Integer, got String", pcall_err(meths.get_autocmds, { event = "InsertEnter", buffer = { "foo", 42 } })) - eq("Invalid buffer id: 42", pcall_err(meths.get_autocmds, { event = "InsertEnter", buffer = { 42 } })) + local aus = meths.get_autocmds { event = 'InsertEnter', buffer = 0 } + eq({ + { + buffer = 2, + buflocal = true, + command = ':echo "2"', + event = 'InsertEnter', + once = false, + pattern = '<buffer=2>', + }, + }, aus) + + aus = meths.get_autocmds { event = 'InsertEnter', buffer = 1 } + eq({ + { + buffer = 1, + buflocal = true, + command = ':echo "1"', + event = 'InsertEnter', + once = false, + pattern = '<buffer=1>', + }, + }, aus) + + aus = meths.get_autocmds { event = 'InsertEnter', buffer = { 1, 2 } } + eq({ + { + buffer = 1, + buflocal = true, + command = ':echo "1"', + event = 'InsertEnter', + once = false, + pattern = '<buffer=1>', + }, + { + buffer = 2, + buflocal = true, + command = ':echo "2"', + event = 'InsertEnter', + once = false, + pattern = '<buffer=2>', + }, + }, aus) + + eq( + "Invalid 'buffer': expected Integer or Array, got String", + pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = 'foo' }) + ) + eq( + "Invalid 'buffer': expected Integer, got String", + pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = { 'foo', 42 } }) + ) + eq( + 'Invalid buffer id: 42', + pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = { 42 } }) + ) local bufs = {} for _ = 1, 257 do table.insert(bufs, meths.create_buf(true, false)) end - eq("Too many buffers (maximum of 256)", pcall_err(meths.get_autocmds, { event = "InsertEnter", buffer = bufs })) + eq( + 'Too many buffers (maximum of 256)', + pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = bufs }) + ) end) it('returns autocmds when group is specified by id', function() - local auid = meths.create_augroup("nvim_test_augroup", { clear = true }) - meths.create_autocmd("FileType", { group = auid, command = 'echo "1"' }) - meths.create_autocmd("FileType", { group = auid, command = 'echo "2"' }) + local auid = meths.create_augroup('nvim_test_augroup', { clear = true }) + meths.create_autocmd('FileType', { group = auid, command = 'echo "1"' }) + meths.create_autocmd('FileType', { group = auid, command = 'echo "2"' }) local aus = meths.get_autocmds { group = auid } eq(2, #aus) - local aus2 = meths.get_autocmds { group = auid, event = "InsertEnter" } + local aus2 = meths.get_autocmds { group = auid, event = 'InsertEnter' } eq(0, #aus2) end) it('returns autocmds when group is specified by name', function() - local auname = "nvim_test_augroup" + local auname = 'nvim_test_augroup' meths.create_augroup(auname, { clear = true }) - meths.create_autocmd("FileType", { group = auname, command = 'echo "1"' }) - meths.create_autocmd("FileType", { group = auname, command = 'echo "2"' }) + meths.create_autocmd('FileType', { group = auname, command = 'echo "1"' }) + meths.create_autocmd('FileType', { group = auname, command = 'echo "2"' }) local aus = meths.get_autocmds { group = auname } eq(2, #aus) - local aus2 = meths.get_autocmds { group = auname, event = "InsertEnter" } + local aus2 = meths.get_autocmds { group = auname, event = 'InsertEnter' } eq(0, #aus2) end) @@ -510,7 +604,7 @@ describe('autocmd api', function() -- 1 for the first buffer -- 2 for First.md -- 3-7 for the 5 we make in the autocmd - eq({1, 2, 3, 4, 5, 6, 7}, bufs) + eq({ 1, 2, 3, 4, 5, 6, 7 }, bufs) end) it('can retrieve a callback from an autocmd', function() @@ -534,12 +628,14 @@ describe('autocmd api', function() } ]]) - eq("function", result.cb.type) + eq('function', result.cb.type) eq(true, result.cb.can_retrieve) end) - it('will return an empty string as the command for an autocmd that uses a callback', function() - local result = exec_lua([[ + it( + 'will return an empty string as the command for an autocmd that uses a callback', + function() + local result = exec_lua([[ local callback = function() print 'I Am A Callback' end vim.api.nvim_create_autocmd("BufWritePost", { pattern = "*.py", @@ -553,8 +649,9 @@ describe('autocmd api', function() } ]]) - eq({ command = "", cbtype = 'function' }, result) - end) + eq({ command = '', cbtype = 'function' }, result) + end + ) end) describe('groups', function() @@ -574,7 +671,7 @@ describe('autocmd api', function() end) it('returns all groups if no group is specified', function() - local aus = meths.get_autocmds { event = "InsertEnter" } + local aus = meths.get_autocmds { event = 'InsertEnter' } if #aus ~= 4 then eq({}, aus) end @@ -584,32 +681,33 @@ describe('autocmd api', function() it('returns only the group specified', function() local aus = meths.get_autocmds { - event = "InsertEnter", - group = "GroupOne", + event = 'InsertEnter', + group = 'GroupOne', } eq(1, #aus) eq([[:echo "GroupOne:1"]], aus[1].command) - eq("GroupOne", aus[1].group_name) + eq('GroupOne', aus[1].group_name) end) it('returns only the group specified, multiple values', function() local aus = meths.get_autocmds { - event = "InsertEnter", - group = "GroupTwo", + event = 'InsertEnter', + group = 'GroupTwo', } eq(2, #aus) eq([[:echo "GroupTwo:2"]], aus[1].command) - eq("GroupTwo", aus[1].group_name) + eq('GroupTwo', aus[1].group_name) eq([[:echo "GroupTwo:3"]], aus[2].command) - eq("GroupTwo", aus[2].group_name) + eq('GroupTwo', aus[2].group_name) end) end) describe('groups: 2', function() it('raises error for undefined augroup name', function() - local success, code = unpack(meths.exec_lua([[ + local success, code = unpack(meths.exec_lua( + [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { pattern = "*", @@ -617,14 +715,17 @@ describe('autocmd api', function() command = "echo 'hello'", }) end)} - ]], {})) + ]], + {} + )) eq(false, success) matches("Invalid 'group': 'NotDefined'", code) end) it('raises error for undefined augroup id', function() - local success, code = unpack(meths.exec_lua([[ + local success, code = unpack(meths.exec_lua( + [[ return {pcall(function() -- Make sure the augroup is deleted vim.api.nvim_del_augroup_by_id(1) @@ -635,14 +736,17 @@ describe('autocmd api', function() command = "echo 'hello'", }) end)} - ]], {})) + ]], + {} + )) eq(false, success) matches("Invalid 'group': 1", code) end) it('raises error for invalid group type', function() - local success, code = unpack(meths.exec_lua([[ + local success, code = unpack(meths.exec_lua( + [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { pattern = "*", @@ -650,21 +754,26 @@ describe('autocmd api', function() command = "echo 'hello'", }) end)} - ]], {})) + ]], + {} + )) eq(false, success) matches("Invalid 'group': expected String or Integer, got Boolean", code) end) it('raises error for invalid pattern array', function() - local success, code = unpack(meths.exec_lua([[ + local success, code = unpack(meths.exec_lua( + [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { pattern = {{}}, command = "echo 'hello'", }) end)} - ]], {})) + ]], + {} + )) eq(false, success) matches("Invalid 'pattern' item: expected String, got Array", code) @@ -684,8 +793,8 @@ describe('autocmd api', function() it('returns for literal match', function() local aus = meths.get_autocmds { - event = "InsertEnter", - pattern = "*" + event = 'InsertEnter', + pattern = '*', } eq(1, #aus) @@ -695,8 +804,8 @@ describe('autocmd api', function() it('returns for multiple matches', function() -- vim.api.nvim_get_autocmds local aus = meths.get_autocmds { - event = "InsertEnter", - pattern = { "*.one", "*.two" }, + event = 'InsertEnter', + pattern = { '*.one', '*.two' }, } eq(3, #aus) @@ -707,18 +816,18 @@ describe('autocmd api', function() it('should work for buffer autocmds', function() local normalized_aus = meths.get_autocmds { - event = "InsertEnter", - pattern = "<buffer=1>", + event = 'InsertEnter', + pattern = '<buffer=1>', } local raw_aus = meths.get_autocmds { - event = "InsertEnter", - pattern = "<buffer>", + event = 'InsertEnter', + pattern = '<buffer>', } local zero_aus = meths.get_autocmds { - event = "InsertEnter", - pattern = "<buffer=0>", + event = 'InsertEnter', + pattern = '<buffer=0>', } eq(normalized_aus, raw_aus) @@ -730,165 +839,186 @@ describe('autocmd api', function() describe('nvim_exec_autocmds', function() it('validation', function() - eq("Invalid 'group': 9997999", pcall_err(meths.exec_autocmds, 'FileType', { - group = 9997999, - })) - eq("Invalid 'group': 'bogus'", pcall_err(meths.exec_autocmds, 'FileType', { - group = 'bogus', - })) - eq("Invalid 'group': expected String or Integer, got Array", pcall_err(meths.exec_autocmds, 'FileType', { - group = {}, - })) - eq("Invalid 'group': 0", pcall_err(meths.exec_autocmds, 'FileType', { - group = 0, - })) - eq("Invalid 'buffer': expected Buffer, got Array", pcall_err(meths.exec_autocmds, 'FileType', { - buffer = {}, - })) - eq("Invalid 'event' item: expected String, got Array", pcall_err(meths.exec_autocmds, - {'FileType', {}}, {})) + eq( + "Invalid 'group': 9997999", + pcall_err(meths.exec_autocmds, 'FileType', { + group = 9997999, + }) + ) + eq( + "Invalid 'group': 'bogus'", + pcall_err(meths.exec_autocmds, 'FileType', { + group = 'bogus', + }) + ) + eq( + "Invalid 'group': expected String or Integer, got Array", + pcall_err(meths.exec_autocmds, 'FileType', { + group = {}, + }) + ) + eq( + "Invalid 'group': 0", + pcall_err(meths.exec_autocmds, 'FileType', { + group = 0, + }) + ) + eq( + "Invalid 'buffer': expected Buffer, got Array", + pcall_err(meths.exec_autocmds, 'FileType', { + buffer = {}, + }) + ) + eq( + "Invalid 'event' item: expected String, got Array", + pcall_err(meths.exec_autocmds, { 'FileType', {} }, {}) + ) end) - it("can trigger builtin autocmds", function() - meths.set_var("autocmd_executed", false) + it('can trigger builtin autocmds', function() + meths.set_var('autocmd_executed', false) - meths.create_autocmd("BufReadPost", { - pattern = "*", - command = "let g:autocmd_executed = v:true", + meths.create_autocmd('BufReadPost', { + pattern = '*', + command = 'let g:autocmd_executed = v:true', }) - eq(false, meths.get_var("autocmd_executed")) - meths.exec_autocmds("BufReadPost", {}) - eq(true, meths.get_var("autocmd_executed")) + eq(false, meths.get_var('autocmd_executed')) + meths.exec_autocmds('BufReadPost', {}) + eq(true, meths.get_var('autocmd_executed')) end) - it("can trigger multiple patterns", function() - meths.set_var("autocmd_executed", 0) + it('can trigger multiple patterns', function() + meths.set_var('autocmd_executed', 0) - meths.create_autocmd("BufReadPost", { - pattern = "*", - command = "let g:autocmd_executed += 1", + meths.create_autocmd('BufReadPost', { + pattern = '*', + command = 'let g:autocmd_executed += 1', }) - meths.exec_autocmds("BufReadPost", { pattern = { "*.lua", "*.vim" } }) - eq(2, meths.get_var("autocmd_executed")) + meths.exec_autocmds('BufReadPost', { pattern = { '*.lua', '*.vim' } }) + eq(2, meths.get_var('autocmd_executed')) - meths.create_autocmd("BufReadPre", { - pattern = { "bar", "foo" }, - command = "let g:autocmd_executed += 10", + meths.create_autocmd('BufReadPre', { + pattern = { 'bar', 'foo' }, + command = 'let g:autocmd_executed += 10', }) - meths.exec_autocmds("BufReadPre", { pattern = { "foo", "bar", "baz", "frederick" }}) - eq(22, meths.get_var("autocmd_executed")) + meths.exec_autocmds('BufReadPre', { pattern = { 'foo', 'bar', 'baz', 'frederick' } }) + eq(22, meths.get_var('autocmd_executed')) end) - it("can pass the buffer", function() - meths.set_var("buffer_executed", -1) - eq(-1, meths.get_var("buffer_executed")) + it('can pass the buffer', function() + meths.set_var('buffer_executed', -1) + eq(-1, meths.get_var('buffer_executed')) - meths.create_autocmd("BufLeave", { - pattern = "*", + meths.create_autocmd('BufLeave', { + pattern = '*', command = 'let g:buffer_executed = +expand("<abuf>")', }) -- Doesn't execute for other non-matching events - meths.exec_autocmds("CursorHold", { buffer = 1 }) - eq(-1, meths.get_var("buffer_executed")) + meths.exec_autocmds('CursorHold', { buffer = 1 }) + eq(-1, meths.get_var('buffer_executed')) - meths.exec_autocmds("BufLeave", { buffer = 1 }) - eq(1, meths.get_var("buffer_executed")) + meths.exec_autocmds('BufLeave', { buffer = 1 }) + eq(1, meths.get_var('buffer_executed')) end) - it("can pass the filename, pattern match", function() - meths.set_var("filename_executed", 'none') - eq('none', meths.get_var("filename_executed")) + it('can pass the filename, pattern match', function() + meths.set_var('filename_executed', 'none') + eq('none', meths.get_var('filename_executed')) - meths.create_autocmd("BufEnter", { - pattern = "*.py", + meths.create_autocmd('BufEnter', { + pattern = '*.py', command = 'let g:filename_executed = expand("<afile>")', }) -- Doesn't execute for other non-matching events - meths.exec_autocmds("CursorHold", { buffer = 1 }) - eq('none', meths.get_var("filename_executed")) + meths.exec_autocmds('CursorHold', { buffer = 1 }) + eq('none', meths.get_var('filename_executed')) meths.command('edit __init__.py') - eq('__init__.py', meths.get_var("filename_executed")) + eq('__init__.py', meths.get_var('filename_executed')) end) it('cannot pass buf and fname', function() - local ok = pcall(meths.exec_autocmds, "BufReadPre", { pattern = "literally_cannot_error.rs", buffer = 1 }) + local ok = pcall( + meths.exec_autocmds, + 'BufReadPre', + { pattern = 'literally_cannot_error.rs', buffer = 1 } + ) eq(false, ok) end) - it("can pass the filename, exact match", function() - meths.set_var("filename_executed", 'none') - eq('none', meths.get_var("filename_executed")) + it('can pass the filename, exact match', function() + meths.set_var('filename_executed', 'none') + eq('none', meths.get_var('filename_executed')) meths.command('edit other_file.txt') meths.command('edit __init__.py') - eq('none', meths.get_var("filename_executed")) + eq('none', meths.get_var('filename_executed')) - meths.create_autocmd("CursorHoldI", { - pattern = "__init__.py", + meths.create_autocmd('CursorHoldI', { + pattern = '__init__.py', command = 'let g:filename_executed = expand("<afile>")', }) -- Doesn't execute for other non-matching events - meths.exec_autocmds("CursorHoldI", { buffer = 1 }) - eq('none', meths.get_var("filename_executed")) + meths.exec_autocmds('CursorHoldI', { buffer = 1 }) + eq('none', meths.get_var('filename_executed')) - meths.exec_autocmds("CursorHoldI", { buffer = meths.get_current_buf() }) - eq('__init__.py', meths.get_var("filename_executed")) + meths.exec_autocmds('CursorHoldI', { buffer = meths.get_current_buf() }) + eq('__init__.py', meths.get_var('filename_executed')) -- Reset filename - meths.set_var("filename_executed", 'none') + meths.set_var('filename_executed', 'none') - meths.exec_autocmds("CursorHoldI", { pattern = '__init__.py' }) - eq('__init__.py', meths.get_var("filename_executed")) + meths.exec_autocmds('CursorHoldI', { pattern = '__init__.py' }) + eq('__init__.py', meths.get_var('filename_executed')) end) - it("works with user autocmds", function() - meths.set_var("matched", 'none') + it('works with user autocmds', function() + meths.set_var('matched', 'none') - meths.create_autocmd("User", { - pattern = "TestCommand", - command = 'let g:matched = "matched"' + meths.create_autocmd('User', { + pattern = 'TestCommand', + command = 'let g:matched = "matched"', }) - meths.exec_autocmds("User", { pattern = "OtherCommand" }) + meths.exec_autocmds('User', { pattern = 'OtherCommand' }) eq('none', meths.get_var('matched')) - meths.exec_autocmds("User", { pattern = "TestCommand" }) + meths.exec_autocmds('User', { pattern = 'TestCommand' }) eq('matched', meths.get_var('matched')) end) it('can pass group by id', function() - meths.set_var("group_executed", false) + meths.set_var('group_executed', false) - local auid = meths.create_augroup("nvim_test_augroup", { clear = true }) - meths.create_autocmd("FileType", { + local auid = meths.create_augroup('nvim_test_augroup', { clear = true }) + meths.create_autocmd('FileType', { group = auid, command = 'let g:group_executed = v:true', }) - eq(false, meths.get_var("group_executed")) - meths.exec_autocmds("FileType", { group = auid }) - eq(true, meths.get_var("group_executed")) + eq(false, meths.get_var('group_executed')) + meths.exec_autocmds('FileType', { group = auid }) + eq(true, meths.get_var('group_executed')) end) it('can pass group by name', function() - meths.set_var("group_executed", false) + meths.set_var('group_executed', false) - local auname = "nvim_test_augroup" + local auname = 'nvim_test_augroup' meths.create_augroup(auname, { clear = true }) - meths.create_autocmd("FileType", { + meths.create_autocmd('FileType', { group = auname, command = 'let g:group_executed = v:true', }) - eq(false, meths.get_var("group_executed")) - meths.exec_autocmds("FileType", { group = auname }) - eq(true, meths.get_var("group_executed")) + eq(false, meths.get_var('group_executed')) + meths.exec_autocmds('FileType', { group = auname }) + eq(true, meths.get_var('group_executed')) end) end) @@ -903,19 +1033,19 @@ describe('autocmd api', function() opts = opts or {} local resulting = { - pattern = "*", - command = "let g:executed = g:executed + 1", + pattern = '*', + command = 'let g:executed = g:executed + 1', } resulting.group = opts.group resulting.once = opts.once - meths.create_autocmd("FileType", resulting) + meths.create_autocmd('FileType', resulting) end local set_ft = function(ft) - ft = ft or "txt" - source(string.format("set filetype=%s", ft)) + ft = ft or 'txt' + source(string.format('set filetype=%s', ft)) end local get_executed_count = function() @@ -923,12 +1053,12 @@ describe('autocmd api', function() end it('can be added in a group', function() - local augroup = "TestGroup" + local augroup = 'TestGroup' meths.create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup } - set_ft("txt") - set_ft("python") + set_ft('txt') + set_ft('python') eq(2, get_executed_count()) end) @@ -943,7 +1073,7 @@ describe('autocmd api', function() end) it('handles ++once', function() - make_counting_autocmd {once = true} + make_counting_autocmd { once = true } set_ft('txt') set_ft('help') set_ft('txt') @@ -953,9 +1083,9 @@ describe('autocmd api', function() end) it('errors on unexpected keys', function() - local success, code = pcall(meths.create_autocmd, "FileType", { - pattern = "*", - not_a_valid_key = "NotDefined", + local success, code = pcall(meths.create_autocmd, 'FileType', { + pattern = '*', + not_a_valid_key = 'NotDefined', }) eq(false, success) @@ -963,24 +1093,35 @@ describe('autocmd api', function() end) it('can execute simple callback', function() - exec_lua([[ + exec_lua( + [[ vim.g.executed = false vim.api.nvim_create_autocmd("FileType", { pattern = "*", callback = function() vim.g.executed = true end, }) - ]], {}) - - - eq(true, exec_lua([[ + ]], + {} + ) + + eq( + true, + exec_lua( + [[ vim.cmd "set filetype=txt" return vim.g.executed - ]], {})) + ]], + {} + ) + ) end) it('calls multiple lua callbacks for the same autocmd execution', function() - eq(4, exec_lua([[ + eq( + 4, + exec_lua( + [[ local count = 0 local counter = function() count = count + 1 @@ -1000,7 +1141,10 @@ describe('autocmd api', function() vim.cmd "set filetype=txt" return count - ]], {})) + ]], + {} + ) + ) end) it('properly releases functions with ++once', function() @@ -1030,82 +1174,86 @@ describe('autocmd api', function() command [[set filetype=txt]] eq(1, exec_lua([[return OnceCount]], {})) - eq(0, exec_lua([[ + eq( + 0, + exec_lua([[ local count = 0 for _ in pairs(WeakTable) do count = count + 1 end return count - ]]), "Should have no keys remaining") + ]]), + 'Should have no keys remaining' + ) end) it('groups can be cleared', function() - local augroup = "TestGroup" + local augroup = 'TestGroup' meths.create_augroup(augroup, { clear = true }) - meths.create_autocmd("FileType", { + meths.create_autocmd('FileType', { group = augroup, - command = "let g:executed = g:executed + 1" + command = 'let g:executed = g:executed + 1', }) - set_ft("txt") - set_ft("txt") - eq(2, get_executed_count(), "should only count twice") + set_ft('txt') + set_ft('txt') + eq(2, get_executed_count(), 'should only count twice') meths.create_augroup(augroup, { clear = true }) eq({}, meths.get_autocmds { group = augroup }) - set_ft("txt") - set_ft("txt") - eq(2, get_executed_count(), "No additional counts") + set_ft('txt') + set_ft('txt') + eq(2, get_executed_count(), 'No additional counts') end) it('can delete non-existent groups with pcall', function() - eq(false, exec_lua[[return pcall(vim.api.nvim_del_augroup_by_name, 'noexist')]]) + eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_name, 'noexist')]]) eq('Vim:E367: No such group: "noexist"', pcall_err(meths.del_augroup_by_name, 'noexist')) - eq(false, exec_lua[[return pcall(vim.api.nvim_del_augroup_by_id, -12342)]]) + eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_id, -12342)]]) eq('Vim:E367: No such group: "--Deleted--"', pcall_err(meths.del_augroup_by_id, -12312)) - eq(false, exec_lua[[return pcall(vim.api.nvim_del_augroup_by_id, 0)]]) + eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_id, 0)]]) eq('Vim:E367: No such group: "[NULL]"', pcall_err(meths.del_augroup_by_id, 0)) - eq(false, exec_lua[[return pcall(vim.api.nvim_del_augroup_by_id, 12342)]]) + eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_id, 12342)]]) eq('Vim:E367: No such group: "[NULL]"', pcall_err(meths.del_augroup_by_id, 12312)) end) it('groups work with once', function() - local augroup = "TestGroup" + local augroup = 'TestGroup' meths.create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup, once = true } - set_ft("txt") - set_ft("python") + set_ft('txt') + set_ft('python') eq(1, get_executed_count()) end) it('autocmds can be registered multiple times.', function() - local augroup = "TestGroup" + local augroup = 'TestGroup' meths.create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup, once = false } make_counting_autocmd { group = augroup, once = false } make_counting_autocmd { group = augroup, once = false } - set_ft("txt") - set_ft("python") + set_ft('txt') + set_ft('python') eq(3 * 2, get_executed_count()) end) it('can be deleted', function() - local augroup = "WillBeDeleted" + local augroup = 'WillBeDeleted' meths.create_augroup(augroup, { clear = true }) - meths.create_autocmd({"FileType"}, { - pattern = "*", + meths.create_autocmd({ 'FileType' }, { + pattern = '*', command = "echo 'does not matter'", }) @@ -1118,20 +1266,20 @@ describe('autocmd api', function() end) it('can be used for buffer local autocmds', function() - local augroup = "WillBeDeleted" + local augroup = 'WillBeDeleted' - meths.set_var("value_set", false) + meths.set_var('value_set', false) meths.create_augroup(augroup, { clear = true }) - meths.create_autocmd("FileType", { - pattern = "<buffer>", - command = "let g:value_set = v:true", + meths.create_autocmd('FileType', { + pattern = '<buffer>', + command = 'let g:value_set = v:true', }) - command "new" - command "set filetype=python" + command 'new' + command 'set filetype=python' - eq(false, meths.get_var("value_set")) + eq(false, meths.get_var('value_set')) end) it('can accept vimscript functions', function() @@ -1154,107 +1302,113 @@ describe('autocmd api', function() set filetype=txt ]] - eq(2, meths.get_var("vimscript_executed")) + eq(2, meths.get_var('vimscript_executed')) end) end) describe('augroup!', function() it('legacy: should clear and not return any autocmds for delete groups', function() - command('augroup TEMP_A') - command(' autocmd! BufReadPost *.py :echo "Hello"') - command('augroup END') + command('augroup TEMP_A') + command(' autocmd! BufReadPost *.py :echo "Hello"') + command('augroup END') - command('augroup! TEMP_A') + command('augroup! TEMP_A') - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_A' })) + eq(false, pcall(meths.get_autocmds, { group = 'TEMP_A' })) - -- For some reason, augroup! doesn't clear the autocmds themselves, which is just wild - -- but we managed to keep this behavior. - eq(1, #meths.get_autocmds { event = 'BufReadPost' }) + -- For some reason, augroup! doesn't clear the autocmds themselves, which is just wild + -- but we managed to keep this behavior. + eq(1, #meths.get_autocmds { event = 'BufReadPost' }) end) it('legacy: remove augroups that have no autocmds', function() - command('augroup TEMP_AB') - command('augroup END') + command('augroup TEMP_AB') + command('augroup END') - command('augroup! TEMP_AB') + command('augroup! TEMP_AB') - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_AB' })) - eq(0, #meths.get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(meths.get_autocmds, { group = 'TEMP_AB' })) + eq(0, #meths.get_autocmds { event = 'BufReadPost' }) end) it('legacy: multiple remove and add augroup', function() - command('augroup TEMP_ABC') - command(' au!') - command(' autocmd BufReadPost *.py echo "Hello"') - command('augroup END') + command('augroup TEMP_ABC') + command(' au!') + command(' autocmd BufReadPost *.py echo "Hello"') + command('augroup END') - command('augroup! TEMP_ABC') + command('augroup! TEMP_ABC') - -- Should still have one autocmd :'( - local aus = meths.get_autocmds { event = 'BufReadPost' } - eq(1, #aus, aus) + -- Should still have one autocmd :'( + local aus = meths.get_autocmds { event = 'BufReadPost' } + eq(1, #aus, aus) - command('augroup TEMP_ABC') - command(' au!') - command(' autocmd BufReadPost *.py echo "Hello"') - command('augroup END') + command('augroup TEMP_ABC') + command(' au!') + command(' autocmd BufReadPost *.py echo "Hello"') + command('augroup END') - -- Should now have two autocmds :'( - aus = meths.get_autocmds { event = 'BufReadPost' } - eq(2, #aus, aus) + -- Should now have two autocmds :'( + aus = meths.get_autocmds { event = 'BufReadPost' } + eq(2, #aus, aus) - command('augroup! TEMP_ABC') + command('augroup! TEMP_ABC') - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABC' })) - eq(2, #meths.get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABC' })) + eq(2, #meths.get_autocmds { event = 'BufReadPost' }) end) it('api: should clear and not return any autocmds for delete groups by id', function() - command('augroup TEMP_ABCD') - command('autocmd! BufReadPost *.py :echo "Hello"') - command('augroup END') + command('augroup TEMP_ABCD') + command('autocmd! BufReadPost *.py :echo "Hello"') + command('augroup END') - local augroup_id = meths.create_augroup("TEMP_ABCD", { clear = false }) - meths.del_augroup_by_id(augroup_id) + local augroup_id = meths.create_augroup('TEMP_ABCD', { clear = false }) + meths.del_augroup_by_id(augroup_id) - -- For good reason, we kill all the autocmds from del_augroup, - -- so now this works as expected - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABCD' })) - eq(0, #meths.get_autocmds { event = 'BufReadPost' }) + -- For good reason, we kill all the autocmds from del_augroup, + -- so now this works as expected + eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABCD' })) + eq(0, #meths.get_autocmds { event = 'BufReadPost' }) end) it('api: should clear and not return any autocmds for delete groups by name', function() - command('augroup TEMP_ABCDE') - command('autocmd! BufReadPost *.py :echo "Hello"') - command('augroup END') + command('augroup TEMP_ABCDE') + command('autocmd! BufReadPost *.py :echo "Hello"') + command('augroup END') - meths.del_augroup_by_name("TEMP_ABCDE") + meths.del_augroup_by_name('TEMP_ABCDE') - -- For good reason, we kill all the autocmds from del_augroup, - -- so now this works as expected - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABCDE' })) - eq(0, #meths.get_autocmds { event = 'BufReadPost' }) + -- For good reason, we kill all the autocmds from del_augroup, + -- so now this works as expected + eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABCDE' })) + eq(0, #meths.get_autocmds { event = 'BufReadPost' }) end) end) describe('nvim_clear_autocmds', function() it('validation', function() - eq("Cannot use both 'pattern' and 'buffer'", pcall_err(meths.clear_autocmds, { - pattern = '*', - buffer = 42, - })) - eq("Invalid 'event' item: expected String, got Array", pcall_err(meths.clear_autocmds, { - event = {'FileType', {}} - })) - eq("Invalid 'group': 0", pcall_err(meths.clear_autocmds, {group = 0})) + eq( + "Cannot use both 'pattern' and 'buffer'", + pcall_err(meths.clear_autocmds, { + pattern = '*', + buffer = 42, + }) + ) + eq( + "Invalid 'event' item: expected String, got Array", + pcall_err(meths.clear_autocmds, { + event = { 'FileType', {} }, + }) + ) + eq("Invalid 'group': 0", pcall_err(meths.clear_autocmds, { group = 0 })) end) it('should clear based on event + pattern', function() command('autocmd InsertEnter *.py :echo "Python can be cool sometimes"') command('autocmd InsertEnter *.txt :echo "Text Files Are Cool"') - local search = { event = "InsertEnter", pattern = "*.txt" } + local search = { event = 'InsertEnter', pattern = '*.txt' } local before_delete = meths.get_autocmds(search) eq(1, #before_delete) @@ -1273,7 +1427,7 @@ describe('autocmd api', function() command('autocmd InsertEnter *.py :echo "Python can be cool sometimes"') command('autocmd InsertEnter *.txt :echo "Text Files Are Cool"') - local search = { event = "InsertEnter"} + local search = { event = 'InsertEnter' } local before_delete = meths.get_autocmds(search) eq(2, #before_delete) @@ -1288,17 +1442,17 @@ describe('autocmd api', function() command('autocmd InsertEnter *.TestPat2 :echo "Enter 2"') command('autocmd InsertLeave *.TestPat2 :echo "Leave 2"') - local search = { pattern = "*.TestPat1"} + local search = { pattern = '*.TestPat1' } local before_delete = meths.get_autocmds(search) eq(2, #before_delete) - local before_delete_events = meths.get_autocmds { event = { "InsertEnter", "InsertLeave" } } + local before_delete_events = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(4, #before_delete_events) meths.clear_autocmds(search) local after_delete = meths.get_autocmds(search) eq(0, #after_delete) - local after_delete_events = meths.get_autocmds { event = { "InsertEnter", "InsertLeave" } } + local after_delete_events = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(2, #after_delete_events) end) @@ -1307,14 +1461,14 @@ describe('autocmd api', function() command('autocmd InsertEnter <buffer> :echo "Enter Buffer"') command('autocmd InsertEnter *.TestPat1 :echo "Enter Pattern"') - local search = { event = "InsertEnter" } + local search = { event = 'InsertEnter' } local before_delete = meths.get_autocmds(search) eq(2, #before_delete) meths.clear_autocmds { buffer = 0 } local after_delete = meths.get_autocmds(search) eq(1, #after_delete) - eq("*.TestPat1", after_delete[1].pattern) + eq('*.TestPat1', after_delete[1].pattern) end) it('should allow clearing by buffer and group', function() @@ -1324,7 +1478,7 @@ describe('autocmd api', function() command(' autocmd InsertEnter *.TestPat1 :echo "Enter Pattern"') command('augroup END') - local search = { event = "InsertEnter", group = "TestNvimClearAutocmds" } + local search = { event = 'InsertEnter', group = 'TestNvimClearAutocmds' } local before_delete = meths.get_autocmds(search) eq(2, #before_delete) diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index b89101a5e7..e8fff7443d 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -23,16 +23,15 @@ describe('api/buf', function() -- access deprecated functions local function curbuf_depr(method, ...) - return request('buffer_'..method, 0, ...) + return request('buffer_' .. method, 0, ...) end - describe('nvim_buf_set_lines, nvim_buf_line_count', function() it('deprecated forms', function() eq(1, curbuf_depr('line_count')) - curbuf_depr('insert', -1, {'line'}) + curbuf_depr('insert', -1, { 'line' }) eq(2, curbuf_depr('line_count')) - curbuf_depr('insert', -1, {'line'}) + curbuf_depr('insert', -1, { 'line' }) eq(3, curbuf_depr('line_count')) curbuf_depr('del_line', -1) eq(2, curbuf_depr('line_count')) @@ -45,88 +44,88 @@ describe('api/buf', function() it("doesn't crash just after set undolevels=1 #24894", function() local buf = meths.create_buf(false, true) meths.buf_set_option(buf, 'undolevels', -1) - meths.buf_set_lines(buf, 0, 1, false, { }) + meths.buf_set_lines(buf, 0, 1, false, {}) assert_alive() end) it('cursor position is maintained after lines are inserted #9961', function() -- replace the buffer contents with these three lines. - request('nvim_buf_set_lines', 0, 0, -1, 1, {"line1", "line2", "line3", "line4"}) + request('nvim_buf_set_lines', 0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) -- Set the current cursor to {3, 2}. - curwin('set_cursor', {3, 2}) + curwin('set_cursor', { 3, 2 }) -- add 2 lines and delete 1 line above the current cursor position. - request('nvim_buf_set_lines', 0, 1, 2, 1, {"line5", "line6"}) + request('nvim_buf_set_lines', 0, 1, 2, 1, { 'line5', 'line6' }) -- check the current set of lines in the buffer. - eq({"line1", "line5", "line6", "line3", "line4"}, buffer('get_lines', 0, 0, -1, 1)) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, buffer('get_lines', 0, 0, -1, 1)) -- cursor should be moved below by 1 line. - eq({4, 2}, curwin('get_cursor')) + eq({ 4, 2 }, curwin('get_cursor')) -- add a line after the current cursor position. - request('nvim_buf_set_lines', 0, 5, 5, 1, {"line7"}) + request('nvim_buf_set_lines', 0, 5, 5, 1, { 'line7' }) -- check the current set of lines in the buffer. - eq({"line1", "line5", "line6", "line3", "line4", "line7"}, buffer('get_lines', 0, 0, -1, 1)) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4', 'line7' }, buffer('get_lines', 0, 0, -1, 1)) -- cursor position is unchanged. - eq({4, 2}, curwin('get_cursor')) + eq({ 4, 2 }, curwin('get_cursor')) -- overwrite current cursor line. - request('nvim_buf_set_lines', 0, 3, 5, 1, {"line8", "line9"}) + request('nvim_buf_set_lines', 0, 3, 5, 1, { 'line8', 'line9' }) -- check the current set of lines in the buffer. - eq({"line1", "line5", "line6", "line8", "line9", "line7"}, buffer('get_lines', 0, 0, -1, 1)) + eq({ 'line1', 'line5', 'line6', 'line8', 'line9', 'line7' }, buffer('get_lines', 0, 0, -1, 1)) -- cursor position is unchanged. - eq({4, 2}, curwin('get_cursor')) + eq({ 4, 2 }, curwin('get_cursor')) -- delete current cursor line. request('nvim_buf_set_lines', 0, 3, 5, 1, {}) -- check the current set of lines in the buffer. - eq({"line1", "line5", "line6", "line7"}, buffer('get_lines', 0, 0, -1, 1)) + eq({ 'line1', 'line5', 'line6', 'line7' }, buffer('get_lines', 0, 0, -1, 1)) -- cursor position is unchanged. - eq({4, 2}, curwin('get_cursor')) + eq({ 4, 2 }, curwin('get_cursor')) end) it('cursor position is maintained in non-current window', function() - meths.buf_set_lines(0, 0, -1, 1, {"line1", "line2", "line3", "line4"}) - meths.win_set_cursor(0, {3, 2}) + meths.buf_set_lines(0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.win_set_cursor(0, { 3, 2 }) local win = meths.get_current_win() local buf = meths.get_current_buf() command('new') - meths.buf_set_lines(buf, 1, 2, 1, {"line5", "line6"}) - eq({"line1", "line5", "line6", "line3", "line4"}, meths.buf_get_lines(buf, 0, -1, true)) - eq({4, 2}, meths.win_get_cursor(win)) + meths.buf_set_lines(buf, 1, 2, 1, { 'line5', 'line6' }) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, meths.buf_get_lines(buf, 0, -1, true)) + eq({ 4, 2 }, meths.win_get_cursor(win)) end) it('cursor position is maintained in TWO non-current windows', function() - meths.buf_set_lines(0, 0, -1, 1, {"line1", "line2", "line3", "line4"}) - meths.win_set_cursor(0, {3, 2}) + meths.buf_set_lines(0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.win_set_cursor(0, { 3, 2 }) local win = meths.get_current_win() local buf = meths.get_current_buf() command('split') - meths.win_set_cursor(0, {4, 2}) + meths.win_set_cursor(0, { 4, 2 }) local win2 = meths.get_current_win() -- set current window to third one with another buffer - command("new") + command('new') - meths.buf_set_lines(buf, 1, 2, 1, {"line5", "line6"}) - eq({"line1", "line5", "line6", "line3", "line4"}, meths.buf_get_lines(buf, 0, -1, true)) - eq({4, 2}, meths.win_get_cursor(win)) - eq({5, 2}, meths.win_get_cursor(win2)) + meths.buf_set_lines(buf, 1, 2, 1, { 'line5', 'line6' }) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, meths.buf_get_lines(buf, 0, -1, true)) + eq({ 4, 2 }, meths.win_get_cursor(win)) + eq({ 5, 2 }, meths.win_get_cursor(win2)) end) it('line_count has defined behaviour for unloaded buffers', function() -- we'll need to know our bufnr for when it gets unloaded local bufnr = curbuf('get_number') -- replace the buffer contents with these three lines - request('nvim_buf_set_lines', bufnr, 0, -1, 1, {"line1", "line2", "line3", "line4"}) + request('nvim_buf_set_lines', bufnr, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) -- check the line count is correct eq(4, request('nvim_buf_line_count', bufnr)) -- force unload the buffer (this will discard changes) command('new') - command('bunload! '..bufnr) + command('bunload! ' .. bufnr) -- line count for an unloaded buffer should always be 0 eq(0, request('nvim_buf_line_count', bufnr)) end) @@ -135,12 +134,12 @@ describe('api/buf', function() -- we'll need to know our bufnr for when it gets unloaded local bufnr = curbuf('get_number') -- replace the buffer contents with these three lines - buffer('set_lines', bufnr, 0, -1, 1, {"line1", "line2", "line3", "line4"}) + buffer('set_lines', bufnr, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) -- confirm that getting lines works - eq({"line2", "line3"}, buffer('get_lines', bufnr, 1, 3, 1)) + eq({ 'line2', 'line3' }, buffer('get_lines', bufnr, 1, 3, 1)) -- force unload the buffer (this will discard changes) command('new') - command('bunload! '..bufnr) + command('bunload! ' .. bufnr) -- attempting to get lines now always gives empty list eq({}, buffer('get_lines', bufnr, 1, 3, 1)) -- it's impossible to get out-of-bounds errors for an unloaded buffer @@ -152,12 +151,12 @@ describe('api/buf', function() before_each(function() screen = Screen.new(20, 12) screen:set_default_attr_ids { - [1] = {bold = true, foreground = Screen.colors.Blue1}; - [2] = {reverse = true, bold = true}; - [3] = {reverse = true}; + [1] = { bold = true, foreground = Screen.colors.Blue1 }, + [2] = { reverse = true, bold = true }, + [3] = { reverse = true }, } screen:attach() - meths.buf_set_lines(0, 0, -1, 1, {"aaa", "bbb", "ccc", "ddd", "www", "xxx", "yyy", "zzz"}) + meths.buf_set_lines(0, 0, -1, 1, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' }) meths.set_option_value('modified', false, {}) end) @@ -166,9 +165,10 @@ describe('api/buf', function() local buf = meths.get_current_buf() command('new | wincmd w') - meths.win_set_cursor(win, {8,0}) + meths.win_set_cursor(win, { 8, 0 }) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -178,10 +178,12 @@ describe('api/buf', function() ^zzz | {2:[No Name] }| | - ]]} + ]], + } - meths.buf_set_lines(buf, 0, 2, true, {"aaabbb"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -191,11 +193,13 @@ describe('api/buf', function() ^zzz | {2:[No Name] [+] }| | - ]]} + ]], + } -- replacing topline keeps it the topline - meths.buf_set_lines(buf, 3, 4, true, {"wwweeee"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -205,11 +209,13 @@ describe('api/buf', function() ^zzz | {2:[No Name] [+] }| | - ]]} + ]], + } -- inserting just before topline does not scroll up if cursor would be moved - meths.buf_set_lines(buf, 3, 3, true, {"mmm"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 3, 3, true, { 'mmm' }) + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -219,10 +225,13 @@ describe('api/buf', function() ^zzz | {2:[No Name] [+] }| | - ]], unchanged=true} + ]], + unchanged = true, + } - meths.win_set_cursor(0, {7, 0}) - screen:expect{grid=[[ + meths.win_set_cursor(0, { 7, 0 }) + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -232,10 +241,12 @@ describe('api/buf', function() zzz | {2:[No Name] [+] }| | - ]]} + ]], + } - meths.buf_set_lines(buf, 4, 4, true, {"mmmeeeee"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 4, 4, true, { 'mmmeeeee' }) + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -245,7 +256,8 @@ describe('api/buf', function() ^yyy | {2:[No Name] [+] }| | - ]]} + ]], + } end) it('of non-current window', function() @@ -253,9 +265,10 @@ describe('api/buf', function() local buf = meths.get_current_buf() command('new') - meths.win_set_cursor(win, {8,0}) + meths.win_set_cursor(win, { 8, 0 }) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {1:~ }|*4 {2:[No Name] }| @@ -265,10 +278,12 @@ describe('api/buf', function() zzz | {3:[No Name] }| | - ]]} + ]], + } - meths.buf_set_lines(buf, 0, 2, true, {"aaabbb"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + screen:expect { + grid = [[ ^ | {1:~ }|*4 {2:[No Name] }| @@ -278,11 +293,13 @@ describe('api/buf', function() zzz | {3:[No Name] [+] }| | - ]]} + ]], + } -- replacing topline keeps it the topline - meths.buf_set_lines(buf, 3, 4, true, {"wwweeee"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + screen:expect { + grid = [[ ^ | {1:~ }|*4 {2:[No Name] }| @@ -292,11 +309,13 @@ describe('api/buf', function() zzz | {3:[No Name] [+] }| | - ]]} + ]], + } -- inserting just before topline scrolls up - meths.buf_set_lines(buf, 3, 3, true, {"mmm"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 3, 3, true, { 'mmm' }) + screen:expect { + grid = [[ ^ | {1:~ }|*4 {2:[No Name] }| @@ -306,7 +325,8 @@ describe('api/buf', function() yyy | {3:[No Name] [+] }| | - ]]} + ]], + } end) it('of split windows with same buffer', function() @@ -314,10 +334,11 @@ describe('api/buf', function() local buf = meths.get_current_buf() command('split') - meths.win_set_cursor(win, {8,0}) - meths.win_set_cursor(0, {1,0}) + meths.win_set_cursor(win, { 8, 0 }) + meths.win_set_cursor(0, { 1, 0 }) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^aaa | bbb | ccc | @@ -330,10 +351,12 @@ describe('api/buf', function() zzz | {3:[No Name] }| | - ]]} - meths.buf_set_lines(buf, 0, 2, true, {"aaabbb"}) + ]], + } + meths.buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^aaabbb | ccc | ddd | @@ -346,11 +369,13 @@ describe('api/buf', function() zzz | {3:[No Name] [+] }| | - ]]} + ]], + } -- replacing topline keeps it the topline - meths.buf_set_lines(buf, 3, 4, true, {"wwweeee"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + screen:expect { + grid = [[ ^aaabbb | ccc | ddd | @@ -363,11 +388,13 @@ describe('api/buf', function() zzz | {3:[No Name] [+] }| | - ]]} + ]], + } -- inserting just before topline scrolls up - meths.buf_set_lines(buf, 3, 3, true, {"mmm"}) - screen:expect{grid=[[ + meths.buf_set_lines(buf, 3, 3, true, { 'mmm' }) + screen:expect { + grid = [[ ^aaabbb | ccc | ddd | @@ -380,20 +407,21 @@ describe('api/buf', function() yyy | {3:[No Name] [+] }| | - ]]} + ]], + } end) end) it('handles clearing out non-current buffer #24911', function() - local buf = meths.get_current_buf() - meths.buf_set_lines(buf, 0, -1, true, {"aaa", "bbb", "ccc"}) - command("new") + local buf = meths.get_current_buf() + meths.buf_set_lines(buf, 0, -1, true, { 'aaa', 'bbb', 'ccc' }) + command('new') - meths.buf_set_lines(0, 0, -1, true, {"xxx", "yyy", "zzz"}) + meths.buf_set_lines(0, 0, -1, true, { 'xxx', 'yyy', 'zzz' }) - meths.buf_set_lines(buf, 0, -1, true, {}) - eq({"xxx", "yyy", "zzz"}, meths.buf_get_lines(0, 0, -1, true)) - eq({''}, meths.buf_get_lines(buf, 0, -1, true)) + meths.buf_set_lines(buf, 0, -1, true, {}) + eq({ 'xxx', 'yyy', 'zzz' }, meths.buf_get_lines(0, 0, -1, true)) + eq({ '' }, meths.buf_get_lines(buf, 0, -1, true)) end) end) @@ -431,8 +459,8 @@ describe('api/buf', function() describe('deprecated: {get,set}_line_slice', function() it('get_line_slice: out-of-bounds returns empty array', function() - curbuf_depr('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity + curbuf_depr('set_line_slice', 0, 0, true, true, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity eq({}, curbuf_depr('get_line_slice', 2, 3, false, true)) eq({}, curbuf_depr('get_line_slice', 3, 9, true, true)) @@ -442,37 +470,36 @@ describe('api/buf', function() end) it('set_line_slice: out-of-bounds extends past end', function() - curbuf_depr('set_line_slice', 0, 0, true, true, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity + curbuf_depr('set_line_slice', 0, 0, true, true, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, curbuf_depr('get_line_slice', 0, 2, true, true)) --sanity - eq({'c'}, curbuf_depr('get_line_slice', -1, 4, true, true)) - eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, 5, true, true)) - curbuf_depr('set_line_slice', 4, 5, true, true, {'d'}) - eq({'a', 'b', 'c', 'd'}, curbuf_depr('get_line_slice', 0, 5, true, true)) - curbuf_depr('set_line_slice', -4, -5, true, true, {'e'}) - eq({'e', 'a', 'b', 'c', 'd'}, curbuf_depr('get_line_slice', 0, 5, true, true)) + eq({ 'c' }, curbuf_depr('get_line_slice', -1, 4, true, true)) + eq({ 'a', 'b', 'c' }, curbuf_depr('get_line_slice', 0, 5, true, true)) + curbuf_depr('set_line_slice', 4, 5, true, true, { 'd' }) + eq({ 'a', 'b', 'c', 'd' }, curbuf_depr('get_line_slice', 0, 5, true, true)) + curbuf_depr('set_line_slice', -4, -5, true, true, { 'e' }) + eq({ 'e', 'a', 'b', 'c', 'd' }, curbuf_depr('get_line_slice', 0, 5, true, true)) end) it('works', function() - eq({''}, curbuf_depr('get_line_slice', 0, -1, true, true)) + eq({ '' }, curbuf_depr('get_line_slice', 0, -1, true, true)) -- Replace buffer - curbuf_depr('set_line_slice', 0, -1, true, true, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, -1, true, true)) - eq({'b', 'c'}, curbuf_depr('get_line_slice', 1, -1, true, true)) - eq({'b'}, curbuf_depr('get_line_slice', 1, 2, true, false)) + curbuf_depr('set_line_slice', 0, -1, true, true, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, curbuf_depr('get_line_slice', 0, -1, true, true)) + eq({ 'b', 'c' }, curbuf_depr('get_line_slice', 1, -1, true, true)) + eq({ 'b' }, curbuf_depr('get_line_slice', 1, 2, true, false)) eq({}, curbuf_depr('get_line_slice', 1, 1, true, false)) - eq({'a', 'b'}, curbuf_depr('get_line_slice', 0, -1, true, false)) - eq({'b'}, curbuf_depr('get_line_slice', 1, -1, true, false)) - eq({'b', 'c'}, curbuf_depr('get_line_slice', -2, -1, true, true)) - curbuf_depr('set_line_slice', 1, 2, true, false, {'a', 'b', 'c'}) - eq({'a', 'a', 'b', 'c', 'c'}, curbuf_depr('get_line_slice', 0, -1, true, true)) - curbuf_depr('set_line_slice', -1, -1, true, true, {'a', 'b', 'c'}) - eq({'a', 'a', 'b', 'c', 'a', 'b', 'c'}, - curbuf_depr('get_line_slice', 0, -1, true, true)) + eq({ 'a', 'b' }, curbuf_depr('get_line_slice', 0, -1, true, false)) + eq({ 'b' }, curbuf_depr('get_line_slice', 1, -1, true, false)) + eq({ 'b', 'c' }, curbuf_depr('get_line_slice', -2, -1, true, true)) + curbuf_depr('set_line_slice', 1, 2, true, false, { 'a', 'b', 'c' }) + eq({ 'a', 'a', 'b', 'c', 'c' }, curbuf_depr('get_line_slice', 0, -1, true, true)) + curbuf_depr('set_line_slice', -1, -1, true, true, { 'a', 'b', 'c' }) + eq({ 'a', 'a', 'b', 'c', 'a', 'b', 'c' }, curbuf_depr('get_line_slice', 0, -1, true, true)) curbuf_depr('set_line_slice', 0, -3, true, false, {}) - eq({'a', 'b', 'c'}, curbuf_depr('get_line_slice', 0, -1, true, true)) + eq({ 'a', 'b', 'c' }, curbuf_depr('get_line_slice', 0, -1, true, true)) curbuf_depr('set_line_slice', 0, -1, true, true, {}) - eq({''}, curbuf_depr('get_line_slice', 0, -1, true, true)) + eq({ '' }, curbuf_depr('get_line_slice', 0, -1, true, true)) end) end) @@ -483,21 +510,25 @@ describe('api/buf', function() it('fails correctly when input is not valid', function() eq(1, api.curbufmeths.get_number()) - eq([['replacement string' item contains newlines]], - pcall_err(bufmeths.set_lines, 1, 1, 2, false, {'b\na'})) + eq( + [['replacement string' item contains newlines]], + pcall_err(bufmeths.set_lines, 1, 1, 2, false, { 'b\na' }) + ) end) it("fails if 'nomodifiable'", function() command('set nomodifiable') - eq([[Buffer is not 'modifiable']], - pcall_err(api.bufmeths.set_lines, 1, 1, 2, false, {'a','b'})) + eq( + [[Buffer is not 'modifiable']], + pcall_err(api.bufmeths.set_lines, 1, 1, 2, false, { 'a', 'b' }) + ) end) it('has correct line_count when inserting and deleting', function() eq(1, line_count()) - set_lines(-1, -1, true, {'line'}) + set_lines(-1, -1, true, { 'line' }) eq(2, line_count()) - set_lines(-1, -1, true, {'line'}) + set_lines(-1, -1, true, { 'line' }) eq(3, line_count()) set_lines(-2, -1, true, {}) eq(2, line_count()) @@ -508,81 +539,80 @@ describe('api/buf', function() end) it('can get, set and delete a single line', function() - eq({''}, get_lines(0, 1, true)) - set_lines(0, 1, true, {'line1'}) - eq({'line1'}, get_lines(0, 1, true)) - set_lines(0, 1, true, {'line2'}) - eq({'line2'}, get_lines(0, 1, true)) + eq({ '' }, get_lines(0, 1, true)) + set_lines(0, 1, true, { 'line1' }) + eq({ 'line1' }, get_lines(0, 1, true)) + set_lines(0, 1, true, { 'line2' }) + eq({ 'line2' }, get_lines(0, 1, true)) set_lines(0, 1, true, {}) - eq({''}, get_lines(0, 1, true)) + eq({ '' }, get_lines(0, 1, true)) end) it('can get a single line with strict indexing', function() - set_lines(0, 1, true, {'line1.a'}) + set_lines(0, 1, true, { 'line1.a' }) eq(1, line_count()) -- sanity eq('Index out of bounds', pcall_err(get_lines, 1, 2, true)) eq('Index out of bounds', pcall_err(get_lines, -3, -2, true)) end) it('can get a single line with non-strict indexing', function() - set_lines(0, 1, true, {'line1.a'}) + set_lines(0, 1, true, { 'line1.a' }) eq(1, line_count()) -- sanity eq({}, get_lines(1, 2, false)) eq({}, get_lines(-3, -2, false)) end) it('can set and delete a single line with strict indexing', function() - set_lines(0, 1, true, {'line1.a'}) - eq('Index out of bounds', pcall_err(set_lines, 1, 2, true, {'line1.b'})) - eq('Index out of bounds', pcall_err(set_lines, -3, -2, true, {'line1.c'})) - eq({'line1.a'}, get_lines(0, -1, true)) + set_lines(0, 1, true, { 'line1.a' }) + eq('Index out of bounds', pcall_err(set_lines, 1, 2, true, { 'line1.b' })) + eq('Index out of bounds', pcall_err(set_lines, -3, -2, true, { 'line1.c' })) + eq({ 'line1.a' }, get_lines(0, -1, true)) eq('Index out of bounds', pcall_err(set_lines, 1, 2, true, {})) eq('Index out of bounds', pcall_err(set_lines, -3, -2, true, {})) - eq({'line1.a'}, get_lines(0, -1, true)) + eq({ 'line1.a' }, get_lines(0, -1, true)) end) it('can set and delete a single line with non-strict indexing', function() - set_lines(0, 1, true, {'line1.a'}) - set_lines(1, 2, false, {'line1.b'}) - set_lines(-4, -3, false, {'line1.c'}) - eq({'line1.c', 'line1.a', 'line1.b'}, get_lines(0, -1, true)) + set_lines(0, 1, true, { 'line1.a' }) + set_lines(1, 2, false, { 'line1.b' }) + set_lines(-4, -3, false, { 'line1.c' }) + eq({ 'line1.c', 'line1.a', 'line1.b' }, get_lines(0, -1, true)) set_lines(3, 4, false, {}) set_lines(-5, -4, false, {}) - eq({'line1.c', 'line1.a', 'line1.b'}, get_lines(0, -1, true)) + eq({ 'line1.c', 'line1.a', 'line1.b' }, get_lines(0, -1, true)) end) it('can handle NULs', function() - set_lines(0, 1, true, {'ab\0cd'}) - eq({'ab\0cd'}, get_lines(0, -1, true)) + set_lines(0, 1, true, { 'ab\0cd' }) + eq({ 'ab\0cd' }, get_lines(0, -1, true)) end) it('works with multiple lines', function() - eq({''}, get_lines(0, -1, true)) + eq({ '' }, get_lines(0, -1, true)) -- Replace buffer - for _, mode in pairs({false, true}) do - set_lines(0, -1, mode, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, get_lines(0, -1, mode)) - eq({'b', 'c'}, get_lines(1, -1, mode)) - eq({'b'}, get_lines(1, 2, mode)) + for _, mode in pairs({ false, true }) do + set_lines(0, -1, mode, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, get_lines(0, -1, mode)) + eq({ 'b', 'c' }, get_lines(1, -1, mode)) + eq({ 'b' }, get_lines(1, 2, mode)) eq({}, get_lines(1, 1, mode)) - eq({'a', 'b'}, get_lines(0, -2, mode)) - eq({'b'}, get_lines(1, -2, mode)) - eq({'b', 'c'}, get_lines(-3, -1, mode)) - set_lines(1, 2, mode, {'a', 'b', 'c'}) - eq({'a', 'a', 'b', 'c', 'c'}, get_lines(0, -1, mode)) - set_lines(-2, -1, mode, {'a', 'b', 'c'}) - eq({'a', 'a', 'b', 'c', 'a', 'b', 'c'}, - get_lines(0, -1, mode)) + eq({ 'a', 'b' }, get_lines(0, -2, mode)) + eq({ 'b' }, get_lines(1, -2, mode)) + eq({ 'b', 'c' }, get_lines(-3, -1, mode)) + set_lines(1, 2, mode, { 'a', 'b', 'c' }) + eq({ 'a', 'a', 'b', 'c', 'c' }, get_lines(0, -1, mode)) + set_lines(-2, -1, mode, { 'a', 'b', 'c' }) + eq({ 'a', 'a', 'b', 'c', 'a', 'b', 'c' }, get_lines(0, -1, mode)) set_lines(0, -4, mode, {}) - eq({'a', 'b', 'c'}, get_lines(0, -1, mode)) + eq({ 'a', 'b', 'c' }, get_lines(0, -1, mode)) set_lines(0, -1, mode, {}) - eq({''}, get_lines(0, -1, mode)) + eq({ '' }, get_lines(0, -1, mode)) end end) it('can get line ranges with non-strict indexing', function() - set_lines(0, -1, true, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, get_lines(0, -1, true)) --sanity + set_lines(0, -1, true, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, get_lines(0, -1, true)) --sanity eq({}, get_lines(3, 4, false)) eq({}, get_lines(3, 10, false)) @@ -592,8 +622,8 @@ describe('api/buf', function() end) it('can get line ranges with strict indexing', function() - set_lines(0, -1, true, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, get_lines(0, -1, true)) --sanity + set_lines(0, -1, true, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, get_lines(0, -1, true)) --sanity eq('Index out of bounds', pcall_err(get_lines, 3, 4, true)) eq('Index out of bounds', pcall_err(get_lines, 3, 10, true)) @@ -604,20 +634,20 @@ describe('api/buf', function() end) it('set_lines: out-of-bounds can extend past end', function() - set_lines(0, -1, true, {'a', 'b', 'c'}) - eq({'a', 'b', 'c'}, get_lines(0, -1, true)) --sanity + set_lines(0, -1, true, { 'a', 'b', 'c' }) + eq({ 'a', 'b', 'c' }, get_lines(0, -1, true)) --sanity - eq({'c'}, get_lines(-2, 5, false)) - eq({'a', 'b', 'c'}, get_lines(0, 6, false)) - eq('Index out of bounds', pcall_err(set_lines, 4, 6, true, {'d'})) - set_lines(4, 6, false, {'d'}) - eq({'a', 'b', 'c', 'd'}, get_lines(0, -1, true)) - eq('Index out of bounds', pcall_err(set_lines, -6, -6, true, {'e'})) - set_lines(-6, -6, false, {'e'}) - eq({'e', 'a', 'b', 'c', 'd'}, get_lines(0, -1, true)) + eq({ 'c' }, get_lines(-2, 5, false)) + eq({ 'a', 'b', 'c' }, get_lines(0, 6, false)) + eq('Index out of bounds', pcall_err(set_lines, 4, 6, true, { 'd' })) + set_lines(4, 6, false, { 'd' }) + eq({ 'a', 'b', 'c', 'd' }, get_lines(0, -1, true)) + eq('Index out of bounds', pcall_err(set_lines, -6, -6, true, { 'e' })) + set_lines(-6, -6, false, { 'e' }) + eq({ 'e', 'a', 'b', 'c', 'd' }, get_lines(0, -1, true)) end) - it("set_lines on alternate buffer does not access invalid line (E315)", function() + it('set_lines on alternate buffer does not access invalid line (E315)', function() feed_command('set hidden') insert('Initial file') command('enew') @@ -637,8 +667,8 @@ describe('api/buf', function() it("set_lines of invisible buffer doesn't move cursor in current window", function() local screen = Screen.new(20, 5) screen:set_default_attr_ids({ - [1] = {bold = true, foreground = Screen.colors.Blue1}, - [2] = {bold = true}, + [1] = { bold = true, foreground = Screen.colors.Blue1 }, + [2] = { bold = true }, }) screen:attach() @@ -646,7 +676,7 @@ describe('api/buf', function() Who would win? A real window with proper text]]) - local buf = api.meths.create_buf(false,true) + local buf = api.meths.create_buf(false, true) screen:expect([[ Who would win? | A real window | @@ -655,7 +685,7 @@ describe('api/buf', function() | ]]) - api.meths.buf_set_lines(buf, 0, -1, true, {'or some', 'scratchy text'}) + api.meths.buf_set_lines(buf, 0, -1, true, { 'or some', 'scratchy text' }) feed('i') -- provoke redraw screen:expect([[ Who would win? | @@ -671,32 +701,31 @@ describe('api/buf', function() visible buffer line 1 line 2 ]]) - local hiddenbuf = api.meths.create_buf(false,true) + local hiddenbuf = api.meths.create_buf(false, true) command('vsplit') command('vsplit') feed('<c-w>l<c-w>l<c-w>l') eq(3, funcs.winnr()) feed('<c-w>h') eq(2, funcs.winnr()) - api.meths.buf_set_lines(hiddenbuf, 0, -1, true, - {'hidden buffer line 1', 'line 2'}) + api.meths.buf_set_lines(hiddenbuf, 0, -1, true, { 'hidden buffer line 1', 'line 2' }) feed('<c-w>p') eq(3, funcs.winnr()) end) it('set_lines on unloaded buffer #8659 #22670', function() local bufnr = curbuf('get_number') - meths.buf_set_lines(bufnr, 0, -1, false, {'a', 'b', 'c'}) + meths.buf_set_lines(bufnr, 0, -1, false, { 'a', 'b', 'c' }) meths.buf_set_name(bufnr, 'set_lines') finally(function() os.remove('set_lines') end) command('write!') command('new') - command('bunload! '..bufnr) + command('bunload! ' .. bufnr) local new_bufnr = funcs.bufnr('set_lines', true) meths.buf_set_lines(new_bufnr, 0, -1, false, {}) - eq({''}, meths.buf_get_lines(new_bufnr, 0, -1, false)) + eq({ '' }, meths.buf_get_lines(new_bufnr, 0, -1, false)) end) end) @@ -709,70 +738,69 @@ describe('api/buf', function() text ]]) - eq({'hello foo!'}, get_lines(0, 1, true)) - + eq({ 'hello foo!' }, get_lines(0, 1, true)) -- can replace a single word - set_text(0, 6, 0, 9, {'world'}) - eq({'hello world!', 'text'}, get_lines(0, 2, true)) + set_text(0, 6, 0, 9, { 'world' }) + eq({ 'hello world!', 'text' }, get_lines(0, 2, true)) -- can insert text - set_text(0, 0, 0, 0, {'well '}) - eq({'well hello world!', 'text'}, get_lines(0, 2, true)) + set_text(0, 0, 0, 0, { 'well ' }) + eq({ 'well hello world!', 'text' }, get_lines(0, 2, true)) -- can delete text - set_text(0, 0, 0, 5, {''}) - eq({'hello world!', 'text'}, get_lines(0, 2, true)) + set_text(0, 0, 0, 5, { '' }) + eq({ 'hello world!', 'text' }, get_lines(0, 2, true)) -- can replace with multiple lines - set_text(0, 6, 0, 11, {'foo', 'wo', 'more'}) - eq({'hello foo', 'wo', 'more!', 'text'}, get_lines(0, 4, true)) + set_text(0, 6, 0, 11, { 'foo', 'wo', 'more' }) + eq({ 'hello foo', 'wo', 'more!', 'text' }, get_lines(0, 4, true)) -- will join multiple lines if needed - set_text(0, 6, 3, 4, {'bar'}) - eq({'hello bar'}, get_lines(0, 1, true)) + set_text(0, 6, 3, 4, { 'bar' }) + eq({ 'hello bar' }, get_lines(0, 1, true)) -- can use negative line numbers - set_text(-2, 0, -2, 5, {'goodbye'}) - eq({'goodbye bar', ''}, get_lines(0, -1, true)) + set_text(-2, 0, -2, 5, { 'goodbye' }) + eq({ 'goodbye bar', '' }, get_lines(0, -1, true)) - set_text(-1, 0, -1, 0, {'text'}) - eq({'goodbye bar', 'text'}, get_lines(0, 2, true)) + set_text(-1, 0, -1, 0, { 'text' }) + eq({ 'goodbye bar', 'text' }, get_lines(0, 2, true)) -- can append to a line - set_text(1, 4, -1, 4, {' and', 'more'}) - eq({'goodbye bar', 'text and', 'more'}, get_lines(0, 3, true)) + set_text(1, 4, -1, 4, { ' and', 'more' }) + eq({ 'goodbye bar', 'text and', 'more' }, get_lines(0, 3, true)) -- can use negative column numbers - set_text(0, -5, 0, -1, {'!'}) - eq({'goodbye!'}, get_lines(0, 1, true)) + set_text(0, -5, 0, -1, { '!' }) + eq({ 'goodbye!' }, get_lines(0, 1, true)) end) it('works with undo', function() - insert([[ + insert([[ hello world! foo bar ]]) - -- setting text - set_text(0, 0, 0, 0, {'well '}) - feed('u') - eq({'hello world!'}, get_lines(0, 1, true)) + -- setting text + set_text(0, 0, 0, 0, { 'well ' }) + feed('u') + eq({ 'hello world!' }, get_lines(0, 1, true)) - -- deleting text - set_text(0, 0, 0, 6, {''}) - feed('u') - eq({'hello world!'}, get_lines(0, 1, true)) + -- deleting text + set_text(0, 0, 0, 6, { '' }) + feed('u') + eq({ 'hello world!' }, get_lines(0, 1, true)) - -- inserting newlines - set_text(0, 0, 0, 0, {'hello', 'mr '}) - feed('u') - eq({'hello world!'}, get_lines(0, 1, true)) + -- inserting newlines + set_text(0, 0, 0, 0, { 'hello', 'mr ' }) + feed('u') + eq({ 'hello world!' }, get_lines(0, 1, true)) - -- deleting newlines - set_text(0, 0, 1, 4, {'hello'}) - feed('u') - eq({'hello world!'}, get_lines(0, 1, true)) + -- deleting newlines + set_text(0, 0, 1, 4, { 'hello' }) + feed('u') + eq({ 'hello world!' }, get_lines(0, 1, true)) end) it('updates the cursor position', function() @@ -781,12 +809,12 @@ describe('api/buf', function() ]]) -- position the cursor on `!` - curwin('set_cursor', {1, 11}) + curwin('set_cursor', { 1, 11 }) -- replace 'world' with 'foo' - set_text(0, 6, 0, 11, {'foo'}) + set_text(0, 6, 0, 11, { 'foo' }) eq('hello foo!', curbuf_depr('get_line', 0)) -- cursor should be moved left by two columns (replacement is shorter by 2 chars) - eq({1, 9}, curwin('get_cursor')) + eq({ 1, 9 }, curwin('get_cursor')) end) it('updates the cursor position in non-current window', function() @@ -794,18 +822,18 @@ describe('api/buf', function() hello world!]]) -- position the cursor on `!` - meths.win_set_cursor(0, {1, 11}) + meths.win_set_cursor(0, { 1, 11 }) local win = meths.get_current_win() local buf = meths.get_current_buf() - command("new") + command('new') -- replace 'world' with 'foo' - meths.buf_set_text(buf, 0, 6, 0, 11, {'foo'}) - eq({'hello foo!'}, meths.buf_get_lines(buf, 0, -1, true)) + meths.buf_set_text(buf, 0, 6, 0, 11, { 'foo' }) + eq({ 'hello foo!' }, meths.buf_get_lines(buf, 0, -1, true)) -- cursor should be moved left by two columns (replacement is shorter by 2 chars) - eq({1, 9}, meths.win_get_cursor(win)) + eq({ 1, 9 }, meths.win_get_cursor(win)) end) it('updates the cursor position in TWO non-current windows', function() @@ -813,24 +841,24 @@ describe('api/buf', function() hello world!]]) -- position the cursor on `!` - meths.win_set_cursor(0, {1, 11}) + meths.win_set_cursor(0, { 1, 11 }) local win = meths.get_current_win() local buf = meths.get_current_buf() - command("split") + command('split') local win2 = meths.get_current_win() -- position the cursor on `w` - meths.win_set_cursor(0, {1, 6}) + meths.win_set_cursor(0, { 1, 6 }) - command("new") + command('new') -- replace 'hello' with 'foo' - meths.buf_set_text(buf, 0, 0, 0, 5, {'foo'}) - eq({'foo world!'}, meths.buf_get_lines(buf, 0, -1, true)) + meths.buf_set_text(buf, 0, 0, 0, 5, { 'foo' }) + eq({ 'foo world!' }, meths.buf_get_lines(buf, 0, -1, true)) -- both cursors should be moved left by two columns (replacement is shorter by 2 chars) - eq({1, 9}, meths.win_get_cursor(win)) - eq({1, 4}, meths.win_get_cursor(win2)) + eq({ 1, 9 }, meths.win_get_cursor(win)) + eq({ 1, 4 }, meths.win_get_cursor(win2)) end) describe('when text is being added right at cursor position #22526', function() @@ -839,12 +867,12 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'c' - curwin('set_cursor', {1, 2}) + curwin('set_cursor', { 1, 2 }) -- add 'xxx' before 'c' - set_text(0, 2, 0, 2, {'xxx'}) - eq({'abxxxcd'}, get_lines(0, -1, true)) + set_text(0, 2, 0, 2, { 'xxx' }) + eq({ 'abxxxcd' }, get_lines(0, -1, true)) -- cursor should be on 'c' - eq({1, 5}, curwin('get_cursor')) + eq({ 1, 5 }, curwin('get_cursor')) end) it('updates the cursor position only in non-current window when in INSERT mode', function() @@ -852,23 +880,23 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'c' - curwin('set_cursor', {1, 2}) + curwin('set_cursor', { 1, 2 }) -- open vertical split feed('<c-w>v') -- get into INSERT mode to treat cursor -- as being after 'b', not on 'c' feed('i') -- add 'xxx' between 'b' and 'c' - set_text(0, 2, 0, 2, {'xxx'}) - eq({'abxxxcd'}, get_lines(0, -1, true)) + set_text(0, 2, 0, 2, { 'xxx' }) + eq({ 'abxxxcd' }, get_lines(0, -1, true)) -- in the current window cursor should stay after 'b' - eq({1, 2}, curwin('get_cursor')) + eq({ 1, 2 }, curwin('get_cursor')) -- quit INSERT mode feed('<esc>') -- close current window feed('<c-w>c') -- in another window cursor should be on 'c' - eq({1, 5}, curwin('get_cursor')) + eq({ 1, 5 }, curwin('get_cursor')) end) end) @@ -878,20 +906,20 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'b' - curwin('set_cursor', {1, 1}) + curwin('set_cursor', { 1, 1 }) -- delete 'b' set_text(0, 1, 0, 2, {}) - eq({'acd'}, get_lines(0, -1, true)) + eq({ 'acd' }, get_lines(0, -1, true)) -- cursor is now on 'c' - eq({1, 1}, curwin('get_cursor')) + eq({ 1, 1 }, curwin('get_cursor')) end) - it('leaves cursor at the same position in INSERT mode in current and non-current window', function() + it('maintains INSERT-mode cursor position current/non-current window', function() insert([[ abcd]]) -- position the cursor on 'b' - curwin('set_cursor', {1, 1}) + curwin('set_cursor', { 1, 1 }) -- open vertical split feed('<c-w>v') -- get into INSERT mode to treat cursor @@ -899,27 +927,27 @@ describe('api/buf', function() feed('i') -- delete 'b' set_text(0, 1, 0, 2, {}) - eq({'acd'}, get_lines(0, -1, true)) + eq({ 'acd' }, get_lines(0, -1, true)) -- cursor in the current window should stay after 'a' - eq({1, 1}, curwin('get_cursor')) + eq({ 1, 1 }, curwin('get_cursor')) -- quit INSERT mode feed('<esc>') -- close current window feed('<c-w>c') -- cursor in non-current window should stay on 'c' - eq({1, 1}, curwin('get_cursor')) + eq({ 1, 1 }, curwin('get_cursor')) end) end) describe('when cursor is inside replaced row range', function() - it('keeps cursor at the same position if cursor is at start_row, but before start_col', function() + it('maintains cursor position if at start_row, but before start_col', function() insert([[ This should be first then there is a line we do not want and finally the last one]]) -- position the cursor on ' ' before 'first' - curwin('set_cursor', {1, 14}) + curwin('set_cursor', { 1, 14 }) set_text(0, 15, 2, 11, { 'the line we do not want', @@ -931,17 +959,17 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay at the same position - eq({1, 14}, curwin('get_cursor')) + eq({ 1, 14 }, curwin('get_cursor')) end) - it('keeps cursor at the same position if cursor is at start_row and column is still valid', function() + it('maintains cursor position if at start_row and column is still valid', function() insert([[ This should be first then there is a line we do not want and finally the last one]]) -- position the cursor on 'f' in 'first' - curwin('set_cursor', {1, 15}) + curwin('set_cursor', { 1, 15 }) set_text(0, 15, 2, 11, { 'the line we do not want', @@ -953,7 +981,7 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay at the same position - eq({1, 15}, curwin('get_cursor')) + eq({ 1, 15 }, curwin('get_cursor')) end) it('adjusts cursor column to keep it valid if start_row got smaller', function() @@ -963,7 +991,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 't' in 'first' - curwin('set_cursor', {1, 19}) + curwin('set_cursor', { 1, 19 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 24, {'last'}) @@ -972,19 +1000,19 @@ describe('api/buf', function() eq({ 'This should be last' }, get_lines(0, -1, true)) -- cursor should end up on 't' in 'last' - eq({1, 18}, curwin('get_cursor')) + eq({ 1, 18 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 18}, cursor) + eq({ 1, 18 }, cursor) end) - it('adjusts cursor column to keep it valid if start_row got smaller in INSERT mode', function() + it('adjusts cursor column to keep it valid if start_row decreased in INSERT mode', function() insert([[ This should be first then there is a line we do not want and finally the last one]]) -- position the cursor on 't' in 'first' - curwin('set_cursor', {1, 19}) + curwin('set_cursor', { 1, 19 }) -- enter INSERT mode to treat cursor as being after 't' feed('a') @@ -995,19 +1023,19 @@ describe('api/buf', function() eq({ 'This should be last' }, get_lines(0, -1, true)) -- cursor should end up after 't' in 'last' - eq({1, 19}, curwin('get_cursor')) + eq({ 1, 19 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 19}, cursor) + eq({ 1, 19 }, cursor) end) - it('adjusts cursor column to keep it valid in a row after start_row if it got smaller', function() + it('adjusts cursor to valid column in row after start_row if it got smaller', function() insert([[ This should be first then there is a line we do not want and finally the last one]]) -- position the cursor on 'w' in 'want' - curwin('set_cursor', {2, 31}) + curwin('set_cursor', { 2, 31 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { @@ -1024,23 +1052,25 @@ describe('api/buf', function() 'and then the last one', }, get_lines(0, -1, true)) -- cursor column should end up at the end of a row - eq({2, 5}, curwin('get_cursor')) + eq({ 2, 5 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({2, 5}, cursor) + eq({ 2, 5 }, cursor) end) - it('adjusts cursor column to keep it valid in a row after start_row if it got smaller in INSERT mode', function() - insert([[ + it( + 'adjusts cursor to valid column in row after start_row if it got smaller in INSERT mode', + function() + insert([[ This should be first then there is a line we do not want and finally the last one]]) - -- position the cursor on 'w' in 'want' - curwin('set_cursor', {2, 31}) - -- enter INSERT mode - feed('a') + -- position the cursor on 'w' in 'want' + curwin('set_cursor', { 2, 31 }) + -- enter INSERT mode + feed('a') - local cursor = exec_lua([[ + local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { '1', 'then 2', @@ -1049,16 +1079,17 @@ describe('api/buf', function() return vim.api.nvim_win_get_cursor(0) ]]) - eq({ - 'This should be 1', - 'then 2', - 'and then the last one', - }, get_lines(0, -1, true)) - -- cursor column should end up at the end of a row - eq({2, 6}, curwin('get_cursor')) - -- immediate call to nvim_win_get_cursor should have returned the same position - eq({2, 6}, cursor) - end) + eq({ + 'This should be 1', + 'then 2', + 'and then the last one', + }, get_lines(0, -1, true)) + -- cursor column should end up at the end of a row + eq({ 2, 6 }, curwin('get_cursor')) + -- immediate call to nvim_win_get_cursor should have returned the same position + eq({ 2, 6 }, cursor) + end + ) it('adjusts cursor line and column to keep it inside replacement range', function() insert([[ @@ -1067,7 +1098,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'n' in 'finally' - curwin('set_cursor', {3, 6}) + curwin('set_cursor', { 3, 6 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { @@ -1083,9 +1114,9 @@ describe('api/buf', function() }, get_lines(0, -1, true)) -- cursor should end up on 'y' in 'hopefully' -- to stay in the range, because it got smaller - eq({2, 12}, curwin('get_cursor')) + eq({ 2, 12 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({2, 12}, cursor) + eq({ 2, 12 }, cursor) end) it('adjusts cursor line and column if replacement is empty', function() @@ -1095,7 +1126,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'r' in 'there' - curwin('set_cursor', {2, 8}) + curwin('set_cursor', { 2, 8 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 12, {}) @@ -1104,9 +1135,9 @@ describe('api/buf', function() eq({ 'This should be the last one' }, get_lines(0, -1, true)) -- cursor should end up on the next column after deleted range - eq({1, 15}, curwin('get_cursor')) + eq({ 1, 15 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 15}, cursor) + eq({ 1, 15 }, cursor) end) it('adjusts cursor line and column if replacement is empty and start_col == 0', function() @@ -1116,7 +1147,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'r' in 'there' - curwin('set_cursor', {2, 8}) + curwin('set_cursor', { 2, 8 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 2, 4, {}) @@ -1125,9 +1156,9 @@ describe('api/buf', function() eq({ 'finally the last one' }, get_lines(0, -1, true)) -- cursor should end up in column 0 - eq({1, 0}, curwin('get_cursor')) + eq({ 1, 0 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 0}, cursor) + eq({ 1, 0 }, cursor) end) it('adjusts cursor column if replacement ends at cursor row, after cursor column', function() @@ -1137,7 +1168,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' in 'finally' - curwin('set_cursor', {3, 10}) + curwin('set_cursor', { 3, 10 }) set_text(0, 15, 2, 11, { '1', 'this 2', 'and then' }) eq({ @@ -1146,29 +1177,32 @@ describe('api/buf', function() 'and then the last one', }, get_lines(0, -1, true)) -- cursor should end up on 'n' in 'then' - eq({3, 7}, curwin('get_cursor')) + eq({ 3, 7 }, curwin('get_cursor')) end) - it('adjusts cursor column if replacement ends at cursor row, at cursor column in INSERT mode', function() - insert([[ + it( + 'adjusts cursor column if replacement ends at cursor row, at cursor column in INSERT mode', + function() + insert([[ This should be first then there is a line we do not want and finally the last one]]) - -- position the cursor on 'y' at 'finally' - curwin('set_cursor', {3, 10}) - -- enter INSERT mode to treat cursor as being between 'l' and 'y' - feed('i') - set_text(0, 15, 2, 11, { '1', 'this 2', 'and then' }) + -- position the cursor on 'y' at 'finally' + curwin('set_cursor', { 3, 10 }) + -- enter INSERT mode to treat cursor as being between 'l' and 'y' + feed('i') + set_text(0, 15, 2, 11, { '1', 'this 2', 'and then' }) - eq({ - 'This should be 1', - 'this 2', - 'and then the last one', - }, get_lines(0, -1, true)) - -- cursor should end up after 'n' in 'then' - eq({3, 8}, curwin('get_cursor')) - end) + eq({ + 'This should be 1', + 'this 2', + 'and then the last one', + }, get_lines(0, -1, true)) + -- cursor should end up after 'n' in 'then' + eq({ 3, 8 }, curwin('get_cursor')) + end + ) it('adjusts cursor column if replacement is inside of a single line', function() insert([[ @@ -1177,7 +1211,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' in 'finally' - curwin('set_cursor', {3, 10}) + curwin('set_cursor', { 3, 10 }) set_text(2, 4, 2, 11, { 'then' }) eq({ @@ -1186,7 +1220,7 @@ describe('api/buf', function() 'and then the last one', }, get_lines(0, -1, true)) -- cursor should end up on 'n' in 'then' - eq({3, 7}, curwin('get_cursor')) + eq({ 3, 7 }, curwin('get_cursor')) end) it('does not move cursor column after end of a line', function() @@ -1195,7 +1229,7 @@ describe('api/buf', function() !!!]]) -- position cursor on the last '1' - curwin('set_cursor', {2, 2}) + curwin('set_cursor', { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 33, 1, 3, {}) @@ -1204,16 +1238,16 @@ describe('api/buf', function() eq({ 'This should be the only line here' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({1, 32}, curwin('get_cursor')) + eq({ 1, 32 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 32}, cursor) + eq({ 1, 32 }, cursor) end) it('does not move cursor column before start of a line', function() insert('\n!!!') -- position cursor on the last '1' - curwin('set_cursor', {2, 2}) + curwin('set_cursor', { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 1, 3, {}) @@ -1222,20 +1256,20 @@ describe('api/buf', function() eq({ '' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({1, 0}, curwin('get_cursor')) + eq({ 1, 0 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 0}, cursor) + eq({ 1, 0 }, cursor) end) describe('with virtualedit', function() - it('adjusts cursor line and column to keep it inside replacement range if cursor is not after eol', function() + it('adjusts cursor line/col to keep inside replacement range if not after eol', function() insert([[ This should be first then there is a line we do not want and finally the last one]]) -- position cursor on 't' in 'want' - curwin('set_cursor', {2, 34}) + curwin('set_cursor', { 2, 34 }) -- turn on virtualedit command('set virtualedit=all') @@ -1253,23 +1287,26 @@ describe('api/buf', function() }, get_lines(0, -1, true)) -- cursor should end up on 'y' in 'hopefully' -- to stay in the range - eq({2, 12}, curwin('get_cursor')) + eq({ 2, 12 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({2, 12}, cursor) + eq({ 2, 12 }, cursor) -- coladd should be 0 - eq(0, exec_lua([[ + eq( + 0, + exec_lua([[ return vim.fn.winsaveview().coladd - ]])) + ]]) + ) end) - it('does not change cursor screen column when cursor is after eol and row got shorter', function() + it('does not change cursor screen column when cursor >EOL and row got shorter', function() insert([[ This should be first then there is a line we do not want and finally the last one]]) -- position cursor on 't' in 'want' - curwin('set_cursor', {2, 34}) + curwin('set_cursor', { 2, 34 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1290,31 +1327,36 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should end up at eol of a new row - eq({2, 26}, curwin('get_cursor')) + eq({ 2, 26 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({2, 26}, cursor) + eq({ 2, 26 }, cursor) -- coladd should be increased so that cursor stays in the same screen column - eq(13, exec_lua([[ + eq( + 13, + exec_lua([[ return vim.fn.winsaveview().coladd - ]])) + ]]) + ) end) - it('does not change cursor screen column when cursor is after eol and row got longer', function() - insert([[ + it( + 'does not change cursor screen column when cursor is after eol and row got longer', + function() + insert([[ This should be first then there is a line we do not want and finally the last one]]) - -- position cursor on 't' in 'first' - curwin('set_cursor', {1, 19}) - -- turn on virtualedit - command('set virtualedit=all') - -- move cursor after eol - exec_lua([[ + -- position cursor on 't' in 'first' + curwin('set_cursor', { 1, 19 }) + -- turn on virtualedit + command('set virtualedit=all') + -- move cursor after eol + exec_lua([[ vim.fn.winrestview({ coladd = 21 }) ]]) - local cursor = exec_lua([[ + local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { 'the line we do not want', 'but hopefully', @@ -1322,36 +1364,42 @@ describe('api/buf', function() return vim.api.nvim_win_get_cursor(0) ]]) - eq({ - 'This should be the line we do not want', - 'but hopefully the last one', - }, get_lines(0, -1, true)) - -- cursor should end up at eol of a new row - eq({1, 38}, curwin('get_cursor')) - -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 38}, cursor) - -- coladd should be increased so that cursor stays in the same screen column - eq(2, exec_lua([[ + eq({ + 'This should be the line we do not want', + 'but hopefully the last one', + }, get_lines(0, -1, true)) + -- cursor should end up at eol of a new row + eq({ 1, 38 }, curwin('get_cursor')) + -- immediate call to nvim_win_get_cursor should have returned the same position + eq({ 1, 38 }, cursor) + -- coladd should be increased so that cursor stays in the same screen column + eq( + 2, + exec_lua([[ return vim.fn.winsaveview().coladd - ]])) - end) - - it('does not change cursor screen column when cursor is after eol and row extended past cursor column', function() - insert([[ + ]]) + ) + end + ) + + it( + 'does not change cursor screen column when cursor is after eol and row extended past cursor column', + function() + insert([[ This should be first then there is a line we do not want and finally the last one]]) - -- position cursor on 't' in 'first' - curwin('set_cursor', {1, 19}) - -- turn on virtualedit - command('set virtualedit=all') - -- move cursor after eol just a bit - exec_lua([[ + -- position cursor on 't' in 'first' + curwin('set_cursor', { 1, 19 }) + -- turn on virtualedit + command('set virtualedit=all') + -- move cursor after eol just a bit + exec_lua([[ vim.fn.winrestview({ coladd = 3 }) ]]) - local cursor = exec_lua([[ + local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { 'the line we do not want', 'but hopefully', @@ -1359,37 +1407,43 @@ describe('api/buf', function() return vim.api.nvim_win_get_cursor(0) ]]) - eq({ - 'This should be the line we do not want', - 'but hopefully the last one', - }, get_lines(0, -1, true)) - -- cursor should stay at the same screen column - eq({1, 22}, curwin('get_cursor')) - -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 22}, cursor) - -- coladd should become 0 - eq(0, exec_lua([[ + eq({ + 'This should be the line we do not want', + 'but hopefully the last one', + }, get_lines(0, -1, true)) + -- cursor should stay at the same screen column + eq({ 1, 22 }, curwin('get_cursor')) + -- immediate call to nvim_win_get_cursor should have returned the same position + eq({ 1, 22 }, cursor) + -- coladd should become 0 + eq( + 0, + exec_lua([[ return vim.fn.winsaveview().coladd - ]])) - end) - - it('does not change cursor screen column when cursor is after eol and row range decreased', function() - insert([[ + ]]) + ) + end + ) + + it( + 'does not change cursor screen column when cursor is after eol and row range decreased', + function() + insert([[ This should be first then there is a line we do not want and one more and finally the last one]]) - -- position cursor on 'e' in 'more' - curwin('set_cursor', {3, 11}) - -- turn on virtualedit - command('set virtualedit=all') - -- move cursor after eol - exec_lua([[ + -- position cursor on 'e' in 'more' + curwin('set_cursor', { 3, 11 }) + -- turn on virtualedit + command('set virtualedit=all') + -- move cursor after eol + exec_lua([[ vim.fn.winrestview({ coladd = 28 }) ]]) - local cursor = exec_lua([[ + local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 3, 11, { 'the line we do not want', 'but hopefully', @@ -1397,19 +1451,23 @@ describe('api/buf', function() return vim.api.nvim_win_get_cursor(0) ]]) - eq({ - 'This should be the line we do not want', - 'but hopefully the last one', - }, get_lines(0, -1, true)) - -- cursor should end up at eol of a new row - eq({2, 26}, curwin('get_cursor')) - -- immediate call to nvim_win_get_cursor should have returned the same position - eq({2, 26}, cursor) - -- coladd should be increased so that cursor stays in the same screen column - eq(13, exec_lua([[ + eq({ + 'This should be the line we do not want', + 'but hopefully the last one', + }, get_lines(0, -1, true)) + -- cursor should end up at eol of a new row + eq({ 2, 26 }, curwin('get_cursor')) + -- immediate call to nvim_win_get_cursor should have returned the same position + eq({ 2, 26 }, cursor) + -- coladd should be increased so that cursor stays in the same screen column + eq( + 13, + exec_lua([[ return vim.fn.winsaveview().coladd - ]])) - end) + ]]) + ) + end + ) end) end) @@ -1421,80 +1479,86 @@ describe('api/buf', function() line]]) -- position the cursor on 'i' - curwin('set_cursor', {3, 2}) + curwin('set_cursor', { 3, 2 }) set_text(1, 6, 2, 0, {}) - eq({'first line', 'second line'}, get_lines(0, -1, true)) + eq({ 'first line', 'second line' }, get_lines(0, -1, true)) -- cursor should stay on 'i' - eq({2, 8}, curwin('get_cursor')) + eq({ 2, 8 }, curwin('get_cursor')) -- add a newline back - set_text(1, 6, 1, 6, {'', ''}) - eq({'first line', 'second', ' line'}, get_lines(0, -1, true)) + set_text(1, 6, 1, 6, { '', '' }) + eq({ 'first line', 'second', ' line' }, get_lines(0, -1, true)) -- cursor should return back to the original position - eq({3, 2}, curwin('get_cursor')) + eq({ 3, 2 }, curwin('get_cursor')) end) - it('adjusts cursor column if the range is not bound to either start or end of a line', function() - insert([[ + it( + 'adjusts cursor column if the range is not bound to either start or end of a line', + function() + insert([[ This should be first then there is a line we do not want and finally the last one]]) - -- position the cursor on 'h' in 'the' - curwin('set_cursor', {3, 13}) - set_text(0, 14, 2, 11, {}) - eq({'This should be the last one'}, get_lines(0, -1, true)) - -- cursor should stay on 'h' - eq({1, 16}, curwin('get_cursor')) - -- add deleted lines back - set_text(0, 14, 0, 14, { - ' first', - 'then there is a line we do not want', - 'and finally', - }) - eq({ - 'This should be first', - 'then there is a line we do not want', - 'and finally the last one', - }, get_lines(0, -1, true)) - -- cursor should return back to the original position - eq({3, 13}, curwin('get_cursor')) - end) - - it('adjusts cursor column if replacing lines in range, not just deleting and adding', function() - insert([[ + -- position the cursor on 'h' in 'the' + curwin('set_cursor', { 3, 13 }) + set_text(0, 14, 2, 11, {}) + eq({ 'This should be the last one' }, get_lines(0, -1, true)) + -- cursor should stay on 'h' + eq({ 1, 16 }, curwin('get_cursor')) + -- add deleted lines back + set_text(0, 14, 0, 14, { + ' first', + 'then there is a line we do not want', + 'and finally', + }) + eq({ + 'This should be first', + 'then there is a line we do not want', + 'and finally the last one', + }, get_lines(0, -1, true)) + -- cursor should return back to the original position + eq({ 3, 13 }, curwin('get_cursor')) + end + ) + + it( + 'adjusts cursor column if replacing lines in range, not just deleting and adding', + function() + insert([[ This should be first then there is a line we do not want and finally the last one]]) - -- position the cursor on 's' in 'last' - curwin('set_cursor', {3, 18}) - set_text(0, 15, 2, 11, { - 'the line we do not want', - 'but hopefully', - }) + -- position the cursor on 's' in 'last' + curwin('set_cursor', { 3, 18 }) + set_text(0, 15, 2, 11, { + 'the line we do not want', + 'but hopefully', + }) - eq({ - 'This should be the line we do not want', - 'but hopefully the last one', - }, get_lines(0, -1, true)) - -- cursor should stay on 's' - eq({2, 20}, curwin('get_cursor')) + eq({ + 'This should be the line we do not want', + 'but hopefully the last one', + }, get_lines(0, -1, true)) + -- cursor should stay on 's' + eq({ 2, 20 }, curwin('get_cursor')) - set_text(0, 15, 1, 13, { - 'first', - 'then there is a line we do not want', - 'and finally', - }) + set_text(0, 15, 1, 13, { + 'first', + 'then there is a line we do not want', + 'and finally', + }) - eq({ - 'This should be first', - 'then there is a line we do not want', - 'and finally the last one', - }, get_lines(0, -1, true)) - -- cursor should return back to the original position - eq({3, 18}, curwin('get_cursor')) - end) + eq({ + 'This should be first', + 'then there is a line we do not want', + 'and finally the last one', + }, get_lines(0, -1, true)) + -- cursor should return back to the original position + eq({ 3, 18 }, curwin('get_cursor')) + end + ) it('does not move cursor column after end of a line', function() insert([[ @@ -1502,7 +1566,7 @@ describe('api/buf', function() ]]) -- position cursor at the empty line - curwin('set_cursor', {2, 0}) + curwin('set_cursor', { 2, 0 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 33, 1, 0, {'!'}) @@ -1511,9 +1575,9 @@ describe('api/buf', function() eq({ 'This should be the only line here!' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({1, 33}, curwin('get_cursor')) + eq({ 1, 33 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 33}, cursor) + eq({ 1, 33 }, cursor) end) it('does not move cursor column before start of a line', function() @@ -1522,7 +1586,7 @@ describe('api/buf', function() eq({ '', '' }, get_lines(0, -1, true)) -- position cursor on the last '1' - curwin('set_cursor', {2, 2}) + curwin('set_cursor', { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 1, 0, {''}) @@ -1531,19 +1595,19 @@ describe('api/buf', function() eq({ '' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({1, 0}, curwin('get_cursor')) + eq({ 1, 0 }, curwin('get_cursor')) -- immediate call to nvim_win_get_cursor should have returned the same position - eq({1, 0}, cursor) + eq({ 1, 0 }, cursor) end) end) it('can handle NULs', function() - set_text(0, 0, 0, 0, {'ab\0cd'}) + set_text(0, 0, 0, 0, { 'ab\0cd' }) eq('ab\0cd', curbuf_depr('get_line', 0)) end) it('adjusts extmarks', function() - local ns = request('nvim_create_namespace', "my-fancy-plugin") + local ns = request('nvim_create_namespace', 'my-fancy-plugin') insert([[ foo bar baz @@ -1551,41 +1615,41 @@ describe('api/buf', function() local id1 = curbufmeths.set_extmark(ns, 0, 1, {}) local id2 = curbufmeths.set_extmark(ns, 0, 7, {}) local id3 = curbufmeths.set_extmark(ns, 1, 1, {}) - set_text(0, 4, 0, 7, {"q"}) + set_text(0, 4, 0, 7, { 'q' }) - eq({'foo q', 'baz'}, get_lines(0, 2, true)) + eq({ 'foo q', 'baz' }, get_lines(0, 2, true)) -- mark before replacement point is unaffected - eq({0, 1}, curbufmeths.get_extmark_by_id(ns, id1, {})) + eq({ 0, 1 }, curbufmeths.get_extmark_by_id(ns, id1, {})) -- mark gets shifted back because the replacement was shorter - eq({0, 5}, curbufmeths.get_extmark_by_id(ns, id2, {})) + eq({ 0, 5 }, curbufmeths.get_extmark_by_id(ns, id2, {})) -- mark on the next line is unaffected - eq({1, 1}, curbufmeths.get_extmark_by_id(ns, id3, {})) + eq({ 1, 1 }, curbufmeths.get_extmark_by_id(ns, id3, {})) -- replacing the text spanning two lines will adjust the mark on the next line - set_text(0, 3, 1, 3, {"qux"}) - eq({'fooqux', ''}, get_lines(0, 2, true)) - eq({0, 6}, curbufmeths.get_extmark_by_id(ns, id3, {})) + set_text(0, 3, 1, 3, { 'qux' }) + eq({ 'fooqux', '' }, get_lines(0, 2, true)) + eq({ 0, 6 }, curbufmeths.get_extmark_by_id(ns, id3, {})) -- but mark before replacement point is still unaffected - eq({0, 1}, curbufmeths.get_extmark_by_id(ns, id1, {})) + eq({ 0, 1 }, curbufmeths.get_extmark_by_id(ns, id1, {})) -- and the mark in the middle was shifted to the end of the insertion - eq({0, 6}, curbufmeths.get_extmark_by_id(ns, id2, {})) + eq({ 0, 6 }, curbufmeths.get_extmark_by_id(ns, id2, {})) -- marks should be put back into the same place after undoing - set_text(0, 0, 0, 2, {''}) + set_text(0, 0, 0, 2, { '' }) feed('u') - eq({0, 1}, curbufmeths.get_extmark_by_id(ns, id1, {})) - eq({0, 6}, curbufmeths.get_extmark_by_id(ns, id2, {})) - eq({0, 6}, curbufmeths.get_extmark_by_id(ns, id3, {})) + eq({ 0, 1 }, curbufmeths.get_extmark_by_id(ns, id1, {})) + eq({ 0, 6 }, curbufmeths.get_extmark_by_id(ns, id2, {})) + eq({ 0, 6 }, curbufmeths.get_extmark_by_id(ns, id3, {})) -- marks should be shifted over by the correct number of bytes for multibyte -- chars - set_text(0, 0, 0, 0, {'Ø'}) - eq({0, 3}, curbufmeths.get_extmark_by_id(ns, id1, {})) - eq({0, 8}, curbufmeths.get_extmark_by_id(ns, id2, {})) - eq({0, 8}, curbufmeths.get_extmark_by_id(ns, id3, {})) + set_text(0, 0, 0, 0, { 'Ø' }) + eq({ 0, 3 }, curbufmeths.get_extmark_by_id(ns, id1, {})) + eq({ 0, 8 }, curbufmeths.get_extmark_by_id(ns, id2, {})) + eq({ 0, 8 }, curbufmeths.get_extmark_by_id(ns, id3, {})) end) - it("correctly marks changed region for redraw #13890", function() + it('correctly marks changed region for redraw #13890', function() local screen = Screen.new(20, 5) screen:attach() @@ -1594,7 +1658,7 @@ describe('api/buf', function() BBB ]]) - curbufmeths.set_text(0, 0, 1, 3, {'XXX', 'YYY'}) + curbufmeths.set_text(0, 0, 1, 3, { 'XXX', 'YYY' }) screen:expect([[ XXX | @@ -1627,14 +1691,14 @@ describe('api/buf', function() end) it('no heap-use-after-free when called consecutively #19643', function() - set_text(0, 0, 0, 0, {'one', '', '', 'two'}) - eq({'one', '', '', 'two'}, get_lines(0, 4, true)) - meths.win_set_cursor(0, {1, 0}) + set_text(0, 0, 0, 0, { 'one', '', '', 'two' }) + eq({ 'one', '', '', 'two' }, get_lines(0, 4, true)) + meths.win_set_cursor(0, { 1, 0 }) exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 3, 1, 0, {''}) vim.api.nvim_buf_set_text(0, 0, 3, 1, 0, {''}) ]]) - eq({'one', 'two'}, get_lines(0, 2, true)) + eq({ 'one', 'two' }, get_lines(0, 2, true)) end) describe('handles topline', function() @@ -1642,12 +1706,12 @@ describe('api/buf', function() before_each(function() screen = Screen.new(20, 12) screen:set_default_attr_ids { - [1] = {bold = true, foreground = Screen.colors.Blue1}; - [2] = {reverse = true, bold = true}; - [3] = {reverse = true}; + [1] = { bold = true, foreground = Screen.colors.Blue1 }, + [2] = { reverse = true, bold = true }, + [3] = { reverse = true }, } screen:attach() - meths.buf_set_lines(0, 0, -1, 1, {"aaa", "bbb", "ccc", "ddd", "www", "xxx", "yyy", "zzz"}) + meths.buf_set_lines(0, 0, -1, 1, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' }) meths.set_option_value('modified', false, {}) end) @@ -1656,9 +1720,10 @@ describe('api/buf', function() local buf = meths.get_current_buf() command('new | wincmd w') - meths.win_set_cursor(win, {8,0}) + meths.win_set_cursor(win, { 8, 0 }) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -1668,10 +1733,12 @@ describe('api/buf', function() ^zzz | {2:[No Name] }| | - ]]} - meths.buf_set_text(buf, 0,3, 1,0, {"X"}) + ]], + } + meths.buf_set_text(buf, 0, 3, 1, 0, { 'X' }) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {1:~ }|*4 {3:[No Name] }| @@ -1681,7 +1748,8 @@ describe('api/buf', function() ^zzz | {2:[No Name] [+] }| | - ]]} + ]], + } end) it('of non-current window', function() @@ -1689,9 +1757,10 @@ describe('api/buf', function() local buf = meths.get_current_buf() command('new') - meths.win_set_cursor(win, {8,0}) + meths.win_set_cursor(win, { 8, 0 }) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {1:~ }|*4 {2:[No Name] }| @@ -1701,10 +1770,12 @@ describe('api/buf', function() zzz | {3:[No Name] }| | - ]]} + ]], + } - meths.buf_set_text(buf, 0,3, 1,0, {"X"}) - screen:expect{grid=[[ + meths.buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + screen:expect { + grid = [[ ^ | {1:~ }|*4 {2:[No Name] }| @@ -1714,7 +1785,8 @@ describe('api/buf', function() zzz | {3:[No Name] [+] }| | - ]]} + ]], + } end) it('of split windows with same buffer', function() @@ -1722,10 +1794,11 @@ describe('api/buf', function() local buf = meths.get_current_buf() command('split') - meths.win_set_cursor(win, {8,0}) - meths.win_set_cursor(0, {1,1}) + meths.win_set_cursor(win, { 8, 0 }) + meths.win_set_cursor(0, { 1, 1 }) - screen:expect{grid=[[ + screen:expect { + grid = [[ a^aa | bbb | ccc | @@ -1738,10 +1811,12 @@ describe('api/buf', function() zzz | {3:[No Name] }| | - ]]} - meths.buf_set_text(buf, 0,3, 1,0, {"X"}) + ]], + } + meths.buf_set_text(buf, 0, 3, 1, 0, { 'X' }) - screen:expect{grid=[[ + screen:expect { + grid = [[ a^aaXbbb | ccc | ddd | @@ -1754,7 +1829,8 @@ describe('api/buf', function() zzz | {3:[No Name] [+] }| | - ]]} + ]], + } end) end) end) @@ -1769,14 +1845,14 @@ describe('api/buf', function() end) it('works', function() - eq({'hello'}, get_text(0, 0, 0, 5, {})) - eq({'hello foo!'}, get_text(0, 0, 0, 42, {})) - eq({'foo!'}, get_text(0, 6, 0, 10, {})) - eq({'foo!', 'tex'}, get_text(0, 6, 1, 3, {})) - eq({'foo!', 'tex'}, get_text(-3, 6, -2, 3, {})) - eq({''}, get_text(0, 18, 0, 20, {})) - eq({'ext'}, get_text(-2, 1, -2, 4, {})) - eq({'hello foo!', 'text', 'm'}, get_text(0, 0, 2, 1, {})) + eq({ 'hello' }, get_text(0, 0, 0, 5, {})) + eq({ 'hello foo!' }, get_text(0, 0, 0, 42, {})) + eq({ 'foo!' }, get_text(0, 6, 0, 10, {})) + eq({ 'foo!', 'tex' }, get_text(0, 6, 1, 3, {})) + eq({ 'foo!', 'tex' }, get_text(-3, 6, -2, 3, {})) + eq({ '' }, get_text(0, 18, 0, 20, {})) + eq({ 'ext' }, get_text(-2, 1, -2, 4, {})) + eq({ 'hello foo!', 'text', 'm' }, get_text(0, 0, 2, 1, {})) end) it('errors on out-of-range', function() @@ -1797,7 +1873,7 @@ describe('api/buf', function() describe('nvim_buf_get_offset', function() local get_offset = curbufmeths.get_offset it('works', function() - curbufmeths.set_lines(0,-1,true,{'Some\r','exa\000mple', '', 'buf\rfer', 'text'}) + curbufmeths.set_lines(0, -1, true, { 'Some\r', 'exa\000mple', '', 'buf\rfer', 'text' }) eq(5, curbufmeths.line_count()) eq(0, get_offset(0)) eq(6, get_offset(1)) @@ -1823,12 +1899,12 @@ describe('api/buf', function() meths.set_option_value('eol', true, {}) eq(29, get_offset(5)) - command("set hidden") - command("enew") - eq(6, bufmeths.get_offset(1,1)) - command("bunload! 1") - eq(-1, bufmeths.get_offset(1,1)) - eq(-1, bufmeths.get_offset(1,0)) + command('set hidden') + command('enew') + eq(6, bufmeths.get_offset(1, 1)) + command('bunload! 1') + eq(-1, bufmeths.get_offset(1, 1)) + eq(-1, bufmeths.get_offset(1, 0)) end) it('works in empty buffer', function() @@ -1846,43 +1922,41 @@ describe('api/buf', function() describe('nvim_buf_get_var, nvim_buf_set_var, nvim_buf_del_var', function() it('works', function() - curbuf('set_var', 'lua', {1, 2, {['3'] = 1}}) - eq({1, 2, {['3'] = 1}}, curbuf('get_var', 'lua')) - eq({1, 2, {['3'] = 1}}, nvim('eval', 'b:lua')) + curbuf('set_var', 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, curbuf('get_var', 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, nvim('eval', 'b:lua')) eq(1, funcs.exists('b:lua')) curbufmeths.del_var('lua') eq(0, funcs.exists('b:lua')) - eq( 'Key not found: lua', pcall_err(curbufmeths.del_var, 'lua')) + eq('Key not found: lua', pcall_err(curbufmeths.del_var, 'lua')) curbufmeths.set_var('lua', 1) command('lockvar b:lua') eq('Key is locked: lua', pcall_err(curbufmeths.del_var, 'lua')) eq('Key is locked: lua', pcall_err(curbufmeths.set_var, 'lua', 1)) - eq('Key is read-only: changedtick', - pcall_err(curbufmeths.del_var, 'changedtick')) - eq('Key is read-only: changedtick', - pcall_err(curbufmeths.set_var, 'changedtick', 1)) + eq('Key is read-only: changedtick', pcall_err(curbufmeths.del_var, 'changedtick')) + eq('Key is read-only: changedtick', pcall_err(curbufmeths.set_var, 'changedtick', 1)) end) end) describe('nvim_buf_get_changedtick', function() it('works', function() eq(2, curbufmeths.get_changedtick()) - curbufmeths.set_lines(0, 1, false, {'abc\0', '\0def', 'ghi'}) + curbufmeths.set_lines(0, 1, false, { 'abc\0', '\0def', 'ghi' }) eq(3, curbufmeths.get_changedtick()) eq(3, curbufmeths.get_var('changedtick')) end) it('buffer_set_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } eq(NIL, request('buffer_set_var', 0, 'lua', val1)) eq(val1, request('buffer_set_var', 0, 'lua', val2)) end) it('buffer_del_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} - eq(NIL, request('buffer_set_var', 0, 'lua', val1)) + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } + eq(NIL, request('buffer_set_var', 0, 'lua', val1)) eq(val1, request('buffer_set_var', 0, 'lua', val2)) eq(val2, request('buffer_del_var', 0, 'lua')) end) @@ -1894,17 +1968,17 @@ describe('api/buf', function() nvim('set_option_value', 'shiftwidth', 4, {}) eq(4, nvim('get_option_value', 'shiftwidth', {})) -- global-local option - nvim('set_option_value', 'define', 'test', {buf = 0}) - eq('test', nvim('get_option_value', 'define', {buf = 0})) + nvim('set_option_value', 'define', 'test', { buf = 0 }) + eq('test', nvim('get_option_value', 'define', { buf = 0 })) -- Doesn't change the global value - eq("", nvim('get_option_value', 'define', {scope='global'})) + eq('', nvim('get_option_value', 'define', { scope = 'global' })) end) it('returns values for unset local options', function() -- 'undolevels' is only set to its "unset" value when a new buffer is -- created command('enew') - eq(-123456, nvim('get_option_value', 'undolevels', {buf=0})) + eq(-123456, nvim('get_option_value', 'undolevels', { buf = 0 })) end) end) @@ -1929,17 +2003,17 @@ describe('api/buf', function() ok(buffer('is_loaded', bufnr)) -- hide the current buffer by switching to a new empty buffer -- Careful! we need to modify the buffer first or vim will just reuse it - buffer('set_lines', bufnr, 0, -1, 1, {'line1'}) + buffer('set_lines', bufnr, 0, -1, 1, { 'line1' }) command('hide enew') -- confirm the buffer is hidden, but still loaded - local infolist = nvim('eval', 'getbufinfo('..bufnr..')') + local infolist = nvim('eval', 'getbufinfo(' .. bufnr .. ')') eq(1, #infolist) eq(1, infolist[1].hidden) eq(1, infolist[1].loaded) -- now force unload the buffer - command('bunload! '..bufnr) + command('bunload! ' .. bufnr) -- confirm the buffer is unloaded - infolist = nvim('eval', 'getbufinfo('..bufnr..')') + infolist = nvim('eval', 'getbufinfo(' .. bufnr .. ')') eq(0, infolist[1].loaded) -- nvim_buf_is_loaded() should also report the buffer as unloaded eq(false, buffer('is_loaded', bufnr)) @@ -1978,25 +2052,25 @@ describe('api/buf', function() describe('nvim_buf_get_mark', function() it('works', function() - curbuf('set_lines', -1, -1, true, {'a', 'bit of', 'text'}) - curwin('set_cursor', {3, 4}) + curbuf('set_lines', -1, -1, true, { 'a', 'bit of', 'text' }) + curwin('set_cursor', { 3, 4 }) nvim('command', 'mark v') - eq({3, 0}, curbuf('get_mark', 'v')) + eq({ 3, 0 }, curbuf('get_mark', 'v')) end) end) describe('nvim_buf_set_mark', function() it('works with buffer local marks', function() - curbufmeths.set_lines(-1, -1, true, {'a', 'bit of', 'text'}) + curbufmeths.set_lines(-1, -1, true, { 'a', 'bit of', 'text' }) eq(true, curbufmeths.set_mark('z', 1, 1, {})) - eq({1, 1}, curbufmeths.get_mark('z')) - eq({0, 1, 2, 0}, funcs.getpos("'z")) + eq({ 1, 1 }, curbufmeths.get_mark('z')) + eq({ 0, 1, 2, 0 }, funcs.getpos("'z")) end) it('works with file/uppercase marks', function() - curbufmeths.set_lines(-1, -1, true, {'a', 'bit of', 'text'}) + curbufmeths.set_lines(-1, -1, true, { 'a', 'bit of', 'text' }) eq(true, curbufmeths.set_mark('Z', 3, 2, {})) - eq({3, 2}, curbufmeths.get_mark('Z')) - eq({curbuf().id, 3, 3, 0}, funcs.getpos("'Z")) + eq({ 3, 2 }, curbufmeths.get_mark('Z')) + eq({ curbuf().id, 3, 3, 0 }, funcs.getpos("'Z")) end) it('fails when invalid marks names are used', function() eq(false, pcall(curbufmeths.set_mark, '!', 1, 0, {})) @@ -2009,29 +2083,29 @@ describe('api/buf', function() describe('nvim_buf_del_mark', function() it('works with buffer local marks', function() - curbufmeths.set_lines(-1, -1, true, {'a', 'bit of', 'text'}) + curbufmeths.set_lines(-1, -1, true, { 'a', 'bit of', 'text' }) curbufmeths.set_mark('z', 3, 1, {}) eq(true, curbufmeths.del_mark('z')) - eq({0, 0}, curbufmeths.get_mark('z')) + eq({ 0, 0 }, curbufmeths.get_mark('z')) end) it('works with file/uppercase marks', function() - curbufmeths.set_lines(-1, -1, true, {'a', 'bit of', 'text'}) + curbufmeths.set_lines(-1, -1, true, { 'a', 'bit of', 'text' }) curbufmeths.set_mark('Z', 3, 3, {}) eq(true, curbufmeths.del_mark('Z')) - eq({0, 0}, curbufmeths.get_mark('Z')) + eq({ 0, 0 }, curbufmeths.get_mark('Z')) end) it('returns false in marks not set in this buffer', function() - local abuf = meths.create_buf(false,true) - bufmeths.set_lines(abuf, -1, -1, true, {'a', 'bit of', 'text'}) + local abuf = meths.create_buf(false, true) + bufmeths.set_lines(abuf, -1, -1, true, { 'a', 'bit of', 'text' }) bufmeths.set_mark(abuf, 'A', 2, 2, {}) eq(false, curbufmeths.del_mark('A')) - eq({2, 2}, bufmeths.get_mark(abuf, 'A')) + eq({ 2, 2 }, bufmeths.get_mark(abuf, 'A')) end) it('returns false if mark was not deleted', function() - curbufmeths.set_lines(-1, -1, true, {'a', 'bit of', 'text'}) + curbufmeths.set_lines(-1, -1, true, { 'a', 'bit of', 'text' }) curbufmeths.set_mark('z', 3, 1, {}) eq(true, curbufmeths.del_mark('z')) - eq(false, curbufmeths.del_mark('z')) -- Mark was already deleted + eq(false, curbufmeths.del_mark('z')) -- Mark was already deleted end) it('fails when invalid marks names are used', function() eq(false, pcall(curbufmeths.del_mark, '!')) diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index 6c250ad6ce..b0efcf0dab 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -2,23 +2,25 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local eq, ok = helpers.eq, helpers.ok local funcs = helpers.funcs -local buffer, command, eval, nvim, next_msg = helpers.buffer, - helpers.command, helpers.eval, helpers.nvim, helpers.next_msg +local buffer, command, eval, nvim, next_msg = + helpers.buffer, helpers.command, helpers.eval, helpers.nvim, helpers.next_msg local nvim_prog = helpers.nvim_prog local pcall_err = helpers.pcall_err local sleep = helpers.sleep local write_file = helpers.write_file -local origlines = {"original line 1", - "original line 2", - "original line 3", - "original line 4", - "original line 5", - "original line 6"} +local origlines = { + 'original line 1', + 'original line 2', + 'original line 3', + 'original line 4', + 'original line 5', + 'original line 6', +} local function expectn(name, args) -- expect the next message to be the specified notification event - eq({'notification', name, args}, next_msg()) + eq({ 'notification', name, args }, next_msg()) end local function sendkeys(keys) @@ -27,12 +29,13 @@ local function sendkeys(keys) -- more key presses - otherwise they all pile up in the queue and get -- processed at once local ntime = os.clock() + 0.1 - repeat until os.clock() > ntime + repeat + until os.clock() > ntime end local function open(activate, lines) local filename = helpers.tmpname() - write_file(filename, table.concat(lines, "\n").."\n", true) + write_file(filename, table.concat(lines, '\n') .. '\n', true) command('edit ' .. filename) local b = nvim('get_current_buf') -- what is the value of b:changedtick? @@ -43,7 +46,7 @@ local function open(activate, lines) if activate then local firstline = 0 ok(buffer('attach', b, true, {})) - expectn('nvim_buf_lines_event', {b, tick, firstline, -1, lines, false}) + expectn('nvim_buf_lines_event', { b, tick, firstline, -1, lines, false }) end return b, tick, filename @@ -60,13 +63,13 @@ end local function reopen(buf, expectedlines) ok(buffer('detach', buf)) - expectn('nvim_buf_detach_event', {buf}) + expectn('nvim_buf_detach_event', { buf }) -- for some reason the :edit! increments tick by 2 command('edit!') local tick = eval('b:changedtick') ok(buffer('attach', buf, true, {})) local firstline = 0 - expectn('nvim_buf_lines_event', {buf, tick, firstline, -1, expectedlines, false}) + expectn('nvim_buf_lines_event', { buf, tick, firstline, -1, expectedlines, false }) command('normal! gg') return tick end @@ -81,18 +84,36 @@ local function reopenwithfolds(b) -- add a fold command('2,4fold') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 4, {'original line 2/*{{{*/', - 'original line 3', - 'original line 4/*}}}*/'}, false}) + expectn('nvim_buf_lines_event', { + b, + tick, + 1, + 4, + { + 'original line 2/*{{{*/', + 'original line 3', + 'original line 4/*}}}*/', + }, + false, + }) -- make a new fold that wraps lines 1-6 command('1,6fold') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 6, {'original line 1/*{{{*/', - 'original line 2/*{{{*/', - 'original line 3', - 'original line 4/*}}}*/', - 'original line 5', - 'original line 6/*}}}*/'}, false}) + expectn('nvim_buf_lines_event', { + b, + tick, + 0, + 6, + { + 'original line 1/*{{{*/', + 'original line 2/*{{{*/', + 'original line 3', + 'original line 4/*}}}*/', + 'original line 5', + 'original line 6/*}}}*/', + }, + false, + }) return tick end @@ -105,97 +126,105 @@ describe('API: buffer events:', function() -- add a new line at the start of the buffer command('normal! GyyggP') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 0, {'original line 6'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 0, { 'original line 6' }, false }) -- add multiple lines at the start of the file command('normal! GkkyGggP') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 0, {'original line 4', - 'original line 5', - 'original line 6'}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 0, 0, { 'original line 4', 'original line 5', 'original line 6' }, false } + ) -- add one line to the middle of the file, several times command('normal! ggYjjp') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 3, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 3, { 'original line 4' }, false }) command('normal! p') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 4, 4, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 4, 4, { 'original line 4' }, false }) command('normal! p') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 5, 5, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 5, 5, { 'original line 4' }, false }) -- add multiple lines to the middle of the file command('normal! gg4Yjjp') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 3, {'original line 4', - 'original line 5', - 'original line 6', - 'original line 4'}, false}) + expectn('nvim_buf_lines_event', { + b, + tick, + 3, + 3, + { + 'original line 4', + 'original line 5', + 'original line 6', + 'original line 4', + }, + false, + }) -- add one line to the end of the file command('normal! ggYGp') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 17, 17, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 17, 17, { 'original line 4' }, false }) -- add one line to the end of the file, several times command('normal! ggYGppp') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 18, 18, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 18, 18, { 'original line 4' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 19, 19, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 19, 19, { 'original line 4' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 20, 20, {'original line 4'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 20, 20, { 'original line 4' }, false }) -- add several lines to the end of the file, several times command('normal! gg4YGp') command('normal! Gp') command('normal! Gp') - local firstfour = {'original line 4', - 'original line 5', - 'original line 6', - 'original line 4'} + local firstfour = { 'original line 4', 'original line 5', 'original line 6', 'original line 4' } tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 21, 21, firstfour, false}) + expectn('nvim_buf_lines_event', { b, tick, 21, 21, firstfour, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 25, 25, firstfour, false}) + expectn('nvim_buf_lines_event', { b, tick, 25, 25, firstfour, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 29, 29, firstfour, false}) + expectn('nvim_buf_lines_event', { b, tick, 29, 29, firstfour, false }) -- delete the current buffer to turn off buffer events command('bdelete!') - expectn('nvim_buf_detach_event', {b}) + expectn('nvim_buf_detach_event', { b }) -- add a line at the start of an empty file command('enew') tick = eval('b:changedtick') local b2 = nvim('get_current_buf') ok(buffer('attach', b2, true, {})) - expectn('nvim_buf_lines_event', {b2, tick, 0, -1, {""}, false}) + expectn('nvim_buf_lines_event', { b2, tick, 0, -1, { '' }, false }) eval('append(0, ["new line 1"])') tick = tick + 1 - expectn('nvim_buf_lines_event', {b2, tick, 0, 0, {'new line 1'}, false}) + expectn('nvim_buf_lines_event', { b2, tick, 0, 0, { 'new line 1' }, false }) -- turn off buffer events manually buffer('detach', b2) - expectn('nvim_buf_detach_event', {b2}) + expectn('nvim_buf_detach_event', { b2 }) -- add multiple lines to a blank file command('enew!') local b3 = nvim('get_current_buf') ok(buffer('attach', b3, true, {})) tick = eval('b:changedtick') - expectn('nvim_buf_lines_event', {b3, tick, 0, -1, {""}, false}) + expectn('nvim_buf_lines_event', { b3, tick, 0, -1, { '' }, false }) eval('append(0, ["new line 1", "new line 2", "new line 3"])') tick = tick + 1 - expectn('nvim_buf_lines_event', {b3, tick, 0, 0, {'new line 1', - 'new line 2', - 'new line 3'}, false}) + expectn( + 'nvim_buf_lines_event', + { b3, tick, 0, 0, { 'new line 1', 'new line 2', 'new line 3' }, false } + ) -- use the API itself to add a line to the start of the buffer - buffer('set_lines', b3, 0, 0, true, {'New First Line'}) + buffer('set_lines', b3, 0, 0, true, { 'New First Line' }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b3, tick, 0, 0, {"New First Line"}, false}) + expectn('nvim_buf_lines_event', { b3, tick, 0, 0, { 'New First Line' }, false }) end) it('when lines are removed', function() @@ -204,37 +233,37 @@ describe('API: buffer events:', function() -- remove one line from start of file command('normal! dd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, {}, false }) -- remove multiple lines from the start of the file command('normal! 4dd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 4, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 4, {}, false }) -- remove multiple lines from middle of file tick = reopen(b, origlines) command('normal! jj3dd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 5, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 2, 5, {}, false }) -- remove one line from the end of the file tick = reopen(b, origlines) command('normal! Gdd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 5, 6, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 5, 6, {}, false }) -- remove multiple lines from the end of the file tick = reopen(b, origlines) command('normal! 4G3dd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 6, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 6, {}, false }) -- pretend to remove heaps lines from the end of the file but really -- just remove two tick = reopen(b, origlines) command('normal! Gk5dd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 4, 6, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 4, 6, {}, false }) end) it('when text is changed', function() @@ -243,53 +272,56 @@ describe('API: buffer events:', function() -- some normal text editing command('normal! A555') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'original line 1555'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'original line 1555' }, false }) command('normal! jj8X') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'origin3'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 2, 3, { 'origin3' }, false }) -- modify multiple lines at once using visual block mode tick = reopen(b, origlines) command('normal! jjw') sendkeys('<C-v>jjllx') tick = tick + 1 - expectn('nvim_buf_lines_event', - {b, tick, 2, 5, {'original e 3', 'original e 4', 'original e 5'}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 2, 5, { 'original e 3', 'original e 4', 'original e 5' }, false } + ) -- replace part of a line line using :s tick = reopen(b, origlines) command('3s/line 3/foo/') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'original foo'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 2, 3, { 'original foo' }, false }) -- replace parts of several lines line using :s tick = reopen(b, origlines) command('%s/line [35]/foo/') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 5, {'original foo', - 'original line 4', - 'original foo'}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 2, 5, { 'original foo', 'original line 4', 'original foo' }, false } + ) -- type text into the first line of a blank file, one character at a time command('bdelete!') tick = 2 - expectn('nvim_buf_detach_event', {b}) + expectn('nvim_buf_detach_event', { b }) local bnew = nvim('get_current_buf') ok(buffer('attach', bnew, true, {})) - expectn('nvim_buf_lines_event', {bnew, tick, 0, -1, {''}, false}) + expectn('nvim_buf_lines_event', { bnew, tick, 0, -1, { '' }, false }) sendkeys('i') sendkeys('h') sendkeys('e') sendkeys('l') sendkeys('l') sendkeys('o\nworld') - expectn('nvim_buf_lines_event', {bnew, tick + 1, 0, 1, {'h'}, false}) - expectn('nvim_buf_lines_event', {bnew, tick + 2, 0, 1, {'he'}, false}) - expectn('nvim_buf_lines_event', {bnew, tick + 3, 0, 1, {'hel'}, false}) - expectn('nvim_buf_lines_event', {bnew, tick + 4, 0, 1, {'hell'}, false}) - expectn('nvim_buf_lines_event', {bnew, tick + 5, 0, 1, {'hello'}, false}) - expectn('nvim_buf_lines_event', {bnew, tick + 6, 0, 1, {'hello', ''}, false}) - expectn('nvim_buf_lines_event', {bnew, tick + 7, 1, 2, {'world'}, false}) + expectn('nvim_buf_lines_event', { bnew, tick + 1, 0, 1, { 'h' }, false }) + expectn('nvim_buf_lines_event', { bnew, tick + 2, 0, 1, { 'he' }, false }) + expectn('nvim_buf_lines_event', { bnew, tick + 3, 0, 1, { 'hel' }, false }) + expectn('nvim_buf_lines_event', { bnew, tick + 4, 0, 1, { 'hell' }, false }) + expectn('nvim_buf_lines_event', { bnew, tick + 5, 0, 1, { 'hello' }, false }) + expectn('nvim_buf_lines_event', { bnew, tick + 6, 0, 1, { 'hello', '' }, false }) + expectn('nvim_buf_lines_event', { bnew, tick + 7, 1, 2, { 'world' }, false }) end) it('when lines are replaced', function() @@ -298,145 +330,145 @@ describe('API: buffer events:', function() -- blast away parts of some lines with visual mode command('normal! jjwvjjllx') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'original '}, false}) + expectn('nvim_buf_lines_event', { b, tick, 2, 3, { 'original ' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 4, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 4, {}, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 4, {'e 5'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 4, { 'e 5' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 3, {'original e 5'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 2, 3, { 'original e 5' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 4, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 4, {}, false }) -- blast away a few lines using :g tick = reopen(b, origlines) command('global/line [35]/delete') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 2, 3, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 2, 3, {}, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 4, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 4, {}, false }) end) it('when lines are filtered', function() -- Test filtering lines with !cat - local b, tick = editoriginal(true, {"A", "C", "E", "B", "D", "F"}) + local b, tick = editoriginal(true, { 'A', 'C', 'E', 'B', 'D', 'F' }) command('silent 2,5!cat') -- the change comes through as two changes: -- 1) addition of the new lines after the filtered lines -- 2) removal of the original lines tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 5, 5, {"C", "E", "B", "D"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 5, 5, { 'C', 'E', 'B', 'D' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 5, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 5, {}, false }) end) it('when you use "o"', function() - local b, tick = editoriginal(true, {'AAA', 'BBB'}) + local b, tick = editoriginal(true, { 'AAA', 'BBB' }) command('set noautoindent nosmartindent') -- use 'o' to start a new line from a line with no indent command('normal! o') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 1, {""}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 1, { '' }, false }) -- undo the change, indent line 1 a bit, and try again command('undo') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 2, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 2, {}, false }) tick = tick + 1 - expectn('nvim_buf_changedtick_event', {b, tick}) + expectn('nvim_buf_changedtick_event', { b, tick }) command('set autoindent') command('normal! >>') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {"\tAAA"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { '\tAAA' }, false }) command('normal! ommm') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 1, {"\t"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 1, { '\t' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 2, {"\tmmm"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 2, { '\tmmm' }, false }) -- undo the change, and try again with 'O' command('undo') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 2, {'\t'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 2, { '\t' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 2, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 2, {}, false }) tick = tick + 1 - expectn('nvim_buf_changedtick_event', {b, tick}) + expectn('nvim_buf_changedtick_event', { b, tick }) command('normal! ggOmmm') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 0, {"\t"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 0, { '\t' }, false }) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {"\tmmm"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { '\tmmm' }, false }) end) it('deactivates if the buffer is changed externally', function() -- Test changing file from outside vim and reloading using :edit - local lines = {"Line 1", "Line 2"}; + local lines = { 'Line 1', 'Line 2' } local b, tick, filename = editoriginal(true, lines) command('normal! x') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'ine 1'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'ine 1' }, false }) command('undo') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'Line 1'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'Line 1' }, false }) tick = tick + 1 - expectn('nvim_buf_changedtick_event', {b, tick}) + expectn('nvim_buf_changedtick_event', { b, tick }) -- change the file directly - write_file(filename, "another line\n", true, true) + write_file(filename, 'another line\n', true, true) -- reopen the file and watch buffer events shut down command('edit') - expectn('nvim_buf_detach_event', {b}) + expectn('nvim_buf_detach_event', { b }) end) it('channel can watch many buffers at once', function() -- edit 3 buffers, make sure they all have windows visible so that when we -- move between buffers, none of them are unloaded - local b1, tick1 = editoriginal(true, {'A1', 'A2'}) + local b1, tick1 = editoriginal(true, { 'A1', 'A2' }) local b1nr = eval('bufnr("")') command('split') - local b2, tick2 = open(true, {'B1', 'B2'}) + local b2, tick2 = open(true, { 'B1', 'B2' }) local b2nr = eval('bufnr("")') command('split') - local b3, tick3 = open(true, {'C1', 'C2'}) + local b3, tick3 = open(true, { 'C1', 'C2' }) local b3nr = eval('bufnr("")') -- make a new window for moving between buffers command('split') - command('b'..b1nr) + command('b' .. b1nr) command('normal! x') tick1 = tick1 + 1 - expectn('nvim_buf_lines_event', {b1, tick1, 0, 1, {'1'}, false}) + expectn('nvim_buf_lines_event', { b1, tick1, 0, 1, { '1' }, false }) command('undo') tick1 = tick1 + 1 - expectn('nvim_buf_lines_event', {b1, tick1, 0, 1, {'A1'}, false}) + expectn('nvim_buf_lines_event', { b1, tick1, 0, 1, { 'A1' }, false }) tick1 = tick1 + 1 - expectn('nvim_buf_changedtick_event', {b1, tick1}) + expectn('nvim_buf_changedtick_event', { b1, tick1 }) - command('b'..b2nr) + command('b' .. b2nr) command('normal! x') tick2 = tick2 + 1 - expectn('nvim_buf_lines_event', {b2, tick2, 0, 1, {'1'}, false}) + expectn('nvim_buf_lines_event', { b2, tick2, 0, 1, { '1' }, false }) command('undo') tick2 = tick2 + 1 - expectn('nvim_buf_lines_event', {b2, tick2, 0, 1, {'B1'}, false}) + expectn('nvim_buf_lines_event', { b2, tick2, 0, 1, { 'B1' }, false }) tick2 = tick2 + 1 - expectn('nvim_buf_changedtick_event', {b2, tick2}) + expectn('nvim_buf_changedtick_event', { b2, tick2 }) - command('b'..b3nr) + command('b' .. b3nr) command('normal! x') tick3 = tick3 + 1 - expectn('nvim_buf_lines_event', {b3, tick3, 0, 1, {'1'}, false}) + expectn('nvim_buf_lines_event', { b3, tick3, 0, 1, { '1' }, false }) command('undo') tick3 = tick3 + 1 - expectn('nvim_buf_lines_event', {b3, tick3, 0, 1, {'C1'}, false}) + expectn('nvim_buf_lines_event', { b3, tick3, 0, 1, { 'C1' }, false }) tick3 = tick3 + 1 - expectn('nvim_buf_changedtick_event', {b3, tick3}) + expectn('nvim_buf_changedtick_event', { b3, tick3 }) end) it('does not get confused if enabled/disabled many times', function() @@ -449,8 +481,8 @@ describe('API: buffer events:', function() ok(buffer('attach', b, true, {})) ok(buffer('attach', b, true, {})) ok(buffer('attach', b, true, {})) - expectn('nvim_buf_lines_event', {b, tick, 0, -1, origlines, false}) - eval('rpcnotify('..channel..', "Hello There")') + expectn('nvim_buf_lines_event', { b, tick, 0, -1, origlines, false }) + eval('rpcnotify(' .. channel .. ', "Hello There")') expectn('Hello There', {}) -- Disable buffer events many times. @@ -459,8 +491,8 @@ describe('API: buffer events:', function() ok(buffer('detach', b)) ok(buffer('detach', b)) ok(buffer('detach', b)) - expectn('nvim_buf_detach_event', {b}) - eval('rpcnotify('..channel..', "Hello Again")') + expectn('nvim_buf_detach_event', { b }) + eval('rpcnotify(' .. channel .. ', "Hello Again")') expectn('Hello Again', {}) end) @@ -470,7 +502,7 @@ describe('API: buffer events:', function() -- create several new sessions, in addition to our main API local sessions = {} local pipe = helpers.new_pipename() - eval("serverstart('"..pipe.."')") + eval("serverstart('" .. pipe .. "')") sessions[1] = helpers.connect(pipe) sessions[2] = helpers.connect(pipe) sessions[3] = helpers.connect(pipe) @@ -485,109 +517,105 @@ describe('API: buffer events:', function() local function wantn(sessionid, name, args) local session = sessions[sessionid] - eq({'notification', name, args}, session:next_message(10000)) + eq({ 'notification', name, args }, session:next_message(10000)) end -- Edit a new file, but don't enable buffer events. - local lines = {'AAA', 'BBB'} + local lines = { 'AAA', 'BBB' } local b, tick = open(false, lines) -- Enable buffer events for sessions 1, 2 and 3. ok(request(1, 'nvim_buf_attach', b, true, {})) ok(request(2, 'nvim_buf_attach', b, true, {})) ok(request(3, 'nvim_buf_attach', b, true, {})) - wantn(1, 'nvim_buf_lines_event', {b, tick, 0, -1, lines, false}) - wantn(2, 'nvim_buf_lines_event', {b, tick, 0, -1, lines, false}) - wantn(3, 'nvim_buf_lines_event', {b, tick, 0, -1, lines, false}) + wantn(1, 'nvim_buf_lines_event', { b, tick, 0, -1, lines, false }) + wantn(2, 'nvim_buf_lines_event', { b, tick, 0, -1, lines, false }) + wantn(3, 'nvim_buf_lines_event', { b, tick, 0, -1, lines, false }) -- Change the buffer. command('normal! x') tick = tick + 1 - wantn(1, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) - wantn(2, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) - wantn(3, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + wantn(1, 'nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) + wantn(2, 'nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) + wantn(3, 'nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) -- Stop watching on channel 1. ok(request(1, 'nvim_buf_detach', b)) - wantn(1, 'nvim_buf_detach_event', {b}) + wantn(1, 'nvim_buf_detach_event', { b }) -- Undo the change to buffer 1. command('undo') tick = tick + 1 - wantn(2, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false}) - wantn(3, 'nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false}) + wantn(2, 'nvim_buf_lines_event', { b, tick, 0, 1, { 'AAA' }, false }) + wantn(3, 'nvim_buf_lines_event', { b, tick, 0, 1, { 'AAA' }, false }) tick = tick + 1 - wantn(2, 'nvim_buf_changedtick_event', {b, tick}) - wantn(3, 'nvim_buf_changedtick_event', {b, tick}) + wantn(2, 'nvim_buf_changedtick_event', { b, tick }) + wantn(3, 'nvim_buf_changedtick_event', { b, tick }) -- make sure there are no other pending nvim_buf_lines_event messages going to -- channel 1 local channel1 = request(1, 'nvim_get_api_info')[1] - eval('rpcnotify('..channel1..', "Hello")') + eval('rpcnotify(' .. channel1 .. ', "Hello")') wantn(1, 'Hello', {}) -- close the buffer and channels 2 and 3 should get a nvim_buf_detach_event -- notification command('edit') - wantn(2, 'nvim_buf_detach_event', {b}) - wantn(3, 'nvim_buf_detach_event', {b}) + wantn(2, 'nvim_buf_detach_event', { b }) + wantn(3, 'nvim_buf_detach_event', { b }) -- make sure there are no other pending nvim_buf_lines_event messages going to -- channel 1 channel1 = request(1, 'nvim_get_api_info')[1] - eval('rpcnotify('..channel1..', "Hello Again")') + eval('rpcnotify(' .. channel1 .. ', "Hello Again")') wantn(1, 'Hello Again', {}) end) it('works with :diffput and :diffget', function() - local b1, tick1 = editoriginal(true, {"AAA", "BBB"}) + local b1, tick1 = editoriginal(true, { 'AAA', 'BBB' }) local channel = nvim('get_api_info')[1] command('diffthis') command('rightbelow vsplit') - local b2, tick2 = open(true, {"BBB", "CCC"}) + local b2, tick2 = open(true, { 'BBB', 'CCC' }) command('diffthis') -- go back to first buffer, and push the 'AAA' line to the second buffer command('1wincmd w') command('normal! gg') command('diffput') tick2 = tick2 + 1 - expectn('nvim_buf_lines_event', {b2, tick2, 0, 0, {"AAA"}, false}) + expectn('nvim_buf_lines_event', { b2, tick2, 0, 0, { 'AAA' }, false }) -- use :diffget to grab the other change from buffer 2 command('normal! G') command('diffget') tick1 = tick1 + 1 - expectn('nvim_buf_lines_event', {b1, tick1, 2, 2, {"CCC"}, false}) + expectn('nvim_buf_lines_event', { b1, tick1, 2, 2, { 'CCC' }, false }) - eval('rpcnotify('..channel..', "Goodbye")') + eval('rpcnotify(' .. channel .. ', "Goodbye")') expectn('Goodbye', {}) end) it('works with :sort', function() -- test for :sort - local b, tick = editoriginal(true, {"B", "D", "C", "A", "E"}) + local b, tick = editoriginal(true, { 'B', 'D', 'C', 'A', 'E' }) command('%sort') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 5, {"A", "B", "C", "D", "E"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 5, { 'A', 'B', 'C', 'D', 'E' }, false }) end) it('works with :left', function() - local b, tick = editoriginal(true, {" A", " B", "B", "\tB", "\t\tC"}) + local b, tick = editoriginal(true, { ' A', ' B', 'B', '\tB', '\t\tC' }) command('2,4left') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 4, {"B", "B", "B"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 4, { 'B', 'B', 'B' }, false }) end) it('works with :right', function() - local b, tick = editoriginal(true, {" A", - "\t B", - "\t \tBB", - " \tB", - "\t\tC"}) + local b, tick = editoriginal(true, { ' A', '\t B', '\t \tBB', ' \tB', '\t\tC' }) command('set ts=2 et') command('2,4retab') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 4, {" B", " BB", " B"}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 4, { ' B', ' BB', ' B' }, false }) end) it('works with :move', function() @@ -595,19 +623,23 @@ describe('API: buffer events:', function() -- move text down towards the end of the file command('2,3move 4') tick = tick + 2 - expectn('nvim_buf_lines_event', {b, tick, 4, 4, {"original line 2", - "original line 3"}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 4, 4, { 'original line 2', 'original line 3' }, false } + ) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 3, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 1, 3, {}, false }) -- move text up towards the start of the file tick = reopen(b, origlines) command('4,5move 2') tick = tick + 2 - expectn('nvim_buf_lines_event', {b, tick, 2, 2, {"original line 4", - "original line 5"}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 2, 2, { 'original line 4', 'original line 5' }, false } + ) tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 5, 7, {}, false}) + expectn('nvim_buf_lines_event', { b, tick, 5, 7, {}, false }) end) it('when you manually add/remove folds', function() @@ -617,13 +649,14 @@ describe('API: buffer events:', function() -- delete the inner fold command('normal! zR3Gzd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 1, 4, {'original line 2', - 'original line 3', - 'original line 4'}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 1, 4, { 'original line 2', 'original line 3', 'original line 4' }, false } + ) -- delete the outer fold command('normal! zd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 6, origlines, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 6, origlines, false }) -- discard changes and put the folds back tick = reopenwithfolds(b) @@ -631,7 +664,7 @@ describe('API: buffer events:', function() -- remove both folds at once command('normal! ggzczD') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 6, origlines, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 6, origlines, false }) -- discard changes and put the folds back tick = reopenwithfolds(b) @@ -639,101 +672,102 @@ describe('API: buffer events:', function() -- now delete all folds at once command('normal! zE') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 6, origlines, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 6, origlines, false }) -- create a fold from line 4 to the end of the file command('normal! 4GA/*{{{*/') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 4, {'original line 4/*{{{*/'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 3, 4, { 'original line 4/*{{{*/' }, false }) -- delete the fold which only has one marker command('normal! Gzd') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 3, 6, {'original line 4', - 'original line 5', - 'original line 6'}, false}) + expectn( + 'nvim_buf_lines_event', + { b, tick, 3, 6, { 'original line 4', 'original line 5', 'original line 6' }, false } + ) end) it('detaches if the buffer is closed', function() - local b, tick = editoriginal(true, {'AAA'}) + local b, tick = editoriginal(true, { 'AAA' }) local channel = nvim('get_api_info')[1] -- Test that buffer events are working. command('normal! x') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) command('undo') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AAA' }, false }) tick = tick + 1 - expectn('nvim_buf_changedtick_event', {b, tick}) + expectn('nvim_buf_changedtick_event', { b, tick }) -- close our buffer and create a new one command('bdelete') command('enew') - expectn('nvim_buf_detach_event', {b}) + expectn('nvim_buf_detach_event', { b }) -- Reopen the original buffer, make sure there are no buffer events sent. command('b1') command('normal! x') - eval('rpcnotify('..channel..', "Hello There")') + eval('rpcnotify(' .. channel .. ', "Hello There")') expectn('Hello There', {}) end) it(':edit! (reload) causes detach #9642', function() - local b, tick = editoriginal(true, {'AAA', 'BBB'}) + local b, tick = editoriginal(true, { 'AAA', 'BBB' }) command('set undoreload=1') command('normal! x') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) command('edit!') - expectn('nvim_buf_detach_event', {b}) + expectn('nvim_buf_detach_event', { b }) end) it(':enew! does not detach hidden buffer', function() - local b, tick = editoriginal(true, {'AAA', 'BBB'}) + local b, tick = editoriginal(true, { 'AAA', 'BBB' }) local channel = nvim('get_api_info')[1] command('set undoreload=1 hidden') command('normal! x') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) command('enew!') - eval('rpcnotify('..channel..', "Hello There")') + eval('rpcnotify(' .. channel .. ', "Hello There")') expectn('Hello There', {}) end) it('stays attached if the buffer is hidden', function() - local b, tick = editoriginal(true, {'AAA'}) + local b, tick = editoriginal(true, { 'AAA' }) local channel = nvim('get_api_info')[1] -- Test that buffer events are working. command('normal! x') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) command('undo') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AAA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AAA' }, false }) tick = tick + 1 - expectn('nvim_buf_changedtick_event', {b, tick}) + expectn('nvim_buf_changedtick_event', { b, tick }) -- Close our buffer by creating a new one. command('set hidden') command('enew') -- Assert that no nvim_buf_detach_event is sent. - eval('rpcnotify('..channel..', "Hello There")') + eval('rpcnotify(' .. channel .. ', "Hello There")') expectn('Hello There', {}) -- Reopen the original buffer, assert that buffer events are still active. command('b1') command('normal! x') tick = tick + 1 - expectn('nvim_buf_lines_event', {b, tick, 0, 1, {'AA'}, false}) + expectn('nvim_buf_lines_event', { b, tick, 0, 1, { 'AA' }, false }) end) it('detaches if the buffer is unloaded/deleted/wiped', function() @@ -741,15 +775,15 @@ describe('API: buffer events:', function() clear() -- need to make a new window with a buffer because :bunload doesn't let you -- unload the last buffer - for _, cmd in ipairs({'bunload', 'bdelete', 'bwipeout'}) do + for _, cmd in ipairs({ 'bunload', 'bdelete', 'bwipeout' }) do command('new') -- open a brand spanking new file - local b = open(true, {'AAA'}) + local b = open(true, { 'AAA' }) -- call :bunload or whatever the command is, and then check that we -- receive a nvim_buf_detach_event command(cmd) - expectn('nvim_buf_detach_event', {b}) + expectn('nvim_buf_detach_event', { b }) end end) @@ -757,13 +791,13 @@ describe('API: buffer events:', function() clear() local b, tick = editoriginal(false) ok(buffer('attach', b, false, {})) - expectn('nvim_buf_changedtick_event', {b, tick}) + expectn('nvim_buf_changedtick_event', { b, tick }) end) it('returns a proper error on nonempty options dict', function() clear() local b = editoriginal(false) - eq("Invalid key: 'builtin'", pcall_err(buffer, 'attach', b, false, {builtin="asfd"})) + eq("Invalid key: 'builtin'", pcall_err(buffer, 'attach', b, false, { builtin = 'asfd' })) end) it('nvim_buf_attach returns response after delay #8634', function() @@ -773,11 +807,13 @@ describe('API: buffer events:', function() eq(true, helpers.request('nvim_buf_attach', 0, false, {})) -- notification eq({ - [1] = 'notification', - [2] = 'nvim_buf_changedtick_event', - [3] = { - [1] = { id = 1 }, - [2] = 2 }, }, next_msg()) + [1] = 'notification', + [2] = 'nvim_buf_changedtick_event', + [3] = { + [1] = { id = 1 }, + [2] = 2, + }, + }, next_msg()) end) end) @@ -787,7 +823,7 @@ describe('API: buffer events:', function() end) local function lines_subset(first, second) - for i = 1,#first do + for i = 1, #first do -- need to ignore trailing spaces if first[i]:gsub(' +$', '') ~= second[i]:gsub(' +$', '') then return false @@ -803,7 +839,7 @@ describe('API: buffer events:', function() local function assert_match_somewhere(expected_lines, buffer_lines) local msg = next_msg() - while(msg ~= nil) do + while msg ~= nil do local event = msg[2] if event == 'nvim_buf_lines_event' then local args = msg[3] @@ -814,7 +850,7 @@ describe('API: buffer events:', function() -- with the test setup. Note updates are contiguous. assert(#newlines <= 23) - for i = 1,#newlines do + for i = 1, #newlines do buffer_lines[starts + i] = newlines[i] end -- we don't compare the msg area of the embedded nvim, it's too flakey @@ -834,38 +870,34 @@ describe('API: buffer events:', function() local buffer_lines = {} local expected_lines = {} funcs.termopen({ nvim_prog, '-u', 'NONE', '-i', 'NONE', '-n', '-c', 'set shortmess+=A' }, { - env = { VIMRUNTIME = os.getenv('VIMRUNTIME') } + env = { VIMRUNTIME = os.getenv('VIMRUNTIME') }, }) local b = nvim('get_current_buf') ok(buffer('attach', b, true, {})) - for _ = 1,22 do - table.insert(expected_lines,'~') + for _ = 1, 22 do + table.insert(expected_lines, '~') end expected_lines[1] = '' - expected_lines[22] = ('tmp_terminal_nvim'..(' '):rep(45) - ..'0,0-1 All') + expected_lines[22] = ('tmp_terminal_nvim' .. (' '):rep(45) .. '0,0-1 All') sendkeys('i:e tmp_terminal_nvim<Enter>') assert_match_somewhere(expected_lines, buffer_lines) expected_lines[1] = 'Blarg' - expected_lines[22] = ('tmp_terminal_nvim [+]'..(' '):rep(41) - ..'1,6 All') + expected_lines[22] = ('tmp_terminal_nvim [+]' .. (' '):rep(41) .. '1,6 All') sendkeys('iBlarg') assert_match_somewhere(expected_lines, buffer_lines) - for i = 1,21 do + for i = 1, 21 do expected_lines[i] = 'xyz' end - expected_lines[22] = ('tmp_terminal_nvim [+]'..(' '):rep(41) - ..'31,4 Bot') + expected_lines[22] = ('tmp_terminal_nvim [+]' .. (' '):rep(41) .. '31,4 Bot') local s = string.rep('\nxyz', 30) sendkeys(s) assert_match_somewhere(expected_lines, buffer_lines) end) - end) diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua index 1ddb289ded..e286181bce 100644 --- a/test/functional/api/command_spec.lua +++ b/test/functional/api/command_spec.lua @@ -16,61 +16,164 @@ local feed = helpers.feed local funcs = helpers.funcs describe('nvim_get_commands', function() - local cmd_dict = { addr=NIL, bang=false, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='echo "Hello World"', name='Hello', nargs='1', preview=false, range=NIL, register=false, keepscript=false, script_id=0, } - local cmd_dict2 = { addr=NIL, bang=false, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='pwd', name='Pwd', nargs='?', preview=false, range=NIL, register=false, keepscript=false, script_id=0, } + local cmd_dict = { + addr = NIL, + bang = false, + bar = false, + complete = NIL, + complete_arg = NIL, + count = NIL, + definition = 'echo "Hello World"', + name = 'Hello', + nargs = '1', + preview = false, + range = NIL, + register = false, + keepscript = false, + script_id = 0, + } + local cmd_dict2 = { + addr = NIL, + bang = false, + bar = false, + complete = NIL, + complete_arg = NIL, + count = NIL, + definition = 'pwd', + name = 'Pwd', + nargs = '?', + preview = false, + range = NIL, + register = false, + keepscript = false, + script_id = 0, + } before_each(clear) it('gets empty list if no commands were defined', function() - eq({}, meths.get_commands({builtin=false})) + eq({}, meths.get_commands({ builtin = false })) end) it('validation', function() - eq('builtin=true not implemented', pcall_err(meths.get_commands, - {builtin=true})) - eq("Invalid key: 'foo'", pcall_err(meths.get_commands, - {foo='blah'})) + eq('builtin=true not implemented', pcall_err(meths.get_commands, { builtin = true })) + eq("Invalid key: 'foo'", pcall_err(meths.get_commands, { foo = 'blah' })) end) it('gets global user-defined commands', function() -- Define a command. command('command -nargs=1 Hello echo "Hello World"') - eq({Hello=cmd_dict}, meths.get_commands({builtin=false})) + eq({ Hello = cmd_dict }, meths.get_commands({ builtin = false })) -- Define another command. - command('command -nargs=? Pwd pwd'); - eq({Hello=cmd_dict, Pwd=cmd_dict2}, meths.get_commands({builtin=false})) + command('command -nargs=? Pwd pwd') + eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, meths.get_commands({ builtin = false })) -- Delete a command. command('delcommand Pwd') - eq({Hello=cmd_dict}, meths.get_commands({builtin=false})) + eq({ Hello = cmd_dict }, meths.get_commands({ builtin = false })) end) it('gets buffer-local user-defined commands', function() -- Define a buffer-local command. command('command -buffer -nargs=1 Hello echo "Hello World"') - eq({Hello=cmd_dict}, curbufmeths.get_commands({builtin=false})) + eq({ Hello = cmd_dict }, curbufmeths.get_commands({ builtin = false })) -- Define another buffer-local command. command('command -buffer -nargs=? Pwd pwd') - eq({Hello=cmd_dict, Pwd=cmd_dict2}, curbufmeths.get_commands({builtin=false})) + eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, curbufmeths.get_commands({ builtin = false })) -- Delete a command. command('delcommand Pwd') - eq({Hello=cmd_dict}, curbufmeths.get_commands({builtin=false})) + eq({ Hello = cmd_dict }, curbufmeths.get_commands({ builtin = false })) -- {builtin=true} always returns empty for buffer-local case. - eq({}, curbufmeths.get_commands({builtin=true})) + eq({}, curbufmeths.get_commands({ builtin = true })) end) it('gets various command attributes', function() - local cmd0 = { addr='arguments', bang=false, bar=false, complete='dir', complete_arg=NIL, count='10', definition='pwd <args>', name='TestCmd', nargs='1', preview=false, range='10', register=false, keepscript=false, script_id=0, } - local cmd1 = { addr=NIL, bang=false, bar=false, complete='custom', complete_arg='ListUsers', count=NIL, definition='!finger <args>', name='Finger', nargs='+', preview=false, range=NIL, register=false, keepscript=false, script_id=1, } - local cmd2 = { addr=NIL, bang=true, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='call \128\253R2_foo(<q-args>)', name='Cmd2', nargs='*', preview=false, range=NIL, register=false, keepscript=false, script_id=2, } - local cmd3 = { addr=NIL, bang=false, bar=true, complete=NIL, complete_arg=NIL, count=NIL, definition='call \128\253R3_ohyeah()', name='Cmd3', nargs='0', preview=false, range=NIL, register=false, keepscript=false, script_id=3, } - local cmd4 = { addr=NIL, bang=false, bar=false, complete=NIL, complete_arg=NIL, count=NIL, definition='call \128\253R4_just_great()', name='Cmd4', nargs='0', preview=false, range=NIL, register=true, keepscript=false, script_id=4, } + local cmd0 = { + addr = 'arguments', + bang = false, + bar = false, + complete = 'dir', + complete_arg = NIL, + count = '10', + definition = 'pwd <args>', + name = 'TestCmd', + nargs = '1', + preview = false, + range = '10', + register = false, + keepscript = false, + script_id = 0, + } + local cmd1 = { + addr = NIL, + bang = false, + bar = false, + complete = 'custom', + complete_arg = 'ListUsers', + count = NIL, + definition = '!finger <args>', + name = 'Finger', + nargs = '+', + preview = false, + range = NIL, + register = false, + keepscript = false, + script_id = 1, + } + local cmd2 = { + addr = NIL, + bang = true, + bar = false, + complete = NIL, + complete_arg = NIL, + count = NIL, + definition = 'call \128\253R2_foo(<q-args>)', + name = 'Cmd2', + nargs = '*', + preview = false, + range = NIL, + register = false, + keepscript = false, + script_id = 2, + } + local cmd3 = { + addr = NIL, + bang = false, + bar = true, + complete = NIL, + complete_arg = NIL, + count = NIL, + definition = 'call \128\253R3_ohyeah()', + name = 'Cmd3', + nargs = '0', + preview = false, + range = NIL, + register = false, + keepscript = false, + script_id = 3, + } + local cmd4 = { + addr = NIL, + bang = false, + bar = false, + complete = NIL, + complete_arg = NIL, + count = NIL, + definition = 'call \128\253R4_just_great()', + name = 'Cmd4', + nargs = '0', + preview = false, + range = NIL, + register = true, + keepscript = false, + script_id = 4, + } source([[ let s:foo = 1 command -complete=custom,ListUsers -nargs=+ Finger !finger <args> ]]) - eq({Finger=cmd1}, meths.get_commands({builtin=false})) + eq({ Finger = cmd1 }, meths.get_commands({ builtin = false })) command('command -nargs=1 -complete=dir -addr=arguments -count=10 TestCmd pwd <args>') - eq({Finger=cmd1, TestCmd=cmd0}, meths.get_commands({builtin=false})) + eq({ Finger = cmd1, TestCmd = cmd0 }, meths.get_commands({ builtin = false })) source([[ function! s:foo() abort @@ -88,7 +191,10 @@ describe('nvim_get_commands', function() command -register Cmd4 call <SID>just_great() ]]) -- TODO(justinmk): Order is stable but undefined. Sort before return? - eq({Cmd2=cmd2, Cmd3=cmd3, Cmd4=cmd4, Finger=cmd1, TestCmd=cmd0}, meths.get_commands({builtin=false})) + eq( + { Cmd2 = cmd2, Cmd3 = cmd3, Cmd4 = cmd4, Finger = cmd1, TestCmd = cmd0 }, + meths.get_commands({ builtin = false }) + ) end) end) @@ -96,7 +202,7 @@ describe('nvim_create_user_command', function() before_each(clear) it('works with strings', function() - meths.create_user_command('SomeCommand', 'let g:command_fired = <args>', {nargs = 1}) + meths.create_user_command('SomeCommand', 'let g:command_fired = <args>', { nargs = 1 }) meths.command('SomeCommand 42') eq(42, meths.eval('g:command_fired')) end) @@ -113,227 +219,245 @@ describe('nvim_create_user_command', function() }) ]] - eq({ - name = "CommandWithLuaCallback", - args = [[this\ is a\ test]], - fargs = {"this ", "is", "a test"}, - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + eq( + { + name = 'CommandWithLuaCallback', + args = [[this\ is a\ test]], + fargs = { 'this ', 'is', 'a test' }, + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [=[ + exec_lua [=[ vim.api.nvim_command([[CommandWithLuaCallback this\ is a\ test]]) return result - ]=]) - - eq({ - name = "CommandWithLuaCallback", - args = [[this includes\ a backslash: \\]], - fargs = {"this", "includes a", "backslash:", "\\"}, - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + ]=] + ) + + eq( + { + name = 'CommandWithLuaCallback', + args = [[this includes\ a backslash: \\]], + fargs = { 'this', 'includes a', 'backslash:', '\\' }, + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [=[ + exec_lua [=[ vim.api.nvim_command([[CommandWithLuaCallback this includes\ a backslash: \\]]) return result - ]=]) - - eq({ - name = "CommandWithLuaCallback", - args = "a\\b", - fargs = {"a\\b"}, - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + ]=] + ) + + eq( + { + name = 'CommandWithLuaCallback', + args = 'a\\b', + fargs = { 'a\\b' }, + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [=[ + exec_lua [=[ vim.api.nvim_command('CommandWithLuaCallback a\\b') return result - ]=]) - - eq({ - name = "CommandWithLuaCallback", - args = 'h\tey ', - fargs = {[[h]], [[ey]]}, - bang = true, - line1 = 10, - line2 = 10, - mods = "confirm unsilent botright horizontal", - smods = { - browse = false, - confirm = true, - emsg_silent = false, - hide = false, - horizontal = true, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "botright", - tab = -1, - unsilent = true, - verbose = -1, - vertical = false, + ]=] + ) + + eq( + { + name = 'CommandWithLuaCallback', + args = 'h\tey ', + fargs = { [[h]], [[ey]] }, + bang = true, + line1 = 10, + line2 = 10, + mods = 'confirm unsilent botright horizontal', + smods = { + browse = false, + confirm = true, + emsg_silent = false, + hide = false, + horizontal = true, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = 'botright', + tab = -1, + unsilent = true, + verbose = -1, + vertical = false, + }, + range = 1, + count = 10, + reg = '', }, - range = 1, - count = 10, - reg = "", - }, exec_lua [=[ + exec_lua [=[ vim.api.nvim_command('unsilent horizontal botright confirm 10CommandWithLuaCallback! h\tey ') return result - ]=]) - - eq({ - name = "CommandWithLuaCallback", - args = "h", - fargs = {"h"}, - bang = false, - line1 = 1, - line2 = 42, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + ]=] + ) + + eq( + { + name = 'CommandWithLuaCallback', + args = 'h', + fargs = { 'h' }, + bang = false, + line1 = 1, + line2 = 42, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 1, + count = 42, + reg = '', }, - range = 1, - count = 42, - reg = "", - }, exec_lua [[ + exec_lua [[ vim.api.nvim_command('CommandWithLuaCallback 42 h') return result - ]]) - - eq({ - name = "CommandWithLuaCallback", - args = "", - fargs = {}, -- fargs works without args - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + ]] + ) + + eq( + { + name = 'CommandWithLuaCallback', + args = '', + fargs = {}, -- fargs works without args + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [[ + exec_lua [[ vim.api.nvim_command('CommandWithLuaCallback') return result - ]]) + ]] + ) -- f-args doesn't split when command nargs is 1 or "?" exec_lua [[ @@ -347,80 +471,86 @@ describe('nvim_create_user_command', function() }) ]] - eq({ - name = "CommandWithOneOrNoArg", - args = "hello I'm one argument", - fargs = {"hello I'm one argument"}, -- Doesn't split args - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + eq( + { + name = 'CommandWithOneOrNoArg', + args = "hello I'm one argument", + fargs = { "hello I'm one argument" }, -- Doesn't split args + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [[ + exec_lua [[ vim.api.nvim_command('CommandWithOneOrNoArg hello I\'m one argument') return result - ]]) + ]] + ) -- f-args is an empty table if no args were passed - eq({ - name = "CommandWithOneOrNoArg", - args = "", - fargs = {}, - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + eq( + { + name = 'CommandWithOneOrNoArg', + args = '', + fargs = {}, + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [[ + exec_lua [[ vim.api.nvim_command('CommandWithOneOrNoArg') return result - ]]) + ]] + ) -- f-args is an empty table when the command nargs=0 exec_lua [[ @@ -434,88 +564,93 @@ describe('nvim_create_user_command', function() register = true, }) ]] - eq({ - name = "CommandWithNoArgs", - args = "", - fargs = {}, - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + eq( + { + name = 'CommandWithNoArgs', + args = '', + fargs = {}, + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '', }, - range = 0, - count = 2, - reg = "", - }, exec_lua [[ + exec_lua [[ vim.cmd('CommandWithNoArgs') return result - ]]) + ]] + ) -- register can be specified - eq({ - name = "CommandWithNoArgs", - args = "", - fargs = {}, - bang = false, - line1 = 1, - line2 = 1, - mods = "", - smods = { - browse = false, - confirm = false, - emsg_silent = false, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = "", - tab = -1, - unsilent = false, - verbose = -1, - vertical = false, + eq( + { + name = 'CommandWithNoArgs', + args = '', + fargs = {}, + bang = false, + line1 = 1, + line2 = 1, + mods = '', + smods = { + browse = false, + confirm = false, + emsg_silent = false, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = '', + tab = -1, + unsilent = false, + verbose = -1, + vertical = false, + }, + range = 0, + count = 2, + reg = '+', }, - range = 0, - count = 2, - reg = "+", - }, exec_lua [[ + exec_lua [[ vim.cmd('CommandWithNoArgs +') return result - ]]) - + ]] + ) end) it('can define buffer-local commands', function() local bufnr = meths.create_buf(false, false) - bufmeths.create_user_command(bufnr, "Hello", "", {}) - matches("Not an editor command: Hello", pcall_err(meths.command, "Hello")) + bufmeths.create_user_command(bufnr, 'Hello', '', {}) + matches('Not an editor command: Hello', pcall_err(meths.command, 'Hello')) meths.set_current_buf(bufnr) - meths.command("Hello") + meths.command('Hello') assert_alive() end) @@ -543,33 +678,63 @@ describe('nvim_create_user_command', function() end) it('does not allow invalid command names', function() - eq("Invalid command name (must start with uppercase): 'test'", pcall_err(exec_lua, [[ + eq( + "Invalid command name (must start with uppercase): 'test'", + pcall_err( + exec_lua, + [[ vim.api.nvim_create_user_command('test', 'echo "hi"', {}) - ]])) - eq("Invalid command name: 't@'", pcall_err(exec_lua, [[ + ]] + ) + ) + eq( + "Invalid command name: 't@'", + pcall_err( + exec_lua, + [[ vim.api.nvim_create_user_command('t@', 'echo "hi"', {}) - ]])) - eq("Invalid command name: 'T@st'", pcall_err(exec_lua, [[ + ]] + ) + ) + eq( + "Invalid command name: 'T@st'", + pcall_err( + exec_lua, + [[ vim.api.nvim_create_user_command('T@st', 'echo "hi"', {}) - ]])) - eq("Invalid command name: 'Test!'", pcall_err(exec_lua, [[ + ]] + ) + ) + eq( + "Invalid command name: 'Test!'", + pcall_err( + exec_lua, + [[ vim.api.nvim_create_user_command('Test!', 'echo "hi"', {}) - ]])) - eq("Invalid command name: '💩'", pcall_err(exec_lua, [[ + ]] + ) + ) + eq( + "Invalid command name: '💩'", + pcall_err( + exec_lua, + [[ vim.api.nvim_create_user_command('💩', 'echo "hi"', {}) - ]])) + ]] + ) + ) end) it('smods can be used with nvim_cmd', function() - exec_lua[[ + exec_lua [[ vim.api.nvim_create_user_command('MyEcho', function(opts) vim.api.nvim_cmd({ cmd = 'echo', args = { '&verbose' }, mods = opts.smods }, {}) end, {}) ]] - eq("3", meths.cmd({ cmd = 'MyEcho', mods = { verbose = 3 } }, { output = true })) + eq('3', meths.cmd({ cmd = 'MyEcho', mods = { verbose = 3 } }, { output = true })) eq(1, #meths.list_tabpages()) - exec_lua[[ + exec_lua [[ vim.api.nvim_create_user_command('MySplit', function(opts) vim.api.nvim_cmd({ cmd = 'split', mods = opts.smods }, {}) end, {}) @@ -599,13 +764,13 @@ describe('nvim_del_user_command', function() meths.create_user_command('Hello', 'echo "Hi"', {}) meths.command('Hello') meths.del_user_command('Hello') - matches("Not an editor command: Hello", pcall_err(meths.command, "Hello")) + matches('Not an editor command: Hello', pcall_err(meths.command, 'Hello')) end) it('can delete buffer-local commands', function() bufmeths.create_user_command(0, 'Hello', 'echo "Hi"', {}) meths.command('Hello') bufmeths.del_user_command(0, 'Hello') - matches("Not an editor command: Hello", pcall_err(meths.command, "Hello")) + matches('Not an editor command: Hello', pcall_err(meths.command, 'Hello')) end) end) diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 56383986f3..0594f36d0e 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -45,13 +45,13 @@ end local function check_undo_redo(ns, mark, sr, sc, er, ec) --s = start, e = end local rv = get_extmark_by_id(ns, mark) - eq({er, ec}, rv) - feed("u") + eq({ er, ec }, rv) + feed('u') rv = get_extmark_by_id(ns, mark) - eq({sr, sc}, rv) - feed("<c-r>") + eq({ sr, sc }, rv) + feed('<c-r>') rv = get_extmark_by_id(ns, mark) - eq({er, ec}, rv) + eq({ er, ec }, rv) end local function batch_set(ns_id, positions) @@ -64,20 +64,20 @@ end local function batch_check(ns_id, ids, positions) local actual, expected = {}, {} - for i,id in ipairs(ids) do + for i, id in ipairs(ids) do expected[id] = positions[i] end for _, mark in pairs(get_extmarks(ns_id, 0, -1, {})) do - actual[mark[1]] = {mark[2], mark[3]} + actual[mark[1]] = { mark[2], mark[3] } end eq(expected, actual) end local function batch_check_undo_redo(ns_id, ids, before, after) batch_check(ns_id, ids, after) - feed("u") + feed('u') batch_check(ns_id, ids, before) - feed("<c-r>") + feed('<c-r>') batch_check(ns_id, ids, after) end @@ -88,49 +88,78 @@ describe('API/extmarks', function() before_each(function() -- Initialize some namespaces and insert 12345 into a buffer - marks = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} - positions = {{0, 0,}, {0, 2}, {0, 3}} + marks = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } + positions = { { 0, 0 }, { 0, 2 }, { 0, 3 } } - init_text = "12345" + init_text = '12345' row = 0 col = 2 clear() insert(init_text) - ns = request('nvim_create_namespace', "my-fancy-plugin") - ns2 = request('nvim_create_namespace', "my-fancy-plugin2") + ns = request('nvim_create_namespace', 'my-fancy-plugin') + ns2 = request('nvim_create_namespace', 'my-fancy-plugin2') end) it('validation', function() - eq("Invalid 'end_col': expected Integer, got Array", pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = {}, end_row = 1 })) - eq("Invalid 'end_row': expected Integer, got Array", pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_row = {} })) - eq("Invalid 'virt_text_pos': expected String, got Integer", pcall_err(set_extmark, ns, marks[2], 0, 0, { virt_text_pos = 0 })) - eq("Invalid 'virt_text_pos': 'foo'", pcall_err(set_extmark, ns, marks[2], 0, 0, { virt_text_pos = 'foo' })) - eq("Invalid 'hl_mode': expected String, got Integer", pcall_err(set_extmark, ns, marks[2], 0, 0, { hl_mode = 0 })) + eq( + "Invalid 'end_col': expected Integer, got Array", + pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = {}, end_row = 1 }) + ) + eq( + "Invalid 'end_row': expected Integer, got Array", + pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_row = {} }) + ) + eq( + "Invalid 'virt_text_pos': expected String, got Integer", + pcall_err(set_extmark, ns, marks[2], 0, 0, { virt_text_pos = 0 }) + ) + eq( + "Invalid 'virt_text_pos': 'foo'", + pcall_err(set_extmark, ns, marks[2], 0, 0, { virt_text_pos = 'foo' }) + ) + eq( + "Invalid 'hl_mode': expected String, got Integer", + pcall_err(set_extmark, ns, marks[2], 0, 0, { hl_mode = 0 }) + ) eq("Invalid 'hl_mode': 'foo'", pcall_err(set_extmark, ns, marks[2], 0, 0, { hl_mode = 'foo' })) - eq("Invalid 'id': expected Integer, got Array", pcall_err(set_extmark, ns, {}, 0, 0, { end_col = 1, end_row = 1 })) - eq("Invalid mark position: expected 2 Integer items", pcall_err(get_extmarks, ns, {}, {-1, -1})) - eq("Invalid mark position: expected mark id Integer or 2-item Array", pcall_err(get_extmarks, ns, true, {-1, -1})) + eq( + "Invalid 'id': expected Integer, got Array", + pcall_err(set_extmark, ns, {}, 0, 0, { end_col = 1, end_row = 1 }) + ) + eq( + 'Invalid mark position: expected 2 Integer items', + pcall_err(get_extmarks, ns, {}, { -1, -1 }) + ) + eq( + 'Invalid mark position: expected mark id Integer or 2-item Array', + pcall_err(get_extmarks, ns, true, { -1, -1 }) + ) -- No memory leak with virt_text, virt_lines, sign_text - eq("right_gravity is not a boolean", pcall_err(set_extmark, ns, marks[2], 0, 0, { - virt_text = {{'foo', 'Normal'}}, - virt_lines = {{{'bar', 'Normal'}}}, - sign_text = 'a', - right_gravity = 'baz', - })) + eq( + 'right_gravity is not a boolean', + pcall_err(set_extmark, ns, marks[2], 0, 0, { + virt_text = { { 'foo', 'Normal' } }, + virt_lines = { { { 'bar', 'Normal' } } }, + sign_text = 'a', + right_gravity = 'baz', + }) + ) end) - it("can end extranges past final newline using end_col = 0", function() + it('can end extranges past final newline using end_col = 0', function() set_extmark(ns, marks[1], 0, 0, { end_col = 0, - end_row = 1 + end_row = 1, }) - eq("Invalid 'end_col': out of range", - pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_row = 1 })) + eq( + "Invalid 'end_col': out of range", + pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_row = 1 }) + ) end) - it("can end extranges past final newline when strict mode is false", function() + it('can end extranges past final newline when strict mode is false', function() set_extmark(ns, marks[1], 0, 0, { end_col = 1, end_row = 1, @@ -138,7 +167,7 @@ describe('API/extmarks', function() }) end) - it("can end extranges past final column when strict mode is false", function() + it('can end extranges past final column when strict mode is false', function() set_extmark(ns, marks[1], 0, 0, { end_col = 6, end_row = 0, @@ -150,7 +179,7 @@ describe('API/extmarks', function() local rv = set_extmark(ns, marks[1], positions[1][1], positions[1][2]) eq(marks[1], rv) rv = get_extmark_by_id(ns, marks[1]) - eq({positions[1][1], positions[1][2]}, rv) + eq({ positions[1][1], positions[1][2] }, rv) -- Test adding a second mark on same row works rv = set_extmark(ns, marks[2], positions[2][1], positions[2][2]) eq(marks[2], rv) @@ -159,14 +188,14 @@ describe('API/extmarks', function() rv = set_extmark(ns, marks[1], positions[1][1], positions[1][2]) eq(marks[1], rv) rv = get_extmark_by_id(ns, marks[2]) - eq({positions[2][1], positions[2][2]}, rv) + eq({ positions[2][1], positions[2][2] }, rv) -- Test an update, (new pos) row = positions[1][1] col = positions[1][2] + 1 rv = set_extmark(ns, marks[1], row, col) eq(marks[1], rv) rv = get_extmark_by_id(ns, marks[1]) - eq({row, col}, rv) + eq({ row, col }, rv) -- remove the test marks eq(true, curbufmeths.del_extmark(ns, marks[1])) @@ -182,14 +211,14 @@ describe('API/extmarks', function() -- force a new undo buffer feed('o<esc>') curbufmeths.clear_namespace(ns2, 0, -1) - eq({{1, 0, 1}}, get_extmarks(ns, {0, 0}, {-1, -1})) - eq({}, get_extmarks(ns2, {0, 0}, {-1, -1})) + eq({ { 1, 0, 1 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) + eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('u') - eq({{1, 0, 1}}, get_extmarks(ns, {0, 0}, {-1, -1})) - eq({}, get_extmarks(ns2, {0, 0}, {-1, -1})) + eq({ { 1, 0, 1 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) + eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('<c-r>') - eq({{1, 0, 1}}, get_extmarks(ns, {0, 0}, {-1, -1})) - eq({}, get_extmarks(ns2, {0, 0}, {-1, -1})) + eq({ { 1, 0, 1 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) + eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) end) it('can clear a namespace range using 0,-1', function() @@ -198,30 +227,30 @@ describe('API/extmarks', function() -- force a new undo buffer feed('o<esc>') curbufmeths.clear_namespace(-1, 0, -1) - eq({}, get_extmarks(ns, {0, 0}, {-1, -1})) - eq({}, get_extmarks(ns2, {0, 0}, {-1, -1})) + eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 })) + eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('u') - eq({}, get_extmarks(ns, {0, 0}, {-1, -1})) - eq({}, get_extmarks(ns2, {0, 0}, {-1, -1})) + eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 })) + eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('<c-r>') - eq({}, get_extmarks(ns, {0, 0}, {-1, -1})) - eq({}, get_extmarks(ns2, {0, 0}, {-1, -1})) + eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 })) + eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) end) it('can undo with extmarks (#25147)', function() feed('itest<esc>') set_extmark(ns, 1, 0, 0) set_extmark(ns, 2, 1, 0) - eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, {0, 0}, {-1, -1})) + eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) feed('dd') - eq({ { 1, 1, 0 }, { 2, 1, 0 } }, get_extmarks(ns, {0, 0}, {-1, -1})) + eq({ { 1, 1, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) curbufmeths.clear_namespace(ns, 0, -1) - eq({}, get_extmarks(ns, {0, 0}, {-1, -1})) + eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 })) set_extmark(ns, 1, 0, 0, { right_gravity = false }) set_extmark(ns, 2, 1, 0, { right_gravity = false }) - eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, {0, 0}, {-1, -1})) + eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) feed('u') - eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, {0, 0}, {-1, -1})) + eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) curbufmeths.clear_namespace(ns, 0, -1) end) @@ -237,112 +266,114 @@ describe('API/extmarks', function() end -- {0, 0} and {-1, -1} work as extreme values - eq({{1, 0, 0}}, get_extmarks(ns, {0, 0}, {0, 0})) - eq({}, get_extmarks(ns, {-1, -1}, {-1, -1})) - local rv = get_extmarks(ns, {0, 0}, {-1, -1}) + eq({ { 1, 0, 0 } }, get_extmarks(ns, { 0, 0 }, { 0, 0 })) + eq({}, get_extmarks(ns, { -1, -1 }, { -1, -1 })) + local rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) for i, m in ipairs(marks) do if positions[i] ~= nil then - eq({m, positions[i][1], positions[i][2]}, rv[i]) + eq({ m, positions[i][1], positions[i][2] }, rv[i]) end end -- 0 and -1 works as short hand extreme values - eq({{1, 0, 0}}, get_extmarks(ns, 0, 0)) + eq({ { 1, 0, 0 } }, get_extmarks(ns, 0, 0)) eq({}, get_extmarks(ns, -1, -1)) rv = get_extmarks(ns, 0, -1) for i, m in ipairs(marks) do if positions[i] ~= nil then - eq({m, positions[i][1], positions[i][2]}, rv[i]) + eq({ m, positions[i][1], positions[i][2] }, rv[i]) end end -- next with mark id - rv = get_extmarks(ns, marks[1], {-1, -1}, {limit=1}) - eq({{marks[1], positions[1][1], positions[1][2]}}, rv) - rv = get_extmarks(ns, marks[2], {-1, -1}, {limit=1}) - eq({{marks[2], positions[2][1], positions[2][2]}}, rv) + rv = get_extmarks(ns, marks[1], { -1, -1 }, { limit = 1 }) + eq({ { marks[1], positions[1][1], positions[1][2] } }, rv) + rv = get_extmarks(ns, marks[2], { -1, -1 }, { limit = 1 }) + eq({ { marks[2], positions[2][1], positions[2][2] } }, rv) -- next with positional when mark exists at position - rv = get_extmarks(ns, positions[1], {-1, -1}, {limit=1}) - eq({{marks[1], positions[1][1], positions[1][2]}}, rv) + rv = get_extmarks(ns, positions[1], { -1, -1 }, { limit = 1 }) + eq({ { marks[1], positions[1][1], positions[1][2] } }, rv) -- next with positional index (no mark at position) - rv = get_extmarks(ns, {positions[1][1], positions[1][2] +1}, {-1, -1}, {limit=1}) - eq({{marks[2], positions[2][1], positions[2][2]}}, rv) + rv = get_extmarks(ns, { positions[1][1], positions[1][2] + 1 }, { -1, -1 }, { limit = 1 }) + eq({ { marks[2], positions[2][1], positions[2][2] } }, rv) -- next with Extremity index - rv = get_extmarks(ns, {0,0}, {-1, -1}, {limit=1}) - eq({{marks[1], positions[1][1], positions[1][2]}}, rv) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 1 }) + eq({ { marks[1], positions[1][1], positions[1][2] } }, rv) -- nextrange with mark id rv = get_extmarks(ns, marks[1], marks[3]) - eq({marks[1], positions[1][1], positions[1][2]}, rv[1]) - eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) + eq({ marks[1], positions[1][1], positions[1][2] }, rv[1]) + eq({ marks[2], positions[2][1], positions[2][2] }, rv[2]) -- nextrange with `limit` - rv = get_extmarks(ns, marks[1], marks[3], {limit=2}) + rv = get_extmarks(ns, marks[1], marks[3], { limit = 2 }) eq(2, #rv) -- nextrange with positional when mark exists at position rv = get_extmarks(ns, positions[1], positions[3]) - eq({marks[1], positions[1][1], positions[1][2]}, rv[1]) - eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) + eq({ marks[1], positions[1][1], positions[1][2] }, rv[1]) + eq({ marks[2], positions[2][1], positions[2][2] }, rv[2]) rv = get_extmarks(ns, positions[2], positions[3]) eq(2, #rv) -- nextrange with positional index (no mark at position) - local lower = {positions[1][1], positions[2][2] -1} - local upper = {positions[2][1], positions[3][2] - 1} + local lower = { positions[1][1], positions[2][2] - 1 } + local upper = { positions[2][1], positions[3][2] - 1 } rv = get_extmarks(ns, lower, upper) - eq({{marks[2], positions[2][1], positions[2][2]}}, rv) - lower = {positions[3][1], positions[3][2] + 1} - upper = {positions[3][1], positions[3][2] + 2} + eq({ { marks[2], positions[2][1], positions[2][2] } }, rv) + lower = { positions[3][1], positions[3][2] + 1 } + upper = { positions[3][1], positions[3][2] + 2 } rv = get_extmarks(ns, lower, upper) eq({}, rv) -- nextrange with extremity index - lower = {positions[2][1], positions[2][2]+1} - upper = {-1, -1} + lower = { positions[2][1], positions[2][2] + 1 } + upper = { -1, -1 } rv = get_extmarks(ns, lower, upper) - eq({{marks[3], positions[3][1], positions[3][2]}}, rv) + eq({ { marks[3], positions[3][1], positions[3][2] } }, rv) -- prev with mark id - rv = get_extmarks(ns, marks[3], {0, 0}, {limit=1}) - eq({{marks[3], positions[3][1], positions[3][2]}}, rv) - rv = get_extmarks(ns, marks[2], {0, 0}, {limit=1}) - eq({{marks[2], positions[2][1], positions[2][2]}}, rv) + rv = get_extmarks(ns, marks[3], { 0, 0 }, { limit = 1 }) + eq({ { marks[3], positions[3][1], positions[3][2] } }, rv) + rv = get_extmarks(ns, marks[2], { 0, 0 }, { limit = 1 }) + eq({ { marks[2], positions[2][1], positions[2][2] } }, rv) -- prev with positional when mark exists at position - rv = get_extmarks(ns, positions[3], {0, 0}, {limit=1}) - eq({{marks[3], positions[3][1], positions[3][2]}}, rv) + rv = get_extmarks(ns, positions[3], { 0, 0 }, { limit = 1 }) + eq({ { marks[3], positions[3][1], positions[3][2] } }, rv) -- prev with positional index (no mark at position) - rv = get_extmarks(ns, {positions[1][1], positions[1][2] +1}, {0, 0}, {limit=1}) - eq({{marks[1], positions[1][1], positions[1][2]}}, rv) + rv = get_extmarks(ns, { positions[1][1], positions[1][2] + 1 }, { 0, 0 }, { limit = 1 }) + eq({ { marks[1], positions[1][1], positions[1][2] } }, rv) -- prev with Extremity index - rv = get_extmarks(ns, {-1,-1}, {0,0}, {limit=1}) - eq({{marks[3], positions[3][1], positions[3][2]}}, rv) + rv = get_extmarks(ns, { -1, -1 }, { 0, 0 }, { limit = 1 }) + eq({ { marks[3], positions[3][1], positions[3][2] } }, rv) -- prevrange with mark id rv = get_extmarks(ns, marks[3], marks[1]) - eq({marks[3], positions[3][1], positions[3][2]}, rv[1]) - eq({marks[2], positions[2][1], positions[2][2]}, rv[2]) - eq({marks[1], positions[1][1], positions[1][2]}, rv[3]) + eq({ marks[3], positions[3][1], positions[3][2] }, rv[1]) + eq({ marks[2], positions[2][1], positions[2][2] }, rv[2]) + eq({ marks[1], positions[1][1], positions[1][2] }, rv[3]) -- prevrange with limit - rv = get_extmarks(ns, marks[3], marks[1], {limit=2}) + rv = get_extmarks(ns, marks[3], marks[1], { limit = 2 }) eq(2, #rv) -- prevrange with positional when mark exists at position rv = get_extmarks(ns, positions[3], positions[1]) - eq({{marks[3], positions[3][1], positions[3][2]}, - {marks[2], positions[2][1], positions[2][2]}, - {marks[1], positions[1][1], positions[1][2]}}, rv) + eq({ + { marks[3], positions[3][1], positions[3][2] }, + { marks[2], positions[2][1], positions[2][2] }, + { marks[1], positions[1][1], positions[1][2] }, + }, rv) rv = get_extmarks(ns, positions[2], positions[1]) eq(2, #rv) -- prevrange with positional index (no mark at position) - lower = {positions[2][1], positions[2][2] + 1} - upper = {positions[3][1], positions[3][2] + 1} + lower = { positions[2][1], positions[2][2] + 1 } + upper = { positions[3][1], positions[3][2] + 1 } rv = get_extmarks(ns, upper, lower) - eq({{marks[3], positions[3][1], positions[3][2]}}, rv) - lower = {positions[3][1], positions[3][2] + 1} - upper = {positions[3][1], positions[3][2] + 2} + eq({ { marks[3], positions[3][1], positions[3][2] } }, rv) + lower = { positions[3][1], positions[3][2] + 1 } + upper = { positions[3][1], positions[3][2] + 2 } rv = get_extmarks(ns, upper, lower) eq({}, rv) -- prevrange with extremity index - lower = {0,0} - upper = {positions[2][1], positions[2][2] - 1} + lower = { 0, 0 } + upper = { positions[2][1], positions[2][2] - 1 } rv = get_extmarks(ns, upper, lower) - eq({{marks[1], positions[1][1], positions[1][2]}}, rv) + eq({ { marks[1], positions[1][1], positions[1][2] } }, rv) end) it('querying for information with limit', function() @@ -354,34 +385,34 @@ describe('API/extmarks', function() end end - local rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=1}) + local rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 1 }) eq(1, #rv) - rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=2}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 2 }) eq(2, #rv) - rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=3}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 3 }) eq(3, #rv) -- now in reverse - rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=1}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 1 }) eq(1, #rv) - rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=2}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 2 }) eq(2, #rv) - rv = get_extmarks(ns, {0, 0}, {-1, -1}, {limit=3}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }, { limit = 3 }) eq(3, #rv) end) it('get_marks works when mark col > upper col', function() feed('A<cr>12345<esc>') feed('A<cr>12345<esc>') - set_extmark(ns, 10, 0, 2) -- this shouldn't be found - set_extmark(ns, 11, 2, 1) -- this shouldn't be found + set_extmark(ns, 10, 0, 2) -- this shouldn't be found + set_extmark(ns, 11, 2, 1) -- this shouldn't be found set_extmark(ns, marks[1], 0, 4) -- check col > our upper bound set_extmark(ns, marks[2], 1, 1) -- check col < lower bound set_extmark(ns, marks[3], 2, 0) -- check is inclusive - eq({{marks[1], 0, 4}, - {marks[2], 1, 1}, - {marks[3], 2, 0}}, - get_extmarks(ns, {0, 3}, {2, 0})) + eq( + { { marks[1], 0, 4 }, { marks[2], 1, 1 }, { marks[3], 2, 0 } }, + get_extmarks(ns, { 0, 3 }, { 2, 0 }) + ) end) it('get_marks works in reverse when mark col < lower col', function() @@ -392,28 +423,24 @@ describe('API/extmarks', function() set_extmark(ns, marks[1], 2, 1) -- check col < our lower bound set_extmark(ns, marks[2], 1, 4) -- check col > upper bound set_extmark(ns, marks[3], 0, 2) -- check is inclusive - local rv = get_extmarks(ns, {2, 3}, {0, 2}) - eq({{marks[1], 2, 1}, - {marks[2], 1, 4}, - {marks[3], 0, 2}}, - rv) + local rv = get_extmarks(ns, { 2, 3 }, { 0, 2 }) + eq({ { marks[1], 2, 1 }, { marks[2], 1, 4 }, { marks[3], 0, 2 } }, rv) end) it('get_marks limit=0 returns nothing', function() set_extmark(ns, marks[1], positions[1][1], positions[1][2]) - local rv = get_extmarks(ns, {-1, -1}, {-1, -1}, {limit=0}) + local rv = get_extmarks(ns, { -1, -1 }, { -1, -1 }, { limit = 0 }) eq({}, rv) end) - it('marks move with line insertations', function() set_extmark(ns, marks[1], 0, 0) - feed("yyP") + feed('yyP') check_undo_redo(ns, marks[1], 0, 0, 1, 0) end) it('marks move with multiline insertations', function() - feed("a<cr>22<cr>33<esc>") + feed('a<cr>22<cr>33<esc>') set_extmark(ns, marks[1], 1, 1) feed('ggVGyP') check_undo_redo(ns, marks[1], 1, 1, 4, 1) @@ -421,7 +448,7 @@ describe('API/extmarks', function() it('marks move with line join', function() -- do_join in ops.c - feed("a<cr>222<esc>") + feed('a<cr>222<esc>') set_extmark(ns, marks[1], 1, 0) feed('ggJ') check_undo_redo(ns, marks[1], 1, 0, 0, 6) @@ -430,7 +457,7 @@ describe('API/extmarks', function() it('join works when no marks are present', function() screen = Screen.new(15, 10) screen:attach() - feed("a<cr>1<esc>") + feed('a<cr>1<esc>') feed('kJ') -- This shouldn't seg fault screen:expect([[ @@ -442,21 +469,21 @@ describe('API/extmarks', function() it('marks move with multiline join', function() -- do_join in ops.c - feed("a<cr>222<cr>333<cr>444<esc>") + feed('a<cr>222<cr>333<cr>444<esc>') set_extmark(ns, marks[1], 3, 0) feed('2GVGJ') check_undo_redo(ns, marks[1], 3, 0, 1, 8) end) it('marks move with line deletes', function() - feed("a<cr>222<cr>333<cr>444<esc>") + feed('a<cr>222<cr>333<cr>444<esc>') set_extmark(ns, marks[1], 2, 1) feed('ggjdd') check_undo_redo(ns, marks[1], 2, 1, 1, 1) end) it('marks move with multiline deletes', function() - feed("a<cr>222<cr>333<cr>444<esc>") + feed('a<cr>222<cr>333<cr>444<esc>') set_extmark(ns, marks[1], 3, 0) feed('gg2dd') check_undo_redo(ns, marks[1], 3, 0, 1, 0) @@ -468,7 +495,7 @@ describe('API/extmarks', function() it('marks move with open line', function() -- open_line in change.c -- testing marks below are also moved - feed("yyP") + feed('yyP') set_extmark(ns, marks[1], 0, 4) set_extmark(ns, marks[2], 1, 4) feed('1G<s-o><esc>') @@ -492,7 +519,7 @@ describe('API/extmarks', function() | ]]) local rv = get_extmark_by_id(ns, marks[1]) - eq({0, 6}, rv) + eq({ 0, 6 }, rv) check_undo_redo(ns, marks[1], 0, 3, 0, 6) end) @@ -501,12 +528,12 @@ describe('API/extmarks', function() -- insertchar in edit.c (the ins_str branch) set_extmark(ns, marks[1], 0, 2) feed('03l') - insert("X") + insert('X') check_undo_redo(ns, marks[1], 0, 2, 0, 2) -- check multibyte chars feed('03l<esc>') - insert("~~") + insert('~~') check_undo_redo(ns, marks[1], 0, 2, 0, 2) end) @@ -530,7 +557,7 @@ describe('API/extmarks', function() it('marks move with line splits (using enter)', function() -- open_line in change.c -- testing marks below are also moved - feed("yyP") + feed('yyP') set_extmark(ns, marks[1], 0, 4) set_extmark(ns, marks[2], 1, 4) feed('1Gla<cr><esc>') @@ -547,16 +574,16 @@ describe('API/extmarks', function() it('yet again marks move with line splits', function() -- the first test above wasn't catching all errors.. - feed("A67890<esc>") + feed('A67890<esc>') set_extmark(ns, marks[1], 0, 4) - feed("04li<cr><esc>") + feed('04li<cr><esc>') check_undo_redo(ns, marks[1], 0, 4, 1, 0) end) it('and one last time line splits...', function() set_extmark(ns, marks[1], 0, 1) set_extmark(ns, marks[2], 0, 2) - feed("02li<cr><esc>") + feed('02li<cr><esc>') check_undo_redo(ns, marks[1], 0, 1, 0, 1) check_undo_redo(ns, marks[2], 0, 2, 1, 0) end) @@ -564,7 +591,7 @@ describe('API/extmarks', function() it('multiple marks move with mark splits', function() set_extmark(ns, marks[1], 0, 1) set_extmark(ns, marks[2], 0, 3) - feed("0li<cr><esc>") + feed('0li<cr><esc>') check_undo_redo(ns, marks[1], 0, 1, 1, 0) check_undo_redo(ns, marks[2], 0, 3, 1, 2) end) @@ -656,11 +683,11 @@ describe('API/extmarks', function() feed('0vx<esc>') check_undo_redo(ns, marks[1], 0, 3, 0, 2) - feed("u") + feed('u') feed('0vlx<esc>') check_undo_redo(ns, marks[1], 0, 3, 0, 1) - feed("u") + feed('u') feed('0v2lx<esc>') check_undo_redo(ns, marks[1], 0, 3, 0, 0) @@ -675,16 +702,16 @@ describe('API/extmarks', function() feed('0x<esc>') check_undo_redo(ns, marks[1], 0, 3, 0, 2) - feed("u") + feed('u') feed('02x<esc>') check_undo_redo(ns, marks[1], 0, 3, 0, 1) - feed("u") + feed('u') feed('0v3lx<esc>') check_undo_redo(ns, marks[1], 0, 3, 0, 0) -- from the other side (nothing should happen) - feed("u") + feed('u') feed('$vx') check_undo_redo(ns, marks[1], 0, 3, 0, 3) end) @@ -742,27 +769,44 @@ describe('API/extmarks', function() it('delete', function() local pos1 = { - {2, 4}, {2, 12}, {2, 13}, {2, 14}, {2, 25}, - {4, 8}, {4, 10}, {4, 20}, - {5, 3}, {6, 10} + { 2, 4 }, + { 2, 12 }, + { 2, 13 }, + { 2, 14 }, + { 2, 25 }, + { 4, 8 }, + { 4, 10 }, + { 4, 20 }, + { 5, 3 }, + { 6, 10 }, } local ids = batch_set(ns, pos1) batch_check(ns, ids, pos1) feed('3Gfiv2+ftd') batch_check_undo_redo(ns, ids, pos1, { - {2, 4}, {2, 12}, {2, 13}, {2, 13}, {2, 13}, - {2, 13}, {2, 15}, {2, 25}, - {3, 3}, {4, 10} + { 2, 4 }, + { 2, 12 }, + { 2, 13 }, + { 2, 13 }, + { 2, 13 }, + { 2, 13 }, + { 2, 15 }, + { 2, 25 }, + { 3, 3 }, + { 4, 10 }, }) end) it('can get overlapping extmarks', function() - set_extmark(ns, 1, 0, 0, {end_row = 5, end_col=0}) - set_extmark(ns, 2, 2, 5, {end_row = 2, end_col=30}) - set_extmark(ns, 3, 0, 5, {end_row = 2, end_col=10}) - set_extmark(ns, 4, 0, 0, {end_row = 1, end_col=0}) - eq({{ 2, 2, 5 }}, get_extmarks(ns, {2, 0}, {2, -1}, { overlap=false })) - eq({{ 1, 0, 0 }, { 3, 0, 5}, {2, 2, 5}}, get_extmarks(ns, {2, 0}, {2, -1}, { overlap=true })) + set_extmark(ns, 1, 0, 0, { end_row = 5, end_col = 0 }) + set_extmark(ns, 2, 2, 5, { end_row = 2, end_col = 30 }) + set_extmark(ns, 3, 0, 5, { end_row = 2, end_col = 10 }) + set_extmark(ns, 4, 0, 0, { end_row = 1, end_col = 0 }) + eq({ { 2, 2, 5 } }, get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = false })) + eq( + { { 1, 0, 0 }, { 3, 0, 5 }, { 2, 2, 5 } }, + get_extmarks(ns, { 2, 0 }, { 2, -1 }, { overlap = true }) + ) end) end) @@ -862,33 +906,40 @@ describe('API/extmarks', function() set_extmark(ns, marks[2], 0, -1) set_extmark(ns, marks[3], 0, -1) - feed("u") - local rv = get_extmarks(ns, {0, 0}, {-1, -1}) + feed('u') + local rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(3, #rv) - feed("<c-r>") - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + feed('<c-r>') + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(3, #rv) -- Test updates feed('o<esc>') set_extmark(ns, marks[1], positions[1][1], positions[1][2]) - rv = get_extmarks(ns, marks[1], marks[1], {limit=1}) + rv = get_extmarks(ns, marks[1], marks[1], { limit = 1 }) eq(1, #rv) - feed("u") - feed("<c-r>") + feed('u') + feed('<c-r>') -- old value is NOT kept in history - check_undo_redo(ns, marks[1], positions[1][1], positions[1][2], positions[1][1], positions[1][2]) + check_undo_redo( + ns, + marks[1], + positions[1][1], + positions[1][2], + positions[1][1], + positions[1][2] + ) -- Test unset feed('o<esc>') curbufmeths.del_extmark(ns, marks[3]) - feed("u") - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + feed('u') + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) -- undo does NOT restore deleted marks eq(2, #rv) - feed("<c-r>") - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + feed('<c-r>') + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(2, #rv) end) @@ -905,9 +956,9 @@ describe('API/extmarks', function() eq(1, rv) rv = set_extmark(ns2, marks[1], positions[1][1], positions[1][2]) eq(1, rv) - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(1, #rv) - rv = get_extmarks(ns2, {0, 0}, {-1, -1}) + rv = get_extmarks(ns2, { 0, 0 }, { -1, -1 }) eq(1, #rv) -- Set more marks for testing the ranges @@ -917,14 +968,14 @@ describe('API/extmarks', function() set_extmark(ns2, marks[3], positions[3][1], positions[3][2]) -- get_next (limit set) - rv = get_extmarks(ns, {0, 0}, positions[2], {limit=1}) + rv = get_extmarks(ns, { 0, 0 }, positions[2], { limit = 1 }) eq(1, #rv) - rv = get_extmarks(ns2, {0, 0}, positions[2], {limit=1}) + rv = get_extmarks(ns2, { 0, 0 }, positions[2], { limit = 1 }) eq(1, #rv) -- get_prev (limit set) - rv = get_extmarks(ns, positions[1], {0, 0}, {limit=1}) + rv = get_extmarks(ns, positions[1], { 0, 0 }, { limit = 1 }) eq(1, #rv) - rv = get_extmarks(ns2, positions[1], {0, 0}, {limit=1}) + rv = get_extmarks(ns2, positions[1], { 0, 0 }, { limit = 1 }) eq(1, #rv) -- get_next (no limit) @@ -939,10 +990,10 @@ describe('API/extmarks', function() eq(2, #rv) curbufmeths.del_extmark(ns, marks[1]) - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(2, #rv) curbufmeths.del_extmark(ns2, marks[1]) - rv = get_extmarks(ns2, {0, 0}, {-1, -1}) + rv = get_extmarks(ns2, { 0, 0 }, { -1, -1 }) eq(2, #rv) end) @@ -966,16 +1017,16 @@ describe('API/extmarks', function() feed(':set cindent<cr><esc>') feed(':set autoindent<cr><esc>') feed(':set shiftwidth=2<cr><esc>') - feed("0iint <esc>A {1M1<esc>b<esc>") + feed('0iint <esc>A {1M1<esc>b<esc>') -- Set the mark on the M, should move.. set_extmark(ns, marks[1], 0, 12) -- Set the mark before the cursor, should stay there set_extmark(ns, marks[2], 0, 10) - feed("i<cr><esc>") + feed('i<cr><esc>') local rv = get_extmark_by_id(ns, marks[1]) - eq({1, 3}, rv) + eq({ 1, 3 }, rv) rv = get_extmark_by_id(ns, marks[2]) - eq({0, 10}, rv) + eq({ 0, 10 }, rv) check_undo_redo(ns, marks[1], 0, 12, 1, 3) end) @@ -984,39 +1035,39 @@ describe('API/extmarks', function() feed(':set autoindent<cr><esc>') feed(':set shiftwidth=2<cr><esc>') -- <c-f> will force an indent of 2 - feed("0iint <esc>A {<cr><esc>0i1M1<esc>") + feed('0iint <esc>A {<cr><esc>0i1M1<esc>') set_extmark(ns, marks[1], 1, 1) - feed("0i<c-f><esc>") + feed('0i<c-f><esc>') local rv = get_extmark_by_id(ns, marks[1]) - eq({1, 3}, rv) + eq({ 1, 3 }, rv) check_undo_redo(ns, marks[1], 1, 1, 1, 3) -- now check when cursor at eol - feed("uA<c-f><esc>") + feed('uA<c-f><esc>') rv = get_extmark_by_id(ns, marks[1]) - eq({1, 3}, rv) + eq({ 1, 3 }, rv) end) it('removing auto indenting with <C-D> works', function() feed(':set cindent<cr><esc>') feed(':set autoindent<cr><esc>') feed(':set shiftwidth=2<cr><esc>') - feed("0i<tab><esc>") + feed('0i<tab><esc>') set_extmark(ns, marks[1], 0, 3) - feed("bi<c-d><esc>") + feed('bi<c-d><esc>') local rv = get_extmark_by_id(ns, marks[1]) - eq({0, 1}, rv) + eq({ 0, 1 }, rv) check_undo_redo(ns, marks[1], 0, 3, 0, 1) -- check when cursor at eol - feed("uA<c-d><esc>") + feed('uA<c-d><esc>') rv = get_extmark_by_id(ns, marks[1]) - eq({0, 1}, rv) + eq({ 0, 1 }, rv) end) it('indenting multiple lines with = works', function() feed(':set cindent<cr><esc>') feed(':set autoindent<cr><esc>') feed(':set shiftwidth=2<cr><esc>') - feed("0iint <esc>A {<cr><bs>1M1<cr><bs>2M2<esc>") + feed('0iint <esc>A {<cr><bs>1M1<cr><bs>2M2<esc>') set_extmark(ns, marks[1], 1, 1) set_extmark(ns, marks[2], 2, 1) feed('=gg') @@ -1138,7 +1189,7 @@ describe('API/extmarks', function() check_undo_redo(ns, marks[5], 2, 0, 3, 0) feed('u') feed([[:1,2s:3:\rxx<cr>]]) - eq({1, 3}, get_extmark_by_id(ns, marks[3])) + eq({ 1, 3 }, get_extmark_by_id(ns, marks[3])) end) it('substitutes over multiple lines with replace in substitution', function() @@ -1374,7 +1425,10 @@ describe('API/extmarks', function() it('throws consistent error codes', function() local ns_invalid = ns2 + 1 - eq("Invalid 'ns_id': 3", pcall_err(set_extmark, ns_invalid, marks[1], positions[1][1], positions[1][2])) + eq( + "Invalid 'ns_id': 3", + pcall_err(set_extmark, ns_invalid, marks[1], positions[1][1], positions[1][2]) + ) eq("Invalid 'ns_id': 3", pcall_err(curbufmeths.del_extmark, ns_invalid, marks[1])) eq("Invalid 'ns_id': 3", pcall_err(get_extmarks, ns_invalid, positions[1], positions[2])) eq("Invalid 'ns_id': 3", pcall_err(get_extmark_by_id, ns_invalid, marks[1])) @@ -1383,11 +1437,11 @@ describe('API/extmarks', function() it('when col = line-length, set the mark on eol', function() set_extmark(ns, marks[1], 0, -1) local rv = get_extmark_by_id(ns, marks[1]) - eq({0, init_text:len()}, rv) + eq({ 0, init_text:len() }, rv) -- Test another set_extmark(ns, marks[1], 0, -1) rv = get_extmark_by_id(ns, marks[1]) - eq({0, init_text:len()}, rv) + eq({ 0, init_text:len() }, rv) end) it('when col = line-length, set the mark on eol', function() @@ -1398,7 +1452,10 @@ describe('API/extmarks', function() it('fails when line > line_count', function() local invalid_col = init_text:len() + 1 local invalid_lnum = 3 - eq("Invalid 'line': out of range", pcall_err(set_extmark, ns, marks[1], invalid_lnum, invalid_col)) + eq( + "Invalid 'line': out of range", + pcall_err(set_extmark, ns, marks[1], invalid_lnum, invalid_col) + ) eq({}, get_extmark_by_id(ns, marks[1])) end) @@ -1414,17 +1471,17 @@ describe('API/extmarks', function() end) it('in read-only buffer', function() - command("view! runtime/doc/help.txt") + command('view! runtime/doc/help.txt') eq(true, meths.get_option_value('ro', {})) local id = set_extmark(ns, 0, 0, 2) - eq({{id, 0, 2}}, get_extmarks(ns,0, -1)) + eq({ { id, 0, 2 } }, get_extmarks(ns, 0, -1)) end) it('can set a mark to other buffer', function() local buf = request('nvim_create_buf', 0, 1) - request('nvim_buf_set_lines', buf, 0, -1, 1, {"", ""}) + request('nvim_buf_set_lines', buf, 0, -1, 1, { '', '' }) local id = bufmeths.set_extmark(buf, ns, 1, 0, {}) - eq({{id, 1, 0}}, bufmeths.get_extmarks(buf, ns, 0, -1, {})) + eq({ { id, 1, 0 } }, bufmeths.get_extmarks(buf, ns, 0, -1, {})) end) it('does not crash with append/delete/undo sequence', function() @@ -1440,49 +1497,51 @@ describe('API/extmarks', function() it('works with left and right gravity', function() -- right gravity should move with inserted text, while -- left gravity should stay in place. - curbufmeths.set_extmark(ns, 0, 5, {right_gravity = false}) - curbufmeths.set_extmark(ns, 0, 5, {right_gravity = true}) + curbufmeths.set_extmark(ns, 0, 5, { right_gravity = false }) + curbufmeths.set_extmark(ns, 0, 5, { right_gravity = true }) feed([[Aasdfasdf]]) - eq({ {1, 0, 5}, {2, 0, 13} }, - curbufmeths.get_extmarks(ns, 0, -1, {})) + eq({ { 1, 0, 5 }, { 2, 0, 13 } }, curbufmeths.get_extmarks(ns, 0, -1, {})) -- but both move when text is inserted before feed([[<esc>Iasdf<esc>]]) -- eq({}, curbufmeths.get_lines(0, -1, true)) - eq({ {1, 0, 9}, {2, 0, 17} }, - curbufmeths.get_extmarks(ns, 0, -1, {})) + eq({ { 1, 0, 9 }, { 2, 0, 17 } }, curbufmeths.get_extmarks(ns, 0, -1, {})) -- clear text curbufmeths.set_text(0, 0, 0, 17, {}) -- handles set_text correctly as well - eq({ {1, 0, 0}, {2, 0, 0} }, - meths.buf_get_extmarks(0, ns, 0, -1, {})) - curbufmeths.set_text(0, 0, 0, 0, {'asdfasdf'}) - eq({ {1, 0, 0}, {2, 0, 8} }, - curbufmeths.get_extmarks(ns, 0, -1, {})) + eq({ { 1, 0, 0 }, { 2, 0, 0 } }, meths.buf_get_extmarks(0, ns, 0, -1, {})) + curbufmeths.set_text(0, 0, 0, 0, { 'asdfasdf' }) + eq({ { 1, 0, 0 }, { 2, 0, 8 } }, curbufmeths.get_extmarks(ns, 0, -1, {})) feed('u') -- handles pasting exec([[let @a='asdfasdf']]) feed([["ap]]) - eq({ {1, 0, 0}, {2, 0, 8} }, - meths.buf_get_extmarks(0, ns, 0, -1, {})) + eq({ { 1, 0, 0 }, { 2, 0, 8 } }, meths.buf_get_extmarks(0, ns, 0, -1, {})) end) it('can accept "end_row" or "end_line" #16548', function() set_extmark(ns, marks[1], 0, 0, { end_col = 0, - end_line = 1 + end_line = 1, }) - eq({ {1, 0, 0, { - ns_id = 1, - end_col = 0, - end_row = 1, - right_gravity = true, - end_right_gravity = false, - }} }, get_extmarks(ns, 0, -1, {details=true})) + eq({ + { + 1, + 0, + 0, + { + ns_id = 1, + end_col = 0, + end_row = 1, + right_gravity = true, + end_right_gravity = false, + }, + }, + }, get_extmarks(ns, 0, -1, { details = true })) end) it('in prompt buffer', function() @@ -1490,129 +1549,149 @@ describe('API/extmarks', function() local id = set_extmark(ns, marks[1], 0, 0, {}) meths.set_option_value('buftype', 'prompt', {}) feed('i<esc>') - eq({{id, 0, 2}}, get_extmarks(ns, 0, -1)) + eq({ { id, 0, 2 } }, get_extmarks(ns, 0, -1)) end) it('can get details', function() set_extmark(ns, marks[1], 0, 0, { - conceal = "c", - cursorline_hl_group = "Statement", + conceal = 'c', + cursorline_hl_group = 'Statement', end_col = 0, end_right_gravity = true, end_row = 1, hl_eol = true, - hl_group = "String", - hl_mode = "blend", - line_hl_group = "Statement", - number_hl_group = "Statement", + hl_group = 'String', + hl_mode = 'blend', + line_hl_group = 'Statement', + number_hl_group = 'Statement', priority = 0, right_gravity = false, - sign_hl_group = "Statement", - sign_text = ">>", + sign_hl_group = 'Statement', + sign_text = '>>', spell = true, virt_lines = { - { { "lines", "Macro" }, { "???" } }, - { { "stack", { "Type", "Search" } }, { "!!!" } }, + { { 'lines', 'Macro' }, { '???' } }, + { { 'stack', { 'Type', 'Search' } }, { '!!!' } }, }, virt_lines_above = true, virt_lines_leftcol = true, - virt_text = { { "text", "Macro" }, { "???" }, { "stack", { "Type", "Search" } } }, + virt_text = { { 'text', 'Macro' }, { '???' }, { 'stack', { 'Type', 'Search' } } }, virt_text_hide = true, - virt_text_pos = "right_align", + virt_text_pos = 'right_align', }) set_extmark(ns, marks[2], 0, 0, { priority = 0, - virt_text = { { "", "Macro" }, { "", { "Type", "Search" } }, { "" } }, + virt_text = { { '', 'Macro' }, { '', { 'Type', 'Search' } }, { '' } }, virt_text_win_col = 1, }) - eq({0, 0, { - conceal = "c", - cursorline_hl_group = "Statement", - end_col = 0, - end_right_gravity = true, - end_row = 1, - hl_eol = true, - hl_group = "String", - hl_mode = "blend", - line_hl_group = "Statement", - ns_id = 1, - number_hl_group = "Statement", - priority = 0, - right_gravity = false, - sign_hl_group = "Statement", - sign_text = ">>", - spell = true, - virt_lines = { - { { "lines", "Macro" }, { "???" } }, - { { "stack", { "Type", "Search" } }, { "!!!" } }, + eq({ + 0, + 0, + { + conceal = 'c', + cursorline_hl_group = 'Statement', + end_col = 0, + end_right_gravity = true, + end_row = 1, + hl_eol = true, + hl_group = 'String', + hl_mode = 'blend', + line_hl_group = 'Statement', + ns_id = 1, + number_hl_group = 'Statement', + priority = 0, + right_gravity = false, + sign_hl_group = 'Statement', + sign_text = '>>', + spell = true, + virt_lines = { + { { 'lines', 'Macro' }, { '???' } }, + { { 'stack', { 'Type', 'Search' } }, { '!!!' } }, + }, + virt_lines_above = true, + virt_lines_leftcol = true, + virt_text = { { 'text', 'Macro' }, { '???' }, { 'stack', { 'Type', 'Search' } } }, + virt_text_repeat_linebreak = false, + virt_text_hide = true, + virt_text_pos = 'right_align', }, - virt_lines_above = true, - virt_lines_leftcol = true, - virt_text = { { "text", "Macro" }, { "???" }, { "stack", { "Type", "Search" } } }, - virt_text_repeat_linebreak = false, - virt_text_hide = true, - virt_text_pos = "right_align", - } }, get_extmark_by_id(ns, marks[1], { details = true })) - eq({0, 0, { - ns_id = 1, - right_gravity = true, - priority = 0, - virt_text = { { "", "Macro" }, { "", { "Type", "Search" } }, { "" } }, - virt_text_repeat_linebreak = false, - virt_text_hide = false, - virt_text_pos = "win_col", - virt_text_win_col = 1, - } }, get_extmark_by_id(ns, marks[2], { details = true })) - set_extmark(ns, marks[3], 0, 0, { cursorline_hl_group = "Statement" }) - eq({0, 0, { - ns_id = 1, - cursorline_hl_group = "Statement", - priority = 4096, - right_gravity = true, - } }, get_extmark_by_id(ns, marks[3], { details = true })) + }, get_extmark_by_id(ns, marks[1], { details = true })) + eq({ + 0, + 0, + { + ns_id = 1, + right_gravity = true, + priority = 0, + virt_text = { { '', 'Macro' }, { '', { 'Type', 'Search' } }, { '' } }, + virt_text_repeat_linebreak = false, + virt_text_hide = false, + virt_text_pos = 'win_col', + virt_text_win_col = 1, + }, + }, get_extmark_by_id(ns, marks[2], { details = true })) + set_extmark(ns, marks[3], 0, 0, { cursorline_hl_group = 'Statement' }) + eq({ + 0, + 0, + { + ns_id = 1, + cursorline_hl_group = 'Statement', + priority = 4096, + right_gravity = true, + }, + }, get_extmark_by_id(ns, marks[3], { details = true })) curbufmeths.clear_namespace(ns, 0, -1) -- legacy sign mark includes sign name command('sign define sign1 text=s1 texthl=Title linehl=LineNR numhl=Normal culhl=CursorLine') command('sign place 1 name=sign1 line=1') - eq({ {1, 0, 0, { - cursorline_hl_group = 'CursorLine', - invalidate = true, - line_hl_group = 'LineNr', - ns_id = 0, - number_hl_group = 'Normal', - priority = 10, - right_gravity = true, - sign_hl_group = 'Title', - sign_name = 'sign1', - sign_text = 's1', - undo_restore = false - } } }, get_extmarks(-1, 0, -1, { details = true })) + eq({ + { + 1, + 0, + 0, + { + cursorline_hl_group = 'CursorLine', + invalidate = true, + line_hl_group = 'LineNr', + ns_id = 0, + number_hl_group = 'Normal', + priority = 10, + right_gravity = true, + sign_hl_group = 'Title', + sign_name = 'sign1', + sign_text = 's1', + undo_restore = false, + }, + }, + }, get_extmarks(-1, 0, -1, { details = true })) end) it('can get marks from anonymous namespaces', function() - ns = request('nvim_create_namespace', "") - ns2 = request('nvim_create_namespace', "") + ns = request('nvim_create_namespace', '') + ns2 = request('nvim_create_namespace', '') set_extmark(ns, 1, 0, 0, {}) set_extmark(ns2, 2, 1, 0, {}) - eq({{ 1, 0, 0, { ns_id = ns, right_gravity = true }}, - { 2, 1, 0, { ns_id = ns2, right_gravity = true }}}, - get_extmarks(-1, 0, -1, { details = true })) + eq({ + { 1, 0, 0, { ns_id = ns, right_gravity = true } }, + { 2, 1, 0, { ns_id = ns2, right_gravity = true } }, + }, get_extmarks(-1, 0, -1, { details = true })) end) it('can filter by extmark properties', function() set_extmark(ns, 1, 0, 0, {}) set_extmark(ns, 2, 0, 0, { hl_group = 'Normal' }) set_extmark(ns, 3, 0, 0, { sign_text = '>>' }) - set_extmark(ns, 4, 0, 0, { virt_text = {{'text', 'Normal'}}}) - set_extmark(ns, 5, 0, 0, { virt_lines = {{{ 'line', 'Normal' }}}}) + set_extmark(ns, 4, 0, 0, { virt_text = { { 'text', 'Normal' } } }) + set_extmark(ns, 5, 0, 0, { virt_lines = { { { 'line', 'Normal' } } } }) eq(5, #get_extmarks(-1, 0, -1, {})) - eq({{ 2, 0, 0 }}, get_extmarks(-1, 0, -1, { type = 'highlight' })) - eq({{ 3, 0, 0 }}, get_extmarks(-1, 0, -1, { type = 'sign' })) - eq({{ 4, 0, 0 }}, get_extmarks(-1, 0, -1, { type = 'virt_text' })) - eq({{ 5, 0, 0 }}, get_extmarks(-1, 0, -1, { type = 'virt_lines' })) + eq({ { 2, 0, 0 } }, get_extmarks(-1, 0, -1, { type = 'highlight' })) + eq({ { 3, 0, 0 } }, get_extmarks(-1, 0, -1, { type = 'sign' })) + eq({ { 4, 0, 0 } }, get_extmarks(-1, 0, -1, { type = 'virt_text' })) + eq({ { 5, 0, 0 } }, get_extmarks(-1, 0, -1, { type = 'virt_lines' })) end) - it("invalidated marks are deleted", function() + it('invalidated marks are deleted', function() screen = Screen.new(40, 6) screen:attach() feed('dd6iaaa bbb ccc<CR><ESC>gg') @@ -1641,8 +1720,13 @@ describe('API/extmarks', function() command('1d 2') eq(0, #get_extmarks(-1, 0, -1, {})) -- mark is not removed when deleting bytes before the range - set_extmark(ns, 3, 0, 4, { invalidate = true, undo_restore = false, - hl_group = 'Error', end_col = 7 }) + set_extmark( + ns, + 3, + 0, + 4, + { invalidate = true, undo_restore = false, hl_group = 'Error', end_col = 7 } + ) feed('dw') eq(3, get_extmark_by_id(ns, 3, { details = true })[3].end_col) -- mark is not removed when deleting bytes at the start of the range @@ -1650,18 +1734,23 @@ describe('API/extmarks', function() eq(2, get_extmark_by_id(ns, 3, { details = true })[3].end_col) -- mark is not removed when deleting bytes from the end of the range feed('lx') - eq(1, get_extmark_by_id(ns, 3, { details = true})[3].end_col) + eq(1, get_extmark_by_id(ns, 3, { details = true })[3].end_col) -- mark is not removed when deleting bytes beyond end of the range feed('x') - eq(1, get_extmark_by_id(ns, 3, { details = true})[3].end_col) + eq(1, get_extmark_by_id(ns, 3, { details = true })[3].end_col) -- mark is removed when all bytes in the range are deleted feed('hx') eq({}, get_extmark_by_id(ns, 3, {})) -- multiline mark is not removed when start of its range is deleted - set_extmark(ns, 4, 1, 4, { undo_restore = false, invalidate = true, - hl_group = 'Error', end_col = 7, end_row = 3 }) + set_extmark( + ns, + 4, + 1, + 4, + { undo_restore = false, invalidate = true, hl_group = 'Error', end_col = 7, end_row = 3 } + ) feed('ddDdd') - eq({0, 0}, get_extmark_by_id(ns, 4, {})) + eq({ 0, 0 }, get_extmark_by_id(ns, 4, {})) -- multiline mark is removed when entirety of its range is deleted feed('vj2ed') eq({}, get_extmark_by_id(ns, 4, {})) @@ -1674,29 +1763,28 @@ describe('Extmarks buffer api with many marks', function() local ns_marks = {} before_each(function() clear() - ns1 = request('nvim_create_namespace', "ns1") - ns2 = request('nvim_create_namespace', "ns2") - ns_marks = {[ns1]={}, [ns2]={}} + ns1 = request('nvim_create_namespace', 'ns1') + ns2 = request('nvim_create_namespace', 'ns2') + ns_marks = { [ns1] = {}, [ns2] = {} } local lines = {} - for i = 1,30 do - lines[#lines+1] = string.rep("x ",i) + for i = 1, 30 do + lines[#lines + 1] = string.rep('x ', i) end curbufmeths.set_lines(0, -1, true, lines) local ns = ns1 local q = 0 - for i = 0,29 do - for j = 0,i do - local id = set_extmark(ns,0, i,j) + for i = 0, 29 do + for j = 0, i do + local id = set_extmark(ns, 0, i, j) eq(nil, ns_marks[ns][id]) ok(id > 0) - ns_marks[ns][id] = {i,j} - ns = ns1+ns2-ns + ns_marks[ns][id] = { i, j } + ns = ns1 + ns2 - ns q = q + 1 end end eq(233, #ns_marks[ns1]) eq(232, #ns_marks[ns2]) - end) local function get_marks(ns) @@ -1704,18 +1792,18 @@ describe('Extmarks buffer api with many marks', function() local marks = {} for _, mark in ipairs(mark_list) do local id, row, col = unpack(mark) - eq(nil, marks[id], "duplicate mark") - marks[id] = {row,col} + eq(nil, marks[id], 'duplicate mark') + marks[id] = { row, col } end return marks end - it("can get marks", function() + it('can get marks', function() eq(ns_marks[ns1], get_marks(ns1)) eq(ns_marks[ns2], get_marks(ns2)) end) - it("can clear all marks in ns", function() + it('can clear all marks in ns', function() curbufmeths.clear_namespace(ns1, 0, -1) eq({}, get_marks(ns1)) eq(ns_marks[ns2], get_marks(ns2)) @@ -1724,7 +1812,7 @@ describe('Extmarks buffer api with many marks', function() eq({}, get_marks(ns2)) end) - it("can clear line range", function() + it('can clear line range', function() curbufmeths.clear_namespace(ns1, 10, 20) for id, mark in pairs(ns_marks[ns1]) do if 10 <= mark[1] and mark[1] < 20 then @@ -1735,12 +1823,12 @@ describe('Extmarks buffer api with many marks', function() eq(ns_marks[ns2], get_marks(ns2)) end) - it("can delete line", function() + it('can delete line', function() feed('10Gdd') for _, marks in pairs(ns_marks) do for id, mark in pairs(marks) do if mark[1] == 9 then - marks[id] = {9,0} + marks[id] = { 9, 0 } elseif mark[1] >= 10 then mark[1] = mark[1] - 1 end @@ -1750,12 +1838,12 @@ describe('Extmarks buffer api with many marks', function() eq(ns_marks[ns2], get_marks(ns2)) end) - it("can delete lines", function() + it('can delete lines', function() feed('10G10dd') for _, marks in pairs(ns_marks) do for id, mark in pairs(marks) do if 9 <= mark[1] and mark[1] < 19 then - marks[id] = {9,0} + marks[id] = { 9, 0 } elseif mark[1] >= 19 then mark[1] = mark[1] - 10 end @@ -1765,7 +1853,7 @@ describe('Extmarks buffer api with many marks', function() eq(ns_marks[ns2], get_marks(ns2)) end) - it("can wipe buffer", function() + it('can wipe buffer', function() command('bwipe!') eq({}, get_marks(ns1)) eq({}, get_marks(ns2)) @@ -1779,17 +1867,17 @@ describe('API/win_extmark', function() before_each(function() -- Initialize some namespaces and insert text into a buffer - marks = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} + marks = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } - line1 = "non ui-watched line" - line2 = "ui-watched line" + line1 = 'non ui-watched line' + line2 = 'ui-watched line' clear() insert(line1) - feed("o<esc>") + feed('o<esc>') insert(line2) - ns = request('nvim_create_namespace', "extmark-ui") + ns = request('nvim_create_namespace', 'extmark-ui') end) it('sends and only sends ui-watched marks to ui', function() @@ -1809,8 +1897,8 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, ns, marks[1], 1, 16 }, - } + { { id = 1000 }, ns, marks[1], 1, 16 }, + }, }, }) end) @@ -1820,10 +1908,10 @@ describe('API/win_extmark', function() screen:attach() feed('15A!<Esc>') -- should send all of these - set_extmark(ns, marks[1], 1, 0, { ui_watched = true, virt_text_pos = "overlay" }) - set_extmark(ns, marks[2], 1, 2, { ui_watched = true, virt_text_pos = "overlay" }) - set_extmark(ns, marks[3], 1, 4, { ui_watched = true, virt_text_pos = "overlay" }) - set_extmark(ns, marks[4], 1, 6, { ui_watched = true, virt_text_pos = "overlay" }) + set_extmark(ns, marks[1], 1, 0, { ui_watched = true, virt_text_pos = 'overlay' }) + set_extmark(ns, marks[2], 1, 2, { ui_watched = true, virt_text_pos = 'overlay' }) + set_extmark(ns, marks[3], 1, 4, { ui_watched = true, virt_text_pos = 'overlay' }) + set_extmark(ns, marks[4], 1, 6, { ui_watched = true, virt_text_pos = 'overlay' }) set_extmark(ns, marks[5], 1, 8, { ui_watched = true }) screen:expect({ grid = [[ @@ -1835,28 +1923,28 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- notification from 1st call - { {id = 1000}, ns, marks[1], 1, 0 }, + { { id = 1000 }, ns, marks[1], 1, 0 }, -- notifications from 2nd call - { {id = 1000}, ns, marks[1], 1, 0 }, - { {id = 1000}, ns, marks[2], 1, 2 }, + { { id = 1000 }, ns, marks[1], 1, 0 }, + { { id = 1000 }, ns, marks[2], 1, 2 }, -- notifications from 3rd call - { {id = 1000}, ns, marks[1], 1, 0 }, - { {id = 1000}, ns, marks[2], 1, 2 }, - { {id = 1000}, ns, marks[3], 1, 4 }, + { { id = 1000 }, ns, marks[1], 1, 0 }, + { { id = 1000 }, ns, marks[2], 1, 2 }, + { { id = 1000 }, ns, marks[3], 1, 4 }, -- notifications from 4th call - { {id = 1000}, ns, marks[1], 1, 0 }, - { {id = 1000}, ns, marks[2], 1, 2 }, - { {id = 1000}, ns, marks[3], 1, 4 }, - { {id = 1000}, ns, marks[4], 1, 6 }, + { { id = 1000 }, ns, marks[1], 1, 0 }, + { { id = 1000 }, ns, marks[2], 1, 2 }, + { { id = 1000 }, ns, marks[3], 1, 4 }, + { { id = 1000 }, ns, marks[4], 1, 6 }, -- final -- overlay - { {id = 1000}, ns, marks[1], 1, 0 }, - { {id = 1000}, ns, marks[2], 1, 2 }, - { {id = 1000}, ns, marks[3], 1, 4 }, - { {id = 1000}, ns, marks[4], 1, 6 }, + { { id = 1000 }, ns, marks[1], 1, 0 }, + { { id = 1000 }, ns, marks[2], 1, 2 }, + { { id = 1000 }, ns, marks[3], 1, 4 }, + { { id = 1000 }, ns, marks[4], 1, 6 }, -- eol - { {id = 1000}, ns, marks[5], 2, 11 }, - } + { { id = 1000 }, ns, marks[5], 2, 11 }, + }, }, }) end) @@ -1869,7 +1957,7 @@ describe('API/win_extmark', function() -- should not send this set_extmark(ns, marks[2], 0, 0, { ui_watched = false }) -- make some changes - insert(" update") + insert(' update') screen:expect({ grid = [[ non ui-watched line | @@ -1880,13 +1968,13 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, ns, marks[1], 1, 16 }, + { { id = 1000 }, ns, marks[1], 1, 16 }, -- updated and wrapped to 3rd line - { {id = 1000}, ns, marks[1], 2, 2 }, - } - } + { { id = 1000 }, ns, marks[1], 2, 2 }, + }, + }, }) - feed("<c-e>") + feed('<c-e>') screen:expect({ grid = [[ ui-watched linupdat^e| @@ -1897,18 +1985,18 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, ns, marks[1], 1, 16 }, + { { id = 1000 }, ns, marks[1], 1, 16 }, -- updated and wrapped to 3rd line - { {id = 1000}, ns, marks[1], 2, 2 }, + { { id = 1000 }, ns, marks[1], 2, 2 }, -- scrolled up one line, should be handled by grid scroll - } - } + }, + }, }) end) it('sends ui-watched to splits', function() screen = Screen.new(20, 8) - screen:attach({ext_multigrid=true}) + screen:attach({ ext_multigrid = true }) -- should send this set_extmark(ns, marks[1], 1, 0, { ui_watched = true }) -- should not send this @@ -1935,18 +2023,18 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, ns, marks[1], 1, 16 }, + { { id = 1000 }, ns, marks[1], 1, 16 }, -- updated after split - { {id = 1000}, ns, marks[1], 1, 16 }, + { { id = 1000 }, ns, marks[1], 1, 16 }, }, [4] = { -- only after split - { {id = 1001}, ns, marks[1], 1, 16 }, - } - } + { { id = 1001 }, ns, marks[1], 1, 16 }, + }, + }, }) -- make some changes - insert(" update") + insert(' update') screen:expect({ grid = [[ ## grid 1 @@ -1968,16 +2056,16 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, ns, marks[1], 1, 16 }, + { { id = 1000 }, ns, marks[1], 1, 16 }, -- updated after split - { {id = 1000}, ns, marks[1], 1, 16 }, + { { id = 1000 }, ns, marks[1], 1, 16 }, }, [4] = { - { {id = 1001}, ns, marks[1], 1, 16 }, + { { id = 1001 }, ns, marks[1], 1, 16 }, -- updated - { {id = 1001}, ns, marks[1], 2, 2 }, - } - } + { { id = 1001 }, ns, marks[1], 2, 2 }, + }, + }, }) end) end) diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua index c9edbf825d..fe9e2a7727 100644 --- a/test/functional/api/highlight_spec.lua +++ b/test/functional/api/highlight_spec.lua @@ -10,7 +10,7 @@ local pcall_err = helpers.pcall_err local ok = helpers.ok local assert_alive = helpers.assert_alive -describe('API: highlight',function() +describe('API: highlight', function() clear() Screen.new() -- initialize Screen.colors @@ -45,31 +45,35 @@ describe('API: highlight',function() before_each(function() clear() - command("hi NewHighlight cterm=underline ctermbg=green guifg=red guibg=yellow guisp=blue gui=bold") + command( + 'hi NewHighlight cterm=underline ctermbg=green guifg=red guibg=yellow guisp=blue gui=bold' + ) end) - it("nvim_get_hl_by_id", function() + it('nvim_get_hl_by_id', function() local hl_id = eval("hlID('NewHighlight')") - eq(expected_cterm, nvim("get_hl_by_id", hl_id, false)) + eq(expected_cterm, nvim('get_hl_by_id', hl_id, false)) hl_id = eval("hlID('NewHighlight')") -- Test valid id. - eq(expected_rgb, nvim("get_hl_by_id", hl_id, true)) + eq(expected_rgb, nvim('get_hl_by_id', hl_id, true)) -- Test invalid id. eq('Invalid highlight id: 30000', pcall_err(meths.get_hl_by_id, 30000, false)) -- Test all highlight properties. command('hi NewHighlight gui=underline,bold,italic,reverse,strikethrough,altfont,nocombine') - eq(expected_rgb2, nvim("get_hl_by_id", hl_id, true)) + eq(expected_rgb2, nvim('get_hl_by_id', hl_id, true)) -- Test undercurl command('hi NewHighlight gui=undercurl') - eq(expected_undercurl, nvim("get_hl_by_id", hl_id, true)) + eq(expected_undercurl, nvim('get_hl_by_id', hl_id, true)) -- Test nil argument. - eq('Wrong type for argument 1 when calling nvim_get_hl_by_id, expecting Integer', - pcall_err(meths.get_hl_by_id, { nil }, false)) + eq( + 'Wrong type for argument 1 when calling nvim_get_hl_by_id, expecting Integer', + pcall_err(meths.get_hl_by_id, { nil }, false) + ) -- Test 0 argument. eq('Invalid highlight id: 0', pcall_err(meths.get_hl_by_id, 0, false)) @@ -81,76 +85,83 @@ describe('API: highlight',function() command('hi Normal ctermfg=red ctermbg=yellow') command('hi NewConstant ctermfg=green guifg=white guibg=blue') hl_id = eval("hlID('NewConstant')") - eq({foreground = 10,}, meths.get_hl_by_id(hl_id, false)) + eq({ foreground = 10 }, meths.get_hl_by_id(hl_id, false)) -- Test highlight group without ctermfg value. command('hi clear NewConstant') command('hi NewConstant ctermbg=Magenta guifg=white guibg=blue') - eq({background = 13,}, meths.get_hl_by_id(hl_id, false)) + eq({ background = 13 }, meths.get_hl_by_id(hl_id, false)) -- Test highlight group with ctermfg and ctermbg values. command('hi clear NewConstant') command('hi NewConstant ctermfg=green ctermbg=Magenta guifg=white guibg=blue') - eq({foreground = 10, background = 13,}, meths.get_hl_by_id(hl_id, false)) + eq({ foreground = 10, background = 13 }, meths.get_hl_by_id(hl_id, false)) end) - it("nvim_get_hl_by_name", function() - local expected_normal = { background = Screen.colors.Yellow, - foreground = Screen.colors.Red } + it('nvim_get_hl_by_name', function() + local expected_normal = { background = Screen.colors.Yellow, foreground = Screen.colors.Red } -- Test `Normal` default values. - eq({}, nvim("get_hl_by_name", 'Normal', true)) + eq({}, nvim('get_hl_by_name', 'Normal', true)) - eq(expected_cterm, nvim("get_hl_by_name", 'NewHighlight', false)) - eq(expected_rgb, nvim("get_hl_by_name", 'NewHighlight', true)) + eq(expected_cterm, nvim('get_hl_by_name', 'NewHighlight', false)) + eq(expected_rgb, nvim('get_hl_by_name', 'NewHighlight', true)) -- Test `Normal` modified values. command('hi Normal guifg=red guibg=yellow') - eq(expected_normal, nvim("get_hl_by_name", 'Normal', true)) + eq(expected_normal, nvim('get_hl_by_name', 'Normal', true)) -- Test invalid name. - eq("Invalid highlight name: 'unknown_highlight'", - pcall_err(meths.get_hl_by_name , 'unknown_highlight', false)) + eq( + "Invalid highlight name: 'unknown_highlight'", + pcall_err(meths.get_hl_by_name, 'unknown_highlight', false) + ) -- Test nil argument. - eq('Wrong type for argument 1 when calling nvim_get_hl_by_name, expecting String', - pcall_err(meths.get_hl_by_name , { nil }, false)) + eq( + 'Wrong type for argument 1 when calling nvim_get_hl_by_name, expecting String', + pcall_err(meths.get_hl_by_name, { nil }, false) + ) -- Test empty string argument. - eq('Invalid highlight name', - pcall_err(meths.get_hl_by_name , '', false)) + eq('Invalid highlight name', pcall_err(meths.get_hl_by_name, '', false)) -- Test "standout" attribute. #8054 - eq({ underline = true, }, - meths.get_hl_by_name('cursorline', 0)); + eq({ underline = true }, meths.get_hl_by_name('cursorline', 0)) command('hi CursorLine cterm=standout,underline term=standout,underline gui=standout,underline') command('set cursorline') - eq({ underline = true, standout = true, }, - meths.get_hl_by_name('cursorline', 0)); + eq({ underline = true, standout = true }, meths.get_hl_by_name('cursorline', 0)) -- Test cterm & Normal values. #18024 (tail) & #18980 -- Ensure Normal, and groups that match Normal return their fg & bg cterm values - meths.set_hl(0, 'Normal', {ctermfg = 17, ctermbg = 213}) - meths.set_hl(0, 'NotNormal', {ctermfg = 17, ctermbg = 213, nocombine = true}) + meths.set_hl(0, 'Normal', { ctermfg = 17, ctermbg = 213 }) + meths.set_hl(0, 'NotNormal', { ctermfg = 17, ctermbg = 213, nocombine = true }) -- Note colors are "cterm" values, not rgb-as-ints - eq({foreground = 17, background = 213}, nvim("get_hl_by_name", 'Normal', false)) - eq({foreground = 17, background = 213, nocombine = true}, nvim("get_hl_by_name", 'NotNormal', false)) + eq({ foreground = 17, background = 213 }, nvim('get_hl_by_name', 'Normal', false)) + eq( + { foreground = 17, background = 213, nocombine = true }, + nvim('get_hl_by_name', 'NotNormal', false) + ) end) it('nvim_get_hl_id_by_name', function() -- precondition: use a hl group that does not yet exist - eq("Invalid highlight name: 'Shrubbery'", pcall_err(meths.get_hl_by_name, "Shrubbery", true)) - eq(0, funcs.hlID("Shrubbery")) + eq("Invalid highlight name: 'Shrubbery'", pcall_err(meths.get_hl_by_name, 'Shrubbery', true)) + eq(0, funcs.hlID('Shrubbery')) - local hl_id = meths.get_hl_id_by_name("Shrubbery") + local hl_id = meths.get_hl_id_by_name('Shrubbery') ok(hl_id > 0) - eq(hl_id, funcs.hlID("Shrubbery")) + eq(hl_id, funcs.hlID('Shrubbery')) command('hi Shrubbery guifg=#888888 guibg=#888888') - eq({foreground=tonumber("0x888888"), background=tonumber("0x888888")}, - meths.get_hl_by_id(hl_id, true)) - eq({foreground=tonumber("0x888888"), background=tonumber("0x888888")}, - meths.get_hl_by_name("Shrubbery", true)) + eq( + { foreground = tonumber('0x888888'), background = tonumber('0x888888') }, + meths.get_hl_by_id(hl_id, true) + ) + eq( + { foreground = tonumber('0x888888'), background = tonumber('0x888888') }, + meths.get_hl_by_name('Shrubbery', true) + ) end) it("nvim_buf_add_highlight to other buffer doesn't crash if undo is disabled #12873", function() @@ -165,7 +176,7 @@ describe('API: highlight',function() end) end) -describe("API: set highlight", function() +describe('API: set highlight', function() local highlight_color = { fg = tonumber('0xff0000'), bg = tonumber('0x0032aa'), @@ -207,7 +218,7 @@ describe("API: set highlight", function() strikethrough = true, altfont = true, nocombine = true, - } + }, } local highlight3_result_gui = { background = highlight_color.bg, @@ -238,31 +249,35 @@ describe("API: set highlight", function() before_each(clear) it('validation', function() - eq("Invalid 'blend': out of range", - pcall_err(meths.set_hl, 0, 'Test_hl3', {fg='#FF00FF', blend=999})) - eq("Invalid 'blend': expected Integer, got Array", - pcall_err(meths.set_hl, 0, 'Test_hl3', {fg='#FF00FF', blend={}})) + eq( + "Invalid 'blend': out of range", + pcall_err(meths.set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = 999 }) + ) + eq( + "Invalid 'blend': expected Integer, got Array", + pcall_err(meths.set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = {} }) + ) end) - it("can set gui highlight", function() + it('can set gui highlight', function() local ns = get_ns() meths.set_hl(ns, 'Test_hl', highlight1) eq(highlight1, meths.get_hl_by_name('Test_hl', true)) end) - it("can set cterm highlight", function() + it('can set cterm highlight', function() local ns = get_ns() meths.set_hl(ns, 'Test_hl', highlight2_config) eq(highlight2_result, meths.get_hl_by_name('Test_hl', false)) end) - it("can set empty cterm attr", function() + it('can set empty cterm attr', function() local ns = get_ns() meths.set_hl(ns, 'Test_hl', { cterm = {} }) eq({}, meths.get_hl_by_name('Test_hl', false)) end) - it("cterm attr defaults to gui attr", function() + it('cterm attr defaults to gui attr', function() local ns = get_ns() meths.set_hl(ns, 'Test_hl', highlight1) eq({ @@ -271,14 +286,14 @@ describe("API: set highlight", function() }, meths.get_hl_by_name('Test_hl', false)) end) - it("can overwrite attr for cterm", function() + it('can overwrite attr for cterm', function() local ns = get_ns() meths.set_hl(ns, 'Test_hl', highlight3_config) eq(highlight3_result_gui, meths.get_hl_by_name('Test_hl', true)) eq(highlight3_result_cterm, meths.get_hl_by_name('Test_hl', false)) end) - it("only allows one underline attribute #22371", function() + it('only allows one underline attribute #22371', function() local ns = get_ns() meths.set_hl(ns, 'Test_hl', { underdouble = true, @@ -292,80 +307,76 @@ describe("API: set highlight", function() eq({ underdotted = true }, meths.get_hl_by_name('Test_hl', true)) end) - it("can set a highlight in the global namespace", function() + it('can set a highlight in the global namespace', function() meths.set_hl(0, 'Test_hl', highlight2_config) - eq('Test_hl xxx cterm=underline,reverse ctermfg=8 ctermbg=15 gui=underline,reverse', - exec_capture('highlight Test_hl')) + eq( + 'Test_hl xxx cterm=underline,reverse ctermfg=8 ctermbg=15 gui=underline,reverse', + exec_capture('highlight Test_hl') + ) meths.set_hl(0, 'Test_hl', { background = highlight_color.bg }) - eq('Test_hl xxx guibg=#0032aa', - exec_capture('highlight Test_hl')) + eq('Test_hl xxx guibg=#0032aa', exec_capture('highlight Test_hl')) meths.set_hl(0, 'Test_hl2', highlight3_config) - eq('Test_hl2 xxx cterm=italic,reverse,strikethrough,altfont,nocombine ctermfg=8 ctermbg=15 gui=bold,underdashed,italic,reverse,strikethrough,altfont guifg=#ff0000 guibg=#0032aa', - exec_capture('highlight Test_hl2')) + eq( + 'Test_hl2 xxx cterm=italic,reverse,strikethrough,altfont,nocombine ctermfg=8 ctermbg=15 gui=bold,underdashed,italic,reverse,strikethrough,altfont guifg=#ff0000 guibg=#0032aa', + exec_capture('highlight Test_hl2') + ) -- Colors are stored with the name they are defined, but -- with canonical casing - meths.set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue'}) - eq('Test_hl3 xxx guifg=Blue guibg=Red', - exec_capture('highlight Test_hl3')) + meths.set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue' }) + eq('Test_hl3 xxx guifg=Blue guibg=Red', exec_capture('highlight Test_hl3')) end) - it("can modify a highlight in the global namespace", function() - meths.set_hl(0, 'Test_hl3', { bg = 'red', fg = 'blue'}) - eq('Test_hl3 xxx guifg=Blue guibg=Red', - exec_capture('highlight Test_hl3')) + it('can modify a highlight in the global namespace', function() + meths.set_hl(0, 'Test_hl3', { bg = 'red', fg = 'blue' }) + eq('Test_hl3 xxx guifg=Blue guibg=Red', exec_capture('highlight Test_hl3')) meths.set_hl(0, 'Test_hl3', { bg = 'red' }) - eq('Test_hl3 xxx guibg=Red', - exec_capture('highlight Test_hl3')) + eq('Test_hl3 xxx guibg=Red', exec_capture('highlight Test_hl3')) - meths.set_hl(0, 'Test_hl3', { ctermbg = 9, ctermfg = 12}) - eq('Test_hl3 xxx ctermfg=12 ctermbg=9', - exec_capture('highlight Test_hl3')) + meths.set_hl(0, 'Test_hl3', { ctermbg = 9, ctermfg = 12 }) + eq('Test_hl3 xxx ctermfg=12 ctermbg=9', exec_capture('highlight Test_hl3')) - meths.set_hl(0, 'Test_hl3', { ctermbg = 'red' , ctermfg = 'blue'}) - eq('Test_hl3 xxx ctermfg=12 ctermbg=9', - exec_capture('highlight Test_hl3')) + meths.set_hl(0, 'Test_hl3', { ctermbg = 'red', ctermfg = 'blue' }) + eq('Test_hl3 xxx ctermfg=12 ctermbg=9', exec_capture('highlight Test_hl3')) meths.set_hl(0, 'Test_hl3', { ctermbg = 9 }) - eq('Test_hl3 xxx ctermbg=9', - exec_capture('highlight Test_hl3')) + eq('Test_hl3 xxx ctermbg=9', exec_capture('highlight Test_hl3')) - eq("Invalid highlight color: 'redd'", - pcall_err(meths.set_hl, 0, 'Test_hl3', {fg='redd'})) + eq("Invalid highlight color: 'redd'", pcall_err(meths.set_hl, 0, 'Test_hl3', { fg = 'redd' })) - eq("Invalid highlight color: 'bleu'", - pcall_err(meths.set_hl, 0, 'Test_hl3', {ctermfg='bleu'})) + eq( + "Invalid highlight color: 'bleu'", + pcall_err(meths.set_hl, 0, 'Test_hl3', { ctermfg = 'bleu' }) + ) - meths.set_hl(0, 'Test_hl3', {fg='#FF00FF'}) - eq('Test_hl3 xxx guifg=#ff00ff', - exec_capture('highlight Test_hl3')) + meths.set_hl(0, 'Test_hl3', { fg = '#FF00FF' }) + eq('Test_hl3 xxx guifg=#ff00ff', exec_capture('highlight Test_hl3')) - eq("Invalid highlight color: '#FF00FF'", - pcall_err(meths.set_hl, 0, 'Test_hl3', {ctermfg='#FF00FF'})) + eq( + "Invalid highlight color: '#FF00FF'", + pcall_err(meths.set_hl, 0, 'Test_hl3', { ctermfg = '#FF00FF' }) + ) - for _, fg_val in ipairs{ nil, 'NONE', 'nOnE', '', -1 } do - meths.set_hl(0, 'Test_hl3', {fg = fg_val}) - eq('Test_hl3 xxx cleared', - exec_capture('highlight Test_hl3')) + for _, fg_val in ipairs { nil, 'NONE', 'nOnE', '', -1 } do + meths.set_hl(0, 'Test_hl3', { fg = fg_val }) + eq('Test_hl3 xxx cleared', exec_capture('highlight Test_hl3')) end - meths.set_hl(0, 'Test_hl3', {fg='#FF00FF', blend=50}) - eq('Test_hl3 xxx guifg=#ff00ff blend=50', - exec_capture('highlight Test_hl3')) - + meths.set_hl(0, 'Test_hl3', { fg = '#FF00FF', blend = 50 }) + eq('Test_hl3 xxx guifg=#ff00ff blend=50', exec_capture('highlight Test_hl3')) end) it("correctly sets 'Normal' internal properties", function() -- Normal has some special handling internally. #18024 - meths.set_hl(0, 'Normal', {fg='#000083', bg='#0000F3'}) - eq({foreground = 131, background = 243}, nvim("get_hl_by_name", 'Normal', true)) + meths.set_hl(0, 'Normal', { fg = '#000083', bg = '#0000F3' }) + eq({ foreground = 131, background = 243 }, nvim('get_hl_by_name', 'Normal', true)) end) it('does not segfault on invalid group name #20009', function() - eq("Invalid highlight name: 'foo bar'", pcall_err(meths.set_hl, 0, 'foo bar', {bold = true})) + eq("Invalid highlight name: 'foo bar'", pcall_err(meths.set_hl, 0, 'foo bar', { bold = true })) assert_alive() end) end) @@ -380,14 +391,16 @@ describe('API: get highlight', function() local highlight1 = { bg = highlight_color.bg, fg = highlight_color.fg, - bold = true, italic = true, - cterm = {bold = true, italic = true}, + bold = true, + italic = true, + cterm = { bold = true, italic = true }, } local highlight2 = { ctermbg = highlight_color.ctermbg, ctermfg = highlight_color.ctermfg, - underline = true, reverse = true, - cterm = {underline = true, reverse = true}, + underline = true, + reverse = true, + cterm = { underline = true, reverse = true }, } local highlight3_config = { bg = highlight_color.bg, @@ -413,8 +426,19 @@ describe('API: get highlight', function() fg = highlight_color.fg, ctermbg = highlight_color.ctermbg, ctermfg = highlight_color.ctermfg, - bold = true, italic = true, reverse = true, underdashed = true, strikethrough = true, altfont = true, - cterm = {italic = true, nocombine = true, reverse = true, strikethrough = true, altfont = true} + bold = true, + italic = true, + reverse = true, + underdashed = true, + strikethrough = true, + altfont = true, + cterm = { + italic = true, + nocombine = true, + reverse = true, + strikethrough = true, + altfont = true, + }, } local function get_ns() @@ -434,17 +458,16 @@ describe('API: get highlight', function() before_each(clear) it('validation', function() - eq("Invalid 'name': expected String, got Integer", - pcall_err(meths.get_hl, 0, { name = 177 })) + eq("Invalid 'name': expected String, got Integer", pcall_err(meths.get_hl, 0, { name = 177 })) eq('Highlight id out of bounds', pcall_err(meths.get_hl, 0, { name = 'Test set hl' })) end) it('nvim_get_hl with create flag', function() - eq({}, nvim("get_hl", 0, {name = 'Foo', create = false})) + eq({}, nvim('get_hl', 0, { name = 'Foo', create = false })) eq(0, funcs.hlexists('Foo')) - meths.get_hl(0, {name = 'Bar', create = true}) + meths.get_hl(0, { name = 'Bar', create = true }) eq(1, funcs.hlexists('Bar')) - meths.get_hl(0, {name = 'FooBar'}) + meths.get_hl(0, { name = 'FooBar' }) eq(1, funcs.hlexists('FooBar')) end) @@ -454,11 +477,11 @@ describe('API: get highlight', function() meths.set_hl(ns, 'Test_hl_link', { link = 'Test_hl' }) eq({ Test_hl = { - bg = 11845374 + bg = 11845374, }, Test_hl_link = { - link = 'Test_hl' - } + link = 'Test_hl', + }, }, meths.get_hl(ns, {})) end) @@ -502,8 +525,7 @@ describe('API: get highlight', function() undercurl = true, }, }) - eq({ underdotted = true, cterm = { undercurl = true} }, - meths.get_hl(ns, { name = 'Test_hl' })) + eq({ underdotted = true, cterm = { undercurl = true } }, meths.get_hl(ns, { name = 'Test_hl' })) end) it('can get a highlight in the global namespace', function() @@ -533,8 +555,13 @@ describe('API: get highlight', function() command( 'hi NewHighlight cterm=underline ctermbg=green guifg=red guibg=yellow guisp=blue gui=bold' ) - eq({ fg = 16711680, bg = 16776960, sp = 255, bold = true, - ctermbg = 10, cterm = { underline = true }, + eq({ + fg = 16711680, + bg = 16776960, + sp = 255, + bold = true, + ctermbg = 10, + cterm = { underline = true }, }, meths.get_hl(0, { id = hl_id })) -- Test 0 argument @@ -547,16 +574,30 @@ describe('API: get highlight', function() -- Test all highlight properties. command('hi NewHighlight gui=underline,bold,italic,reverse,strikethrough,altfont,nocombine') - eq({ fg = 16711680, bg = 16776960, sp = 255, - altfont = true, bold = true, italic = true, nocombine = true, reverse = true, strikethrough = true, underline = true, - ctermbg = 10, cterm = {underline = true}, + eq({ + fg = 16711680, + bg = 16776960, + sp = 255, + altfont = true, + bold = true, + italic = true, + nocombine = true, + reverse = true, + strikethrough = true, + underline = true, + ctermbg = 10, + cterm = { underline = true }, }, meths.get_hl(0, { id = hl_id })) -- Test undercurl command('hi NewHighlight gui=undercurl') - eq({ fg = 16711680, bg = 16776960, sp = 255, undercurl = true, - ctermbg = 10, - cterm = {underline = true}, + eq({ + fg = 16711680, + bg = 16776960, + sp = 255, + undercurl = true, + ctermbg = 10, + cterm = { underline = true }, }, meths.get_hl(0, { id = hl_id })) end) @@ -573,7 +614,10 @@ describe('API: get highlight', function() command('hi Bar guifg=red') command('hi Foo guifg=#00ff00 gui=bold,underline') command('hi! link Foo Bar') - eq({ link = 'Bar', fg = tonumber('00ff00', 16), bold = true, underline = true }, meths.get_hl(0, { name = 'Foo', link = true })) + eq( + { link = 'Bar', fg = tonumber('00ff00', 16), bold = true, underline = true }, + meths.get_hl(0, { name = 'Foo', link = true }) + ) end) it('can set link as well as other attributes', function() @@ -584,57 +628,57 @@ describe('API: get highlight', function() end) it("doesn't contain unset groups", function() - local id = meths.get_hl_id_by_name "@foobar.hubbabubba" + local id = meths.get_hl_id_by_name '@foobar.hubbabubba' ok(id > 0) local data = meths.get_hl(0, {}) - eq(nil, data["@foobar.hubbabubba"]) - eq(nil, data["@foobar"]) + eq(nil, data['@foobar.hubbabubba']) + eq(nil, data['@foobar']) command 'hi @foobar.hubbabubba gui=bold' data = meths.get_hl(0, {}) - eq({bold = true}, data["@foobar.hubbabubba"]) - eq(nil, data["@foobar"]) + eq({ bold = true }, data['@foobar.hubbabubba']) + eq(nil, data['@foobar']) -- @foobar.hubbabubba was explicitly cleared and thus shows up -- but @foobar was never touched, and thus doesn't command 'hi clear @foobar.hubbabubba' data = meths.get_hl(0, {}) - eq({}, data["@foobar.hubbabubba"]) - eq(nil, data["@foobar"]) + eq({}, data['@foobar.hubbabubba']) + eq(nil, data['@foobar']) end) it('should return default flag', function() - meths.set_hl(0, 'Tried', { fg = "#00ff00", default = true }) + meths.set_hl(0, 'Tried', { fg = '#00ff00', default = true }) eq({ fg = tonumber('00ff00', 16), default = true }, meths.get_hl(0, { name = 'Tried' })) end) it('should not output empty gui and cterm #23474', function() - meths.set_hl(0, 'Foo', {default = true}) + meths.set_hl(0, 'Foo', { default = true }) meths.set_hl(0, 'Bar', { default = true, fg = '#ffffff' }) - meths.set_hl(0, 'FooBar', { default = true, fg = '#ffffff', cterm = {bold = true} }) - meths.set_hl(0, 'FooBarA', { default = true, fg = '#ffffff', cterm = {bold = true,italic = true}}) + meths.set_hl(0, 'FooBar', { default = true, fg = '#ffffff', cterm = { bold = true } }) + meths.set_hl( + 0, + 'FooBarA', + { default = true, fg = '#ffffff', cterm = { bold = true, italic = true } } + ) - eq('Foo xxx cleared', - exec_capture('highlight Foo')) - eq({default = true}, meths.get_hl(0, {name = 'Foo'})) - eq('Bar xxx guifg=#ffffff', - exec_capture('highlight Bar')) - eq('FooBar xxx cterm=bold guifg=#ffffff', - exec_capture('highlight FooBar')) - eq('FooBarA xxx cterm=bold,italic guifg=#ffffff', - exec_capture('highlight FooBarA')) + eq('Foo xxx cleared', exec_capture('highlight Foo')) + eq({ default = true }, meths.get_hl(0, { name = 'Foo' })) + eq('Bar xxx guifg=#ffffff', exec_capture('highlight Bar')) + eq('FooBar xxx cterm=bold guifg=#ffffff', exec_capture('highlight FooBar')) + eq('FooBarA xxx cterm=bold,italic guifg=#ffffff', exec_capture('highlight FooBarA')) end) it('can override exist highlight group by force #20323', function() local white = tonumber('ffffff', 16) local green = tonumber('00ff00', 16) - meths.set_hl(0, 'Foo', { fg=white }) - meths.set_hl(0, 'Foo', { fg=green, force = true }) - eq({ fg = green },meths.get_hl(0, {name = 'Foo'})) - meths.set_hl(0, 'Bar', {link = 'Comment', default = true}) - meths.set_hl(0, 'Bar', {link = 'Foo',default = true, force = true}) - eq({link ='Foo', default = true}, meths.get_hl(0, {name = 'Bar'})) + meths.set_hl(0, 'Foo', { fg = white }) + meths.set_hl(0, 'Foo', { fg = green, force = true }) + eq({ fg = green }, meths.get_hl(0, { name = 'Foo' })) + meths.set_hl(0, 'Bar', { link = 'Comment', default = true }) + meths.set_hl(0, 'Bar', { link = 'Foo', default = true, force = true }) + eq({ link = 'Foo', default = true }, meths.get_hl(0, { name = 'Bar' })) end) end) @@ -647,9 +691,9 @@ describe('API: set/get highlight namespace', function() end) it('set/get window highlight namespace', function() - eq(-1, meths.get_hl_ns({winid = 0})) + eq(-1, meths.get_hl_ns({ winid = 0 })) local ns = meths.create_namespace('') meths.win_set_hl_ns(0, ns) - eq(ns, meths.get_hl_ns({winid = 0})) + eq(ns, meths.get_hl_ns({ winid = 0 })) end) end) diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index 434f117956..50c353d764 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -39,21 +39,21 @@ describe('nvim_get_keymap', function() -- Basic mapping and table to be used to describe results local foo_bar_string = 'nnoremap foo bar' local foo_bar_map_table = { - lhs='foo', - lhsraw='foo', - script=0, - silent=0, - rhs='bar', - expr=0, - sid=0, - scriptversion=1, - buffer=0, - nowait=0, - mode='n', - mode_bits=0x01, - abbr=0, - noremap=1, - lnum=0, + lhs = 'foo', + lhsraw = 'foo', + script = 0, + silent = 0, + rhs = 'bar', + expr = 0, + sid = 0, + scriptversion = 1, + buffer = 0, + nowait = 0, + mode = 'n', + mode_bits = 0x01, + abbr = 0, + noremap = 1, + lnum = 0, } it('returns empty list when no map', function() @@ -66,10 +66,8 @@ describe('nvim_get_keymap', function() -- Should be the same as the dictionary we supplied earlier -- and the dictionary you would get from maparg -- since this is a global map, and not script local - eq({foo_bar_map_table}, meths.get_keymap('n')) - eq({funcs.maparg('foo', 'n', false, true)}, - meths.get_keymap('n') - ) + eq({ foo_bar_map_table }, meths.get_keymap('n')) + eq({ funcs.maparg('foo', 'n', false, true) }, meths.get_keymap('n')) -- Add another mapping command('nnoremap foo_longer bar_longer') @@ -78,15 +76,11 @@ describe('nvim_get_keymap', function() foolong_bar_map_table['lhsraw'] = 'foo_longer' foolong_bar_map_table['rhs'] = 'bar_longer' - eq({foolong_bar_map_table, foo_bar_map_table}, - meths.get_keymap('n') - ) + eq({ foolong_bar_map_table, foo_bar_map_table }, meths.get_keymap('n')) -- Remove a mapping command('unmap foo_longer') - eq({foo_bar_map_table}, - meths.get_keymap('n') - ) + eq({ foo_bar_map_table }, meths.get_keymap('n')) end) it('works for other modes', function() @@ -100,7 +94,7 @@ describe('nvim_get_keymap', function() insert_table['mode'] = 'i' insert_table['mode_bits'] = 0x10 - eq({insert_table}, meths.get_keymap('i')) + eq({ insert_table }, meths.get_keymap('i')) end) it('considers scope', function() @@ -117,8 +111,8 @@ describe('nvim_get_keymap', function() command('nnoremap <buffer> foo bar') -- The buffer mapping should not show up - eq({foolong_bar_map_table}, meths.get_keymap('n')) - eq({buffer_table}, curbufmeths.get_keymap('n')) + eq({ foolong_bar_map_table }, meths.get_keymap('n')) + eq({ buffer_table }, curbufmeths.get_keymap('n')) end) it('considers scope for overlapping maps', function() @@ -129,8 +123,8 @@ describe('nvim_get_keymap', function() command('nnoremap <buffer> foo bar') - eq({foo_bar_map_table}, meths.get_keymap('n')) - eq({buffer_table}, curbufmeths.get_keymap('n')) + eq({ foo_bar_map_table }, meths.get_keymap('n')) + eq({ buffer_table }, curbufmeths.get_keymap('n')) end) it('can retrieve mapping for different buffers', function() @@ -149,81 +143,118 @@ describe('nvim_get_keymap', function() -- Final buffer will have buffer mappings local buffer_table = shallowcopy(foo_bar_map_table) buffer_table['buffer'] = final_buffer - eq({buffer_table}, meths.buf_get_keymap(final_buffer, 'n')) - eq({buffer_table}, meths.buf_get_keymap(0, 'n')) + eq({ buffer_table }, meths.buf_get_keymap(final_buffer, 'n')) + eq({ buffer_table }, meths.buf_get_keymap(0, 'n')) command('buffer ' .. original_buffer) eq(original_buffer, curbufmeths.get_number()) -- Original buffer won't have any mappings eq({}, meths.get_keymap('n')) eq({}, curbufmeths.get_keymap('n')) - eq({buffer_table}, meths.buf_get_keymap(final_buffer, 'n')) + eq({ buffer_table }, meths.buf_get_keymap(final_buffer, 'n')) end) -- Test toggle switches for basic options -- @param option The key represented in the `maparg()` result dict - local function global_and_buffer_test(map, - option, - option_token, - global_on_result, - buffer_on_result, - global_off_result, - buffer_off_result, - new_windows) - + local function global_and_buffer_test( + map, + option, + option_token, + global_on_result, + buffer_on_result, + global_off_result, + buffer_off_result, + new_windows + ) local function make_new_windows(number_of_windows) if new_windows == nil then return nil end - for _=1,number_of_windows do + for _ = 1, number_of_windows do command('new') end end - local mode = string.sub(map, 1,1) + local mode = string.sub(map, 1, 1) -- Don't run this for the <buffer> mapping, since it doesn't make sense if option_token ~= '<buffer>' then - it(string.format( 'returns %d for the key "%s" when %s is used globally with %s (%s)', - global_on_result, option, option_token, map, mode), function() - make_new_windows(new_windows) - command(map .. ' ' .. option_token .. ' foo bar') - local result = meths.get_keymap(mode)[1][option] - eq(global_on_result, result) - end) + it( + string.format( + 'returns %d for the key "%s" when %s is used globally with %s (%s)', + global_on_result, + option, + option_token, + map, + mode + ), + function() + make_new_windows(new_windows) + command(map .. ' ' .. option_token .. ' foo bar') + local result = meths.get_keymap(mode)[1][option] + eq(global_on_result, result) + end + ) end - it(string.format('returns %d for the key "%s" when %s is used for buffers with %s (%s)', - buffer_on_result, option, option_token, map, mode), function() - make_new_windows(new_windows) - command(map .. ' <buffer> ' .. option_token .. ' foo bar') - local result = curbufmeths.get_keymap(mode)[1][option] - eq(buffer_on_result, result) - end) + it( + string.format( + 'returns %d for the key "%s" when %s is used for buffers with %s (%s)', + buffer_on_result, + option, + option_token, + map, + mode + ), + function() + make_new_windows(new_windows) + command(map .. ' <buffer> ' .. option_token .. ' foo bar') + local result = curbufmeths.get_keymap(mode)[1][option] + eq(buffer_on_result, result) + end + ) -- Don't run these for the <buffer> mapping, since it doesn't make sense if option_token ~= '<buffer>' then - it(string.format('returns %d for the key "%s" when %s is not used globally with %s (%s)', - global_off_result, option, option_token, map, mode), function() - make_new_windows(new_windows) - command(map .. ' baz bat') - local result = meths.get_keymap(mode)[1][option] - eq(global_off_result, result) - end) - - it(string.format('returns %d for the key "%s" when %s is not used for buffers with %s (%s)', - buffer_off_result, option, option_token, map, mode), function() - make_new_windows(new_windows) - command(map .. ' <buffer> foo bar') + it( + string.format( + 'returns %d for the key "%s" when %s is not used globally with %s (%s)', + global_off_result, + option, + option_token, + map, + mode + ), + function() + make_new_windows(new_windows) + command(map .. ' baz bat') + local result = meths.get_keymap(mode)[1][option] + eq(global_off_result, result) + end + ) - local result = curbufmeths.get_keymap(mode)[1][option] - eq(buffer_off_result, result) - end) + it( + string.format( + 'returns %d for the key "%s" when %s is not used for buffers with %s (%s)', + buffer_off_result, + option, + option_token, + map, + mode + ), + function() + make_new_windows(new_windows) + command(map .. ' <buffer> foo bar') + + local result = curbufmeths.get_keymap(mode)[1][option] + eq(buffer_off_result, result) + end + ) end end -- Standard modes and returns the same values in the dictionary as maparg() - local mode_list = {'nnoremap', 'nmap', 'imap', 'inoremap', 'cnoremap'} + local mode_list = { 'nnoremap', 'nmap', 'imap', 'inoremap', 'cnoremap' } for mode in pairs(mode_list) do global_and_buffer_test(mode_list[mode], 'silent', '<silent>', 1, 1, 0, 0) global_and_buffer_test(mode_list[mode], 'nowait', '<nowait>', 1, 1, 0, 0) @@ -272,16 +303,16 @@ describe('nvim_get_keymap', function() it('works correctly despite various &cpo settings', function() local cpo_table = { - script=0, - silent=0, - expr=0, - sid=0, - scriptversion=1, - buffer=0, - nowait=0, - abbr=0, - noremap=1, - lnum=0, + script = 0, + silent = 0, + expr = 0, + sid = 0, + scriptversion = 1, + buffer = 0, + nowait = 0, + abbr = 0, + noremap = 1, + lnum = 0, } local function cpomap(lhs, rhs, mode) local ret = shallowcopy(cpo_table) @@ -323,57 +354,67 @@ describe('nvim_get_keymap', function() 'set cpo+=B', }) do command(cmd) - eq({cpomap('\\<C-C><C-C><lt>C-c>\\', '\\<C-D><C-D><lt>C-d>\\', 'n'), - cpomap('\\<C-A><C-A><lt>C-a>\\', '\\<C-B><C-B><lt>C-b>\\', 'n')}, - get_keymap_noraw('n')) - eq({cpomap('\\<C-C><C-C><lt>C-c>\\', '\\<C-D><C-D><lt>C-d>\\', 'x'), - cpomap('\\<C-A><C-A><lt>C-a>\\', '\\<C-B><C-B><lt>C-b>\\', 'x')}, - get_keymap_noraw('x')) - eq({cpomap('<lt>C-c><C-C><lt>C-c> ', '<lt>C-d><C-D><lt>C-d>', 's'), - cpomap('<lt>C-a><C-A><lt>C-a> ', '<lt>C-b><C-B><lt>C-b>', 's')}, - get_keymap_noraw('s')) - eq({cpomap('<lt>C-c><C-C><lt>C-c> ', '<lt>C-d><C-D><lt>C-d>', 'o'), - cpomap('<lt>C-a><C-A><lt>C-a> ', '<lt>C-b><C-B><lt>C-b>', 'o')}, - get_keymap_noraw('o')) + eq({ + cpomap('\\<C-C><C-C><lt>C-c>\\', '\\<C-D><C-D><lt>C-d>\\', 'n'), + cpomap('\\<C-A><C-A><lt>C-a>\\', '\\<C-B><C-B><lt>C-b>\\', 'n'), + }, get_keymap_noraw('n')) + eq({ + cpomap('\\<C-C><C-C><lt>C-c>\\', '\\<C-D><C-D><lt>C-d>\\', 'x'), + cpomap('\\<C-A><C-A><lt>C-a>\\', '\\<C-B><C-B><lt>C-b>\\', 'x'), + }, get_keymap_noraw('x')) + eq({ + cpomap('<lt>C-c><C-C><lt>C-c> ', '<lt>C-d><C-D><lt>C-d>', 's'), + cpomap('<lt>C-a><C-A><lt>C-a> ', '<lt>C-b><C-B><lt>C-b>', 's'), + }, get_keymap_noraw('s')) + eq({ + cpomap('<lt>C-c><C-C><lt>C-c> ', '<lt>C-d><C-D><lt>C-d>', 'o'), + cpomap('<lt>C-a><C-A><lt>C-a> ', '<lt>C-b><C-B><lt>C-b>', 'o'), + }, get_keymap_noraw('o')) end end) it('always uses space for space and bar for bar', function() local space_table = { - lhs='| |', - lhsraw='| |', - rhs='| |', - mode='n', - mode_bits=0x01, - abbr=0, - script=0, - silent=0, - expr=0, - sid=0, - scriptversion=1, - buffer=0, - nowait=0, - noremap=1, - lnum=0, + lhs = '| |', + lhsraw = '| |', + rhs = '| |', + mode = 'n', + mode_bits = 0x01, + abbr = 0, + script = 0, + silent = 0, + expr = 0, + sid = 0, + scriptversion = 1, + buffer = 0, + nowait = 0, + noremap = 1, + lnum = 0, } command('nnoremap \\|<Char-0x20><Char-32><Space><Bar> \\|<Char-0x20><Char-32><Space> <Bar>') - eq({space_table}, meths.get_keymap('n')) + eq({ space_table }, meths.get_keymap('n')) end) it('can handle lua mappings', function() - eq(0, exec_lua([[ + eq( + 0, + exec_lua([[ GlobalCount = 0 vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]])) + ]]) + ) feed('asdf\n') eq(1, exec_lua([[return GlobalCount]])) - eq(2, exec_lua([[ + eq( + 2, + exec_lua([[ vim.api.nvim_get_keymap('n')[1].callback() return GlobalCount - ]])) + ]]) + ) exec([[ call nvim_get_keymap('n')[0].callback() @@ -383,42 +424,42 @@ describe('nvim_get_keymap', function() local mapargs = meths.get_keymap('n') mapargs[1].callback = nil eq({ - lhs='asdf', - lhsraw='asdf', - script=0, - silent=0, - expr=0, - sid=sid_lua, - scriptversion=1, - buffer=0, - nowait=0, - mode='n', - mode_bits=0x01, - abbr=0, - noremap=0, - lnum=0, + lhs = 'asdf', + lhsraw = 'asdf', + script = 0, + silent = 0, + expr = 0, + sid = sid_lua, + scriptversion = 1, + buffer = 0, + nowait = 0, + mode = 'n', + mode_bits = 0x01, + abbr = 0, + noremap = 0, + lnum = 0, }, mapargs[1]) end) it('can handle map descriptions', function() - meths.set_keymap('n', 'lhs', 'rhs', {desc="map description"}) + meths.set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) eq({ - lhs='lhs', - lhsraw='lhs', - rhs='rhs', - script=0, - silent=0, - expr=0, - sid=sid_api_client, - scriptversion=1, - buffer=0, - nowait=0, - mode='n', - mode_bits=0x01, - abbr=0, - noremap=0, - lnum=0, - desc='map description' + lhs = 'lhs', + lhsraw = 'lhs', + rhs = 'rhs', + script = 0, + silent = 0, + expr = 0, + sid = sid_api_client, + scriptversion = 1, + buffer = 0, + nowait = 0, + mode = 'n', + mode_bits = 0x01, + abbr = 0, + noremap = 0, + lnum = 0, + desc = 'map description', }, meths.get_keymap('n')[1]) end) end) @@ -490,8 +531,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- assume MAXMAPLEN of 50 chars, as declared in mapping_defs.h local MAXMAPLEN = 50 local lhs = '' - for i=1,MAXMAPLEN do - lhs = lhs..(i % 10) + for i = 1, MAXMAPLEN do + lhs = lhs .. (i % 10) end -- exactly 50 chars should be fine @@ -502,23 +543,20 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq({}, get_mapargs('', lhs)) -- 51 chars should produce an error - lhs = lhs..'1' - eq('LHS exceeds maximum map length: '..lhs, - pcall_err(meths.set_keymap, '', lhs, 'rhs', {})) - eq('LHS exceeds maximum map length: '..lhs, - pcall_err(meths.del_keymap, '', lhs)) + lhs = lhs .. '1' + eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(meths.set_keymap, '', lhs, 'rhs', {})) + eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(meths.del_keymap, '', lhs)) end) it('does not throw errors when rhs is longer than MAXMAPLEN', function() local MAXMAPLEN = 50 local rhs = '' - for i=1,MAXMAPLEN do - rhs = rhs..(i % 10) + for i = 1, MAXMAPLEN do + rhs = rhs .. (i % 10) end - rhs = rhs..'1' + rhs = rhs .. '1' meths.set_keymap('', 'lhs', rhs, {}) - eq(generate_mapargs('', 'lhs', rhs), - get_mapargs('', 'lhs')) + eq(generate_mapargs('', 'lhs', rhs), get_mapargs('', 'lhs')) end) it('error on invalid mode shortname', function() @@ -534,7 +572,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq('Invalid mode shortname: "!!"', pcall_err(meths.set_keymap, '!!', 'lhs', 'rhs', {})) eq('Invalid mode shortname: "map"', pcall_err(meths.set_keymap, 'map', 'lhs', 'rhs', {})) eq('Invalid mode shortname: "vmap"', pcall_err(meths.set_keymap, 'vmap', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "xnoremap"', pcall_err(meths.set_keymap, 'xnoremap', 'lhs', 'rhs', {})) + eq( + 'Invalid mode shortname: "xnoremap"', + pcall_err(meths.set_keymap, 'xnoremap', 'lhs', 'rhs', {}) + ) eq('Invalid mode shortname: " "', pcall_err(meths.del_keymap, ' ', 'lhs')) eq('Invalid mode shortname: "m"', pcall_err(meths.del_keymap, 'm', 'lhs')) eq('Invalid mode shortname: "?"', pcall_err(meths.del_keymap, '?', 'lhs')) @@ -551,32 +592,29 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end) it('error on invalid optnames', function() - eq("Invalid key: 'silentt'", - pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', {silentt = true})) - eq("Invalid key: 'sidd'", - pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', {sidd = false})) - eq("Invalid key: 'nowaiT'", - pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', {nowaiT = false})) + eq("Invalid key: 'silentt'", pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', { silentt = true })) + eq("Invalid key: 'sidd'", pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', { sidd = false })) + eq("Invalid key: 'nowaiT'", pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', { nowaiT = false })) end) it('error on <buffer> option key', function() - eq("Invalid key: 'buffer'", - pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', {buffer = true})) + eq("Invalid key: 'buffer'", pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', { buffer = true })) end) it('error when "replace_keycodes" is used without "expr"', function() - eq('"replace_keycodes" requires "expr"', - pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', {replace_keycodes = true})) + eq( + '"replace_keycodes" requires "expr"', + pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', { replace_keycodes = true }) + ) end) - local optnames = {'nowait', 'silent', 'script', 'expr', 'unique'} + local optnames = { 'nowait', 'silent', 'script', 'expr', 'unique' } for _, opt in ipairs(optnames) do -- note: need '%' to escape hyphens, which have special meaning in lua - it('throws an error when given non-boolean value for '..opt, function() + it('throws an error when given non-boolean value for ' .. opt, function() local opts = {} opts[opt] = 'fooo' - eq(opt..' is not a boolean', - pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', opts)) + eq(opt .. ' is not a boolean', pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', opts)) end) end @@ -591,26 +629,21 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('does not throw when LHS or RHS have leading/trailing whitespace', function() meths.set_keymap('n', ' lhs', 'rhs', {}) - eq(generate_mapargs('n', '<Space><Space><Space>lhs', 'rhs'), - get_mapargs('n', ' lhs')) + eq(generate_mapargs('n', '<Space><Space><Space>lhs', 'rhs'), get_mapargs('n', ' lhs')) meths.set_keymap('n', 'lhs ', 'rhs', {}) - eq(generate_mapargs('n', 'lhs<Space><Space><Space><Space>', 'rhs'), - get_mapargs('n', 'lhs ')) + eq(generate_mapargs('n', 'lhs<Space><Space><Space><Space>', 'rhs'), get_mapargs('n', 'lhs ')) meths.set_keymap('v', ' lhs ', '\trhs\t\f', {}) - eq(generate_mapargs('v', '<Space>lhs<Space><Space>', '\trhs\t\f'), - get_mapargs('v', ' lhs ')) + eq(generate_mapargs('v', '<Space>lhs<Space><Space>', '\trhs\t\f'), get_mapargs('v', ' lhs ')) end) it('can set noremap mappings', function() - meths.set_keymap('x', 'lhs', 'rhs', {noremap = true}) - eq(generate_mapargs('x', 'lhs', 'rhs', {noremap = true}), - get_mapargs('x', 'lhs')) + meths.set_keymap('x', 'lhs', 'rhs', { noremap = true }) + eq(generate_mapargs('x', 'lhs', 'rhs', { noremap = true }), get_mapargs('x', 'lhs')) - meths.set_keymap('t', 'lhs', 'rhs', {noremap = true}) - eq(generate_mapargs('t', 'lhs', 'rhs', {noremap = true}), - get_mapargs('t', 'lhs')) + meths.set_keymap('t', 'lhs', 'rhs', { noremap = true }) + eq(generate_mapargs('t', 'lhs', 'rhs', { noremap = true }), get_mapargs('t', 'lhs')) end) it('can unmap mappings', function() @@ -618,14 +651,14 @@ describe('nvim_set_keymap, nvim_del_keymap', function() meths.del_keymap('v', 'lhs') eq({}, get_mapargs('v', 'lhs')) - meths.set_keymap('t', 'lhs', 'rhs', {noremap = true}) + meths.set_keymap('t', 'lhs', 'rhs', { noremap = true }) meths.del_keymap('t', 'lhs') eq({}, get_mapargs('t', 'lhs')) end) -- Test some edge cases it('"!" and empty string are synonyms for mapmode-nvo', function() - local nvo_shortnames = {'', '!'} + local nvo_shortnames = { '', '!' } for _, name in ipairs(nvo_shortnames) do meths.set_keymap(name, 'lhs', 'rhs', {}) meths.del_keymap(name, 'lhs') @@ -633,12 +666,11 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end end) - local special_chars = {'<C-U>', '<S-Left>', '<F12><F2><Tab>', '<Space><Tab>'} + local special_chars = { '<C-U>', '<S-Left>', '<F12><F2><Tab>', '<Space><Tab>' } for _, lhs in ipairs(special_chars) do for _, rhs in ipairs(special_chars) do local mapmode = '!' - it('can set mappings with special characters, lhs: '..lhs..', rhs: '..rhs, - function() + it('can set mappings with special characters, lhs: ' .. lhs .. ', rhs: ' .. rhs, function() meths.set_keymap(mapmode, lhs, rhs, {}) eq(generate_mapargs(mapmode, lhs, rhs), get_mapargs(mapmode, lhs)) end) @@ -654,39 +686,34 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('can set mappings whose RHS is a <Nop>', function() meths.set_keymap('i', 'lhs', '<Nop>', {}) command('normal ilhs') - eq({''}, curbufmeths.get_lines(0, -1, 0)) -- imap to <Nop> does nothing - eq(generate_mapargs('i', 'lhs', '<Nop>', {}), - get_mapargs('i', 'lhs')) + eq({ '' }, curbufmeths.get_lines(0, -1, 0)) -- imap to <Nop> does nothing + eq(generate_mapargs('i', 'lhs', '<Nop>', {}), get_mapargs('i', 'lhs')) -- also test for case insensitivity meths.set_keymap('i', 'lhs', '<nOp>', {}) command('normal ilhs') - eq({''}, curbufmeths.get_lines(0, -1, 0)) + eq({ '' }, curbufmeths.get_lines(0, -1, 0)) -- note: RHS in returned mapargs() dict reflects the original RHS -- provided by the user - eq(generate_mapargs('i', 'lhs', '<nOp>', {}), - get_mapargs('i', 'lhs')) + eq(generate_mapargs('i', 'lhs', '<nOp>', {}), get_mapargs('i', 'lhs')) meths.set_keymap('i', 'lhs', '<NOP>', {}) command('normal ilhs') - eq({''}, curbufmeths.get_lines(0, -1, 0)) - eq(generate_mapargs('i', 'lhs', '<NOP>', {}), - get_mapargs('i', 'lhs')) + eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq(generate_mapargs('i', 'lhs', '<NOP>', {}), get_mapargs('i', 'lhs')) -- a single ^V in RHS is also <Nop> (see :h map-empty-rhs) meths.set_keymap('i', 'lhs', '\022', {}) command('normal ilhs') - eq({''}, curbufmeths.get_lines(0, -1, 0)) - eq(generate_mapargs('i', 'lhs', '\022', {}), - get_mapargs('i', 'lhs')) + eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq(generate_mapargs('i', 'lhs', '\022', {}), get_mapargs('i', 'lhs')) end) it('treats an empty RHS in a mapping like a <Nop>', function() meths.set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({''}, curbufmeths.get_lines(0, -1, 0)) - eq(generate_mapargs('i', 'lhs', '', {}), - get_mapargs('i', 'lhs')) + eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) end) it('can set and unset <M-">', function() @@ -698,21 +725,24 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq({}, get_mapargs('i', '<M-">')) end) - it('interprets control sequences in expr-quotes correctly when called ' - ..'inside vim', function() - command([[call nvim_set_keymap('i', "\<space>", "\<tab>", {})]]) - eq(generate_mapargs('i', '<Space>', '\t', {sid=0}), - get_mapargs('i', '<Space>')) - feed('i ') - eq({'\t'}, curbufmeths.get_lines(0, -1, 0)) - end) + it( + 'interprets control sequences in expr-quotes correctly when called ' .. 'inside vim', + function() + command([[call nvim_set_keymap('i', "\<space>", "\<tab>", {})]]) + eq(generate_mapargs('i', '<Space>', '\t', { sid = 0 }), get_mapargs('i', '<Space>')) + feed('i ') + eq({ '\t' }, curbufmeths.get_lines(0, -1, 0)) + end + ) it('throws appropriate error messages when setting <unique> maps', function() meths.set_keymap('l', 'lhs', 'rhs', {}) - eq('E227: mapping already exists for lhs', - pcall_err(meths.set_keymap, 'l', 'lhs', 'rhs', {unique = true})) + eq( + 'E227: mapping already exists for lhs', + pcall_err(meths.set_keymap, 'l', 'lhs', 'rhs', { unique = true }) + ) -- different mapmode, no error should be thrown - meths.set_keymap('t', 'lhs', 'rhs', {unique = true}) + meths.set_keymap('t', 'lhs', 'rhs', { unique = true }) end) it('can set <expr> mappings whose RHS change dynamically', function() @@ -728,14 +758,14 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq(1, meths.call_function('FlipFlop', {})) eq(0, meths.call_function('FlipFlop', {})) - meths.set_keymap('i', 'lhs', 'FlipFlop()', {expr = true}) + meths.set_keymap('i', 'lhs', 'FlipFlop()', { expr = true }) command('normal ilhs') - eq({'1'}, curbufmeths.get_lines(0, -1, 0)) + eq({ '1' }, curbufmeths.get_lines(0, -1, 0)) command('normal! ggVGd') command('normal ilhs') - eq({'0'}, curbufmeths.get_lines(0, -1, 0)) + eq({ '0' }, curbufmeths.get_lines(0, -1, 0)) end) it('can set mappings that do trigger other mappings', function() @@ -743,30 +773,30 @@ describe('nvim_set_keymap, nvim_del_keymap', function() meths.set_keymap('i', 'lhs', 'mhs', {}) command('normal imhs') - eq({'rhs'}, curbufmeths.get_lines(0, -1, 0)) + eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) command('normal! ggVGd') command('normal ilhs') - eq({'rhs'}, curbufmeths.get_lines(0, -1, 0)) + eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) end) it("can set noremap mappings that don't trigger other mappings", function() meths.set_keymap('i', 'mhs', 'rhs', {}) - meths.set_keymap('i', 'lhs', 'mhs', {noremap = true}) + meths.set_keymap('i', 'lhs', 'mhs', { noremap = true }) command('normal imhs') - eq({'rhs'}, curbufmeths.get_lines(0, -1, 0)) + eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) command('normal! ggVGd') - command('normal ilhs') -- shouldn't trigger mhs-to-rhs mapping - eq({'mhs'}, curbufmeths.get_lines(0, -1, 0)) + command('normal ilhs') -- shouldn't trigger mhs-to-rhs mapping + eq({ 'mhs' }, curbufmeths.get_lines(0, -1, 0)) end) - it("can set nowait mappings that fire without waiting", function() - meths.set_keymap('i', '123456', 'longer', {}) - meths.set_keymap('i', '123', 'shorter', {nowait = true}) + it('can set nowait mappings that fire without waiting', function() + meths.set_keymap('i', '123456', 'longer', {}) + meths.set_keymap('i', '123', 'shorter', { nowait = true }) -- feed keys one at a time; if all keys arrive atomically, the longer -- mapping will trigger @@ -775,16 +805,15 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed(c) sleep(5) end - eq({'shorter456'}, curbufmeths.get_lines(0, -1, 0)) + eq({ 'shorter456' }, curbufmeths.get_lines(0, -1, 0)) end) -- Perform exhaustive tests of basic functionality - local mapmodes = {'n', 'v', 'x', 's', 'o', '!', 'i', 'l', 'c', 't', '', 'ia', 'ca', '!a'} + local mapmodes = { 'n', 'v', 'x', 's', 'o', '!', 'i', 'l', 'c', 't', '', 'ia', 'ca', '!a' } for _, mapmode in ipairs(mapmodes) do - it('can set/unset normal mappings in mapmode '..mapmode, function() + it('can set/unset normal mappings in mapmode ' .. mapmode, function() meths.set_keymap(mapmode, 'lhs', 'rhs', {}) - eq(generate_mapargs(mapmode, 'lhs', 'rhs'), - get_mapargs(mapmode, 'lhs')) + eq(generate_mapargs(mapmode, 'lhs', 'rhs'), get_mapargs(mapmode, 'lhs')) -- some mapmodes (like 'o') will prevent other mapmodes (like '!') from -- taking effect, so unmap after each mapping @@ -794,10 +823,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end for _, mapmode in ipairs(mapmodes) do - it('can set/unset noremap mappings using mapmode '..mapmode, function() - meths.set_keymap(mapmode, 'lhs', 'rhs', {noremap = true}) - eq(generate_mapargs(mapmode, 'lhs', 'rhs', {noremap = true}), - get_mapargs(mapmode, 'lhs')) + it('can set/unset noremap mappings using mapmode ' .. mapmode, function() + meths.set_keymap(mapmode, 'lhs', 'rhs', { noremap = true }) + eq(generate_mapargs(mapmode, 'lhs', 'rhs', { noremap = true }), get_mapargs(mapmode, 'lhs')) meths.del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) @@ -806,53 +834,70 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- Test map-arguments, using optnames from above -- remove some map arguments that are harder to test, or were already tested - optnames = {'nowait', 'silent', 'expr', 'noremap'} + optnames = { 'nowait', 'silent', 'expr', 'noremap' } for _, mapmode in ipairs(mapmodes) do -- Test with single mappings for _, maparg in ipairs(optnames) do - it('can set/unset '..mapmode..'-mappings with maparg: '..maparg, - function() - meths.set_keymap(mapmode, 'lhs', 'rhs', {[maparg] = true}) - eq(generate_mapargs(mapmode, 'lhs', 'rhs', {[maparg] = true}), - get_mapargs(mapmode, 'lhs')) - meths.del_keymap(mapmode, 'lhs') - eq({}, get_mapargs(mapmode, 'lhs')) - end) - it ('can set/unset '..mapmode..'-mode mappings with maparg '.. - maparg..', whose value is false', function() - meths.set_keymap(mapmode, 'lhs', 'rhs', {[maparg] = false}) - eq(generate_mapargs(mapmode, 'lhs', 'rhs'), - get_mapargs(mapmode, 'lhs')) + it('can set/unset ' .. mapmode .. '-mappings with maparg: ' .. maparg, function() + meths.set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = true }) + eq( + generate_mapargs(mapmode, 'lhs', 'rhs', { [maparg] = true }), + get_mapargs(mapmode, 'lhs') + ) meths.del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) + it( + 'can set/unset ' + .. mapmode + .. '-mode mappings with maparg ' + .. maparg + .. ', whose value is false', + function() + meths.set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = false }) + eq(generate_mapargs(mapmode, 'lhs', 'rhs'), get_mapargs(mapmode, 'lhs')) + meths.del_keymap(mapmode, 'lhs') + eq({}, get_mapargs(mapmode, 'lhs')) + end + ) end -- Test with triplets of mappings, one of which is false for i = 1, (#optnames - 2) do local opt1, opt2, opt3 = optnames[i], optnames[i + 1], optnames[i + 2] - it('can set/unset '..mapmode..'-mode mappings with mapargs '.. - opt1..', '..opt2..', '..opt3, function() - local opts = {[opt1] = true, [opt2] = false, [opt3] = true} - meths.set_keymap(mapmode, 'lhs', 'rhs', opts) - eq(generate_mapargs(mapmode, 'lhs', 'rhs', opts), - get_mapargs(mapmode, 'lhs')) - meths.del_keymap(mapmode, 'lhs') - eq({}, get_mapargs(mapmode, 'lhs')) - end) + it( + 'can set/unset ' + .. mapmode + .. '-mode mappings with mapargs ' + .. opt1 + .. ', ' + .. opt2 + .. ', ' + .. opt3, + function() + local opts = { [opt1] = true, [opt2] = false, [opt3] = true } + meths.set_keymap(mapmode, 'lhs', 'rhs', opts) + eq(generate_mapargs(mapmode, 'lhs', 'rhs', opts), get_mapargs(mapmode, 'lhs')) + meths.del_keymap(mapmode, 'lhs') + eq({}, get_mapargs(mapmode, 'lhs')) + end + ) end end it('can make lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) end) it(':map command shows lua mapping correctly', function() @@ -861,8 +906,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] assert.truthy( string.match( - exec_lua[[return vim.api.nvim_exec2(':nmap asdf', { output = true }).output]], - "^\nn asdf <Lua %d+>" + exec_lua [[return vim.api.nvim_exec2(':nmap asdf', { output = true }).output]], + '^\nn asdf <Lua %d+>' ) ) end) @@ -871,29 +916,34 @@ describe('nvim_set_keymap, nvim_del_keymap', function() exec_lua [[ vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() print('jkl;') end }) ]] - assert.truthy(string.match(funcs.mapcheck('asdf', 'n'), - "^<Lua %d+>")) + assert.truthy(string.match(funcs.mapcheck('asdf', 'n'), '^<Lua %d+>')) end) it('maparg() returns lua mapping correctly', function() - eq(0, exec_lua([[ + eq( + 0, + exec_lua([[ GlobalCount = 0 vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]])) + ]]) + ) - assert.truthy(string.match(funcs.maparg('asdf', 'n'), "^<Lua %d+>")) + assert.truthy(string.match(funcs.maparg('asdf', 'n'), '^<Lua %d+>')) local mapargs = funcs.maparg('asdf', 'n', false, true) mapargs.callback = nil mapargs.lhsraw = nil mapargs.lhsrawalt = nil - eq(generate_mapargs('n', 'asdf', nil, {sid=sid_lua}), mapargs) + eq(generate_mapargs('n', 'asdf', nil, { sid = sid_lua }), mapargs) - eq(1, exec_lua([[ + eq( + 1, + exec_lua([[ vim.fn.maparg('asdf', 'n', false, true).callback() return GlobalCount - ]])) + ]]) + ) exec([[ call maparg('asdf', 'n', v:false, v:true).callback() @@ -908,7 +958,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('aa') - eq({'π<M-π>foo<'}, meths.buf_get_lines(0, 0, -1, false)) + eq({ 'π<M-π>foo<' }, meths.buf_get_lines(0, 0, -1, false)) end) it('can make lua expr mappings without replacing keycodes', function() @@ -918,7 +968,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('iaa<esc>') - eq({'<space>'}, meths.buf_get_lines(0, 0, -1, false)) + eq({ '<space>' }, meths.buf_get_lines(0, 0, -1, false)) end) it('lua expr mapping returning nil is equivalent to returning an empty string', function() @@ -928,41 +978,50 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('iaa<esc>') - eq({''}, meths.buf_get_lines(0, 0, -1, false)) + eq({ '' }, meths.buf_get_lines(0, 0, -1, false)) end) it('does not reset pum in lua mapping', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ VisibleCount = 0 vim.api.nvim_set_keymap('i', '<F2>', '', {callback = function() VisibleCount = VisibleCount + vim.fn.pumvisible() end}) return VisibleCount - ]]) + ]] + ) feed('i<C-X><C-V><F2><F2><esc>') - eq(2, exec_lua[[return VisibleCount]]) + eq(2, exec_lua [[return VisibleCount]]) end) it('redo of lua mappings in op-pending mode work', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ OpCount = 0 vim.api.nvim_set_keymap('o', '<F2>', '', {callback = function() OpCount = OpCount + 1 end}) return OpCount - ]]) + ]] + ) feed('d<F2>') - eq(1, exec_lua[[return OpCount]]) + eq(1, exec_lua [[return OpCount]]) feed('.') - eq(2, exec_lua[[return OpCount]]) + eq(2, exec_lua [[return OpCount]]) end) it('can overwrite lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() GlobalCount = GlobalCount - 1 end }) @@ -970,19 +1029,22 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('asdf\n') - eq(0, exec_lua[[return GlobalCount]]) + eq(0, exec_lua [[return GlobalCount]]) end) it('can unmap lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_set_keymap('n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_del_keymap('n', 'asdf' ) @@ -990,20 +1052,23 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) eq('\nNo mapping found', helpers.exec_capture('nmap asdf')) end) it('no double-free when unmapping simplifiable lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_set_keymap('n', '<C-I>', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('<C-I>\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_del_keymap('n', '<C-I>') @@ -1011,15 +1076,14 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('<C-I>\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) eq('\nNo mapping found', helpers.exec_capture('nmap <C-I>')) end) it('can set descriptions on mappings', function() - meths.set_keymap('n', 'lhs', 'rhs', {desc="map description"}) - eq(generate_mapargs('n', 'lhs', 'rhs', {desc="map description"}), get_mapargs('n', 'lhs')) - eq("\nn lhs rhs\n map description", - helpers.exec_capture("nmap lhs")) + meths.set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) + eq(generate_mapargs('n', 'lhs', 'rhs', { desc = 'map description' }), get_mapargs('n', 'lhs')) + eq('\nn lhs rhs\n map description', helpers.exec_capture('nmap lhs')) end) it('can define !-mode abbreviations with lua callbacks', function() @@ -1035,7 +1099,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq('The 1 and the bar and the 2 again', meths.get_current_line()) feed ':let x = "The foo is the one"<cr>' - eq('The 3 is the one', meths.eval'x') + eq('The 3 is the one', meths.eval 'x') end) it('can define insert mode abbreviations with lua callbacks', function() @@ -1051,7 +1115,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq('The 1 and the bar and the 2 again', meths.get_current_line()) feed ':let x = "The foo is the one"<cr>' - eq('The foo is the one', meths.eval'x') + eq('The foo is the one', meths.eval 'x') end) it('can define cmdline mode abbreviations with lua callbacks', function() @@ -1067,7 +1131,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq('The foo and the bar and the foo again', meths.get_current_line()) feed ':let x = "The foo is the one"<cr>' - eq('The 1 is the one', meths.eval'x') + eq('The 1 is the one', meths.eval 'x') end) end) @@ -1081,7 +1145,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() -- switch to the given buffer, abandoning any changes in the current buffer local function switch_to_buf(bufnr) - command(bufnr..'buffer!') + command(bufnr .. 'buffer!') end -- `set hidden`, then create two buffers and return their bufnr's @@ -1090,10 +1154,10 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() local function make_two_buffers(start_from_first) command('set hidden') - local first_buf = meths.call_function('bufnr', {'%'}) + local first_buf = meths.call_function('bufnr', { '%' }) command('new') - local second_buf = meths.call_function('bufnr', {'%'}) - neq(second_buf, first_buf) -- sanity check + local second_buf = meths.call_function('bufnr', { '%' }) + neq(second_buf, first_buf) -- sanity check if start_from_first then switch_to_buf(first_buf) @@ -1103,8 +1167,10 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() end it('rejects negative bufnr values', function() - eq('Wrong type for argument 1 when calling nvim_buf_set_keymap, expecting Buffer', - pcall_err(bufmeths.set_keymap, -1, '', 'lhs', 'rhs', {})) + eq( + 'Wrong type for argument 1 when calling nvim_buf_set_keymap, expecting Buffer', + pcall_err(bufmeths.set_keymap, -1, '', 'lhs', 'rhs', {}) + ) end) it('can set mappings active in the current buffer but not others', function() @@ -1112,17 +1178,17 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() bufmeths.set_keymap(0, '', 'lhs', 'irhs<Esc>', {}) command('normal lhs') - eq({'rhs'}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1)) -- mapping should have no effect in new buffer switch_to_buf(second) command('normal lhs') - eq({''}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ '' }, bufmeths.get_lines(0, 0, 1, 1)) -- mapping should remain active in old buffer switch_to_buf(first) command('normal ^lhs') - eq({'rhsrhs'}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ 'rhsrhs' }, bufmeths.get_lines(0, 0, 1, 1)) end) it('can set local mappings in buffer other than current', function() @@ -1131,12 +1197,12 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() -- shouldn't do anything command('normal lhs') - eq({''}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ '' }, bufmeths.get_lines(0, 0, 1, 1)) -- should take effect switch_to_buf(first) command('normal lhs') - eq({'rhs'}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1)) end) it('can disable mappings made in another buffer, inside that buffer', function() @@ -1147,36 +1213,38 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() -- shouldn't do anything command('normal lhs') - eq({''}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ '' }, bufmeths.get_lines(0, 0, 1, 1)) end) it("can't disable mappings given wrong buffer handle", function() local first, second = make_two_buffers(false) bufmeths.set_keymap(first, '', 'lhs', 'irhs<Esc>', {}) - eq('E31: No such mapping', - pcall_err(bufmeths.del_keymap, second, '', 'lhs')) + eq('E31: No such mapping', pcall_err(bufmeths.del_keymap, second, '', 'lhs')) -- should still work switch_to_buf(first) command('normal lhs') - eq({'rhs'}, bufmeths.get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1)) end) - it("does not crash when setting mapping in a non-existing buffer #13541", function() + it('does not crash when setting mapping in a non-existing buffer #13541', function() pcall_err(bufmeths.set_keymap, 100, '', 'lsh', 'irhs<Esc>', {}) helpers.assert_alive() end) it('can make lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_buf_set_keymap(0, 'n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) end) it('can make lua expr mappings replacing keycodes', function() @@ -1186,7 +1254,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('aa') - eq({'π<M-π>foo<'}, meths.buf_get_lines(0, 0, -1, false)) + eq({ 'π<M-π>foo<' }, meths.buf_get_lines(0, 0, -1, false)) end) it('can make lua expr mappings without replacing keycodes', function() @@ -1196,20 +1264,22 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('iaa<esc>') - eq({'<space>'}, meths.buf_get_lines(0, 0, -1, false)) + eq({ '<space>' }, meths.buf_get_lines(0, 0, -1, false)) end) - it('can overwrite lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_buf_set_keymap(0, 'n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_buf_set_keymap(0, 'n', 'asdf', '', {callback = function() GlobalCount = GlobalCount - 1 end }) @@ -1217,19 +1287,22 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('asdf\n') - eq(0, exec_lua[[return GlobalCount]]) + eq(0, exec_lua [[return GlobalCount]]) end) it('can unmap lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_buf_set_keymap(0, 'n', 'asdf', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_buf_del_keymap(0, 'n', 'asdf' ) @@ -1237,20 +1310,23 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('asdf\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) eq('\nNo mapping found', helpers.exec_capture('nmap asdf')) end) it('no double-free when unmapping simplifiable lua mappings', function() - eq(0, exec_lua [[ + eq( + 0, + exec_lua [[ GlobalCount = 0 vim.api.nvim_buf_set_keymap(0, 'n', '<C-I>', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('<C-I>\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_buf_del_keymap(0, 'n', '<C-I>') @@ -1258,7 +1334,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('<C-I>\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) eq('\nNo mapping found', helpers.exec_capture('nmap <C-I>')) end) end) diff --git a/test/functional/api/menu_spec.lua b/test/functional/api/menu_spec.lua index 34a92477f3..44b9039393 100644 --- a/test/functional/api/menu_spec.lua +++ b/test/functional/api/menu_spec.lua @@ -5,8 +5,7 @@ local clear = helpers.clear local command = helpers.command local feed = helpers.feed -describe("update_menu notification", function() - +describe('update_menu notification', function() local screen before_each(function() @@ -16,23 +15,26 @@ describe("update_menu notification", function() end) local function expect_sent(expected) - screen:expect{condition=function() - if screen.update_menu ~= expected then - if expected then - error('update_menu was expected but not sent') - else - error('update_menu was sent unexpectedly') + screen:expect { + condition = function() + if screen.update_menu ~= expected then + if expected then + error('update_menu was expected but not sent') + else + error('update_menu was sent unexpectedly') + end end - end - end, unchanged=(not expected)} + end, + unchanged = not expected, + } end - it("should be sent when adding a menu", function() + it('should be sent when adding a menu', function() command('menu Test.Test :') expect_sent(true) end) - it("should be sent when deleting a menu", function() + it('should be sent when deleting a menu', function() command('menu Test.Test :') screen.update_menu = false @@ -40,9 +42,8 @@ describe("update_menu notification", function() expect_sent(true) end) - it("should not be sent unnecessarily", function() + it('should not be sent unnecessarily', function() feed('i12345<ESC>:redraw<CR>') expect_sent(false) end) - end) diff --git a/test/functional/api/proc_spec.lua b/test/functional/api/proc_spec.lua index 20edea3feb..4f99a69ce6 100644 --- a/test/functional/api/proc_spec.lua +++ b/test/functional/api/proc_spec.lua @@ -43,16 +43,16 @@ describe('API', function() end) it('validation', function() - local status, rv = pcall(request, "nvim_get_proc_children", -1) + local status, rv = pcall(request, 'nvim_get_proc_children', -1) eq(false, status) - eq("Invalid 'pid': -1", string.match(rv, "Invalid.*")) + eq("Invalid 'pid': -1", string.match(rv, 'Invalid.*')) - status, rv = pcall(request, "nvim_get_proc_children", 0) + status, rv = pcall(request, 'nvim_get_proc_children', 0) eq(false, status) - eq("Invalid 'pid': 0", string.match(rv, "Invalid.*")) + eq("Invalid 'pid': 0", string.match(rv, 'Invalid.*')) -- Assume PID 99999 does not exist. - status, rv = pcall(request, "nvim_get_proc_children", 99999) + status, rv = pcall(request, 'nvim_get_proc_children', 99999) eq(true, status) eq({}, rv) end) @@ -69,16 +69,16 @@ describe('API', function() end) it('validation', function() - local status, rv = pcall(request, "nvim_get_proc", -1) + local status, rv = pcall(request, 'nvim_get_proc', -1) eq(false, status) - eq("Invalid 'pid': -1", string.match(rv, "Invalid.*")) + eq("Invalid 'pid': -1", string.match(rv, 'Invalid.*')) - status, rv = pcall(request, "nvim_get_proc", 0) + status, rv = pcall(request, 'nvim_get_proc', 0) eq(false, status) - eq("Invalid 'pid': 0", string.match(rv, "Invalid.*")) + eq("Invalid 'pid': 0", string.match(rv, 'Invalid.*')) -- Assume PID 99999 does not exist. - status, rv = pcall(request, "nvim_get_proc", 99999) + status, rv = pcall(request, 'nvim_get_proc', 99999) eq(true, status) eq(NIL, rv) end) diff --git a/test/functional/api/rpc_fixture.lua b/test/functional/api/rpc_fixture.lua index c860a6da59..050d439a1b 100644 --- a/test/functional/api/rpc_fixture.lua +++ b/test/functional/api/rpc_fixture.lua @@ -4,8 +4,8 @@ package.path = arg[1] package.cpath = arg[2] -local StdioStream = require'test.client.uv_stream'.StdioStream -local Session = require'test.client.session' +local StdioStream = require 'test.client.uv_stream'.StdioStream +local Session = require 'test.client.session' local stdio_stream = StdioStream.open() local session = Session.new(stdio_stream) @@ -15,8 +15,8 @@ local function on_request(method, args) return 'ok' elseif method == 'write_stderr' then io.stderr:write(args[1]) - return "done!" - elseif method == "exit" then + return 'done!' + elseif method == 'exit' then session:stop() return vim.NIL end @@ -24,7 +24,7 @@ end local function on_notification(event, args) if event == 'ping' and #args == 0 then - session:notify("nvim_eval", "rpcnotify(g:channel, 'pong')") + session:notify('nvim_eval', "rpcnotify(g:channel, 'pong')") end end diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua index bc43f6564d..d75bfd5324 100644 --- a/test/functional/api/server_notifications_spec.lua +++ b/test/functional/api/server_notifications_spec.lua @@ -1,8 +1,7 @@ local helpers = require('test.functional.helpers')(after_each) local assert_log = helpers.assert_log local eq, clear, eval, command, nvim, next_msg = - helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.nvim, - helpers.next_msg + helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.nvim, helpers.next_msg local meths = helpers.meths local exec_lua = helpers.exec_lua local retry = helpers.retry @@ -24,11 +23,11 @@ describe('notify', function() describe('passing a valid channel id', function() it('sends the notification/args to the corresponding channel', function() - eval('rpcnotify('..channel..', "test-event", 1, 2, 3)') - eq({'notification', 'test-event', {1, 2, 3}}, next_msg()) - command('au FileType lua call rpcnotify('..channel..', "lua!")') + eval('rpcnotify(' .. channel .. ', "test-event", 1, 2, 3)') + eq({ 'notification', 'test-event', { 1, 2, 3 } }, next_msg()) + command('au FileType lua call rpcnotify(' .. channel .. ', "lua!")') command('set filetype=lua') - eq({'notification', 'lua!', {}}, next_msg()) + eq({ 'notification', 'lua!', {} }, next_msg()) end) end) @@ -38,20 +37,20 @@ describe('notify', function() eval('rpcnotify(0, "event1", 1, 2, 3)') eval('rpcnotify(0, "event2", 4, 5, 6)') eval('rpcnotify(0, "event2", 7, 8, 9)') - eq({'notification', 'event2', {4, 5, 6}}, next_msg()) - eq({'notification', 'event2', {7, 8, 9}}, next_msg()) + eq({ 'notification', 'event2', { 4, 5, 6 } }, next_msg()) + eq({ 'notification', 'event2', { 7, 8, 9 } }, next_msg()) nvim('unsubscribe', 'event2') nvim('subscribe', 'event1') eval('rpcnotify(0, "event2", 10, 11, 12)') eval('rpcnotify(0, "event1", 13, 14, 15)') - eq({'notification', 'event1', {13, 14, 15}}, next_msg()) + eq({ 'notification', 'event1', { 13, 14, 15 } }, next_msg()) end) it('does not crash for deeply nested variable', function() meths.set_var('l', {}) local nest_level = 1000 meths.command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1)) - eval('rpcnotify('..channel..', "event", g:l)') + eval('rpcnotify(' .. channel .. ', "event", g:l)') local msg = next_msg() eq('notification', msg[1]) eq('event', msg[2]) @@ -77,9 +76,9 @@ describe('notify', function() end) it('unsubscribe non-existing event #8745', function() - clear{env={ - NVIM_LOG_FILE=testlog, - }} + clear { env = { + NVIM_LOG_FILE = testlog, + } } nvim('subscribe', 'event1') nvim('unsubscribe', 'doesnotexist') assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10) @@ -90,14 +89,24 @@ describe('notify', function() it('cancels stale events on channel close', function() local catchan = eval("jobstart(['cat'], {'rpc': v:true})") local catpath = eval('exepath("cat")') - eq({id=catchan, argv={catpath}, stream='job', mode='rpc', client = {}}, exec_lua ([[ + eq( + { id = catchan, argv = { catpath }, stream = 'job', mode = 'rpc', client = {} }, + exec_lua( + [[ vim.rpcnotify(..., "nvim_call_function", 'chanclose', {..., 'rpc'}) vim.rpcnotify(..., "nvim_subscribe", "daily_rant") return vim.api.nvim_get_chan_info(...) - ]], catchan)) + ]], + catchan + ) + ) assert_alive() - eq({false, 'Invalid channel: '..catchan}, - exec_lua ([[ return {pcall(vim.rpcrequest, ..., 'nvim_eval', '1+1')}]], catchan)) - retry(nil, 3000, function() eq({}, meths.get_chan_info(catchan)) end) -- cat be dead :( + eq( + { false, 'Invalid channel: ' .. catchan }, + exec_lua([[ return {pcall(vim.rpcrequest, ..., 'nvim_eval', '1+1')}]], catchan) + ) + retry(nil, 3000, function() + eq({}, meths.get_chan_info(catchan)) + end) -- cat be dead :( end) end) diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua index 1ad4ad3a02..421e0b5c9a 100644 --- a/test/functional/api/server_requests_spec.lua +++ b/test/functional/api/server_requests_spec.lua @@ -40,13 +40,13 @@ describe('server -> client', function() describe('simple call', function() it('works', function() local function on_setup() - eq({4, 5, 6}, eval('rpcrequest('..cid..', "scall", 1, 2, 3)')) + eq({ 4, 5, 6 }, eval('rpcrequest(' .. cid .. ', "scall", 1, 2, 3)')) stop() end local function on_request(method, args) eq('scall', method) - eq({1, 2, 3}, args) + eq({ 1, 2, 3 }, args) nvim('command', 'let g:result = [4, 5, 6]') return eval('g:result') end @@ -61,14 +61,14 @@ describe('server -> client', function() -- elements following the empty string. it('works', function() local function on_setup() - eq({1, 2, '', 3, 'asdf'}, eval('rpcrequest('..cid..', "nstring")')) + eq({ 1, 2, '', 3, 'asdf' }, eval('rpcrequest(' .. cid .. ', "nstring")')) stop() end local function on_request() -- No need to evaluate the args, we are only interested in -- a response that contains an array with an empty string. - return {1, 2, '', 3, 'asdf'} + return { 1, 2, '', 3, 'asdf' } end run(on_request, nil, on_setup) end) @@ -81,7 +81,7 @@ describe('server -> client', function() nvim('set_var', 'result2', 0) nvim('set_var', 'result3', 0) nvim('set_var', 'result4', 0) - nvim('command', 'let g:result1 = rpcrequest('..cid..', "rcall", 2)') + nvim('command', 'let g:result1 = rpcrequest(' .. cid .. ', "rcall", 2)') eq(4, nvim('get_var', 'result1')) eq(8, nvim('get_var', 'result2')) eq(16, nvim('get_var', 'result3')) @@ -95,11 +95,11 @@ describe('server -> client', function() if n <= 16 then local cmd if n == 4 then - cmd = 'let g:result2 = rpcrequest('..cid..', "rcall", '..n..')' + cmd = 'let g:result2 = rpcrequest(' .. cid .. ', "rcall", ' .. n .. ')' elseif n == 8 then - cmd = 'let g:result3 = rpcrequest('..cid..', "rcall", '..n..')' + cmd = 'let g:result3 = rpcrequest(' .. cid .. ', "rcall", ' .. n .. ')' elseif n == 16 then - cmd = 'let g:result4 = rpcrequest('..cid..', "rcall", '..n..')' + cmd = 'let g:result4 = rpcrequest(' .. cid .. ', "rcall", ' .. n .. ')' end nvim('command', cmd) end @@ -113,18 +113,18 @@ describe('server -> client', function() it('does not delay notifications during pending request', function() local received = false local function on_setup() - eq("retval", funcs.rpcrequest(cid, "doit")) + eq('retval', funcs.rpcrequest(cid, 'doit')) stop() end local function on_request(method) - if method == "doit" then - funcs.rpcnotify(cid, "headsup") - eq(true,received) - return "retval" + if method == 'doit' then + funcs.rpcnotify(cid, 'headsup') + eq(true, received) + return 'retval' end end local function on_notification(method) - if method == "headsup" then + if method == 'headsup' then received = true end end @@ -148,28 +148,28 @@ describe('server -> client', function() -- of nvim's request stack). pending('will close connection if not properly synchronized', function() local function on_setup() - eq('notified!', eval('rpcrequest('..cid..', "notify")')) + eq('notified!', eval('rpcrequest(' .. cid .. ', "notify")')) end local function on_request(method) - if method == "notify" then - eq(1, eval('rpcnotify('..cid..', "notification")')) + if method == 'notify' then + eq(1, eval('rpcnotify(' .. cid .. ', "notification")')) return 'notified!' - elseif method == "nested" then + elseif method == 'nested' then -- do some busywork, so the first request will return -- before this one for _ = 1, 5 do assert_alive() end - eq(1, eval('rpcnotify('..cid..', "nested_done")')) + eq(1, eval('rpcnotify(' .. cid .. ', "nested_done")')) return 'done!' end end local function on_notification(method) - if method == "notification" then - eq('done!', eval('rpcrequest('..cid..', "nested")')) - elseif method == "nested_done" then + if method == 'notification' then + eq('done!', eval('rpcrequest(' .. cid .. ', "nested")')) + elseif method == 'nested_done' then ok(false, 'never sent', 'sent') end end @@ -182,11 +182,17 @@ describe('server -> client', function() describe('recursive (child) nvim client', function() before_each(function() - command("let vim = rpcstart('"..nvim_prog.."', ['-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--embed', '--headless'])") + command( + "let vim = rpcstart('" + .. nvim_prog + .. "', ['-u', 'NONE', '-i', 'NONE', '--cmd', 'set noswapfile', '--embed', '--headless'])" + ) neq(0, eval('vim')) end) - after_each(function() command('call rpcstop(vim)') end) + after_each(function() + command('call rpcstop(vim)') + end) it('can send/receive notifications and make requests', function() nvim('command', "call rpcnotify(vim, 'vim_set_current_line', 'SOME TEXT')") @@ -198,25 +204,27 @@ describe('server -> client', function() end) it('can communicate buffers, tabpages, and windows', function() - eq({1}, eval("rpcrequest(vim, 'nvim_list_tabpages')")) + eq({ 1 }, eval("rpcrequest(vim, 'nvim_list_tabpages')")) -- Window IDs start at 1000 (LOWEST_WIN_ID in window.h) - eq({1000}, eval("rpcrequest(vim, 'nvim_list_wins')")) + eq({ 1000 }, eval("rpcrequest(vim, 'nvim_list_wins')")) local buf = eval("rpcrequest(vim, 'nvim_list_bufs')")[1] eq(1, buf) - eval("rpcnotify(vim, 'buffer_set_line', "..buf..", 0, 'SOME TEXT')") - nvim('command', "call rpcrequest(vim, 'vim_eval', '0')") -- wait + eval("rpcnotify(vim, 'buffer_set_line', " .. buf .. ", 0, 'SOME TEXT')") + nvim('command', "call rpcrequest(vim, 'vim_eval', '0')") -- wait - eq('SOME TEXT', eval("rpcrequest(vim, 'buffer_get_line', "..buf..", 0)")) + eq('SOME TEXT', eval("rpcrequest(vim, 'buffer_get_line', " .. buf .. ', 0)')) -- Call get_lines(buf, range [0,0], strict_indexing) - eq({'SOME TEXT'}, eval("rpcrequest(vim, 'buffer_get_lines', "..buf..", 0, 1, 1)")) + eq({ 'SOME TEXT' }, eval("rpcrequest(vim, 'buffer_get_lines', " .. buf .. ', 0, 1, 1)')) end) it('returns an error if the request failed', function() - eq("Vim:Error invoking 'does-not-exist' on channel 3:\nInvalid method: does-not-exist", - pcall_err(eval, "rpcrequest(vim, 'does-not-exist')")) + eq( + "Vim:Error invoking 'does-not-exist' on channel 3:\nInvalid method: does-not-exist", + pcall_err(eval, "rpcrequest(vim, 'does-not-exist')") + ) end) end) @@ -236,13 +244,14 @@ describe('server -> client', function() \ 'rpc': v:true \ } ]]) - meths.set_var("args", { - nvim_prog, '-ll', + meths.set_var('args', { + nvim_prog, + '-ll', 'test/functional/api/rpc_fixture.lua', package.path, package.cpath, }) - jobid = eval("jobstart(g:args, g:job_opts)") + jobid = eval('jobstart(g:args, g:job_opts)') neq(0, jobid) end) @@ -250,7 +259,9 @@ describe('server -> client', function() pcall(funcs.jobstop, jobid) end) - if helpers.skip(helpers.is_os('win')) then return end + if helpers.skip(helpers.is_os('win')) then + return + end it('rpc and text stderr can be combined', function() local status, rv = pcall(funcs.rpcrequest, jobid, 'poll') @@ -258,18 +269,18 @@ describe('server -> client', function() error(string.format('missing nvim Lua module? (%s)', rv)) end eq('ok', rv) - funcs.rpcnotify(jobid, "ping") - eq({'notification', 'pong', {}}, next_msg()) - eq("done!",funcs.rpcrequest(jobid, "write_stderr", "fluff\n")) - eq({'notification', 'stderr', {0, {'fluff', ''}}}, next_msg()) - pcall(funcs.rpcrequest, jobid, "exit") - eq({'notification', 'stderr', {0, {''}}}, next_msg()) - eq({'notification', 'exit', {0, 0}}, next_msg()) + funcs.rpcnotify(jobid, 'ping') + eq({ 'notification', 'pong', {} }, next_msg()) + eq('done!', funcs.rpcrequest(jobid, 'write_stderr', 'fluff\n')) + eq({ 'notification', 'stderr', { 0, { 'fluff', '' } } }, next_msg()) + pcall(funcs.rpcrequest, jobid, 'exit') + eq({ 'notification', 'stderr', { 0, { '' } } }, next_msg()) + eq({ 'notification', 'exit', { 0, 0 } }, next_msg()) end) end) describe('connecting to another (peer) nvim', function() - local nvim_argv = merge_args(helpers.nvim_argv, {'--headless'}) + local nvim_argv = merge_args(helpers.nvim_argv, { '--headless' }) local function connect_test(server, mode, address) local serverpid = funcs.getpid() local client = spawn(nvim_argv, false, nil, true) @@ -277,7 +288,7 @@ describe('server -> client', function() local clientpid = funcs.getpid() neq(serverpid, clientpid) - local id = funcs.sockconnect(mode, address, {rpc=true}) + local id = funcs.sockconnect(mode, address, { rpc = true }) ok(id > 0) funcs.rpcrequest(id, 'nvim_set_current_line', 'hello') @@ -303,7 +314,7 @@ describe('server -> client', function() local server = spawn(nvim_argv) set_session(server) local address = funcs.serverlist()[1] - local first = string.sub(address,1,1) + local first = string.sub(address, 1, 1) ok(first == '/' or first == '\\') connect_test(server, 'pipe', address) end) @@ -311,11 +322,11 @@ describe('server -> client', function() it('via ipv4 address', function() local server = spawn(nvim_argv) set_session(server) - local status, address = pcall(funcs.serverstart, "127.0.0.1:") + local status, address = pcall(funcs.serverstart, '127.0.0.1:') if not status then pending('no ipv4 stack') end - eq('127.0.0.1:', string.sub(address,1,10)) + eq('127.0.0.1:', string.sub(address, 1, 10)) connect_test(server, 'tcp', address) end) @@ -326,15 +337,15 @@ describe('server -> client', function() if not status then pending('no ipv6 stack') end - eq('::1:', string.sub(address,1,4)) + eq('::1:', string.sub(address, 1, 4)) connect_test(server, 'tcp', address) end) it('via hostname', function() local server = spawn(nvim_argv) set_session(server) - local address = funcs.serverstart("localhost:") - eq('localhost:', string.sub(address,1,10)) + local address = funcs.serverstart('localhost:') + eq('localhost:', string.sub(address, 1, 10)) connect_test(server, 'tcp', address) end) @@ -345,7 +356,7 @@ describe('server -> client', function() local client = spawn(nvim_argv, false, nil, true) set_session(client) - local id = funcs.sockconnect('pipe', address, {rpc=true}) + local id = funcs.sockconnect('pipe', address, { rpc = true }) funcs.rpcrequest(id, 'nvim_ui_attach', 80, 24, {}) assert_alive() @@ -357,15 +368,15 @@ describe('server -> client', function() describe('connecting to its own pipe address', function() it('does not deadlock', function() local address = funcs.serverlist()[1] - local first = string.sub(address,1,1) + local first = string.sub(address, 1, 1) ok(first == '/' or first == '\\') local serverpid = funcs.getpid() - local id = funcs.sockconnect('pipe', address, {rpc=true}) + local id = funcs.sockconnect('pipe', address, { rpc = true }) funcs.rpcrequest(id, 'nvim_set_current_line', 'hello') eq('hello', meths.get_current_line()) - eq(serverpid, funcs.rpcrequest(id, "nvim_eval", "getpid()")) + eq(serverpid, funcs.rpcrequest(id, 'nvim_eval', 'getpid()')) eq(id, funcs.rpcrequest(id, 'nvim_get_api_info')[1]) end) diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua index 20b3163d95..d6fc041e83 100644 --- a/test/functional/api/tabpage_spec.lua +++ b/test/functional/api/tabpage_spec.lua @@ -1,7 +1,6 @@ local helpers = require('test.functional.helpers')(after_each) local clear, nvim, tabpage, curtab, eq, ok = - helpers.clear, helpers.nvim, helpers.tabpage, helpers.curtab, helpers.eq, - helpers.ok + helpers.clear, helpers.nvim, helpers.tabpage, helpers.curtab, helpers.eq, helpers.ok local curtabmeths = helpers.curtabmeths local funcs = helpers.funcs local request = helpers.request @@ -18,8 +17,8 @@ describe('api/tabpage', function() nvim('command', 'vsplit') local tab1, tab2 = unpack(nvim('list_tabpages')) local win1, win2, win3 = unpack(nvim('list_wins')) - eq({win1}, tabpage('list_wins', tab1)) - eq({win2, win3}, tabpage('list_wins', tab2)) + eq({ win1 }, tabpage('list_wins', tab1)) + eq({ win2, win3 }, tabpage('list_wins', tab2)) eq(win2, tabpage('get_win', tab2)) nvim('set_current_win', win3) eq(win3, tabpage('get_win', tab2)) @@ -32,9 +31,9 @@ describe('api/tabpage', function() describe('{get,set,del}_var', function() it('works', function() - curtab('set_var', 'lua', {1, 2, {['3'] = 1}}) - eq({1, 2, {['3'] = 1}}, curtab('get_var', 'lua')) - eq({1, 2, {['3'] = 1}}, nvim('eval', 't:lua')) + curtab('set_var', 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, curtab('get_var', 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, nvim('eval', 't:lua')) eq(1, funcs.exists('t:lua')) curtabmeths.del_var('lua') eq(0, funcs.exists('t:lua')) @@ -46,16 +45,16 @@ describe('api/tabpage', function() end) it('tabpage_set_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } eq(NIL, request('tabpage_set_var', 0, 'lua', val1)) eq(val1, request('tabpage_set_var', 0, 'lua', val2)) end) it('tabpage_del_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} - eq(NIL, request('tabpage_set_var', 0, 'lua', val1)) + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } + eq(NIL, request('tabpage_set_var', 0, 'lua', val1)) eq(val1, request('tabpage_set_var', 0, 'lua', val2)) eq(val2, request('tabpage_del_var', 0, 'lua')) end) diff --git a/test/functional/api/ui_spec.lua b/test/functional/api/ui_spec.lua index 6efb6726fe..dafbbe550f 100644 --- a/test/functional/api/ui_spec.lua +++ b/test/functional/api/ui_spec.lua @@ -23,42 +23,56 @@ describe('nvim_ui_attach()', function() end) it('validation', function() - eq('No such UI option: foo', - pcall_err(meths.ui_attach, 80, 24, { foo={'foo'} })) + eq('No such UI option: foo', pcall_err(meths.ui_attach, 80, 24, { foo = { 'foo' } })) - eq("Invalid 'ext_linegrid': expected Boolean, got Array", - pcall_err(meths.ui_attach, 80, 24, { ext_linegrid={} })) - eq("Invalid 'override': expected Boolean, got Array", - pcall_err(meths.ui_attach, 80, 24, { override={} })) - eq("Invalid 'rgb': expected Boolean, got Array", - pcall_err(meths.ui_attach, 80, 24, { rgb={} })) - eq("Invalid 'term_name': expected String, got Boolean", - pcall_err(meths.ui_attach, 80, 24, { term_name=true })) - eq("Invalid 'term_colors': expected Integer, got Boolean", - pcall_err(meths.ui_attach, 80, 24, { term_colors=true })) - eq("Invalid 'stdin_fd': expected Integer, got String", - pcall_err(meths.ui_attach, 80, 24, { stdin_fd='foo' })) - eq("Invalid 'stdin_tty': expected Boolean, got String", - pcall_err(meths.ui_attach, 80, 24, { stdin_tty='foo' })) - eq("Invalid 'stdout_tty': expected Boolean, got String", - pcall_err(meths.ui_attach, 80, 24, { stdout_tty='foo' })) + eq( + "Invalid 'ext_linegrid': expected Boolean, got Array", + pcall_err(meths.ui_attach, 80, 24, { ext_linegrid = {} }) + ) + eq( + "Invalid 'override': expected Boolean, got Array", + pcall_err(meths.ui_attach, 80, 24, { override = {} }) + ) + eq( + "Invalid 'rgb': expected Boolean, got Array", + pcall_err(meths.ui_attach, 80, 24, { rgb = {} }) + ) + eq( + "Invalid 'term_name': expected String, got Boolean", + pcall_err(meths.ui_attach, 80, 24, { term_name = true }) + ) + eq( + "Invalid 'term_colors': expected Integer, got Boolean", + pcall_err(meths.ui_attach, 80, 24, { term_colors = true }) + ) + eq( + "Invalid 'stdin_fd': expected Integer, got String", + pcall_err(meths.ui_attach, 80, 24, { stdin_fd = 'foo' }) + ) + eq( + "Invalid 'stdin_tty': expected Boolean, got String", + pcall_err(meths.ui_attach, 80, 24, { stdin_tty = 'foo' }) + ) + eq( + "Invalid 'stdout_tty': expected Boolean, got String", + pcall_err(meths.ui_attach, 80, 24, { stdout_tty = 'foo' }) + ) - eq('UI not attached to channel: 1', - pcall_err(request, 'nvim_ui_try_resize', 40, 10)) - eq('UI not attached to channel: 1', - pcall_err(request, 'nvim_ui_set_option', 'rgb', true)) - eq('UI not attached to channel: 1', - pcall_err(request, 'nvim_ui_detach')) + eq('UI not attached to channel: 1', pcall_err(request, 'nvim_ui_try_resize', 40, 10)) + eq('UI not attached to channel: 1', pcall_err(request, 'nvim_ui_set_option', 'rgb', true)) + eq('UI not attached to channel: 1', pcall_err(request, 'nvim_ui_detach')) local screen = Screen.new() - screen:attach({rgb=false}) - eq('UI already attached to channel: 1', - pcall_err(request, 'nvim_ui_attach', 40, 10, { rgb=false })) + screen:attach({ rgb = false }) + eq( + 'UI already attached to channel: 1', + pcall_err(request, 'nvim_ui_attach', 40, 10, { rgb = false }) + ) end) end) it('autocmds UIEnter/UILeave', function() - clear{args_rm={'--headless'}} + clear { args_rm = { '--headless' } } exec([[ let g:evs = [] autocmd UIEnter * call add(g:evs, "UIEnter") | let g:uienter_ev = deepcopy(v:event) @@ -67,9 +81,9 @@ it('autocmds UIEnter/UILeave', function() ]]) local screen = Screen.new() screen:attach() - eq({chan=1}, eval('g:uienter_ev')) + eq({ chan = 1 }, eval('g:uienter_ev')) screen:detach() - eq({chan=1}, eval('g:uileave_ev')) + eq({ chan = 1 }, eval('g:uileave_ev')) eq({ 'VimEnter', 'UIEnter', @@ -89,21 +103,27 @@ it('autocmds VimSuspend/VimResume #22041', function() eq(false, screen.suspended) feed('<C-Z>') - screen:expect(function() eq(true, screen.suspended) end) + screen:expect(function() + eq(true, screen.suspended) + end) eq({ 's' }, eval('g:ev')) screen.suspended = false feed('<Ignore>') eq({ 's', 'r' }, eval('g:ev')) command('suspend') - screen:expect(function() eq(true, screen.suspended) end) + screen:expect(function() + eq(true, screen.suspended) + end) eq({ 's', 'r', 's' }, eval('g:ev')) screen.suspended = false meths.input_mouse('move', '', '', 0, 0, 0) eq({ 's', 'r', 's', 'r' }, eval('g:ev')) feed('<C-Z><C-Z><C-Z>') - screen:expect(function() eq(true, screen.suspended) end) + screen:expect(function() + eq(true, screen.suspended) + end) meths.ui_set_focus(false) eq({ 's', 'r', 's', 'r', 's' }, eval('g:ev')) screen.suspended = false @@ -111,7 +131,9 @@ it('autocmds VimSuspend/VimResume #22041', function() eq({ 's', 'r', 's', 'r', 's', 'r' }, eval('g:ev')) command('suspend | suspend | suspend') - screen:expect(function() eq(true, screen.suspended) end) + screen:expect(function() + eq(true, screen.suspended) + end) screen:detach() eq({ 's', 'r', 's', 'r', 's', 'r', 's' }, eval('g:ev')) screen.suspended = false diff --git a/test/functional/api/version_spec.lua b/test/functional/api/version_spec.lua index 6d466b0cc1..76cdb9cbca 100644 --- a/test/functional/api/version_spec.lua +++ b/test/functional/api/version_spec.lua @@ -19,41 +19,40 @@ end describe("api_info()['version']", function() before_each(clear) - it("returns API level", function() + it('returns API level', function() local version = call('api_info')['version'] local current = version['api_level'] - local compat = version['api_compatible'] - eq("number", type(current)) - eq("number", type(compat)) + local compat = version['api_compatible'] + eq('number', type(current)) + eq('number', type(compat)) assert(current >= compat) end) - it("returns Nvim version", function() + it('returns Nvim version', function() local version = call('api_info')['version'] - local major = version['major'] - local minor = version['minor'] - local patch = version['patch'] + local major = version['major'] + local minor = version['minor'] + local patch = version['patch'] local prerelease = version['prerelease'] - local build = version['build'] - eq("number", type(major)) - eq("number", type(minor)) - eq("number", type(patch)) - eq("boolean", type(prerelease)) - eq(1, funcs.has("nvim-"..major.."."..minor.."."..patch)) - eq(0, funcs.has("nvim-"..major.."."..minor.."."..(patch + 1))) - eq(0, funcs.has("nvim-"..major.."."..(minor + 1).."."..patch)) - eq(0, funcs.has("nvim-"..(major + 1).."."..minor.."."..patch)) + local build = version['build'] + eq('number', type(major)) + eq('number', type(minor)) + eq('number', type(patch)) + eq('boolean', type(prerelease)) + eq(1, funcs.has('nvim-' .. major .. '.' .. minor .. '.' .. patch)) + eq(0, funcs.has('nvim-' .. major .. '.' .. minor .. '.' .. (patch + 1))) + eq(0, funcs.has('nvim-' .. major .. '.' .. (minor + 1) .. '.' .. patch)) + eq(0, funcs.has('nvim-' .. (major + 1) .. '.' .. minor .. '.' .. patch)) assert(build == nil or type(build) == 'string') end) end) - -describe("api metadata", function() +describe('api metadata', function() before_each(clear) local function name_table(entries) local by_name = {} - for _,e in ipairs(entries) do + for _, e in ipairs(entries) do by_name[e.name] = e end return by_name @@ -63,10 +62,10 @@ describe("api metadata", function() local function filter_function_metadata(f) f.deprecated_since = nil for idx, _ in ipairs(f.parameters) do - f.parameters[idx][2] = '' -- Remove parameter name. + f.parameters[idx][2] = '' -- Remove parameter name. end - if string.sub(f.name, 1, 4) ~= "nvim" then + if string.sub(f.name, 1, 4) ~= 'nvim' then f.method = nil end return f @@ -76,7 +75,7 @@ describe("api metadata", function() -- check types of existing params are the same -- adding parameters is ok, but removing params is not (gives nil error) eq(old_e.since, new_e.since, old_e.name) - for i,p in ipairs(old_e.parameters) do + for i, p in ipairs(old_e.parameters) do eq(new_e.parameters[i][1], p[1], old_e.name) end end @@ -95,25 +94,27 @@ describe("api metadata", function() local api, compat, stable, api_level local old_api = {} setup(function() - clear() -- Ensure a session before requesting api_info. + clear() -- Ensure a session before requesting api_info. api = meths.get_api_info()[2] - compat = api.version.api_compatible + compat = api.version.api_compatible api_level = api.version.api_level if api.version.api_prerelease then - stable = api_level-1 + stable = api_level - 1 else stable = api_level end for level = compat, stable do - local path = ('test/functional/fixtures/api_level_'.. - tostring(level)..'.mpack') + local path = ('test/functional/fixtures/api_level_' .. tostring(level) .. '.mpack') old_api[level] = read_mpack_file(path) if old_api[level] == nil then - local errstr = "missing metadata fixture for stable level "..level..". " + local errstr = 'missing metadata fixture for stable level ' .. level .. '. ' if level == api_level and not api.version.api_prerelease then - errstr = (errstr.."If NVIM_API_CURRENT was bumped, ".. - "don't forget to set NVIM_API_PRERELEASE to true.") + errstr = ( + errstr + .. 'If NVIM_API_CURRENT was bumped, ' + .. "don't forget to set NVIM_API_PRERELEASE to true." + ) end error(errstr) end @@ -124,60 +125,76 @@ describe("api metadata", function() end end) - it("functions are compatible with old metadata or have new level", function() + it('functions are compatible with old metadata or have new level', function() local funcs_new = name_table(api.functions) local funcs_compat = {} for level = compat, stable do - for _,f in ipairs(old_api[level].functions) do + for _, f in ipairs(old_api[level].functions) do if funcs_new[f.name] == nil then if f.since >= compat then - error('function '..f.name..' was removed but exists in level '.. - f.since..' which nvim should be compatible with') + error( + 'function ' + .. f.name + .. ' was removed but exists in level ' + .. f.since + .. ' which nvim should be compatible with' + ) end else - eq(filter_function_metadata(f), - filter_function_metadata(funcs_new[f.name])) + eq(filter_function_metadata(f), filter_function_metadata(funcs_new[f.name])) end end funcs_compat[level] = name_table(old_api[level].functions) end - for _,f in ipairs(api.functions) do + for _, f in ipairs(api.functions) do if f.since <= stable then local f_old = funcs_compat[f.since][f.name] if f_old == nil then - if string.sub(f.name, 1, 4) == "nvim" then - local errstr = ("function "..f.name.." has too low since value. ".. - "For new functions set it to "..(stable+1)..".") + if string.sub(f.name, 1, 4) == 'nvim' then + local errstr = ( + 'function ' + .. f.name + .. ' has too low since value. ' + .. 'For new functions set it to ' + .. (stable + 1) + .. '.' + ) if not api.version.api_prerelease then - errstr = (errstr.." Also bump NVIM_API_CURRENT and set ".. - "NVIM_API_PRERELEASE to true in CMakeLists.txt.") + errstr = ( + errstr + .. ' Also bump NVIM_API_CURRENT and set ' + .. 'NVIM_API_PRERELEASE to true in CMakeLists.txt.' + ) end error(errstr) else - error("function name '"..f.name.."' doesn't begin with 'nvim_'") + error("function name '" .. f.name .. "' doesn't begin with 'nvim_'") end end elseif f.since > api_level then if api.version.api_prerelease then - error("New function "..f.name.." should use since value ".. - api_level) + error('New function ' .. f.name .. ' should use since value ' .. api_level) else - error("function "..f.name.." has since value > api_level. ".. - "Bump NVIM_API_CURRENT and set ".. - "NVIM_API_PRERELEASE to true in CMakeLists.txt.") + error( + 'function ' + .. f.name + .. ' has since value > api_level. ' + .. 'Bump NVIM_API_CURRENT and set ' + .. 'NVIM_API_PRERELEASE to true in CMakeLists.txt.' + ) end end end end) - it("UI events are compatible with old metadata or have new level", function() + it('UI events are compatible with old metadata or have new level', function() local ui_events_new = name_table(api.ui_events) local ui_events_compat = {} -- UI events were formalized in level 3 for level = 3, stable do - for _,e in ipairs(old_api[level].ui_events) do + for _, e in ipairs(old_api[level].ui_events) do local new_e = ui_events_new[e.name] if new_e ~= nil then check_ui_event_compatible(e, new_e) @@ -186,32 +203,44 @@ describe("api metadata", function() ui_events_compat[level] = name_table(old_api[level].ui_events) end - for _,e in ipairs(api.ui_events) do + for _, e in ipairs(api.ui_events) do if e.since <= stable then local e_old = ui_events_compat[e.since][e.name] if e_old == nil then - local errstr = ("UI event "..e.name.." has too low since value. ".. - "For new events set it to "..(stable+1)..".") + local errstr = ( + 'UI event ' + .. e.name + .. ' has too low since value. ' + .. 'For new events set it to ' + .. (stable + 1) + .. '.' + ) if not api.version.api_prerelease then - errstr = (errstr.." Also bump NVIM_API_CURRENT and set ".. - "NVIM_API_PRERELEASE to true in CMakeLists.txt.") + errstr = ( + errstr + .. ' Also bump NVIM_API_CURRENT and set ' + .. 'NVIM_API_PRERELEASE to true in CMakeLists.txt.' + ) end error(errstr) end elseif e.since > api_level then if api.version.api_prerelease then - error("New UI event "..e.name.." should use since value ".. - api_level) + error('New UI event ' .. e.name .. ' should use since value ' .. api_level) else - error("UI event "..e.name.." has since value > api_level. ".. - "Bump NVIM_API_CURRENT and set ".. - "NVIM_API_PRERELEASE to true in CMakeLists.txt.") + error( + 'UI event ' + .. e.name + .. ' has since value > api_level. ' + .. 'Bump NVIM_API_CURRENT and set ' + .. 'NVIM_API_PRERELEASE to true in CMakeLists.txt.' + ) end end end end) - it("ui_options are preserved from older levels", function() + it('ui_options are preserved from older levels', function() local available_options = {} for _, option in ipairs(api.ui_options) do available_options[option] = true @@ -220,7 +249,7 @@ describe("api metadata", function() for level = 4, stable do for _, option in ipairs(old_api[level].ui_options) do if not available_options[option] then - error("UI option "..option.." from stable metadata is missing") + error('UI option ' .. option .. ' from stable metadata is missing') end end end diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 104ffd7d6c..ce2838879b 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -3,6 +3,7 @@ local Screen = require('test.functional.ui.screen') local luv = require('luv') local fmt = string.format +local dedent = helpers.dedent local assert_alive = helpers.assert_alive local NIL = helpers.NIL local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq @@ -41,32 +42,41 @@ describe('API', function() it('validates requests', function() -- RPC - matches('Invalid method: bogus$', - pcall_err(request, 'bogus')) - matches('Invalid method: … の り 。…$', - pcall_err(request, '… の り 。…')) - matches('Invalid method: <empty>$', - pcall_err(request, '')) + matches('Invalid method: bogus$', pcall_err(request, 'bogus')) + matches('Invalid method: … の り 。…$', pcall_err(request, '… の り 。…')) + matches('Invalid method: <empty>$', pcall_err(request, '')) -- Non-RPC: rpcrequest(v:servername) uses internal channel. - matches('Invalid method: … の り 。…$', - pcall_err(request, 'nvim_eval', - [=[rpcrequest(sockconnect('pipe', v:servername, {'rpc':1}), '… の り 。…')]=])) - matches('Invalid method: bogus$', - pcall_err(request, 'nvim_eval', - [=[rpcrequest(sockconnect('pipe', v:servername, {'rpc':1}), 'bogus')]=])) + matches( + 'Invalid method: … の り 。…$', + pcall_err( + request, + 'nvim_eval', + [=[rpcrequest(sockconnect('pipe', v:servername, {'rpc':1}), '… の り 。…')]=] + ) + ) + matches( + 'Invalid method: bogus$', + pcall_err( + request, + 'nvim_eval', + [=[rpcrequest(sockconnect('pipe', v:servername, {'rpc':1}), 'bogus')]=] + ) + ) -- XXX: This must be the last one, else next one will fail: -- "Packer instance already working. Use another Packer ..." - matches("can't serialize object of type .$", - pcall_err(request, nil)) + matches("can't serialize object of type .$", pcall_err(request, nil)) end) it('handles errors in async requests', function() local error_types = meths.get_api_info()[2].error_types nvim_async('bogus') - eq({'notification', 'nvim_error_event', - {error_types.Exception.id, 'Invalid method: nvim_bogus'}}, next_msg()) + eq({ + 'notification', + 'nvim_error_event', + { error_types.Exception.id, 'Invalid method: nvim_bogus' }, + }, next_msg()) -- error didn't close channel. assert_alive() end) @@ -74,9 +84,11 @@ describe('API', function() it('failed async request emits nvim_error_event', function() local error_types = meths.get_api_info()[2].error_types nvim_async('command', 'bogus') - eq({'notification', 'nvim_error_event', - {error_types.Exception.id, 'Vim:E492: Not an editor command: bogus'}}, - next_msg()) + eq({ + 'notification', + 'nvim_error_event', + { error_types.Exception.id, 'Vim:E492: Not an editor command: bogus' }, + }, next_msg()) -- error didn't close channel. assert_alive() end) @@ -85,7 +97,7 @@ describe('API', function() nvim('command', 'split') nvim('command', 'autocmd WinEnter * startinsert') nvim('command', 'wincmd w') - eq({mode='i', blocking=false}, nvim("get_mode")) + eq({ mode = 'i', blocking = false }, nvim('get_mode')) end) describe('nvim_exec2', function() @@ -109,23 +121,31 @@ describe('API', function() it(':verbose set {option}?', function() nvim('exec2', 'set nowrap', { output = false }) - eq({ output = 'nowrap\n\tLast set from anonymous :source' }, - nvim('exec2', 'verbose set wrap?', { output = true })) + eq( + { output = 'nowrap\n\tLast set from anonymous :source' }, + nvim('exec2', 'verbose set wrap?', { output = true }) + ) -- Using script var to force creation of a script item - nvim('exec2', [[ + nvim( + 'exec2', + [[ let s:a = 1 set nowrap - ]], { output = false }) - eq({ output = 'nowrap\n\tLast set from anonymous :source (script id 1)' }, - nvim('exec2', 'verbose set wrap?', { output = true })) + ]], + { output = false } + ) + eq( + { output = 'nowrap\n\tLast set from anonymous :source (script id 1)' }, + nvim('exec2', 'verbose set wrap?', { output = true }) + ) end) it('multiline input', function() -- Heredoc + empty lines. nvim('exec2', "let x2 = 'a'\n", { output = false }) eq('a', nvim('get_var', 'x2')) - nvim('exec2','lua <<EOF\n\n\n\ny=3\n\n\nEOF', { output = false }) + nvim('exec2', 'lua <<EOF\n\n\n\ny=3\n\n\nEOF', { output = false }) eq(3, nvim('eval', "luaeval('y')")) eq({}, nvim('exec2', 'lua <<EOF\ny=3\nEOF', { output = false })) @@ -144,90 +164,141 @@ describe('API', function() eq('xxx', nvim('get_current_line')) -- Autocmds - nvim('exec2','autocmd BufAdd * :let x1 = "Hello"', { output = false }) + nvim('exec2', 'autocmd BufAdd * :let x1 = "Hello"', { output = false }) nvim('command', 'new foo') eq('Hello', request('nvim_eval', 'g:x1')) -- Line continuations - nvim('exec2', [[ + nvim( + 'exec2', + [[ let abc = #{ \ a: 1, "\ b: 2, \ c: 3 - \ }]], { output = false }) - eq({a = 1, c = 3}, request('nvim_eval', 'g:abc')) + \ }]], + { output = false } + ) + eq({ a = 1, c = 3 }, request('nvim_eval', 'g:abc')) -- try no spaces before continuations to catch off-by-one error nvim('exec2', 'let ab = #{\n\\a: 98,\n"\\ b: 2\n\\}', { output = false }) - eq({a = 98}, request('nvim_eval', 'g:ab')) + eq({ a = 98 }, request('nvim_eval', 'g:ab')) -- Script scope (s:) - eq({ output = 'ahoy! script-scoped varrrrr' }, nvim('exec2', [[ + eq( + { output = 'ahoy! script-scoped varrrrr' }, + nvim( + 'exec2', + [[ let s:pirate = 'script-scoped varrrrr' function! s:avast_ye_hades(s) abort return a:s .. ' ' .. s:pirate endfunction echo <sid>avast_ye_hades('ahoy!') - ]], { output = true })) - - eq({ output = "{'output': 'ahoy! script-scoped varrrrr'}" }, nvim('exec2', [[ + ]], + { output = true } + ) + ) + + eq( + { output = "{'output': 'ahoy! script-scoped varrrrr'}" }, + nvim( + 'exec2', + [[ let s:pirate = 'script-scoped varrrrr' function! Avast_ye_hades(s) abort return a:s .. ' ' .. s:pirate endfunction echo nvim_exec2('echo Avast_ye_hades(''ahoy!'')', {'output': v:true}) - ]], { output = true })) - - matches('Vim%(echo%):E121: Undefined variable: s:pirate$', - pcall_err(request, 'nvim_exec2', [[ + ]], + { output = true } + ) + ) + + matches( + 'Vim%(echo%):E121: Undefined variable: s:pirate$', + pcall_err( + request, + 'nvim_exec2', + [[ let s:pirate = 'script-scoped varrrrr' call nvim_exec2('echo s:pirate', {'output': v:true}) - ]], { output = false })) + ]], + { output = false } + ) + ) -- Script items are created only on script var access - eq({ output = '1\n0' }, nvim('exec2', [[ + eq( + { output = '1\n0' }, + nvim( + 'exec2', + [[ echo expand("<SID>")->empty() let s:a = 123 echo expand("<SID>")->empty() - ]], { output = true })) - - eq({ output = '1\n0' }, nvim('exec2', [[ + ]], + { output = true } + ) + ) + + eq( + { output = '1\n0' }, + nvim( + 'exec2', + [[ echo expand("<SID>")->empty() function s:a() abort endfunction echo expand("<SID>")->empty() - ]], { output = true })) + ]], + { output = true } + ) + ) end) it('non-ASCII input', function() - nvim('exec2', [=[ + nvim( + 'exec2', + [=[ new exe "normal! i ax \n Ax " :%s/ax/--a1234--/g | :%s/Ax/--A1234--/g - ]=], { output = false }) + ]=], + { output = false } + ) nvim('command', '1') eq(' --a1234-- ', nvim('get_current_line')) nvim('command', '2') eq(' --A1234-- ', nvim('get_current_line')) - nvim('exec2', [[ + nvim( + 'exec2', + [[ new call setline(1,['xxx']) call feedkeys('r') call feedkeys('ñ', 'xt') - ]], { output = false }) + ]], + { output = false } + ) eq('ñxx', nvim('get_current_line')) end) it('execution error', function() - eq('nvim_exec2(): Vim:E492: Not an editor command: bogus_command', - pcall_err(request, 'nvim_exec2', 'bogus_command', {})) - eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated. + eq( + 'nvim_exec2(): Vim:E492: Not an editor command: bogus_command', + pcall_err(request, 'nvim_exec2', 'bogus_command', {}) + ) + eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated. eq('', eval('v:exception')) - eq('nvim_exec2(): Vim(buffer):E86: Buffer 23487 does not exist', - pcall_err(request, 'nvim_exec2', 'buffer 23487', {})) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + eq( + 'nvim_exec2(): Vim(buffer):E86: Buffer 23487 does not exist', + pcall_err(request, 'nvim_exec2', 'buffer 23487', {}) + ) + eq('', eval('v:errmsg')) -- v:errmsg was not updated. eq('', eval('v:exception')) end) @@ -240,7 +311,7 @@ describe('API', function() request('nvim_exec2', [[ let x2 = substitute('foo','o','X','g') let x4 = 'should be overwritten' - call nvim_exec2("source ]]..fname..[[\nlet x3 = substitute('foo','foo','set by recursive nvim_exec2','g')\nlet x5='overwritten'\nlet x4=x5\n", {'output': v:false}) + call nvim_exec2("source ]] .. fname .. [[\nlet x3 = substitute('foo','foo','set by recursive nvim_exec2','g')\nlet x5='overwritten'\nlet x4=x5\n", {'output': v:false}) ]], { output = false }) eq('set from :source file', request('nvim_get_var', 'x1')) eq('fXX', request('nvim_get_var', 'x2')) @@ -254,24 +325,38 @@ describe('API', function() local fname = tmpname() write_file(fname, 'echo "hello"\n') local sourcing_fname = tmpname() - write_file(sourcing_fname, 'call nvim_exec2("source '..fname..'", {"output": v:false})\n') + write_file(sourcing_fname, 'call nvim_exec2("source ' .. fname .. '", {"output": v:false})\n') meths.exec2('set verbose=2', { output = false }) - local traceback_output = 'line 0: sourcing "'..sourcing_fname..'"\n'.. - 'line 0: sourcing "'..fname..'"\n'.. - 'hello\n'.. - 'finished sourcing '..fname..'\n'.. - 'continuing in nvim_exec2() called at '..sourcing_fname..':1\n'.. - 'finished sourcing '..sourcing_fname..'\n'.. - 'continuing in nvim_exec2() called at nvim_exec2():0' - eq({ output = traceback_output }, - meths.exec2('call nvim_exec2("source '..sourcing_fname..'", {"output": v:false})', { output = true })) + local traceback_output = dedent([[ + line 0: sourcing "%s" + line 0: sourcing "%s" + hello + finished sourcing %s + continuing in nvim_exec2() called at %s:1 + finished sourcing %s + continuing in nvim_exec2() called at nvim_exec2():0]]):format( + sourcing_fname, + fname, + fname, + sourcing_fname, + sourcing_fname + ) + eq( + { output = traceback_output }, + meths.exec2( + 'call nvim_exec2("source ' .. sourcing_fname .. '", {"output": v:false})', + { output = true } + ) + ) os.remove(fname) os.remove(sourcing_fname) end) it('returns output', function() - eq({ output = 'this is spinal tap' }, - nvim('exec2', 'lua <<EOF\n\n\nprint("this is spinal tap")\n\n\nEOF', { output = true })) + eq( + { output = 'this is spinal tap' }, + nvim('exec2', 'lua <<EOF\n\n\nprint("this is spinal tap")\n\n\nEOF', { output = true }) + ) eq({ output = '' }, nvim('exec2', 'echo', { output = true })) eq({ output = 'foo 42' }, nvim('exec2', 'echo "foo" 42', { output = true })) end) @@ -280,39 +365,45 @@ describe('API', function() local screen = Screen.new(40, 8) screen:attach() screen:set_default_attr_ids({ - [0] = {bold=true, foreground=Screen.colors.Blue}, + [0] = { bold = true, foreground = Screen.colors.Blue }, }) meths.exec2("echo 'hello'", { output = false }) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {0:~ }|*6 hello | - ]]} + ]], + } end) - it('doesn\'t display messages when output=true', function() + it("doesn't display messages when output=true", function() local screen = Screen.new(40, 6) screen:attach() screen:set_default_attr_ids({ - [0] = {bold=true, foreground=Screen.colors.Blue}, + [0] = { bold = true, foreground = Screen.colors.Blue }, }) meths.exec2("echo 'hello'", { output = true }) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {0:~ }|*4 | - ]]} + ]], + } exec([[ func Print() call nvim_exec2('echo "hello"', { 'output': v:true }) endfunc ]]) feed([[:echon 1 | call Print() | echon 5<CR>]]) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {0:~ }|*4 15 | - ]]} + ]], + } end) end) @@ -320,7 +411,7 @@ describe('API', function() it('works', function() local fname = tmpname() nvim('command', 'new') - nvim('command', 'edit '..fname) + nvim('command', 'edit ' .. fname) nvim('command', 'normal itesting\napi') nvim('command', 'w') local f = assert(io.open(fname)) @@ -334,49 +425,49 @@ describe('API', function() end) it('Vimscript validation error: fails with specific error', function() - local status, rv = pcall(nvim, "command", "bogus_command") - eq(false, status) -- nvim_command() failed. - eq("E492:", string.match(rv, "E%d*:")) -- Vimscript error was returned. - eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated. + local status, rv = pcall(nvim, 'command', 'bogus_command') + eq(false, status) -- nvim_command() failed. + eq('E492:', string.match(rv, 'E%d*:')) -- Vimscript error was returned. + eq('', nvim('eval', 'v:errmsg')) -- v:errmsg was not updated. eq('', eval('v:exception')) end) it('Vimscript execution error: fails with specific error', function() - local status, rv = pcall(nvim, "command", "buffer 23487") - eq(false, status) -- nvim_command() failed. - eq("E86: Buffer 23487 does not exist", string.match(rv, "E%d*:.*")) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + local status, rv = pcall(nvim, 'command', 'buffer 23487') + eq(false, status) -- nvim_command() failed. + eq('E86: Buffer 23487 does not exist', string.match(rv, 'E%d*:.*')) + eq('', eval('v:errmsg')) -- v:errmsg was not updated. eq('', eval('v:exception')) end) it('gives E493 instead of prompting on backwards range', function() command('split') - eq('Vim(windo):E493: Backwards range given: 2,1windo echo', - pcall_err(command, '2,1windo echo')) + eq( + 'Vim(windo):E493: Backwards range given: 2,1windo echo', + pcall_err(command, '2,1windo echo') + ) end) end) describe('nvim_command_output', function() it('does not induce hit-enter prompt', function() - nvim("ui_attach", 80, 20, {}) + nvim('ui_attach', 80, 20, {}) -- Induce a hit-enter prompt use nvim_input (non-blocking). nvim('command', 'set cmdheight=1') nvim('input', [[:echo "hi\nhi2"<CR>]]) -- Verify hit-enter prompt. - eq({mode='r', blocking=true}, nvim("get_mode")) + eq({ mode = 'r', blocking = true }, nvim('get_mode')) nvim('input', [[<C-c>]]) -- Verify NO hit-enter prompt. nvim('command_output', [[echo "hi\nhi2"]]) - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) it('captures command output', function() - eq('this is\nspinal tap', - nvim('command_output', [[echo "this is\nspinal tap"]])) - eq('no line ending!', - nvim('command_output', [[echon "no line ending!"]])) + eq('this is\nspinal tap', nvim('command_output', [[echo "this is\nspinal tap"]])) + eq('no line ending!', nvim('command_output', [[echon "no line ending!"]])) end) it('captures empty command output', function() @@ -388,49 +479,51 @@ describe('API', function() end) it('captures multiple commands', function() - eq('foo\n 1 %a "[No Name]" line 1', - nvim('command_output', 'echo "foo" | ls')) + eq( + 'foo\n 1 %a "[No Name]" line 1', + nvim('command_output', 'echo "foo" | ls') + ) end) it('captures nested execute()', function() - eq('\nnested1\nnested2\n 1 %a "[No Name]" line 1', - nvim('command_output', - [[echo execute('echo "nested1\nnested2"') | ls]])) + eq( + '\nnested1\nnested2\n 1 %a "[No Name]" line 1', + nvim('command_output', [[echo execute('echo "nested1\nnested2"') | ls]]) + ) end) it('captures nested nvim_command_output()', function() - eq('nested1\nnested2\n 1 %a "[No Name]" line 1', - nvim('command_output', - [[echo nvim_command_output('echo "nested1\nnested2"') | ls]])) + eq( + 'nested1\nnested2\n 1 %a "[No Name]" line 1', + nvim('command_output', [[echo nvim_command_output('echo "nested1\nnested2"') | ls]]) + ) end) it('returns shell |:!| output', function() local win_lf = is_os('win') and '\r' or '' - eq(':!echo foo\r\n\nfoo'..win_lf..'\n', nvim('command_output', [[!echo foo]])) + eq(':!echo foo\r\n\nfoo' .. win_lf .. '\n', nvim('command_output', [[!echo foo]])) end) it('Vimscript validation error: fails with specific error', function() - local status, rv = pcall(nvim, "command_output", "bogus commannnd") - eq(false, status) -- nvim_command_output() failed. - eq("E492: Not an editor command: bogus commannnd", - string.match(rv, "E%d*:.*")) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + local status, rv = pcall(nvim, 'command_output', 'bogus commannnd') + eq(false, status) -- nvim_command_output() failed. + eq('E492: Not an editor command: bogus commannnd', string.match(rv, 'E%d*:.*')) + eq('', eval('v:errmsg')) -- v:errmsg was not updated. -- Verify NO hit-enter prompt. - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) it('Vimscript execution error: fails with specific error', function() - local status, rv = pcall(nvim, "command_output", "buffer 42") - eq(false, status) -- nvim_command_output() failed. - eq("E86: Buffer 42 does not exist", string.match(rv, "E%d*:.*")) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + local status, rv = pcall(nvim, 'command_output', 'buffer 42') + eq(false, status) -- nvim_command_output() failed. + eq('E86: Buffer 42 does not exist', string.match(rv, 'E%d*:.*')) + eq('', eval('v:errmsg')) -- v:errmsg was not updated. -- Verify NO hit-enter prompt. - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) it('does not cause heap buffer overflow with large output', function() - eq(eval('string(range(1000000))'), - nvim('command_output', 'echo range(1000000)')) + eq(eval('string(range(1000000))'), nvim('command_output', 'echo range(1000000)')) end) end) @@ -438,22 +531,21 @@ describe('API', function() it('works', function() nvim('command', 'let g:v1 = "a"') nvim('command', 'let g:v2 = [1, 2, {"v3": 3}]') - eq({v1 = 'a', v2 = { 1, 2, { v3 = 3 } } }, nvim('eval', 'g:')) + eq({ v1 = 'a', v2 = { 1, 2, { v3 = 3 } } }, nvim('eval', 'g:')) end) it('handles NULL-initialized strings correctly', function() - eq(1, nvim('eval',"matcharg(1) == ['', '']")) - eq({'', ''}, nvim('eval','matcharg(1)')) + eq(1, nvim('eval', "matcharg(1) == ['', '']")) + eq({ '', '' }, nvim('eval', 'matcharg(1)')) end) it('works under deprecated name', function() - eq(2, request("vim_eval", "1+1")) + eq(2, request('vim_eval', '1+1')) end) - it("Vimscript error: returns error details, does NOT update v:errmsg", function() - eq('Vim:E121: Undefined variable: bogus', - pcall_err(request, 'nvim_eval', 'bogus expression')) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + it('Vimscript error: returns error details, does NOT update v:errmsg', function() + eq('Vim:E121: Undefined variable: bogus', pcall_err(request, 'nvim_eval', 'bogus expression')) + eq('', eval('v:errmsg')) -- v:errmsg was not updated. end) end) @@ -461,31 +553,41 @@ describe('API', function() it('works', function() nvim('call_function', 'setqflist', { { { filename = 'something', lnum = 17 } }, 'r' }) eq(17, nvim('call_function', 'getqflist', {})[1].lnum) - eq(17, nvim('call_function', 'eval', {17})) - eq('foo', nvim('call_function', 'simplify', {'this/./is//redundant/../../../foo'})) - end) - - it("Vimscript validation error: returns specific error, does NOT update v:errmsg", function() - eq('Vim:E117: Unknown function: bogus function', - pcall_err(request, 'nvim_call_function', 'bogus function', {'arg1'})) - eq('Vim:E119: Not enough arguments for function: atan', - pcall_err(request, 'nvim_call_function', 'atan', {})) + eq(17, nvim('call_function', 'eval', { 17 })) + eq('foo', nvim('call_function', 'simplify', { 'this/./is//redundant/../../../foo' })) + end) + + it('Vimscript validation error: returns specific error, does NOT update v:errmsg', function() + eq( + 'Vim:E117: Unknown function: bogus function', + pcall_err(request, 'nvim_call_function', 'bogus function', { 'arg1' }) + ) + eq( + 'Vim:E119: Not enough arguments for function: atan', + pcall_err(request, 'nvim_call_function', 'atan', {}) + ) eq('', eval('v:exception')) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. - end) - - it("Vimscript error: returns error details, does NOT update v:errmsg", function() - eq('Vim:E808: Number or Float required', - pcall_err(request, 'nvim_call_function', 'atan', {'foo'})) - eq('Vim:Invalid channel stream "xxx"', - pcall_err(request, 'nvim_call_function', 'chanclose', {999, 'xxx'})) - eq('Vim:E900: Invalid channel id', - pcall_err(request, 'nvim_call_function', 'chansend', {999, 'foo'})) + eq('', eval('v:errmsg')) -- v:errmsg was not updated. + end) + + it('Vimscript error: returns error details, does NOT update v:errmsg', function() + eq( + 'Vim:E808: Number or Float required', + pcall_err(request, 'nvim_call_function', 'atan', { 'foo' }) + ) + eq( + 'Vim:Invalid channel stream "xxx"', + pcall_err(request, 'nvim_call_function', 'chanclose', { 999, 'xxx' }) + ) + eq( + 'Vim:E900: Invalid channel id', + pcall_err(request, 'nvim_call_function', 'chansend', { 999, 'foo' }) + ) eq('', eval('v:exception')) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + eq('', eval('v:errmsg')) -- v:errmsg was not updated. end) - it("Vimscript exception: returns exception details, does NOT update v:errmsg", function() + it('Vimscript exception: returns exception details, does NOT update v:errmsg', function() source([[ function! Foo() abort throw 'wtf' @@ -493,10 +595,11 @@ describe('API', function() ]]) eq('function Foo, line 1: wtf', pcall_err(request, 'nvim_call_function', 'Foo', {})) eq('', eval('v:exception')) - eq('', eval('v:errmsg')) -- v:errmsg was not updated. + eq('', eval('v:errmsg')) -- v:errmsg was not updated. end) it('validation', function() + -- stylua: ignore local too_many_args = { 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x', 'x' } source([[ function! Foo(...) abort @@ -504,8 +607,10 @@ describe('API', function() endfunction ]]) -- E740 - eq('Function called with too many arguments', - pcall_err(request, 'nvim_call_function', 'Foo', too_many_args)) + eq( + 'Function called with too many arguments', + pcall_err(request, 'nvim_call_function', 'Foo', too_many_args) + ) end) end) @@ -524,40 +629,55 @@ describe('API', function() ]]) -- :help Dictionary-function - eq('Hello, World!', nvim('call_dict_function', 'g:test_dict_fn', 'F', {'World'})) + eq('Hello, World!', nvim('call_dict_function', 'g:test_dict_fn', 'F', { 'World' })) -- Funcref is sent as NIL over RPC. eq({ greeting = 'Hello', F = NIL }, nvim('get_var', 'test_dict_fn')) -- :help numbered-function - eq('Hi, Moon ...', nvim('call_dict_function', 'g:test_dict_fn2', 'F2', {'Moon'})) + eq('Hi, Moon ...', nvim('call_dict_function', 'g:test_dict_fn2', 'F2', { 'Moon' })) -- Funcref is sent as NIL over RPC. eq({ greeting = 'Hi', F2 = NIL }, nvim('get_var', 'test_dict_fn2')) -- Function specified via RPC dict. source('function! G() dict\n return "@".(self.result)."@"\nendfunction') - eq('@it works@', nvim('call_dict_function', { result = 'it works', G = 'G'}, 'G', {})) + eq('@it works@', nvim('call_dict_function', { result = 'it works', G = 'G' }, 'G', {})) end) it('validation', function() command('let g:d={"baz":"zub","meep":[]}') - eq('Not found: bogus', - pcall_err(request, 'nvim_call_dict_function', 'g:d', 'bogus', {1,2})) - eq('Not a function: baz', - pcall_err(request, 'nvim_call_dict_function', 'g:d', 'baz', {1,2})) - eq('Not a function: meep', - pcall_err(request, 'nvim_call_dict_function', 'g:d', 'meep', {1,2})) - eq('Vim:E117: Unknown function: f', - pcall_err(request, 'nvim_call_dict_function', { f = '' }, 'f', {1,2})) - eq('Not a function: f', - pcall_err(request, 'nvim_call_dict_function', "{ 'f': '' }", 'f', {1,2})) - eq('dict argument type must be String or Dictionary', - pcall_err(request, 'nvim_call_dict_function', 42, 'f', {1,2})) - eq('Failed to evaluate dict expression', - pcall_err(request, 'nvim_call_dict_function', 'foo', 'f', {1,2})) - eq('dict not found', - pcall_err(request, 'nvim_call_dict_function', '42', 'f', {1,2})) - eq('Invalid (empty) function name', - pcall_err(request, 'nvim_call_dict_function', "{ 'f': '' }", '', {1,2})) + eq( + 'Not found: bogus', + pcall_err(request, 'nvim_call_dict_function', 'g:d', 'bogus', { 1, 2 }) + ) + eq( + 'Not a function: baz', + pcall_err(request, 'nvim_call_dict_function', 'g:d', 'baz', { 1, 2 }) + ) + eq( + 'Not a function: meep', + pcall_err(request, 'nvim_call_dict_function', 'g:d', 'meep', { 1, 2 }) + ) + eq( + 'Vim:E117: Unknown function: f', + pcall_err(request, 'nvim_call_dict_function', { f = '' }, 'f', { 1, 2 }) + ) + eq( + 'Not a function: f', + pcall_err(request, 'nvim_call_dict_function', "{ 'f': '' }", 'f', { 1, 2 }) + ) + eq( + 'dict argument type must be String or Dictionary', + pcall_err(request, 'nvim_call_dict_function', 42, 'f', { 1, 2 }) + ) + eq( + 'Failed to evaluate dict expression', + pcall_err(request, 'nvim_call_dict_function', 'foo', 'f', { 1, 2 }) + ) + eq('dict not found', pcall_err(request, 'nvim_call_dict_function', '42', 'f', { 1, 2 })) + eq( + 'Invalid (empty) function name', + pcall_err(request, 'nvim_call_dict_function', "{ 'f': '' }", '', { 1, 2 }) + ) end) end) @@ -565,21 +685,21 @@ describe('API', function() local start_dir before_each(function() - funcs.mkdir("Xtestdir") + funcs.mkdir('Xtestdir') start_dir = funcs.getcwd() end) after_each(function() - helpers.rmdir("Xtestdir") + helpers.rmdir('Xtestdir') end) it('works', function() - meths.set_current_dir("Xtestdir") - eq(funcs.getcwd(), start_dir .. helpers.get_pathsep() .. "Xtestdir") + meths.set_current_dir('Xtestdir') + eq(funcs.getcwd(), start_dir .. helpers.get_pathsep() .. 'Xtestdir') end) it('sets previous directory', function() - meths.set_current_dir("Xtestdir") + meths.set_current_dir('Xtestdir') command('cd -') eq(funcs.getcwd(), start_dir) end) @@ -590,60 +710,67 @@ describe('API', function() meths.exec_lua('vim.api.nvim_set_var("test", 3)', {}) eq(3, meths.get_var('test')) - eq(17, meths.exec_lua('a, b = ...\nreturn a + b', {10,7})) + eq(17, meths.exec_lua('a, b = ...\nreturn a + b', { 10, 7 })) - eq(NIL, meths.exec_lua('function xx(a,b)\nreturn a..b\nend',{})) - eq("xy", meths.exec_lua('return xx(...)', {'x','y'})) + eq(NIL, meths.exec_lua('function xx(a,b)\nreturn a..b\nend', {})) + eq('xy', meths.exec_lua('return xx(...)', { 'x', 'y' })) -- Deprecated name: nvim_execute_lua. - eq("xy", meths.execute_lua('return xx(...)', {'x','y'})) + eq('xy', meths.execute_lua('return xx(...)', { 'x', 'y' })) end) it('reports errors', function() - eq([[Error loading lua: [string "<nvim>"]:0: '=' expected near '+']], - pcall_err(meths.exec_lua, 'a+*b', {})) + eq( + [[Error loading lua: [string "<nvim>"]:0: '=' expected near '+']], + pcall_err(meths.exec_lua, 'a+*b', {}) + ) - eq([[Error loading lua: [string "<nvim>"]:0: unexpected symbol near '1']], - pcall_err(meths.exec_lua, '1+2', {})) + eq( + [[Error loading lua: [string "<nvim>"]:0: unexpected symbol near '1']], + pcall_err(meths.exec_lua, '1+2', {}) + ) - eq([[Error loading lua: [string "<nvim>"]:0: unexpected symbol]], - pcall_err(meths.exec_lua, 'aa=bb\0', {})) + eq( + [[Error loading lua: [string "<nvim>"]:0: unexpected symbol]], + pcall_err(meths.exec_lua, 'aa=bb\0', {}) + ) - eq([[attempt to call global 'bork' (a nil value)]], - pcall_err(meths.exec_lua, 'bork()', {})) + eq([[attempt to call global 'bork' (a nil value)]], pcall_err(meths.exec_lua, 'bork()', {})) - eq('did\nthe\nfail', - pcall_err(meths.exec_lua, 'error("did\\nthe\\nfail")', {})) + eq('did\nthe\nfail', pcall_err(meths.exec_lua, 'error("did\\nthe\\nfail")', {})) end) it('uses native float values', function() - eq(2.5, meths.exec_lua("return select(1, ...)", {2.5})) - eq("2.5", meths.exec_lua("return vim.inspect(...)", {2.5})) + eq(2.5, meths.exec_lua('return select(1, ...)', { 2.5 })) + eq('2.5', meths.exec_lua('return vim.inspect(...)', { 2.5 })) -- "special" float values are still accepted as return values. eq(2.5, meths.exec_lua("return vim.api.nvim_eval('2.5')", {})) - eq("{\n [false] = 2.5,\n [true] = 3\n}", meths.exec_lua("return vim.inspect(vim.api.nvim_eval('2.5'))", {})) + eq( + '{\n [false] = 2.5,\n [true] = 3\n}', + meths.exec_lua("return vim.inspect(vim.api.nvim_eval('2.5'))", {}) + ) end) end) describe('nvim_notify', function() it('can notify a info message', function() - nvim("notify", "hello world", 2, {}) + nvim('notify', 'hello world', 2, {}) end) it('can be overridden', function() - command("lua vim.notify = function(...) return 42 end") + command('lua vim.notify = function(...) return 42 end') eq(42, meths.exec_lua("return vim.notify('Hello world')", {})) - nvim("notify", "hello world", 4, {}) + nvim('notify', 'hello world', 4, {}) end) end) describe('nvim_input', function() - it("Vimscript error: does NOT fail, updates v:errmsg", function() - local status, _ = pcall(nvim, "input", ":call bogus_fn()<CR>") - local v_errnum = string.match(nvim("eval", "v:errmsg"), "E%d*:") - eq(true, status) -- nvim_input() did not fail. - eq("E117:", v_errnum) -- v:errmsg was updated. + it('Vimscript error: does NOT fail, updates v:errmsg', function() + local status, _ = pcall(nvim, 'input', ':call bogus_fn()<CR>') + local v_errnum = string.match(nvim('eval', 'v:errmsg'), 'E%d*:') + eq(true, status) -- nvim_input() did not fail. + eq('E117:', v_errnum) -- v:errmsg was updated. end) it('does not crash even if trans_special result is largest #11788, #12287', function() @@ -654,10 +781,8 @@ describe('API', function() describe('nvim_paste', function() it('validation', function() - eq("Invalid 'phase': -2", - pcall_err(request, 'nvim_paste', 'foo', true, -2)) - eq("Invalid 'phase': 4", - pcall_err(request, 'nvim_paste', 'foo', true, 4)) + eq("Invalid 'phase': -2", pcall_err(request, 'nvim_paste', 'foo', true, -2)) + eq("Invalid 'phase': 4", pcall_err(request, 'nvim_paste', 'foo', true, 4)) end) local function run_streamed_paste_tests() it('stream: multiple chunks form one undo-block', function() @@ -686,7 +811,7 @@ describe('API', function() 2/chunk 3 2/chunk 4 (end) ]]) - feed('u') -- Undo. + feed('u') -- Undo. expect(expected1) end) it('stream: Insert mode', function() @@ -1036,7 +1161,7 @@ describe('API', function() line 2 line 3 ]]) - eq({0,4,1,0}, funcs.getpos('.')) -- Cursor follows the paste. + eq({ 0, 4, 1, 0 }, funcs.getpos('.')) -- Cursor follows the paste. eq(false, nvim('get_option_value', 'paste', {})) command('%delete _') -- Without final "\n". @@ -1045,7 +1170,7 @@ describe('API', function() line 1 line 2 line 3]]) - eq({0,3,6,0}, funcs.getpos('.')) + eq({ 0, 3, 6, 0 }, funcs.getpos('.')) command('%delete _') -- CRLF #10872 nvim('paste', 'line 1\r\nline 2\r\nline 3\r\n', true, -1) @@ -1054,7 +1179,7 @@ describe('API', function() line 2 line 3 ]]) - eq({0,4,1,0}, funcs.getpos('.')) + eq({ 0, 4, 1, 0 }, funcs.getpos('.')) command('%delete _') -- CRLF without final "\n". nvim('paste', 'line 1\r\nline 2\r\nline 3\r', true, -1) @@ -1063,7 +1188,7 @@ describe('API', function() line 2 line 3 ]]) - eq({0,4,1,0}, funcs.getpos('.')) + eq({ 0, 4, 1, 0 }, funcs.getpos('.')) command('%delete _') -- CRLF without final "\r\n". nvim('paste', 'line 1\r\nline 2\r\nline 3', true, -1) @@ -1071,17 +1196,17 @@ describe('API', function() line 1 line 2 line 3]]) - eq({0,3,6,0}, funcs.getpos('.')) + eq({ 0, 3, 6, 0 }, funcs.getpos('.')) command('%delete _') -- Various other junk. nvim('paste', 'line 1\r\n\r\rline 2\nline 3\rline 4\r', true, -1) expect('line 1\n\n\nline 2\nline 3\nline 4\n') - eq({0,7,1,0}, funcs.getpos('.')) + eq({ 0, 7, 1, 0 }, funcs.getpos('.')) eq(false, nvim('get_option_value', 'paste', {})) end) it('Replace-mode', function() -- Within single line - nvim('put', {'aabbccdd', 'eeffgghh', 'iijjkkll'}, "c", true, false) + nvim('put', { 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) command('normal l') command('startreplace') nvim('paste', '123456', true, -1) @@ -1091,7 +1216,7 @@ describe('API', function() iijjkkll]]) command('%delete _') -- Across lines - nvim('put', {'aabbccdd', 'eeffgghh', 'iijjkkll'}, "c", true, false) + nvim('put', { 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) command('normal l') command('startreplace') nvim('paste', '123\n456', true, -1) @@ -1147,101 +1272,103 @@ describe('API', function() it('crlf=false does not break lines at CR, CRLF', function() nvim('paste', 'line 1\r\n\r\rline 2\nline 3\rline 4\r', false, -1) expect('line 1\r\n\r\rline 2\nline 3\rline 4\r') - eq({0,3,14,0}, funcs.getpos('.')) + eq({ 0, 3, 14, 0 }, funcs.getpos('.')) end) it('vim.paste() failure', function() 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)) + eq('fake fail', pcall_err(request, 'nvim_paste', 'line 1\nline 2\nline 3', false, 1)) end) end) describe('nvim_put', function() it('validation', function() - eq("Invalid 'line': expected String, got Integer", - pcall_err(request, 'nvim_put', {42}, 'l', false, false)) - eq("Invalid 'type': 'x'", - pcall_err(request, 'nvim_put', {'foo'}, 'x', false, false)) + eq( + "Invalid 'line': expected String, got Integer", + pcall_err(request, 'nvim_put', { 42 }, 'l', false, false) + ) + eq("Invalid 'type': 'x'", pcall_err(request, 'nvim_put', { 'foo' }, 'x', false, false)) end) it("fails if 'nomodifiable'", function() command('set nomodifiable') - eq([[Vim:E21: Cannot make changes, 'modifiable' is off]], - pcall_err(request, 'nvim_put', {'a','b'}, 'l', true, true)) + eq( + [[Vim:E21: Cannot make changes, 'modifiable' is off]], + pcall_err(request, 'nvim_put', { 'a', 'b' }, 'l', true, true) + ) end) it('inserts text', function() -- linewise - nvim('put', {'line 1','line 2','line 3'}, 'l', true, true) + nvim('put', { 'line 1', 'line 2', 'line 3' }, 'l', true, true) expect([[ line 1 line 2 line 3]]) - eq({0,4,1,0}, funcs.getpos('.')) + eq({ 0, 4, 1, 0 }, funcs.getpos('.')) command('%delete _') -- charwise - nvim('put', {'line 1','line 2','line 3'}, 'c', true, false) + nvim('put', { 'line 1', 'line 2', 'line 3' }, 'c', true, false) expect([[ line 1 line 2 line 3]]) - eq({0,1,1,0}, funcs.getpos('.')) -- follow=false + eq({ 0, 1, 1, 0 }, funcs.getpos('.')) -- follow=false -- blockwise - nvim('put', {'AA','BB'}, 'b', true, true) + nvim('put', { 'AA', 'BB' }, 'b', true, true) expect([[ lAAine 1 lBBine 2 line 3]]) - eq({0,2,4,0}, funcs.getpos('.')) + eq({ 0, 2, 4, 0 }, funcs.getpos('.')) command('%delete _') -- Empty lines list. nvim('put', {}, 'c', true, true) - eq({0,1,1,0}, funcs.getpos('.')) + eq({ 0, 1, 1, 0 }, funcs.getpos('.')) expect([[]]) -- Single empty line. - nvim('put', {''}, 'c', true, true) - eq({0,1,1,0}, funcs.getpos('.')) + nvim('put', { '' }, 'c', true, true) + eq({ 0, 1, 1, 0 }, funcs.getpos('.')) expect([[ ]]) - nvim('put', {'AB'}, 'c', true, true) + nvim('put', { 'AB' }, 'c', true, true) -- after=false, follow=true - nvim('put', {'line 1','line 2'}, 'c', false, true) + nvim('put', { 'line 1', 'line 2' }, 'c', false, true) expect([[ Aline 1 line 2B]]) - eq({0,2,7,0}, funcs.getpos('.')) + eq({ 0, 2, 7, 0 }, funcs.getpos('.')) command('%delete _') - nvim('put', {'AB'}, 'c', true, true) + nvim('put', { 'AB' }, 'c', true, true) -- after=false, follow=false - nvim('put', {'line 1','line 2'}, 'c', false, false) + nvim('put', { 'line 1', 'line 2' }, 'c', false, false) expect([[ Aline 1 line 2B]]) - eq({0,1,2,0}, funcs.getpos('.')) + eq({ 0, 1, 2, 0 }, funcs.getpos('.')) eq('', nvim('eval', 'v:errmsg')) end) it('detects charwise/linewise text (empty {type})', function() -- linewise (final item is empty string) - nvim('put', {'line 1','line 2','line 3',''}, '', true, true) + nvim('put', { 'line 1', 'line 2', 'line 3', '' }, '', true, true) expect([[ line 1 line 2 line 3]]) - eq({0,4,1,0}, funcs.getpos('.')) + eq({ 0, 4, 1, 0 }, funcs.getpos('.')) command('%delete _') -- charwise (final item is non-empty) - nvim('put', {'line 1','line 2','line 3'}, '', true, true) + nvim('put', { 'line 1', 'line 2', 'line 3' }, '', true, true) expect([[ line 1 line 2 line 3]]) - eq({0,3,6,0}, funcs.getpos('.')) + eq({ 0, 3, 6, 0 }, funcs.getpos('.')) end) it('allows block width', function() -- behave consistently with setreg(); support "\022{NUM}" return by getregtype() - meths.put({'line 1','line 2','line 3'}, 'l', false, false) + meths.put({ 'line 1', 'line 2', 'line 3' }, 'l', false, false) expect([[ line 1 line 2 @@ -1249,23 +1376,21 @@ describe('API', function() ]]) -- larger width create spaces - meths.put({'a', 'bc'}, 'b3', false, false) + meths.put({ 'a', 'bc' }, 'b3', false, false) expect([[ a line 1 bc line 2 line 3 ]]) -- smaller width is ignored - meths.put({'xxx', 'yyy'}, '\0221', false, true) + meths.put({ 'xxx', 'yyy' }, '\0221', false, true) expect([[ xxxa line 1 yyybc line 2 line 3 ]]) - eq("Invalid 'type': 'bx'", - pcall_err(meths.put, {'xxx', 'yyy'}, 'bx', false, true)) - eq("Invalid 'type': 'b3x'", - pcall_err(meths.put, {'xxx', 'yyy'}, 'b3x', false, true)) + eq("Invalid 'type': 'bx'", pcall_err(meths.put, { 'xxx', 'yyy' }, 'bx', false, true)) + eq("Invalid 'type': 'b3x'", pcall_err(meths.put, { 'xxx', 'yyy' }, 'b3x', false, true)) end) end) @@ -1297,18 +1422,18 @@ describe('API', function() end) it('nvim_get_var, nvim_set_var, nvim_del_var', function() - nvim('set_var', 'lua', {1, 2, {['3'] = 1}}) - eq({1, 2, {['3'] = 1}}, nvim('get_var', 'lua')) - eq({1, 2, {['3'] = 1}}, nvim('eval', 'g:lua')) + nvim('set_var', 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, nvim('get_var', 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, nvim('eval', 'g:lua')) eq(1, funcs.exists('g:lua')) meths.del_var('lua') eq(0, funcs.exists('g:lua')) - eq("Key not found: lua", pcall_err(meths.del_var, 'lua')) + eq('Key not found: lua', pcall_err(meths.del_var, 'lua')) meths.set_var('lua', 1) -- Empty keys are allowed in Vim dicts (and msgpack). - nvim('set_var', 'dict_empty_key', {[''] = 'empty key'}) - eq({[''] = 'empty key'}, nvim('get_var', 'dict_empty_key')) + nvim('set_var', 'dict_empty_key', { [''] = 'empty key' }) + eq({ [''] = 'empty key' }, nvim('get_var', 'dict_empty_key')) -- Set locked g: var. command('lockvar lua') @@ -1330,12 +1455,12 @@ describe('API', function() local pathsep = helpers.get_pathsep() local xconfig = 'Xhome' .. pathsep .. 'Xconfig' local xdata = 'Xhome' .. pathsep .. 'Xdata' - local autoload_folder = table.concat({xconfig, 'nvim', 'autoload'}, pathsep) - local autoload_file = table.concat({autoload_folder , 'testload.vim'}, pathsep) + local autoload_folder = table.concat({ xconfig, 'nvim', 'autoload' }, pathsep) + local autoload_file = table.concat({ autoload_folder, 'testload.vim' }, pathsep) mkdir_p(autoload_folder) - write_file(autoload_file , [[let testload#value = 2]]) + write_file(autoload_file, [[let testload#value = 2]]) - clear{ args_rm={'-u'}, env={ XDG_CONFIG_HOME=xconfig, XDG_DATA_HOME=xdata } } + clear { args_rm = { '-u' }, env = { XDG_CONFIG_HOME = xconfig, XDG_DATA_HOME = xdata } } eq(2, meths.get_var('testload#value')) rmdir('Xhome') end) @@ -1355,58 +1480,64 @@ describe('API', function() eq({}, eval('v:oldfiles')) feed('i foo foo foo<Esc>0/foo<CR>') - eq({1, 1}, meths.win_get_cursor(0)) + eq({ 1, 1 }, meths.win_get_cursor(0)) eq(1, eval('v:searchforward')) feed('n') - eq({1, 5}, meths.win_get_cursor(0)) + eq({ 1, 5 }, meths.win_get_cursor(0)) meths.set_vvar('searchforward', 0) eq(0, eval('v:searchforward')) feed('n') - eq({1, 1}, meths.win_get_cursor(0)) + eq({ 1, 1 }, meths.win_get_cursor(0)) meths.set_vvar('searchforward', 1) eq(1, eval('v:searchforward')) feed('n') - eq({1, 5}, meths.win_get_cursor(0)) + eq({ 1, 5 }, meths.win_get_cursor(0)) local screen = Screen.new(60, 3) screen:set_default_attr_ids({ - [0] = {bold = true, foreground = Screen.colors.Blue}, - [1] = {background = Screen.colors.Yellow}, + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { background = Screen.colors.Yellow }, }) screen:attach() eq(1, eval('v:hlsearch')) - screen:expect{grid=[[ + screen:expect { + grid = [[ {1:foo} {1:^foo} {1:foo} | {0:~ }| | - ]]} + ]], + } meths.set_vvar('hlsearch', 0) eq(0, eval('v:hlsearch')) - screen:expect{grid=[[ + screen:expect { + grid = [[ foo ^foo foo | {0:~ }| | - ]]} + ]], + } meths.set_vvar('hlsearch', 1) eq(1, eval('v:hlsearch')) - screen:expect{grid=[[ + screen:expect { + grid = [[ {1:foo} {1:^foo} {1:foo} | {0:~ }| | - ]]} + ]], + } end) it('vim_set_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } eq(NIL, request('vim_set_var', 'lua', val1)) eq(val1, request('vim_set_var', 'lua', val2)) end) it('vim_del_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} - eq(NIL, request('vim_set_var', 'lua', val1)) + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } + eq(NIL, request('vim_set_var', 'lua', val1)) eq(val1, request('vim_set_var', 'lua', val2)) eq(val2, request('vim_del_var', 'lua')) end) @@ -1430,27 +1561,26 @@ describe('API', function() end) it('works to set global value of local options', function() - nvim('set_option_value', 'lisp', true, {scope='global'}) - eq(true, nvim('get_option_value', 'lisp', {scope='global'})) + nvim('set_option_value', 'lisp', true, { scope = 'global' }) + eq(true, nvim('get_option_value', 'lisp', { scope = 'global' })) eq(false, nvim('get_option_value', 'lisp', {})) eq(nil, nvim('command_output', 'setglobal lisp?'):match('nolisp')) eq('nolisp', nvim('command_output', 'setlocal lisp?'):match('nolisp')) - nvim('set_option_value', 'shiftwidth', 20, {scope='global'}) + nvim('set_option_value', 'shiftwidth', 20, { scope = 'global' }) eq('20', nvim('command_output', 'setglobal shiftwidth?'):match('%d+')) eq('8', nvim('command_output', 'setlocal shiftwidth?'):match('%d+')) end) it('updates where the option was last set from', function() nvim('set_option_value', 'equalalways', false, {}) - local status, rv = pcall(nvim, 'command_output', - 'verbose set equalalways?') + local status, rv = pcall(nvim, 'command_output', 'verbose set equalalways?') eq(true, status) - ok(nil ~= string.find(rv, 'noequalalways\n'.. - '\tLast set from API client %(channel id %d+%)')) + ok( + nil ~= string.find(rv, 'noequalalways\n' .. '\tLast set from API client %(channel id %d+%)') + ) nvim('exec_lua', 'vim.api.nvim_set_option_value("equalalways", true, {})', {}) - status, rv = pcall(nvim, 'command_output', - 'verbose set equalalways?') + status, rv = pcall(nvim, 'command_output', 'verbose set equalalways?') eq(true, status) eq(' equalalways\n\tLast set from Lua', rv) end) @@ -1470,37 +1600,49 @@ describe('API', function() end) it('validation', function() - eq("Invalid 'scope': expected 'local' or 'global'", - pcall_err(nvim, 'get_option_value', 'scrolloff', {scope = 'bogus'})) - eq("Invalid 'scope': expected 'local' or 'global'", - pcall_err(nvim, 'set_option_value', 'scrolloff', 1, {scope = 'bogus'})) - eq("Invalid 'scope': expected String, got Integer", - pcall_err(nvim, 'get_option_value', 'scrolloff', {scope = 42})) - eq("Invalid 'value': expected valid option type, got Array", - pcall_err(nvim, 'set_option_value', 'scrolloff', {}, {})) - eq("Invalid value for option 'scrolloff': expected number, got boolean true", - pcall_err(nvim, 'set_option_value', 'scrolloff', true, {})) - eq("Invalid value for option 'scrolloff': expected number, got string \"wrong\"", - pcall_err(nvim, 'set_option_value', 'scrolloff', 'wrong', {})) + eq( + "Invalid 'scope': expected 'local' or 'global'", + pcall_err(nvim, 'get_option_value', 'scrolloff', { scope = 'bogus' }) + ) + eq( + "Invalid 'scope': expected 'local' or 'global'", + pcall_err(nvim, 'set_option_value', 'scrolloff', 1, { scope = 'bogus' }) + ) + eq( + "Invalid 'scope': expected String, got Integer", + pcall_err(nvim, 'get_option_value', 'scrolloff', { scope = 42 }) + ) + eq( + "Invalid 'value': expected valid option type, got Array", + pcall_err(nvim, 'set_option_value', 'scrolloff', {}, {}) + ) + eq( + "Invalid value for option 'scrolloff': expected number, got boolean true", + pcall_err(nvim, 'set_option_value', 'scrolloff', true, {}) + ) + eq( + 'Invalid value for option \'scrolloff\': expected number, got string "wrong"', + pcall_err(nvim, 'set_option_value', 'scrolloff', 'wrong', {}) + ) end) it('can get local values when global value is set', function() eq(0, nvim('get_option_value', 'scrolloff', {})) - eq(-1, nvim('get_option_value', 'scrolloff', {scope = 'local'})) + eq(-1, nvim('get_option_value', 'scrolloff', { scope = 'local' })) end) it('can set global and local values', function() nvim('set_option_value', 'makeprg', 'hello', {}) eq('hello', nvim('get_option_value', 'makeprg', {})) - eq('', nvim('get_option_value', 'makeprg', {scope = 'local'})) - nvim('set_option_value', 'makeprg', 'world', {scope = 'local'}) - eq('world', nvim('get_option_value', 'makeprg', {scope = 'local'})) - nvim('set_option_value', 'makeprg', 'goodbye', {scope = 'global'}) - eq('goodbye', nvim('get_option_value', 'makeprg', {scope = 'global'})) + eq('', nvim('get_option_value', 'makeprg', { scope = 'local' })) + nvim('set_option_value', 'makeprg', 'world', { scope = 'local' }) + eq('world', nvim('get_option_value', 'makeprg', { scope = 'local' })) + nvim('set_option_value', 'makeprg', 'goodbye', { scope = 'global' }) + eq('goodbye', nvim('get_option_value', 'makeprg', { scope = 'global' })) nvim('set_option_value', 'makeprg', 'hello', {}) - eq('hello', nvim('get_option_value', 'makeprg', {scope = 'global'})) + eq('hello', nvim('get_option_value', 'makeprg', { scope = 'global' })) eq('hello', nvim('get_option_value', 'makeprg', {})) - eq('', nvim('get_option_value', 'makeprg', {scope = 'local'})) + eq('', nvim('get_option_value', 'makeprg', { scope = 'local' })) end) it('clears the local value of an option with nil', function() @@ -1509,63 +1651,63 @@ describe('API', function() eq(42, nvim('get_option_value', 'shiftwidth', {})) -- Set local value - nvim('set_option_value', 'shiftwidth', 8, {scope = 'local'}) + nvim('set_option_value', 'shiftwidth', 8, { scope = 'local' }) eq(8, nvim('get_option_value', 'shiftwidth', {})) - eq(8, nvim('get_option_value', 'shiftwidth', {scope = 'local'})) - eq(42, nvim('get_option_value', 'shiftwidth', {scope = 'global'})) + eq(8, nvim('get_option_value', 'shiftwidth', { scope = 'local' })) + eq(42, nvim('get_option_value', 'shiftwidth', { scope = 'global' })) -- Clear value without scope nvim('set_option_value', 'shiftwidth', NIL, {}) eq(42, nvim('get_option_value', 'shiftwidth', {})) - eq(42, nvim('get_option_value', 'shiftwidth', {scope = 'local'})) + eq(42, nvim('get_option_value', 'shiftwidth', { scope = 'local' })) -- Clear value with explicit scope - nvim('set_option_value', 'shiftwidth', 8, {scope = 'local'}) - nvim('set_option_value', 'shiftwidth', NIL, {scope = 'local'}) + nvim('set_option_value', 'shiftwidth', 8, { scope = 'local' }) + nvim('set_option_value', 'shiftwidth', NIL, { scope = 'local' }) eq(42, nvim('get_option_value', 'shiftwidth', {})) - eq(42, nvim('get_option_value', 'shiftwidth', {scope = 'local'})) + eq(42, nvim('get_option_value', 'shiftwidth', { scope = 'local' })) -- Now try with options with a special "local is unset" value (e.g. 'undolevels') nvim('set_option_value', 'undolevels', 1000, {}) - nvim('set_option_value', 'undolevels', 1200, {scope = 'local'}) - eq(1200, nvim('get_option_value', 'undolevels', {scope = 'local'})) - nvim('set_option_value', 'undolevels', NIL, {scope = 'local'}) - eq(-123456, nvim('get_option_value', 'undolevels', {scope = 'local'})) + nvim('set_option_value', 'undolevels', 1200, { scope = 'local' }) + eq(1200, nvim('get_option_value', 'undolevels', { scope = 'local' })) + nvim('set_option_value', 'undolevels', NIL, { scope = 'local' }) + eq(-123456, nvim('get_option_value', 'undolevels', { scope = 'local' })) eq(1000, nvim('get_option_value', 'undolevels', {})) nvim('set_option_value', 'autoread', true, {}) - nvim('set_option_value', 'autoread', false, {scope = 'local'}) - eq(false, nvim('get_option_value', 'autoread', {scope = 'local'})) - nvim('set_option_value', 'autoread', NIL, {scope = 'local'}) - eq(NIL, nvim('get_option_value', 'autoread', {scope = 'local'})) + nvim('set_option_value', 'autoread', false, { scope = 'local' }) + eq(false, nvim('get_option_value', 'autoread', { scope = 'local' })) + nvim('set_option_value', 'autoread', NIL, { scope = 'local' }) + eq(NIL, nvim('get_option_value', 'autoread', { scope = 'local' })) eq(true, nvim('get_option_value', 'autoread', {})) end) it('set window options', function() nvim('set_option_value', 'colorcolumn', '4,3', {}) - eq('4,3', nvim('get_option_value', 'colorcolumn', {scope = 'local'})) - command("set modified hidden") - command("enew") -- edit new buffer, window option is preserved - eq('4,3', nvim('get_option_value', 'colorcolumn', {scope = 'local'})) + eq('4,3', nvim('get_option_value', 'colorcolumn', { scope = 'local' })) + command('set modified hidden') + command('enew') -- edit new buffer, window option is preserved + eq('4,3', nvim('get_option_value', 'colorcolumn', { scope = 'local' })) end) it('set local window options', function() - nvim('set_option_value', 'colorcolumn', '4,3', {win=0, scope='local'}) - eq('4,3', nvim('get_option_value', 'colorcolumn', {win = 0, scope = 'local'})) - command("set modified hidden") - command("enew") -- edit new buffer, window option is reset - eq('', nvim('get_option_value', 'colorcolumn', {win = 0, scope = 'local'})) + nvim('set_option_value', 'colorcolumn', '4,3', { win = 0, scope = 'local' }) + eq('4,3', nvim('get_option_value', 'colorcolumn', { win = 0, scope = 'local' })) + command('set modified hidden') + command('enew') -- edit new buffer, window option is reset + eq('', nvim('get_option_value', 'colorcolumn', { win = 0, scope = 'local' })) end) it('get buffer or window-local options', function() nvim('command', 'new') local buf = nvim('get_current_buf').id - nvim('set_option_value', 'tagfunc', 'foobar', {buf=buf}) - eq('foobar', nvim('get_option_value', 'tagfunc', {buf = buf})) + nvim('set_option_value', 'tagfunc', 'foobar', { buf = buf }) + eq('foobar', nvim('get_option_value', 'tagfunc', { buf = buf })) local win = nvim('get_current_win').id - nvim('set_option_value', 'number', true, {win=win}) - eq(true, nvim('get_option_value', 'number', {win = win})) + nvim('set_option_value', 'number', true, { win = win }) + eq(true, nvim('get_option_value', 'number', { win = win })) end) it('getting current buffer option does not adjust cursor #19381', function() @@ -1574,9 +1716,9 @@ describe('API', function() local win = nvim('get_current_win').id insert('some text') feed('0v$') - eq({1, 9}, nvim('win_get_cursor', win)) - nvim('get_option_value', 'filetype', {buf = buf}) - eq({1, 9}, nvim('win_get_cursor', win)) + eq({ 1, 9 }, nvim('win_get_cursor', win)) + nvim('get_option_value', 'filetype', { buf = buf }) + eq({ 1, 9 }, nvim('win_get_cursor', win)) end) it('can get default option values for filetypes', function() @@ -1584,23 +1726,25 @@ describe('API', function() for ft, opts in pairs { lua = { commentstring = '-- %s' }, vim = { commentstring = '"%s' }, - man = { tagfunc = 'v:lua.require\'man\'.goto_tag' }, - xml = { formatexpr = 'xmlformat#Format()' } + man = { tagfunc = "v:lua.require'man'.goto_tag" }, + xml = { formatexpr = 'xmlformat#Format()' }, } do for option, value in pairs(opts) do eq(value, nvim('get_option_value', option, { filetype = ft })) end end - command'au FileType lua setlocal commentstring=NEW\\ %s' + command 'au FileType lua setlocal commentstring=NEW\\ %s' eq('NEW %s', nvim('get_option_value', 'commentstring', { filetype = 'lua' })) end) it('errors for bad FileType autocmds', function() - command'au FileType lua setlocal commentstring=BAD' - eq([[FileType Autocommands for "lua": Vim(setlocal):E537: 'commentstring' must be empty or contain %s: commentstring=BAD]], - pcall_err(nvim, 'get_option_value', 'commentstring', { filetype = 'lua' })) + command 'au FileType lua setlocal commentstring=BAD' + eq( + [[FileType Autocommands for "lua": Vim(setlocal):E537: 'commentstring' must be empty or contain %s: commentstring=BAD]], + pcall_err(nvim, 'get_option_value', 'commentstring', { filetype = 'lua' }) + ) end) it("value of 'modified' is always false for scratch buffers", function() @@ -1659,83 +1803,83 @@ describe('API', function() end) describe('nvim_get_mode', function() - it("during normal-mode `g` returns blocking=true", function() - nvim("input", "o") -- add a line - eq({mode='i', blocking=false}, nvim("get_mode")) - nvim("input", [[<C-\><C-N>]]) - eq(2, nvim("eval", "line('.')")) - eq({mode='n', blocking=false}, nvim("get_mode")) + it('during normal-mode `g` returns blocking=true', function() + nvim('input', 'o') -- add a line + eq({ mode = 'i', blocking = false }, nvim('get_mode')) + nvim('input', [[<C-\><C-N>]]) + eq(2, nvim('eval', "line('.')")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) - nvim("input", "g") - eq({mode='n', blocking=true}, nvim("get_mode")) + nvim('input', 'g') + eq({ mode = 'n', blocking = true }, nvim('get_mode')) - nvim("input", "k") -- complete the operator - eq(1, nvim("eval", "line('.')")) -- verify the completed operator - eq({mode='n', blocking=false}, nvim("get_mode")) + nvim('input', 'k') -- complete the operator + eq(1, nvim('eval', "line('.')")) -- verify the completed operator + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) - it("returns the correct result multiple consecutive times", function() - for _ = 1,5 do - eq({mode='n', blocking=false}, nvim("get_mode")) + it('returns the correct result multiple consecutive times', function() + for _ = 1, 5 do + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end - nvim("input", "g") - for _ = 1,4 do - eq({mode='n', blocking=true}, nvim("get_mode")) + nvim('input', 'g') + for _ = 1, 4 do + eq({ mode = 'n', blocking = true }, nvim('get_mode')) end - nvim("input", "g") - for _ = 1,7 do - eq({mode='n', blocking=false}, nvim("get_mode")) + nvim('input', 'g') + for _ = 1, 7 do + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end end) - it("during normal-mode CTRL-W, returns blocking=true", function() - nvim("input", "<C-W>") - eq({mode='n', blocking=true}, nvim("get_mode")) + it('during normal-mode CTRL-W, returns blocking=true', function() + nvim('input', '<C-W>') + eq({ mode = 'n', blocking = true }, nvim('get_mode')) - nvim("input", "s") -- complete the operator - eq(2, nvim("eval", "winnr('$')")) -- verify the completed operator - eq({mode='n', blocking=false}, nvim("get_mode")) + nvim('input', 's') -- complete the operator + eq(2, nvim('eval', "winnr('$')")) -- verify the completed operator + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) - it("during press-enter prompt without UI returns blocking=false", function() - eq({mode='n', blocking=false}, nvim("get_mode")) + it('during press-enter prompt without UI returns blocking=false', function() + eq({ mode = 'n', blocking = false }, nvim('get_mode')) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") command("echom 'msg4'") command("echom 'msg5'") - eq({mode='n', blocking=false}, nvim("get_mode")) - nvim("input", ":messages<CR>") - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) + nvim('input', ':messages<CR>') + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) - it("during press-enter prompt returns blocking=true", function() - nvim("ui_attach", 80, 20, {}) - eq({mode='n', blocking=false}, nvim("get_mode")) + it('during press-enter prompt returns blocking=true', function() + nvim('ui_attach', 80, 20, {}) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") command("echom 'msg4'") command("echom 'msg5'") - eq({mode='n', blocking=false}, nvim("get_mode")) - nvim("input", ":messages<CR>") - eq({mode='r', blocking=true}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) + nvim('input', ':messages<CR>') + eq({ mode = 'r', blocking = true }, nvim('get_mode')) end) - it("during getchar() returns blocking=false", function() - nvim("input", ":let g:test_input = nr2char(getchar())<CR>") + it('during getchar() returns blocking=false', function() + nvim('input', ':let g:test_input = nr2char(getchar())<CR>') -- Events are enabled during getchar(), RPC calls are *not* blocked. #5384 - eq({mode='n', blocking=false}, nvim("get_mode")) - eq(0, nvim("eval", "exists('g:test_input')")) - nvim("input", "J") - eq("J", nvim("eval", "g:test_input")) - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) + eq(0, nvim('eval', "exists('g:test_input')")) + nvim('input', 'J') + eq('J', nvim('eval', 'g:test_input')) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) -- TODO: bug #6247#issuecomment-286403810 - it("batched with input", function() - nvim("ui_attach", 80, 20, {}) - eq({mode='n', blocking=false}, nvim("get_mode")) + it('batched with input', function() + nvim('ui_attach', 80, 20, {}) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") @@ -1743,44 +1887,48 @@ describe('API', function() command("echom 'msg5'") local req = { - {'nvim_get_mode', {}}, - {'nvim_input', {':messages<CR>'}}, - {'nvim_get_mode', {}}, - {'nvim_eval', {'1'}}, + { 'nvim_get_mode', {} }, + { 'nvim_input', { ':messages<CR>' } }, + { 'nvim_get_mode', {} }, + { 'nvim_eval', { '1' } }, } - eq({ { {mode='n', blocking=false}, - 13, - {mode='n', blocking=false}, -- TODO: should be blocked=true ? - 1 }, - NIL}, meths.call_atomic(req)) - eq({mode='r', blocking=true}, nvim("get_mode")) + eq({ + { + { mode = 'n', blocking = false }, + 13, + { mode = 'n', blocking = false }, -- TODO: should be blocked=true ? + 1, + }, + NIL, + }, meths.call_atomic(req)) + eq({ mode = 'r', blocking = true }, nvim('get_mode')) end) - it("during insert-mode map-pending, returns blocking=true #6166", function() - command("inoremap xx foo") - nvim("input", "ix") - eq({mode='i', blocking=true}, nvim("get_mode")) + it('during insert-mode map-pending, returns blocking=true #6166', function() + command('inoremap xx foo') + nvim('input', 'ix') + eq({ mode = 'i', blocking = true }, nvim('get_mode')) end) - it("during normal-mode gU, returns blocking=false #6166", function() - nvim("input", "gu") - eq({mode='no', blocking=false}, nvim("get_mode")) + it('during normal-mode gU, returns blocking=false #6166', function() + nvim('input', 'gu') + eq({ mode = 'no', blocking = false }, nvim('get_mode')) end) it("at '-- More --' prompt returns blocking=true #11899", function() command('set more') feed(':digraphs<cr>') - eq({mode='rm', blocking=true}, nvim("get_mode")) + eq({ mode = 'rm', blocking = true }, nvim('get_mode')) end) it('after <Nop> mapping returns blocking=false #17257', function() command('nnoremap <F2> <Nop>') feed('<F2>') - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) it('after empty string <expr> mapping returns blocking=false #17257', function() command('nnoremap <expr> <F2> ""') feed('<F2>') - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) end) @@ -1856,64 +2004,67 @@ describe('API', function() it('does not interrupt Insert mode i_CTRL-O #10035', function() feed('iHello World<c-o>') - eq({mode='niI', blocking=false}, meths.get_mode()) -- fast event - eq(2, eval('1+1')) -- causes K_EVENT key - eq({mode='niI', blocking=false}, meths.get_mode()) -- still in ctrl-o mode + eq({ mode = 'niI', blocking = false }, meths.get_mode()) -- fast event + eq(2, eval('1+1')) -- causes K_EVENT key + eq({ mode = 'niI', blocking = false }, meths.get_mode()) -- still in ctrl-o mode feed('dd') - eq({mode='i', blocking=false}, meths.get_mode()) -- left ctrl-o mode + eq({ mode = 'i', blocking = false }, meths.get_mode()) -- left ctrl-o mode expect('') -- executed the command end) it('does not interrupt Select mode v_CTRL-O #15688', function() feed('iHello World<esc>gh<c-o>') - eq({mode='vs', blocking=false}, meths.get_mode()) -- fast event - eq({mode='vs', blocking=false}, meths.get_mode()) -- again #15288 - eq(2, eval('1+1')) -- causes K_EVENT key - eq({mode='vs', blocking=false}, meths.get_mode()) -- still in ctrl-o mode + eq({ mode = 'vs', blocking = false }, meths.get_mode()) -- fast event + eq({ mode = 'vs', blocking = false }, meths.get_mode()) -- again #15288 + eq(2, eval('1+1')) -- causes K_EVENT key + eq({ mode = 'vs', blocking = false }, meths.get_mode()) -- still in ctrl-o mode feed('^') - eq({mode='s', blocking=false}, meths.get_mode()) -- left ctrl-o mode + eq({ mode = 's', blocking = false }, meths.get_mode()) -- left ctrl-o mode feed('h') - eq({mode='i', blocking=false}, meths.get_mode()) -- entered insert mode - expect('h') -- selection is the whole line and is replaced + eq({ mode = 'i', blocking = false }, meths.get_mode()) -- entered insert mode + expect('h') -- selection is the whole line and is replaced end) it('does not interrupt Insert mode i_0_CTRL-D #13997', function() command('set timeoutlen=9999') feed('i<Tab><Tab>a0') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('<C-D>') - expect('a') -- recognized i_0_CTRL-D + expect('a') -- recognized i_0_CTRL-D end) it("does not interrupt with 'digraph'", function() command('set digraph') feed('i,') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('<BS>') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('.') - expect('…') -- digraph ",." worked + expect('…') -- digraph ",." worked feed('<Esc>') feed(':,') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('<BS>') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('.') - eq('…', funcs.getcmdline()) -- digraph ",." worked + eq('…', funcs.getcmdline()) -- digraph ",." worked end) end) describe('nvim_get_context', function() it('validation', function() - eq("Invalid key: 'blah'", - pcall_err(nvim, 'get_context', {blah={}})) - eq("Invalid 'types': expected Array, got Integer", - pcall_err(nvim, 'get_context', {types=42})) - eq("Invalid 'type': 'zub'", - pcall_err(nvim, 'get_context', {types={'jumps', 'zub', 'zam',}})) + eq("Invalid key: 'blah'", pcall_err(nvim, 'get_context', { blah = {} })) + eq( + "Invalid 'types': expected Array, got Integer", + pcall_err(nvim, 'get_context', { types = 42 }) + ) + eq( + "Invalid 'type': 'zub'", + pcall_err(nvim, 'get_context', { types = { 'jumps', 'zub', 'zam' } }) + ) end) it('returns map of current editor state', function() - local opts = {types={'regs', 'jumps', 'bufs', 'gvars'}} + local opts = { types = { 'regs', 'jumps', 'bufs', 'gvars' } } eq({}, parse_context(nvim('get_context', {}))) feed('i1<cr>2<cr>3<c-[>ddddddqahjklquuu') @@ -1927,10 +2078,10 @@ describe('API', function() local expected_ctx = { ['regs'] = { - {['rt'] = 1, ['rc'] = {'1'}, ['n'] = 49, ['ru'] = true}, - {['rt'] = 1, ['rc'] = {'2'}, ['n'] = 50}, - {['rt'] = 1, ['rc'] = {'3'}, ['n'] = 51}, - {['rc'] = {'hjkl'}, ['n'] = 97}, + { ['rt'] = 1, ['rc'] = { '1' }, ['n'] = 49, ['ru'] = true }, + { ['rt'] = 1, ['rc'] = { '2' }, ['n'] = 50 }, + { ['rt'] = 1, ['rc'] = { '3' }, ['n'] = 51 }, + { ['rc'] = { 'hjkl' }, ['n'] = 97 }, }, ['jumps'] = eval(([[ @@ -1945,18 +2096,18 @@ describe('API', function() filter(map(getbufinfo(), '{ "f": v:val.name }'), '!empty(v:val.f)') ]]), - ['gvars'] = {{'one', 1}, {'Two', 2}, {'THREE', 3}}, + ['gvars'] = { { 'one', 1 }, { 'Two', 2 }, { 'THREE', 3 } }, } eq(expected_ctx, parse_context(nvim('get_context', opts))) eq(expected_ctx, parse_context(nvim('get_context', {}))) - eq(expected_ctx, parse_context(nvim('get_context', {types={}}))) + eq(expected_ctx, parse_context(nvim('get_context', { types = {} }))) end) end) describe('nvim_load_context', function() it('sets current editor state to given context dictionary', function() - local opts = {types={'regs', 'jumps', 'bufs', 'gvars'}} + local opts = { types = { 'regs', 'jumps', 'bufs', 'gvars' } } eq({}, parse_context(nvim('get_context', opts))) nvim('set_var', 'one', 1) @@ -1966,16 +2117,20 @@ describe('API', function() nvim('set_var', 'one', 'a') nvim('set_var', 'Two', 'b') nvim('set_var', 'THREE', 'c') - eq({'a', 'b' ,'c'}, eval('[g:one, g:Two, g:THREE]')) + eq({ 'a', 'b', 'c' }, eval('[g:one, g:Two, g:THREE]')) nvim('load_context', ctx) - eq({1, 2 ,3}, eval('[g:one, g:Two, g:THREE]')) + eq({ 1, 2, 3 }, eval('[g:one, g:Two, g:THREE]')) end) it('errors when context dictionary is invalid', function() - eq('E474: Failed to convert list to msgpack string buffer', - pcall_err(nvim, 'load_context', { regs = { {} }, jumps = { {} } })) - eq('E474: Failed to convert list to msgpack string buffer', - pcall_err(nvim, 'load_context', { regs = { { [''] = '' } } })) + eq( + 'E474: Failed to convert list to msgpack string buffer', + pcall_err(nvim, 'load_context', { regs = { {} }, jumps = { {} } }) + ) + eq( + 'E474: Failed to convert list to msgpack string buffer', + pcall_err(nvim, 'load_context', { regs = { { [''] = '' } } }) + ) end) end) @@ -1996,18 +2151,21 @@ describe('API', function() -- K_SPECIAL KS_EXTRA KE_LEFTMOUSE -- 0x80 0xfd 0x2c -- 128 253 44 - eq('\128\253\44', helpers.nvim('replace_termcodes', - '<LeftMouse>', true, true, true)) + eq('\128\253\44', helpers.nvim('replace_termcodes', '<LeftMouse>', true, true, true)) end) it('converts keycodes', function() - eq('\nx\27x\rx<x', helpers.nvim('replace_termcodes', - '<NL>x<Esc>x<CR>x<lt>x', true, true, true)) + eq( + '\nx\27x\rx<x', + helpers.nvim('replace_termcodes', '<NL>x<Esc>x<CR>x<lt>x', true, true, true) + ) end) it('does not convert keycodes if special=false', function() - eq('<NL>x<Esc>x<CR>x<lt>x', helpers.nvim('replace_termcodes', - '<NL>x<Esc>x<CR>x<lt>x', true, true, false)) + eq( + '<NL>x<Esc>x<CR>x<lt>x', + helpers.nvim('replace_termcodes', '<NL>x<Esc>x<CR>x<lt>x', true, true, false) + ) end) it('does not crash when transforming an empty string', function() @@ -2036,11 +2194,11 @@ describe('API', function() -- Both nvim_replace_termcodes and nvim_feedkeys escape \x80 local inp = helpers.nvim('replace_termcodes', ':let x2="…"<CR>', true, true, true) - nvim('feedkeys', inp, '', true) -- escape_ks=true + nvim('feedkeys', inp, '', true) -- escape_ks=true -- nvim_feedkeys with K_SPECIAL escaping disabled inp = helpers.nvim('replace_termcodes', ':let x3="…"<CR>', true, true, true) - nvim('feedkeys', inp, '', false) -- escape_ks=false + nvim('feedkeys', inp, '', false) -- escape_ks=false helpers.stop() end @@ -2062,10 +2220,10 @@ describe('API', function() screen = Screen.new(40, 8) screen:attach() screen:set_default_attr_ids({ - [0] = {bold = true, foreground = Screen.colors.Blue}, - [1] = {bold = true, foreground = Screen.colors.SeaGreen}, - [2] = {bold = true, reverse = true}, - [3] = {foreground = Screen.colors.Blue}, + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { bold = true, foreground = Screen.colors.SeaGreen }, + [2] = { bold = true, reverse = true }, + [3] = { foreground = Screen.colors.Blue }, }) end) @@ -2091,17 +2249,20 @@ describe('API', function() it('blank line in message', function() feed([[:call nvim_out_write("\na\n")<CR>]]) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~ }|*3 {2: }| | a | {1:Press ENTER or type command to continue}^ | - ]]} + ]], + } feed('<CR>') feed([[:call nvim_out_write("b\n\nc\n")<CR>]]) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~ }|*2 {2: }| @@ -2109,19 +2270,22 @@ describe('API', function() | c | {1:Press ENTER or type command to continue}^ | - ]]} + ]], + } end) it('NUL bytes in message', function() feed([[:lua vim.api.nvim_out_write('aaa\0bbb\0\0ccc\nddd\0\0\0eee\n')<CR>]]) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~ }|*3 {2: }| aaa{3:^@}bbb{3:^@^@}ccc | ddd{3:^@^@^@}eee | {1:Press ENTER or type command to continue}^ | - ]]} + ]], + } end) end) @@ -2132,10 +2296,10 @@ describe('API', function() screen = Screen.new(40, 8) screen:attach() screen:set_default_attr_ids({ - [0] = {bold=true, foreground=Screen.colors.Blue}, - [1] = {foreground = Screen.colors.White, background = Screen.colors.Red}, - [2] = {bold = true, foreground = Screen.colors.SeaGreen}, - [3] = {bold = true, reverse = true}, + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { foreground = Screen.colors.White, background = Screen.colors.Red }, + [2] = { bold = true, foreground = Screen.colors.SeaGreen }, + [3] = { bold = true, reverse = true }, }) end) @@ -2195,19 +2359,21 @@ describe('API', function() {1:too fail} | {2:Press ENTER or type command to continue}^ | ]]) - feed('<cr>') -- exit the press ENTER screen + feed('<cr>') -- exit the press ENTER screen end) it('NUL bytes in message', function() nvim_async('err_write', 'aaa\0bbb\0\0ccc\nddd\0\0\0eee\n') - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~ }|*3 {3: }| {1:aaa^@bbb^@^@ccc} | {1:ddd^@^@^@eee} | {2:Press ENTER or type command to continue}^ | - ]]} + ]], + } end) end) @@ -2218,10 +2384,10 @@ describe('API', function() screen = Screen.new(40, 8) screen:attach() screen:set_default_attr_ids({ - [0] = {bold=true, foreground=Screen.colors.Blue}, - [1] = {foreground = Screen.colors.White, background = Screen.colors.Red}, - [2] = {bold = true, foreground = Screen.colors.SeaGreen}, - [3] = {bold = true, reverse = true}, + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { foreground = Screen.colors.White, background = Screen.colors.Red }, + [2] = { bold = true, foreground = Screen.colors.SeaGreen }, + [3] = { bold = true, reverse = true }, }) end) @@ -2271,29 +2437,31 @@ describe('API', function() end) it('stream=stdio channel', function() - eq({[1]=testinfo,[2]=stderr}, meths.list_chans()) + eq({ [1] = testinfo, [2] = stderr }, meths.list_chans()) eq(testinfo, meths.get_chan_info(1)) eq(stderr, meths.get_chan_info(2)) - meths.set_client_info("functionaltests", - {major=0, minor=3, patch=17}, - 'ui', - {do_stuff={n_args={2,3}}}, - {license= 'Apache2'}) + meths.set_client_info( + 'functionaltests', + { major = 0, minor = 3, patch = 17 }, + 'ui', + { do_stuff = { n_args = { 2, 3 } } }, + { license = 'Apache2' } + ) local info = { stream = 'stdio', id = 1, mode = 'rpc', client = { - name='functionaltests', - version={major=0, minor=3, patch=17}, - type='ui', - methods={do_stuff={n_args={2,3}}}, - attributes={license='Apache2'}, + name = 'functionaltests', + version = { major = 0, minor = 3, patch = 17 }, + type = 'ui', + methods = { do_stuff = { n_args = { 2, 3 } } }, + attributes = { license = 'Apache2' }, }, } - eq({info=info}, meths.get_var("info_event")) - eq({[1]=info, [2]=stderr}, meths.list_chans()) + eq({ info = info }, meths.get_var('info_event')) + eq({ [1] = info, [2] = stderr }, meths.list_chans()) eq(info, meths.get_chan_info(1)) end) @@ -2301,83 +2469,85 @@ describe('API', function() eq(3, eval("jobstart(['cat'], {'rpc': v:true})")) local catpath = eval('exepath("cat")') local info = { - stream='job', - id=3, - argv={ catpath }, - mode='rpc', - client={}, + stream = 'job', + id = 3, + argv = { catpath }, + mode = 'rpc', + client = {}, } - eq({info=info}, meths.get_var("opened_event")) - eq({[1]=testinfo,[2]=stderr,[3]=info}, meths.list_chans()) + eq({ info = info }, meths.get_var('opened_event')) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.list_chans()) eq(info, meths.get_chan_info(3)) - eval('rpcrequest(3, "nvim_set_client_info", "amazing-cat", {}, "remote",'.. - '{"nvim_command":{"n_args":1}},'.. -- and so on - '{"description":"The Amazing Cat"})') + eval( + 'rpcrequest(3, "nvim_set_client_info", "amazing-cat", {}, "remote",' + .. '{"nvim_command":{"n_args":1}},' -- and so on + .. '{"description":"The Amazing Cat"})' + ) info = { - stream='job', - id=3, - argv={ catpath }, - mode='rpc', + stream = 'job', + id = 3, + argv = { catpath }, + mode = 'rpc', client = { - name='amazing-cat', - version={major=0}, - type='remote', - methods={nvim_command={n_args=1}}, - attributes={description="The Amazing Cat"}, + name = 'amazing-cat', + version = { major = 0 }, + type = 'remote', + methods = { nvim_command = { n_args = 1 } }, + attributes = { description = 'The Amazing Cat' }, }, } - eq({info=info}, meths.get_var("info_event")) - eq({[1]=testinfo,[2]=stderr,[3]=info}, meths.list_chans()) + eq({ info = info }, meths.get_var('info_event')) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.list_chans()) - eq("Vim:Error invoking 'nvim_set_current_buf' on channel 3 (amazing-cat):\nWrong type for argument 1 when calling nvim_set_current_buf, expecting Buffer", - pcall_err(eval, 'rpcrequest(3, "nvim_set_current_buf", -1)')) + eq( + "Vim:Error invoking 'nvim_set_current_buf' on channel 3 (amazing-cat):\nWrong type for argument 1 when calling nvim_set_current_buf, expecting Buffer", + pcall_err(eval, 'rpcrequest(3, "nvim_set_current_buf", -1)') + ) end) it('stream=job :terminal channel', function() command(':terminal') - eq({id=1}, meths.get_current_buf()) - eq(3, meths.get_option_value('channel', {buf=1})) + eq({ id = 1 }, meths.get_current_buf()) + eq(3, meths.get_option_value('channel', { buf = 1 })) local info = { - stream='job', - id=3, - argv={ eval('exepath(&shell)') }, - mode='terminal', + stream = 'job', + id = 3, + argv = { eval('exepath(&shell)') }, + mode = 'terminal', buffer = 1, - pty='?', + pty = '?', } - local event = meths.get_var("opened_event") + local event = meths.get_var('opened_event') if not is_os('win') then info.pty = event.info.pty - neq(nil, string.match(info.pty, "^/dev/")) + neq(nil, string.match(info.pty, '^/dev/')) end - eq({info=info}, event) - info.buffer = {id=1} - eq({[1]=testinfo,[2]=stderr,[3]=info}, meths.list_chans()) + eq({ info = info }, event) + info.buffer = { id = 1 } + eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.list_chans()) eq(info, meths.get_chan_info(3)) -- :terminal with args + running process. command('enew') local progpath_esc = eval('shellescape(v:progpath)') funcs.termopen(('%s -u NONE -i NONE'):format(progpath_esc), { - env = { VIMRUNTIME = os.getenv('VIMRUNTIME') } + env = { VIMRUNTIME = os.getenv('VIMRUNTIME') }, }) - eq(-1, eval('jobwait([&channel], 0)[0]')) -- Running? + eq(-1, eval('jobwait([&channel], 0)[0]')) -- Running? local expected2 = { stream = 'job', id = 4, - argv = ( - is_os('win') and { - eval('&shell'), - '/s', - '/c', - fmt('"%s -u NONE -i NONE"', progpath_esc), - } or { - eval('&shell'), - eval('&shellcmdflag'), - fmt('%s -u NONE -i NONE', progpath_esc), - } - ), + argv = (is_os('win') and { + eval('&shell'), + '/s', + '/c', + fmt('"%s -u NONE -i NONE"', progpath_esc), + } or { + eval('&shell'), + eval('&shellcmdflag'), + fmt('%s -u NONE -i NONE', progpath_esc), + }), mode = 'terminal', buffer = 2, pty = '?', @@ -2388,74 +2558,82 @@ describe('API', function() -- :terminal with args + stopped process. eq(1, eval('jobstop(&channel)')) - eval('jobwait([&channel], 1000)') -- Wait. - expected2.pty = (is_os('win') and '?' or '') -- pty stream was closed. + eval('jobwait([&channel], 1000)') -- Wait. + expected2.pty = (is_os('win') and '?' or '') -- pty stream was closed. eq(expected2, eval('nvim_get_chan_info(&channel)')) end) end) describe('nvim_call_atomic', function() it('works', function() - meths.buf_set_lines(0, 0, -1, true, {'first'}) + meths.buf_set_lines(0, 0, -1, true, { 'first' }) local req = { - {'nvim_get_current_line', {}}, - {'nvim_set_current_line', {'second'}}, + { 'nvim_get_current_line', {} }, + { 'nvim_set_current_line', { 'second' } }, } - eq({{'first', NIL}, NIL}, meths.call_atomic(req)) - eq({'second'}, meths.buf_get_lines(0, 0, -1, true)) + eq({ { 'first', NIL }, NIL }, meths.call_atomic(req)) + eq({ 'second' }, meths.buf_get_lines(0, 0, -1, true)) end) it('allows multiple return values', function() local req = { - {'nvim_set_var', {'avar', true}}, - {'nvim_set_var', {'bvar', 'string'}}, - {'nvim_get_var', {'avar'}}, - {'nvim_get_var', {'bvar'}}, + { 'nvim_set_var', { 'avar', true } }, + { 'nvim_set_var', { 'bvar', 'string' } }, + { 'nvim_get_var', { 'avar' } }, + { 'nvim_get_var', { 'bvar' } }, } - eq({{NIL, NIL, true, 'string'}, NIL}, meths.call_atomic(req)) + eq({ { NIL, NIL, true, 'string' }, NIL }, meths.call_atomic(req)) end) it('is aborted by errors in call', function() local error_types = meths.get_api_info()[2].error_types local req = { - {'nvim_set_var', {'one', 1}}, - {'nvim_buf_set_lines', {}}, - {'nvim_set_var', {'two', 2}}, + { 'nvim_set_var', { 'one', 1 } }, + { 'nvim_buf_set_lines', {} }, + { 'nvim_set_var', { 'two', 2 } }, } - eq({{NIL}, {1, error_types.Exception.id, - 'Wrong number of arguments: expecting 5 but got 0'}}, - meths.call_atomic(req)) + eq({ + { NIL }, + { + 1, + error_types.Exception.id, + 'Wrong number of arguments: expecting 5 but got 0', + }, + }, meths.call_atomic(req)) eq(1, meths.get_var('one')) eq(false, pcall(meths.get_var, 'two')) -- still returns all previous successful calls req = { - {'nvim_set_var', {'avar', 5}}, - {'nvim_set_var', {'bvar', 'string'}}, - {'nvim_get_var', {'avar'}}, - {'nvim_buf_get_lines', {0, 10, 20, true}}, - {'nvim_get_var', {'bvar'}}, + { 'nvim_set_var', { 'avar', 5 } }, + { 'nvim_set_var', { 'bvar', 'string' } }, + { 'nvim_get_var', { 'avar' } }, + { 'nvim_buf_get_lines', { 0, 10, 20, true } }, + { 'nvim_get_var', { 'bvar' } }, } - eq({{NIL, NIL, 5}, {3, error_types.Validation.id, 'Index out of bounds'}}, - meths.call_atomic(req)) + eq( + { { NIL, NIL, 5 }, { 3, error_types.Validation.id, 'Index out of bounds' } }, + meths.call_atomic(req) + ) req = { - {'i_am_not_a_method', {'xx'}}, - {'nvim_set_var', {'avar', 10}}, + { 'i_am_not_a_method', { 'xx' } }, + { 'nvim_set_var', { 'avar', 10 } }, } - eq({{}, {0, error_types.Exception.id, 'Invalid method: i_am_not_a_method'}}, - meths.call_atomic(req)) + eq( + { {}, { 0, error_types.Exception.id, 'Invalid method: i_am_not_a_method' } }, + meths.call_atomic(req) + ) eq(5, meths.get_var('avar')) end) it('validation', function() local req = { - {'nvim_set_var', {'avar', 1}}, - {'nvim_set_var'}, - {'nvim_set_var', {'avar', 2}}, + { 'nvim_set_var', { 'avar', 1 } }, + { 'nvim_set_var' }, + { 'nvim_set_var', { 'avar', 2 } }, } - eq("Invalid 'calls' item: expected 2-item Array", - pcall_err(meths.call_atomic, req)) + eq("Invalid 'calls' item: expected 2-item Array", pcall_err(meths.call_atomic, req)) -- call before was done, but not after eq(1, meths.get_var('avar')) @@ -2463,27 +2641,25 @@ describe('API', function() { 'nvim_set_var', { 'bvar', { 2, 3 } } }, 12, } - eq("Invalid 'calls' item: expected Array, got Integer", - pcall_err(meths.call_atomic, req)) - eq({2,3}, meths.get_var('bvar')) + eq("Invalid 'calls' item: expected Array, got Integer", pcall_err(meths.call_atomic, req)) + eq({ 2, 3 }, meths.get_var('bvar')) req = { - {'nvim_set_current_line', 'little line'}, - {'nvim_set_var', {'avar', 3}}, + { 'nvim_set_current_line', 'little line' }, + { 'nvim_set_var', { 'avar', 3 } }, } - eq("Invalid call args: expected Array, got String", - pcall_err(meths.call_atomic, req)) + eq('Invalid call args: expected Array, got String', pcall_err(meths.call_atomic, req)) -- call before was done, but not after eq(1, meths.get_var('avar')) - eq({''}, meths.buf_get_lines(0, 0, -1, true)) + eq({ '' }, meths.buf_get_lines(0, 0, -1, true)) end) end) describe('nvim_list_runtime_paths', function() setup(function() local pathsep = helpers.get_pathsep() - mkdir_p('Xtest'..pathsep..'a') - mkdir_p('Xtest'..pathsep..'b') + mkdir_p('Xtest' .. pathsep .. 'a') + mkdir_p('Xtest' .. pathsep .. 'b') end) teardown(function() rmdir 'Xtest' @@ -2498,22 +2674,22 @@ describe('API', function() end) it('returns single runtimepath', function() meths.set_option_value('runtimepath', 'a', {}) - eq({'a'}, meths.list_runtime_paths()) + eq({ 'a' }, meths.list_runtime_paths()) end) it('returns two runtimepaths', function() meths.set_option_value('runtimepath', 'a,b', {}) - eq({'a', 'b'}, meths.list_runtime_paths()) + eq({ 'a', 'b' }, meths.list_runtime_paths()) end) it('returns empty strings when appropriate', function() meths.set_option_value('runtimepath', 'a,,b', {}) - eq({'a', '', 'b'}, meths.list_runtime_paths()) + eq({ 'a', '', 'b' }, meths.list_runtime_paths()) meths.set_option_value('runtimepath', ',a,b', {}) - eq({'', 'a', 'b'}, meths.list_runtime_paths()) + eq({ '', 'a', 'b' }, meths.list_runtime_paths()) -- Trailing "," is ignored. Use ",," if you really really want CWD. meths.set_option_value('runtimepath', 'a,b,', {}) - eq({'a', 'b'}, meths.list_runtime_paths()) + eq({ 'a', 'b' }, meths.list_runtime_paths()) meths.set_option_value('runtimepath', 'a,b,,', {}) - eq({'a', 'b', ''}, meths.list_runtime_paths()) + eq({ 'a', 'b', '' }, meths.list_runtime_paths()) end) it('truncates too long paths', function() local long_path = ('/a'):rep(8192) @@ -2530,16 +2706,19 @@ describe('API', function() end) it('does not truncate error message <1 MB #5984', function() - local very_long_name = 'A'..('x'):rep(10000)..'Z' + local very_long_name = 'A' .. ('x'):rep(10000) .. 'Z' local status, err = pcall(nvim, 'get_option_value', very_long_name, {}) eq(false, status) eq(very_long_name, err:match('Ax+Z?')) end) - it("does not leak memory on incorrect argument types", function() - local status, err = pcall(nvim, 'set_current_dir',{'not', 'a', 'dir'}) + it('does not leak memory on incorrect argument types', function() + local status, err = pcall(nvim, 'set_current_dir', { 'not', 'a', 'dir' }) eq(false, status) - ok(err:match(': Wrong type for argument 1 when calling nvim_set_current_dir, expecting String') ~= nil) + ok( + err:match(': Wrong type for argument 1 when calling nvim_set_current_dir, expecting String') + ~= nil + ) end) describe('nvim_parse_expression', function() @@ -2558,21 +2737,26 @@ describe('API', function() end local typ = east_api_node.type if typ == 'Register' then - typ = typ .. ('(name=%s)'):format( - tostring(intchar2lua(east_api_node.name))) + typ = typ .. ('(name=%s)'):format(tostring(intchar2lua(east_api_node.name))) east_api_node.name = nil elseif typ == 'PlainIdentifier' then - typ = typ .. ('(scope=%s,ident=%s)'):format( - tostring(intchar2lua(east_api_node.scope)), east_api_node.ident) + typ = typ + .. ('(scope=%s,ident=%s)'):format( + tostring(intchar2lua(east_api_node.scope)), + east_api_node.ident + ) east_api_node.scope = nil east_api_node.ident = nil elseif typ == 'PlainKey' then typ = typ .. ('(key=%s)'):format(east_api_node.ident) east_api_node.ident = nil elseif typ == 'Comparison' then - typ = typ .. ('(type=%s,inv=%u,ccs=%s)'):format( - east_api_node.cmp_type, east_api_node.invert and 1 or 0, - east_api_node.ccs_strategy) + typ = typ + .. ('(type=%s,inv=%u,ccs=%s)'):format( + east_api_node.cmp_type, + east_api_node.invert and 1 or 0, + east_api_node.ccs_strategy + ) east_api_node.ccs_strategy = nil east_api_node.cmp_type = nil east_api_node.invert = nil @@ -2589,7 +2773,8 @@ describe('API', function() typ = ('%s(scope=%s,ident=%s)'):format( typ, tostring(intchar2lua(east_api_node.scope)), - east_api_node.ident) + east_api_node.ident + ) east_api_node.ident = nil east_api_node.scope = nil elseif typ == 'Environment' then @@ -2597,24 +2782,30 @@ describe('API', function() east_api_node.ident = nil elseif typ == 'Assignment' then local aug = east_api_node.augmentation - if aug == '' then aug = 'Plain' end + if aug == '' then + aug = 'Plain' + end typ = ('%s(%s)'):format(typ, aug) east_api_node.augmentation = nil end typ = ('%s:%u:%u:%s'):format( - typ, east_api_node.start[1], east_api_node.start[2], - line:sub(east_api_node.start[2] + 1, - east_api_node.start[2] + 1 + east_api_node.len - 1)) + typ, + east_api_node.start[1], + east_api_node.start[2], + line:sub(east_api_node.start[2] + 1, east_api_node.start[2] + 1 + east_api_node.len - 1) + ) assert(east_api_node.start[2] + east_api_node.len - 1 <= #line) for k, _ in pairs(east_api_node.start) do - assert(({true, true})[k]) + assert(({ true, true })[k]) end east_api_node.start = nil east_api_node.type = nil east_api_node.len = nil local can_simplify = true for _, _ in pairs(east_api_node) do - if can_simplify then can_simplify = false end + if can_simplify then + can_simplify = false + end end if can_simplify then return typ @@ -2631,7 +2822,7 @@ describe('API', function() east_api.err.message = nil end if east_api.ast then - east_api.ast = {simplify_east_api_node(line, east_api.ast)} + east_api.ast = { simplify_east_api_node(line, east_api.ast) } if #east_api.ast == 0 then east_api.ast = nil end @@ -2643,26 +2834,21 @@ describe('API', function() end local function simplify_east_hl(line, east_hl) for i, v in ipairs(east_hl) do - east_hl[i] = ('%s:%u:%u:%s'):format( - v[4], - v[1], - v[2], - line:sub(v[2] + 1, v[3])) + east_hl[i] = ('%s:%u:%u:%s'):format(v[4], v[1], v[2], line:sub(v[2] + 1, v[3])) end return east_hl end local FLAGS_TO_STR = { - [0] = "", - [1] = "m", - [2] = "E", - [3] = "mE", - [4] = "l", - [5] = "lm", - [6] = "lE", - [7] = "lmE", + [0] = '', + [1] = 'm', + [2] = 'E', + [3] = 'mE', + [4] = 'l', + [5] = 'lm', + [6] = 'lE', + [7] = 'lmE', } - local function _check_parsing(opts, str, exp_ast, exp_highlighting_fs, - nz_flags_exps) + local function _check_parsing(opts, str, exp_ast, exp_highlighting_fs, nz_flags_exps) if type(str) ~= 'string' then return end @@ -2703,37 +2889,39 @@ describe('API', function() end) if not err then if type(msg) == 'table' then - local merr, new_msg = pcall( - format_string, 'table error:\n%s\n\n(%r)', msg.message, msg) + local merr, new_msg = pcall(format_string, 'table error:\n%s\n\n(%r)', msg.message, msg) if merr then msg = new_msg else - msg = format_string('table error without .message:\n(%r)', - msg) + msg = format_string('table error without .message:\n(%r)', msg) end elseif type(msg) ~= 'string' then msg = format_string('non-string non-table error:\n%r', msg) end - error(format_string('Error while processing test (%r, %s):\n%s', - str, FLAGS_TO_STR[flags], msg)) + error( + format_string( + 'Error while processing test (%r, %s):\n%s', + str, + FLAGS_TO_STR[flags], + msg + ) + ) end end end local function hl(group, str, shift) return function(next_col) local col = next_col + (shift or 0) - return (('%s:%u:%u:%s'):format( - 'Nvim' .. group, - 0, - col, - str)), (col + #str) + return (('%s:%u:%u:%s'):format('Nvim' .. group, 0, col, str)), (col + #str) end end local function fmtn(typ, args, rest) - if (typ == 'UnknownFigure' - or typ == 'DictLiteral' - or typ == 'CurlyBracesIdentifier' - or typ == 'Lambda') then + if + typ == 'UnknownFigure' + or typ == 'DictLiteral' + or typ == 'CurlyBracesIdentifier' + or typ == 'Lambda' + then return ('%s%s'):format(typ, rest) elseif typ == 'DoubleQuotedString' or typ == 'SingleQuotedString' then if args:sub(-4) == 'NULL' then @@ -2742,18 +2930,17 @@ describe('API', function() return ('%s(%s)%s'):format(typ, args, rest) end end - require('test.unit.viml.expressions.parser_tests')( - it, _check_parsing, hl, fmtn) + require('test.unit.viml.expressions.parser_tests')(it, _check_parsing, hl, fmtn) end) describe('nvim_list_uis', function() it('returns empty if --headless', function() -- Test runner defaults to --headless. - eq({}, nvim("list_uis")) + eq({}, nvim('list_uis')) end) it('returns attached UIs', function() local screen = Screen.new(20, 4) - screen:attach({override=true}) + screen:attach({ override = true }) local expected = { { chan = 1, @@ -2775,10 +2962,10 @@ describe('API', function() term_colors = 0, term_name = '', width = 20, - } + }, } - eq(expected, nvim("list_uis")) + eq(expected, nvim('list_uis')) screen:detach() screen = Screen.new(44, 99) @@ -2787,64 +2974,69 @@ describe('API', function() expected[1].override = false expected[1].width = 44 expected[1].height = 99 - eq(expected, nvim("list_uis")) + eq(expected, nvim('list_uis')) end) end) describe('nvim_create_namespace', function() it('works', function() eq({}, meths.get_namespaces()) - eq(1, meths.create_namespace("ns-1")) - eq(2, meths.create_namespace("ns-2")) - eq(1, meths.create_namespace("ns-1")) - eq({["ns-1"]=1, ["ns-2"]=2}, meths.get_namespaces()) - eq(3, meths.create_namespace("")) - eq(4, meths.create_namespace("")) - eq({["ns-1"]=1, ["ns-2"]=2}, meths.get_namespaces()) + eq(1, meths.create_namespace('ns-1')) + eq(2, meths.create_namespace('ns-2')) + eq(1, meths.create_namespace('ns-1')) + eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, meths.get_namespaces()) + eq(3, meths.create_namespace('')) + eq(4, meths.create_namespace('')) + eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, meths.get_namespaces()) end) end) describe('nvim_create_buf', function() it('works', function() - eq({id=2}, meths.create_buf(true, false)) - eq({id=3}, meths.create_buf(false, false)) - eq(' 1 %a "[No Name]" line 1\n'.. - ' 2 h "[No Name]" line 0', - meths.command_output("ls")) + eq({ id = 2 }, meths.create_buf(true, false)) + eq({ id = 3 }, meths.create_buf(false, false)) + eq( + ' 1 %a "[No Name]" line 1\n' + .. ' 2 h "[No Name]" line 0', + meths.command_output('ls') + ) -- current buffer didn't change - eq({id=1}, meths.get_current_buf()) + eq({ id = 1 }, meths.get_current_buf()) local screen = Screen.new(20, 4) screen:attach() - meths.buf_set_lines(2, 0, -1, true, {"some text"}) + meths.buf_set_lines(2, 0, -1, true, { 'some text' }) meths.set_current_buf(2) - screen:expect([[ + screen:expect( + [[ ^some text | {1:~ }|*2 | - ]], { - [1] = {bold = true, foreground = Screen.colors.Blue1}, - }) + ]], + { + [1] = { bold = true, foreground = Screen.colors.Blue1 }, + } + ) end) it('can change buftype before visiting', function() - meths.set_option_value("hidden", false, {}) - eq({id=2}, meths.create_buf(true, false)) - meths.set_option_value("buftype", "nofile", {buf=2}) - meths.buf_set_lines(2, 0, -1, true, {"test text"}) - command("split | buffer 2") - eq({id=2}, meths.get_current_buf()) + meths.set_option_value('hidden', false, {}) + eq({ id = 2 }, meths.create_buf(true, false)) + meths.set_option_value('buftype', 'nofile', { buf = 2 }) + meths.buf_set_lines(2, 0, -1, true, { 'test text' }) + command('split | buffer 2') + eq({ id = 2 }, meths.get_current_buf()) -- if the buf_set_option("buftype") didn't work, this would error out. - command("close") - eq({id=1}, meths.get_current_buf()) + command('close') + eq({ id = 1 }, meths.get_current_buf()) end) - it("does not trigger BufEnter, BufWinEnter", function() - command("let g:fired = v:false") - command("au BufEnter,BufWinEnter * let g:fired = v:true") + it('does not trigger BufEnter, BufWinEnter', function() + command('let g:fired = v:false') + command('au BufEnter,BufWinEnter * let g:fired = v:true') - eq({id=2}, meths.create_buf(true, false)) - meths.buf_set_lines(2, 0, -1, true, {"test", "text"}) + eq({ id = 2 }, meths.create_buf(true, false)) + meths.buf_set_lines(2, 0, -1, true, { 'test', 'text' }) eq(false, eval('g:fired')) end) @@ -2852,7 +3044,7 @@ describe('API', function() it('TextChanged and TextChangedI do not trigger without changes', function() local buf = meths.create_buf(true, false) command([[let g:changed = '']]) - meths.create_autocmd({'TextChanged', 'TextChangedI'}, { + meths.create_autocmd({ 'TextChanged', 'TextChangedI' }, { buffer = buf, command = 'let g:changed ..= mode()', }) @@ -2862,20 +3054,22 @@ describe('API', function() end) it('scratch-buffer', function() - eq({id=2}, meths.create_buf(false, true)) - eq({id=3}, meths.create_buf(true, true)) - eq({id=4}, meths.create_buf(true, true)) + eq({ id = 2 }, meths.create_buf(false, true)) + eq({ id = 3 }, meths.create_buf(true, true)) + eq({ id = 4 }, meths.create_buf(true, true)) local scratch_bufs = { 2, 3, 4 } - eq(' 1 %a "[No Name]" line 1\n'.. - ' 3 h "[Scratch]" line 0\n'.. - ' 4 h "[Scratch]" line 0', - exec_capture('ls')) + eq( + ' 1 %a "[No Name]" line 1\n' + .. ' 3 h "[Scratch]" line 0\n' + .. ' 4 h "[Scratch]" line 0', + exec_capture('ls') + ) -- current buffer didn't change - eq({id=1}, meths.get_current_buf()) + eq({ id = 1 }, meths.get_current_buf()) local screen = Screen.new(20, 4) screen:set_default_attr_ids({ - [1] = {bold = true, foreground = Screen.colors.Blue1}, + [1] = { bold = true, foreground = Screen.colors.Blue1 }, }) screen:attach() @@ -2883,12 +3077,12 @@ describe('API', function() -- Editing a scratch-buffer does NOT change its properties. -- local edited_buf = 2 - meths.buf_set_lines(edited_buf, 0, -1, true, {"some text"}) - for _,b in ipairs(scratch_bufs) do - eq('nofile', meths.get_option_value('buftype', {buf=b})) - eq('hide', meths.get_option_value('bufhidden', {buf=b})) - eq(false, meths.get_option_value('swapfile', {buf=b})) - eq(false, meths.get_option_value('modeline', {buf=b})) + meths.buf_set_lines(edited_buf, 0, -1, true, { 'some text' }) + for _, b in ipairs(scratch_bufs) do + eq('nofile', meths.get_option_value('buftype', { buf = b })) + eq('hide', meths.get_option_value('bufhidden', { buf = b })) + eq(false, meths.get_option_value('swapfile', { buf = b })) + eq(false, meths.get_option_value('modeline', { buf = b })) end -- @@ -2900,10 +3094,10 @@ describe('API', function() {1:~ }|*2 | ]]) - eq('nofile', meths.get_option_value('buftype', {buf=edited_buf})) - eq('hide', meths.get_option_value('bufhidden', {buf=edited_buf})) - eq(false, meths.get_option_value('swapfile', {buf=edited_buf})) - eq(false, meths.get_option_value('modeline', {buf=edited_buf})) + eq('nofile', meths.get_option_value('buftype', { buf = edited_buf })) + eq('hide', meths.get_option_value('bufhidden', { buf = edited_buf })) + eq(false, meths.get_option_value('swapfile', { buf = edited_buf })) + eq(false, meths.get_option_value('modeline', { buf = edited_buf })) -- Scratch buffer can be wiped without error. command('bwipe') @@ -2925,51 +3119,55 @@ describe('API', function() describe('nvim_get_runtime_file', function() local p = helpers.alter_slashes it('can find files', function() - eq({}, meths.get_runtime_file("bork.borkbork", false)) - eq({}, meths.get_runtime_file("bork.borkbork", true)) - eq(1, #meths.get_runtime_file("autoload/msgpack.vim", false)) - eq(1, #meths.get_runtime_file("autoload/msgpack.vim", true)) - local val = meths.get_runtime_file("autoload/remote/*.vim", true) + eq({}, meths.get_runtime_file('bork.borkbork', false)) + eq({}, meths.get_runtime_file('bork.borkbork', true)) + eq(1, #meths.get_runtime_file('autoload/msgpack.vim', false)) + eq(1, #meths.get_runtime_file('autoload/msgpack.vim', true)) + local val = meths.get_runtime_file('autoload/remote/*.vim', true) eq(2, #val) - if endswith(val[1], "define.vim") then - ok(endswith(val[1], p"autoload/remote/define.vim")) - ok(endswith(val[2], p"autoload/remote/host.vim")) + if endswith(val[1], 'define.vim') then + ok(endswith(val[1], p 'autoload/remote/define.vim')) + ok(endswith(val[2], p 'autoload/remote/host.vim')) else - ok(endswith(val[1], p"autoload/remote/host.vim")) - ok(endswith(val[2], p"autoload/remote/define.vim")) + ok(endswith(val[1], p 'autoload/remote/host.vim')) + ok(endswith(val[2], p 'autoload/remote/define.vim')) end - val = meths.get_runtime_file("autoload/remote/*.vim", false) + val = meths.get_runtime_file('autoload/remote/*.vim', false) eq(1, #val) - ok(endswith(val[1], p"autoload/remote/define.vim") - or endswith(val[1], p"autoload/remote/host.vim")) + ok( + endswith(val[1], p 'autoload/remote/define.vim') + or endswith(val[1], p 'autoload/remote/host.vim') + ) - val = meths.get_runtime_file("lua", true) + val = meths.get_runtime_file('lua', true) eq(1, #val) - ok(endswith(val[1], p"lua")) + ok(endswith(val[1], p 'lua')) - val = meths.get_runtime_file("lua/vim", true) + val = meths.get_runtime_file('lua/vim', true) eq(1, #val) - ok(endswith(val[1], p"lua/vim")) + ok(endswith(val[1], p 'lua/vim')) end) it('can find directories', function() - local val = meths.get_runtime_file("lua/", true) + local val = meths.get_runtime_file('lua/', true) eq(1, #val) - ok(endswith(val[1], p"lua/")) + ok(endswith(val[1], p 'lua/')) - val = meths.get_runtime_file("lua/vim/", true) + val = meths.get_runtime_file('lua/vim/', true) eq(1, #val) - ok(endswith(val[1], p"lua/vim/")) + ok(endswith(val[1], p 'lua/vim/')) - eq({}, meths.get_runtime_file("foobarlang/", true)) + eq({}, meths.get_runtime_file('foobarlang/', true)) end) it('can handle bad patterns', function() skip(is_os('win')) - eq("Vim:E220: Missing }.", pcall_err(meths.get_runtime_file, "{", false)) + eq('Vim:E220: Missing }.', pcall_err(meths.get_runtime_file, '{', false)) - eq('Vim(echo):E5555: API call: Vim:E220: Missing }.', - exc_exec("echo nvim_get_runtime_file('{', v:false)")) + eq( + 'Vim(echo):E5555: API call: Vim:E220: Missing }.', + exc_exec("echo nvim_get_runtime_file('{', v:false)") + ) end) end) @@ -2979,11 +3177,11 @@ describe('API', function() neq(nil, options_info.listchars) neq(nil, options_info.tabstop) - eq(meths.get_option_info'winhighlight', options_info.winhighlight) + eq(meths.get_option_info 'winhighlight', options_info.winhighlight) end) it('should not crash when echoed', function() - meths.exec2("echo nvim_get_all_options_info()", { output = true }) + meths.exec2('echo nvim_get_all_options_info()', { output = true }) end) end) @@ -2993,43 +3191,43 @@ describe('API', function() end) it('should return the same options for short and long name', function() - eq(meths.get_option_info'winhl', meths.get_option_info'winhighlight') + eq(meths.get_option_info 'winhl', meths.get_option_info 'winhighlight') end) it('should have information about window options', function() eq({ allows_duplicates = false, - commalist = true; - default = ""; - flaglist = false; - global_local = false; - last_set_chan = 0; - last_set_linenr = 0; - last_set_sid = 0; - name = "winhighlight"; - scope = "win"; - shortname = "winhl"; - type = "string"; - was_set = false; - }, meths.get_option_info'winhl') + commalist = true, + default = '', + flaglist = false, + global_local = false, + last_set_chan = 0, + last_set_linenr = 0, + last_set_sid = 0, + name = 'winhighlight', + scope = 'win', + shortname = 'winhl', + type = 'string', + was_set = false, + }, meths.get_option_info 'winhl') end) it('should have information about buffer options', function() eq({ allows_duplicates = true, commalist = false, - default = "", + default = '', flaglist = false, global_local = false, last_set_chan = 0, last_set_linenr = 0, last_set_sid = 0, - name = "filetype", - scope = "buf", - shortname = "ft", - type = "string", - was_set = false - }, meths.get_option_info'filetype') + name = 'filetype', + scope = 'buf', + shortname = 'ft', + type = 'string', + was_set = false, + }, meths.get_option_info 'filetype') end) it('should have information about global options', function() @@ -3046,12 +3244,12 @@ describe('API', function() last_set_chan = 0, last_set_linenr = 0, last_set_sid = -2, - name = "showcmd", - scope = "global", - shortname = "sc", - type = "boolean", - was_set = true - }, meths.get_option_info'showcmd') + name = 'showcmd', + scope = 'global', + shortname = 'sc', + type = 'boolean', + was_set = true, + }, meths.get_option_info 'showcmd') meths.set_option_value('showcmd', true, {}) @@ -3064,12 +3262,12 @@ describe('API', function() last_set_chan = 1, last_set_linenr = 0, last_set_sid = -9, - name = "showcmd", - scope = "global", - shortname = "sc", - type = "boolean", - was_set = true - }, meths.get_option_info'showcmd') + name = 'showcmd', + scope = 'global', + shortname = 'sc', + type = 'boolean', + was_set = true, + }, meths.get_option_info 'showcmd') end) end) @@ -3080,7 +3278,9 @@ describe('API', function() before_each(function() fname = tmpname() - write_file(fname, [[ + write_file( + fname, + [[ setglobal dictionary=mydict " 1, global-local (buffer) setlocal formatprg=myprg " 2, global-local (buffer) setglobal equalprg=prg1 " 3, global-local (buffer) @@ -3090,7 +3290,8 @@ describe('API', function() setglobal showbreak=aaa " 7, global-local (window) setlocal showbreak=bbb " 8, global-local (window) setglobal completeopt=menu " 9, global - ]]) + ]] + ) exec_lua 'vim.cmd.vsplit()' meths.create_buf(false, false) @@ -3112,12 +3313,13 @@ describe('API', function() end) it('should return option information', function() - eq(meths.get_option_info('dictionary'), meths.get_option_info2('dictionary', {})) -- buffer - eq(meths.get_option_info('fillchars'), meths.get_option_info2('fillchars', {})) -- window + eq(meths.get_option_info('dictionary'), meths.get_option_info2('dictionary', {})) -- buffer + eq(meths.get_option_info('fillchars'), meths.get_option_info2('fillchars', {})) -- window eq(meths.get_option_info('completeopt'), meths.get_option_info2('completeopt', {})) -- global end) describe('last set', function() + -- stylua: ignore local tests = { {desc="(buf option, global requested, global set) points to global", linenr=1, sid=1, args={'dictionary', {scope='global'}}}, {desc="(buf option, global requested, local set) is not set", linenr=0, sid=0, args={'formatprg', {scope='global'}}}, @@ -3153,13 +3355,13 @@ describe('API', function() end it('is provided for cross-buffer requests', function() - local info = meths.get_option_info2('formatprg', {buf=bufs[2].id}) + local info = meths.get_option_info2('formatprg', { buf = bufs[2].id }) eq(2, info.last_set_linenr) eq(1, info.last_set_sid) end) it('is provided for cross-window requests', function() - local info = meths.get_option_info2('listchars', {win=wins[2].id}) + local info = meths.get_option_info2('listchars', { win = wins[2].id }) eq(6, info.last_set_linenr) eq(1, info.last_set_sid) end) @@ -3173,11 +3375,11 @@ describe('API', function() screen = Screen.new(40, 8) screen:attach() screen:set_default_attr_ids({ - [0] = {bold = true, foreground = Screen.colors.Blue}, - [1] = {bold = true, foreground = Screen.colors.SeaGreen}, - [2] = {bold = true, reverse = true}, - [3] = {foreground = Screen.colors.Brown, bold = true}, -- Statement - [4] = {foreground = Screen.colors.SlateBlue}, -- Special + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { bold = true, foreground = Screen.colors.SeaGreen }, + [2] = { bold = true, reverse = true }, + [3] = { foreground = Screen.colors.Brown, bold = true }, -- Statement + [4] = { foreground = Screen.colors.SlateBlue }, -- Special }) command('highlight Statement gui=bold guifg=Brown') command('highlight Special guifg=SlateBlue') @@ -3185,48 +3387,58 @@ describe('API', function() it('should clear cmdline message before echo', function() feed(':call nvim_echo([["msg"]], v:false, {})<CR>') - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {0:~ }|*6 msg | - ]]} + ]], + } end) it('can show highlighted line', function() - nvim_async("echo", {{"msg_a"}, {"msg_b", "Statement"}, {"msg_c", "Special"}}, true, {}) - screen:expect{grid=[[ + nvim_async( + 'echo', + { { 'msg_a' }, { 'msg_b', 'Statement' }, { 'msg_c', 'Special' } }, + true, + {} + ) + screen:expect { + grid = [[ ^ | {0:~ }|*6 msg_a{3:msg_b}{4:msg_c} | - ]]} + ]], + } end) it('can show highlighted multiline', function() - nvim_async("echo", {{"msg_a\nmsg_a", "Statement"}, {"msg_b", "Special"}}, true, {}) - screen:expect{grid=[[ + nvim_async('echo', { { 'msg_a\nmsg_a', 'Statement' }, { 'msg_b', 'Special' } }, true, {}) + screen:expect { + grid = [[ | {0:~ }|*3 {2: }| {3:msg_a} | {3:msg_a}{4:msg_b} | {1:Press ENTER or type command to continue}^ | - ]]} + ]], + } end) it('can save message history', function() nvim('command', 'set cmdheight=2') -- suppress Press ENTER - nvim("echo", {{"msg\nmsg"}, {"msg"}}, true, {}) - eq("msg\nmsgmsg", exec_capture('messages')) + nvim('echo', { { 'msg\nmsg' }, { 'msg' } }, true, {}) + eq('msg\nmsgmsg', exec_capture('messages')) end) it('can disable saving message history', function() nvim('command', 'set cmdheight=2') -- suppress Press ENTER - nvim_async("echo", {{"msg\nmsg"}, {"msg"}}, false, {}) - eq("", exec_capture('messages')) + nvim_async('echo', { { 'msg\nmsg' }, { 'msg' } }, false, {}) + eq('', exec_capture('messages')) end) end) - describe('nvim_open_term', function() local screen @@ -3234,24 +3446,33 @@ describe('API', function() screen = Screen.new(100, 35) screen:attach() screen:set_default_attr_ids({ - [0] = {bold=true, foreground=Screen.colors.Blue}, - [1] = {background = Screen.colors.Plum1}; - [2] = {background = tonumber('0xffff40'), bg_indexed = true}; - [3] = {background = Screen.colors.Plum1, fg_indexed = true, foreground = tonumber('0x00e000')}; - [4] = {bold = true, reverse = true, background = Screen.colors.Plum1}; - [5] = {foreground = Screen.colors.Blue, background = Screen.colors.LightMagenta, bold = true}; - [6] = {bold = true}; - [7] = {reverse = true, background = Screen.colors.LightMagenta}; + [0] = { bold = true, foreground = Screen.colors.Blue }, + [1] = { background = Screen.colors.Plum1 }, + [2] = { background = tonumber('0xffff40'), bg_indexed = true }, + [3] = { + background = Screen.colors.Plum1, + fg_indexed = true, + foreground = tonumber('0x00e000'), + }, + [4] = { bold = true, reverse = true, background = Screen.colors.Plum1 }, + [5] = { + foreground = Screen.colors.Blue, + background = Screen.colors.LightMagenta, + bold = true, + }, + [6] = { bold = true }, + [7] = { reverse = true, background = Screen.colors.LightMagenta }, }) end) it('can batch process sequences', function() - local b = meths.create_buf(true,true) - meths.open_win(b, false, {width=79, height=31, row=1, col=1, relative='editor'}) + local b = meths.create_buf(true, true) + meths.open_win(b, false, { width = 79, height = 31, row = 1, col = 1, relative = 'editor' }) local t = meths.open_term(b, {}) - meths.chan_send(t, io.open("test/functional/fixtures/smile2.cat", "r"):read("*a")) - screen:expect{grid=[[ + meths.chan_send(t, io.open('test/functional/fixtures/smile2.cat', 'r'):read('*a')) + screen:expect { + grid = [[ ^ | {0:~}{1::smile }{0: }| {0:~}{1: }{2:oooo$$$$$$$$$$$$oooo}{1: }{0: }| @@ -3286,12 +3507,15 @@ describe('API', function() {0:~}{1::call nvim__screenshot("smile2.cat") }{0: }| {0:~ }|*2 | - ]]} + ]], + } end) it('can handle input', function() screen:try_resize(50, 10) - eq({3, 2}, exec_lua [[ + eq( + { 3, 2 }, + exec_lua [[ buf = vim.api.nvim_create_buf(1,1) stream = '' @@ -3307,49 +3531,56 @@ describe('API', function() term = vim.api.nvim_open_term(buf, {on_input=input}) vim.api.nvim_open_win(buf, true, {width=40, height=5, row=1, col=1, relative='editor'}) return {term, buf} - ]]) + ]] + ) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~}{1:^ }{0: }| {0:~}{1: }{0: }|*4 {0:~ }|*3 | - ]]} + ]], + } feed 'iba<c-x>bla' - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~}{7: }{1: }{0: }| {0:~}{1: }{0: }|*4 {0:~ }|*3 {6:-- TERMINAL --} | - ]]} + ]], + } eq('ba\024bla', exec_lua [[ return stream ]]) - eq({3,2}, exec_lua [[ return vals ]]) + eq({ 3, 2 }, exec_lua [[ return vals ]]) exec_lua [[ do_the_echo = true ]] feed 'herrejösses!' - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~}{1:herrejösses!}{7: }{1: }{0: }| {0:~}{1: }{0: }|*4 {0:~ }|*3 {6:-- TERMINAL --} | - ]]} + ]], + } eq('ba\024blaherrejösses!', exec_lua [[ return stream ]]) end) end) describe('nvim_del_mark', function() it('works', function() - local buf = meths.create_buf(false,true) - meths.buf_set_lines(buf, -1, -1, true, {'a', 'bit of', 'text'}) + local buf = meths.create_buf(false, true) + meths.buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) eq(true, meths.buf_set_mark(buf, 'F', 2, 2, {})) eq(true, meths.del_mark('F')) - eq({0, 0}, meths.buf_get_mark(buf, 'F')) + eq({ 0, 0 }, meths.buf_get_mark(buf, 'F')) end) it('validation', function() eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(meths.del_mark, 'f')) @@ -3359,14 +3590,14 @@ describe('API', function() end) describe('nvim_get_mark', function() it('works', function() - local buf = meths.create_buf(false,true) - meths.buf_set_lines(buf, -1, -1, true, {'a', 'bit of', 'text'}) + local buf = meths.create_buf(false, true) + meths.buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) meths.buf_set_mark(buf, 'F', 2, 2, {}) - meths.buf_set_name(buf, "mybuf") + meths.buf_set_name(buf, 'mybuf') local mark = meths.get_mark('F', {}) -- Compare the path tail only - assert(string.find(mark[4], "mybuf$")) - eq({2, 2, buf.id, mark[4]}, mark) + assert(string.find(mark[4], 'mybuf$')) + eq({ 2, 2, buf.id, mark[4] }, mark) end) it('validation', function() eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(meths.get_mark, 'f', {})) @@ -3375,17 +3606,17 @@ describe('API', function() end) it('returns the expected when mark is not set', function() eq(true, meths.del_mark('A')) - eq({0, 0, 0, ''}, meths.get_mark('A', {})) + eq({ 0, 0, 0, '' }, meths.get_mark('A', {})) end) it('works with deleted buffers', function() local fname = tmpname() write_file(fname, 'a\nbit of\text') - nvim("command", "edit " .. fname) + nvim('command', 'edit ' .. fname) local buf = meths.get_current_buf() meths.buf_set_mark(buf, 'F', 2, 2, {}) - nvim("command", "new") -- Create new buf to avoid :bd failing - nvim("command", "bd! " .. buf.id) + nvim('command', 'new') -- Create new buf to avoid :bd failing + nvim('command', 'bd! ' .. buf.id) os.remove(fname) local mark = meths.get_mark('F', {}) @@ -3394,144 +3625,156 @@ describe('API', function() local tail_patt = [[[\/][^\/]*$]] -- tail of paths should be equals eq(fname:match(tail_patt), mfname:match(tail_patt)) - eq({2, 2, buf.id, mark[4]}, mark) + eq({ 2, 2, buf.id, mark[4] }, mark) end) end) describe('nvim_eval_statusline', function() it('works', function() eq({ - str = '%StatusLineStringWithHighlights', - width = 31 - }, - meths.eval_statusline( - '%%StatusLineString%#WarningMsg#WithHighlights', - {})) + str = '%StatusLineStringWithHighlights', + width = 31, + }, meths.eval_statusline('%%StatusLineString%#WarningMsg#WithHighlights', {})) end) - it('doesn\'t exceed maxwidth', function() + it("doesn't exceed maxwidth", function() eq({ - str = 'Should be trun>', - width = 15 - }, - meths.eval_statusline( - 'Should be truncated%<', - { maxwidth = 15 })) + str = 'Should be trun>', + width = 15, + }, meths.eval_statusline('Should be truncated%<', { maxwidth = 15 })) end) it('supports ASCII fillchar', function() - eq({ str = 'a~~~b', width = 5 }, - meths.eval_statusline('a%=b', { fillchar = '~', maxwidth = 5 })) + eq( + { str = 'a~~~b', width = 5 }, + meths.eval_statusline('a%=b', { fillchar = '~', maxwidth = 5 }) + ) end) it('supports single-width multibyte fillchar', function() - eq({ str = 'a━━━b', width = 5 }, - meths.eval_statusline('a%=b', { fillchar = '━', maxwidth = 5 })) + eq( + { str = 'a━━━b', width = 5 }, + meths.eval_statusline('a%=b', { fillchar = '━', maxwidth = 5 }) + ) end) it('treats double-width fillchar as single-width', function() - eq({ str = 'a哦哦哦b', width = 5 }, - meths.eval_statusline('a%=b', { fillchar = '哦', maxwidth = 5 })) + eq( + { str = 'a哦哦哦b', width = 5 }, + meths.eval_statusline('a%=b', { fillchar = '哦', maxwidth = 5 }) + ) end) it('treats control character fillchar as single-width', function() - eq({ str = 'a\031\031\031b', width = 5 }, - meths.eval_statusline('a%=b', { fillchar = '\031', maxwidth = 5 })) + eq( + { str = 'a\031\031\031b', width = 5 }, + meths.eval_statusline('a%=b', { fillchar = '\031', maxwidth = 5 }) + ) end) it('rejects multiple-character fillchar', function() - eq("Invalid 'fillchar': expected single character", - pcall_err(meths.eval_statusline, '', { fillchar = 'aa' })) + eq( + "Invalid 'fillchar': expected single character", + pcall_err(meths.eval_statusline, '', { fillchar = 'aa' }) + ) end) it('rejects empty string fillchar', function() - eq("Invalid 'fillchar': expected single character", - pcall_err(meths.eval_statusline, '', { fillchar = '' })) + eq( + "Invalid 'fillchar': expected single character", + pcall_err(meths.eval_statusline, '', { fillchar = '' }) + ) end) it('rejects non-string fillchar', function() - eq("Invalid 'fillchar': expected String, got Integer", - pcall_err(meths.eval_statusline, '', { fillchar = 1 })) + eq( + "Invalid 'fillchar': expected String, got Integer", + pcall_err(meths.eval_statusline, '', { fillchar = 1 }) + ) end) it('rejects invalid string', function() - eq('E539: Illegal character <}>', - pcall_err(meths.eval_statusline, '%{%}', {})) + eq('E539: Illegal character <}>', pcall_err(meths.eval_statusline, '%{%}', {})) end) it('supports various items', function() - eq({ str = '0', width = 1 }, - meths.eval_statusline('%l', { maxwidth = 5 })) + eq({ str = '0', width = 1 }, meths.eval_statusline('%l', { maxwidth = 5 })) command('set readonly') - eq({ str = '[RO]', width = 4 }, - meths.eval_statusline('%r', { maxwidth = 5 })) + eq({ str = '[RO]', width = 4 }, meths.eval_statusline('%r', { maxwidth = 5 })) local screen = Screen.new(80, 24) screen:attach() command('set showcmd') feed('1234') - screen:expect({any = '1234'}) - eq({ str = '1234', width = 4 }, - meths.eval_statusline('%S', { maxwidth = 5 })) + screen:expect({ any = '1234' }) + eq({ str = '1234', width = 4 }, meths.eval_statusline('%S', { maxwidth = 5 })) feed('56') - screen:expect({any = '123456'}) - eq({ str = '<3456', width = 5 }, - meths.eval_statusline('%S', { maxwidth = 5 })) + screen:expect({ any = '123456' }) + eq({ str = '<3456', width = 5 }, meths.eval_statusline('%S', { maxwidth = 5 })) end) describe('highlight parsing', function() it('works', function() - eq({ - str = "TextWithWarningHighlightTextWithUserHighlight", + eq( + { + str = 'TextWithWarningHighlightTextWithUserHighlight', width = 45, highlights = { { start = 0, group = 'WarningMsg' }, - { start = 24, group = 'User1' } + { start = 24, group = 'User1' }, }, }, meths.eval_statusline( '%#WarningMsg#TextWithWarningHighlight%1*TextWithUserHighlight', - { highlights = true })) + { highlights = true } + ) + ) end) it('works with no highlight', function() eq({ - str = "TextWithNoHighlight", - width = 19, - highlights = { - { start = 0, group = 'StatusLine' }, - }, + str = 'TextWithNoHighlight', + width = 19, + highlights = { + { start = 0, group = 'StatusLine' }, }, - meths.eval_statusline( - 'TextWithNoHighlight', - { highlights = true })) + }, meths.eval_statusline('TextWithNoHighlight', { highlights = true })) end) it('works with inactive statusline', function() command('split') - eq({ + eq( + { str = 'TextWithNoHighlightTextWithWarningHighlight', width = 43, highlights = { { start = 0, group = 'StatusLineNC' }, - { start = 19, group = 'WarningMsg' } - } + { start = 19, group = 'WarningMsg' }, + }, }, meths.eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', - { winid = meths.list_wins()[2].id, highlights = true })) + { winid = meths.list_wins()[2].id, highlights = true } + ) + ) end) it('works with tabline', function() - eq({ + eq( + { str = 'TextWithNoHighlightTextWithWarningHighlight', width = 43, highlights = { { start = 0, group = 'TabLineFill' }, - { start = 19, group = 'WarningMsg' } - } + { start = 19, group = 'WarningMsg' }, + }, }, meths.eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', - { use_tabline = true, highlights = true })) + { use_tabline = true, highlights = true } + ) + ) end) it('works with winbar', function() - eq({ + eq( + { str = 'TextWithNoHighlightTextWithWarningHighlight', width = 43, highlights = { { start = 0, group = 'WinBar' }, - { start = 19, group = 'WarningMsg' } - } + { start = 19, group = 'WarningMsg' }, + }, }, meths.eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', - { use_winbar = true, highlights = true })) + { use_winbar = true, highlights = true } + ) + ) end) it('works with statuscolumn', function() exec([[ @@ -3553,28 +3796,27 @@ describe('API', function() { group = 'Normal', start = 6 }, { group = 'IncSearch', start = 6 }, { group = 'ErrorMsg', start = 8 }, - { group = 'Normal', start = 10 } - } + { group = 'Normal', start = 10 }, + }, }, meths.eval_statusline('%C%s%=%l ', { use_statuscol_lnum = 4, highlights = true })) eq({ - str = '3 ' , + str = '3 ', width = 2, highlights = { { group = 'LineNr', start = 0 }, - { group = 'ErrorMsg', start = 1 } - } - }, meths.eval_statusline('%l%#ErrorMsg# ', { use_statuscol_lnum = 3, highlights = true })) + { group = 'ErrorMsg', start = 1 }, + }, + }, meths.eval_statusline( + '%l%#ErrorMsg# ', + { use_statuscol_lnum = 3, highlights = true } + )) end) it('no memory leak with click functions', function() meths.eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {}) eq({ - str = 'StatusLineStringWithClickFunc', - width = 29 - }, - meths.eval_statusline( - '%@ClickFunc@StatusLineStringWithClickFunc%T', - {}) - ) + str = 'StatusLineStringWithClickFunc', + width = 29, + }, meths.eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {})) end) end) end) @@ -3587,8 +3829,8 @@ describe('API', function() bang = false, addr = 'none', magic = { - file = false, - bar = false + file = false, + bar = false, }, nargs = '*', nextcmd = '', @@ -3597,8 +3839,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3611,12 +3853,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('echo foo', {})) end) it('works with ranges', function() @@ -3627,8 +3869,8 @@ describe('API', function() range = { 4, 6 }, addr = 'line', magic = { - file = false, - bar = false + file = false, + bar = false, }, nargs = '*', nextcmd = '', @@ -3637,8 +3879,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3651,12 +3893,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('4,6s/math.random/math.max/', {})) end) it('works with count', function() @@ -3668,8 +3910,8 @@ describe('API', function() count = 1, addr = 'buf', magic = { - file = false, - bar = true + file = false, + bar = true, }, nargs = '*', nextcmd = '', @@ -3678,8 +3920,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3692,12 +3934,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('buffer 1', {})) end) it('works with register', function() @@ -3709,8 +3951,8 @@ describe('API', function() reg = '+', addr = 'line', magic = { - file = false, - bar = true + file = false, + bar = true, }, nargs = '0', nextcmd = '', @@ -3719,8 +3961,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3733,12 +3975,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('put +', {})) eq({ cmd = 'put', @@ -3748,8 +3990,8 @@ describe('API', function() reg = '', addr = 'line', magic = { - file = false, - bar = true + file = false, + bar = true, }, nargs = '0', nextcmd = '', @@ -3758,8 +4000,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3772,12 +4014,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('put', {})) end) it('works with range, count and register', function() @@ -3790,8 +4032,8 @@ describe('API', function() reg = '*', addr = 'line', magic = { - file = false, - bar = true + file = false, + bar = true, }, nargs = '0', nextcmd = '', @@ -3800,8 +4042,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3814,12 +4056,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('1,3delete * 5', {})) end) it('works with bang', function() @@ -3830,8 +4072,8 @@ describe('API', function() range = {}, addr = 'line', magic = { - file = true, - bar = true + file = true, + bar = true, }, nargs = '?', nextcmd = '', @@ -3840,8 +4082,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3854,7 +4096,7 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, @@ -3870,8 +4112,8 @@ describe('API', function() range = {}, addr = '?', magic = { - file = true, - bar = true + file = true, + bar = true, }, nargs = '?', nextcmd = '', @@ -3880,8 +4122,8 @@ describe('API', function() confirm = false, emsg_silent = true, filter = { - pattern = "foo", - force = false + pattern = 'foo', + force = false, }, hide = false, horizontal = true, @@ -3894,13 +4136,16 @@ describe('API', function() noswapfile = false, sandbox = false, silent = true, - split = "topleft", + split = 'topleft', tab = 1, unsilent = false, verbose = 15, vertical = false, }, - }, meths.parse_cmd('15verbose silent! horizontal topleft tab filter /foo/ split foo.txt', {})) + }, meths.parse_cmd( + '15verbose silent! horizontal topleft tab filter /foo/ split foo.txt', + {} + )) eq({ cmd = 'split', args = { 'foo.txt' }, @@ -3908,8 +4153,8 @@ describe('API', function() range = {}, addr = '?', magic = { - file = true, - bar = true + file = true, + bar = true, }, nargs = '?', nextcmd = '', @@ -3918,8 +4163,8 @@ describe('API', function() confirm = true, emsg_silent = false, filter = { - pattern = "foo", - force = true + pattern = 'foo', + force = true, }, hide = false, horizontal = false, @@ -3932,13 +4177,16 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "botright", + split = 'botright', tab = 0, unsilent = true, verbose = 0, vertical = false, }, - }, meths.parse_cmd('0verbose unsilent botright 0tab confirm filter! /foo/ split foo.txt', {})) + }, meths.parse_cmd( + '0verbose unsilent botright 0tab confirm filter! /foo/ split foo.txt', + {} + )) end) it('works with user commands', function() command('command -bang -nargs=+ -range -addr=lines MyCommand echo foo') @@ -3949,8 +4197,8 @@ describe('API', function() range = { 4, 6 }, addr = 'line', magic = { - file = false, - bar = false + file = false, + bar = false, }, nargs = '+', nextcmd = '', @@ -3959,8 +4207,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -3973,12 +4221,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('4,6MyCommand! test it', {})) end) it('works for commands separated by bar', function() @@ -3989,8 +4237,8 @@ describe('API', function() range = {}, addr = 'arg', magic = { - file = true, - bar = true + file = true, + bar = true, }, nargs = '*', nextcmd = 'argadd b.txt', @@ -3999,8 +4247,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -4013,12 +4261,12 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('argadd a.txt | argadd b.txt', {})) end) it('works for nargs=1', function() @@ -4029,8 +4277,8 @@ describe('API', function() bang = false, addr = 'none', magic = { - file = false, - bar = false + file = false, + bar = false, }, nargs = '1', nextcmd = '', @@ -4039,8 +4287,8 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", - force = false + pattern = '', + force = false, }, hide = false, horizontal = false, @@ -4053,33 +4301,41 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('MyCommand test it', {})) end) it('validates command', function() eq('Error while parsing command line', pcall_err(meths.parse_cmd, '', {})) eq('Error while parsing command line', pcall_err(meths.parse_cmd, '" foo', {})) - eq('Error while parsing command line: E492: Not an editor command: Fubar', - pcall_err(meths.parse_cmd, 'Fubar', {})) + eq( + 'Error while parsing command line: E492: Not an editor command: Fubar', + pcall_err(meths.parse_cmd, 'Fubar', {}) + ) command('command! Fubar echo foo') - eq('Error while parsing command line: E477: No ! allowed', - pcall_err(meths.parse_cmd, 'Fubar!', {})) - eq('Error while parsing command line: E481: No range allowed', - pcall_err(meths.parse_cmd, '4,6Fubar', {})) + eq( + 'Error while parsing command line: E477: No ! allowed', + pcall_err(meths.parse_cmd, 'Fubar!', {}) + ) + eq( + 'Error while parsing command line: E481: No range allowed', + pcall_err(meths.parse_cmd, '4,6Fubar', {}) + ) command('command! Foobar echo foo') - eq('Error while parsing command line: E464: Ambiguous use of user-defined command', - pcall_err(meths.parse_cmd, 'F', {})) + eq( + 'Error while parsing command line: E464: Ambiguous use of user-defined command', + pcall_err(meths.parse_cmd, 'F', {}) + ) end) it('does not interfere with printing line in Ex mode #19400', function() local screen = Screen.new(60, 7) screen:set_default_attr_ids({ - [0] = {bold = true, foreground = Screen.colors.Blue}, -- NonText - [1] = {bold = true, reverse = true}, -- MsgSeparator + [0] = { bold = true, foreground = Screen.colors.Blue }, -- NonText + [1] = { bold = true, reverse = true }, -- MsgSeparator }) screen:attach() insert([[ @@ -4107,16 +4363,16 @@ describe('API', function() ]]) end) it('does not move cursor or change search history/pattern #19878 #19890', function() - meths.buf_set_lines(0, 0, -1, true, {'foo', 'bar', 'foo', 'bar'}) - eq({1, 0}, meths.win_get_cursor(0)) + meths.buf_set_lines(0, 0, -1, true, { 'foo', 'bar', 'foo', 'bar' }) + eq({ 1, 0 }, meths.win_get_cursor(0)) eq('', funcs.getreg('/')) eq('', funcs.histget('search')) - feed(':') -- call the API in cmdline mode to test whether it changes search history + feed(':') -- call the API in cmdline mode to test whether it changes search history eq({ cmd = 'normal', - args = {'x'}, + args = { 'x' }, bang = true, - range = {3, 4}, + range = { 3, 4 }, addr = 'line', magic = { file = false, @@ -4129,7 +4385,7 @@ describe('API', function() confirm = false, emsg_silent = false, filter = { - pattern = "", + pattern = '', force = false, }, hide = false, @@ -4143,101 +4399,131 @@ describe('API', function() noswapfile = false, sandbox = false, silent = false, - split = "", + split = '', tab = -1, unsilent = false, verbose = -1, vertical = false, - } + }, }, meths.parse_cmd('+2;/bar/normal! x', {})) - eq({1, 0}, meths.win_get_cursor(0)) + eq({ 1, 0 }, meths.win_get_cursor(0)) eq('', funcs.getreg('/')) eq('', funcs.histget('search')) end) it('result can be used directly by nvim_cmd #20051', function() - eq("foo", meths.cmd(meths.parse_cmd('echo "foo"', {}), { output = true })) - meths.cmd(meths.parse_cmd("set cursorline", {}), {}) - eq(true, meths.get_option_value("cursorline", {})) + eq('foo', meths.cmd(meths.parse_cmd('echo "foo"', {}), { output = true })) + meths.cmd(meths.parse_cmd('set cursorline', {}), {}) + eq(true, meths.get_option_value('cursorline', {})) end) it('no side-effects (error messages) in pcall() #20339', function() - eq({ false, 'Error while parsing command line: E16: Invalid range' }, - exec_lua([=[return {pcall(vim.api.nvim_parse_cmd, "'<,'>n", {})}]=])) + eq( + { false, 'Error while parsing command line: E16: Invalid range' }, + exec_lua([=[return {pcall(vim.api.nvim_parse_cmd, "'<,'>n", {})}]=]) + ) eq('', eval('v:errmsg')) end) end) describe('nvim_cmd', function() - it('works', function () - meths.cmd({ cmd = "set", args = { "cursorline" } }, {}) - eq(true, meths.get_option_value("cursorline", {})) + it('works', function() + meths.cmd({ cmd = 'set', args = { 'cursorline' } }, {}) + eq(true, meths.get_option_value('cursorline', {})) end) it('validation', function() - eq("Invalid 'cmd': expected non-empty String", - pcall_err(meths.cmd, { cmd = ""}, {})) - eq("Invalid 'cmd': expected String, got Array", - pcall_err(meths.cmd, { cmd = {}}, {})) - eq("Invalid 'args': expected Array, got Boolean", - pcall_err(meths.cmd, { cmd = "set", args = true }, {})) - eq("Invalid command arg: expected non-whitespace", - pcall_err(meths.cmd, { cmd = "set", args = {' '}, }, {})) - eq("Invalid command arg: expected valid type, got Array", - pcall_err(meths.cmd, { cmd = "set", args = {{}}, }, {})) - eq("Wrong number of arguments", - pcall_err(meths.cmd, { cmd = "aboveleft", args = {}, }, {})) - eq("Command cannot accept bang: print", - pcall_err(meths.cmd, { cmd = "print", args = {}, bang = true }, {})) - - eq("Command cannot accept range: set", - pcall_err(meths.cmd, { cmd = "set", args = {}, range = {1} }, {})) - eq("Invalid 'range': expected Array, got Boolean", - pcall_err(meths.cmd, { cmd = "print", args = {}, range = true }, {})) - eq("Invalid 'range': expected <=2 elements", - pcall_err(meths.cmd, { cmd = "print", args = {}, range = {1,2,3,4} }, {})) - eq("Invalid range element: expected non-negative Integer", - pcall_err(meths.cmd, { cmd = "print", args = {}, range = {-1} }, {})) - - eq("Command cannot accept count: set", - pcall_err(meths.cmd, { cmd = "set", args = {}, count = 1 }, {})) - eq("Invalid 'count': expected Integer, got Boolean", - pcall_err(meths.cmd, { cmd = "print", args = {}, count = true }, {})) - eq("Invalid 'count': expected non-negative Integer", - pcall_err(meths.cmd, { cmd = "print", args = {}, count = -1 }, {})) - - eq("Command cannot accept register: set", - pcall_err(meths.cmd, { cmd = "set", args = {}, reg = 'x' }, {})) - eq('Cannot use register "=', - pcall_err(meths.cmd, { cmd = "put", args = {}, reg = '=' }, {})) - eq("Invalid 'reg': expected single character, got xx", - pcall_err(meths.cmd, { cmd = "put", args = {}, reg = 'xx' }, {})) + eq("Invalid 'cmd': expected non-empty String", pcall_err(meths.cmd, { cmd = '' }, {})) + eq("Invalid 'cmd': expected String, got Array", pcall_err(meths.cmd, { cmd = {} }, {})) + eq( + "Invalid 'args': expected Array, got Boolean", + pcall_err(meths.cmd, { cmd = 'set', args = true }, {}) + ) + eq( + 'Invalid command arg: expected non-whitespace', + pcall_err(meths.cmd, { cmd = 'set', args = { ' ' } }, {}) + ) + eq( + 'Invalid command arg: expected valid type, got Array', + pcall_err(meths.cmd, { cmd = 'set', args = { {} } }, {}) + ) + eq('Wrong number of arguments', pcall_err(meths.cmd, { cmd = 'aboveleft', args = {} }, {})) + eq( + 'Command cannot accept bang: print', + pcall_err(meths.cmd, { cmd = 'print', args = {}, bang = true }, {}) + ) + + eq( + 'Command cannot accept range: set', + pcall_err(meths.cmd, { cmd = 'set', args = {}, range = { 1 } }, {}) + ) + eq( + "Invalid 'range': expected Array, got Boolean", + pcall_err(meths.cmd, { cmd = 'print', args = {}, range = true }, {}) + ) + eq( + "Invalid 'range': expected <=2 elements", + pcall_err(meths.cmd, { cmd = 'print', args = {}, range = { 1, 2, 3, 4 } }, {}) + ) + eq( + 'Invalid range element: expected non-negative Integer', + pcall_err(meths.cmd, { cmd = 'print', args = {}, range = { -1 } }, {}) + ) + + eq( + 'Command cannot accept count: set', + pcall_err(meths.cmd, { cmd = 'set', args = {}, count = 1 }, {}) + ) + eq( + "Invalid 'count': expected Integer, got Boolean", + pcall_err(meths.cmd, { cmd = 'print', args = {}, count = true }, {}) + ) + eq( + "Invalid 'count': expected non-negative Integer", + pcall_err(meths.cmd, { cmd = 'print', args = {}, count = -1 }, {}) + ) + + eq( + 'Command cannot accept register: set', + pcall_err(meths.cmd, { cmd = 'set', args = {}, reg = 'x' }, {}) + ) + eq('Cannot use register "=', pcall_err(meths.cmd, { cmd = 'put', args = {}, reg = '=' }, {})) + eq( + "Invalid 'reg': expected single character, got xx", + pcall_err(meths.cmd, { cmd = 'put', args = {}, reg = 'xx' }, {}) + ) -- #20681 - eq('Invalid command: "win_getid"', pcall_err(meths.cmd, { cmd = 'win_getid'}, {})) - eq('Invalid command: "echo "hi""', pcall_err(meths.cmd, { cmd = 'echo "hi"'}, {})) + eq('Invalid command: "win_getid"', pcall_err(meths.cmd, { cmd = 'win_getid' }, {})) + eq('Invalid command: "echo "hi""', pcall_err(meths.cmd, { cmd = 'echo "hi"' }, {})) eq('Invalid command: "win_getid"', pcall_err(exec_lua, [[return vim.cmd.win_getid{}]])) -- Lua call allows empty {} for dict item. eq('', exec_lua([[return vim.cmd{ cmd = "set", args = {}, magic = {} }]])) eq('', exec_lua([[return vim.cmd{ cmd = "set", args = {}, mods = {} }]])) - eq('', meths.cmd({ cmd = "set", args = {}, magic = {} }, {})) + eq('', meths.cmd({ cmd = 'set', args = {}, magic = {} }, {})) -- Lua call does not allow non-empty list-like {} for dict item. - eq("Invalid 'magic': Expected Dict-like Lua table", - pcall_err(exec_lua, [[return vim.cmd{ cmd = "set", args = {}, magic = { 'a' } }]])) - eq("Invalid key: 'bogus'", - pcall_err(exec_lua, [[return vim.cmd{ cmd = "set", args = {}, magic = { bogus = true } }]])) - eq("Invalid key: 'bogus'", - pcall_err(exec_lua, [[return vim.cmd{ cmd = "set", args = {}, mods = { bogus = true } }]])) + eq( + "Invalid 'magic': Expected Dict-like Lua table", + pcall_err(exec_lua, [[return vim.cmd{ cmd = "set", args = {}, magic = { 'a' } }]]) + ) + eq( + "Invalid key: 'bogus'", + pcall_err(exec_lua, [[return vim.cmd{ cmd = "set", args = {}, magic = { bogus = true } }]]) + ) + eq( + "Invalid key: 'bogus'", + pcall_err(exec_lua, [[return vim.cmd{ cmd = "set", args = {}, mods = { bogus = true } }]]) + ) end) it('captures output', function() - eq("foo", meths.cmd({ cmd = "echo", args = { '"foo"' } }, { output = true })) + eq('foo', meths.cmd({ cmd = 'echo', args = { '"foo"' } }, { output = true })) end) it('sets correct script context', function() - meths.cmd({ cmd = "set", args = { "cursorline" } }, {}) + meths.cmd({ cmd = 'set', args = { 'cursorline' } }, {}) local str = exec_capture([[verbose set cursorline?]]) - neq(nil, str:find("cursorline\n\tLast set from API client %(channel id %d+%)")) + neq(nil, str:find('cursorline\n\tLast set from API client %(channel id %d+%)')) end) it('works with range', function() @@ -4250,7 +4536,7 @@ describe('API', function() line5 line6 ]] - meths.cmd({ cmd = "del", range = {2, 4} }, {}) + meths.cmd({ cmd = 'del', range = { 2, 4 } }, {}) expect [[ line1 you didn't expect this @@ -4268,7 +4554,7 @@ describe('API', function() line5 line6 ]] - meths.cmd({ cmd = "del", range = { 2 }, count = 4 }, {}) + meths.cmd({ cmd = 'del', range = { 2 }, count = 4 }, {}) expect [[ line1 line5 @@ -4285,7 +4571,7 @@ describe('API', function() line5 line6 ]] - meths.cmd({ cmd = "del", range = { 2, 4 }, reg = 'a' }, {}) + meths.cmd({ cmd = 'del', range = { 2, 4 }, reg = 'a' }, {}) command('1put a') expect [[ line1 @@ -4297,41 +4583,55 @@ describe('API', function() line6 ]] end) - it('works with bang', function () - meths.create_user_command("Foo", 'echo "<bang>"', { bang = true }) - eq("!", meths.cmd({ cmd = "Foo", bang = true }, { output = true })) - eq("", meths.cmd({ cmd = "Foo", bang = false }, { output = true })) + it('works with bang', function() + meths.create_user_command('Foo', 'echo "<bang>"', { bang = true }) + eq('!', meths.cmd({ cmd = 'Foo', bang = true }, { output = true })) + eq('', meths.cmd({ cmd = 'Foo', bang = false }, { output = true })) end) it('works with modifiers', function() -- with silent = true output is still captured - eq('1', - meths.cmd({ cmd = 'echomsg', args = { '1' }, mods = { silent = true } }, - { output = true })) + eq( + '1', + meths.cmd({ cmd = 'echomsg', args = { '1' }, mods = { silent = true } }, { output = true }) + ) -- but message isn't added to message history eq('', meths.cmd({ cmd = 'messages' }, { output = true })) - meths.create_user_command("Foo", 'set verbose', {}) - eq(" verbose=1", meths.cmd({ cmd = "Foo", mods = { verbose = 1 } }, { output = true })) - - meths.create_user_command("Mods", "echo '<mods>'", {}) - eq('keepmarks keeppatterns silent 3verbose aboveleft horizontal', - meths.cmd({ cmd = "Mods", mods = { - horizontal = true, - keepmarks = true, - keeppatterns = true, - silent = true, - split = 'aboveleft', - verbose = 3, - } }, { output = true })) - eq(0, meths.get_option_value("verbose", {})) + meths.create_user_command('Foo', 'set verbose', {}) + eq(' verbose=1', meths.cmd({ cmd = 'Foo', mods = { verbose = 1 } }, { output = true })) + + meths.create_user_command('Mods', "echo '<mods>'", {}) + eq( + 'keepmarks keeppatterns silent 3verbose aboveleft horizontal', + meths.cmd({ + cmd = 'Mods', + mods = { + horizontal = true, + keepmarks = true, + keeppatterns = true, + silent = true, + split = 'aboveleft', + verbose = 3, + }, + }, { output = true }) + ) + eq(0, meths.get_option_value('verbose', {})) command('edit foo.txt | edit bar.txt') - eq(' 1 #h "foo.txt" line 1', - meths.cmd({ cmd = "buffers", mods = { filter = { pattern = "foo", force = false } } }, - { output = true })) - eq(' 2 %a "bar.txt" line 1', - meths.cmd({ cmd = "buffers", mods = { filter = { pattern = "foo", force = true } } }, - { output = true })) + eq( + ' 1 #h "foo.txt" line 1', + meths.cmd( + { cmd = 'buffers', mods = { filter = { pattern = 'foo', force = false } } }, + { output = true } + ) + ) + eq( + ' 2 %a "bar.txt" line 1', + meths.cmd( + { cmd = 'buffers', mods = { filter = { pattern = 'foo', force = true } } }, + { output = true } + ) + ) -- with emsg_silent = true error is suppressed feed([[:lua vim.api.nvim_cmd({ cmd = 'call', mods = { emsg_silent = true } }, {})<CR>]]) @@ -4346,9 +4646,10 @@ describe('API', function() vim.api.nvim_echo({{ opts.fargs[1] }}, false, {}) end, { nargs = 1 }) ]]) - eq(luv.cwd(), - meths.cmd({ cmd = "Foo", args = { '%:p:h' }, magic = { file = true } }, - { output = true })) + eq( + luv.cwd(), + meths.cmd({ cmd = 'Foo', args = { '%:p:h' }, magic = { file = true } }, { output = true }) + ) end) it('splits arguments correctly', function() exec([[ @@ -4356,67 +4657,92 @@ describe('API', function() echo a:000 endfunction ]]) - meths.create_user_command("Foo", "call FooFunc(<f-args>)", { nargs = '+' }) - eq([=[['a quick', 'brown fox', 'jumps over the', 'lazy dog']]=], - meths.cmd({ cmd = "Foo", args = { "a quick", "brown fox", "jumps over the", "lazy dog"}}, - { output = true })) - eq([=[['test \ \\ \"""\', 'more\ tests\" ']]=], - meths.cmd({ cmd = "Foo", args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, - { output = true })) + meths.create_user_command('Foo', 'call FooFunc(<f-args>)', { nargs = '+' }) + eq( + [=[['a quick', 'brown fox', 'jumps over the', 'lazy dog']]=], + meths.cmd( + { cmd = 'Foo', args = { 'a quick', 'brown fox', 'jumps over the', 'lazy dog' } }, + { output = true } + ) + ) + eq( + [=[['test \ \\ \"""\', 'more\ tests\" ']]=], + meths.cmd( + { cmd = 'Foo', args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, + { output = true } + ) + ) end) it('splits arguments correctly for Lua callback', function() - meths.exec_lua([[ + meths.exec_lua( + [[ local function FooFunc(opts) vim.print(opts.fargs) end vim.api.nvim_create_user_command("Foo", FooFunc, { nargs = '+' }) - ]], {}) - eq([[{ "a quick", "brown fox", "jumps over the", "lazy dog" }]], - meths.cmd({ cmd = "Foo", args = { "a quick", "brown fox", "jumps over the", "lazy dog"}}, - { output = true })) - eq([[{ 'test \\ \\\\ \\"""\\', 'more\\ tests\\" ' }]], - meths.cmd({ cmd = "Foo", args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, - { output = true })) + ]], + {} + ) + eq( + [[{ "a quick", "brown fox", "jumps over the", "lazy dog" }]], + meths.cmd( + { cmd = 'Foo', args = { 'a quick', 'brown fox', 'jumps over the', 'lazy dog' } }, + { output = true } + ) + ) + eq( + [[{ 'test \\ \\\\ \\"""\\', 'more\\ tests\\" ' }]], + meths.cmd( + { cmd = 'Foo', args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, + { output = true } + ) + ) end) it('works with buffer names', function() - command("edit foo.txt | edit bar.txt") - meths.cmd({ cmd = "buffer", args = { "foo.txt" } }, {}) - eq("foo.txt", funcs.fnamemodify(meths.buf_get_name(0), ":t")) - meths.cmd({ cmd = "buffer", args = { "bar.txt" } }, {}) - eq("bar.txt", funcs.fnamemodify(meths.buf_get_name(0), ":t")) + command('edit foo.txt | edit bar.txt') + meths.cmd({ cmd = 'buffer', args = { 'foo.txt' } }, {}) + eq('foo.txt', funcs.fnamemodify(meths.buf_get_name(0), ':t')) + meths.cmd({ cmd = 'buffer', args = { 'bar.txt' } }, {}) + eq('bar.txt', funcs.fnamemodify(meths.buf_get_name(0), ':t')) end) it('triggers CmdUndefined event if command is not found', function() - meths.exec_lua([[ + meths.exec_lua( + [[ vim.api.nvim_create_autocmd("CmdUndefined", { pattern = "Foo", callback = function() vim.api.nvim_create_user_command("Foo", "echo 'foo'", {}) end }) - ]], {}) - eq("foo", meths.cmd({ cmd = "Foo" }, { output = true })) + ]], + {} + ) + eq('foo', meths.cmd({ cmd = 'Foo' }, { output = true })) end) it('errors if command is not implemented', function() - eq("Command not implemented: winpos", pcall_err(meths.cmd, { cmd = "winpos" }, {})) + eq('Command not implemented: winpos', pcall_err(meths.cmd, { cmd = 'winpos' }, {})) end) it('works with empty arguments list', function() - meths.cmd({ cmd = "update" }, {}) - meths.cmd({ cmd = "buffer", count = 0 }, {}) + meths.cmd({ cmd = 'update' }, {}) + meths.cmd({ cmd = 'buffer', count = 0 }, {}) end) - it('doesn\'t suppress errors when used in keymapping', function() - meths.exec_lua([[ + it("doesn't suppress errors when used in keymapping", function() + meths.exec_lua( + [[ vim.keymap.set("n", "[l", function() vim.api.nvim_cmd({ cmd = "echo", args = {"foo"} }, {}) end) - ]], {}) - feed("[l") - neq(nil, string.find(eval("v:errmsg"), "E5108:")) + ]], + {} + ) + feed('[l') + neq(nil, string.find(eval('v:errmsg'), 'E5108:')) end) it('handles 0 range #19608', function() - meths.buf_set_lines(0, 0, -1, false, { "aa" }) + meths.buf_set_lines(0, 0, -1, false, { 'aa' }) meths.cmd({ cmd = 'delete', range = { 0 } }, {}) command('undo') - eq({'aa'}, meths.buf_get_lines(0, 0, 1, false)) + eq({ 'aa' }, meths.buf_get_lines(0, 0, 1, false)) assert_alive() end) it('supports filename expansion', function() @@ -4427,63 +4753,72 @@ describe('API', function() it("'make' command works when argument count isn't 1 #19696", function() command('set makeprg=echo') command('set shellquote=') - matches('^:!echo ', - meths.cmd({ cmd = 'make' }, { output = true })) + matches('^:!echo ', meths.cmd({ cmd = 'make' }, { output = true })) assert_alive() - matches('^:!echo foo bar', - meths.cmd({ cmd = 'make', args = { 'foo', 'bar' } }, { output = true })) + matches( + '^:!echo foo bar', + meths.cmd({ cmd = 'make', args = { 'foo', 'bar' } }, { output = true }) + ) assert_alive() local arg_pesc = pesc(funcs.expand('%:p:h:t')) - matches(('^:!echo %s %s'):format(arg_pesc, arg_pesc), - meths.cmd({ cmd = 'make', args = { '%:p:h:t', '%:p:h:t' } }, { output = true })) + matches( + ('^:!echo %s %s'):format(arg_pesc, arg_pesc), + meths.cmd({ cmd = 'make', args = { '%:p:h:t', '%:p:h:t' } }, { output = true }) + ) assert_alive() end) - it('doesn\'t display messages when output=true', function() + it("doesn't display messages when output=true", function() local screen = Screen.new(40, 6) screen:attach() screen:set_default_attr_ids({ - [0] = {bold=true, foreground=Screen.colors.Blue}, + [0] = { bold = true, foreground = Screen.colors.Blue }, }) - meths.cmd({cmd = 'echo', args = {[['hello']]}}, {output = true}) - screen:expect{grid=[[ + meths.cmd({ cmd = 'echo', args = { [['hello']] } }, { output = true }) + screen:expect { + grid = [[ ^ | {0:~ }|*4 | - ]]} + ]], + } exec([[ func Print() call nvim_cmd(#{cmd: 'echo', args: ['"hello"']}, #{output: v:true}) endfunc ]]) feed([[:echon 1 | call Print() | echon 5<CR>]]) - screen:expect{grid=[[ + screen:expect { + grid = [[ ^ | {0:~ }|*4 15 | - ]]} + ]], + } end) it('works with non-String args', function() - eq('2', meths.cmd({cmd = 'echo', args = {2}}, {output = true})) - eq('1', meths.cmd({cmd = 'echo', args = {true}}, {output = true})) + eq('2', meths.cmd({ cmd = 'echo', args = { 2 } }, { output = true })) + eq('1', meths.cmd({ cmd = 'echo', args = { true } }, { output = true })) end) describe('first argument as count', function() it('works', function() command('vsplit | enew') - meths.cmd({cmd = 'bdelete', args = {meths.get_current_buf()}}, {}) + meths.cmd({ cmd = 'bdelete', args = { meths.get_current_buf() } }, {}) eq(1, meths.get_current_buf().id) end) it('works with :sleep using milliseconds', function() local start = luv.now() - meths.cmd({cmd = 'sleep', args = {'100m'}}, {}) + meths.cmd({ cmd = 'sleep', args = { '100m' } }, {}) ok(luv.now() - start <= 300) end) end) it(':call with unknown function does not crash #26289', function() - eq('Vim:E117: Unknown function: UnknownFunc', - pcall_err(meths.cmd, {cmd = 'call', args = {'UnknownFunc()'}}, {})) + eq( + 'Vim:E117: Unknown function: UnknownFunc', + pcall_err(meths.cmd, { cmd = 'call', args = { 'UnknownFunc()' } }, {}) + ) end) it(':throw does not crash #24556', function() - eq('42', pcall_err(meths.cmd, {cmd = 'throw', args = {'42'}}, {})) + eq('42', pcall_err(meths.cmd, { cmd = 'throw', args = { '42' } }, {})) end) it('can use :return #24556', function() exec([[ @@ -4495,7 +4830,7 @@ describe('API', function() let g:result = Foo() ]]) eq('before', meths.get_var('pos')) - eq({1, 2, 3}, meths.get_var('result')) + eq({ 1, 2, 3 }, meths.get_var('result')) end) end) end) diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index f44326d0eb..7e92dd6bf3 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -1,9 +1,18 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') -local clear, nvim, curbuf, curbuf_contents, window, curwin, eq, neq, - ok, feed, insert, eval, tabpage = helpers.clear, helpers.nvim, helpers.curbuf, - helpers.curbuf_contents, helpers.window, helpers.curwin, helpers.eq, - helpers.neq, helpers.ok, helpers.feed, helpers.insert, helpers.eval, +local clear, nvim, curbuf, curbuf_contents, window, curwin, eq, neq, ok, feed, insert, eval, tabpage = + helpers.clear, + helpers.nvim, + helpers.curbuf, + helpers.curbuf_contents, + helpers.window, + helpers.curwin, + helpers.eq, + helpers.neq, + helpers.ok, + helpers.feed, + helpers.insert, + helpers.eval, helpers.tabpage local poke_eventloop = helpers.poke_eventloop local curwinmeths = helpers.curwinmeths @@ -25,8 +34,7 @@ describe('API/win', function() nvim('command', 'new') nvim('set_current_win', nvim('list_wins')[2]) eq(curbuf(), window('get_buf', nvim('list_wins')[2])) - neq(window('get_buf', nvim('list_wins')[1]), - window('get_buf', nvim('list_wins')[2])) + neq(window('get_buf', nvim('list_wins')[1]), window('get_buf', nvim('list_wins')[2])) end) end) @@ -48,15 +56,25 @@ describe('API/win', function() local new_buf = meths.create_buf(true, true) local old_win = meths.get_current_win() local new_win = meths.open_win(new_buf, false, { - relative='editor', row=10, col=10, width=50, height=10, + relative = 'editor', + row = 10, + col = 10, + width = 50, + height = 10, }) feed('q:') - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.win_set_buf, 0, new_buf)) - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.win_set_buf, old_win, new_buf)) - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.win_set_buf, new_win, 0)) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.win_set_buf, 0, new_buf) + ) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.win_set_buf, old_win, new_buf) + ) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.win_set_buf, new_win, 0) + ) local next_buf = meths.create_buf(true, true) meths.win_set_buf(new_win, next_buf) @@ -66,63 +84,70 @@ describe('API/win', function() describe('{get,set}_cursor', function() it('works', function() - eq({1, 0}, curwin('get_cursor')) + eq({ 1, 0 }, curwin('get_cursor')) nvim('command', 'normal ityping\027o some text') eq('typing\n some text', curbuf_contents()) - eq({2, 10}, curwin('get_cursor')) - curwin('set_cursor', {2, 6}) + eq({ 2, 10 }, curwin('get_cursor')) + curwin('set_cursor', { 2, 6 }) nvim('command', 'normal i dumb') eq('typing\n some dumb text', curbuf_contents()) end) it('does not leak memory when using invalid window ID with invalid pos', function() - eq('Invalid window id: 1', pcall_err(meths.win_set_cursor, 1, {"b\na"})) + eq('Invalid window id: 1', pcall_err(meths.win_set_cursor, 1, { 'b\na' })) end) it('updates the screen, and also when the window is unfocused', function() local screen = Screen.new(30, 9) screen:set_default_attr_ids({ - [1] = {bold = true, foreground = Screen.colors.Blue}, - [2] = {bold = true, reverse = true}; - [3] = {reverse = true}; + [1] = { bold = true, foreground = Screen.colors.Blue }, + [2] = { bold = true, reverse = true }, + [3] = { reverse = true }, }) screen:attach() - insert("prologue") + insert('prologue') feed('100o<esc>') - insert("epilogue") + insert('epilogue') local win = curwin() feed('gg') - screen:expect{grid=[[ + screen:expect { + grid = [[ ^prologue | |*8 - ]]} + ]], + } -- cursor position is at beginning - eq({1, 0}, window('get_cursor', win)) + eq({ 1, 0 }, window('get_cursor', win)) -- move cursor to end - window('set_cursor', win, {101, 0}) - screen:expect{grid=[[ + window('set_cursor', win, { 101, 0 }) + screen:expect { + grid = [[ |*7 ^epilogue | | - ]]} + ]], + } -- move cursor to the beginning again - window('set_cursor', win, {1, 0}) - screen:expect{grid=[[ + window('set_cursor', win, { 1, 0 }) + screen:expect { + grid = [[ ^prologue | |*8 - ]]} + ]], + } -- move focus to new window - nvim('command',"new") + nvim('command', 'new') neq(win, curwin()) -- sanity check, cursor position is kept - eq({1, 0}, window('get_cursor', win)) - screen:expect{grid=[[ + eq({ 1, 0 }, window('get_cursor', win)) + screen:expect { + grid = [[ ^ | {1:~ }|*2 {2:[No Name] }| @@ -130,11 +155,13 @@ describe('API/win', function() |*2 {3:[No Name] [+] }| | - ]]} + ]], + } -- move cursor to end - window('set_cursor', win, {101, 0}) - screen:expect{grid=[[ + window('set_cursor', win, { 101, 0 }) + screen:expect { + grid = [[ ^ | {1:~ }|*2 {2:[No Name] }| @@ -142,11 +169,13 @@ describe('API/win', function() epilogue | {3:[No Name] [+] }| | - ]]} + ]], + } -- move cursor to the beginning again - window('set_cursor', win, {1, 0}) - screen:expect{grid=[[ + window('set_cursor', win, { 1, 0 }) + screen:expect { + grid = [[ ^ | {1:~ }|*2 {2:[No Name] }| @@ -154,42 +183,43 @@ describe('API/win', function() |*2 {3:[No Name] [+] }| | - ]]} + ]], + } -- curwin didn't change back neq(win, curwin()) end) it('remembers what column it wants to be in', function() - insert("first line") + insert('first line') feed('o<esc>') - insert("second line") + insert('second line') feed('gg') poke_eventloop() -- let nvim process the 'gg' command -- cursor position is at beginning local win = curwin() - eq({1, 0}, window('get_cursor', win)) + eq({ 1, 0 }, window('get_cursor', win)) -- move cursor to column 5 - window('set_cursor', win, {1, 5}) + window('set_cursor', win, { 1, 5 }) -- move down a line feed('j') poke_eventloop() -- let nvim process the 'j' command -- cursor is still in column 5 - eq({2, 5}, window('get_cursor', win)) + eq({ 2, 5 }, window('get_cursor', win)) end) it('updates cursorline and statusline ruler in non-current window', function() local screen = Screen.new(60, 8) screen:set_default_attr_ids({ - [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText - [2] = {background = Screen.colors.Grey90}, -- CursorLine - [3] = {bold = true, reverse = true}, -- StatusLine - [4] = {reverse = true}, -- StatusLineNC + [1] = { bold = true, foreground = Screen.colors.Blue }, -- NonText + [2] = { background = Screen.colors.Grey90 }, -- CursorLine + [3] = { bold = true, reverse = true }, -- StatusLine + [4] = { reverse = true }, -- StatusLineNC }) screen:attach() command('set ruler') @@ -210,7 +240,7 @@ describe('API/win', function() {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 4,3 All}| | ]]) - window('set_cursor', oldwin, {1, 0}) + window('set_cursor', oldwin, { 1, 0 }) screen:expect([[ aaa │{2:aaa }| bbb │bbb | @@ -225,10 +255,10 @@ describe('API/win', function() it('updates cursorcolumn in non-current window', function() local screen = Screen.new(60, 8) screen:set_default_attr_ids({ - [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText - [2] = {background = Screen.colors.Grey90}, -- CursorColumn - [3] = {bold = true, reverse = true}, -- StatusLine - [4] = {reverse = true}, -- StatusLineNC + [1] = { bold = true, foreground = Screen.colors.Blue }, -- NonText + [2] = { background = Screen.colors.Grey90 }, -- CursorColumn + [3] = { bold = true, reverse = true }, -- StatusLine + [4] = { reverse = true }, -- StatusLineNC }) screen:attach() command('set cursorcolumn') @@ -248,7 +278,7 @@ describe('API/win', function() {3:[No Name] [+] }{4:[No Name] [+] }| | ]]) - window('set_cursor', oldwin, {2, 0}) + window('set_cursor', oldwin, { 2, 0 }) screen:expect([[ aa{2:a} │{2:a}aa | bb{2:b} │bbb | @@ -264,12 +294,13 @@ describe('API/win', function() describe('{get,set}_height', function() it('works', function() nvim('command', 'vsplit') - eq(window('get_height', nvim('list_wins')[2]), - window('get_height', nvim('list_wins')[1])) + eq(window('get_height', nvim('list_wins')[2]), window('get_height', nvim('list_wins')[1])) nvim('set_current_win', nvim('list_wins')[2]) nvim('command', 'split') - eq(window('get_height', nvim('list_wins')[2]), - math.floor(window('get_height', nvim('list_wins')[1]) / 2)) + eq( + window('get_height', nvim('list_wins')[2]), + math.floor(window('get_height', nvim('list_wins')[1]) / 2) + ) window('set_height', nvim('list_wins')[2], 2) eq(2, window('get_height', nvim('list_wins')[2])) end) @@ -310,12 +341,13 @@ describe('API/win', function() describe('{get,set}_width', function() it('works', function() nvim('command', 'split') - eq(window('get_width', nvim('list_wins')[2]), - window('get_width', nvim('list_wins')[1])) + eq(window('get_width', nvim('list_wins')[2]), window('get_width', nvim('list_wins')[1])) nvim('set_current_win', nvim('list_wins')[2]) nvim('command', 'vsplit') - eq(window('get_width', nvim('list_wins')[2]), - math.floor(window('get_width', nvim('list_wins')[1]) / 2)) + eq( + window('get_width', nvim('list_wins')[2]), + math.floor(window('get_width', nvim('list_wins')[1]) / 2) + ) window('set_width', nvim('list_wins')[2], 2) eq(2, window('get_width', nvim('list_wins')[2])) end) @@ -339,9 +371,9 @@ describe('API/win', function() describe('{get,set,del}_var', function() it('works', function() - curwin('set_var', 'lua', {1, 2, {['3'] = 1}}) - eq({1, 2, {['3'] = 1}}, curwin('get_var', 'lua')) - eq({1, 2, {['3'] = 1}}, nvim('eval', 'w:lua')) + curwin('set_var', 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, curwin('get_var', 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, nvim('eval', 'w:lua')) eq(1, funcs.exists('w:lua')) curwinmeths.del_var('lua') eq(0, funcs.exists('w:lua')) @@ -353,16 +385,16 @@ describe('API/win', function() end) it('window_set_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } eq(NIL, request('window_set_var', 0, 'lua', val1)) eq(val1, request('window_set_var', 0, 'lua', val2)) end) it('window_del_var returns the old value', function() - local val1 = {1, 2, {['3'] = 1}} - local val2 = {4, 7} - eq(NIL, request('window_set_var', 0, 'lua', val1)) + local val1 = { 1, 2, { ['3'] = 1 } } + local val2 = { 4, 7 } + eq(NIL, request('window_set_var', 0, 'lua', val1)) eq(val1, request('window_set_var', 0, 'lua', val2)) eq(val2, request('window_del_var', 0, 'lua')) end) @@ -372,18 +404,18 @@ describe('API/win', function() it('works', function() nvim('set_option_value', 'colorcolumn', '4,3', {}) eq('4,3', nvim('get_option_value', 'colorcolumn', {})) - command("set modified hidden") - command("enew") -- edit new buffer, window option is preserved + command('set modified hidden') + command('enew') -- edit new buffer, window option is preserved eq('4,3', nvim('get_option_value', 'colorcolumn', {})) -- global-local option - nvim('set_option_value', 'statusline', 'window-status', {win=0}) - eq('window-status', nvim('get_option_value', 'statusline', {win=0})) - eq('', nvim('get_option_value', 'statusline', {scope='global'})) - command("set modified") - command("enew") -- global-local: not preserved in new buffer + nvim('set_option_value', 'statusline', 'window-status', { win = 0 }) + eq('window-status', nvim('get_option_value', 'statusline', { win = 0 })) + eq('', nvim('get_option_value', 'statusline', { scope = 'global' })) + command('set modified') + command('enew') -- global-local: not preserved in new buffer -- confirm local value was not copied - eq('', nvim('get_option_value', 'statusline', {win = 0})) + eq('', nvim('get_option_value', 'statusline', { win = 0 })) eq('', eval('&l:statusline')) end) @@ -391,16 +423,16 @@ describe('API/win', function() nvim('command', 'tabnew') local tab1 = unpack(nvim('list_tabpages')) local win1 = unpack(tabpage('list_wins', tab1)) - nvim('set_option_value', 'statusline', 'window-status', {win=win1.id}) + nvim('set_option_value', 'statusline', 'window-status', { win = win1.id }) nvim('command', 'split') nvim('command', 'wincmd J') nvim('command', 'wincmd j') - eq('window-status', nvim('get_option_value', 'statusline', {win = win1.id})) + eq('window-status', nvim('get_option_value', 'statusline', { win = win1.id })) assert_alive() end) it('returns values for unset local options', function() - eq(-1, nvim('get_option_value', 'scrolloff', {win=0, scope='local'})) + eq(-1, nvim('get_option_value', 'scrolloff', { win = 0, scope = 'local' })) end) end) @@ -410,13 +442,11 @@ describe('API/win', function() local width = window('get_width', nvim('list_wins')[1]) nvim('command', 'split') nvim('command', 'vsplit') - eq({0, 0}, window('get_position', nvim('list_wins')[1])) + eq({ 0, 0 }, window('get_position', nvim('list_wins')[1])) local vsplit_pos = math.floor(width / 2) local split_pos = math.floor(height / 2) - local win2row, win2col = - unpack(window('get_position', nvim('list_wins')[2])) - local win3row, win3col = - unpack(window('get_position', nvim('list_wins')[3])) + local win2row, win2col = unpack(window('get_position', nvim('list_wins')[2])) + local win3row, win3col = unpack(window('get_position', nvim('list_wins')[3])) eq(0, win2row) eq(0, win3col) ok(vsplit_pos - 1 <= win2col and win2col <= vsplit_pos + 1) @@ -428,12 +458,9 @@ describe('API/win', function() it('works', function() nvim('command', 'tabnew') nvim('command', 'vsplit') - eq(window('get_tabpage', - nvim('list_wins')[1]), nvim('list_tabpages')[1]) - eq(window('get_tabpage', - nvim('list_wins')[2]), nvim('list_tabpages')[2]) - eq(window('get_tabpage', - nvim('list_wins')[3]), nvim('list_tabpages')[2]) + eq(window('get_tabpage', nvim('list_wins')[1]), nvim('list_tabpages')[1]) + eq(window('get_tabpage', nvim('list_wins')[2]), nvim('list_tabpages')[2]) + eq(window('get_tabpage', nvim('list_wins')[3]), nvim('list_tabpages')[2]) end) end) @@ -477,16 +504,16 @@ describe('API/win', function() local oldwin = meths.get_current_win() command('split') local newwin = meths.get_current_win() - meths.win_close(newwin,false) - eq({oldwin}, meths.list_wins()) + meths.win_close(newwin, false) + eq({ oldwin }, meths.list_wins()) end) it('can close noncurrent window', function() local oldwin = meths.get_current_win() command('split') local newwin = meths.get_current_win() - meths.win_close(oldwin,false) - eq({newwin}, meths.list_wins()) + meths.win_close(oldwin, false) + eq({ newwin }, meths.list_wins()) end) it("handles changed buffer when 'hidden' is unset", function() @@ -495,9 +522,11 @@ describe('API/win', function() insert('text') command('new') local newwin = meths.get_current_win() - eq("Vim:E37: No write since last change (add ! to override)", - pcall_err(meths.win_close, oldwin,false)) - eq({newwin,oldwin}, meths.list_wins()) + eq( + 'Vim:E37: No write since last change (add ! to override)', + pcall_err(meths.win_close, oldwin, false) + ) + eq({ newwin, oldwin }, meths.list_wins()) end) it('handles changed buffer with force', function() @@ -505,8 +534,8 @@ describe('API/win', function() insert('text') command('new') local newwin = meths.get_current_win() - meths.win_close(oldwin,true) - eq({newwin}, meths.list_wins()) + meths.win_close(oldwin, true) + eq({ newwin }, meths.list_wins()) end) it('in cmdline-window #9767', function() @@ -514,15 +543,21 @@ describe('API/win', function() eq(2, #meths.list_wins()) local oldwin = meths.get_current_win() local otherwin = meths.open_win(0, false, { - relative='editor', row=10, col=10, width=10, height=10, + relative = 'editor', + row = 10, + col = 10, + width = 10, + height = 10, }) -- Open cmdline-window. feed('q:') eq(4, #meths.list_wins()) eq(':', funcs.getcmdwintype()) -- Not allowed to close previous window from cmdline-window. - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.win_close, oldwin, true)) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.win_close, oldwin, true) + ) -- Closing other windows is fine. meths.win_close(otherwin, true) eq(false, meths.win_is_valid(otherwin)) @@ -538,7 +573,11 @@ describe('API/win', function() local prevwin = curwin().id eq(2, eval('tabpagenr()')) local win = meths.open_win(0, true, { - relative='editor', row=10, col=10, width=50, height=10 + relative = 'editor', + row = 10, + col = 10, + width = 50, + height = 10, }) local tab = eval('tabpagenr()') command('tabprevious') @@ -556,37 +595,45 @@ describe('API/win', function() command('split') local newwin = meths.get_current_win() meths.win_hide(newwin) - eq({oldwin}, meths.list_wins()) + eq({ oldwin }, meths.list_wins()) end) it('can hide noncurrent window', function() local oldwin = meths.get_current_win() command('split') local newwin = meths.get_current_win() meths.win_hide(oldwin) - eq({newwin}, meths.list_wins()) + eq({ newwin }, meths.list_wins()) end) it('does not close the buffer', function() local oldwin = meths.get_current_win() local oldbuf = meths.get_current_buf() local buf = meths.create_buf(true, false) local newwin = meths.open_win(buf, true, { - relative='win', row=3, col=3, width=12, height=3 + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, }) meths.win_hide(newwin) - eq({oldwin}, meths.list_wins()) - eq({oldbuf, buf}, meths.list_bufs()) + eq({ oldwin }, meths.list_wins()) + eq({ oldbuf, buf }, meths.list_bufs()) end) it('deletes the buffer when bufhidden=wipe', function() local oldwin = meths.get_current_win() local oldbuf = meths.get_current_buf() local buf = meths.create_buf(true, false).id local newwin = meths.open_win(buf, true, { - relative='win', row=3, col=3, width=12, height=3 + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, }) - meths.set_option_value('bufhidden', 'wipe', {buf=buf}) + meths.set_option_value('bufhidden', 'wipe', { buf = buf }) meths.win_hide(newwin) - eq({oldwin}, meths.list_wins()) - eq({oldbuf}, meths.list_bufs()) + eq({ oldwin }, meths.list_wins()) + eq({ oldbuf }, meths.list_bufs()) end) it('in the cmdwin', function() feed('q:') @@ -596,12 +643,18 @@ describe('API/win', function() local old_win = meths.get_current_win() local other_win = meths.open_win(0, false, { - relative='win', row=3, col=3, width=12, height=3 + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, }) feed('q:') -- Cannot close the previous window. - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.win_hide, old_win)) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.win_hide, old_win) + ) -- Can close other windows. meths.win_hide(other_win) eq(false, meths.win_is_valid(other_win)) @@ -617,48 +670,66 @@ describe('API/win', function() ccc ddd eee]]) - eq("Invalid window id: 23", - pcall_err(meths.win_text_height, 23, {})) - eq("Line index out of bounds", - pcall_err(curwinmeths.text_height, { start_row = 5 })) - eq("Line index out of bounds", - pcall_err(curwinmeths.text_height, { start_row = -6 })) - eq("Line index out of bounds", - pcall_err(curwinmeths.text_height, { end_row = 5 })) - eq("Line index out of bounds", - pcall_err(curwinmeths.text_height, { end_row = -6 })) - eq("'start_row' is higher than 'end_row'", - pcall_err(curwinmeths.text_height, { start_row = 3, end_row = 1 })) - eq("'start_vcol' specified without 'start_row'", - pcall_err(curwinmeths.text_height, { end_row = 2, start_vcol = 0 })) - eq("'end_vcol' specified without 'end_row'", - pcall_err(curwinmeths.text_height, { start_row = 2, end_vcol = 0 })) - eq("Invalid 'start_vcol': out of range", - pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = -1 })) - eq("Invalid 'start_vcol': out of range", - pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = X + 1 })) - eq("Invalid 'end_vcol': out of range", - pcall_err(curwinmeths.text_height, { end_row = 2, end_vcol = -1 })) - eq("Invalid 'end_vcol': out of range", - pcall_err(curwinmeths.text_height, { end_row = 2, end_vcol = X + 1 })) - eq("'start_vcol' is higher than 'end_vcol'", - pcall_err(curwinmeths.text_height, { start_row = 2, end_row = 2, start_vcol = 10, end_vcol = 5 })) + eq('Invalid window id: 23', pcall_err(meths.win_text_height, 23, {})) + eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { start_row = 5 })) + eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { start_row = -6 })) + eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { end_row = 5 })) + eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { end_row = -6 })) + eq( + "'start_row' is higher than 'end_row'", + pcall_err(curwinmeths.text_height, { start_row = 3, end_row = 1 }) + ) + eq( + "'start_vcol' specified without 'start_row'", + pcall_err(curwinmeths.text_height, { end_row = 2, start_vcol = 0 }) + ) + eq( + "'end_vcol' specified without 'end_row'", + pcall_err(curwinmeths.text_height, { start_row = 2, end_vcol = 0 }) + ) + eq( + "Invalid 'start_vcol': out of range", + pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = -1 }) + ) + eq( + "Invalid 'start_vcol': out of range", + pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = X + 1 }) + ) + eq( + "Invalid 'end_vcol': out of range", + pcall_err(curwinmeths.text_height, { end_row = 2, end_vcol = -1 }) + ) + eq( + "Invalid 'end_vcol': out of range", + pcall_err(curwinmeths.text_height, { end_row = 2, end_vcol = X + 1 }) + ) + eq( + "'start_vcol' is higher than 'end_vcol'", + pcall_err( + curwinmeths.text_height, + { start_row = 2, end_row = 2, start_vcol = 10, end_vcol = 5 } + ) + ) end) it('with two diff windows', function() local X = meths.get_vvar('maxcol') local screen = Screen.new(45, 22) screen:set_default_attr_ids({ - [0] = {foreground = Screen.colors.Blue1, bold = true}; - [1] = {foreground = Screen.colors.Blue4, background = Screen.colors.Grey}; - [2] = {foreground = Screen.colors.Brown}; - [3] = {foreground = Screen.colors.Blue1, background = Screen.colors.LightCyan1, bold = true}; - [4] = {background = Screen.colors.LightBlue}; - [5] = {foreground = Screen.colors.Blue4, background = Screen.colors.LightGrey}; - [6] = {background = Screen.colors.Plum1}; - [7] = {background = Screen.colors.Red, bold = true}; - [8] = {reverse = true}; - [9] = {bold = true, reverse = true}; + [0] = { foreground = Screen.colors.Blue1, bold = true }, + [1] = { foreground = Screen.colors.Blue4, background = Screen.colors.Grey }, + [2] = { foreground = Screen.colors.Brown }, + [3] = { + foreground = Screen.colors.Blue1, + background = Screen.colors.LightCyan1, + bold = true, + }, + [4] = { background = Screen.colors.LightBlue }, + [5] = { foreground = Screen.colors.Blue4, background = Screen.colors.LightGrey }, + [6] = { background = Screen.colors.Plum1 }, + [7] = { background = Screen.colors.Red, bold = true }, + [8] = { reverse = true }, + [9] = { bold = true, reverse = true }, }) screen:attach() exec([[ @@ -670,7 +741,8 @@ describe('API/win', function() windo diffthis ]]) feed('24gg') - screen:expect{grid=[[ + screen:expect { + grid = [[ {1: }{2: }{3:----------------}│{1: }{2: 1 }{4:00000001! }| {1: }{2: }{3:----------------}│{1: }{2: 2 }{4:00000002!! }| {1: }{2: 1 }00000003!!! │{1: }{2: 3 }00000003!!! | @@ -693,13 +765,16 @@ describe('API/win', function() {1: }{2: 41 }{4:00000050!!!!!!!!}│{1: }{2: }{3:----------------}| {8:[No Name] [+] }{9:[No Name] [+] }| | - ]]} + ]], + } screen:try_resize(45, 3) - screen:expect{grid=[[ + screen:expect { + grid = [[ {1: }{2: 19 }00000028!!!!!!!!│{1: }{2: 24 }^00000028!!!!!!!!| {8:[No Name] [+] }{9:[No Name] [+] }| | - ]]} + ]], + } eq({ all = 20, fill = 5 }, meths.win_text_height(1000, {})) eq({ all = 20, fill = 5 }, meths.win_text_height(1001, {})) eq({ all = 20, fill = 5 }, meths.win_text_height(1000, { start_row = 0 })) @@ -724,27 +799,51 @@ describe('API/win', function() eq({ all = 7, fill = 3 }, meths.win_text_height(1001, { start_row = 16, end_row = 19 })) eq({ all = 6, fill = 5 }, meths.win_text_height(1000, { start_row = -1 })) eq({ all = 5, fill = 5 }, meths.win_text_height(1000, { start_row = -1, start_vcol = X })) - eq({ all = 0, fill = 0 }, meths.win_text_height(1000, { start_row = -1, start_vcol = X, end_row = -1 })) - eq({ all = 0, fill = 0 }, meths.win_text_height(1000, { start_row = -1, start_vcol = X, end_row = -1, end_vcol = X })) - eq({ all = 1, fill = 0 }, meths.win_text_height(1000, { start_row = -1, start_vcol = 0, end_row = -1, end_vcol = X })) + eq( + { all = 0, fill = 0 }, + meths.win_text_height(1000, { start_row = -1, start_vcol = X, end_row = -1 }) + ) + eq( + { all = 0, fill = 0 }, + meths.win_text_height(1000, { start_row = -1, start_vcol = X, end_row = -1, end_vcol = X }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(1000, { start_row = -1, start_vcol = 0, end_row = -1, end_vcol = X }) + ) eq({ all = 3, fill = 2 }, meths.win_text_height(1001, { end_row = 0 })) eq({ all = 2, fill = 2 }, meths.win_text_height(1001, { end_row = 0, end_vcol = 0 })) - eq({ all = 2, fill = 2 }, meths.win_text_height(1001, { start_row = 0, end_row = 0, end_vcol = 0 })) - eq({ all = 0, fill = 0 }, meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = 0 })) - eq({ all = 1, fill = 0 }, meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = X })) + eq( + { all = 2, fill = 2 }, + meths.win_text_height(1001, { start_row = 0, end_row = 0, end_vcol = 0 }) + ) + eq( + { all = 0, fill = 0 }, + meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = 0 }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = X }) + ) eq({ all = 11, fill = 5 }, meths.win_text_height(1001, { end_row = 18 })) - eq({ all = 9, fill = 3 }, meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 18 })) + eq( + { all = 9, fill = 3 }, + meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 18 }) + ) eq({ all = 10, fill = 5 }, meths.win_text_height(1001, { end_row = 18, end_vcol = 0 })) - eq({ all = 8, fill = 3 }, meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 18, end_vcol = 0 })) + eq( + { all = 8, fill = 3 }, + meths.win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 18, end_vcol = 0 }) + ) end) it('with wrapped lines', function() local X = meths.get_vvar('maxcol') local screen = Screen.new(45, 22) screen:set_default_attr_ids({ - [0] = {foreground = Screen.colors.Blue1, bold = true}; - [1] = {foreground = Screen.colors.Brown}; - [2] = {background = Screen.colors.Yellow}; + [0] = { foreground = Screen.colors.Blue1, bold = true }, + [1] = { foreground = Screen.colors.Brown }, + [2] = { background = Screen.colors.Yellow }, }) screen:attach() exec([[ @@ -752,9 +851,22 @@ describe('API/win', function() call setline(1, repeat([repeat('foobar-', 36)], 3)) ]]) local ns = meths.create_namespace('') - meths.buf_set_extmark(0, ns, 1, 100, { virt_text = {{('?'):rep(15), 'Search'}}, virt_text_pos = 'inline' }) - meths.buf_set_extmark(0, ns, 2, 200, { virt_text = {{('!'):rep(75), 'Search'}}, virt_text_pos = 'inline' }) - screen:expect{grid=[[ + meths.buf_set_extmark( + 0, + ns, + 1, + 100, + { virt_text = { { ('?'):rep(15), 'Search' } }, virt_text_pos = 'inline' } + ) + meths.buf_set_extmark( + 0, + ns, + 2, + 200, + { virt_text = { { ('!'):rep(75), 'Search' } }, virt_text_pos = 'inline' } + ) + screen:expect { + grid = [[ {1: 1 }^foobar-foobar-foobar-foobar-foobar-foobar| -foobar-foobar-foobar-foobar-foobar-foobar-fo| obar-foobar-foobar-foobar-foobar-foobar-fooba| @@ -777,48 +889,123 @@ describe('API/win', function() {2:!!!!!!!!!}ar-foobar-foobar-foobar-foobar-fooba| r-foobar-foobar- | | - ]]} + ]], + } screen:try_resize(45, 2) - screen:expect{grid=[[ + screen:expect { + grid = [[ {1: 1 }^foobar-foobar-foobar-foobar-foobar-foobar| | - ]]} + ]], + } eq({ all = 21, fill = 0 }, meths.win_text_height(0, {})) eq({ all = 6, fill = 0 }, meths.win_text_height(0, { start_row = 0, end_row = 0 })) eq({ all = 7, fill = 0 }, meths.win_text_height(0, { start_row = 1, end_row = 1 })) eq({ all = 8, fill = 0 }, meths.win_text_height(0, { start_row = 2, end_row = 2 })) - eq({ all = 0, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 0 })) - eq({ all = 1, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 41 })) - eq({ all = 2, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 42 })) - eq({ all = 2, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 86 })) - eq({ all = 3, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 87 })) - eq({ all = 6, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 266 })) - eq({ all = 7, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 267 })) - eq({ all = 7, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 311 })) - eq({ all = 7, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 312 })) - eq({ all = 7, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = X })) - eq({ all = 7, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 40, end_row = 1, end_vcol = X })) - eq({ all = 6, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 41, end_row = 1, end_vcol = X })) - eq({ all = 6, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 85, end_row = 1, end_vcol = X })) - eq({ all = 5, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = X })) - eq({ all = 2, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 265, end_row = 1, end_vcol = X })) - eq({ all = 1, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 266, end_row = 1, end_vcol = X })) - eq({ all = 1, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 310, end_row = 1, end_vcol = X })) - eq({ all = 0, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 311, end_row = 1, end_vcol = X })) - eq({ all = 1, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = 131 })) - eq({ all = 1, fill = 0 }, meths.win_text_height(0, { start_row = 1, start_vcol = 221, end_row = 1, end_vcol = 266 })) + eq( + { all = 0, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 0 }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 41 }) + ) + eq( + { all = 2, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 42 }) + ) + eq( + { all = 2, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 86 }) + ) + eq( + { all = 3, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 87 }) + ) + eq( + { all = 6, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 266 }) + ) + eq( + { all = 7, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 267 }) + ) + eq( + { all = 7, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 311 }) + ) + eq( + { all = 7, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 312 }) + ) + eq( + { all = 7, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = X }) + ) + eq( + { all = 7, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 40, end_row = 1, end_vcol = X }) + ) + eq( + { all = 6, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 41, end_row = 1, end_vcol = X }) + ) + eq( + { all = 6, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 85, end_row = 1, end_vcol = X }) + ) + eq( + { all = 5, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = X }) + ) + eq( + { all = 2, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 265, end_row = 1, end_vcol = X }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 266, end_row = 1, end_vcol = X }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 310, end_row = 1, end_vcol = X }) + ) + eq( + { all = 0, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 311, end_row = 1, end_vcol = X }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = 131 }) + ) + eq( + { all = 1, fill = 0 }, + meths.win_text_height(0, { start_row = 1, start_vcol = 221, end_row = 1, end_vcol = 266 }) + ) eq({ all = 18, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 131 })) eq({ all = 19, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 130 })) eq({ all = 20, fill = 0 }, meths.win_text_height(0, { end_row = 2, end_vcol = 311 })) eq({ all = 21, fill = 0 }, meths.win_text_height(0, { end_row = 2, end_vcol = 312 })) - eq({ all = 17, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 131, end_row = 2, end_vcol = 311 })) - eq({ all = 19, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 130, end_row = 2, end_vcol = 312 })) + eq( + { all = 17, fill = 0 }, + meths.win_text_height(0, { start_row = 0, start_vcol = 131, end_row = 2, end_vcol = 311 }) + ) + eq( + { all = 19, fill = 0 }, + meths.win_text_height(0, { start_row = 0, start_vcol = 130, end_row = 2, end_vcol = 312 }) + ) eq({ all = 16, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 221 })) eq({ all = 17, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 220 })) eq({ all = 14, fill = 0 }, meths.win_text_height(0, { end_row = 2, end_vcol = 41 })) eq({ all = 15, fill = 0 }, meths.win_text_height(0, { end_row = 2, end_vcol = 42 })) - eq({ all = 9, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 221, end_row = 2, end_vcol = 41 })) - eq({ all = 11, fill = 0 }, meths.win_text_height(0, { start_row = 0, start_vcol = 220, end_row = 2, end_vcol = 42 })) + eq( + { all = 9, fill = 0 }, + meths.win_text_height(0, { start_row = 0, start_vcol = 221, end_row = 2, end_vcol = 41 }) + ) + eq( + { all = 11, fill = 0 }, + meths.win_text_height(0, { start_row = 0, start_vcol = 220, end_row = 2, end_vcol = 42 }) + ) end) end) @@ -826,11 +1013,20 @@ describe('API/win', function() it('noautocmd option works', function() command('autocmd BufEnter,BufLeave,BufWinEnter * let g:fired = 1') meths.open_win(meths.create_buf(true, true), true, { - relative='win', row=3, col=3, width=12, height=3, noautocmd=true + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, + noautocmd = true, }) eq(0, funcs.exists('g:fired')) meths.open_win(meths.create_buf(true, true), true, { - relative='win', row=3, col=3, width=12, height=3 + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, }) eq(1, funcs.exists('g:fired')) end) @@ -838,25 +1034,51 @@ describe('API/win', function() it('disallowed in cmdwin if enter=true or buf=curbuf', function() local new_buf = meths.create_buf(true, true) feed('q:') - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.open_win, new_buf, true, { - relative='editor', row=5, col=5, width=5, height=5, - })) - eq('E11: Invalid in command-line window; <CR> executes, CTRL-C quits', - pcall_err(meths.open_win, 0, false, { - relative='editor', row=5, col=5, width=5, height=5, - })) - - eq(new_buf, meths.win_get_buf(meths.open_win(new_buf, false, { - relative='editor', row=5, col=5, width=5, height=5, - }))) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.open_win, new_buf, true, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + }) + ) + eq( + 'E11: Invalid in command-line window; <CR> executes, CTRL-C quits', + pcall_err(meths.open_win, 0, false, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + }) + ) + + eq( + new_buf, + meths.win_get_buf(meths.open_win(new_buf, false, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + })) + ) end) it('aborts if buffer is invalid', function() local wins_before = meths.list_wins() - eq('Invalid buffer id: 1337', pcall_err(meths.open_win, 1337, false, { - relative='editor', row=5, col=5, width=5, height=5, - })) + eq( + 'Invalid buffer id: 1337', + pcall_err(meths.open_win, 1337, false, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + }) + ) eq(wins_before, meths.list_wins()) end) end) @@ -865,7 +1087,11 @@ describe('API/win', function() it('includes border', function() local b = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' } local win = meths.open_win(0, true, { - relative='win', row=3, col=3, width=12, height=3, + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, border = b, }) @@ -875,17 +1101,21 @@ describe('API/win', function() it('includes border with highlight group', function() local b = { - {'a', 'Normal'}, - {'b', 'Special'}, - {'c', 'String'}, - {'d', 'Comment'}, - {'e', 'Visual'}, - {'f', 'Error'}, - {'g', 'Constant'}, - {'h', 'PreProc'}, + { 'a', 'Normal' }, + { 'b', 'Special' }, + { 'c', 'String' }, + { 'd', 'Comment' }, + { 'e', 'Visual' }, + { 'f', 'Error' }, + { 'g', 'Constant' }, + { 'h', 'PreProc' }, } local win = meths.open_win(0, true, { - relative='win', row=3, col=3, width=12, height=3, + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, border = b, }) @@ -894,11 +1124,17 @@ describe('API/win', function() end) it('includes title and footer', function() - local title = { {'A', {'StatusLine', 'TabLine'}}, {'B'}, {'C', 'WinBar'} } - local footer = { {'A', 'WinBar'}, {'B'}, {'C', {'StatusLine', 'TabLine'}} } + local title = { { 'A', { 'StatusLine', 'TabLine' } }, { 'B' }, { 'C', 'WinBar' } } + local footer = { { 'A', 'WinBar' }, { 'B' }, { 'C', { 'StatusLine', 'TabLine' } } } local win = meths.open_win(0, true, { - relative='win', row=3, col=3, width=12, height=3, - border = 'single', title = title, footer = footer, + relative = 'win', + row = 3, + col = 3, + width = 12, + height = 3, + border = 'single', + title = title, + footer = footer, }) local cfg = meths.win_get_config(win) @@ -908,35 +1144,39 @@ describe('API/win', function() end) describe('set_config', function() - it('no crash with invalid title', function () + it('no crash with invalid title', function() local win = meths.open_win(0, true, { width = 10, height = 10, - relative = "editor", + relative = 'editor', row = 10, col = 10, - title = { { "test" } }, - border = "single", + title = { { 'test' } }, + border = 'single', }) - eq("title/footer cannot be an empty array", - pcall_err(meths.win_set_config, win, {title = {}})) - command("redraw!") + eq( + 'title/footer cannot be an empty array', + pcall_err(meths.win_set_config, win, { title = {} }) + ) + command('redraw!') assert_alive() end) - it('no crash with invalid footer', function () + it('no crash with invalid footer', function() local win = meths.open_win(0, true, { width = 10, height = 10, - relative = "editor", + relative = 'editor', row = 10, col = 10, - footer = { { "test" } }, - border = "single", + footer = { { 'test' } }, + border = 'single', }) - eq("title/footer cannot be an empty array", - pcall_err(meths.win_set_config, win, {footer = {}})) - command("redraw!") + eq( + 'title/footer cannot be an empty array', + pcall_err(meths.win_set_config, win, { footer = {} }) + ) + command('redraw!') assert_alive() end) end) |