From 130cb4815a5c6625a938b1e93a7d60d7a38ad8dd Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 1 Dec 2023 13:56:04 +0800 Subject: fix(api): use a conditional stack for nvim_cmd (#26341) --- test/functional/api/vim_spec.lua | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 8bbadda9b0..7287666190 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -4547,5 +4547,24 @@ describe('API', function() 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()'}}, {})) + end) + it(':throw does not crash #24556', function() + eq('42', pcall_err(meths.cmd, {cmd = 'throw', args = {'42'}}, {})) + end) + it('can use :return #24556', function() + exec([[ + func Foo() + let g:pos = 'before' + call nvim_cmd({'cmd': 'return', 'args': ['[1, 2, 3]']}, {}) + let g:pos = 'after' + endfunc + let g:result = Foo() + ]]) + eq('before', meths.get_var('pos')) + eq({1, 2, 3}, meths.get_var('result')) + end) end) end) -- cgit From 1cc358aed6fde4f537d971ad9ee207f3d4afc97a Mon Sep 17 00:00:00 2001 From: Luuk van Baal Date: Sat, 2 Dec 2023 11:59:54 +0100 Subject: fix(extmarks): restore old position before revalidating --- test/functional/api/extmark_spec.lua | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 44a151cf6a..8bfb0effba 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1628,26 +1628,27 @@ describe('API/extmarks', function() screen = Screen.new(40, 6) screen:attach() feed('dd6iaaa bbb cccgg') - set_extmark(ns, 1, 0, 0, { invalidate = true, sign_text = 'S1' }) - set_extmark(ns, 2, 1, 0, { invalidate = true, sign_text = 'S2' }) + meths.set_option_value('signcolumn', 'auto:2', {}) + set_extmark(ns, 1, 0, 0, { invalidate = true, sign_text = 'S1', end_row = 1 }) + set_extmark(ns, 2, 1, 0, { invalidate = true, sign_text = 'S2', end_row = 2 }) -- mark with invalidate is removed - command('d') + command('d2') screen:expect([[ S2^aaa bbb ccc | aaa bbb ccc | aaa bbb ccc | aaa bbb ccc | - aaa bbb ccc | + | | ]]) -- mark is restored with undo_restore == true command('silent undo') screen:expect([[ - S1^aaa bbb ccc | - S2aaa bbb ccc | - aaa bbb ccc | - aaa bbb ccc | - aaa bbb ccc | + S1 ^aaa bbb ccc | + S1S2aaa bbb ccc | + S2 aaa bbb ccc | + aaa bbb ccc | + aaa bbb ccc | | ]]) -- mark is deleted with undo_restore == false -- cgit From 64a14026d76ba1798d91e15a941fcb6af7cbc5ad Mon Sep 17 00:00:00 2001 From: Evgeni Chasnovski Date: Wed, 29 Nov 2023 22:16:09 +0200 Subject: feat(highlight): update default color scheme Problem: Default color scheme is suboptimal. Solution: Start using new color scheme. Introduce new `vim` color scheme for opt-in backward compatibility. ------ Main design ideas - Be "Neovim branded". - Be minimal for 256 colors with a bit more shades for true colors. - Be accessible through high enough contrast ratios. - Be suitable for dark and light backgrounds via exchange of dark and light palettes. ------ Palettes - Have dark and light variants. Implemented through exporeted `NvimDark*` and `NvimLight*` hex colors. - Palettes have 4 shades of grey for UI elements and 6 colors (red, yellow, green, cyan, blue, magenta). - Actual values are computed procedurally in Oklch color space based on a handful of hyperparameters. - Each color has a 256 colors variant with perceptually closest color. ------ Highlight groups Use: - Grey shades for general UI according to their design. - Bold text for keywords (`Statement` highlight group). This is an important choice to increase accessibility for people with color deficiencies, as it doesn't rely on actual color. - Green for strings, `DiffAdd` (as background), `DiagnosticOk`, and some minor text UI elements. - Cyan as main syntax color, i.e. for function usage (`Function` highlight group), `DiffText`, `DiagnosticInfo`, and some minor text UI elements. - Red to generally mean high user attention, i.e. errors; in particular for `ErrorMsg`, `DiffDelete`, `DiagnosticError`. - Yellow very sparingly only with true colors to mean mild user attention, i.e. warnings. That is, `DiagnosticWarn` and `WarningMsg`. - Blue very sparingly only with true colors as `DiagnosticHint` and some additional important syntax group (like `Identifier`). - Magenta very carefully (if at all). ------ Notes - To make tests work without relatively larege updates, each one is prepended with an equivalent of the call `:colorscheme vim`. Plus some tests which spawn new Neovim instances also now use 'vim' color scheme. In some cases tests are updated to fit new default color scheme. --- test/functional/api/highlight_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua index 7d7d07e30e..c9edbf825d 100644 --- a/test/functional/api/highlight_spec.lua +++ b/test/functional/api/highlight_spec.lua @@ -561,7 +561,7 @@ describe('API: get highlight', function() end) it('can correctly detect links', function() - command('hi String guifg=#a6e3a1') + command('hi String guifg=#a6e3a1 ctermfg=NONE') command('hi link @string string') command('hi link @string.cpp @string') eq({ fg = 10937249 }, meths.get_hl(0, { name = 'String' })) -- cgit From 0b74ad0a641f28d9d3da5353e98372d87078bd9d Mon Sep 17 00:00:00 2001 From: Riccardo Mazzarini Date: Tue, 5 Dec 2023 12:33:57 +0100 Subject: refactor(api): complete conversion from `Dictionary` to `Dict(opts)` (#26365) --- test/functional/api/buffer_updates_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index 80e29c1ff2..bf76db432f 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -762,7 +762,7 @@ describe('API: buffer events:', function() it('returns a proper error on nonempty options dict', function() clear() local b = editoriginal(false) - eq("Invalid 'opts' 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() -- cgit From cca6c4c6986abc67cd213ad1d32d329384a57790 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Wed, 6 Dec 2023 17:02:13 +0100 Subject: feat(rpc): allow empty string key in msgpack => Vim conversion MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Problem: Since e057b38e7037 #20757 we support empty key in JSON encode/decode, but we don't allow it in RPC object => Vim dict conversion. But empty string is a valid key in Vim dicts and the msgpack spec. Empty string key was disallowed in 7c01d5ff9286 (2014) but that commit/PR doesn't explicitly discuss it, so presumably it was a "seems reasonable" decision (or Vimscript didn't allow empty keys until later). Solution: Remove the check in `object_to_vim()`. Note that `tv_dict_item_alloc_len` will invoke `memcpy(…, 0)` but that's allowed by the C spec: https://stackoverflow.com/a/3751937/152142 --- test/functional/api/vim_spec.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 7287666190..abae346701 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1319,6 +1319,10 @@ describe('API', function() 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')) + -- Set locked g: var. command('lockvar lua') eq('Key is locked: lua', pcall_err(meths.del_var, 'lua')) @@ -1983,7 +1987,7 @@ describe('API', function() 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("Empty dictionary keys aren't allowed", + eq('E474: Failed to convert list to msgpack string buffer', pcall_err(nvim, 'load_context', { regs = { { [''] = '' } } })) end) end) -- cgit From 3bb5d2f2192b63e368a4f573f66406eba3ee66b3 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Fri, 8 Dec 2023 08:00:27 +0800 Subject: test: use termopen() instead of :terminal more (#26462) --- test/functional/api/buffer_updates_spec.lua | 6 +++++- test/functional/api/vim_spec.lua | 10 +++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index bf76db432f..6c250ad6ce 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -1,6 +1,7 @@ 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 nvim_prog = helpers.nvim_prog @@ -832,7 +833,10 @@ describe('API: buffer events:', function() it('when :terminal lines change', function() local buffer_lines = {} local expected_lines = {} - command('terminal "'..nvim_prog..'" -u NONE -i NONE -n -c "set shortmess+=A"') + funcs.termopen({ nvim_prog, '-u', 'NONE', '-i', 'NONE', '-n', '-c', 'set shortmess+=A' }, { + env = { VIMRUNTIME = os.getenv('VIMRUNTIME') } + }) + local b = nvim('get_current_buf') ok(buffer('attach', b, true, {})) diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index abae346701..7a3116cba5 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -2396,7 +2396,11 @@ describe('API', function() eq(info, meths.get_chan_info(3)) -- :terminal with args + running process. - command(':exe "terminal" shellescape(v:progpath) "-u NONE -i NONE"') + command('enew') + local progpath_esc = eval('shellescape(v:progpath)') + funcs.termopen(('%s -u NONE -i NONE'):format(progpath_esc), { + env = { VIMRUNTIME = os.getenv('VIMRUNTIME') } + }) eq(-1, eval('jobwait([&channel], 0)[0]')) -- Running? local expected2 = { stream = 'job', @@ -2406,11 +2410,11 @@ describe('API', function() eval('&shell'), '/s', '/c', - fmt('"%s -u NONE -i NONE"', eval('shellescape(v:progpath)')), + fmt('"%s -u NONE -i NONE"', progpath_esc), } or { eval('&shell'), eval('&shellcmdflag'), - fmt('%s -u NONE -i NONE', eval('shellescape(v:progpath)')), + fmt('%s -u NONE -i NONE', progpath_esc), } ), mode = 'terminal', -- cgit From 1037ce2e461034a20e35ad59969fd05d5ad68b91 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 9 Dec 2023 20:42:00 +0800 Subject: test: avoid repeated screen lines in expected states This is the command invoked repeatedly to make the changes: :%s/^\(.*\)|\%(\*\(\d\+\)\)\?$\n\1|\%(\*\(\d\+\)\)\?$/\=submatch(1)..'|*'..(max([str2nr(submatch(2)),1])+max([str2nr(submatch(3)),1]))/g --- test/functional/api/buffer_spec.lua | 70 ++++-------------- test/functional/api/extmark_spec.lua | 42 +++-------- test/functional/api/vim_spec.lua | 137 ++++++++--------------------------- test/functional/api/window_spec.lua | 56 ++++---------- 4 files changed, 66 insertions(+), 239 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index 6ed9aa574a..db910545ef 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -170,10 +170,7 @@ describe('api/buf', function() screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| www | xxx | @@ -186,10 +183,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 0, 2, true, {"aaabbb"}) screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| www | xxx | @@ -203,10 +197,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 3, 4, true, {"wwweeee"}) screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| wwweeee | xxx | @@ -220,10 +211,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 3, 3, true, {"mmm"}) screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| wwweeee | xxx | @@ -236,10 +224,7 @@ describe('api/buf', function() meths.win_set_cursor(0, {7, 0}) screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| wwweeee | xxx | @@ -252,10 +237,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 4, 4, true, {"mmmeeeee"}) screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| mmmeeeee | wwweeee | @@ -275,10 +257,7 @@ describe('api/buf', function() screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:[No Name] }| www | xxx | @@ -291,10 +270,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 0, 2, true, {"aaabbb"}) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:[No Name] }| www | xxx | @@ -308,10 +284,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 3, 4, true, {"wwweeee"}) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:[No Name] }| wwweeee | xxx | @@ -325,10 +298,7 @@ describe('api/buf', function() meths.buf_set_lines(buf, 3, 3, true, {"mmm"}) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:[No Name] }| mmm | wwweeee | @@ -1690,10 +1660,7 @@ describe('api/buf', function() screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| www | xxx | @@ -1706,10 +1673,7 @@ describe('api/buf', function() screen:expect{grid=[[ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {3:[No Name] }| www | xxx | @@ -1729,10 +1693,7 @@ describe('api/buf', function() screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:[No Name] }| www | xxx | @@ -1745,10 +1706,7 @@ describe('api/buf', function() meths.buf_set_text(buf, 0,3, 1,0, {"X"}) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:[No Name] }| www | xxx | diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 8bfb0effba..facabee7a4 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -435,14 +435,7 @@ describe('API/extmarks', function() -- This shouldn't seg fault screen:expect([[ 12345^ 1 | - ~ | - ~ | - ~ | - ~ | - ~ | - ~ | - ~ | - ~ | + ~ |*8 | ]]) end) @@ -495,14 +488,7 @@ describe('API/extmarks', function() insert('abc') screen:expect([[ ab^c12345 | - ~ | - ~ | - ~ | - ~ | - ~ | - ~ | - ~ | - ~ | + ~ |*8 | ]]) local rv = get_extmark_by_id(ns, marks[1]) @@ -1635,11 +1621,8 @@ describe('API/extmarks', function() command('d2') screen:expect([[ S2^aaa bbb ccc | - aaa bbb ccc | - aaa bbb ccc | - aaa bbb ccc | - | - | + aaa bbb ccc |*3 + |*2 ]]) -- mark is restored with undo_restore == true command('silent undo') @@ -1647,8 +1630,7 @@ describe('API/extmarks', function() S1 ^aaa bbb ccc | S1S2aaa bbb ccc | S2 aaa bbb ccc | - aaa bbb ccc | - aaa bbb ccc | + aaa bbb ccc |*2 | ]]) -- mark is deleted with undo_restore == false @@ -1923,12 +1905,9 @@ describe('API/win_extmark', function() screen:expect({ grid = [[ ## grid 1 - [4:--------------------]| - [4:--------------------]| - [4:--------------------]| + [4:--------------------]|*3 [No Name] [+] | - [2:--------------------]| - [2:--------------------]| + [2:--------------------]|*2 [No Name] [+] | [3:--------------------]| ## grid 2 @@ -1959,12 +1938,9 @@ describe('API/win_extmark', function() screen:expect({ grid = [[ ## grid 1 - [4:--------------------]| - [4:--------------------]| - [4:--------------------]| + [4:--------------------]|*3 [No Name] [+] | - [2:--------------------]| - [2:--------------------]| + [2:--------------------]|*2 [No Name] [+] | [3:--------------------]| ## grid 2 diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 7a3116cba5..3d3b478d66 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -285,12 +285,7 @@ describe('API', function() meths.exec2("echo 'hello'", { output = false }) screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*6 hello | ]]} end) @@ -304,10 +299,7 @@ describe('API', function() meths.exec2("echo 'hello'", { output = true }) screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*4 | ]]} exec([[ @@ -318,10 +310,7 @@ describe('API', function() feed([[:echon 1 | call Print() | echon 5]]) screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*4 15 | ]]} end) @@ -1140,8 +1129,7 @@ describe('API', function() nvim('paste', '', true, 3) screen:expect([[ | - ~ | - ~ | + ~ |*2 :Foo^ | ]]) end) @@ -1152,8 +1140,7 @@ describe('API', function() nvim('paste', 'normal! \023\022\006\027', true, -1) screen:expect([[ | - ~ | - ~ | + ~ |*2 :normal! ^W^V^F^[^ | ]]) end) @@ -2106,9 +2093,7 @@ describe('API', function() feed([[:call nvim_out_write("\na\n")]]) screen:expect{grid=[[ | - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*3 {2: }| | a | @@ -2118,8 +2103,7 @@ describe('API', function() feed([[:call nvim_out_write("b\n\nc\n")]]) screen:expect{grid=[[ | - {0:~ }| - {0:~ }| + {0:~ }|*2 {2: }| b | | @@ -2132,9 +2116,7 @@ describe('API', function() feed([[:lua vim.api.nvim_out_write('aaa\0bbb\0\0ccc\nddd\0\0\0eee\n')]]) screen:expect{grid=[[ | - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*3 {2: }| aaa{3:^@}bbb{3:^@^@}ccc | ddd{3:^@^@^@}eee | @@ -2161,12 +2143,7 @@ describe('API', function() nvim_async('err_write', 'has bork\n') screen:expect([[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*6 {1:has bork} | ]]) end) @@ -2175,9 +2152,7 @@ describe('API', function() nvim_async('err_write', 'something happened\nvery bad\n') screen:expect([[ | - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*3 {3: }| {1:something happened} | {1:very bad} | @@ -2205,12 +2180,7 @@ describe('API', function() nvim_async('err_write', 'fail\n') screen:expect([[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*6 {1:very fail} | ]]) helpers.poke_eventloop() @@ -2219,9 +2189,7 @@ describe('API', function() nvim_async('err_write', 'more fail\ntoo fail\n') screen:expect([[ | - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*3 {3: }| {1:more fail} | {1:too fail} | @@ -2234,9 +2202,7 @@ describe('API', function() nvim_async('err_write', 'aaa\0bbb\0\0ccc\nddd\0\0\0eee\n') screen:expect{grid=[[ | - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*3 {3: }| {1:aaa^@bbb^@^@ccc} | {1:ddd^@^@^@eee} | @@ -2274,12 +2240,7 @@ describe('API', function() feed('') screen:expect([[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*6 | ]]) end) @@ -2859,8 +2820,7 @@ describe('API', function() meths.set_current_buf(2) screen:expect([[ ^some text | - {1:~ }| - {1:~ }| + {1:~ }|*2 | ]], { [1] = {bold = true, foreground = Screen.colors.Blue1}, @@ -2937,8 +2897,7 @@ describe('API', function() meths.set_current_buf(edited_buf) screen:expect([[ ^some text | - {1:~ }| - {1:~ }| + {1:~ }|*2 | ]]) eq('nofile', meths.get_option_value('buftype', {buf=edited_buf})) @@ -2950,8 +2909,7 @@ describe('API', function() command('bwipe') screen:expect([[ ^ | - {1:~ }| - {1:~ }| + {1:~ }|*2 | ]]) end) @@ -3229,12 +3187,7 @@ describe('API', function() feed(':call nvim_echo([["msg"]], v:false, {})') screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*6 msg | ]]} end) @@ -3243,12 +3196,7 @@ describe('API', function() nvim_async("echo", {{"msg_a"}, {"msg_b", "Statement"}, {"msg_c", "Special"}}, true, {}) screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*6 msg_a{3:msg_b}{4:msg_c} | ]]} end) @@ -3257,9 +3205,7 @@ describe('API', function() nvim_async("echo", {{"msg_a\nmsg_a", "Statement"}, {"msg_b", "Special"}}, true, {}) screen:expect{grid=[[ | - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*3 {2: }| {3:msg_a} | {3:msg_a}{4:msg_b} | @@ -3338,8 +3284,7 @@ describe('API', function() {0:~}{3:Press ENTER or type command to continue}{1: }{0: }| {0:~}{4:term://~/config2/docs/pres//32693:vim --clean +smile 29,39 All}{0: }| {0:~}{1::call nvim__screenshot("smile2.cat") }{0: }| - {0:~ }| - {0:~ }| + {0:~ }|*2 | ]]} end) @@ -3367,13 +3312,8 @@ describe('API', function() screen:expect{grid=[[ | {0:~}{1:^ }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~}{1: }{0: }|*4 + {0:~ }|*3 | ]]} @@ -3381,13 +3321,8 @@ describe('API', function() screen:expect{grid=[[ | {0:~}{7: }{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~}{1: }{0: }|*4 + {0:~ }|*3 {6:-- TERMINAL --} | ]]} @@ -3400,13 +3335,8 @@ describe('API', function() screen:expect{grid=[[ | {0:~}{1:herrejösses!}{7: }{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~}{1: }{0: }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~}{1: }{0: }|*4 + {0:~ }|*3 {6:-- TERMINAL --} | ]]} eq('ba\024blaherrejösses!', exec_lua [[ return stream ]]) @@ -4159,8 +4089,7 @@ describe('API', function() screen:expect([[ foo | bar | - {0:~ }| - {0:~ }| + {0:~ }|*2 {1: }| Entering Ex mode. Type "visual" to go to Normal mode. | :1^ | @@ -4518,10 +4447,7 @@ describe('API', function() meths.cmd({cmd = 'echo', args = {[['hello']]}}, {output = true}) screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*4 | ]]} exec([[ @@ -4532,10 +4458,7 @@ describe('API', function() feed([[:echon 1 | call Print() | echon 5]]) screen:expect{grid=[[ ^ | - {0:~ }| - {0:~ }| - {0:~ }| - {0:~ }| + {0:~ }|*4 15 | ]]} end) diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 6737c2d15b..67284c01e0 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -96,14 +96,7 @@ describe('API/win', function() screen:expect{grid=[[ ^prologue | - | - | - | - | - | - | - | - | + |*8 ]]} -- cursor position is at beginning eq({1, 0}, window('get_cursor', win)) @@ -111,13 +104,7 @@ describe('API/win', function() -- move cursor to end window('set_cursor', win, {101, 0}) screen:expect{grid=[[ - | - | - | - | - | - | - | + |*7 ^epilogue | | ]]} @@ -126,14 +113,7 @@ describe('API/win', function() window('set_cursor', win, {1, 0}) screen:expect{grid=[[ ^prologue | - | - | - | - | - | - | - | - | + |*8 ]]} -- move focus to new window @@ -144,12 +124,10 @@ describe('API/win', function() eq({1, 0}, window('get_cursor', win)) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| + {1:~ }|*2 {2:[No Name] }| prologue | - | - | + |*2 {3:[No Name] [+] }| | ]]} @@ -158,11 +136,9 @@ describe('API/win', function() window('set_cursor', win, {101, 0}) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| + {1:~ }|*2 {2:[No Name] }| - | - | + |*2 epilogue | {3:[No Name] [+] }| | @@ -172,12 +148,10 @@ describe('API/win', function() window('set_cursor', win, {1, 0}) screen:expect{grid=[[ ^ | - {1:~ }| - {1:~ }| + {1:~ }|*2 {2:[No Name] }| prologue | - | - | + |*2 {3:[No Name] [+] }| | ]]} @@ -232,8 +206,7 @@ describe('API/win', function() bbb │bbb | ccc │ccc | {2:dd^d }│{2:ddd }| - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| + {1:~ }│{1:~ }|*2 {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 4,3 All}| | ]]) @@ -243,8 +216,7 @@ describe('API/win', function() bbb │bbb | ccc │ccc | {2:dd^d }│ddd | - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| + {1:~ }│{1:~ }|*2 {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 1,1 All}| | ]]) @@ -272,8 +244,7 @@ describe('API/win', function() bb{2:b} │bb{2:b} | cc{2:c} │cc{2:c} | dd^d │ddd | - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| + {1:~ }│{1:~ }|*2 {3:[No Name] [+] }{4:[No Name] [+] }| | ]]) @@ -283,8 +254,7 @@ describe('API/win', function() bb{2:b} │bbb | cc{2:c} │{2:c}cc | dd^d │{2:d}dd | - {1:~ }│{1:~ }| - {1:~ }│{1:~ }| + {1:~ }│{1:~ }|*2 {3:[No Name] [+] }{4:[No Name] [+] }| | ]]) -- cgit From d95e3a4c9c8f468158a1f1f23921ebbaae75cf8b Mon Sep 17 00:00:00 2001 From: glepnir Date: Sat, 9 Dec 2023 17:28:28 +0800 Subject: fix: use no_ff instead of ffdos as condition Problem: line2byte behavior is changed after commit b051b13. It no longer return `-1` on empty buffer. Solution: use `nof_ff` instead of `!ff_dos` as condition. Then compatible behavior of line2byte() is restored. --- test/functional/api/buffer_spec.lua | 1 + 1 file changed, 1 insertion(+) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index 6ed9aa574a..ed93135acb 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -1876,6 +1876,7 @@ describe('api/buf', function() it('works in empty buffer', function() eq(0, get_offset(0)) eq(1, get_offset(1)) + eq(-1, funcs.line2byte('$')) end) it('works in buffer with one line inserted', function() -- cgit From 3c2c022e5e299ecac4663c3813e2db5e2b099ffa Mon Sep 17 00:00:00 2001 From: Famiu Haque Date: Thu, 7 Dec 2023 01:34:29 +0600 Subject: refactor(options): remove option type macros Problem: We have `P_(BOOL|NUM|STRING)` macros to represent an option's type, which is redundant because `OptValType` can already do that. The current implementation of option type flags is also too limited to allow adding multitype options in the future. Solution: Remove `P_(BOOL|NUM|STRING)` and replace it with a new `type_flags` attribute in `vimoption_T`. Also do some groundwork for adding multitype options in the future. Side-effects: Attempting to set an invalid keycode option (e.g. `set t_foo=123`) no longer gives an error. --- test/functional/api/vim_spec.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 3d3b478d66..104ffd7d6c 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1478,9 +1478,9 @@ describe('API', function() 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", + 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\"", + eq("Invalid value for option 'scrolloff': expected number, got string \"wrong\"", pcall_err(nvim, 'set_option_value', 'scrolloff', 'wrong', {})) end) -- cgit From c18f3cfcdb8fc5a39b7c898eea619e3de94096b4 Mon Sep 17 00:00:00 2001 From: notomo Date: Sat, 16 Dec 2023 22:58:04 +0900 Subject: fix(api): crash after nvim_win_set_config title/footer validation error (#26606) --- test/functional/api/window_spec.lua | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 67284c01e0..f44326d0eb 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -906,4 +906,38 @@ describe('API/win', function() eq(footer, cfg.footer) end) end) + + describe('set_config', function() + it('no crash with invalid title', function () + local win = meths.open_win(0, true, { + width = 10, + height = 10, + relative = "editor", + row = 10, + col = 10, + title = { { "test" } }, + border = "single", + }) + 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 () + local win = meths.open_win(0, true, { + width = 10, + height = 10, + relative = "editor", + row = 10, + col = 10, + footer = { { "test" } }, + border = "single", + }) + eq("title/footer cannot be an empty array", + pcall_err(meths.win_set_config, win, {footer = {}})) + command("redraw!") + assert_alive() + end) + end) end) -- cgit From 1cf51a07a6bfb827efc36911cd018da3a3cb863b Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 19 Dec 2023 08:01:05 +0800 Subject: fix(api): don't set coladd of mark (#26648) --- test/functional/api/buffer_spec.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index b618bf0e6c..b89101a5e7 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -1990,11 +1990,13 @@ describe('api/buf', function() 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")) end) it('works with file/uppercase marks', function() curbufmeths.set_lines(-1, -1, true, {'a', 'bit of', 'text'}) - eq(true, curbufmeths.set_mark('Z', 3, 1, {})) - eq({3, 1}, curbufmeths.get_mark('Z')) + eq(true, curbufmeths.set_mark('Z', 3, 2, {})) + 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, {})) -- cgit From a42df117861f0f0233dec89a0d2cc79144d4fa4e Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 25 Dec 2023 15:50:58 +0800 Subject: test(extmarks): improve tests for ui_watched (#26732) --- test/functional/api/extmark_spec.lua | 58 +++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 24 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index facabee7a4..9b8d8a3afc 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1807,7 +1807,7 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, } }, }) @@ -1816,6 +1816,7 @@ describe('API/win_extmark', function() it('sends multiple ui-watched marks to ui', function() screen = Screen.new(20, 4) screen:attach() + feed('15A!') -- 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" }) @@ -1825,25 +1826,34 @@ describe('API/win_extmark', function() screen:expect({ grid = [[ non ui-watched line | - ui-watched lin^e | - ~ | + ui-watched line!!!!!| + !!!!!!!!!^! | | ]], extmarks = { [2] = { - -- earlier notifications - { {id = 1000}, 1, 1, 1, 0 }, - { {id = 1000}, 1, 1, 1, 0 }, { {id = 1000}, 1, 2, 1, 2 }, - { {id = 1000}, 1, 1, 1, 0 }, { {id = 1000}, 1, 2, 1, 2 }, { {id = 1000}, 1, 3, 1, 4 }, - { {id = 1000}, 1, 1, 1, 0 }, { {id = 1000}, 1, 2, 1, 2 }, { {id = 1000}, 1, 3, 1, 4 }, { {id = 1000}, 1, 4, 1, 6 }, + -- notification from 1st call + { {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 }, + -- notifications from 3nd call + { {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 }, -- final -- overlay - { {id = 1000}, 1, 1, 1, 0 }, - { {id = 1000}, 1, 2, 1, 2 }, - { {id = 1000}, 1, 3, 1, 4 }, - { {id = 1000}, 1, 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}, 1, 5, 1, 16 }, + { {id = 1000}, ns, marks[5], 2, 11 }, } }, }) @@ -1868,9 +1878,9 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, -- updated and wrapped to 3rd line - { {id = 1000}, 1, 1, 2, 2 }, + { {id = 1000}, ns, marks[1], 2, 2 }, } } }) @@ -1885,9 +1895,9 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, -- updated and wrapped to 3rd line - { {id = 1000}, 1, 1, 2, 2 }, + { {id = 1000}, ns, marks[1], 2, 2 }, -- scrolled up one line, should be handled by grid scroll } } @@ -1923,13 +1933,13 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, -- updated after split - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, }, [4] = { -- only after split - { {id = 1001}, 1, 1, 1, 16 }, + { {id = 1001}, ns, marks[1], 1, 16 }, } } }) @@ -1956,14 +1966,14 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, -- updated after split - { {id = 1000}, 1, 1, 1, 16 }, + { {id = 1000}, ns, marks[1], 1, 16 }, }, [4] = { - { {id = 1001}, 1, 1, 1, 16 }, + { {id = 1001}, ns, marks[1], 1, 16 }, -- updated - { {id = 1001}, 1, 1, 2, 2 }, + { {id = 1001}, ns, marks[1], 2, 2 }, } } }) -- cgit From ddc8dd187d1c4da451332faf545171f242aa6b7a Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 25 Dec 2023 18:57:55 +0800 Subject: refactor(drawline): reduce size of wlv.extra[] (#26733) It's now only used for transchar_hex(), which only needs 11 bytes. --- test/functional/api/extmark_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 9b8d8a3afc..06eb938927 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1837,7 +1837,7 @@ describe('API/win_extmark', function() -- notifications from 2nd call { {id = 1000}, ns, marks[1], 1, 0 }, { {id = 1000}, ns, marks[2], 1, 2 }, - -- notifications from 3nd call + -- 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 }, -- cgit From bbd5c6363c25e8fbbfb962f8f6c5ea1800d431ca Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Tue, 26 Dec 2023 00:16:03 +0100 Subject: feat(extmarks): add virt_text_repeat_linebreak flag (#26625) Problem: Unable to predict which byte-offset to place virtual text to make it repeat visually in the wrapped part of a line. Solution: Add a flag to nvim_buf_set_extmark() that causes virtual text to repeat in wrapped lines. --- test/functional/api/extmark_spec.lua | 2 ++ 1 file changed, 2 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 06eb938927..56383986f3 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1549,6 +1549,7 @@ describe('API/extmarks', function() 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 })) @@ -1557,6 +1558,7 @@ describe('API/extmarks', function() 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, -- cgit From 59d117ec99b6037cb9fad5bbfb6d0b18f5012927 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Thu, 7 Dec 2023 12:19:35 +0100 Subject: build: enable lintlua for test/ dir Problem: Not all Lua code is checked by stylua. Automating code-style is an important mechanism for reducing time spent on accidental (non-essential) complexity. Solution: - Enable stylua for entire `test/` directory. - Exclude these high-churn files until this issue is resolved: https://github.com/JohnnyMorganz/StyLua/issues/829 ``` test/functional/ui/decorations_spec.lua | 3560 ++++++++++++++++++++++++++++++++++++---------------- test/functional/ui/float_spec.lua | 5826 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------- test/functional/ui/multigrid_spec.lua | 1349 ++++++++++++++------ ``` - Make surgical changes to these files (or add `stylua: ignore` in some small scopes) to improve the result: ``` test/functional/vimscript/msgpack_functions_spec.lua | 1414 +++++++++++++++------ test/functional/api/buffer_spec.lua | 1389 +++++++++++---------- test/functional/api/vim_spec.lua | 2740 +++++++++++++++++++++++----------------- ``` - These "high churn" files are NOT excluded because the changes are largely an improvement: ``` test/functional/plugin/lsp_spec.lua | 2198 ++++++++++++++++++--------------- test/functional/plugin/shada_spec.lua | 4078 +++++++++++++++++++++++++++++++++++------------------------- test/functional/ui/cmdline_spec.lua | 1199 +++++++++++------- test/functional/ui/popupmenu_spec.lua | 1267 +++++++++++-------- test/functional/ui/messages_spec.lua | 1643 +++++++++++++++--------- ``` - TODO: how to check "all directories"? With `GLOB_DIRS *` and `/.deps/` (or `.deps/`) in `.styluaignore`, Lua code in `.deps/` is still checked... --- test/functional/api/buffer_spec.lua | 1200 ++++++++-------- test/functional/api/vim_spec.lua | 2585 ++++++++++++++++++++--------------- 2 files changed, 2097 insertions(+), 1688 deletions(-) (limited to 'test/functional/api') 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('lll') eq(3, funcs.winnr()) feed('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('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('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('') -- close current window feed('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('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('') -- close current window feed('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/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: $', - pcall_err(request, '')) + matches('Invalid method: bogus$', pcall_err(request, 'bogus')) + matches('Invalid method: … の り 。…$', pcall_err(request, '… の り 。…')) + matches('Invalid method: $', 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 <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("")->empty() let s:a = 123 echo expand("")->empty() - ]], { output = true })) - - eq({ output = '1\n0' }, nvim('exec2', [[ + ]], + { output = true } + ) + ) + + eq( + { output = '1\n0' }, + nvim( + 'exec2', + [[ echo expand("")->empty() function s:a() abort endfunction echo expand("")->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 <]]) - 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"]]) -- Verify hit-enter prompt. - eq({mode='r', blocking=true}, nvim("get_mode")) + eq({ mode = 'r', blocking = true }, nvim('get_mode')) nvim('input', [[]]) -- 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 ""]:0: '=' expected near '+']], - pcall_err(meths.exec_lua, 'a+*b', {})) + eq( + [[Error loading lua: [string ""]:0: '=' expected near '+']], + pcall_err(meths.exec_lua, 'a+*b', {}) + ) - eq([[Error loading lua: [string ""]:0: unexpected symbol near '1']], - pcall_err(meths.exec_lua, '1+2', {})) + eq( + [[Error loading lua: [string ""]:0: unexpected symbol near '1']], + pcall_err(meths.exec_lua, '1+2', {}) + ) - eq([[Error loading lua: [string ""]:0: unexpected symbol]], - pcall_err(meths.exec_lua, 'aa=bb\0', {})) + eq( + [[Error loading lua: [string ""]: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()") - 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()') + 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 foo0/foo') - 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", [[]]) - 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', [[]]) + 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", "") - eq({mode='n', blocking=true}, nvim("get_mode")) + it('during normal-mode CTRL-W, returns blocking=true', function() + nvim('input', '') + 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") - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) + nvim('input', ':messages') + 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") - eq({mode='r', blocking=true}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) + nvim('input', ':messages') + eq({ mode = 'r', blocking = true }, nvim('get_mode')) end) - it("during getchar() returns blocking=false", function() - nvim("input", ":let g:test_input = nr2char(getchar())") + it('during getchar() returns blocking=false', function() + nvim('input', ':let g:test_input = nr2char(getchar())') -- 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'}}, - {'nvim_get_mode', {}}, - {'nvim_eval', {'1'}}, + { 'nvim_get_mode', {} }, + { 'nvim_input', { ':messages' } }, + { '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') - eq({mode='rm', blocking=true}, nvim("get_mode")) + eq({ mode = 'rm', blocking = true }, nvim('get_mode')) end) it('after mapping returns blocking=false #17257', function() command('nnoremap ') feed('') - eq({mode='n', blocking=false}, nvim("get_mode")) + eq({ mode = 'n', blocking = false }, nvim('get_mode')) end) it('after empty string mapping returns blocking=false #17257', function() command('nnoremap ""') feed('') - 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') - 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 Worldgh') - 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('ia0') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('') - 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('') - 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('') feed(':,') - eq(2, eval('1+1')) -- causes K_EVENT key + eq(2, eval('1+1')) -- causes K_EVENT key feed('') - 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('i123ddddddqahjklquuu') @@ -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', - '', true, true, true)) + eq('\128\253\44', helpers.nvim('replace_termcodes', '', true, true, true)) end) it('converts keycodes', function() - eq('\nx\27x\rxxxxx', true, true, true)) + eq( + '\nx\27x\rxxxxx', true, true, true) + ) end) it('does not convert keycodes if special=false', function() - eq('xxxx', helpers.nvim('replace_termcodes', - 'xxxx', true, true, false)) + eq( + 'xxxx', + helpers.nvim('replace_termcodes', 'xxxx', 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="…"', 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="…"', 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")]]) - screen:expect{grid=[[ + screen:expect { + grid = [[ | {0:~ }|*3 {2: }| | a | {1:Press ENTER or type command to continue}^ | - ]]} + ]], + } feed('') feed([[:call nvim_out_write("b\n\nc\n")]]) - 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')]]) - 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('') -- exit the press ENTER screen + feed('') -- 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, {})') - 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 'ibabla' - 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 = 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 = 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 ''", {}) - 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 ''", {}) + 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 } }, {})]]) @@ -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()", { 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()', { 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]]) - 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) -- cgit From 04f2f864e270e772c6326cefdf24947f0130e492 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Wed, 3 Jan 2024 02:09:18 +0100 Subject: refactor: format test/* --- test/functional/api/autocmd_spec.lua | 962 +++++++++++++--------- test/functional/api/buffer_updates_spec.lua | 464 ++++++----- test/functional/api/command_spec.lua | 921 ++++++++++++--------- test/functional/api/extmark_spec.lua | 860 ++++++++++--------- test/functional/api/highlight_spec.lua | 344 ++++---- test/functional/api/keymap_spec.lua | 750 +++++++++-------- test/functional/api/menu_spec.lua | 29 +- test/functional/api/proc_spec.lua | 20 +- test/functional/api/rpc_fixture.lua | 10 +- test/functional/api/server_notifications_spec.lua | 45 +- test/functional/api/server_requests_spec.lua | 121 +-- test/functional/api/tabpage_spec.lua | 23 +- test/functional/api/ui_spec.lua | 90 +- test/functional/api/version_spec.lua | 155 ++-- test/functional/api/window_spec.lua | 730 ++++++++++------ 15 files changed, 3197 insertions(+), 2327 deletions(-) (limited to 'test/functional/api') 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 in same pattern', function() - local ok = pcall(meths.create_autocmd, "BufReadPost", { - pattern = "*.py,", - command = "echo 'Should Not Error'" + local ok = pcall(meths.create_autocmd, 'BufReadPost', { + pattern = '*.py,', + 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("") 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 :echo "1"]] command [[au InsertEnter :echo "2"]] - local aus = meths.get_autocmds { event = "InsertEnter", buffer = 0 } - eq({{ - buffer = 2, - buflocal = true, - command = ':echo "2"', - event = 'InsertEnter', - once = false, - pattern = '', - }}, aus) - - aus = meths.get_autocmds { event = "InsertEnter", buffer = 1 } - eq({{ - buffer = 1, - buflocal = true, - command = ':echo "1"', - event = "InsertEnter", - once = false, - pattern = "", - }}, aus) - - aus = meths.get_autocmds { event = "InsertEnter", buffer = { 1, 2 } } - eq({{ - buffer = 1, - buflocal = true, - command = ':echo "1"', - event = "InsertEnter", - once = false, - pattern = "", - }, { - buffer = 2, - buflocal = true, - command = ':echo "2"', - event = "InsertEnter", - once = false, - pattern = "", - }}, 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 = '', + }, + }, aus) + + aus = meths.get_autocmds { event = 'InsertEnter', buffer = 1 } + eq({ + { + buffer = 1, + buflocal = true, + command = ':echo "1"', + event = 'InsertEnter', + once = false, + pattern = '', + }, + }, aus) + + aus = meths.get_autocmds { event = 'InsertEnter', buffer = { 1, 2 } } + eq({ + { + buffer = 1, + buflocal = true, + command = ':echo "1"', + event = 'InsertEnter', + once = false, + pattern = '', + }, + { + buffer = 2, + buflocal = true, + command = ':echo "2"', + event = 'InsertEnter', + once = false, + pattern = '', + }, + }, 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 = "", + event = 'InsertEnter', + pattern = '', } local raw_aus = meths.get_autocmds { - event = "InsertEnter", - pattern = "", + event = 'InsertEnter', + pattern = '', } local zero_aus = meths.get_autocmds { - event = "InsertEnter", - pattern = "", + event = 'InsertEnter', + pattern = '', } 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("")', }) -- 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("")', }) -- 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("")', }) -- 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 = "", - command = "let g:value_set = v:true", + meths.create_autocmd('FileType', { + pattern = '', + 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 :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_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('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') 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 ', 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 ', 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()', 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 ', + 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 ', + 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()', + 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 ]]) - 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 ') - 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 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 = ', {nargs = 1}) + meths.create_user_command('SomeCommand', 'let g:command_fired = ', { 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("") + eq({ sr, sc }, rv) + feed('') 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("") + feed('') 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') 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('') - 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') 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('') - 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') 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('A12345') feed('A12345') - 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("a2233") + feed('a2233') 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("a222") + feed('a222') 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("a1") + feed('a1') 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("a222333444") + feed('a222333444') 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("a222333444") + feed('a222333444') 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("a222333444") + feed('a222333444') 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') @@ -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') - 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') @@ -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") + feed('A67890') set_extmark(ns, marks[1], 0, 4) - feed("04li") + feed('04li') 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") + feed('02li') 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") + feed('0li') 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') check_undo_redo(ns, marks[1], 0, 3, 0, 2) - feed("u") + feed('u') feed('0vlx') check_undo_redo(ns, marks[1], 0, 3, 0, 1) - feed("u") + feed('u') feed('0v2lx') check_undo_redo(ns, marks[1], 0, 3, 0, 0) @@ -675,16 +702,16 @@ describe('API/extmarks', function() feed('0x') check_undo_redo(ns, marks[1], 0, 3, 0, 2) - feed("u") + feed('u') feed('02x') check_undo_redo(ns, marks[1], 0, 3, 0, 1) - feed("u") + feed('u') feed('0v3lx') 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("") - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + feed('') + rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(3, #rv) -- Test updates feed('o') 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("") + feed('u') + feed('') -- 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') 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("") - rv = get_extmarks(ns, {0, 0}, {-1, -1}) + feed('') + 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') feed(':set autoindent') feed(':set shiftwidth=2') - feed("0iint A {1M1b") + feed('0iint A {1M1b') -- 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") + feed('i') 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') feed(':set shiftwidth=2') -- will force an indent of 2 - feed("0iint A {0i1M1") + feed('0iint A {0i1M1') set_extmark(ns, marks[1], 1, 1) - feed("0i") + feed('0i') 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") + feed('uA') rv = get_extmark_by_id(ns, marks[1]) - eq({1, 3}, rv) + eq({ 1, 3 }, rv) end) it('removing auto indenting with works', function() feed(':set cindent') feed(':set autoindent') feed(':set shiftwidth=2') - feed("0i") + feed('0i') set_extmark(ns, marks[1], 0, 3) - feed("bi") + feed('bi') 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") + feed('uA') 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') feed(':set autoindent') feed(':set shiftwidth=2') - feed("0iint A {1M12M2") + feed('0iint A {1M12M2') 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]]) - 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([[Iasdf]]) -- 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') - 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 cccgg') @@ -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") + feed('o') 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!') -- 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("") + feed('') 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 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 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 mapping, since it doesn't make sense if option_token ~= '' 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 .. ' ' .. 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 .. ' ' .. option_token .. ' foo bar') + local result = curbufmeths.get_keymap(mode)[1][option] + eq(buffer_on_result, result) + end + ) -- Don't run these for the mapping, since it doesn't make sense if option_token ~= '' 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 .. ' 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 .. ' 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', '', 1, 1, 0, 0) global_and_buffer_test(mode_list[mode], '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-d>\\', 'n'), - cpomap('\\C-a>\\', '\\C-b>\\', 'n')}, - get_keymap_noraw('n')) - eq({cpomap('\\C-c>\\', '\\C-d>\\', 'x'), - cpomap('\\C-a>\\', '\\C-b>\\', 'x')}, - get_keymap_noraw('x')) - eq({cpomap('C-c>C-c> ', 'C-d>C-d>', 's'), - cpomap('C-a>C-a> ', 'C-b>C-b>', 's')}, - get_keymap_noraw('s')) - eq({cpomap('C-c>C-c> ', 'C-d>C-d>', 'o'), - cpomap('C-a>C-a> ', 'C-b>C-b>', 'o')}, - get_keymap_noraw('o')) + eq({ + cpomap('\\C-c>\\', '\\C-d>\\', 'n'), + cpomap('\\C-a>\\', '\\C-b>\\', 'n'), + }, get_keymap_noraw('n')) + eq({ + cpomap('\\C-c>\\', '\\C-d>\\', 'x'), + cpomap('\\C-a>\\', '\\C-b>\\', 'x'), + }, get_keymap_noraw('x')) + eq({ + cpomap('C-c>C-c> ', 'C-d>C-d>', 's'), + cpomap('C-a>C-a> ', 'C-b>C-b>', 's'), + }, get_keymap_noraw('s')) + eq({ + cpomap('C-c>C-c> ', 'C-d>C-d>', 'o'), + cpomap('C-a>C-a> ', 'C-b>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 \\| \\| ') - 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 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', 'lhs', 'rhs'), - get_mapargs('n', ' lhs')) + eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', ' lhs')) meths.set_keymap('n', 'lhs ', 'rhs', {}) - eq(generate_mapargs('n', 'lhs', 'rhs'), - get_mapargs('n', 'lhs ')) + eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', 'lhs ')) meths.set_keymap('v', ' lhs ', '\trhs\t\f', {}) - eq(generate_mapargs('v', 'lhs', '\trhs\t\f'), - get_mapargs('v', ' lhs ')) + eq(generate_mapargs('v', 'lhs', '\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 = {'', '', '', ''} + local special_chars = { '', '', '', '' } 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 ', function() meths.set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({''}, curbufmeths.get_lines(0, -1, 0)) -- imap to does nothing - eq(generate_mapargs('i', 'lhs', '', {}), - get_mapargs('i', 'lhs')) + eq({ '' }, curbufmeths.get_lines(0, -1, 0)) -- imap to does nothing + eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- also test for case insensitivity meths.set_keymap('i', 'lhs', '', {}) 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', '', {}), - get_mapargs('i', 'lhs')) + eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) 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')) -- a single ^V in RHS is also (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 ', 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 ', function() @@ -698,21 +725,24 @@ describe('nvim_set_keymap, nvim_del_keymap', function() eq({}, get_mapargs('i', '')) end) - it('interprets control sequences in expr-quotes correctly when called ' - ..'inside vim', function() - command([[call nvim_set_keymap('i', "\", "\", {})]]) - eq(generate_mapargs('i', '', '\t', {sid=0}), - get_mapargs('i', '')) - 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', "\", "\", {})]]) + eq(generate_mapargs('i', '', '\t', { sid = 0 }), get_mapargs('i', '')) + feed('i ') + eq({ '\t' }, curbufmeths.get_lines(0, -1, 0)) + end + ) it('throws appropriate error messages when setting 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 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 " + exec_lua [[return vim.api.nvim_exec2(':nmap asdf', { output = true }).output]], + '^\nn asdf ' ) ) 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'), - "^")) + assert.truthy(string.match(funcs.mapcheck('asdf', 'n'), '^')) 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'), "^")) + assert.truthy(string.match(funcs.maparg('asdf', 'n'), '^')) 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({'πfoo<'}, meths.buf_get_lines(0, 0, -1, false)) + eq({ 'π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') - eq({''}, meths.buf_get_lines(0, 0, -1, false)) + eq({ '' }, 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') - 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', '', '', {callback = function() VisibleCount = VisibleCount + vim.fn.pumvisible() end}) return VisibleCount - ]]) + ]] + ) feed('i') - 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', '', '', {callback = function() OpCount = OpCount + 1 end}) return OpCount - ]]) + ]] + ) feed('d') - 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', '', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_del_keymap('n', '') @@ -1011,15 +1076,14 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) eq('\nNo mapping found', helpers.exec_capture('nmap ')) 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"' - 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"' - 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"' - 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', {}) 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', {}) - 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', {}) 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({'πfoo<'}, meths.buf_get_lines(0, 0, -1, false)) + eq({ 'π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') - eq({''}, meths.buf_get_lines(0, 0, -1, false)) + eq({ '' }, 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', '', '', {callback = function() GlobalCount = GlobalCount + 1 end }) return GlobalCount - ]]) + ]] + ) feed('\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) exec_lua [[ vim.api.nvim_buf_del_keymap(0, 'n', '') @@ -1258,7 +1334,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('\n') - eq(1, exec_lua[[return GlobalCount]]) + eq(1, exec_lua [[return GlobalCount]]) eq('\nNo mapping found', helpers.exec_capture('nmap ')) 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:redraw') 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('') - 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('') 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('') - 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/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; executes, CTRL-C quits', - pcall_err(meths.win_set_buf, 0, new_buf)) - eq('E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_set_buf, old_win, new_buf)) - eq('E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_set_buf, new_win, 0)) + eq( + 'E11: Invalid in command-line window; executes, CTRL-C quits', + pcall_err(meths.win_set_buf, 0, new_buf) + ) + eq( + 'E11: Invalid in command-line window; executes, CTRL-C quits', + pcall_err(meths.win_set_buf, old_win, new_buf) + ) + eq( + 'E11: Invalid in command-line window; 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') - 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') - 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; executes, CTRL-C quits', - pcall_err(meths.win_close, oldwin, true)) + eq( + 'E11: Invalid in command-line window; 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; executes, CTRL-C quits', - pcall_err(meths.win_hide, old_win)) + eq( + 'E11: Invalid in command-line window; 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; 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; 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; 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; 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) -- cgit From d33e1da9b7f7e886219cfdd20b9bbfaccdc43be9 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 12 Jan 2024 11:28:20 +0000 Subject: test: do not inject vim module into global helpers --- test/functional/api/buffer_spec.lua | 2 +- test/functional/api/command_spec.lua | 2 +- test/functional/api/proc_spec.lua | 2 +- test/functional/api/tabpage_spec.lua | 2 +- test/functional/api/vim_spec.lua | 14 +++++++------- test/functional/api/window_spec.lua | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index e8fff7443d..0dd01b7299 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -11,7 +11,7 @@ local exc_exec = helpers.exc_exec local exec_lua = helpers.exec_lua local feed_command = helpers.feed_command local insert = helpers.insert -local NIL = helpers.NIL +local NIL = vim.NIL local command = helpers.command local bufmeths = helpers.bufmeths local feed = helpers.feed diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua index e286181bce..6486b58db9 100644 --- a/test/functional/api/command_spec.lua +++ b/test/functional/api/command_spec.lua @@ -1,6 +1,6 @@ local helpers = require('test.functional.helpers')(after_each) -local NIL = helpers.NIL +local NIL = vim.NIL local clear = helpers.clear local command = helpers.command local curbufmeths = helpers.curbufmeths diff --git a/test/functional/api/proc_spec.lua b/test/functional/api/proc_spec.lua index 4f99a69ce6..82a3968ab7 100644 --- a/test/functional/api/proc_spec.lua +++ b/test/functional/api/proc_spec.lua @@ -7,7 +7,7 @@ local neq = helpers.neq local nvim_argv = helpers.nvim_argv local request = helpers.request local retry = helpers.retry -local NIL = helpers.NIL +local NIL = vim.NIL local is_os = helpers.is_os describe('API', function() diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua index d6fc041e83..f661f8e38b 100644 --- a/test/functional/api/tabpage_spec.lua +++ b/test/functional/api/tabpage_spec.lua @@ -4,7 +4,7 @@ local clear, nvim, tabpage, curtab, eq, ok = local curtabmeths = helpers.curtabmeths local funcs = helpers.funcs local request = helpers.request -local NIL = helpers.NIL +local NIL = vim.NIL local pcall_err = helpers.pcall_err local command = helpers.command diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index ce2838879b..13b80f4486 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1,11 +1,11 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') -local luv = require('luv') +local uv = vim.uv local fmt = string.format local dedent = helpers.dedent local assert_alive = helpers.assert_alive -local NIL = helpers.NIL +local NIL = vim.NIL local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq local command = helpers.command local exec = helpers.exec @@ -15,7 +15,7 @@ local expect = helpers.expect local funcs = helpers.funcs local meths = helpers.meths local matches = helpers.matches -local pesc = helpers.pesc +local pesc = vim.pesc local mkdir_p = helpers.mkdir_p local ok, nvim_async, feed = helpers.ok, helpers.nvim_async, helpers.feed local is_os = helpers.is_os @@ -35,7 +35,7 @@ local pcall_err = helpers.pcall_err local format_string = helpers.format_string local intchar2lua = helpers.intchar2lua local mergedicts_copy = helpers.mergedicts_copy -local endswith = helpers.endswith +local endswith = vim.endswith describe('API', function() before_each(clear) @@ -4647,7 +4647,7 @@ describe('API', function() end, { nargs = 1 }) ]]) eq( - luv.cwd(), + uv.cwd(), meths.cmd({ cmd = 'Foo', args = { '%:p:h' }, magic = { file = true } }, { output = true }) ) end) @@ -4806,9 +4806,9 @@ describe('API', function() eq(1, meths.get_current_buf().id) end) it('works with :sleep using milliseconds', function() - local start = luv.now() + local start = uv.now() meths.cmd({ cmd = 'sleep', args = { '100m' } }, {}) - ok(luv.now() - start <= 300) + ok(uv.now() - start <= 300) end) end) it(':call with unknown function does not crash #26289', function() diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 7e92dd6bf3..2516e96be2 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -19,7 +19,7 @@ local curwinmeths = helpers.curwinmeths local exec = helpers.exec local funcs = helpers.funcs local request = helpers.request -local NIL = helpers.NIL +local NIL = vim.NIL local meths = helpers.meths local command = helpers.command local pcall_err = helpers.pcall_err -- cgit From 7a259d01aed52134a1675e47d9054ccad7ef7cbb Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 12 Jan 2024 11:41:09 +0000 Subject: test: remove helpers.sleep() --- test/functional/api/buffer_updates_spec.lua | 2 +- test/functional/api/keymap_spec.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index b0efcf0dab..af6404fe7f 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -6,7 +6,7 @@ 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 sleep = vim.uv.sleep local write_file = helpers.write_file local origlines = { diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index 50c353d764..789ad28544 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -14,7 +14,7 @@ local source = helpers.source local pcall_err = helpers.pcall_err local shallowcopy = helpers.shallowcopy -local sleep = helpers.sleep +local sleep = vim.uv.sleep local sid_api_client = -9 local sid_lua = -8 -- cgit From 284e0ad26dd9de90c3a813dd1b357a425eca6bad Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 12 Jan 2024 12:03:25 +0000 Subject: test: use vim.mpack and vim.uv directly --- test/functional/api/version_spec.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/version_spec.lua b/test/functional/api/version_spec.lua index 76cdb9cbca..41f8fccab9 100644 --- a/test/functional/api/version_spec.lua +++ b/test/functional/api/version_spec.lua @@ -1,5 +1,4 @@ local helpers = require('test.functional.helpers')(after_each) -local mpack = require('mpack') local clear, funcs, eq = helpers.clear, helpers.funcs, helpers.eq local call = helpers.call local meths = helpers.meths @@ -12,7 +11,7 @@ local function read_mpack_file(fname) local data = fd:read('*a') fd:close() - local unpack = mpack.Unpacker() + local unpack = vim.mpack.Unpacker() return unpack(data) end -- cgit From c30f2e3182e3b50e7c03932027ac55edfc8ada4a Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 12 Jan 2024 12:44:54 +0000 Subject: test: typing for helpers.meths --- test/functional/api/autocmd_spec.lua | 442 +++++------ test/functional/api/buffer_spec.lua | 210 ++--- test/functional/api/command_spec.lua | 70 +- test/functional/api/extmark_spec.lua | 10 +- test/functional/api/highlight_spec.lua | 269 ++++--- test/functional/api/keymap_spec.lua | 260 +++--- test/functional/api/server_notifications_spec.lua | 8 +- test/functional/api/server_requests_spec.lua | 8 +- test/functional/api/ui_spec.lua | 24 +- test/functional/api/version_spec.lua | 2 +- test/functional/api/vim_spec.lua | 913 +++++++++++----------- test/functional/api/window_spec.lua | 394 ++++++---- 12 files changed, 1381 insertions(+), 1229 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/autocmd_spec.lua b/test/functional/api/autocmd_spec.lua index 1590ca2eda..79a524d9eb 100644 --- a/test/functional/api/autocmd_spec.lua +++ b/test/functional/api/autocmd_spec.lua @@ -17,7 +17,7 @@ describe('autocmd api', function() it('validation', function() eq( "Cannot use both 'callback' and 'command'", - pcall_err(meths.create_autocmd, 'BufReadPost', { + pcall_err(meths.nvim_create_autocmd, 'BufReadPost', { pattern = '*.py,*.pyi', command = "echo 'Should Have Errored", callback = 'NotAllowed', @@ -25,7 +25,7 @@ describe('autocmd api', function() ) eq( "Cannot use both 'pattern' and 'buffer' for the same autocmd", - pcall_err(meths.create_autocmd, 'FileType', { + pcall_err(meths.nvim_create_autocmd, 'FileType', { command = 'let g:called = g:called + 1', buffer = 0, pattern = '*.py', @@ -33,48 +33,48 @@ describe('autocmd api', function() ) eq( "Required: 'event'", - pcall_err(meths.create_autocmd, {}, { + pcall_err(meths.nvim_create_autocmd, {}, { command = 'ls', }) ) - eq("Required: 'command' or 'callback'", pcall_err(meths.create_autocmd, 'FileType', {})) + eq("Required: 'command' or 'callback'", pcall_err(meths.nvim_create_autocmd, 'FileType', {})) eq( "Invalid 'desc': expected String, got Integer", - pcall_err(meths.create_autocmd, 'FileType', { + pcall_err(meths.nvim_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', { + pcall_err(meths.nvim_create_autocmd, 'FileType', { callback = 0, }) ) eq( "Invalid 'event' item: expected String, got Array", - pcall_err(meths.create_autocmd, { 'FileType', {} }, {}) + pcall_err(meths.nvim_create_autocmd, { 'FileType', {} }, {}) ) eq( "Invalid 'group': 0", - pcall_err(meths.create_autocmd, 'FileType', { + pcall_err(meths.nvim_create_autocmd, 'FileType', { group = 0, command = 'ls', }) ) - eq("Invalid 'event': 'foo'", pcall_err(meths.create_autocmd, 'foo', { command = '' })) + eq("Invalid 'event': 'foo'", pcall_err(meths.nvim_create_autocmd, 'foo', { command = '' })) eq( "Invalid 'event': 'VimEnter '", - pcall_err(meths.create_autocmd, 'VimEnter ', { command = '' }) + pcall_err(meths.nvim_create_autocmd, 'VimEnter ', { command = '' }) ) eq( "Invalid 'event': 'VimEnter foo'", - pcall_err(meths.create_autocmd, 'VimEnter foo', { command = '' }) + pcall_err(meths.nvim_create_autocmd, 'VimEnter foo', { command = '' }) ) eq( "Invalid 'event': 'BufAdd,BufDelete'", - pcall_err(meths.create_autocmd, 'BufAdd,BufDelete', { command = '' }) + pcall_err(meths.nvim_create_autocmd, 'BufAdd,BufDelete', { command = '' }) ) end) @@ -102,25 +102,25 @@ describe('autocmd api', function() end) it('allows passing buffer by key', function() - meths.set_var('called', 0) + meths.nvim_set_var('called', 0) - meths.create_autocmd('FileType', { + meths.nvim_create_autocmd('FileType', { command = 'let g:called = g:called + 1', buffer = 0, }) - meths.command 'set filetype=txt' - eq(1, meths.get_var('called')) + meths.nvim_command 'set filetype=txt' + eq(1, meths.nvim_get_var('called')) -- switch to a new buffer - meths.command 'new' - meths.command 'set filetype=python' + meths.nvim_command 'new' + meths.nvim_command 'set filetype=python' - eq(1, meths.get_var('called')) + eq(1, meths.nvim_get_var('called')) end) it('does not allow passing invalid buffers', function() - local ok, msg = pcall(meths.create_autocmd, 'FileType', { + local ok, msg = pcall(meths.nvim_create_autocmd, 'FileType', { command = 'let g:called = g:called + 1', buffer = -1, }) @@ -145,7 +145,7 @@ describe('autocmd api', function() end) it('allow passing pattern and in same pattern', function() - local ok = pcall(meths.create_autocmd, 'BufReadPost', { + local ok = pcall(meths.nvim_create_autocmd, 'BufReadPost', { pattern = '*.py,', command = "echo 'Should Not Error'", }) @@ -154,42 +154,42 @@ describe('autocmd api', function() end) it('should handle multiple values as comma separated list', function() - meths.create_autocmd('BufReadPost', { + meths.nvim_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.nvim_get_autocmds { event = 'BufReadPost' }) end) it('should handle multiple values as array', function() - meths.create_autocmd('BufReadPost', { + meths.nvim_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.nvim_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', { + meths.nvim_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.nvim_get_autocmds { event = 'BufReadPost' }[1].desc) + eq(cmd, meths.nvim_get_autocmds { event = 'BufReadPost' }[1].command) end) it('can add description to one autocmd that uses a callback', function() local desc = 'Can show description' - meths.set_var('desc', desc) + meths.nvim_set_var('desc', desc) local result = exec_lua([[ local callback = function() print 'Should Not Have Errored' end @@ -218,17 +218,17 @@ describe('autocmd api', function() }) ]]) - eq(nil, meths.get_autocmds({ event = 'BufReadPost' })[1].desc) + eq(nil, meths.nvim_get_autocmds({ event = 'BufReadPost' })[1].desc) end) it('can add description to multiple autocmd', function() - meths.create_autocmd('BufReadPost', { + meths.nvim_create_autocmd('BufReadPost', { pattern = { '*.py', '*.pyi' }, command = "echo 'Should Not Have Errored'", desc = 'Can show description', }) - local aus = meths.get_autocmds { event = 'BufReadPost' } + local aus = meths.nvim_get_autocmds { event = 'BufReadPost' } eq(2, #aus) eq('Can show description', aus[1].desc) eq('Can show description', aus[2].desc) @@ -237,19 +237,19 @@ describe('autocmd api', function() pending('script and verbose settings', function() it('marks API client', function() - meths.create_autocmd('BufReadPost', { + meths.nvim_create_autocmd('BufReadPost', { pattern = '*.py', command = "echo 'Should Not Have Errored'", desc = 'Can show description', }) - local aus = meths.get_autocmds { event = 'BufReadPost' } + local aus = meths.nvim_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.nvim_set_var('some_condition', false) exec_lua [[ vim.api.nvim_create_autocmd("User", { @@ -261,21 +261,21 @@ describe('autocmd api', function() }) ]] - meths.exec_autocmds('User', { pattern = 'Test' }) + meths.nvim_exec_autocmds('User', { pattern = 'Test' }) - local aus = meths.get_autocmds({ event = 'User', pattern = 'Test' }) + local aus = meths.nvim_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.nvim_set_var('some_condition', true) + meths.nvim_exec_autocmds('User', { pattern = 'Test' }) + eq({}, meths.nvim_get_autocmds({ event = 'User', pattern = 'Test' })) end) it('receives an args table', function() - local group_id = meths.create_augroup('TestGroup', {}) + local group_id = meths.nvim_create_augroup('TestGroup', {}) -- Having an existing autocmd calling expand("") shouldn't change args #18964 - meths.create_autocmd('User', { + meths.nvim_create_autocmd('User', { group = 'TestGroup', pattern = 'Te*', command = 'call expand("")', @@ -291,7 +291,7 @@ describe('autocmd api', function() }) ]] - meths.exec_autocmds('User', { pattern = 'Test pattern' }) + meths.nvim_exec_autocmds('User', { pattern = 'Test pattern' }) eq({ id = autocmd_id, group = group_id, @@ -299,7 +299,7 @@ describe('autocmd api', function() match = 'Test pattern', file = 'Test pattern', buf = 1, - }, meths.get_var('autocmd_args')) + }, meths.nvim_get_var('autocmd_args')) -- Test without a group autocmd_id = exec_lua [[ @@ -311,7 +311,7 @@ describe('autocmd api', function() }) ]] - meths.exec_autocmds('User', { pattern = 'some_pat' }) + meths.nvim_exec_autocmds('User', { pattern = 'some_pat' }) eq({ id = autocmd_id, group = nil, @@ -319,7 +319,7 @@ describe('autocmd api', function() match = 'some_pat', file = 'some_pat', buf = 1, - }, meths.get_var('autocmd_args')) + }, meths.nvim_get_var('autocmd_args')) end) it('can receive arbitrary data', function() @@ -361,43 +361,43 @@ describe('autocmd api', function() it('validation', function() eq( "Invalid 'group': 9997999", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { group = 9997999, }) ) eq( "Invalid 'group': 'bogus'", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { group = 'bogus', }) ) eq( "Invalid 'group': 0", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { group = 0, }) ) eq( "Invalid 'group': expected String or Integer, got Array", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { group = {}, }) ) eq( "Invalid 'buffer': expected Integer or Array, got Boolean", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { buffer = true, }) ) eq( "Invalid 'event': expected String or Array", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { event = true, }) ) eq( "Invalid 'pattern': expected String or Array, got Boolean", - pcall_err(meths.get_autocmds, { + pcall_err(meths.nvim_get_autocmds, { pattern = true, }) ) @@ -408,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.nvim_get_autocmds { event = 'InsertEnter' } eq(1, #aus) end) @@ -417,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.nvim_get_autocmds { event = 'InsertEnter' } eq(2, #aus) end) @@ -426,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.nvim_get_autocmds { event = 'InsertEnter' } + local array_aus = meths.nvim_get_autocmds { event = { 'InsertEnter' } } eq(string_aus, array_aus) end) @@ -437,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.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(2, #aus) end) @@ -451,7 +451,7 @@ describe('autocmd api', function() \ }) ]] - local aus = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + local aus = meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } local first = aus[1] eq(first.id, nil) @@ -459,8 +459,8 @@ describe('autocmd api', function() local second = aus[2] neq(second.id, nil) - meths.del_autocmd(second.id) - local new_aus = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + meths.nvim_del_autocmd(second.id) + local new_aus = meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(1, #new_aus) eq(first, new_aus[1]) end) @@ -469,7 +469,7 @@ describe('autocmd api', function() command [[au! InsertEnter]] command [[au InsertEnter * :echo "1"]] - local aus = meths.get_autocmds { event = 'InsertEnter' } + local aus = meths.nvim_get_autocmds { event = 'InsertEnter' } eq({ { buflocal = false, @@ -487,7 +487,7 @@ describe('autocmd api', function() command [[au InsertEnter :echo "1"]] command [[au InsertEnter :echo "2"]] - local aus = meths.get_autocmds { event = 'InsertEnter', buffer = 0 } + local aus = meths.nvim_get_autocmds { event = 'InsertEnter', buffer = 0 } eq({ { buffer = 2, @@ -499,7 +499,7 @@ describe('autocmd api', function() }, }, aus) - aus = meths.get_autocmds { event = 'InsertEnter', buffer = 1 } + aus = meths.nvim_get_autocmds { event = 'InsertEnter', buffer = 1 } eq({ { buffer = 1, @@ -511,7 +511,7 @@ describe('autocmd api', function() }, }, aus) - aus = meths.get_autocmds { event = 'InsertEnter', buffer = { 1, 2 } } + aus = meths.nvim_get_autocmds { event = 'InsertEnter', buffer = { 1, 2 } } eq({ { buffer = 1, @@ -533,50 +533,50 @@ describe('autocmd api', function() eq( "Invalid 'buffer': expected Integer or Array, got String", - pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = 'foo' }) + pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = 'foo' }) ) eq( "Invalid 'buffer': expected Integer, got String", - pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = { 'foo', 42 } }) + pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = { 'foo', 42 } }) ) eq( 'Invalid buffer id: 42', - pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = { 42 } }) + pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = { 42 } }) ) local bufs = {} for _ = 1, 257 do - table.insert(bufs, meths.create_buf(true, false)) + table.insert(bufs, meths.nvim_create_buf(true, false)) end eq( 'Too many buffers (maximum of 256)', - pcall_err(meths.get_autocmds, { event = 'InsertEnter', buffer = bufs }) + pcall_err(meths.nvim_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.nvim_create_augroup('nvim_test_augroup', { clear = true }) + meths.nvim_create_autocmd('FileType', { group = auid, command = 'echo "1"' }) + meths.nvim_create_autocmd('FileType', { group = auid, command = 'echo "2"' }) - local aus = meths.get_autocmds { group = auid } + local aus = meths.nvim_get_autocmds { group = auid } eq(2, #aus) - local aus2 = meths.get_autocmds { group = auid, event = 'InsertEnter' } + local aus2 = meths.nvim_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' - 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.nvim_create_augroup(auname, { clear = true }) + meths.nvim_create_autocmd('FileType', { group = auname, command = 'echo "1"' }) + meths.nvim_create_autocmd('FileType', { group = auname, command = 'echo "2"' }) - local aus = meths.get_autocmds { group = auname } + local aus = meths.nvim_get_autocmds { group = auname } eq(2, #aus) - local aus2 = meths.get_autocmds { group = auname, event = 'InsertEnter' } + local aus2 = meths.nvim_get_autocmds { group = auname, event = 'InsertEnter' } eq(0, #aus2) end) @@ -609,7 +609,7 @@ describe('autocmd api', function() it('can retrieve a callback from an autocmd', function() local content = 'I Am A Callback' - meths.set_var('content', content) + meths.nvim_set_var('content', content) local result = exec_lua([[ local cb = function() return vim.g.content end @@ -671,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.nvim_get_autocmds { event = 'InsertEnter' } if #aus ~= 4 then eq({}, aus) end @@ -680,7 +680,7 @@ describe('autocmd api', function() end) it('returns only the group specified', function() - local aus = meths.get_autocmds { + local aus = meths.nvim_get_autocmds { event = 'InsertEnter', group = 'GroupOne', } @@ -691,7 +691,7 @@ describe('autocmd api', function() end) it('returns only the group specified, multiple values', function() - local aus = meths.get_autocmds { + local aus = meths.nvim_get_autocmds { event = 'InsertEnter', group = 'GroupTwo', } @@ -706,7 +706,7 @@ describe('autocmd api', function() describe('groups: 2', function() it('raises error for undefined augroup name', function() - local success, code = unpack(meths.exec_lua( + local success, code = unpack(meths.nvim_exec_lua( [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { @@ -724,7 +724,7 @@ describe('autocmd api', function() end) it('raises error for undefined augroup id', function() - local success, code = unpack(meths.exec_lua( + local success, code = unpack(meths.nvim_exec_lua( [[ return {pcall(function() -- Make sure the augroup is deleted @@ -745,7 +745,7 @@ describe('autocmd api', function() end) it('raises error for invalid group type', function() - local success, code = unpack(meths.exec_lua( + local success, code = unpack(meths.nvim_exec_lua( [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { @@ -763,7 +763,7 @@ describe('autocmd api', function() end) it('raises error for invalid pattern array', function() - local success, code = unpack(meths.exec_lua( + local success, code = unpack(meths.nvim_exec_lua( [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { @@ -792,7 +792,7 @@ describe('autocmd api', function() end) it('returns for literal match', function() - local aus = meths.get_autocmds { + local aus = meths.nvim_get_autocmds { event = 'InsertEnter', pattern = '*', } @@ -803,7 +803,7 @@ describe('autocmd api', function() it('returns for multiple matches', function() -- vim.api.nvim_get_autocmds - local aus = meths.get_autocmds { + local aus = meths.nvim_get_autocmds { event = 'InsertEnter', pattern = { '*.one', '*.two' }, } @@ -815,17 +815,17 @@ describe('autocmd api', function() end) it('should work for buffer autocmds', function() - local normalized_aus = meths.get_autocmds { + local normalized_aus = meths.nvim_get_autocmds { event = 'InsertEnter', pattern = '', } - local raw_aus = meths.get_autocmds { + local raw_aus = meths.nvim_get_autocmds { event = 'InsertEnter', pattern = '', } - local zero_aus = meths.get_autocmds { + local zero_aus = meths.nvim_get_autocmds { event = 'InsertEnter', pattern = '', } @@ -841,110 +841,110 @@ describe('autocmd api', function() it('validation', function() eq( "Invalid 'group': 9997999", - pcall_err(meths.exec_autocmds, 'FileType', { + pcall_err(meths.nvim_exec_autocmds, 'FileType', { group = 9997999, }) ) eq( "Invalid 'group': 'bogus'", - pcall_err(meths.exec_autocmds, 'FileType', { + pcall_err(meths.nvim_exec_autocmds, 'FileType', { group = 'bogus', }) ) eq( "Invalid 'group': expected String or Integer, got Array", - pcall_err(meths.exec_autocmds, 'FileType', { + pcall_err(meths.nvim_exec_autocmds, 'FileType', { group = {}, }) ) eq( "Invalid 'group': 0", - pcall_err(meths.exec_autocmds, 'FileType', { + pcall_err(meths.nvim_exec_autocmds, 'FileType', { group = 0, }) ) eq( "Invalid 'buffer': expected Buffer, got Array", - pcall_err(meths.exec_autocmds, 'FileType', { + pcall_err(meths.nvim_exec_autocmds, 'FileType', { buffer = {}, }) ) eq( "Invalid 'event' item: expected String, got Array", - pcall_err(meths.exec_autocmds, { 'FileType', {} }, {}) + pcall_err(meths.nvim_exec_autocmds, { 'FileType', {} }, {}) ) end) it('can trigger builtin autocmds', function() - meths.set_var('autocmd_executed', false) + meths.nvim_set_var('autocmd_executed', false) - meths.create_autocmd('BufReadPost', { + meths.nvim_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.nvim_get_var('autocmd_executed')) + meths.nvim_exec_autocmds('BufReadPost', {}) + eq(true, meths.nvim_get_var('autocmd_executed')) end) it('can trigger multiple patterns', function() - meths.set_var('autocmd_executed', 0) + meths.nvim_set_var('autocmd_executed', 0) - meths.create_autocmd('BufReadPost', { + meths.nvim_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.nvim_exec_autocmds('BufReadPost', { pattern = { '*.lua', '*.vim' } }) + eq(2, meths.nvim_get_var('autocmd_executed')) - meths.create_autocmd('BufReadPre', { + meths.nvim_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.nvim_exec_autocmds('BufReadPre', { pattern = { 'foo', 'bar', 'baz', 'frederick' } }) + eq(22, meths.nvim_get_var('autocmd_executed')) end) it('can pass the buffer', function() - meths.set_var('buffer_executed', -1) - eq(-1, meths.get_var('buffer_executed')) + meths.nvim_set_var('buffer_executed', -1) + eq(-1, meths.nvim_get_var('buffer_executed')) - meths.create_autocmd('BufLeave', { + meths.nvim_create_autocmd('BufLeave', { pattern = '*', command = 'let g:buffer_executed = +expand("")', }) -- Doesn't execute for other non-matching events - meths.exec_autocmds('CursorHold', { buffer = 1 }) - eq(-1, meths.get_var('buffer_executed')) + meths.nvim_exec_autocmds('CursorHold', { buffer = 1 }) + eq(-1, meths.nvim_get_var('buffer_executed')) - meths.exec_autocmds('BufLeave', { buffer = 1 }) - eq(1, meths.get_var('buffer_executed')) + meths.nvim_exec_autocmds('BufLeave', { buffer = 1 }) + eq(1, meths.nvim_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')) + meths.nvim_set_var('filename_executed', 'none') + eq('none', meths.nvim_get_var('filename_executed')) - meths.create_autocmd('BufEnter', { + meths.nvim_create_autocmd('BufEnter', { pattern = '*.py', command = 'let g:filename_executed = expand("")', }) -- Doesn't execute for other non-matching events - meths.exec_autocmds('CursorHold', { buffer = 1 }) - eq('none', meths.get_var('filename_executed')) + meths.nvim_exec_autocmds('CursorHold', { buffer = 1 }) + eq('none', meths.nvim_get_var('filename_executed')) - meths.command('edit __init__.py') - eq('__init__.py', meths.get_var('filename_executed')) + meths.nvim_command('edit __init__.py') + eq('__init__.py', meths.nvim_get_var('filename_executed')) end) it('cannot pass buf and fname', function() local ok = pcall( - meths.exec_autocmds, + meths.nvim_exec_autocmds, 'BufReadPre', { pattern = 'literally_cannot_error.rs', buffer = 1 } ) @@ -952,73 +952,73 @@ describe('autocmd api', function() end) it('can pass the filename, exact match', function() - meths.set_var('filename_executed', 'none') - eq('none', meths.get_var('filename_executed')) + meths.nvim_set_var('filename_executed', 'none') + eq('none', meths.nvim_get_var('filename_executed')) - meths.command('edit other_file.txt') - meths.command('edit __init__.py') - eq('none', meths.get_var('filename_executed')) + meths.nvim_command('edit other_file.txt') + meths.nvim_command('edit __init__.py') + eq('none', meths.nvim_get_var('filename_executed')) - meths.create_autocmd('CursorHoldI', { + meths.nvim_create_autocmd('CursorHoldI', { pattern = '__init__.py', command = 'let g:filename_executed = expand("")', }) -- Doesn't execute for other non-matching events - meths.exec_autocmds('CursorHoldI', { buffer = 1 }) - eq('none', meths.get_var('filename_executed')) + meths.nvim_exec_autocmds('CursorHoldI', { buffer = 1 }) + eq('none', meths.nvim_get_var('filename_executed')) - meths.exec_autocmds('CursorHoldI', { buffer = meths.get_current_buf() }) - eq('__init__.py', meths.get_var('filename_executed')) + meths.nvim_exec_autocmds('CursorHoldI', { buffer = meths.nvim_get_current_buf() }) + eq('__init__.py', meths.nvim_get_var('filename_executed')) -- Reset filename - meths.set_var('filename_executed', 'none') + meths.nvim_set_var('filename_executed', 'none') - meths.exec_autocmds('CursorHoldI', { pattern = '__init__.py' }) - eq('__init__.py', meths.get_var('filename_executed')) + meths.nvim_exec_autocmds('CursorHoldI', { pattern = '__init__.py' }) + eq('__init__.py', meths.nvim_get_var('filename_executed')) end) it('works with user autocmds', function() - meths.set_var('matched', 'none') + meths.nvim_set_var('matched', 'none') - meths.create_autocmd('User', { + meths.nvim_create_autocmd('User', { pattern = 'TestCommand', command = 'let g:matched = "matched"', }) - meths.exec_autocmds('User', { pattern = 'OtherCommand' }) - eq('none', meths.get_var('matched')) - meths.exec_autocmds('User', { pattern = 'TestCommand' }) - eq('matched', meths.get_var('matched')) + meths.nvim_exec_autocmds('User', { pattern = 'OtherCommand' }) + eq('none', meths.nvim_get_var('matched')) + meths.nvim_exec_autocmds('User', { pattern = 'TestCommand' }) + eq('matched', meths.nvim_get_var('matched')) end) it('can pass group by id', function() - meths.set_var('group_executed', false) + meths.nvim_set_var('group_executed', false) - local auid = meths.create_augroup('nvim_test_augroup', { clear = true }) - meths.create_autocmd('FileType', { + local auid = meths.nvim_create_augroup('nvim_test_augroup', { clear = true }) + meths.nvim_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.nvim_get_var('group_executed')) + meths.nvim_exec_autocmds('FileType', { group = auid }) + eq(true, meths.nvim_get_var('group_executed')) end) it('can pass group by name', function() - meths.set_var('group_executed', false) + meths.nvim_set_var('group_executed', false) local auname = 'nvim_test_augroup' - meths.create_augroup(auname, { clear = true }) - meths.create_autocmd('FileType', { + meths.nvim_create_augroup(auname, { clear = true }) + meths.nvim_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.nvim_get_var('group_executed')) + meths.nvim_exec_autocmds('FileType', { group = auname }) + eq(true, meths.nvim_get_var('group_executed')) end) end) @@ -1026,7 +1026,7 @@ describe('autocmd api', function() before_each(function() clear() - meths.set_var('executed', 0) + meths.nvim_set_var('executed', 0) end) local make_counting_autocmd = function(opts) @@ -1040,7 +1040,7 @@ describe('autocmd api', function() resulting.group = opts.group resulting.once = opts.once - meths.create_autocmd('FileType', resulting) + meths.nvim_create_autocmd('FileType', resulting) end local set_ft = function(ft) @@ -1049,12 +1049,12 @@ describe('autocmd api', function() end local get_executed_count = function() - return meths.get_var('executed') + return meths.nvim_get_var('executed') end it('can be added in a group', function() local augroup = 'TestGroup' - meths.create_augroup(augroup, { clear = true }) + meths.nvim_create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup } set_ft('txt') @@ -1083,7 +1083,7 @@ describe('autocmd api', function() end) it('errors on unexpected keys', function() - local success, code = pcall(meths.create_autocmd, 'FileType', { + local success, code = pcall(meths.nvim_create_autocmd, 'FileType', { pattern = '*', not_a_valid_key = 'NotDefined', }) @@ -1190,8 +1190,8 @@ describe('autocmd api', function() it('groups can be cleared', function() local augroup = 'TestGroup' - meths.create_augroup(augroup, { clear = true }) - meths.create_autocmd('FileType', { + meths.nvim_create_augroup(augroup, { clear = true }) + meths.nvim_create_autocmd('FileType', { group = augroup, command = 'let g:executed = g:executed + 1', }) @@ -1200,8 +1200,8 @@ describe('autocmd api', function() set_ft('txt') eq(2, get_executed_count(), 'should only count twice') - meths.create_augroup(augroup, { clear = true }) - eq({}, meths.get_autocmds { group = augroup }) + meths.nvim_create_augroup(augroup, { clear = true }) + eq({}, meths.nvim_get_autocmds { group = augroup }) set_ft('txt') set_ft('txt') @@ -1210,22 +1210,22 @@ describe('autocmd api', function() it('can delete non-existent groups with pcall', function() 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('Vim:E367: No such group: "noexist"', pcall_err(meths.nvim_del_augroup_by_name, 'noexist')) 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('Vim:E367: No such group: "--Deleted--"', pcall_err(meths.nvim_del_augroup_by_id, -12312)) 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('Vim:E367: No such group: "[NULL]"', pcall_err(meths.nvim_del_augroup_by_id, 0)) 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)) + eq('Vim:E367: No such group: "[NULL]"', pcall_err(meths.nvim_del_augroup_by_id, 12312)) end) it('groups work with once', function() local augroup = 'TestGroup' - meths.create_augroup(augroup, { clear = true }) + meths.nvim_create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup, once = true } set_ft('txt') @@ -1237,7 +1237,7 @@ describe('autocmd api', function() it('autocmds can be registered multiple times.', function() local augroup = 'TestGroup' - meths.create_augroup(augroup, { clear = true }) + meths.nvim_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 } @@ -1251,16 +1251,16 @@ describe('autocmd api', function() it('can be deleted', function() local augroup = 'WillBeDeleted' - meths.create_augroup(augroup, { clear = true }) - meths.create_autocmd({ 'FileType' }, { + meths.nvim_create_augroup(augroup, { clear = true }) + meths.nvim_create_autocmd({ 'FileType' }, { pattern = '*', command = "echo 'does not matter'", }) -- Clears the augroup from before, which erases the autocmd - meths.create_augroup(augroup, { clear = true }) + meths.nvim_create_augroup(augroup, { clear = true }) - local result = #meths.get_autocmds { group = augroup } + local result = #meths.nvim_get_autocmds { group = augroup } eq(0, result) end) @@ -1268,10 +1268,10 @@ describe('autocmd api', function() it('can be used for buffer local autocmds', function() local augroup = 'WillBeDeleted' - meths.set_var('value_set', false) + meths.nvim_set_var('value_set', false) - meths.create_augroup(augroup, { clear = true }) - meths.create_autocmd('FileType', { + meths.nvim_create_augroup(augroup, { clear = true }) + meths.nvim_create_autocmd('FileType', { pattern = '', command = 'let g:value_set = v:true', }) @@ -1279,7 +1279,7 @@ describe('autocmd api', function() command 'new' command 'set filetype=python' - eq(false, meths.get_var('value_set')) + eq(false, meths.nvim_get_var('value_set')) end) it('can accept vimscript functions', function() @@ -1302,7 +1302,7 @@ describe('autocmd api', function() set filetype=txt ]] - eq(2, meths.get_var('vimscript_executed')) + eq(2, meths.nvim_get_var('vimscript_executed')) end) end) @@ -1314,11 +1314,11 @@ describe('autocmd api', function() command('augroup! TEMP_A') - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_A' })) + eq(false, pcall(meths.nvim_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' }) + eq(1, #meths.nvim_get_autocmds { event = 'BufReadPost' }) end) it('legacy: remove augroups that have no autocmds', function() @@ -1327,8 +1327,8 @@ describe('autocmd api', function() command('augroup! TEMP_AB') - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_AB' })) - eq(0, #meths.get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_AB' })) + eq(0, #meths.nvim_get_autocmds { event = 'BufReadPost' }) end) it('legacy: multiple remove and add augroup', function() @@ -1340,7 +1340,7 @@ describe('autocmd api', function() command('augroup! TEMP_ABC') -- Should still have one autocmd :'( - local aus = meths.get_autocmds { event = 'BufReadPost' } + local aus = meths.nvim_get_autocmds { event = 'BufReadPost' } eq(1, #aus, aus) command('augroup TEMP_ABC') @@ -1349,13 +1349,13 @@ describe('autocmd api', function() command('augroup END') -- Should now have two autocmds :'( - aus = meths.get_autocmds { event = 'BufReadPost' } + aus = meths.nvim_get_autocmds { event = 'BufReadPost' } eq(2, #aus, aus) command('augroup! TEMP_ABC') - eq(false, pcall(meths.get_autocmds, { group = 'TEMP_ABC' })) - eq(2, #meths.get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_ABC' })) + eq(2, #meths.nvim_get_autocmds { event = 'BufReadPost' }) end) it('api: should clear and not return any autocmds for delete groups by id', function() @@ -1363,13 +1363,13 @@ describe('autocmd api', function() 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.nvim_create_augroup('TEMP_ABCD', { clear = false }) + meths.nvim_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' }) + eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_ABCD' })) + eq(0, #meths.nvim_get_autocmds { event = 'BufReadPost' }) end) it('api: should clear and not return any autocmds for delete groups by name', function() @@ -1377,12 +1377,12 @@ describe('autocmd api', function() command('autocmd! BufReadPost *.py :echo "Hello"') command('augroup END') - meths.del_augroup_by_name('TEMP_ABCDE') + meths.nvim_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' }) + eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_ABCDE' })) + eq(0, #meths.nvim_get_autocmds { event = 'BufReadPost' }) end) end) @@ -1390,18 +1390,18 @@ describe('autocmd api', function() it('validation', function() eq( "Cannot use both 'pattern' and 'buffer'", - pcall_err(meths.clear_autocmds, { + pcall_err(meths.nvim_clear_autocmds, { pattern = '*', buffer = 42, }) ) eq( "Invalid 'event' item: expected String, got Array", - pcall_err(meths.clear_autocmds, { + pcall_err(meths.nvim_clear_autocmds, { event = { 'FileType', {} }, }) ) - eq("Invalid 'group': 0", pcall_err(meths.clear_autocmds, { group = 0 })) + eq("Invalid 'group': 0", pcall_err(meths.nvim_clear_autocmds, { group = 0 })) end) it('should clear based on event + pattern', function() @@ -1409,17 +1409,17 @@ describe('autocmd api', function() command('autocmd InsertEnter *.txt :echo "Text Files Are Cool"') local search = { event = 'InsertEnter', pattern = '*.txt' } - local before_delete = meths.get_autocmds(search) + local before_delete = meths.nvim_get_autocmds(search) eq(1, #before_delete) - local before_delete_all = meths.get_autocmds { event = search.event } + local before_delete_all = meths.nvim_get_autocmds { event = search.event } eq(2, #before_delete_all) - meths.clear_autocmds(search) - local after_delete = meths.get_autocmds(search) + meths.nvim_clear_autocmds(search) + local after_delete = meths.nvim_get_autocmds(search) eq(0, #after_delete) - local after_delete_all = meths.get_autocmds { event = search.event } + local after_delete_all = meths.nvim_get_autocmds { event = search.event } eq(1, #after_delete_all) end) @@ -1428,11 +1428,11 @@ describe('autocmd api', function() command('autocmd InsertEnter *.txt :echo "Text Files Are Cool"') local search = { event = 'InsertEnter' } - local before_delete = meths.get_autocmds(search) + local before_delete = meths.nvim_get_autocmds(search) eq(2, #before_delete) - meths.clear_autocmds(search) - local after_delete = meths.get_autocmds(search) + meths.nvim_clear_autocmds(search) + local after_delete = meths.nvim_get_autocmds(search) eq(0, #after_delete) end) @@ -1443,16 +1443,18 @@ describe('autocmd api', function() command('autocmd InsertLeave *.TestPat2 :echo "Leave 2"') local search = { pattern = '*.TestPat1' } - local before_delete = meths.get_autocmds(search) + local before_delete = meths.nvim_get_autocmds(search) eq(2, #before_delete) - local before_delete_events = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + local before_delete_events = + meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(4, #before_delete_events) - meths.clear_autocmds(search) - local after_delete = meths.get_autocmds(search) + meths.nvim_clear_autocmds(search) + local after_delete = meths.nvim_get_autocmds(search) eq(0, #after_delete) - local after_delete_events = meths.get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + local after_delete_events = + meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(2, #after_delete_events) end) @@ -1462,11 +1464,11 @@ describe('autocmd api', function() command('autocmd InsertEnter *.TestPat1 :echo "Enter Pattern"') local search = { event = 'InsertEnter' } - local before_delete = meths.get_autocmds(search) + local before_delete = meths.nvim_get_autocmds(search) eq(2, #before_delete) - meths.clear_autocmds { buffer = 0 } - local after_delete = meths.get_autocmds(search) + meths.nvim_clear_autocmds { buffer = 0 } + local after_delete = meths.nvim_get_autocmds(search) eq(1, #after_delete) eq('*.TestPat1', after_delete[1].pattern) end) @@ -1479,17 +1481,17 @@ describe('autocmd api', function() command('augroup END') local search = { event = 'InsertEnter', group = 'TestNvimClearAutocmds' } - local before_delete = meths.get_autocmds(search) + local before_delete = meths.nvim_get_autocmds(search) eq(2, #before_delete) -- Doesn't clear without passing group. - meths.clear_autocmds { buffer = 0 } - local without_group = meths.get_autocmds(search) + meths.nvim_clear_autocmds { buffer = 0 } + local without_group = meths.nvim_get_autocmds(search) eq(2, #without_group) -- Doesn't clear with passing group. - meths.clear_autocmds { buffer = 0, group = search.group } - local with_group = meths.get_autocmds(search) + meths.nvim_clear_autocmds { buffer = 0, group = search.group } + local with_group = meths.nvim_get_autocmds(search) eq(1, #with_group) end) end) diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index 0dd01b7299..c71853b574 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -42,9 +42,9 @@ describe('api/buf', function() end) 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, {}) + local buf = meths.nvim_create_buf(false, true) + meths.nvim_buf_set_option(buf, 'undolevels', -1) + meths.nvim_buf_set_lines(buf, 0, 1, false, {}) assert_alive() end) @@ -85,35 +85,41 @@ describe('api/buf', function() 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 }) - local win = meths.get_current_win() - local buf = meths.get_current_buf() + meths.nvim_buf_set_lines(0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.nvim_win_set_cursor(0, { 3, 2 }) + local win = meths.nvim_get_current_win() + local buf = meths.nvim_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.nvim_buf_set_lines(buf, 1, 2, 1, { 'line5', 'line6' }) + eq( + { 'line1', 'line5', 'line6', 'line3', 'line4' }, + meths.nvim_buf_get_lines(buf, 0, -1, true) + ) + eq({ 4, 2 }, meths.nvim_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 }) - local win = meths.get_current_win() - local buf = meths.get_current_buf() + meths.nvim_buf_set_lines(0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.nvim_win_set_cursor(0, { 3, 2 }) + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('split') - meths.win_set_cursor(0, { 4, 2 }) - local win2 = meths.get_current_win() + meths.nvim_win_set_cursor(0, { 4, 2 }) + local win2 = meths.nvim_get_current_win() -- set current window to third one with another buffer 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.nvim_buf_set_lines(buf, 1, 2, 1, { 'line5', 'line6' }) + eq( + { 'line1', 'line5', 'line6', 'line3', 'line4' }, + meths.nvim_buf_get_lines(buf, 0, -1, true) + ) + eq({ 4, 2 }, meths.nvim_win_get_cursor(win)) + eq({ 5, 2 }, meths.nvim_win_get_cursor(win2)) end) it('line_count has defined behaviour for unloaded buffers', function() @@ -156,16 +162,22 @@ describe('api/buf', function() [3] = { reverse = true }, } screen:attach() - meths.buf_set_lines(0, 0, -1, 1, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' }) - meths.set_option_value('modified', false, {}) + meths.nvim_buf_set_lines( + 0, + 0, + -1, + 1, + { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' } + ) + meths.nvim_set_option_value('modified', false, {}) end) it('of current window', function() - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('new | wincmd w') - meths.win_set_cursor(win, { 8, 0 }) + meths.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -181,7 +193,7 @@ describe('api/buf', function() ]], } - meths.buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + meths.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) screen:expect { grid = [[ | @@ -197,7 +209,7 @@ describe('api/buf', function() } -- replacing topline keeps it the topline - meths.buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + meths.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) screen:expect { grid = [[ | @@ -213,7 +225,7 @@ describe('api/buf', function() } -- inserting just before topline does not scroll up if cursor would be moved - meths.buf_set_lines(buf, 3, 3, true, { 'mmm' }) + meths.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) screen:expect { grid = [[ | @@ -229,7 +241,7 @@ describe('api/buf', function() unchanged = true, } - meths.win_set_cursor(0, { 7, 0 }) + meths.nvim_win_set_cursor(0, { 7, 0 }) screen:expect { grid = [[ | @@ -244,7 +256,7 @@ describe('api/buf', function() ]], } - meths.buf_set_lines(buf, 4, 4, true, { 'mmmeeeee' }) + meths.nvim_buf_set_lines(buf, 4, 4, true, { 'mmmeeeee' }) screen:expect { grid = [[ | @@ -261,11 +273,11 @@ describe('api/buf', function() end) it('of non-current window', function() - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('new') - meths.win_set_cursor(win, { 8, 0 }) + meths.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -281,7 +293,7 @@ describe('api/buf', function() ]], } - meths.buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + meths.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) screen:expect { grid = [[ ^ | @@ -297,7 +309,7 @@ describe('api/buf', function() } -- replacing topline keeps it the topline - meths.buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + meths.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) screen:expect { grid = [[ ^ | @@ -313,7 +325,7 @@ describe('api/buf', function() } -- inserting just before topline scrolls up - meths.buf_set_lines(buf, 3, 3, true, { 'mmm' }) + meths.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) screen:expect { grid = [[ ^ | @@ -330,12 +342,12 @@ describe('api/buf', function() end) it('of split windows with same buffer', function() - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('split') - meths.win_set_cursor(win, { 8, 0 }) - meths.win_set_cursor(0, { 1, 0 }) + meths.nvim_win_set_cursor(win, { 8, 0 }) + meths.nvim_win_set_cursor(0, { 1, 0 }) screen:expect { grid = [[ @@ -353,7 +365,7 @@ describe('api/buf', function() | ]], } - meths.buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + meths.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) screen:expect { grid = [[ @@ -373,7 +385,7 @@ describe('api/buf', function() } -- replacing topline keeps it the topline - meths.buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + meths.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) screen:expect { grid = [[ ^aaabbb | @@ -392,7 +404,7 @@ describe('api/buf', function() } -- inserting just before topline scrolls up - meths.buf_set_lines(buf, 3, 3, true, { 'mmm' }) + meths.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) screen:expect { grid = [[ ^aaabbb | @@ -413,15 +425,15 @@ describe('api/buf', function() 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' }) + local buf = meths.nvim_get_current_buf() + meths.nvim_buf_set_lines(buf, 0, -1, true, { 'aaa', 'bbb', 'ccc' }) command('new') - meths.buf_set_lines(0, 0, -1, true, { 'xxx', 'yyy', 'zzz' }) + meths.nvim_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.nvim_buf_set_lines(buf, 0, -1, true, {}) + eq({ 'xxx', 'yyy', 'zzz' }, meths.nvim_buf_get_lines(0, 0, -1, true)) + eq({ '' }, meths.nvim_buf_get_lines(buf, 0, -1, true)) end) end) @@ -676,7 +688,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.nvim_create_buf(false, true) screen:expect([[ Who would win? | A real window | @@ -685,7 +697,7 @@ describe('api/buf', function() | ]]) - api.meths.buf_set_lines(buf, 0, -1, true, { 'or some', 'scratchy text' }) + api.meths.nvim_buf_set_lines(buf, 0, -1, true, { 'or some', 'scratchy text' }) feed('i') -- provoke redraw screen:expect([[ Who would win? | @@ -701,22 +713,22 @@ describe('api/buf', function() visible buffer line 1 line 2 ]]) - local hiddenbuf = api.meths.create_buf(false, true) + local hiddenbuf = api.meths.nvim_create_buf(false, true) command('vsplit') command('vsplit') feed('lll') eq(3, funcs.winnr()) feed('h') eq(2, funcs.winnr()) - api.meths.buf_set_lines(hiddenbuf, 0, -1, true, { 'hidden buffer line 1', 'line 2' }) + api.meths.nvim_buf_set_lines(hiddenbuf, 0, -1, true, { 'hidden buffer line 1', 'line 2' }) feed('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_name(bufnr, 'set_lines') + meths.nvim_buf_set_lines(bufnr, 0, -1, false, { 'a', 'b', 'c' }) + meths.nvim_buf_set_name(bufnr, 'set_lines') finally(function() os.remove('set_lines') end) @@ -724,8 +736,8 @@ describe('api/buf', function() command('new') 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)) + meths.nvim_buf_set_lines(new_bufnr, 0, -1, false, {}) + eq({ '' }, meths.nvim_buf_get_lines(new_bufnr, 0, -1, false)) end) end) @@ -822,18 +834,18 @@ describe('api/buf', function() hello world!]]) -- position the cursor on `!` - meths.win_set_cursor(0, { 1, 11 }) + meths.nvim_win_set_cursor(0, { 1, 11 }) - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() 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.nvim_buf_set_text(buf, 0, 6, 0, 11, { 'foo' }) + eq({ 'hello foo!' }, meths.nvim_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.nvim_win_get_cursor(win)) end) it('updates the cursor position in TWO non-current windows', function() @@ -841,24 +853,24 @@ describe('api/buf', function() hello world!]]) -- position the cursor on `!` - meths.win_set_cursor(0, { 1, 11 }) - local win = meths.get_current_win() - local buf = meths.get_current_buf() + meths.nvim_win_set_cursor(0, { 1, 11 }) + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('split') - local win2 = meths.get_current_win() + local win2 = meths.nvim_get_current_win() -- position the cursor on `w` - meths.win_set_cursor(0, { 1, 6 }) + meths.nvim_win_set_cursor(0, { 1, 6 }) 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.nvim_buf_set_text(buf, 0, 0, 0, 5, { 'foo' }) + eq({ 'foo world!' }, meths.nvim_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.nvim_win_get_cursor(win)) + eq({ 1, 4 }, meths.nvim_win_get_cursor(win2)) end) describe('when text is being added right at cursor position #22526', function() @@ -1693,7 +1705,7 @@ describe('api/buf', function() 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 }) + meths.nvim_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, {''}) @@ -1711,16 +1723,22 @@ describe('api/buf', function() [3] = { reverse = true }, } screen:attach() - meths.buf_set_lines(0, 0, -1, 1, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' }) - meths.set_option_value('modified', false, {}) + meths.nvim_buf_set_lines( + 0, + 0, + -1, + 1, + { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' } + ) + meths.nvim_set_option_value('modified', false, {}) end) it('of current window', function() - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('new | wincmd w') - meths.win_set_cursor(win, { 8, 0 }) + meths.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -1735,7 +1753,7 @@ describe('api/buf', function() | ]], } - meths.buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + meths.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) screen:expect { grid = [[ @@ -1753,11 +1771,11 @@ describe('api/buf', function() end) it('of non-current window', function() - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('new') - meths.win_set_cursor(win, { 8, 0 }) + meths.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -1773,7 +1791,7 @@ describe('api/buf', function() ]], } - meths.buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + meths.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) screen:expect { grid = [[ ^ | @@ -1790,12 +1808,12 @@ describe('api/buf', function() end) it('of split windows with same buffer', function() - local win = meths.get_current_win() - local buf = meths.get_current_buf() + local win = meths.nvim_get_current_win() + local buf = meths.nvim_get_current_buf() command('split') - meths.win_set_cursor(win, { 8, 0 }) - meths.win_set_cursor(0, { 1, 1 }) + meths.nvim_win_set_cursor(win, { 8, 0 }) + meths.nvim_win_set_cursor(0, { 1, 1 }) screen:expect { grid = [[ @@ -1813,7 +1831,7 @@ describe('api/buf', function() | ]], } - meths.buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + meths.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) screen:expect { grid = [[ @@ -1861,7 +1879,7 @@ describe('api/buf', function() eq('Index out of bounds', pcall_err(get_text, 0, 0, 3, 0, {})) eq('Index out of bounds', pcall_err(get_text, 0, 0, -4, 0, {})) -- no ml_get errors should happen #19017 - eq('', meths.get_vvar('errmsg')) + eq('', meths.nvim_get_vvar('errmsg')) end) it('errors when start is greater than end', function() @@ -1884,19 +1902,19 @@ describe('api/buf', function() eq('Index out of bounds', pcall_err(get_offset, 6)) eq('Index out of bounds', pcall_err(get_offset, -1)) - meths.set_option_value('eol', false, {}) - meths.set_option_value('fixeol', false, {}) + meths.nvim_set_option_value('eol', false, {}) + meths.nvim_set_option_value('fixeol', false, {}) eq(28, get_offset(5)) -- fileformat is ignored - meths.set_option_value('fileformat', 'dos', {}) + meths.nvim_set_option_value('fileformat', 'dos', {}) eq(0, get_offset(0)) eq(6, get_offset(1)) eq(15, get_offset(2)) eq(16, get_offset(3)) eq(24, get_offset(4)) eq(28, get_offset(5)) - meths.set_option_value('eol', true, {}) + meths.nvim_set_option_value('eol', true, {}) eq(29, get_offset(5)) command('set hidden') @@ -2077,7 +2095,7 @@ describe('api/buf', function() eq(false, pcall(curbufmeths.set_mark, 'fail', 1, 0, {})) end) it('fails when invalid buffer number is used', function() - eq(false, pcall(meths.buf_set_mark, 99, 'a', 1, 1, {})) + eq(false, pcall(meths.nvim_buf_set_mark, 99, 'a', 1, 1, {})) end) end) @@ -2095,7 +2113,7 @@ describe('api/buf', function() 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) + local abuf = meths.nvim_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')) @@ -2112,7 +2130,7 @@ describe('api/buf', function() eq(false, pcall(curbufmeths.del_mark, 'fail')) end) it('fails when invalid buffer number is used', function() - eq(false, pcall(meths.buf_del_mark, 99, 'a')) + eq(false, pcall(meths.nvim_buf_del_mark, 99, 'a')) end) end) end) diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua index 6486b58db9..f1e3c5155d 100644 --- a/test/functional/api/command_spec.lua +++ b/test/functional/api/command_spec.lua @@ -51,24 +51,24 @@ describe('nvim_get_commands', function() before_each(clear) it('gets empty list if no commands were defined', function() - eq({}, meths.get_commands({ builtin = false })) + eq({}, meths.nvim_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.nvim_get_commands, { builtin = true })) + eq("Invalid key: 'foo'", pcall_err(meths.nvim_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.nvim_get_commands({ builtin = false })) -- Define another command. command('command -nargs=? Pwd pwd') - eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, meths.get_commands({ builtin = false })) + eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, meths.nvim_get_commands({ builtin = false })) -- Delete a command. command('delcommand Pwd') - eq({ Hello = cmd_dict }, meths.get_commands({ builtin = false })) + eq({ Hello = cmd_dict }, meths.nvim_get_commands({ builtin = false })) end) it('gets buffer-local user-defined commands', function() @@ -171,9 +171,9 @@ describe('nvim_get_commands', function() let s:foo = 1 command -complete=custom,ListUsers -nargs=+ Finger !finger ]]) - eq({ Finger = cmd1 }, meths.get_commands({ builtin = false })) + eq({ Finger = cmd1 }, meths.nvim_get_commands({ builtin = false })) command('command -nargs=1 -complete=dir -addr=arguments -count=10 TestCmd pwd ') - eq({ Finger = cmd1, TestCmd = cmd0 }, meths.get_commands({ builtin = false })) + eq({ Finger = cmd1, TestCmd = cmd0 }, meths.nvim_get_commands({ builtin = false })) source([[ function! s:foo() abort @@ -193,7 +193,7 @@ describe('nvim_get_commands', function() -- 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 }) + meths.nvim_get_commands({ builtin = false }) ) end) end) @@ -202,9 +202,9 @@ describe('nvim_create_user_command', function() before_each(clear) it('works with strings', function() - meths.create_user_command('SomeCommand', 'let g:command_fired = ', { nargs = 1 }) - meths.command('SomeCommand 42') - eq(42, meths.eval('g:command_fired')) + meths.nvim_create_user_command('SomeCommand', 'let g:command_fired = ', { nargs = 1 }) + meths.nvim_command('SomeCommand 42') + eq(42, meths.nvim_eval('g:command_fired')) end) it('works with Lua functions', function() @@ -646,11 +646,11 @@ describe('nvim_create_user_command', function() end) it('can define buffer-local commands', function() - local bufnr = meths.create_buf(false, false) + local bufnr = meths.nvim_create_buf(false, false) 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') + matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello')) + meths.nvim_set_current_buf(bufnr) + meths.nvim_command('Hello') assert_alive() end) @@ -731,28 +731,28 @@ describe('nvim_create_user_command', function() 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.nvim_cmd({ cmd = 'MyEcho', mods = { verbose = 3 } }, { output = true })) - eq(1, #meths.list_tabpages()) + eq(1, #meths.nvim_list_tabpages()) exec_lua [[ vim.api.nvim_create_user_command('MySplit', function(opts) vim.api.nvim_cmd({ cmd = 'split', mods = opts.smods }, {}) end, {}) ]] - meths.cmd({ cmd = 'MySplit' }, {}) - eq(1, #meths.list_tabpages()) - eq(2, #meths.list_wins()) - meths.cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) - eq(2, #meths.list_tabpages()) + meths.nvim_cmd({ cmd = 'MySplit' }, {}) + eq(1, #meths.nvim_list_tabpages()) + eq(2, #meths.nvim_list_wins()) + meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) + eq(2, #meths.nvim_list_tabpages()) eq(2, funcs.tabpagenr()) - meths.cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) - eq(3, #meths.list_tabpages()) + meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) + eq(3, #meths.nvim_list_tabpages()) eq(2, funcs.tabpagenr()) - meths.cmd({ cmd = 'MySplit', mods = { tab = 3 } }, {}) - eq(4, #meths.list_tabpages()) + meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 3 } }, {}) + eq(4, #meths.nvim_list_tabpages()) eq(4, funcs.tabpagenr()) - meths.cmd({ cmd = 'MySplit', mods = { tab = 0 } }, {}) - eq(5, #meths.list_tabpages()) + meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 0 } }, {}) + eq(5, #meths.nvim_list_tabpages()) eq(1, funcs.tabpagenr()) end) end) @@ -761,16 +761,16 @@ describe('nvim_del_user_command', function() before_each(clear) it('can delete global commands', 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')) + meths.nvim_create_user_command('Hello', 'echo "Hi"', {}) + meths.nvim_command('Hello') + meths.nvim_del_user_command('Hello') + matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello')) end) it('can delete buffer-local commands', function() bufmeths.create_user_command(0, 'Hello', 'echo "Hi"', {}) - meths.command('Hello') + meths.nvim_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.nvim_command, 'Hello')) end) end) diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 0594f36d0e..83fc5aa47f 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1472,7 +1472,7 @@ describe('API/extmarks', function() it('in read-only buffer', function() command('view! runtime/doc/help.txt') - eq(true, meths.get_option_value('ro', {})) + eq(true, meths.nvim_get_option_value('ro', {})) local id = set_extmark(ns, 0, 0, 2) eq({ { id, 0, 2 } }, get_extmarks(ns, 0, -1)) end) @@ -1512,7 +1512,7 @@ describe('API/extmarks', function() 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, {})) + eq({ { 1, 0, 0 }, { 2, 0, 0 } }, meths.nvim_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, {})) @@ -1520,7 +1520,7 @@ describe('API/extmarks', function() -- 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.nvim_buf_get_extmarks(0, ns, 0, -1, {})) end) it('can accept "end_row" or "end_line" #16548', function() @@ -1547,7 +1547,7 @@ describe('API/extmarks', function() it('in prompt buffer', function() feed('dd') local id = set_extmark(ns, marks[1], 0, 0, {}) - meths.set_option_value('buftype', 'prompt', {}) + meths.nvim_set_option_value('buftype', 'prompt', {}) feed('i') eq({ { id, 0, 2 } }, get_extmarks(ns, 0, -1)) end) @@ -1695,7 +1695,7 @@ describe('API/extmarks', function() screen = Screen.new(40, 6) screen:attach() feed('dd6iaaa bbb cccgg') - meths.set_option_value('signcolumn', 'auto:2', {}) + meths.nvim_set_option_value('signcolumn', 'auto:2', {}) set_extmark(ns, 1, 0, 0, { invalidate = true, sign_text = 'S1', end_row = 1 }) set_extmark(ns, 2, 1, 0, { invalidate = true, sign_text = 'S2', end_row = 2 }) -- mark with invalidate is removed diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua index fe9e2a7727..07ce9d0c54 100644 --- a/test/functional/api/highlight_spec.lua +++ b/test/functional/api/highlight_spec.lua @@ -59,7 +59,7 @@ describe('API: highlight', function() 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)) + eq('Invalid highlight id: 30000', pcall_err(meths.nvim_get_hl_by_id, 30000, false)) -- Test all highlight properties. command('hi NewHighlight gui=underline,bold,italic,reverse,strikethrough,altfont,nocombine') @@ -72,30 +72,30 @@ describe('API: highlight', function() -- 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) + pcall_err(meths.nvim_get_hl_by_id, { nil }, false) ) -- Test 0 argument. - eq('Invalid highlight id: 0', pcall_err(meths.get_hl_by_id, 0, false)) + eq('Invalid highlight id: 0', pcall_err(meths.nvim_get_hl_by_id, 0, false)) -- Test -1 argument. - eq('Invalid highlight id: -1', pcall_err(meths.get_hl_by_id, -1, false)) + eq('Invalid highlight id: -1', pcall_err(meths.nvim_get_hl_by_id, -1, false)) -- Test highlight group without ctermbg value. 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.nvim_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.nvim_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.nvim_get_hl_by_id(hl_id, false)) end) it('nvim_get_hl_by_name', function() @@ -114,28 +114,28 @@ describe('API: highlight', function() -- Test invalid name. eq( "Invalid highlight name: 'unknown_highlight'", - pcall_err(meths.get_hl_by_name, 'unknown_highlight', false) + pcall_err(meths.nvim_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) + pcall_err(meths.nvim_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.nvim_get_hl_by_name, '', false)) -- Test "standout" attribute. #8054 - eq({ underline = true }, meths.get_hl_by_name('cursorline', 0)) + eq({ underline = true }, meths.nvim_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.nvim_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.nvim_set_hl(0, 'Normal', { ctermfg = 17, ctermbg = 213 }) + meths.nvim_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( @@ -146,31 +146,34 @@ describe('API: highlight', function() 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( + "Invalid highlight name: 'Shrubbery'", + pcall_err(meths.nvim_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.nvim_get_hl_id_by_name('Shrubbery') ok(hl_id > 0) 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) + meths.nvim_get_hl_by_id(hl_id, true) ) eq( { foreground = tonumber('0x888888'), background = tonumber('0x888888') }, - meths.get_hl_by_name('Shrubbery', true) + meths.nvim_get_hl_by_name('Shrubbery', true) ) end) it("nvim_buf_add_highlight to other buffer doesn't crash if undo is disabled #12873", function() command('vsplit file') - local err, _ = pcall(meths.set_option_value, 'undofile', false, { buf = 1 }) + local err, _ = pcall(meths.nvim_set_option_value, 'undofile', false, { buf = 1 }) eq(true, err) - err, _ = pcall(meths.set_option_value, 'undolevels', -1, { buf = 1 }) + err, _ = pcall(meths.nvim_set_option_value, 'undolevels', -1, { buf = 1 }) eq(true, err) - err, _ = pcall(meths.buf_add_highlight, 1, -1, 'Question', 0, 0, -1) + err, _ = pcall(meths.nvim_buf_add_highlight, 1, -1, 'Question', 0, 0, -1) eq(true, err) assert_alive() end) @@ -241,8 +244,8 @@ describe('API: set highlight', function() } local function get_ns() - local ns = meths.create_namespace('Test_set_hl') - meths.set_hl_ns(ns) + local ns = meths.nvim_create_namespace('Test_set_hl') + meths.nvim_set_hl_ns(ns) return ns end @@ -251,51 +254,51 @@ describe('API: set highlight', function() it('validation', function() eq( "Invalid 'blend': out of range", - pcall_err(meths.set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = 999 }) + pcall_err(meths.nvim_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 = {} }) + pcall_err(meths.nvim_set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = {} }) ) end) 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)) + meths.nvim_set_hl(ns, 'Test_hl', highlight1) + eq(highlight1, meths.nvim_get_hl_by_name('Test_hl', true)) end) 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)) + meths.nvim_set_hl(ns, 'Test_hl', highlight2_config) + eq(highlight2_result, meths.nvim_get_hl_by_name('Test_hl', false)) end) 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)) + meths.nvim_set_hl(ns, 'Test_hl', { cterm = {} }) + eq({}, meths.nvim_get_hl_by_name('Test_hl', false)) end) it('cterm attr defaults to gui attr', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', highlight1) + meths.nvim_set_hl(ns, 'Test_hl', highlight1) eq({ bold = true, italic = true, - }, meths.get_hl_by_name('Test_hl', false)) + }, meths.nvim_get_hl_by_name('Test_hl', false)) end) 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)) + meths.nvim_set_hl(ns, 'Test_hl', highlight3_config) + eq(highlight3_result_gui, meths.nvim_get_hl_by_name('Test_hl', true)) + eq(highlight3_result_cterm, meths.nvim_get_hl_by_name('Test_hl', false)) end) it('only allows one underline attribute #22371', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', { + meths.nvim_set_hl(ns, 'Test_hl', { underdouble = true, underdotted = true, cterm = { @@ -303,21 +306,21 @@ describe('API: set highlight', function() undercurl = true, }, }) - eq({ undercurl = true }, meths.get_hl_by_name('Test_hl', false)) - eq({ underdotted = true }, meths.get_hl_by_name('Test_hl', true)) + eq({ undercurl = true }, meths.nvim_get_hl_by_name('Test_hl', false)) + eq({ underdotted = true }, meths.nvim_get_hl_by_name('Test_hl', true)) end) it('can set a highlight in the global namespace', function() - meths.set_hl(0, 'Test_hl', highlight2_config) + meths.nvim_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') ) - meths.set_hl(0, 'Test_hl', { background = highlight_color.bg }) + meths.nvim_set_hl(0, 'Test_hl', { background = highlight_color.bg }) eq('Test_hl xxx guibg=#0032aa', exec_capture('highlight Test_hl')) - meths.set_hl(0, 'Test_hl2', highlight3_config) + meths.nvim_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') @@ -325,58 +328,64 @@ describe('API: set highlight', function() -- Colors are stored with the name they are defined, but -- with canonical casing - meths.set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue' }) + meths.nvim_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' }) + meths.nvim_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' }) + meths.nvim_set_hl(0, 'Test_hl3', { bg = 'red' }) eq('Test_hl3 xxx guibg=Red', exec_capture('highlight Test_hl3')) - meths.set_hl(0, 'Test_hl3', { ctermbg = 9, ctermfg = 12 }) + meths.nvim_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' }) + meths.nvim_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 }) + meths.nvim_set_hl(0, 'Test_hl3', { ctermbg = 9 }) 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.nvim_set_hl, 0, 'Test_hl3', { fg = 'redd' }) + ) eq( "Invalid highlight color: 'bleu'", - pcall_err(meths.set_hl, 0, 'Test_hl3', { ctermfg = 'bleu' }) + pcall_err(meths.nvim_set_hl, 0, 'Test_hl3', { ctermfg = 'bleu' }) ) - meths.set_hl(0, 'Test_hl3', { fg = '#FF00FF' }) + meths.nvim_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' }) + pcall_err(meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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' }) + meths.nvim_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.nvim_set_hl, 0, 'foo bar', { bold = true }) + ) assert_alive() end) end) @@ -443,14 +452,14 @@ describe('API: get highlight', function() local function get_ns() -- Test namespace filtering behavior - local ns2 = meths.create_namespace('Another_namespace') - meths.set_hl(ns2, 'Test_hl', { ctermfg = 23 }) - meths.set_hl(ns2, 'Test_another_hl', { link = 'Test_hl' }) - meths.set_hl(ns2, 'Test_hl_link', { link = 'Test_another_hl' }) - meths.set_hl(ns2, 'Test_another_hl_link', { link = 'Test_hl_link' }) + local ns2 = meths.nvim_create_namespace('Another_namespace') + meths.nvim_set_hl(ns2, 'Test_hl', { ctermfg = 23 }) + meths.nvim_set_hl(ns2, 'Test_another_hl', { link = 'Test_hl' }) + meths.nvim_set_hl(ns2, 'Test_hl_link', { link = 'Test_another_hl' }) + meths.nvim_set_hl(ns2, 'Test_another_hl_link', { link = 'Test_hl_link' }) - local ns = meths.create_namespace('Test_set_hl') - meths.set_hl_ns(ns) + local ns = meths.nvim_create_namespace('Test_set_hl') + meths.nvim_set_hl_ns(ns) return ns end @@ -458,23 +467,26 @@ 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('Highlight id out of bounds', pcall_err(meths.get_hl, 0, { name = 'Test set hl' })) + eq( + "Invalid 'name': expected String, got Integer", + pcall_err(meths.nvim_get_hl, 0, { name = 177 }) + ) + eq('Highlight id out of bounds', pcall_err(meths.nvim_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(0, funcs.hlexists('Foo')) - meths.get_hl(0, { name = 'Bar', create = true }) + meths.nvim_get_hl(0, { name = 'Bar', create = true }) eq(1, funcs.hlexists('Bar')) - meths.get_hl(0, { name = 'FooBar' }) + meths.nvim_get_hl(0, { name = 'FooBar' }) eq(1, funcs.hlexists('FooBar')) end) it('can get all highlights in current namespace', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', { bg = '#B4BEFE' }) - meths.set_hl(ns, 'Test_hl_link', { link = 'Test_hl' }) + meths.nvim_set_hl(ns, 'Test_hl', { bg = '#B4BEFE' }) + meths.nvim_set_hl(ns, 'Test_hl_link', { link = 'Test_hl' }) eq({ Test_hl = { bg = 11845374, @@ -482,42 +494,42 @@ describe('API: get highlight', function() Test_hl_link = { link = 'Test_hl', }, - }, meths.get_hl(ns, {})) + }, meths.nvim_get_hl(ns, {})) end) it('can get gui highlight', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', highlight1) - eq(highlight1, meths.get_hl(ns, { name = 'Test_hl' })) + meths.nvim_set_hl(ns, 'Test_hl', highlight1) + eq(highlight1, meths.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('can get cterm highlight', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', highlight2) - eq(highlight2, meths.get_hl(ns, { name = 'Test_hl' })) + meths.nvim_set_hl(ns, 'Test_hl', highlight2) + eq(highlight2, meths.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('can get empty cterm attr', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', { cterm = {} }) - eq({}, meths.get_hl(ns, { name = 'Test_hl' })) + meths.nvim_set_hl(ns, 'Test_hl', { cterm = {} }) + eq({}, meths.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('cterm attr defaults to gui attr', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', highlight1) - eq(highlight1, meths.get_hl(ns, { name = 'Test_hl' })) + meths.nvim_set_hl(ns, 'Test_hl', highlight1) + eq(highlight1, meths.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('can overwrite attr for cterm', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', highlight3_config) - eq(highlight3_result, meths.get_hl(ns, { name = 'Test_hl' })) + meths.nvim_set_hl(ns, 'Test_hl', highlight3_config) + eq(highlight3_result, meths.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('only allows one underline attribute #22371', function() local ns = get_ns() - meths.set_hl(ns, 'Test_hl', { + meths.nvim_set_hl(ns, 'Test_hl', { underdouble = true, underdotted = true, cterm = { @@ -525,32 +537,35 @@ 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.nvim_get_hl(ns, { name = 'Test_hl' }) + ) end) it('can get a highlight in the global namespace', function() - meths.set_hl(0, 'Test_hl', highlight2) - eq(highlight2, meths.get_hl(0, { name = 'Test_hl' })) + meths.nvim_set_hl(0, 'Test_hl', highlight2) + eq(highlight2, meths.nvim_get_hl(0, { name = 'Test_hl' })) - meths.set_hl(0, 'Test_hl', { background = highlight_color.bg }) + meths.nvim_set_hl(0, 'Test_hl', { background = highlight_color.bg }) eq({ bg = 12970, - }, meths.get_hl(0, { name = 'Test_hl' })) + }, meths.nvim_get_hl(0, { name = 'Test_hl' })) - meths.set_hl(0, 'Test_hl2', highlight3_config) - eq(highlight3_result, meths.get_hl(0, { name = 'Test_hl2' })) + meths.nvim_set_hl(0, 'Test_hl2', highlight3_config) + eq(highlight3_result, meths.nvim_get_hl(0, { name = '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' }) + meths.nvim_set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue' }) eq({ bg = 16711680, fg = 255, - }, meths.get_hl(0, { name = 'Test_hl3' })) + }, meths.nvim_get_hl(0, { name = 'Test_hl3' })) end) it('nvim_get_hl by id', function() - local hl_id = meths.get_hl_id_by_name('NewHighlight') + local hl_id = meths.nvim_get_hl_id_by_name('NewHighlight') command( 'hi NewHighlight cterm=underline ctermbg=green guifg=red guibg=yellow guisp=blue gui=bold' @@ -562,14 +577,14 @@ describe('API: get highlight', function() bold = true, ctermbg = 10, cterm = { underline = true }, - }, meths.get_hl(0, { id = hl_id })) + }, meths.nvim_get_hl(0, { id = hl_id })) -- Test 0 argument - eq('Highlight id out of bounds', pcall_err(meths.get_hl, 0, { id = 0 })) + eq('Highlight id out of bounds', pcall_err(meths.nvim_get_hl, 0, { id = 0 })) eq( "Invalid 'id': expected Integer, got String", - pcall_err(meths.get_hl, 0, { id = 'Test_set_hl' }) + pcall_err(meths.nvim_get_hl, 0, { id = 'Test_set_hl' }) ) -- Test all highlight properties. @@ -587,7 +602,7 @@ describe('API: get highlight', function() underline = true, ctermbg = 10, cterm = { underline = true }, - }, meths.get_hl(0, { id = hl_id })) + }, meths.nvim_get_hl(0, { id = hl_id })) -- Test undercurl command('hi NewHighlight gui=undercurl') @@ -598,16 +613,16 @@ describe('API: get highlight', function() undercurl = true, ctermbg = 10, cterm = { underline = true }, - }, meths.get_hl(0, { id = hl_id })) + }, meths.nvim_get_hl(0, { id = hl_id })) end) it('can correctly detect links', function() command('hi String guifg=#a6e3a1 ctermfg=NONE') command('hi link @string string') command('hi link @string.cpp @string') - eq({ fg = 10937249 }, meths.get_hl(0, { name = 'String' })) - eq({ link = 'String' }, meths.get_hl(0, { name = '@string' })) - eq({ fg = 10937249 }, meths.get_hl(0, { name = '@string.cpp', link = false })) + eq({ fg = 10937249 }, meths.nvim_get_hl(0, { name = 'String' })) + eq({ link = 'String' }, meths.nvim_get_hl(0, { name = '@string' })) + eq({ fg = 10937249 }, meths.nvim_get_hl(0, { name = '@string.cpp', link = false })) end) it('can get all attributes for a linked group', function() @@ -616,55 +631,55 @@ describe('API: get highlight', function() command('hi! link Foo Bar') eq( { link = 'Bar', fg = tonumber('00ff00', 16), bold = true, underline = true }, - meths.get_hl(0, { name = 'Foo', link = true }) + meths.nvim_get_hl(0, { name = 'Foo', link = true }) ) end) it('can set link as well as other attributes', function() command('hi Bar guifg=red') local hl = { link = 'Bar', fg = tonumber('00ff00', 16), bold = true, cterm = { bold = true } } - meths.set_hl(0, 'Foo', hl) - eq(hl, meths.get_hl(0, { name = 'Foo', link = true })) + meths.nvim_set_hl(0, 'Foo', hl) + eq(hl, meths.nvim_get_hl(0, { name = 'Foo', link = true })) end) it("doesn't contain unset groups", function() - local id = meths.get_hl_id_by_name '@foobar.hubbabubba' + local id = meths.nvim_get_hl_id_by_name '@foobar.hubbabubba' ok(id > 0) - local data = meths.get_hl(0, {}) + local data = meths.nvim_get_hl(0, {}) eq(nil, data['@foobar.hubbabubba']) eq(nil, data['@foobar']) command 'hi @foobar.hubbabubba gui=bold' - data = meths.get_hl(0, {}) + data = meths.nvim_get_hl(0, {}) 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, {}) + data = meths.nvim_get_hl(0, {}) eq({}, data['@foobar.hubbabubba']) eq(nil, data['@foobar']) end) it('should return default flag', function() - meths.set_hl(0, 'Tried', { fg = '#00ff00', default = true }) - eq({ fg = tonumber('00ff00', 16), default = true }, meths.get_hl(0, { name = 'Tried' })) + meths.nvim_set_hl(0, 'Tried', { fg = '#00ff00', default = true }) + eq({ fg = tonumber('00ff00', 16), default = true }, meths.nvim_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, 'Bar', { default = true, fg = '#ffffff' }) - meths.set_hl(0, 'FooBar', { default = true, fg = '#ffffff', cterm = { bold = true } }) - meths.set_hl( + meths.nvim_set_hl(0, 'Foo', { default = true }) + meths.nvim_set_hl(0, 'Bar', { default = true, fg = '#ffffff' }) + meths.nvim_set_hl(0, 'FooBar', { default = true, fg = '#ffffff', cterm = { bold = true } }) + meths.nvim_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({ default = true }, meths.nvim_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')) @@ -673,27 +688,27 @@ describe('API: get highlight', function() 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.nvim_set_hl(0, 'Foo', { fg = white }) + meths.nvim_set_hl(0, 'Foo', { fg = green, force = true }) + eq({ fg = green }, meths.nvim_get_hl(0, { name = 'Foo' })) + meths.nvim_set_hl(0, 'Bar', { link = 'Comment', default = true }) + meths.nvim_set_hl(0, 'Bar', { link = 'Foo', default = true, force = true }) + eq({ link = 'Foo', default = true }, meths.nvim_get_hl(0, { name = 'Bar' })) end) end) describe('API: set/get highlight namespace', function() it('set/get highlight namespace', function() - eq(0, meths.get_hl_ns({})) - local ns = meths.create_namespace('') - meths.set_hl_ns(ns) - eq(ns, meths.get_hl_ns({})) + eq(0, meths.nvim_get_hl_ns({})) + local ns = meths.nvim_create_namespace('') + meths.nvim_set_hl_ns(ns) + eq(ns, meths.nvim_get_hl_ns({})) end) it('set/get window highlight namespace', function() - 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(-1, meths.nvim_get_hl_ns({ winid = 0 })) + local ns = meths.nvim_create_namespace('') + meths.nvim_win_set_hl_ns(0, ns) + eq(ns, meths.nvim_get_hl_ns({ winid = 0 })) end) end) diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index 789ad28544..f633c96a7c 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -57,7 +57,7 @@ describe('nvim_get_keymap', function() } it('returns empty list when no map', function() - eq({}, meths.get_keymap('n')) + eq({}, meths.nvim_get_keymap('n')) end) it('returns list of all applicable mappings', function() @@ -66,8 +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.nvim_get_keymap('n')) + eq({ funcs.maparg('foo', 'n', false, true) }, meths.nvim_get_keymap('n')) -- Add another mapping command('nnoremap foo_longer bar_longer') @@ -76,11 +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.nvim_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.nvim_get_keymap('n')) end) it('works for other modes', function() @@ -94,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.nvim_get_keymap('i')) end) it('considers scope', function() @@ -111,7 +111,7 @@ describe('nvim_get_keymap', function() command('nnoremap foo bar') -- The buffer mapping should not show up - eq({ foolong_bar_map_table }, meths.get_keymap('n')) + eq({ foolong_bar_map_table }, meths.nvim_get_keymap('n')) eq({ buffer_table }, curbufmeths.get_keymap('n')) end) @@ -123,7 +123,7 @@ describe('nvim_get_keymap', function() command('nnoremap foo bar') - eq({ foo_bar_map_table }, meths.get_keymap('n')) + eq({ foo_bar_map_table }, meths.nvim_get_keymap('n')) eq({ buffer_table }, curbufmeths.get_keymap('n')) end) @@ -143,15 +143,15 @@ 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.nvim_buf_get_keymap(final_buffer, 'n')) + eq({ buffer_table }, meths.nvim_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({}, meths.nvim_get_keymap('n')) eq({}, curbufmeths.get_keymap('n')) - eq({ buffer_table }, meths.buf_get_keymap(final_buffer, 'n')) + eq({ buffer_table }, meths.nvim_buf_get_keymap(final_buffer, 'n')) end) -- Test toggle switches for basic options @@ -191,7 +191,7 @@ describe('nvim_get_keymap', function() function() make_new_windows(new_windows) command(map .. ' ' .. option_token .. ' foo bar') - local result = meths.get_keymap(mode)[1][option] + local result = meths.nvim_get_keymap(mode)[1][option] eq(global_on_result, result) end ) @@ -228,7 +228,7 @@ describe('nvim_get_keymap', function() function() make_new_windows(new_windows) command(map .. ' baz bat') - local result = meths.get_keymap(mode)[1][option] + local result = meths.nvim_get_keymap(mode)[1][option] eq(global_off_result, result) end ) @@ -277,9 +277,9 @@ describe('nvim_get_keymap', function() nnoremap fizz :call maparg_test_function() ]]) - local sid_result = meths.get_keymap('n')[1]['sid'] + local sid_result = meths.nvim_get_keymap('n')[1]['sid'] eq(1, sid_result) - eq('testing', meths.call_function('' .. sid_result .. '_maparg_test_function', {})) + eq('testing', meths.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) end) it('returns script numbers for buffer maps', function() @@ -292,13 +292,13 @@ describe('nvim_get_keymap', function() ]]) local sid_result = curbufmeths.get_keymap('n')[1]['sid'] eq(1, sid_result) - eq('testing', meths.call_function('' .. sid_result .. '_maparg_test_function', {})) + eq('testing', meths.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) end) it('works with and others', function() command('nnoremap :let g:maparg_test_var = 1') - eq('', meths.get_keymap('n')[1]['lhs']) - eq(':let g:maparg_test_var = 1', meths.get_keymap('n')[1]['rhs']) + eq('', meths.nvim_get_keymap('n')[1]['lhs']) + eq(':let g:maparg_test_var = 1', meths.nvim_get_keymap('n')[1]['rhs']) end) it('works correctly despite various &cpo settings', function() @@ -341,7 +341,7 @@ describe('nvim_get_keymap', function() -- wrapper around get_keymap() that drops "lhsraw" and "lhsrawalt" which are hard to check local function get_keymap_noraw(...) - local ret = meths.get_keymap(...) + local ret = meths.nvim_get_keymap(...) for _, item in ipairs(ret) do item.lhsraw = nil item.lhsrawalt = nil @@ -392,7 +392,7 @@ describe('nvim_get_keymap', function() lnum = 0, } command('nnoremap \\| \\| ') - eq({ space_table }, meths.get_keymap('n')) + eq({ space_table }, meths.nvim_get_keymap('n')) end) it('can handle lua mappings', function() @@ -421,7 +421,7 @@ describe('nvim_get_keymap', function() ]]) eq(3, exec_lua([[return GlobalCount]])) - local mapargs = meths.get_keymap('n') + local mapargs = meths.nvim_get_keymap('n') mapargs[1].callback = nil eq({ lhs = 'asdf', @@ -442,7 +442,7 @@ describe('nvim_get_keymap', function() end) it('can handle map descriptions', function() - meths.set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) + meths.nvim_set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) eq({ lhs = 'lhs', lhsraw = 'lhs', @@ -460,7 +460,7 @@ describe('nvim_get_keymap', function() noremap = 0, lnum = 0, desc = 'map description', - }, meths.get_keymap('n')[1]) + }, meths.nvim_get_keymap('n')[1]) end) end) @@ -522,9 +522,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('error on empty LHS', function() -- escape parentheses in lua string, else comparison fails erroneously - eq('Invalid (empty) LHS', pcall_err(meths.set_keymap, '', '', 'rhs', {})) - eq('Invalid (empty) LHS', pcall_err(meths.set_keymap, '', '', '', {})) - eq('Invalid (empty) LHS', pcall_err(meths.del_keymap, '', '')) + eq('Invalid (empty) LHS', pcall_err(meths.nvim_set_keymap, '', '', 'rhs', {})) + eq('Invalid (empty) LHS', pcall_err(meths.nvim_set_keymap, '', '', '', {})) + eq('Invalid (empty) LHS', pcall_err(meths.nvim_del_keymap, '', '')) end) it('error if LHS longer than MAXMAPLEN', function() @@ -536,16 +536,19 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end -- exactly 50 chars should be fine - meths.set_keymap('', lhs, 'rhs', {}) + meths.nvim_set_keymap('', lhs, 'rhs', {}) -- del_keymap should unmap successfully - meths.del_keymap('', lhs) + meths.nvim_del_keymap('', lhs) 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)) + eq( + 'LHS exceeds maximum map length: ' .. lhs, + pcall_err(meths.nvim_set_keymap, '', lhs, 'rhs', {}) + ) + eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(meths.nvim_del_keymap, '', lhs)) end) it('does not throw errors when rhs is longer than MAXMAPLEN', function() @@ -555,56 +558,65 @@ describe('nvim_set_keymap, nvim_del_keymap', function() rhs = rhs .. (i % 10) end rhs = rhs .. '1' - meths.set_keymap('', 'lhs', rhs, {}) + meths.nvim_set_keymap('', 'lhs', rhs, {}) eq(generate_mapargs('', 'lhs', rhs), get_mapargs('', 'lhs')) end) it('error on invalid mode shortname', function() - eq('Invalid mode shortname: " "', pcall_err(meths.set_keymap, ' ', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "m"', pcall_err(meths.set_keymap, 'm', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "?"', pcall_err(meths.set_keymap, '?', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "y"', pcall_err(meths.set_keymap, 'y', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "p"', pcall_err(meths.set_keymap, 'p', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "a"', pcall_err(meths.set_keymap, 'a', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "oa"', pcall_err(meths.set_keymap, 'oa', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "!o"', pcall_err(meths.set_keymap, '!o', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "!i"', pcall_err(meths.set_keymap, '!i', 'lhs', 'rhs', {})) - 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: " "', pcall_err(meths.nvim_set_keymap, ' ', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "m"', pcall_err(meths.nvim_set_keymap, 'm', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "?"', pcall_err(meths.nvim_set_keymap, '?', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "y"', pcall_err(meths.nvim_set_keymap, 'y', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "p"', pcall_err(meths.nvim_set_keymap, 'p', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "a"', pcall_err(meths.nvim_set_keymap, 'a', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "oa"', pcall_err(meths.nvim_set_keymap, 'oa', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "!o"', pcall_err(meths.nvim_set_keymap, '!o', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "!i"', pcall_err(meths.nvim_set_keymap, '!i', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "!!"', pcall_err(meths.nvim_set_keymap, '!!', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "map"', pcall_err(meths.nvim_set_keymap, 'map', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "vmap"', pcall_err(meths.nvim_set_keymap, 'vmap', 'lhs', 'rhs', {})) eq( 'Invalid mode shortname: "xnoremap"', - pcall_err(meths.set_keymap, 'xnoremap', 'lhs', 'rhs', {}) + pcall_err(meths.nvim_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')) - eq('Invalid mode shortname: "y"', pcall_err(meths.del_keymap, 'y', 'lhs')) - eq('Invalid mode shortname: "p"', pcall_err(meths.del_keymap, 'p', 'lhs')) - eq('Invalid mode shortname: "a"', pcall_err(meths.del_keymap, 'a', 'lhs')) - eq('Invalid mode shortname: "oa"', pcall_err(meths.del_keymap, 'oa', 'lhs')) - eq('Invalid mode shortname: "!o"', pcall_err(meths.del_keymap, '!o', 'lhs')) - eq('Invalid mode shortname: "!i"', pcall_err(meths.del_keymap, '!i', 'lhs')) - eq('Invalid mode shortname: "!!"', pcall_err(meths.del_keymap, '!!', 'lhs')) - eq('Invalid mode shortname: "map"', pcall_err(meths.del_keymap, 'map', 'lhs')) - eq('Invalid mode shortname: "vmap"', pcall_err(meths.del_keymap, 'vmap', 'lhs')) - eq('Invalid mode shortname: "xnoremap"', pcall_err(meths.del_keymap, 'xnoremap', 'lhs')) + eq('Invalid mode shortname: " "', pcall_err(meths.nvim_del_keymap, ' ', 'lhs')) + eq('Invalid mode shortname: "m"', pcall_err(meths.nvim_del_keymap, 'm', 'lhs')) + eq('Invalid mode shortname: "?"', pcall_err(meths.nvim_del_keymap, '?', 'lhs')) + eq('Invalid mode shortname: "y"', pcall_err(meths.nvim_del_keymap, 'y', 'lhs')) + eq('Invalid mode shortname: "p"', pcall_err(meths.nvim_del_keymap, 'p', 'lhs')) + eq('Invalid mode shortname: "a"', pcall_err(meths.nvim_del_keymap, 'a', 'lhs')) + eq('Invalid mode shortname: "oa"', pcall_err(meths.nvim_del_keymap, 'oa', 'lhs')) + eq('Invalid mode shortname: "!o"', pcall_err(meths.nvim_del_keymap, '!o', 'lhs')) + eq('Invalid mode shortname: "!i"', pcall_err(meths.nvim_del_keymap, '!i', 'lhs')) + eq('Invalid mode shortname: "!!"', pcall_err(meths.nvim_del_keymap, '!!', 'lhs')) + eq('Invalid mode shortname: "map"', pcall_err(meths.nvim_del_keymap, 'map', 'lhs')) + eq('Invalid mode shortname: "vmap"', pcall_err(meths.nvim_del_keymap, 'vmap', 'lhs')) + eq('Invalid mode shortname: "xnoremap"', pcall_err(meths.nvim_del_keymap, 'xnoremap', 'lhs')) 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.nvim_set_keymap, 'n', 'lhs', 'rhs', { silentt = true }) + ) + eq("Invalid key: 'sidd'", pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { sidd = false })) + eq( + "Invalid key: 'nowaiT'", + pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { nowaiT = false }) + ) end) it('error on option key', function() - eq("Invalid key: 'buffer'", pcall_err(meths.set_keymap, 'n', 'lhs', 'rhs', { buffer = true })) + eq( + "Invalid key: 'buffer'", + pcall_err(meths.nvim_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 }) + pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { replace_keycodes = true }) ) end) @@ -614,45 +626,45 @@ describe('nvim_set_keymap, nvim_del_keymap', 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.nvim_set_keymap, 'n', 'lhs', 'rhs', opts)) end) end -- Perform tests of basic functionality it('sets ordinary mappings', function() - meths.set_keymap('n', 'lhs', 'rhs', {}) + meths.nvim_set_keymap('n', 'lhs', 'rhs', {}) eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', 'lhs')) - meths.set_keymap('v', 'lhs', 'rhs', {}) + meths.nvim_set_keymap('v', 'lhs', 'rhs', {}) eq(generate_mapargs('v', 'lhs', 'rhs'), get_mapargs('v', 'lhs')) end) it('does not throw when LHS or RHS have leading/trailing whitespace', function() - meths.set_keymap('n', ' lhs', 'rhs', {}) + meths.nvim_set_keymap('n', ' lhs', 'rhs', {}) eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', ' lhs')) - meths.set_keymap('n', 'lhs ', 'rhs', {}) + meths.nvim_set_keymap('n', 'lhs ', 'rhs', {}) eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', 'lhs ')) - meths.set_keymap('v', ' lhs ', '\trhs\t\f', {}) + meths.nvim_set_keymap('v', ' lhs ', '\trhs\t\f', {}) eq(generate_mapargs('v', 'lhs', '\trhs\t\f'), get_mapargs('v', ' lhs ')) end) it('can set noremap mappings', function() - meths.set_keymap('x', 'lhs', 'rhs', { noremap = true }) + meths.nvim_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 }) + meths.nvim_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() - meths.set_keymap('v', 'lhs', 'rhs', {}) - meths.del_keymap('v', 'lhs') + meths.nvim_set_keymap('v', 'lhs', 'rhs', {}) + meths.nvim_del_keymap('v', 'lhs') eq({}, get_mapargs('v', 'lhs')) - meths.set_keymap('t', 'lhs', 'rhs', { noremap = true }) - meths.del_keymap('t', 'lhs') + meths.nvim_set_keymap('t', 'lhs', 'rhs', { noremap = true }) + meths.nvim_del_keymap('t', 'lhs') eq({}, get_mapargs('t', 'lhs')) end) @@ -660,8 +672,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('"!" and empty string are synonyms for mapmode-nvo', function() local nvo_shortnames = { '', '!' } for _, name in ipairs(nvo_shortnames) do - meths.set_keymap(name, 'lhs', 'rhs', {}) - meths.del_keymap(name, 'lhs') + meths.nvim_set_keymap(name, 'lhs', 'rhs', {}) + meths.nvim_del_keymap(name, 'lhs') eq({}, get_mapargs(name, 'lhs')) end end) @@ -671,46 +683,46 @@ describe('nvim_set_keymap, nvim_del_keymap', function() for _, rhs in ipairs(special_chars) do local mapmode = '!' it('can set mappings with special characters, lhs: ' .. lhs .. ', rhs: ' .. rhs, function() - meths.set_keymap(mapmode, lhs, rhs, {}) + meths.nvim_set_keymap(mapmode, lhs, rhs, {}) eq(generate_mapargs(mapmode, lhs, rhs), get_mapargs(mapmode, lhs)) end) end end it('can set mappings containing literal keycodes', function() - meths.set_keymap('n', '\n\r\n', 'rhs', {}) + meths.nvim_set_keymap('n', '\n\r\n', 'rhs', {}) local expected = generate_mapargs('n', '', 'rhs') eq(expected, get_mapargs('n', '')) end) it('can set mappings whose RHS is a ', function() - meths.set_keymap('i', 'lhs', '', {}) + meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') eq({ '' }, curbufmeths.get_lines(0, -1, 0)) -- imap to does nothing eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- also test for case insensitivity - meths.set_keymap('i', 'lhs', '', {}) + meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') 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', '', {}), get_mapargs('i', 'lhs')) - meths.set_keymap('i', 'lhs', '', {}) + meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') eq({ '' }, curbufmeths.get_lines(0, -1, 0)) eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- a single ^V in RHS is also (see :h map-empty-rhs) - meths.set_keymap('i', 'lhs', '\022', {}) + meths.nvim_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')) end) it('treats an empty RHS in a mapping like a ', function() - meths.set_keymap('i', 'lhs', '', {}) + meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') eq({ '' }, curbufmeths.get_lines(0, -1, 0)) eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) @@ -720,8 +732,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- Taken from the legacy test: test_mapping.vim. Exposes a bug in which -- replace_termcodes changes the length of the mapping's LHS, but -- do_map continues to use the *old* length of LHS. - meths.set_keymap('i', '', 'foo', {}) - meths.del_keymap('i', '') + meths.nvim_set_keymap('i', '', 'foo', {}) + meths.nvim_del_keymap('i', '') eq({}, get_mapargs('i', '')) end) @@ -736,13 +748,13 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ) it('throws appropriate error messages when setting maps', function() - meths.set_keymap('l', 'lhs', 'rhs', {}) + meths.nvim_set_keymap('l', 'lhs', 'rhs', {}) eq( 'E227: mapping already exists for lhs', - pcall_err(meths.set_keymap, 'l', 'lhs', 'rhs', { unique = true }) + pcall_err(meths.nvim_set_keymap, 'l', 'lhs', 'rhs', { unique = true }) ) -- different mapmode, no error should be thrown - meths.set_keymap('t', 'lhs', 'rhs', { unique = true }) + meths.nvim_set_keymap('t', 'lhs', 'rhs', { unique = true }) end) it('can set mappings whose RHS change dynamically', function() @@ -753,12 +765,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() return g:flip endfunction ]]) - eq(1, meths.call_function('FlipFlop', {})) - eq(0, meths.call_function('FlipFlop', {})) - eq(1, meths.call_function('FlipFlop', {})) - eq(0, meths.call_function('FlipFlop', {})) + eq(1, meths.nvim_call_function('FlipFlop', {})) + eq(0, meths.nvim_call_function('FlipFlop', {})) + eq(1, meths.nvim_call_function('FlipFlop', {})) + eq(0, meths.nvim_call_function('FlipFlop', {})) - meths.set_keymap('i', 'lhs', 'FlipFlop()', { expr = true }) + meths.nvim_set_keymap('i', 'lhs', 'FlipFlop()', { expr = true }) command('normal ilhs') eq({ '1' }, curbufmeths.get_lines(0, -1, 0)) @@ -769,8 +781,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end) it('can set mappings that do trigger other mappings', function() - meths.set_keymap('i', 'mhs', 'rhs', {}) - meths.set_keymap('i', 'lhs', 'mhs', {}) + meths.nvim_set_keymap('i', 'mhs', 'rhs', {}) + meths.nvim_set_keymap('i', 'lhs', 'mhs', {}) command('normal imhs') eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) @@ -782,8 +794,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() 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.nvim_set_keymap('i', 'mhs', 'rhs', {}) + meths.nvim_set_keymap('i', 'lhs', 'mhs', { noremap = true }) command('normal imhs') eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) @@ -795,8 +807,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() 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 }) + meths.nvim_set_keymap('i', '123456', 'longer', {}) + meths.nvim_set_keymap('i', '123', 'shorter', { nowait = true }) -- feed keys one at a time; if all keys arrive atomically, the longer -- mapping will trigger @@ -812,22 +824,22 @@ describe('nvim_set_keymap, nvim_del_keymap', function() 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() - meths.set_keymap(mapmode, 'lhs', 'rhs', {}) + meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', {}) 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 - meths.del_keymap(mapmode, 'lhs') + meths.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) 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 }) + meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', { noremap = true }) eq(generate_mapargs(mapmode, 'lhs', 'rhs', { noremap = true }), get_mapargs(mapmode, 'lhs')) - meths.del_keymap(mapmode, 'lhs') + meths.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) end @@ -839,12 +851,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- 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 }) + meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = true }) eq( generate_mapargs(mapmode, 'lhs', 'rhs', { [maparg] = true }), get_mapargs(mapmode, 'lhs') ) - meths.del_keymap(mapmode, 'lhs') + meths.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) it( @@ -854,9 +866,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() .. maparg .. ', whose value is false', function() - meths.set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = false }) + meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = false }) eq(generate_mapargs(mapmode, 'lhs', 'rhs'), get_mapargs(mapmode, 'lhs')) - meths.del_keymap(mapmode, 'lhs') + meths.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end ) @@ -876,9 +888,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() .. opt3, function() local opts = { [opt1] = true, [opt2] = false, [opt3] = true } - meths.set_keymap(mapmode, 'lhs', 'rhs', opts) + meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', opts) eq(generate_mapargs(mapmode, 'lhs', 'rhs', opts), get_mapargs(mapmode, 'lhs')) - meths.del_keymap(mapmode, 'lhs') + meths.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end ) @@ -958,7 +970,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('aa') - eq({ 'πfoo<' }, meths.buf_get_lines(0, 0, -1, false)) + eq({ 'πfoo<' }, meths.nvim_buf_get_lines(0, 0, -1, false)) end) it('can make lua expr mappings without replacing keycodes', function() @@ -968,7 +980,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('iaa') - eq({ '' }, meths.buf_get_lines(0, 0, -1, false)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false)) end) it('lua expr mapping returning nil is equivalent to returning an empty string', function() @@ -978,7 +990,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('iaa') - eq({ '' }, meths.buf_get_lines(0, 0, -1, false)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false)) end) it('does not reset pum in lua mapping', function() @@ -1081,7 +1093,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end) it('can set descriptions on mappings', function() - meths.set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) + meths.nvim_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) @@ -1096,10 +1108,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] feed 'iThe foo and the bar and the foo again' - eq('The 1 and the bar and the 2 again', meths.get_current_line()) + eq('The 1 and the bar and the 2 again', meths.nvim_get_current_line()) feed ':let x = "The foo is the one"' - eq('The 3 is the one', meths.eval 'x') + eq('The 3 is the one', meths.nvim_eval 'x') end) it('can define insert mode abbreviations with lua callbacks', function() @@ -1112,10 +1124,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] feed 'iThe foo and the bar and the foo again' - eq('The 1 and the bar and the 2 again', meths.get_current_line()) + eq('The 1 and the bar and the 2 again', meths.nvim_get_current_line()) feed ':let x = "The foo is the one"' - eq('The foo is the one', meths.eval 'x') + eq('The foo is the one', meths.nvim_eval 'x') end) it('can define cmdline mode abbreviations with lua callbacks', function() @@ -1128,10 +1140,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] feed 'iThe foo and the bar and the foo again' - eq('The foo and the bar and the foo again', meths.get_current_line()) + eq('The foo and the bar and the foo again', meths.nvim_get_current_line()) feed ':let x = "The foo is the one"' - eq('The 1 is the one', meths.eval 'x') + eq('The 1 is the one', meths.nvim_eval 'x') end) end) @@ -1154,9 +1166,9 @@ 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.nvim_call_function('bufnr', { '%' }) command('new') - local second_buf = meths.call_function('bufnr', { '%' }) + local second_buf = meths.nvim_call_function('bufnr', { '%' }) neq(second_buf, first_buf) -- sanity check if start_from_first then @@ -1254,7 +1266,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('aa') - eq({ 'πfoo<' }, meths.buf_get_lines(0, 0, -1, false)) + eq({ 'πfoo<' }, meths.nvim_buf_get_lines(0, 0, -1, false)) end) it('can make lua expr mappings without replacing keycodes', function() @@ -1264,7 +1276,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('iaa') - eq({ '' }, meths.buf_get_lines(0, 0, -1, false)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false)) end) it('can overwrite lua mappings', function() diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua index d75bfd5324..3fc7b9986a 100644 --- a/test/functional/api/server_notifications_spec.lua +++ b/test/functional/api/server_notifications_spec.lua @@ -47,9 +47,11 @@ describe('notify', function() end) it('does not crash for deeply nested variable', function() - meths.set_var('l', {}) + meths.nvim_set_var('l', {}) local nest_level = 1000 - meths.command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1)) + meths.nvim_command( + ('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1) + ) eval('rpcnotify(' .. channel .. ', "event", g:l)') local msg = next_msg() eq('notification', msg[1]) @@ -106,7 +108,7 @@ describe('notify', function() exec_lua([[ return {pcall(vim.rpcrequest, ..., 'nvim_eval', '1+1')}]], catchan) ) retry(nil, 3000, function() - eq({}, meths.get_chan_info(catchan)) + eq({}, meths.nvim_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 421e0b5c9a..6878ac0218 100644 --- a/test/functional/api/server_requests_spec.lua +++ b/test/functional/api/server_requests_spec.lua @@ -244,7 +244,7 @@ describe('server -> client', function() \ 'rpc': v:true \ } ]]) - meths.set_var('args', { + meths.nvim_set_var('args', { nvim_prog, '-ll', 'test/functional/api/rpc_fixture.lua', @@ -296,7 +296,7 @@ describe('server -> client', function() set_session(server) eq(serverpid, funcs.getpid()) - eq('hello', meths.get_current_line()) + eq('hello', meths.nvim_get_current_line()) -- method calls work both ways funcs.rpcrequest(client_id, 'nvim_set_current_line', 'howdy!') @@ -304,7 +304,7 @@ describe('server -> client', function() set_session(client) eq(clientpid, funcs.getpid()) - eq('howdy!', meths.get_current_line()) + eq('howdy!', meths.nvim_get_current_line()) server:close() client:close() @@ -375,7 +375,7 @@ describe('server -> client', function() local id = funcs.sockconnect('pipe', address, { rpc = true }) funcs.rpcrequest(id, 'nvim_set_current_line', 'hello') - eq('hello', meths.get_current_line()) + eq('hello', meths.nvim_get_current_line()) eq(serverpid, funcs.rpcrequest(id, 'nvim_eval', 'getpid()')) eq(id, funcs.rpcrequest(id, 'nvim_get_api_info')[1]) diff --git a/test/functional/api/ui_spec.lua b/test/functional/api/ui_spec.lua index dafbbe550f..e74a35e97e 100644 --- a/test/functional/api/ui_spec.lua +++ b/test/functional/api/ui_spec.lua @@ -23,39 +23,39 @@ 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.nvim_ui_attach, 80, 24, { foo = { 'foo' } })) eq( "Invalid 'ext_linegrid': expected Boolean, got Array", - pcall_err(meths.ui_attach, 80, 24, { ext_linegrid = {} }) + pcall_err(meths.nvim_ui_attach, 80, 24, { ext_linegrid = {} }) ) eq( "Invalid 'override': expected Boolean, got Array", - pcall_err(meths.ui_attach, 80, 24, { override = {} }) + pcall_err(meths.nvim_ui_attach, 80, 24, { override = {} }) ) eq( "Invalid 'rgb': expected Boolean, got Array", - pcall_err(meths.ui_attach, 80, 24, { rgb = {} }) + pcall_err(meths.nvim_ui_attach, 80, 24, { rgb = {} }) ) eq( "Invalid 'term_name': expected String, got Boolean", - pcall_err(meths.ui_attach, 80, 24, { term_name = true }) + pcall_err(meths.nvim_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 }) + pcall_err(meths.nvim_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' }) + pcall_err(meths.nvim_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' }) + pcall_err(meths.nvim_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' }) + pcall_err(meths.nvim_ui_attach, 80, 24, { stdout_tty = 'foo' }) ) eq('UI not attached to channel: 1', pcall_err(request, 'nvim_ui_try_resize', 40, 10)) @@ -117,17 +117,17 @@ it('autocmds VimSuspend/VimResume #22041', function() end) eq({ 's', 'r', 's' }, eval('g:ev')) screen.suspended = false - meths.input_mouse('move', '', '', 0, 0, 0) + meths.nvim_input_mouse('move', '', '', 0, 0, 0) eq({ 's', 'r', 's', 'r' }, eval('g:ev')) feed('') screen:expect(function() eq(true, screen.suspended) end) - meths.ui_set_focus(false) + meths.nvim_ui_set_focus(false) eq({ 's', 'r', 's', 'r', 's' }, eval('g:ev')) screen.suspended = false - meths.ui_set_focus(true) + meths.nvim_ui_set_focus(true) eq({ 's', 'r', 's', 'r', 's', 'r' }, eval('g:ev')) command('suspend | suspend | suspend') diff --git a/test/functional/api/version_spec.lua b/test/functional/api/version_spec.lua index 41f8fccab9..fefafb8f98 100644 --- a/test/functional/api/version_spec.lua +++ b/test/functional/api/version_spec.lua @@ -94,7 +94,7 @@ describe('api metadata', function() local old_api = {} setup(function() clear() -- Ensure a session before requesting api_info. - api = meths.get_api_info()[2] + api = meths.nvim_get_api_info()[2] compat = api.version.api_compatible api_level = api.version.api_level if api.version.api_prerelease then diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 13b80f4486..3fd1cdab1e 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -70,7 +70,7 @@ describe('API', function() end) it('handles errors in async requests', function() - local error_types = meths.get_api_info()[2].error_types + local error_types = meths.nvim_get_api_info()[2].error_types nvim_async('bogus') eq({ 'notification', @@ -82,7 +82,7 @@ describe('API', function() end) it('failed async request emits nvim_error_event', function() - local error_types = meths.get_api_info()[2].error_types + local error_types = meths.nvim_get_api_info()[2].error_types nvim_async('command', 'bogus') eq({ 'notification', @@ -326,7 +326,7 @@ describe('API', function() write_file(fname, 'echo "hello"\n') local sourcing_fname = tmpname() write_file(sourcing_fname, 'call nvim_exec2("source ' .. fname .. '", {"output": v:false})\n') - meths.exec2('set verbose=2', { output = false }) + meths.nvim_exec2('set verbose=2', { output = false }) local traceback_output = dedent([[ line 0: sourcing "%s" line 0: sourcing "%s" @@ -343,7 +343,7 @@ describe('API', function() ) eq( { output = traceback_output }, - meths.exec2( + meths.nvim_exec2( 'call nvim_exec2("source ' .. sourcing_fname .. '", {"output": v:false})', { output = true } ) @@ -367,7 +367,7 @@ describe('API', function() screen:set_default_attr_ids({ [0] = { bold = true, foreground = Screen.colors.Blue }, }) - meths.exec2("echo 'hello'", { output = false }) + meths.nvim_exec2("echo 'hello'", { output = false }) screen:expect { grid = [[ ^ | @@ -383,7 +383,7 @@ describe('API', function() screen:set_default_attr_ids({ [0] = { bold = true, foreground = Screen.colors.Blue }, }) - meths.exec2("echo 'hello'", { output = true }) + meths.nvim_exec2("echo 'hello'", { output = true }) screen:expect { grid = [[ ^ | @@ -694,12 +694,12 @@ describe('API', function() end) it('works', function() - meths.set_current_dir('Xtestdir') + meths.nvim_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.nvim_set_current_dir('Xtestdir') command('cd -') eq(funcs.getcwd(), start_dir) end) @@ -707,48 +707,51 @@ describe('API', function() describe('nvim_exec_lua', function() it('works', function() - meths.exec_lua('vim.api.nvim_set_var("test", 3)', {}) - eq(3, meths.get_var('test')) + meths.nvim_exec_lua('vim.api.nvim_set_var("test", 3)', {}) + eq(3, meths.nvim_get_var('test')) - eq(17, meths.exec_lua('a, b = ...\nreturn a + b', { 10, 7 })) + eq(17, meths.nvim_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.nvim_exec_lua('function xx(a,b)\nreturn a..b\nend', {})) + eq('xy', meths.nvim_exec_lua('return xx(...)', { 'x', 'y' })) -- Deprecated name: nvim_execute_lua. - eq('xy', meths.execute_lua('return xx(...)', { 'x', 'y' })) + eq('xy', meths.nvim_execute_lua('return xx(...)', { 'x', 'y' })) end) it('reports errors', function() eq( [[Error loading lua: [string ""]:0: '=' expected near '+']], - pcall_err(meths.exec_lua, 'a+*b', {}) + pcall_err(meths.nvim_exec_lua, 'a+*b', {}) ) eq( [[Error loading lua: [string ""]:0: unexpected symbol near '1']], - pcall_err(meths.exec_lua, '1+2', {}) + pcall_err(meths.nvim_exec_lua, '1+2', {}) ) eq( [[Error loading lua: [string ""]:0: unexpected symbol]], - pcall_err(meths.exec_lua, 'aa=bb\0', {}) + pcall_err(meths.nvim_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.nvim_exec_lua, 'bork()', {}) + ) - eq('did\nthe\nfail', pcall_err(meths.exec_lua, 'error("did\\nthe\\nfail")', {})) + eq('did\nthe\nfail', pcall_err(meths.nvim_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.nvim_exec_lua('return select(1, ...)', { 2.5 })) + eq('2.5', meths.nvim_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(2.5, meths.nvim_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'))", {}) + meths.nvim_exec_lua("return vim.inspect(vim.api.nvim_eval('2.5'))", {}) ) end) end) @@ -760,7 +763,7 @@ describe('API', function() it('can be overridden', function() command('lua vim.notify = function(...) return 42 end') - eq(42, meths.exec_lua("return vim.notify('Hello world')", {})) + eq(42, meths.nvim_exec_lua("return vim.notify('Hello world')", {})) nvim('notify', 'hello world', 4, {}) end) end) @@ -1368,7 +1371,7 @@ describe('API', function() 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.nvim_put({ 'line 1', 'line 2', 'line 3' }, 'l', false, false) expect([[ line 1 line 2 @@ -1376,21 +1379,21 @@ describe('API', function() ]]) -- larger width create spaces - meths.put({ 'a', 'bc' }, 'b3', false, false) + meths.nvim_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.nvim_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.nvim_put, { 'xxx', 'yyy' }, 'bx', false, true)) + eq("Invalid 'type': 'b3x'", pcall_err(meths.nvim_put, { 'xxx', 'yyy' }, 'b3x', false, true)) end) end) @@ -1417,8 +1420,8 @@ describe('API', function() describe('set/get/del variables', function() it('validation', function() - eq('Key not found: bogus', pcall_err(meths.get_var, 'bogus')) - eq('Key not found: bogus', pcall_err(meths.del_var, 'bogus')) + eq('Key not found: bogus', pcall_err(meths.nvim_get_var, 'bogus')) + eq('Key not found: bogus', pcall_err(meths.nvim_del_var, 'bogus')) end) it('nvim_get_var, nvim_set_var, nvim_del_var', function() @@ -1426,10 +1429,10 @@ describe('API', function() 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') + meths.nvim_del_var('lua') eq(0, funcs.exists('g:lua')) - eq('Key not found: lua', pcall_err(meths.del_var, 'lua')) - meths.set_var('lua', 1) + eq('Key not found: lua', pcall_err(meths.nvim_del_var, 'lua')) + meths.nvim_set_var('lua', 1) -- Empty keys are allowed in Vim dicts (and msgpack). nvim('set_var', 'dict_empty_key', { [''] = 'empty key' }) @@ -1437,8 +1440,8 @@ describe('API', function() -- Set locked g: var. command('lockvar lua') - eq('Key is locked: lua', pcall_err(meths.del_var, 'lua')) - eq('Key is locked: lua', pcall_err(meths.set_var, 'lua', 1)) + eq('Key is locked: lua', pcall_err(meths.nvim_del_var, 'lua')) + eq('Key is locked: lua', pcall_err(meths.nvim_set_var, 'lua', 1)) exec([[ function Test() @@ -1448,8 +1451,8 @@ describe('API', function() let g:Unknown_func = function('Test') let g:Unknown_script_func = function('s:Test') ]]) - eq(NIL, meths.get_var('Unknown_func')) - eq(NIL, meths.get_var('Unknown_script_func')) + eq(NIL, meths.nvim_get_var('Unknown_func')) + eq(NIL, meths.nvim_get_var('Unknown_script_func')) -- Check if autoload works properly local pathsep = helpers.get_pathsep() @@ -1461,37 +1464,40 @@ describe('API', function() write_file(autoload_file, [[let testload#value = 2]]) clear { args_rm = { '-u' }, env = { XDG_CONFIG_HOME = xconfig, XDG_DATA_HOME = xdata } } - eq(2, meths.get_var('testload#value')) + eq(2, meths.nvim_get_var('testload#value')) rmdir('Xhome') end) it('nvim_get_vvar, nvim_set_vvar', function() eq('Key is read-only: count', pcall_err(request, 'nvim_set_vvar', 'count', 42)) eq('Dictionary is locked', pcall_err(request, 'nvim_set_vvar', 'nosuchvar', 42)) - meths.set_vvar('errmsg', 'set by API') - eq('set by API', meths.get_vvar('errmsg')) - meths.set_vvar('errmsg', 42) + meths.nvim_set_vvar('errmsg', 'set by API') + eq('set by API', meths.nvim_get_vvar('errmsg')) + meths.nvim_set_vvar('errmsg', 42) eq('42', eval('v:errmsg')) - meths.set_vvar('oldfiles', { 'one', 'two' }) + meths.nvim_set_vvar('oldfiles', { 'one', 'two' }) eq({ 'one', 'two' }, eval('v:oldfiles')) - meths.set_vvar('oldfiles', {}) + meths.nvim_set_vvar('oldfiles', {}) eq({}, eval('v:oldfiles')) - eq('Setting v:oldfiles to value with wrong type', pcall_err(meths.set_vvar, 'oldfiles', 'a')) + eq( + 'Setting v:oldfiles to value with wrong type', + pcall_err(meths.nvim_set_vvar, 'oldfiles', 'a') + ) eq({}, eval('v:oldfiles')) feed('i foo foo foo0/foo') - eq({ 1, 1 }, meths.win_get_cursor(0)) + eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) eq(1, eval('v:searchforward')) feed('n') - eq({ 1, 5 }, meths.win_get_cursor(0)) - meths.set_vvar('searchforward', 0) + eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) + meths.nvim_set_vvar('searchforward', 0) eq(0, eval('v:searchforward')) feed('n') - eq({ 1, 1 }, meths.win_get_cursor(0)) - meths.set_vvar('searchforward', 1) + eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) + meths.nvim_set_vvar('searchforward', 1) eq(1, eval('v:searchforward')) feed('n') - eq({ 1, 5 }, meths.win_get_cursor(0)) + eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) local screen = Screen.new(60, 3) screen:set_default_attr_ids({ @@ -1507,7 +1513,7 @@ describe('API', function() | ]], } - meths.set_vvar('hlsearch', 0) + meths.nvim_set_vvar('hlsearch', 0) eq(0, eval('v:hlsearch')) screen:expect { grid = [[ @@ -1516,7 +1522,7 @@ describe('API', function() | ]], } - meths.set_vvar('hlsearch', 1) + meths.nvim_set_vvar('hlsearch', 1) eq(1, eval('v:hlsearch')) screen:expect { grid = [[ @@ -1900,7 +1906,7 @@ describe('API', function() 1, }, NIL, - }, meths.call_atomic(req)) + }, meths.nvim_call_atomic(req)) eq({ mode = 'r', blocking = true }, nvim('get_mode')) end) it('during insert-mode map-pending, returns blocking=true #6166', function() @@ -2004,24 +2010,24 @@ describe('API', function() it('does not interrupt Insert mode i_CTRL-O #10035', function() feed('iHello World') - eq({ mode = 'niI', blocking = false }, meths.get_mode()) -- fast event + eq({ mode = 'niI', blocking = false }, meths.nvim_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.nvim_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.nvim_get_mode()) -- left ctrl-o mode expect('') -- executed the command end) it('does not interrupt Select mode v_CTRL-O #15688', function() feed('iHello Worldgh') - eq({ mode = 'vs', blocking = false }, meths.get_mode()) -- fast event - eq({ mode = 'vs', blocking = false }, meths.get_mode()) -- again #15288 + eq({ mode = 'vs', blocking = false }, meths.nvim_get_mode()) -- fast event + eq({ mode = 'vs', blocking = false }, meths.nvim_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.nvim_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.nvim_get_mode()) -- left ctrl-o mode feed('h') - eq({ mode = 'i', blocking = false }, meths.get_mode()) -- entered insert mode + eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) -- entered insert mode expect('h') -- selection is the whole line and is replaced end) @@ -2176,13 +2182,13 @@ describe('API', function() -- then `return str` in vim_replace_termcodes body will make Neovim free -- `str.data` twice: once when freeing arguments, then when freeing return -- value. - eq('', meths.replace_termcodes('', true, true, true)) + eq('', meths.nvim_replace_termcodes('', true, true, true)) end) -- Not exactly the case, as nvim_replace_termcodes() escapes K_SPECIAL in Unicode it('translates the result of keytrans() on string with 0x80 byte back', function() local s = 'ff\128\253\097tt' - eq(s, meths.replace_termcodes(funcs.keytrans(s), true, true, true)) + eq(s, meths.nvim_replace_termcodes(funcs.keytrans(s), true, true, true)) end) end) @@ -2244,7 +2250,7 @@ describe('API', function() silent! call nvim_out_write("\n") redir END ]]) - eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.get_var('out')) + eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.nvim_get_var('out')) end) it('blank line in message', function() @@ -2430,18 +2436,18 @@ describe('API', function() } it('returns {} for invalid channel', function() - eq({}, meths.get_chan_info(0)) - eq({}, meths.get_chan_info(-1)) + eq({}, meths.nvim_get_chan_info(0)) + eq({}, meths.nvim_get_chan_info(-1)) -- more preallocated numbers might be added, try something high - eq({}, meths.get_chan_info(10)) + eq({}, meths.nvim_get_chan_info(10)) end) it('stream=stdio channel', function() - eq({ [1] = testinfo, [2] = stderr }, meths.list_chans()) - eq(testinfo, meths.get_chan_info(1)) - eq(stderr, meths.get_chan_info(2)) + eq({ [1] = testinfo, [2] = stderr }, meths.nvim_list_chans()) + eq(testinfo, meths.nvim_get_chan_info(1)) + eq(stderr, meths.nvim_get_chan_info(2)) - meths.set_client_info( + meths.nvim_set_client_info( 'functionaltests', { major = 0, minor = 3, patch = 17 }, 'ui', @@ -2460,9 +2466,9 @@ describe('API', function() attributes = { license = 'Apache2' }, }, } - eq({ info = info }, meths.get_var('info_event')) - eq({ [1] = info, [2] = stderr }, meths.list_chans()) - eq(info, meths.get_chan_info(1)) + eq({ info = info }, meths.nvim_get_var('info_event')) + eq({ [1] = info, [2] = stderr }, meths.nvim_list_chans()) + eq(info, meths.nvim_get_chan_info(1)) end) it('stream=job channel', function() @@ -2475,9 +2481,9 @@ describe('API', function() mode = 'rpc', client = {}, } - 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)) + eq({ info = info }, meths.nvim_get_var('opened_event')) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.nvim_list_chans()) + eq(info, meths.nvim_get_chan_info(3)) eval( 'rpcrequest(3, "nvim_set_client_info", "amazing-cat", {}, "remote",' .. '{"nvim_command":{"n_args":1}},' -- and so on @@ -2496,8 +2502,8 @@ describe('API', function() 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.nvim_get_var('info_event')) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.nvim_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", @@ -2507,8 +2513,8 @@ describe('API', function() 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.nvim_get_current_buf()) + eq(3, meths.nvim_get_option_value('channel', { buf = 1 })) local info = { stream = 'job', @@ -2518,15 +2524,15 @@ describe('API', function() buffer = 1, pty = '?', } - local event = meths.get_var('opened_event') + local event = meths.nvim_get_var('opened_event') if not is_os('win') then info.pty = event.info.pty 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, meths.get_chan_info(3)) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.nvim_list_chans()) + eq(info, meths.nvim_get_chan_info(3)) -- :terminal with args + running process. command('enew') @@ -2566,13 +2572,13 @@ describe('API', function() describe('nvim_call_atomic', function() it('works', function() - meths.buf_set_lines(0, 0, -1, true, { 'first' }) + meths.nvim_buf_set_lines(0, 0, -1, true, { 'first' }) local req = { { '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.nvim_call_atomic(req)) + eq({ 'second' }, meths.nvim_buf_get_lines(0, 0, -1, true)) end) it('allows multiple return values', function() @@ -2582,11 +2588,11 @@ describe('API', function() { '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.nvim_call_atomic(req)) end) it('is aborted by errors in call', function() - local error_types = meths.get_api_info()[2].error_types + local error_types = meths.nvim_get_api_info()[2].error_types local req = { { 'nvim_set_var', { 'one', 1 } }, { 'nvim_buf_set_lines', {} }, @@ -2599,9 +2605,9 @@ describe('API', function() 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')) + }, meths.nvim_call_atomic(req)) + eq(1, meths.nvim_get_var('one')) + eq(false, pcall(meths.nvim_get_var, 'two')) -- still returns all previous successful calls req = { @@ -2613,7 +2619,7 @@ describe('API', function() } eq( { { NIL, NIL, 5 }, { 3, error_types.Validation.id, 'Index out of bounds' } }, - meths.call_atomic(req) + meths.nvim_call_atomic(req) ) req = { @@ -2622,9 +2628,9 @@ describe('API', function() } eq( { {}, { 0, error_types.Exception.id, 'Invalid method: i_am_not_a_method' } }, - meths.call_atomic(req) + meths.nvim_call_atomic(req) ) - eq(5, meths.get_var('avar')) + eq(5, meths.nvim_get_var('avar')) end) it('validation', function() @@ -2633,25 +2639,28 @@ describe('API', function() { '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.nvim_call_atomic, req)) -- call before was done, but not after - eq(1, meths.get_var('avar')) + eq(1, meths.nvim_get_var('avar')) req = { { '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.nvim_call_atomic, req) + ) + eq({ 2, 3 }, meths.nvim_get_var('bvar')) req = { { '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.nvim_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(1, meths.nvim_get_var('avar')) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, true)) end) end) @@ -2665,36 +2674,36 @@ describe('API', function() rmdir 'Xtest' end) before_each(function() - meths.set_current_dir 'Xtest' + meths.nvim_set_current_dir 'Xtest' end) it('returns nothing with empty &runtimepath', function() - meths.set_option_value('runtimepath', '', {}) - eq({}, meths.list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', '', {}) + eq({}, meths.nvim_list_runtime_paths()) end) it('returns single runtimepath', function() - meths.set_option_value('runtimepath', 'a', {}) - eq({ 'a' }, meths.list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', 'a', {}) + eq({ 'a' }, meths.nvim_list_runtime_paths()) end) it('returns two runtimepaths', function() - meths.set_option_value('runtimepath', 'a,b', {}) - eq({ 'a', 'b' }, meths.list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', 'a,b', {}) + eq({ 'a', 'b' }, meths.nvim_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()) - meths.set_option_value('runtimepath', ',a,b', {}) - eq({ '', 'a', 'b' }, meths.list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', 'a,,b', {}) + eq({ 'a', '', 'b' }, meths.nvim_list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', ',a,b', {}) + eq({ '', 'a', 'b' }, meths.nvim_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()) - meths.set_option_value('runtimepath', 'a,b,,', {}) - eq({ 'a', 'b', '' }, meths.list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', 'a,b,', {}) + eq({ 'a', 'b' }, meths.nvim_list_runtime_paths()) + meths.nvim_set_option_value('runtimepath', 'a,b,,', {}) + eq({ 'a', 'b', '' }, meths.nvim_list_runtime_paths()) end) it('truncates too long paths', function() local long_path = ('/a'):rep(8192) - meths.set_option_value('runtimepath', long_path, {}) - local paths_list = meths.list_runtime_paths() + meths.nvim_set_option_value('runtimepath', long_path, {}) + local paths_list = meths.nvim_list_runtime_paths() eq({}, paths_list) end) end) @@ -2723,7 +2732,7 @@ describe('API', function() describe('nvim_parse_expression', function() before_each(function() - meths.set_option_value('isident', '', {}) + meths.nvim_set_option_value('isident', '', {}) end) local function simplify_east_api_node(line, east_api_node) @@ -2856,7 +2865,7 @@ describe('API', function() nz_flags_exps = nz_flags_exps or {} for _, flags in ipairs(opts.flags) do local err, msg = pcall(function() - local east_api = meths.parse_expression(str, FLAGS_TO_STR[flags], true) + local east_api = meths.nvim_parse_expression(str, FLAGS_TO_STR[flags], true) local east_hl = east_api.highlight east_api.highlight = nil local ast = simplify_east_api(str, east_api) @@ -2980,33 +2989,33 @@ describe('API', function() 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({}, meths.nvim_get_namespaces()) + eq(1, meths.nvim_create_namespace('ns-1')) + eq(2, meths.nvim_create_namespace('ns-2')) + eq(1, meths.nvim_create_namespace('ns-1')) + eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, meths.nvim_get_namespaces()) + eq(3, meths.nvim_create_namespace('')) + eq(4, meths.nvim_create_namespace('')) + eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, meths.nvim_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({ id = 2 }, meths.nvim_create_buf(true, false)) + eq({ id = 3 }, meths.nvim_create_buf(false, false)) eq( ' 1 %a "[No Name]" line 1\n' .. ' 2 h "[No Name]" line 0', - meths.command_output('ls') + meths.nvim_command_output('ls') ) -- current buffer didn't change - eq({ id = 1 }, meths.get_current_buf()) + eq({ id = 1 }, meths.nvim_get_current_buf()) local screen = Screen.new(20, 4) screen:attach() - meths.buf_set_lines(2, 0, -1, true, { 'some text' }) - meths.set_current_buf(2) + meths.nvim_buf_set_lines(2, 0, -1, true, { 'some text' }) + meths.nvim_set_current_buf(2) screen:expect( [[ ^some text | @@ -3020,43 +3029,43 @@ describe('API', function() 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' }) + meths.nvim_set_option_value('hidden', false, {}) + eq({ id = 2 }, meths.nvim_create_buf(true, false)) + meths.nvim_set_option_value('buftype', 'nofile', { buf = 2 }) + meths.nvim_buf_set_lines(2, 0, -1, true, { 'test text' }) command('split | buffer 2') - eq({ id = 2 }, meths.get_current_buf()) + eq({ id = 2 }, meths.nvim_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()) + eq({ id = 1 }, meths.nvim_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') - eq({ id = 2 }, meths.create_buf(true, false)) - meths.buf_set_lines(2, 0, -1, true, { 'test', 'text' }) + eq({ id = 2 }, meths.nvim_create_buf(true, false)) + meths.nvim_buf_set_lines(2, 0, -1, true, { 'test', 'text' }) eq(false, eval('g:fired')) end) it('TextChanged and TextChangedI do not trigger without changes', function() - local buf = meths.create_buf(true, false) + local buf = meths.nvim_create_buf(true, false) command([[let g:changed = '']]) - meths.create_autocmd({ 'TextChanged', 'TextChangedI' }, { + meths.nvim_create_autocmd({ 'TextChanged', 'TextChangedI' }, { buffer = buf, command = 'let g:changed ..= mode()', }) - meths.set_current_buf(buf) + meths.nvim_set_current_buf(buf) feed('i') - eq('', meths.get_var('changed')) + eq('', meths.nvim_get_var('changed')) 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.nvim_create_buf(false, true)) + eq({ id = 3 }, meths.nvim_create_buf(true, true)) + eq({ id = 4 }, meths.nvim_create_buf(true, true)) local scratch_bufs = { 2, 3, 4 } eq( ' 1 %a "[No Name]" line 1\n' @@ -3065,7 +3074,7 @@ describe('API', function() exec_capture('ls') ) -- current buffer didn't change - eq({ id = 1 }, meths.get_current_buf()) + eq({ id = 1 }, meths.nvim_get_current_buf()) local screen = Screen.new(20, 4) screen:set_default_attr_ids({ @@ -3077,27 +3086,27 @@ 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' }) + meths.nvim_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 })) + eq('nofile', meths.nvim_get_option_value('buftype', { buf = b })) + eq('hide', meths.nvim_get_option_value('bufhidden', { buf = b })) + eq(false, meths.nvim_get_option_value('swapfile', { buf = b })) + eq(false, meths.nvim_get_option_value('modeline', { buf = b })) end -- -- Visiting a scratch-buffer DOES NOT change its properties. -- - meths.set_current_buf(edited_buf) + meths.nvim_set_current_buf(edited_buf) screen:expect([[ ^some text | {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.nvim_get_option_value('buftype', { buf = edited_buf })) + eq('hide', meths.nvim_get_option_value('bufhidden', { buf = edited_buf })) + eq(false, meths.nvim_get_option_value('swapfile', { buf = edited_buf })) + eq(false, meths.nvim_get_option_value('modeline', { buf = edited_buf })) -- Scratch buffer can be wiped without error. command('bwipe') @@ -3119,11 +3128,11 @@ 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.nvim_get_runtime_file('bork.borkbork', false)) + eq({}, meths.nvim_get_runtime_file('bork.borkbork', true)) + eq(1, #meths.nvim_get_runtime_file('autoload/msgpack.vim', false)) + eq(1, #meths.nvim_get_runtime_file('autoload/msgpack.vim', true)) + local val = meths.nvim_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')) @@ -3132,37 +3141,37 @@ describe('API', function() 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.nvim_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') ) - val = meths.get_runtime_file('lua', true) + val = meths.nvim_get_runtime_file('lua', true) eq(1, #val) ok(endswith(val[1], p 'lua')) - val = meths.get_runtime_file('lua/vim', true) + val = meths.nvim_get_runtime_file('lua/vim', true) eq(1, #val) ok(endswith(val[1], p 'lua/vim')) end) it('can find directories', function() - local val = meths.get_runtime_file('lua/', true) + local val = meths.nvim_get_runtime_file('lua/', true) eq(1, #val) ok(endswith(val[1], p 'lua/')) - val = meths.get_runtime_file('lua/vim/', true) + val = meths.nvim_get_runtime_file('lua/vim/', true) eq(1, #val) ok(endswith(val[1], p 'lua/vim/')) - eq({}, meths.get_runtime_file('foobarlang/', true)) + eq({}, meths.nvim_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.nvim_get_runtime_file, '{', false)) eq( 'Vim(echo):E5555: API call: Vim:E220: Missing }.', @@ -3173,25 +3182,25 @@ describe('API', function() describe('nvim_get_all_options_info', function() it('should have key value pairs of option names', function() - local options_info = meths.get_all_options_info() + local options_info = meths.nvim_get_all_options_info() neq(nil, options_info.listchars) neq(nil, options_info.tabstop) - eq(meths.get_option_info 'winhighlight', options_info.winhighlight) + eq(meths.nvim_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.nvim_exec2('echo nvim_get_all_options_info()', { output = true }) end) end) describe('nvim_get_option_info', function() it('should error for unknown options', function() - eq("Invalid option (not found): 'bogus'", pcall_err(meths.get_option_info, 'bogus')) + eq("Invalid option (not found): 'bogus'", pcall_err(meths.nvim_get_option_info, 'bogus')) 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.nvim_get_option_info 'winhl', meths.nvim_get_option_info 'winhighlight') end) it('should have information about window options', function() @@ -3209,7 +3218,7 @@ describe('API', function() shortname = 'winhl', type = 'string', was_set = false, - }, meths.get_option_info 'winhl') + }, meths.nvim_get_option_info 'winhl') end) it('should have information about buffer options', function() @@ -3227,13 +3236,13 @@ describe('API', function() shortname = 'ft', type = 'string', was_set = false, - }, meths.get_option_info 'filetype') + }, meths.nvim_get_option_info 'filetype') end) it('should have information about global options', function() -- precondition: the option was changed from its default -- in test setup. - eq(false, meths.get_option_value('showcmd', {})) + eq(false, meths.nvim_get_option_value('showcmd', {})) eq({ allows_duplicates = true, @@ -3249,9 +3258,9 @@ describe('API', function() shortname = 'sc', type = 'boolean', was_set = true, - }, meths.get_option_info 'showcmd') + }, meths.nvim_get_option_info 'showcmd') - meths.set_option_value('showcmd', true, {}) + meths.nvim_set_option_value('showcmd', true, {}) eq({ allows_duplicates = true, @@ -3267,7 +3276,7 @@ describe('API', function() shortname = 'sc', type = 'boolean', was_set = true, - }, meths.get_option_info 'showcmd') + }, meths.nvim_get_option_info 'showcmd') end) end) @@ -3294,18 +3303,18 @@ describe('API', function() ) exec_lua 'vim.cmd.vsplit()' - meths.create_buf(false, false) + meths.nvim_create_buf(false, false) - bufs = meths.list_bufs() - wins = meths.list_wins() + bufs = meths.nvim_list_bufs() + wins = meths.nvim_list_wins() - meths.win_set_buf(wins[1].id, bufs[1].id) - meths.win_set_buf(wins[2].id, bufs[2].id) + meths.nvim_win_set_buf(wins[1].id, bufs[1].id) + meths.nvim_win_set_buf(wins[2].id, bufs[2].id) - meths.set_current_win(wins[2].id) - meths.exec('source ' .. fname, false) + meths.nvim_set_current_win(wins[2].id) + meths.nvim_exec('source ' .. fname, false) - meths.set_current_win(wins[1].id) + meths.nvim_set_current_win(wins[1].id) end) after_each(function() @@ -3313,9 +3322,9 @@ 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('completeopt'), meths.get_option_info2('completeopt', {})) -- global + eq(meths.nvim_get_option_info('dictionary'), meths.nvim_get_option_info2('dictionary', {})) -- buffer + eq(meths.nvim_get_option_info('fillchars'), meths.nvim_get_option_info2('fillchars', {})) -- window + eq(meths.nvim_get_option_info('completeopt'), meths.nvim_get_option_info2('completeopt', {})) -- global end) describe('last set', function() @@ -3347,21 +3356,21 @@ describe('API', function() for _, t in pairs(tests) do it(t.desc, function() -- Switch to the target buffer/window so that curbuf/curwin are used. - meths.set_current_win(wins[2].id) - local info = meths.get_option_info2(unpack(t.args)) + meths.nvim_set_current_win(wins[2].id) + local info = meths.nvim_get_option_info2(unpack(t.args)) eq(t.linenr, info.last_set_linenr) eq(t.sid, info.last_set_sid) end) end it('is provided for cross-buffer requests', function() - local info = meths.get_option_info2('formatprg', { buf = bufs[2].id }) + local info = meths.nvim_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.nvim_get_option_info2('listchars', { win = wins[2].id }) eq(6, info.last_set_linenr) eq(1, info.last_set_sid) end) @@ -3466,11 +3475,15 @@ describe('API', function() 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 t = meths.open_term(b, {}) + local b = meths.nvim_create_buf(true, true) + meths.nvim_open_win( + b, + false, + { width = 79, height = 31, row = 1, col = 1, relative = 'editor' } + ) + local t = meths.nvim_open_term(b, {}) - meths.chan_send(t, io.open('test/functional/fixtures/smile2.cat', 'r'):read('*a')) + meths.nvim_chan_send(t, io.open('test/functional/fixtures/smile2.cat', 'r'):read('*a')) screen:expect { grid = [[ ^ | @@ -3576,50 +3589,56 @@ describe('API', function() 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' }) - 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')) + local buf = meths.nvim_create_buf(false, true) + meths.nvim_buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) + eq(true, meths.nvim_buf_set_mark(buf, 'F', 2, 2, {})) + eq(true, meths.nvim_del_mark('F')) + eq({ 0, 0 }, meths.nvim_buf_get_mark(buf, 'F')) end) it('validation', function() - eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(meths.del_mark, 'f')) - eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(meths.del_mark, '!')) - eq("Invalid mark name (must be a single char): 'fail'", pcall_err(meths.del_mark, 'fail')) + eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(meths.nvim_del_mark, 'f')) + eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(meths.nvim_del_mark, '!')) + eq( + "Invalid mark name (must be a single char): 'fail'", + pcall_err(meths.nvim_del_mark, 'fail') + ) end) 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' }) - meths.buf_set_mark(buf, 'F', 2, 2, {}) - meths.buf_set_name(buf, 'mybuf') - local mark = meths.get_mark('F', {}) + local buf = meths.nvim_create_buf(false, true) + meths.nvim_buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) + meths.nvim_buf_set_mark(buf, 'F', 2, 2, {}) + meths.nvim_buf_set_name(buf, 'mybuf') + local mark = meths.nvim_get_mark('F', {}) -- Compare the path tail only 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', {})) - eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(meths.get_mark, '!', {})) - eq("Invalid mark name (must be a single char): 'fail'", pcall_err(meths.get_mark, 'fail', {})) + eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(meths.nvim_get_mark, 'f', {})) + eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(meths.nvim_get_mark, '!', {})) + eq( + "Invalid mark name (must be a single char): 'fail'", + pcall_err(meths.nvim_get_mark, 'fail', {}) + ) 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(true, meths.nvim_del_mark('A')) + eq({ 0, 0, 0, '' }, meths.nvim_get_mark('A', {})) end) it('works with deleted buffers', function() local fname = tmpname() write_file(fname, 'a\nbit of\text') nvim('command', 'edit ' .. fname) - local buf = meths.get_current_buf() + local buf = meths.nvim_get_current_buf() - meths.buf_set_mark(buf, 'F', 2, 2, {}) + meths.nvim_buf_set_mark(buf, 'F', 2, 2, {}) nvim('command', 'new') -- Create new buf to avoid :bd failing nvim('command', 'bd! ' .. buf.id) os.remove(fname) - local mark = meths.get_mark('F', {}) + local mark = meths.nvim_get_mark('F', {}) -- To avoid comparing relative vs absolute path local mfname = mark[4] local tail_patt = [[[\/][^\/]*$]] @@ -3633,72 +3652,72 @@ describe('API', function() eq({ str = '%StatusLineStringWithHighlights', width = 31, - }, meths.eval_statusline('%%StatusLineString%#WarningMsg#WithHighlights', {})) + }, meths.nvim_eval_statusline('%%StatusLineString%#WarningMsg#WithHighlights', {})) end) it("doesn't exceed maxwidth", function() eq({ str = 'Should be trun>', width = 15, - }, meths.eval_statusline('Should be truncated%<', { maxwidth = 15 })) + }, meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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' }) + pcall_err(meths.nvim_eval_statusline, '', { fillchar = 'aa' }) ) end) it('rejects empty string fillchar', function() eq( "Invalid 'fillchar': expected single character", - pcall_err(meths.eval_statusline, '', { fillchar = '' }) + pcall_err(meths.nvim_eval_statusline, '', { fillchar = '' }) ) end) it('rejects non-string fillchar', function() eq( "Invalid 'fillchar': expected String, got Integer", - pcall_err(meths.eval_statusline, '', { fillchar = 1 }) + pcall_err(meths.nvim_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.nvim_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.nvim_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.nvim_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 })) + eq({ str = '1234', width = 4 }, meths.nvim_eval_statusline('%S', { maxwidth = 5 })) feed('56') screen:expect({ any = '123456' }) - eq({ str = '<3456', width = 5 }, meths.eval_statusline('%S', { maxwidth = 5 })) + eq({ str = '<3456', width = 5 }, meths.nvim_eval_statusline('%S', { maxwidth = 5 })) end) describe('highlight parsing', function() it('works', function() @@ -3711,7 +3730,7 @@ describe('API', function() { start = 24, group = 'User1' }, }, }, - meths.eval_statusline( + meths.nvim_eval_statusline( '%#WarningMsg#TextWithWarningHighlight%1*TextWithUserHighlight', { highlights = true } ) @@ -3724,7 +3743,7 @@ describe('API', function() highlights = { { start = 0, group = 'StatusLine' }, }, - }, meths.eval_statusline('TextWithNoHighlight', { highlights = true })) + }, meths.nvim_eval_statusline('TextWithNoHighlight', { highlights = true })) end) it('works with inactive statusline', function() command('split') @@ -3738,9 +3757,9 @@ describe('API', function() { start = 19, group = 'WarningMsg' }, }, }, - meths.eval_statusline( + meths.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', - { winid = meths.list_wins()[2].id, highlights = true } + { winid = meths.nvim_list_wins()[2].id, highlights = true } ) ) end) @@ -3754,7 +3773,7 @@ describe('API', function() { start = 19, group = 'WarningMsg' }, }, }, - meths.eval_statusline( + meths.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', { use_tabline = true, highlights = true } ) @@ -3770,7 +3789,7 @@ describe('API', function() { start = 19, group = 'WarningMsg' }, }, }, - meths.eval_statusline( + meths.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', { use_winbar = true, highlights = true } ) @@ -3798,25 +3817,31 @@ describe('API', function() { group = 'ErrorMsg', start = 8 }, { group = 'Normal', start = 10 }, }, - }, meths.eval_statusline('%C%s%=%l ', { use_statuscol_lnum = 4, highlights = true })) - eq({ - str = '3 ', - width = 2, - highlights = { - { group = 'LineNr', start = 0 }, - { group = 'ErrorMsg', start = 1 }, - }, - }, meths.eval_statusline( - '%l%#ErrorMsg# ', - { use_statuscol_lnum = 3, highlights = true } + }, meths.nvim_eval_statusline( + '%C%s%=%l ', + { use_statuscol_lnum = 4, highlights = true } )) + eq( + { + str = '3 ', + width = 2, + highlights = { + { group = 'LineNr', start = 0 }, + { group = 'ErrorMsg', start = 1 }, + }, + }, + meths.nvim_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', {}) + meths.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {}) eq({ str = 'StatusLineStringWithClickFunc', width = 29, - }, meths.eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {})) + }, meths.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {})) end) end) end) @@ -3859,7 +3884,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('echo foo', {})) + }, meths.nvim_parse_cmd('echo foo', {})) end) it('works with ranges', function() eq({ @@ -3899,7 +3924,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('4,6s/math.random/math.max/', {})) + }, meths.nvim_parse_cmd('4,6s/math.random/math.max/', {})) end) it('works with count', function() eq({ @@ -3940,7 +3965,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('buffer 1', {})) + }, meths.nvim_parse_cmd('buffer 1', {})) end) it('works with register', function() eq({ @@ -3981,7 +4006,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('put +', {})) + }, meths.nvim_parse_cmd('put +', {})) eq({ cmd = 'put', args = {}, @@ -4020,7 +4045,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('put', {})) + }, meths.nvim_parse_cmd('put', {})) end) it('works with range, count and register', function() eq({ @@ -4062,7 +4087,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('1,3delete * 5', {})) + }, meths.nvim_parse_cmd('1,3delete * 5', {})) end) it('works with bang', function() eq({ @@ -4102,91 +4127,97 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('w!', {})) + }, meths.nvim_parse_cmd('w!', {})) end) it('works with modifiers', function() - eq({ - cmd = 'split', - args = { 'foo.txt' }, - bang = false, - range = {}, - addr = '?', - magic = { - file = true, - bar = true, - }, - nargs = '?', - nextcmd = '', - mods = { - browse = false, - confirm = false, - emsg_silent = true, - filter = { - pattern = 'foo', - force = false, + eq( + { + cmd = 'split', + args = { 'foo.txt' }, + bang = false, + range = {}, + addr = '?', + magic = { + file = true, + bar = true, + }, + nargs = '?', + nextcmd = '', + mods = { + browse = false, + confirm = false, + emsg_silent = true, + filter = { + pattern = 'foo', + force = false, + }, + hide = false, + horizontal = true, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = true, + split = 'topleft', + tab = 1, + unsilent = false, + verbose = 15, + vertical = false, }, - hide = false, - horizontal = true, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = true, - split = 'topleft', - tab = 1, - unsilent = false, - verbose = 15, - vertical = false, - }, - }, meths.parse_cmd( - '15verbose silent! horizontal topleft tab filter /foo/ split foo.txt', - {} - )) - eq({ - cmd = 'split', - args = { 'foo.txt' }, - bang = false, - range = {}, - addr = '?', - magic = { - file = true, - bar = true, }, - nargs = '?', - nextcmd = '', - mods = { - browse = false, - confirm = true, - emsg_silent = false, - filter = { - pattern = 'foo', - force = true, + meths.nvim_parse_cmd( + '15verbose silent! horizontal topleft tab filter /foo/ split foo.txt', + {} + ) + ) + eq( + { + cmd = 'split', + args = { 'foo.txt' }, + bang = false, + range = {}, + addr = '?', + magic = { + file = true, + bar = true, + }, + nargs = '?', + nextcmd = '', + mods = { + browse = false, + confirm = true, + emsg_silent = false, + filter = { + pattern = 'foo', + force = true, + }, + hide = false, + horizontal = false, + keepalt = false, + keepjumps = false, + keepmarks = false, + keeppatterns = false, + lockmarks = false, + noautocmd = false, + noswapfile = false, + sandbox = false, + silent = false, + split = 'botright', + tab = 0, + unsilent = true, + verbose = 0, + vertical = false, }, - hide = false, - horizontal = false, - keepalt = false, - keepjumps = false, - keepmarks = false, - keeppatterns = false, - lockmarks = false, - noautocmd = false, - noswapfile = false, - sandbox = false, - silent = false, - split = 'botright', - tab = 0, - unsilent = true, - verbose = 0, - vertical = false, }, - }, meths.parse_cmd( - '0verbose unsilent botright 0tab confirm filter! /foo/ split foo.txt', - {} - )) + meths.nvim_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') @@ -4227,7 +4258,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('4,6MyCommand! test it', {})) + }, meths.nvim_parse_cmd('4,6MyCommand! test it', {})) end) it('works for commands separated by bar', function() eq({ @@ -4267,7 +4298,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('argadd a.txt | argadd b.txt', {})) + }, meths.nvim_parse_cmd('argadd a.txt | argadd b.txt', {})) end) it('works for nargs=1', function() command('command -nargs=1 MyCommand echo ') @@ -4307,28 +4338,28 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('MyCommand test it', {})) + }, meths.nvim_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', pcall_err(meths.nvim_parse_cmd, '', {})) + eq('Error while parsing command line', pcall_err(meths.nvim_parse_cmd, '" foo', {})) eq( 'Error while parsing command line: E492: Not an editor command: Fubar', - pcall_err(meths.parse_cmd, 'Fubar', {}) + pcall_err(meths.nvim_parse_cmd, 'Fubar', {}) ) command('command! Fubar echo foo') eq( 'Error while parsing command line: E477: No ! allowed', - pcall_err(meths.parse_cmd, 'Fubar!', {}) + pcall_err(meths.nvim_parse_cmd, 'Fubar!', {}) ) eq( 'Error while parsing command line: E481: No range allowed', - pcall_err(meths.parse_cmd, '4,6Fubar', {}) + pcall_err(meths.nvim_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', {}) + pcall_err(meths.nvim_parse_cmd, 'F', {}) ) end) it('does not interfere with printing line in Ex mode #19400', function() @@ -4350,7 +4381,7 @@ describe('API', function() Entering Ex mode. Type "visual" to go to Normal mode. | :1^ | ]]) - eq('Error while parsing command line', pcall_err(meths.parse_cmd, '', {})) + eq('Error while parsing command line', pcall_err(meths.nvim_parse_cmd, '', {})) feed('') screen:expect([[ foo | @@ -4363,8 +4394,8 @@ 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.nvim_buf_set_lines(0, 0, -1, true, { 'foo', 'bar', 'foo', 'bar' }) + eq({ 1, 0 }, meths.nvim_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 @@ -4405,15 +4436,15 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.parse_cmd('+2;/bar/normal! x', {})) - eq({ 1, 0 }, meths.win_get_cursor(0)) + }, meths.nvim_parse_cmd('+2;/bar/normal! x', {})) + eq({ 1, 0 }, meths.nvim_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.nvim_cmd(meths.nvim_parse_cmd('echo "foo"', {}), { output = true })) + meths.nvim_cmd(meths.nvim_parse_cmd('set cursorline', {}), {}) + eq(true, meths.nvim_get_option_value('cursorline', {})) end) it('no side-effects (error messages) in pcall() #20339', function() eq( @@ -4426,80 +4457,86 @@ describe('API', function() describe('nvim_cmd', function() it('works', function() - meths.cmd({ cmd = 'set', args = { 'cursorline' } }, {}) - eq(true, meths.get_option_value('cursorline', {})) + meths.nvim_cmd({ cmd = 'set', args = { 'cursorline' } }, {}) + eq(true, meths.nvim_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 'cmd': expected non-empty String", pcall_err(meths.nvim_cmd, { cmd = '' }, {})) + eq("Invalid 'cmd': expected String, got Array", pcall_err(meths.nvim_cmd, { cmd = {} }, {})) eq( "Invalid 'args': expected Array, got Boolean", - pcall_err(meths.cmd, { cmd = 'set', args = true }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'set', args = true }, {}) ) eq( 'Invalid command arg: expected non-whitespace', - pcall_err(meths.cmd, { cmd = 'set', args = { ' ' } }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'set', args = { ' ' } }, {}) ) eq( 'Invalid command arg: expected valid type, got Array', - pcall_err(meths.cmd, { cmd = 'set', args = { {} } }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'set', args = { {} } }, {}) + ) + eq( + 'Wrong number of arguments', + pcall_err(meths.nvim_cmd, { cmd = 'aboveleft', 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 }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, bang = true }, {}) ) eq( 'Command cannot accept range: set', - pcall_err(meths.cmd, { cmd = 'set', args = {}, range = { 1 } }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'set', args = {}, range = { 1 } }, {}) ) eq( "Invalid 'range': expected Array, got Boolean", - pcall_err(meths.cmd, { cmd = 'print', args = {}, range = true }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, range = true }, {}) ) eq( "Invalid 'range': expected <=2 elements", - pcall_err(meths.cmd, { cmd = 'print', args = {}, range = { 1, 2, 3, 4 } }, {}) + pcall_err(meths.nvim_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 } }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, range = { -1 } }, {}) ) eq( 'Command cannot accept count: set', - pcall_err(meths.cmd, { cmd = 'set', args = {}, count = 1 }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'set', args = {}, count = 1 }, {}) ) eq( "Invalid 'count': expected Integer, got Boolean", - pcall_err(meths.cmd, { cmd = 'print', args = {}, count = true }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, count = true }, {}) ) eq( "Invalid 'count': expected non-negative Integer", - pcall_err(meths.cmd, { cmd = 'print', args = {}, count = -1 }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, count = -1 }, {}) ) eq( 'Command cannot accept register: set', - pcall_err(meths.cmd, { cmd = 'set', args = {}, reg = 'x' }, {}) + pcall_err(meths.nvim_cmd, { cmd = 'set', args = {}, reg = 'x' }, {}) + ) + eq( + 'Cannot use register "=', + pcall_err(meths.nvim_cmd, { cmd = 'put', args = {}, reg = '=' }, {}) ) - 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' }, {}) + pcall_err(meths.nvim_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.nvim_cmd, { cmd = 'win_getid' }, {})) + eq('Invalid command: "echo "hi""', pcall_err(meths.nvim_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.nvim_cmd({ cmd = 'set', args = {}, magic = {} }, {})) -- Lua call does not allow non-empty list-like {} for dict item. eq( @@ -4517,11 +4554,11 @@ describe('API', function() end) it('captures output', function() - eq('foo', meths.cmd({ cmd = 'echo', args = { '"foo"' } }, { output = true })) + eq('foo', meths.nvim_cmd({ cmd = 'echo', args = { '"foo"' } }, { output = true })) end) it('sets correct script context', function() - meths.cmd({ cmd = 'set', args = { 'cursorline' } }, {}) + meths.nvim_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+%)')) end) @@ -4536,7 +4573,7 @@ describe('API', function() line5 line6 ]] - meths.cmd({ cmd = 'del', range = { 2, 4 } }, {}) + meths.nvim_cmd({ cmd = 'del', range = { 2, 4 } }, {}) expect [[ line1 you didn't expect this @@ -4554,7 +4591,7 @@ describe('API', function() line5 line6 ]] - meths.cmd({ cmd = 'del', range = { 2 }, count = 4 }, {}) + meths.nvim_cmd({ cmd = 'del', range = { 2 }, count = 4 }, {}) expect [[ line1 line5 @@ -4571,7 +4608,7 @@ describe('API', function() line5 line6 ]] - meths.cmd({ cmd = 'del', range = { 2, 4 }, reg = 'a' }, {}) + meths.nvim_cmd({ cmd = 'del', range = { 2, 4 }, reg = 'a' }, {}) command('1put a') expect [[ line1 @@ -4584,26 +4621,29 @@ describe('API', function() ]] end) it('works with bang', function() - meths.create_user_command('Foo', 'echo ""', { bang = true }) - eq('!', meths.cmd({ cmd = 'Foo', bang = true }, { output = true })) - eq('', meths.cmd({ cmd = 'Foo', bang = false }, { output = true })) + meths.nvim_create_user_command('Foo', 'echo ""', { bang = true }) + eq('!', meths.nvim_cmd({ cmd = 'Foo', bang = true }, { output = true })) + eq('', meths.nvim_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 }) + meths.nvim_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 })) + eq('', meths.nvim_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.nvim_create_user_command('Foo', 'set verbose', {}) + eq(' verbose=1', meths.nvim_cmd({ cmd = 'Foo', mods = { verbose = 1 } }, { output = true })) - meths.create_user_command('Mods', "echo ''", {}) + meths.nvim_create_user_command('Mods', "echo ''", {}) eq( 'keepmarks keeppatterns silent 3verbose aboveleft horizontal', - meths.cmd({ + meths.nvim_cmd({ cmd = 'Mods', mods = { horizontal = true, @@ -4615,19 +4655,19 @@ describe('API', function() }, }, { output = true }) ) - eq(0, meths.get_option_value('verbose', {})) + eq(0, meths.nvim_get_option_value('verbose', {})) command('edit foo.txt | edit bar.txt') eq( ' 1 #h "foo.txt" line 1', - meths.cmd( + meths.nvim_cmd( { cmd = 'buffers', mods = { filter = { pattern = 'foo', force = false } } }, { output = true } ) ) eq( ' 2 %a "bar.txt" line 1', - meths.cmd( + meths.nvim_cmd( { cmd = 'buffers', mods = { filter = { pattern = 'foo', force = true } } }, { output = true } ) @@ -4635,10 +4675,10 @@ describe('API', function() -- with emsg_silent = true error is suppressed feed([[:lua vim.api.nvim_cmd({ cmd = 'call', mods = { emsg_silent = true } }, {})]]) - eq('', meths.cmd({ cmd = 'messages' }, { output = true })) + eq('', meths.nvim_cmd({ cmd = 'messages' }, { output = true })) -- error from the next command typed is not suppressed #21420 feed(':call') - eq('E471: Argument required', meths.cmd({ cmd = 'messages' }, { output = true })) + eq('E471: Argument required', meths.nvim_cmd({ cmd = 'messages' }, { output = true })) end) it('works with magic.file', function() exec_lua([[ @@ -4648,7 +4688,10 @@ describe('API', function() ]]) eq( uv.cwd(), - meths.cmd({ cmd = 'Foo', args = { '%:p:h' }, magic = { file = true } }, { output = true }) + meths.nvim_cmd( + { cmd = 'Foo', args = { '%:p:h' }, magic = { file = true } }, + { output = true } + ) ) end) it('splits arguments correctly', function() @@ -4657,24 +4700,24 @@ describe('API', function() echo a:000 endfunction ]]) - meths.create_user_command('Foo', 'call FooFunc()', { nargs = '+' }) + meths.nvim_create_user_command('Foo', 'call FooFunc()', { nargs = '+' }) eq( [=[['a quick', 'brown fox', 'jumps over the', 'lazy dog']]=], - meths.cmd( + meths.nvim_cmd( { cmd = 'Foo', args = { 'a quick', 'brown fox', 'jumps over the', 'lazy dog' } }, { output = true } ) ) eq( [=[['test \ \\ \"""\', 'more\ tests\" ']]=], - meths.cmd( + meths.nvim_cmd( { cmd = 'Foo', args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, { output = true } ) ) end) it('splits arguments correctly for Lua callback', function() - meths.exec_lua( + meths.nvim_exec_lua( [[ local function FooFunc(opts) vim.print(opts.fargs) @@ -4686,14 +4729,14 @@ describe('API', function() ) eq( [[{ "a quick", "brown fox", "jumps over the", "lazy dog" }]], - meths.cmd( + meths.nvim_cmd( { cmd = 'Foo', args = { 'a quick', 'brown fox', 'jumps over the', 'lazy dog' } }, { output = true } ) ) eq( [[{ 'test \\ \\\\ \\"""\\', 'more\\ tests\\" ' }]], - meths.cmd( + meths.nvim_cmd( { cmd = 'Foo', args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, { output = true } ) @@ -4701,13 +4744,13 @@ describe('API', function() 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')) + meths.nvim_cmd({ cmd = 'buffer', args = { 'foo.txt' } }, {}) + eq('foo.txt', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t')) + meths.nvim_cmd({ cmd = 'buffer', args = { 'bar.txt' } }, {}) + eq('bar.txt', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t')) end) it('triggers CmdUndefined event if command is not found', function() - meths.exec_lua( + meths.nvim_exec_lua( [[ vim.api.nvim_create_autocmd("CmdUndefined", { pattern = "Foo", @@ -4718,17 +4761,17 @@ describe('API', function() ]], {} ) - eq('foo', meths.cmd({ cmd = 'Foo' }, { output = true })) + eq('foo', meths.nvim_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.nvim_cmd, { cmd = 'winpos' }, {})) end) it('works with empty arguments list', function() - meths.cmd({ cmd = 'update' }, {}) - meths.cmd({ cmd = 'buffer', count = 0 }, {}) + meths.nvim_cmd({ cmd = 'update' }, {}) + meths.nvim_cmd({ cmd = 'buffer', count = 0 }, {}) end) it("doesn't suppress errors when used in keymapping", function() - meths.exec_lua( + meths.nvim_exec_lua( [[ vim.keymap.set("n", "[l", function() vim.api.nvim_cmd({ cmd = "echo", args = {"foo"} }, {}) end) @@ -4739,31 +4782,31 @@ describe('API', function() 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.cmd({ cmd = 'delete', range = { 0 } }, {}) + meths.nvim_buf_set_lines(0, 0, -1, false, { 'aa' }) + meths.nvim_cmd({ cmd = 'delete', range = { 0 } }, {}) command('undo') - eq({ 'aa' }, meths.buf_get_lines(0, 0, 1, false)) + eq({ 'aa' }, meths.nvim_buf_get_lines(0, 0, 1, false)) assert_alive() end) it('supports filename expansion', function() - meths.cmd({ cmd = 'argadd', args = { '%:p:h:t', '%:p:h:t' } }, {}) + meths.nvim_cmd({ cmd = 'argadd', args = { '%:p:h:t', '%:p:h:t' } }, {}) local arg = funcs.expand('%:p:h:t') eq({ arg, arg }, funcs.argv()) end) 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.nvim_cmd({ cmd = 'make' }, { output = true })) assert_alive() matches( '^:!echo foo bar', - meths.cmd({ cmd = 'make', args = { 'foo', 'bar' } }, { output = true }) + meths.nvim_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 }) + meths.nvim_cmd({ cmd = 'make', args = { '%:p:h:t', '%:p:h:t' } }, { output = true }) ) assert_alive() end) @@ -4773,7 +4816,7 @@ describe('API', function() screen:set_default_attr_ids({ [0] = { bold = true, foreground = Screen.colors.Blue }, }) - meths.cmd({ cmd = 'echo', args = { [['hello']] } }, { output = true }) + meths.nvim_cmd({ cmd = 'echo', args = { [['hello']] } }, { output = true }) screen:expect { grid = [[ ^ | @@ -4796,29 +4839,29 @@ describe('API', function() } 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.nvim_cmd({ cmd = 'echo', args = { 2 } }, { output = true })) + eq('1', meths.nvim_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() } }, {}) - eq(1, meths.get_current_buf().id) + meths.nvim_cmd({ cmd = 'bdelete', args = { meths.nvim_get_current_buf() } }, {}) + eq(1, meths.nvim_get_current_buf().id) end) it('works with :sleep using milliseconds', function() local start = uv.now() - meths.cmd({ cmd = 'sleep', args = { '100m' } }, {}) + meths.nvim_cmd({ cmd = 'sleep', args = { '100m' } }, {}) ok(uv.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()' } }, {}) + pcall_err(meths.nvim_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.nvim_cmd, { cmd = 'throw', args = { '42' } }, {})) end) it('can use :return #24556', function() exec([[ @@ -4829,8 +4872,8 @@ describe('API', function() endfunc let g:result = Foo() ]]) - eq('before', meths.get_var('pos')) - eq({ 1, 2, 3 }, meths.get_var('result')) + eq('before', meths.nvim_get_var('pos')) + eq({ 1, 2, 3 }, meths.nvim_get_var('result')) end) end) end) diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 2516e96be2..9542272447 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -53,9 +53,9 @@ describe('API/win', function() end) it('disallowed in cmdwin if win={old_}curwin or buf=curbuf', 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, { + local new_buf = meths.nvim_create_buf(true, true) + local old_win = meths.nvim_get_current_win() + local new_win = meths.nvim_open_win(new_buf, false, { relative = 'editor', row = 10, col = 10, @@ -65,20 +65,20 @@ describe('API/win', function() feed('q:') eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_set_buf, 0, new_buf) + pcall_err(meths.nvim_win_set_buf, 0, new_buf) ) eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_set_buf, old_win, new_buf) + pcall_err(meths.nvim_win_set_buf, old_win, new_buf) ) eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_set_buf, new_win, 0) + pcall_err(meths.nvim_win_set_buf, new_win, 0) ) - local next_buf = meths.create_buf(true, true) - meths.win_set_buf(new_win, next_buf) - eq(next_buf, meths.win_get_buf(new_win)) + local next_buf = meths.nvim_create_buf(true, true) + meths.nvim_win_set_buf(new_win, next_buf) + eq(next_buf, meths.nvim_win_get_buf(new_win)) end) end) @@ -94,7 +94,7 @@ describe('API/win', function() 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.nvim_win_set_cursor, 1, { 'b\na' })) end) it('updates the screen, and also when the window is unfocused', function() @@ -334,7 +334,7 @@ describe('API/win', function() call nvim_win_set_height(w, 5) ]]) feed('l') - eq('', meths.get_vvar('errmsg')) + eq('', meths.nvim_get_vvar('errmsg')) end) end) @@ -365,7 +365,7 @@ describe('API/win', function() call nvim_win_set_width(w, 5) ]]) feed('l') - eq('', meths.get_vvar('errmsg')) + eq('', meths.nvim_get_vvar('errmsg')) end) end) @@ -501,48 +501,48 @@ describe('API/win', function() describe('close', function() it('can close current window', function() - local oldwin = meths.get_current_win() + local oldwin = meths.nvim_get_current_win() command('split') - local newwin = meths.get_current_win() - meths.win_close(newwin, false) - eq({ oldwin }, meths.list_wins()) + local newwin = meths.nvim_get_current_win() + meths.nvim_win_close(newwin, false) + eq({ oldwin }, meths.nvim_list_wins()) end) it('can close noncurrent window', function() - local oldwin = meths.get_current_win() + local oldwin = meths.nvim_get_current_win() command('split') - local newwin = meths.get_current_win() - meths.win_close(oldwin, false) - eq({ newwin }, meths.list_wins()) + local newwin = meths.nvim_get_current_win() + meths.nvim_win_close(oldwin, false) + eq({ newwin }, meths.nvim_list_wins()) end) it("handles changed buffer when 'hidden' is unset", function() command('set nohidden') - local oldwin = meths.get_current_win() + local oldwin = meths.nvim_get_current_win() insert('text') command('new') - local newwin = meths.get_current_win() + local newwin = meths.nvim_get_current_win() eq( 'Vim:E37: No write since last change (add ! to override)', - pcall_err(meths.win_close, oldwin, false) + pcall_err(meths.nvim_win_close, oldwin, false) ) - eq({ newwin, oldwin }, meths.list_wins()) + eq({ newwin, oldwin }, meths.nvim_list_wins()) end) it('handles changed buffer with force', function() - local oldwin = meths.get_current_win() + local oldwin = meths.nvim_get_current_win() insert('text') command('new') - local newwin = meths.get_current_win() - meths.win_close(oldwin, true) - eq({ newwin }, meths.list_wins()) + local newwin = meths.nvim_get_current_win() + meths.nvim_win_close(oldwin, true) + eq({ newwin }, meths.nvim_list_wins()) end) it('in cmdline-window #9767', function() command('split') - eq(2, #meths.list_wins()) - local oldwin = meths.get_current_win() - local otherwin = meths.open_win(0, false, { + eq(2, #meths.nvim_list_wins()) + local oldwin = meths.nvim_get_current_win() + local otherwin = meths.nvim_open_win(0, false, { relative = 'editor', row = 10, col = 10, @@ -551,19 +551,19 @@ describe('API/win', function() }) -- Open cmdline-window. feed('q:') - eq(4, #meths.list_wins()) + eq(4, #meths.nvim_list_wins()) eq(':', funcs.getcmdwintype()) -- Not allowed to close previous window from cmdline-window. eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_close, oldwin, true) + pcall_err(meths.nvim_win_close, oldwin, true) ) -- Closing other windows is fine. - meths.win_close(otherwin, true) - eq(false, meths.win_is_valid(otherwin)) + meths.nvim_win_close(otherwin, true) + eq(false, meths.nvim_win_is_valid(otherwin)) -- Close cmdline-window. - meths.win_close(0, true) - eq(2, #meths.list_wins()) + meths.nvim_win_close(0, true) + eq(2, #meths.nvim_list_wins()) eq('', funcs.getcmdwintype()) end) @@ -572,7 +572,7 @@ describe('API/win', function() command('botright split') local prevwin = curwin().id eq(2, eval('tabpagenr()')) - local win = meths.open_win(0, true, { + local win = meths.nvim_open_win(0, true, { relative = 'editor', row = 10, col = 10, @@ -582,67 +582,67 @@ describe('API/win', function() local tab = eval('tabpagenr()') command('tabprevious') eq(1, eval('tabpagenr()')) - meths.win_close(win, false) + meths.nvim_win_close(win, false) - eq(prevwin, meths.tabpage_get_win(tab).id) + eq(prevwin, meths.nvim_tabpage_get_win(tab).id) assert_alive() end) end) describe('hide', function() it('can hide current window', function() - local oldwin = meths.get_current_win() + local oldwin = meths.nvim_get_current_win() command('split') - local newwin = meths.get_current_win() - meths.win_hide(newwin) - eq({ oldwin }, meths.list_wins()) + local newwin = meths.nvim_get_current_win() + meths.nvim_win_hide(newwin) + eq({ oldwin }, meths.nvim_list_wins()) end) it('can hide noncurrent window', function() - local oldwin = meths.get_current_win() + local oldwin = meths.nvim_get_current_win() command('split') - local newwin = meths.get_current_win() - meths.win_hide(oldwin) - eq({ newwin }, meths.list_wins()) + local newwin = meths.nvim_get_current_win() + meths.nvim_win_hide(oldwin) + eq({ newwin }, meths.nvim_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, { + local oldwin = meths.nvim_get_current_win() + local oldbuf = meths.nvim_get_current_buf() + local buf = meths.nvim_create_buf(true, false) + local newwin = meths.nvim_open_win(buf, true, { 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()) + meths.nvim_win_hide(newwin) + eq({ oldwin }, meths.nvim_list_wins()) + eq({ oldbuf, buf }, meths.nvim_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, { + local oldwin = meths.nvim_get_current_win() + local oldbuf = meths.nvim_get_current_buf() + local buf = meths.nvim_create_buf(true, false).id + local newwin = meths.nvim_open_win(buf, true, { relative = 'win', row = 3, col = 3, width = 12, height = 3, }) - meths.set_option_value('bufhidden', 'wipe', { buf = buf }) - meths.win_hide(newwin) - eq({ oldwin }, meths.list_wins()) - eq({ oldbuf }, meths.list_bufs()) + meths.nvim_set_option_value('bufhidden', 'wipe', { buf = buf }) + meths.nvim_win_hide(newwin) + eq({ oldwin }, meths.nvim_list_wins()) + eq({ oldbuf }, meths.nvim_list_bufs()) end) it('in the cmdwin', function() feed('q:') -- Can close the cmdwin. - meths.win_hide(0) + meths.nvim_win_hide(0) eq('', funcs.getcmdwintype()) - local old_win = meths.get_current_win() - local other_win = meths.open_win(0, false, { + local old_win = meths.nvim_get_current_win() + local other_win = meths.nvim_open_win(0, false, { relative = 'win', row = 3, col = 3, @@ -653,24 +653,24 @@ describe('API/win', function() -- Cannot close the previous window. eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.win_hide, old_win) + pcall_err(meths.nvim_win_hide, old_win) ) -- Can close other windows. - meths.win_hide(other_win) - eq(false, meths.win_is_valid(other_win)) + meths.nvim_win_hide(other_win) + eq(false, meths.nvim_win_is_valid(other_win)) end) end) describe('text_height', function() it('validation', function() - local X = meths.get_vvar('maxcol') + local X = meths.nvim_get_vvar('maxcol') insert([[ aaa bbb ccc ddd eee]]) - eq('Invalid window id: 23', pcall_err(meths.win_text_height, 23, {})) + eq('Invalid window id: 23', pcall_err(meths.nvim_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 })) @@ -713,7 +713,7 @@ describe('API/win', function() end) it('with two diff windows', function() - local X = meths.get_vvar('maxcol') + local X = meths.nvim_get_vvar('maxcol') local screen = Screen.new(45, 22) screen:set_default_attr_ids({ [0] = { foreground = Screen.colors.Blue1, bold = true }, @@ -775,70 +775,88 @@ describe('API/win', function() | ]], } - 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 })) - eq({ all = 20, fill = 5 }, meths.win_text_height(1001, { start_row = 0 })) - eq({ all = 15, fill = 0 }, meths.win_text_height(1000, { end_row = -1 })) - eq({ all = 15, fill = 0 }, meths.win_text_height(1000, { end_row = 40 })) - eq({ all = 20, fill = 5 }, meths.win_text_height(1001, { end_row = -1 })) - eq({ all = 20, fill = 5 }, meths.win_text_height(1001, { end_row = 40 })) - eq({ all = 10, fill = 5 }, meths.win_text_height(1000, { start_row = 23 })) - eq({ all = 13, fill = 3 }, meths.win_text_height(1001, { start_row = 18 })) - eq({ all = 11, fill = 0 }, meths.win_text_height(1000, { end_row = 23 })) - eq({ all = 11, fill = 5 }, meths.win_text_height(1001, { end_row = 18 })) - eq({ all = 11, fill = 0 }, meths.win_text_height(1000, { start_row = 3, end_row = 39 })) - eq({ all = 11, fill = 3 }, meths.win_text_height(1001, { start_row = 1, end_row = 34 })) - eq({ all = 9, fill = 0 }, meths.win_text_height(1000, { start_row = 4, end_row = 38 })) - eq({ all = 9, fill = 3 }, meths.win_text_height(1001, { start_row = 2, end_row = 33 })) - eq({ all = 9, fill = 0 }, meths.win_text_height(1000, { start_row = 5, end_row = 37 })) - eq({ all = 9, fill = 3 }, meths.win_text_height(1001, { start_row = 3, end_row = 32 })) - eq({ all = 9, fill = 0 }, meths.win_text_height(1000, { start_row = 17, end_row = 25 })) - eq({ all = 9, fill = 3 }, meths.win_text_height(1001, { start_row = 15, end_row = 20 })) - eq({ all = 7, fill = 0 }, meths.win_text_height(1000, { start_row = 18, end_row = 24 })) - 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 = 20, fill = 5 }, meths.nvim_win_text_height(1000, {})) + eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, {})) + eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1000, { start_row = 0 })) + eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, { start_row = 0 })) + eq({ all = 15, fill = 0 }, meths.nvim_win_text_height(1000, { end_row = -1 })) + eq({ all = 15, fill = 0 }, meths.nvim_win_text_height(1000, { end_row = 40 })) + eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = -1 })) + eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = 40 })) + eq({ all = 10, fill = 5 }, meths.nvim_win_text_height(1000, { start_row = 23 })) + eq({ all = 13, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 18 })) + eq({ all = 11, fill = 0 }, meths.nvim_win_text_height(1000, { end_row = 23 })) + eq({ all = 11, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = 18 })) + eq({ all = 11, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 3, end_row = 39 })) + eq({ all = 11, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 1, end_row = 34 })) + eq({ all = 9, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 4, end_row = 38 })) + eq({ all = 9, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 2, end_row = 33 })) + eq({ all = 9, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 5, end_row = 37 })) + eq({ all = 9, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 3, end_row = 32 })) + eq({ all = 9, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 17, end_row = 25 })) + eq({ all = 9, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 15, end_row = 20 })) + eq({ all = 7, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 18, end_row = 24 })) + eq({ all = 7, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 16, end_row = 19 })) + eq({ all = 6, fill = 5 }, meths.nvim_win_text_height(1000, { start_row = -1 })) + eq( + { all = 5, fill = 5 }, + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 = 3, fill = 2 }, meths.nvim_win_text_height(1001, { end_row = 0 })) + eq({ all = 2, fill = 2 }, meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 = 11, fill = 5 }, meths.nvim_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 }) + meths.nvim_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 = 10, fill = 5 }, meths.nvim_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 }) + meths.nvim_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 X = meths.nvim_get_vvar('maxcol') local screen = Screen.new(45, 22) screen:set_default_attr_ids({ [0] = { foreground = Screen.colors.Blue1, bold = true }, @@ -850,15 +868,15 @@ describe('API/win', function() set number cpoptions+=n call setline(1, repeat([repeat('foobar-', 36)], 3)) ]]) - local ns = meths.create_namespace('') - meths.buf_set_extmark( + local ns = meths.nvim_create_namespace('') + meths.nvim_buf_set_extmark( 0, ns, 1, 100, { virt_text = { { ('?'):rep(15), 'Search' } }, virt_text_pos = 'inline' } ) - meths.buf_set_extmark( + meths.nvim_buf_set_extmark( 0, ns, 2, @@ -898,113 +916,155 @@ describe('API/win', function() | ]], } - 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 = 21, fill = 0 }, meths.nvim_win_text_height(0, {})) + eq({ all = 6, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, end_row = 0 })) + eq({ all = 7, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 1, end_row = 1 })) + eq({ all = 8, fill = 0 }, meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 = 18, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 131 })) + eq({ all = 19, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 130 })) + eq({ all = 20, fill = 0 }, meths.nvim_win_text_height(0, { end_row = 2, end_vcol = 311 })) + eq({ all = 21, fill = 0 }, meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_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 = 16, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 221 })) + eq({ all = 17, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 220 })) + eq({ all = 14, fill = 0 }, meths.nvim_win_text_height(0, { end_row = 2, end_vcol = 41 })) + eq({ all = 15, fill = 0 }, meths.nvim_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 }) + meths.nvim_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 }) + meths.nvim_win_text_height( + 0, + { start_row = 0, start_vcol = 220, end_row = 2, end_vcol = 42 } + ) ) end) end) @@ -1012,7 +1072,7 @@ describe('API/win', function() describe('open_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, { + meths.nvim_open_win(meths.nvim_create_buf(true, true), true, { relative = 'win', row = 3, col = 3, @@ -1021,7 +1081,7 @@ describe('API/win', function() noautocmd = true, }) eq(0, funcs.exists('g:fired')) - meths.open_win(meths.create_buf(true, true), true, { + meths.nvim_open_win(meths.nvim_create_buf(true, true), true, { relative = 'win', row = 3, col = 3, @@ -1032,11 +1092,11 @@ describe('API/win', function() end) it('disallowed in cmdwin if enter=true or buf=curbuf', function() - local new_buf = meths.create_buf(true, true) + local new_buf = meths.nvim_create_buf(true, true) feed('q:') eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.open_win, new_buf, true, { + pcall_err(meths.nvim_open_win, new_buf, true, { relative = 'editor', row = 5, col = 5, @@ -1046,7 +1106,7 @@ describe('API/win', function() ) eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.open_win, 0, false, { + pcall_err(meths.nvim_open_win, 0, false, { relative = 'editor', row = 5, col = 5, @@ -1057,7 +1117,7 @@ describe('API/win', function() eq( new_buf, - meths.win_get_buf(meths.open_win(new_buf, false, { + meths.nvim_win_get_buf(meths.nvim_open_win(new_buf, false, { relative = 'editor', row = 5, col = 5, @@ -1068,10 +1128,10 @@ describe('API/win', function() end) it('aborts if buffer is invalid', function() - local wins_before = meths.list_wins() + local wins_before = meths.nvim_list_wins() eq( 'Invalid buffer id: 1337', - pcall_err(meths.open_win, 1337, false, { + pcall_err(meths.nvim_open_win, 1337, false, { relative = 'editor', row = 5, col = 5, @@ -1079,14 +1139,14 @@ describe('API/win', function() height = 5, }) ) - eq(wins_before, meths.list_wins()) + eq(wins_before, meths.nvim_list_wins()) end) end) describe('get_config', function() it('includes border', function() local b = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' } - local win = meths.open_win(0, true, { + local win = meths.nvim_open_win(0, true, { relative = 'win', row = 3, col = 3, @@ -1095,7 +1155,7 @@ describe('API/win', function() border = b, }) - local cfg = meths.win_get_config(win) + local cfg = meths.nvim_win_get_config(win) eq(b, cfg.border) end) @@ -1110,7 +1170,7 @@ describe('API/win', function() { 'g', 'Constant' }, { 'h', 'PreProc' }, } - local win = meths.open_win(0, true, { + local win = meths.nvim_open_win(0, true, { relative = 'win', row = 3, col = 3, @@ -1119,14 +1179,14 @@ describe('API/win', function() border = b, }) - local cfg = meths.win_get_config(win) + local cfg = meths.nvim_win_get_config(win) eq(b, cfg.border) end) it('includes title and footer', function() local title = { { 'A', { 'StatusLine', 'TabLine' } }, { 'B' }, { 'C', 'WinBar' } } local footer = { { 'A', 'WinBar' }, { 'B' }, { 'C', { 'StatusLine', 'TabLine' } } } - local win = meths.open_win(0, true, { + local win = meths.nvim_open_win(0, true, { relative = 'win', row = 3, col = 3, @@ -1137,7 +1197,7 @@ describe('API/win', function() footer = footer, }) - local cfg = meths.win_get_config(win) + local cfg = meths.nvim_win_get_config(win) eq(title, cfg.title) eq(footer, cfg.footer) end) @@ -1145,7 +1205,7 @@ describe('API/win', function() describe('set_config', function() it('no crash with invalid title', function() - local win = meths.open_win(0, true, { + local win = meths.nvim_open_win(0, true, { width = 10, height = 10, relative = 'editor', @@ -1156,14 +1216,14 @@ describe('API/win', function() }) eq( 'title/footer cannot be an empty array', - pcall_err(meths.win_set_config, win, { title = {} }) + pcall_err(meths.nvim_win_set_config, win, { title = {} }) ) command('redraw!') assert_alive() end) it('no crash with invalid footer', function() - local win = meths.open_win(0, true, { + local win = meths.nvim_open_win(0, true, { width = 10, height = 10, relative = 'editor', @@ -1174,7 +1234,7 @@ describe('API/win', function() }) eq( 'title/footer cannot be an empty array', - pcall_err(meths.win_set_config, win, { footer = {} }) + pcall_err(meths.nvim_win_set_config, win, { footer = {} }) ) command('redraw!') assert_alive() -- cgit From 4f81f506f96f8b5bfcf00e952ceb492d3ce9dc6e Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 12 Jan 2024 13:11:28 +0000 Subject: test: normalise nvim bridge functions - remove helpers.cur*meths - remove helpers.nvim --- test/functional/api/autocmd_spec.lua | 12 +- test/functional/api/buffer_spec.lua | 505 ++++++------ test/functional/api/buffer_updates_spec.lua | 68 +- test/functional/api/command_spec.lua | 30 +- test/functional/api/extmark_spec.lua | 64 +- test/functional/api/highlight_spec.lua | 26 +- test/functional/api/keymap_spec.lua | 76 +- test/functional/api/server_notifications_spec.lua | 22 +- test/functional/api/server_requests_spec.lua | 36 +- test/functional/api/tabpage_spec.lua | 71 +- test/functional/api/vim_spec.lua | 934 +++++++++++----------- test/functional/api/window_spec.lua | 274 ++++--- 12 files changed, 1065 insertions(+), 1053 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/autocmd_spec.lua b/test/functional/api/autocmd_spec.lua index 79a524d9eb..47cb8bfd54 100644 --- a/test/functional/api/autocmd_spec.lua +++ b/test/functional/api/autocmd_spec.lua @@ -109,12 +109,12 @@ describe('autocmd api', function() buffer = 0, }) - meths.nvim_command 'set filetype=txt' + command 'set filetype=txt' eq(1, meths.nvim_get_var('called')) -- switch to a new buffer - meths.nvim_command 'new' - meths.nvim_command 'set filetype=python' + command 'new' + command 'set filetype=python' eq(1, meths.nvim_get_var('called')) end) @@ -938,7 +938,7 @@ describe('autocmd api', function() meths.nvim_exec_autocmds('CursorHold', { buffer = 1 }) eq('none', meths.nvim_get_var('filename_executed')) - meths.nvim_command('edit __init__.py') + command('edit __init__.py') eq('__init__.py', meths.nvim_get_var('filename_executed')) end) @@ -955,8 +955,8 @@ describe('autocmd api', function() meths.nvim_set_var('filename_executed', 'none') eq('none', meths.nvim_get_var('filename_executed')) - meths.nvim_command('edit other_file.txt') - meths.nvim_command('edit __init__.py') + command('edit other_file.txt') + command('edit __init__.py') eq('none', meths.nvim_get_var('filename_executed')) meths.nvim_create_autocmd('CursorHoldI', { diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index c71853b574..b1b4c9f583 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -1,8 +1,8 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') -local clear, nvim, buffer = helpers.clear, helpers.nvim, helpers.buffer -local curbuf, curwin, eq = helpers.curbuf, helpers.curwin, helpers.eq -local curbufmeths, ok = helpers.curbufmeths, helpers.ok +local clear = helpers.clear +local eq = helpers.eq +local ok = helpers.ok local describe_lua_and_rpc = helpers.describe_lua_and_rpc(describe) local meths = helpers.meths local funcs = helpers.funcs @@ -13,7 +13,6 @@ local feed_command = helpers.feed_command local insert = helpers.insert local NIL = vim.NIL local command = helpers.command -local bufmeths = helpers.bufmeths local feed = helpers.feed local pcall_err = helpers.pcall_err local assert_alive = helpers.assert_alive @@ -51,48 +50,54 @@ describe('api/buf', function() 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' }) + meths.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) -- Set the current cursor to {3, 2}. - curwin('set_cursor', { 3, 2 }) + meths.nvim_win_set_cursor(0, { 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' }) + meths.nvim_buf_set_lines(0, 1, 2, true, { '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' }, meths.nvim_buf_get_lines(0, 0, -1, true)) -- cursor should be moved below by 1 line. - eq({ 4, 2 }, curwin('get_cursor')) + eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) -- add a line after the current cursor position. - request('nvim_buf_set_lines', 0, 5, 5, 1, { 'line7' }) + meths.nvim_buf_set_lines(0, 5, 5, true, { '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' }, + meths.nvim_buf_get_lines(0, 0, -1, true) + ) -- cursor position is unchanged. - eq({ 4, 2 }, curwin('get_cursor')) + eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) -- overwrite current cursor line. - request('nvim_buf_set_lines', 0, 3, 5, 1, { 'line8', 'line9' }) + meths.nvim_buf_set_lines(0, 3, 5, true, { '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' }, + meths.nvim_buf_get_lines(0, 0, -1, true) + ) -- cursor position is unchanged. - eq({ 4, 2 }, curwin('get_cursor')) + eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) -- delete current cursor line. - request('nvim_buf_set_lines', 0, 3, 5, 1, {}) + meths.nvim_buf_set_lines(0, 3, 5, true, {}) -- 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' }, meths.nvim_buf_get_lines(0, 0, -1, true)) -- cursor position is unchanged. - eq({ 4, 2 }, curwin('get_cursor')) + eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) end) it('cursor position is maintained in non-current window', function() - meths.nvim_buf_set_lines(0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) meths.nvim_win_set_cursor(0, { 3, 2 }) local win = meths.nvim_get_current_win() local buf = meths.nvim_get_current_buf() command('new') - meths.nvim_buf_set_lines(buf, 1, 2, 1, { 'line5', 'line6' }) + meths.nvim_buf_set_lines(buf, 1, 2, true, { 'line5', 'line6' }) eq( { 'line1', 'line5', 'line6', 'line3', 'line4' }, meths.nvim_buf_get_lines(buf, 0, -1, true) @@ -101,7 +106,7 @@ describe('api/buf', function() end) it('cursor position is maintained in TWO non-current windows', function() - meths.nvim_buf_set_lines(0, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) meths.nvim_win_set_cursor(0, { 3, 2 }) local win = meths.nvim_get_current_win() local buf = meths.nvim_get_current_buf() @@ -113,7 +118,7 @@ describe('api/buf', function() -- set current window to third one with another buffer command('new') - meths.nvim_buf_set_lines(buf, 1, 2, 1, { 'line5', 'line6' }) + meths.nvim_buf_set_lines(buf, 1, 2, true, { 'line5', 'line6' }) eq( { 'line1', 'line5', 'line6', 'line3', 'line4' }, meths.nvim_buf_get_lines(buf, 0, -1, true) @@ -124,32 +129,32 @@ describe('api/buf', function() 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') + local bufnr = meths.nvim_buf_get_number(0) -- replace the buffer contents with these three lines - request('nvim_buf_set_lines', bufnr, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) -- check the line count is correct - eq(4, request('nvim_buf_line_count', bufnr)) + eq(4, meths.nvim_buf_line_count(bufnr)) -- force unload the buffer (this will discard changes) command('new') command('bunload! ' .. bufnr) -- line count for an unloaded buffer should always be 0 - eq(0, request('nvim_buf_line_count', bufnr)) + eq(0, meths.nvim_buf_line_count(bufnr)) end) it('get_lines has defined behaviour for unloaded buffers', function() -- we'll need to know our bufnr for when it gets unloaded - local bufnr = curbuf('get_number') + local bufnr = meths.nvim_buf_get_number(0) -- replace the buffer contents with these three lines - buffer('set_lines', bufnr, 0, -1, 1, { 'line1', 'line2', 'line3', 'line4' }) + meths.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) -- confirm that getting lines works - eq({ 'line2', 'line3' }, buffer('get_lines', bufnr, 1, 3, 1)) + eq({ 'line2', 'line3' }, meths.nvim_buf_get_lines(bufnr, 1, 3, true)) -- force unload the buffer (this will discard changes) command('new') command('bunload! ' .. bufnr) -- attempting to get lines now always gives empty list - eq({}, buffer('get_lines', bufnr, 1, 3, 1)) + eq({}, meths.nvim_buf_get_lines(bufnr, 1, 3, true)) -- it's impossible to get out-of-bounds errors for an unloaded buffer - eq({}, buffer('get_lines', bufnr, 8888, 9999, 1)) + eq({}, meths.nvim_buf_get_lines(bufnr, 8888, 9999, true)) end) describe('handles topline', function() @@ -166,7 +171,7 @@ describe('api/buf', function() 0, 0, -1, - 1, + true, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' } ) meths.nvim_set_option_value('modified', false, {}) @@ -516,15 +521,23 @@ describe('api/buf', function() end) describe_lua_and_rpc('nvim_buf_get_lines, nvim_buf_set_lines', function(api) - local get_lines = api.curbufmeths.get_lines - local set_lines = api.curbufmeths.set_lines - local line_count = api.curbufmeths.line_count + local function get_lines(...) + return api.meths.nvim_buf_get_lines(0, ...) + end + + local function set_lines(...) + return api.meths.nvim_buf_set_lines(0, ...) + end + + local function line_count() + return api.meths.nvim_buf_line_count(0) + end it('fails correctly when input is not valid', function() - eq(1, api.curbufmeths.get_number()) + eq(1, api.meths.nvim_buf_get_number(0)) eq( [['replacement string' item contains newlines]], - pcall_err(bufmeths.set_lines, 1, 1, 2, false, { 'b\na' }) + pcall_err(api.meths.nvim_buf_set_lines, 1, 1, 2, false, { 'b\na' }) ) end) @@ -532,7 +545,7 @@ describe('api/buf', function() command('set nomodifiable') eq( [[Buffer is not 'modifiable']], - pcall_err(api.bufmeths.set_lines, 1, 1, 2, false, { 'a', 'b' }) + pcall_err(api.meths.nvim_buf_set_lines, 1, 1, 2, false, { 'a', 'b' }) ) end) @@ -726,7 +739,7 @@ describe('api/buf', function() end) it('set_lines on unloaded buffer #8659 #22670', function() - local bufnr = curbuf('get_number') + local bufnr = meths.nvim_buf_get_number(0) meths.nvim_buf_set_lines(bufnr, 0, -1, false, { 'a', 'b', 'c' }) meths.nvim_buf_set_name(bufnr, 'set_lines') finally(function() @@ -742,7 +755,13 @@ describe('api/buf', function() end) describe('nvim_buf_set_text', function() - local get_lines, set_text = curbufmeths.get_lines, curbufmeths.set_text + local function get_lines(...) + return meths.nvim_buf_get_lines(0, ...) + end + + local function set_text(...) + return meths.nvim_buf_set_text(0, ...) + end it('works', function() insert([[ @@ -821,12 +840,12 @@ describe('api/buf', function() ]]) -- position the cursor on `!` - curwin('set_cursor', { 1, 11 }) + meths.nvim_win_set_cursor(0, { 1, 11 }) -- replace 'world' with '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 }, meths.nvim_win_get_cursor(0)) end) it('updates the cursor position in non-current window', function() @@ -879,12 +898,12 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'c' - curwin('set_cursor', { 1, 2 }) + meths.nvim_win_set_cursor(0, { 1, 2 }) -- add 'xxx' before 'c' 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 }, meths.nvim_win_get_cursor(0)) end) it('updates the cursor position only in non-current window when in INSERT mode', function() @@ -892,7 +911,7 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'c' - curwin('set_cursor', { 1, 2 }) + meths.nvim_win_set_cursor(0, { 1, 2 }) -- open vertical split feed('v') -- get into INSERT mode to treat cursor @@ -902,13 +921,13 @@ describe('api/buf', function() 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 }, meths.nvim_win_get_cursor(0)) -- quit INSERT mode feed('') -- close current window feed('c') -- in another window cursor should be on 'c' - eq({ 1, 5 }, curwin('get_cursor')) + eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) end) end) @@ -918,12 +937,12 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'b' - curwin('set_cursor', { 1, 1 }) + meths.nvim_win_set_cursor(0, { 1, 1 }) -- delete 'b' set_text(0, 1, 0, 2, {}) eq({ 'acd' }, get_lines(0, -1, true)) -- cursor is now on 'c' - eq({ 1, 1 }, curwin('get_cursor')) + eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) end) it('maintains INSERT-mode cursor position current/non-current window', function() @@ -931,7 +950,7 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'b' - curwin('set_cursor', { 1, 1 }) + meths.nvim_win_set_cursor(0, { 1, 1 }) -- open vertical split feed('v') -- get into INSERT mode to treat cursor @@ -941,13 +960,13 @@ describe('api/buf', function() set_text(0, 1, 0, 2, {}) 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 }, meths.nvim_win_get_cursor(0)) -- quit INSERT mode feed('') -- close current window feed('c') -- cursor in non-current window should stay on 'c' - eq({ 1, 1 }, curwin('get_cursor')) + eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) end) end) @@ -959,7 +978,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on ' ' before 'first' - curwin('set_cursor', { 1, 14 }) + meths.nvim_win_set_cursor(0, { 1, 14 }) set_text(0, 15, 2, 11, { 'the line we do not want', @@ -971,7 +990,7 @@ 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 }, meths.nvim_win_get_cursor(0)) end) it('maintains cursor position if at start_row and column is still valid', function() @@ -981,7 +1000,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'f' in 'first' - curwin('set_cursor', { 1, 15 }) + meths.nvim_win_set_cursor(0, { 1, 15 }) set_text(0, 15, 2, 11, { 'the line we do not want', @@ -993,7 +1012,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 }, meths.nvim_win_get_cursor(0)) end) it('adjusts cursor column to keep it valid if start_row got smaller', function() @@ -1003,7 +1022,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 't' in 'first' - curwin('set_cursor', { 1, 19 }) + meths.nvim_win_set_cursor(0, { 1, 19 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 24, {'last'}) @@ -1012,7 +1031,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 18 }, cursor) end) @@ -1024,7 +1043,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 't' in 'first' - curwin('set_cursor', { 1, 19 }) + meths.nvim_win_set_cursor(0, { 1, 19 }) -- enter INSERT mode to treat cursor as being after 't' feed('a') @@ -1035,7 +1054,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 19 }, cursor) end) @@ -1047,7 +1066,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'w' in 'want' - curwin('set_cursor', { 2, 31 }) + meths.nvim_win_set_cursor(0, { 2, 31 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { @@ -1064,7 +1083,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 5 }, cursor) end) @@ -1078,7 +1097,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'w' in 'want' - curwin('set_cursor', { 2, 31 }) + meths.nvim_win_set_cursor(0, { 2, 31 }) -- enter INSERT mode feed('a') @@ -1097,7 +1116,7 @@ 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, 6 }, curwin('get_cursor')) + eq({ 2, 6 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 6 }, cursor) end @@ -1110,7 +1129,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'n' in 'finally' - curwin('set_cursor', { 3, 6 }) + meths.nvim_win_set_cursor(0, { 3, 6 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { @@ -1126,7 +1145,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 12 }, cursor) end) @@ -1138,7 +1157,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'r' in 'there' - curwin('set_cursor', { 2, 8 }) + meths.nvim_win_set_cursor(0, { 2, 8 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 12, {}) @@ -1147,7 +1166,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 15 }, cursor) end) @@ -1159,7 +1178,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'r' in 'there' - curwin('set_cursor', { 2, 8 }) + meths.nvim_win_set_cursor(0, { 2, 8 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 2, 4, {}) @@ -1168,7 +1187,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 0 }, cursor) end) @@ -1180,7 +1199,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' in 'finally' - curwin('set_cursor', { 3, 10 }) + meths.nvim_win_set_cursor(0, { 3, 10 }) set_text(0, 15, 2, 11, { '1', 'this 2', 'and then' }) eq({ @@ -1189,7 +1208,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 }, meths.nvim_win_get_cursor(0)) end) it( @@ -1201,7 +1220,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' at 'finally' - curwin('set_cursor', { 3, 10 }) + meths.nvim_win_set_cursor(0, { 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' }) @@ -1212,7 +1231,7 @@ describe('api/buf', function() 'and then the last one', }, get_lines(0, -1, true)) -- cursor should end up after 'n' in 'then' - eq({ 3, 8 }, curwin('get_cursor')) + eq({ 3, 8 }, meths.nvim_win_get_cursor(0)) end ) @@ -1223,7 +1242,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' in 'finally' - curwin('set_cursor', { 3, 10 }) + meths.nvim_win_set_cursor(0, { 3, 10 }) set_text(2, 4, 2, 11, { 'then' }) eq({ @@ -1232,7 +1251,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 }, meths.nvim_win_get_cursor(0)) end) it('does not move cursor column after end of a line', function() @@ -1241,7 +1260,7 @@ describe('api/buf', function() !!!]]) -- position cursor on the last '1' - curwin('set_cursor', { 2, 2 }) + meths.nvim_win_set_cursor(0, { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 33, 1, 3, {}) @@ -1250,7 +1269,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 32 }, cursor) end) @@ -1259,7 +1278,7 @@ describe('api/buf', function() insert('\n!!!') -- position cursor on the last '1' - curwin('set_cursor', { 2, 2 }) + meths.nvim_win_set_cursor(0, { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 1, 3, {}) @@ -1268,7 +1287,7 @@ describe('api/buf', function() eq({ '' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({ 1, 0 }, curwin('get_cursor')) + eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 0 }, cursor) end) @@ -1281,7 +1300,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'want' - curwin('set_cursor', { 2, 34 }) + meths.nvim_win_set_cursor(0, { 2, 34 }) -- turn on virtualedit command('set virtualedit=all') @@ -1299,7 +1318,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 12 }, cursor) -- coladd should be 0 @@ -1318,7 +1337,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'want' - curwin('set_cursor', { 2, 34 }) + meths.nvim_win_set_cursor(0, { 2, 34 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1339,7 +1358,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- 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 @@ -1360,7 +1379,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'first' - curwin('set_cursor', { 1, 19 }) + meths.nvim_win_set_cursor(0, { 1, 19 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1381,7 +1400,7 @@ 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({ 1, 38 }, curwin('get_cursor')) + eq({ 1, 38 }, meths.nvim_win_get_cursor(0)) -- 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 @@ -1403,7 +1422,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'first' - curwin('set_cursor', { 1, 19 }) + meths.nvim_win_set_cursor(0, { 1, 19 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol just a bit @@ -1424,7 +1443,7 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay at the same screen column - eq({ 1, 22 }, curwin('get_cursor')) + eq({ 1, 22 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 22 }, cursor) -- coladd should become 0 @@ -1447,7 +1466,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 'e' in 'more' - curwin('set_cursor', { 3, 11 }) + meths.nvim_win_set_cursor(0, { 3, 11 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1468,7 +1487,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- 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 @@ -1491,17 +1510,17 @@ describe('api/buf', function() line]]) -- position the cursor on 'i' - curwin('set_cursor', { 3, 2 }) + meths.nvim_win_set_cursor(0, { 3, 2 }) set_text(1, 6, 2, 0, {}) eq({ 'first line', 'second line' }, get_lines(0, -1, true)) -- cursor should stay on 'i' - eq({ 2, 8 }, curwin('get_cursor')) + eq({ 2, 8 }, meths.nvim_win_get_cursor(0)) -- add a newline back 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 }, meths.nvim_win_get_cursor(0)) end) it( @@ -1513,11 +1532,11 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'h' in 'the' - curwin('set_cursor', { 3, 13 }) + meths.nvim_win_set_cursor(0, { 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')) + eq({ 1, 16 }, meths.nvim_win_get_cursor(0)) -- add deleted lines back set_text(0, 14, 0, 14, { ' first', @@ -1530,7 +1549,7 @@ describe('api/buf', function() 'and finally the last one', }, get_lines(0, -1, true)) -- cursor should return back to the original position - eq({ 3, 13 }, curwin('get_cursor')) + eq({ 3, 13 }, meths.nvim_win_get_cursor(0)) end ) @@ -1543,7 +1562,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 's' in 'last' - curwin('set_cursor', { 3, 18 }) + meths.nvim_win_set_cursor(0, { 3, 18 }) set_text(0, 15, 2, 11, { 'the line we do not want', 'but hopefully', @@ -1554,7 +1573,7 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay on 's' - eq({ 2, 20 }, curwin('get_cursor')) + eq({ 2, 20 }, meths.nvim_win_get_cursor(0)) set_text(0, 15, 1, 13, { 'first', @@ -1568,7 +1587,7 @@ describe('api/buf', function() 'and finally the last one', }, get_lines(0, -1, true)) -- cursor should return back to the original position - eq({ 3, 18 }, curwin('get_cursor')) + eq({ 3, 18 }, meths.nvim_win_get_cursor(0)) end ) @@ -1578,7 +1597,7 @@ describe('api/buf', function() ]]) -- position cursor at the empty line - curwin('set_cursor', { 2, 0 }) + meths.nvim_win_set_cursor(0, { 2, 0 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 33, 1, 0, {'!'}) @@ -1587,7 +1606,7 @@ 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 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 33 }, cursor) end) @@ -1598,7 +1617,7 @@ describe('api/buf', function() eq({ '', '' }, get_lines(0, -1, true)) -- position cursor on the last '1' - curwin('set_cursor', { 2, 2 }) + meths.nvim_win_set_cursor(0, { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 1, 0, {''}) @@ -1607,7 +1626,7 @@ describe('api/buf', function() eq({ '' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({ 1, 0 }, curwin('get_cursor')) + eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 0 }, cursor) end) @@ -1619,46 +1638,46 @@ describe('api/buf', function() end) it('adjusts extmarks', function() - local ns = request('nvim_create_namespace', 'my-fancy-plugin') + local ns = meths.nvim_create_namespace('my-fancy-plugin') insert([[ foo bar baz ]]) - local id1 = curbufmeths.set_extmark(ns, 0, 1, {}) - local id2 = curbufmeths.set_extmark(ns, 0, 7, {}) - local id3 = curbufmeths.set_extmark(ns, 1, 1, {}) + local id1 = meths.nvim_buf_set_extmark(0, ns, 0, 1, {}) + local id2 = meths.nvim_buf_set_extmark(0, ns, 0, 7, {}) + local id3 = meths.nvim_buf_set_extmark(0, ns, 1, 1, {}) set_text(0, 4, 0, 7, { 'q' }) 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 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) -- mark gets shifted back because the replacement was shorter - eq({ 0, 5 }, curbufmeths.get_extmark_by_id(ns, id2, {})) + eq({ 0, 5 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) -- mark on the next line is unaffected - eq({ 1, 1 }, curbufmeths.get_extmark_by_id(ns, id3, {})) + eq({ 1, 1 }, meths.nvim_buf_get_extmark_by_id(0, 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, {})) + eq({ 0, 6 }, meths.nvim_buf_get_extmark_by_id(0, ns, id3, {})) -- but mark before replacement point is still unaffected - eq({ 0, 1 }, curbufmeths.get_extmark_by_id(ns, id1, {})) + eq({ 0, 1 }, meths.nvim_buf_get_extmark_by_id(0, 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 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) -- marks should be put back into the same place after undoing 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 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) + eq({ 0, 6 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) + eq({ 0, 6 }, meths.nvim_buf_get_extmark_by_id(0, 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, {})) + eq({ 0, 3 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) + eq({ 0, 8 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) + eq({ 0, 8 }, meths.nvim_buf_get_extmark_by_id(0, ns, id3, {})) end) it('correctly marks changed region for redraw #13890', function() @@ -1670,7 +1689,7 @@ describe('api/buf', function() BBB ]]) - curbufmeths.set_text(0, 0, 1, 3, { 'XXX', 'YYY' }) + meths.nvim_buf_set_text(0, 0, 0, 1, 3, { 'XXX', 'YYY' }) screen:expect([[ XXX | @@ -1727,7 +1746,7 @@ describe('api/buf', function() 0, 0, -1, - 1, + true, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' } ) meths.nvim_set_option_value('modified', false, {}) @@ -1854,7 +1873,7 @@ describe('api/buf', function() end) describe_lua_and_rpc('nvim_buf_get_text', function(api) - local get_text = api.curbufmeths.get_text + local get_text = api.meths.nvim_buf_get_text before_each(function() insert([[ hello foo! @@ -1863,105 +1882,105 @@ 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, 0, 5, {})) + eq({ 'hello foo!' }, get_text(0, 0, 0, 0, 42, {})) + eq({ 'foo!' }, get_text(0, 0, 6, 0, 10, {})) + eq({ 'foo!', 'tex' }, get_text(0, 0, 6, 1, 3, {})) + eq({ 'foo!', 'tex' }, get_text(0, -3, 6, -2, 3, {})) + eq({ '' }, get_text(0, 0, 18, 0, 20, {})) + eq({ 'ext' }, get_text(0, -2, 1, -2, 4, {})) + eq({ 'hello foo!', 'text', 'm' }, get_text(0, 0, 0, 2, 1, {})) end) it('errors on out-of-range', function() - eq('Index out of bounds', pcall_err(get_text, 2, 0, 4, 0, {})) - eq('Index out of bounds', pcall_err(get_text, -4, 0, 0, 0, {})) - eq('Index out of bounds', pcall_err(get_text, 0, 0, 3, 0, {})) - eq('Index out of bounds', pcall_err(get_text, 0, 0, -4, 0, {})) + eq('Index out of bounds', pcall_err(get_text, 0, 2, 0, 4, 0, {})) + eq('Index out of bounds', pcall_err(get_text, 0, -4, 0, 0, 0, {})) + eq('Index out of bounds', pcall_err(get_text, 0, 0, 0, 3, 0, {})) + eq('Index out of bounds', pcall_err(get_text, 0, 0, 0, -4, 0, {})) -- no ml_get errors should happen #19017 eq('', meths.nvim_get_vvar('errmsg')) end) it('errors when start is greater than end', function() - eq("'start' is higher than 'end'", pcall_err(get_text, 1, 0, 0, 0, {})) - eq('start_col must be less than end_col', pcall_err(get_text, 0, 1, 0, 0, {})) + eq("'start' is higher than 'end'", pcall_err(get_text, 0, 1, 0, 0, 0, {})) + eq('start_col must be less than end_col', pcall_err(get_text, 0, 0, 1, 0, 0, {})) end) end) describe('nvim_buf_get_offset', function() - local get_offset = curbufmeths.get_offset + local get_offset = meths.nvim_buf_get_offset it('works', function() - 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)) - eq(15, get_offset(2)) - eq(16, get_offset(3)) - eq(24, get_offset(4)) - eq(29, get_offset(5)) - eq('Index out of bounds', pcall_err(get_offset, 6)) - eq('Index out of bounds', pcall_err(get_offset, -1)) + meths.nvim_buf_set_lines(0, 0, -1, true, { 'Some\r', 'exa\000mple', '', 'buf\rfer', 'text' }) + eq(5, meths.nvim_buf_line_count(0)) + eq(0, get_offset(0, 0)) + eq(6, get_offset(0, 1)) + eq(15, get_offset(0, 2)) + eq(16, get_offset(0, 3)) + eq(24, get_offset(0, 4)) + eq(29, get_offset(0, 5)) + eq('Index out of bounds', pcall_err(get_offset, 0, 6)) + eq('Index out of bounds', pcall_err(get_offset, 0, -1)) meths.nvim_set_option_value('eol', false, {}) meths.nvim_set_option_value('fixeol', false, {}) - eq(28, get_offset(5)) + eq(28, get_offset(0, 5)) -- fileformat is ignored meths.nvim_set_option_value('fileformat', 'dos', {}) - eq(0, get_offset(0)) - eq(6, get_offset(1)) - eq(15, get_offset(2)) - eq(16, get_offset(3)) - eq(24, get_offset(4)) - eq(28, get_offset(5)) + eq(0, get_offset(0, 0)) + eq(6, get_offset(0, 1)) + eq(15, get_offset(0, 2)) + eq(16, get_offset(0, 3)) + eq(24, get_offset(0, 4)) + eq(28, get_offset(0, 5)) meths.nvim_set_option_value('eol', true, {}) - eq(29, get_offset(5)) + eq(29, get_offset(0, 5)) command('set hidden') command('enew') - eq(6, bufmeths.get_offset(1, 1)) + eq(6, meths.nvim_buf_get_offset(1, 1)) command('bunload! 1') - eq(-1, bufmeths.get_offset(1, 1)) - eq(-1, bufmeths.get_offset(1, 0)) + eq(-1, meths.nvim_buf_get_offset(1, 1)) + eq(-1, meths.nvim_buf_get_offset(1, 0)) end) it('works in empty buffer', function() - eq(0, get_offset(0)) - eq(1, get_offset(1)) + eq(0, get_offset(0, 0)) + eq(1, get_offset(0, 1)) eq(-1, funcs.line2byte('$')) end) it('works in buffer with one line inserted', function() feed('itext') - eq(0, get_offset(0)) - eq(5, get_offset(1)) + eq(0, get_offset(0, 0)) + eq(5, get_offset(0, 1)) end) end) 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')) + meths.nvim_buf_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_buf_get_var(0, 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('b:lua')) eq(1, funcs.exists('b:lua')) - curbufmeths.del_var('lua') + meths.nvim_buf_del_var(0, 'lua') eq(0, funcs.exists('b:lua')) - eq('Key not found: lua', pcall_err(curbufmeths.del_var, 'lua')) - curbufmeths.set_var('lua', 1) + eq('Key not found: lua', pcall_err(meths.nvim_buf_del_var, 0, 'lua')) + meths.nvim_buf_set_var(0, '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 locked: lua', pcall_err(meths.nvim_buf_del_var, 0, 'lua')) + eq('Key is locked: lua', pcall_err(meths.nvim_buf_set_var, 0, 'lua', 1)) + eq('Key is read-only: changedtick', pcall_err(meths.nvim_buf_del_var, 0, 'changedtick')) + eq('Key is read-only: changedtick', pcall_err(meths.nvim_buf_set_var, 0, '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' }) - eq(3, curbufmeths.get_changedtick()) - eq(3, curbufmeths.get_var('changedtick')) + eq(2, meths.nvim_buf_get_changedtick(0)) + meths.nvim_buf_set_lines(0, 0, 1, false, { 'abc\0', '\0def', 'ghi' }) + eq(3, meths.nvim_buf_get_changedtick(0)) + eq(3, meths.nvim_buf_get_var(0, 'changedtick')) end) it('buffer_set_var returns the old value', function() @@ -1982,32 +2001,32 @@ describe('api/buf', function() describe('nvim_get_option_value, nvim_set_option_value', function() it('works', function() - eq(8, nvim('get_option_value', 'shiftwidth', {})) - nvim('set_option_value', 'shiftwidth', 4, {}) - eq(4, nvim('get_option_value', 'shiftwidth', {})) + eq(8, meths.nvim_get_option_value('shiftwidth', {})) + meths.nvim_set_option_value('shiftwidth', 4, {}) + eq(4, meths.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 })) + meths.nvim_set_option_value('define', 'test', { buf = 0 }) + eq('test', meths.nvim_get_option_value('define', { buf = 0 })) -- Doesn't change the global value - eq('', nvim('get_option_value', 'define', { scope = 'global' })) + eq('', meths.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, meths.nvim_get_option_value('undolevels', { buf = 0 })) end) end) describe('nvim_buf_get_name, nvim_buf_set_name', function() it('works', function() - nvim('command', 'new') - eq('', curbuf('get_name')) - local new_name = nvim('eval', 'resolve(tempname())') - curbuf('set_name', new_name) - eq(new_name, curbuf('get_name')) - nvim('command', 'w!') + command('new') + eq('', meths.nvim_buf_get_name(0)) + local new_name = meths.nvim_eval('resolve(tempname())') + meths.nvim_buf_set_name(0, new_name) + eq(new_name, meths.nvim_buf_get_name(0)) + command('w!') eq(1, funcs.filereadable(new_name)) os.remove(new_name) end) @@ -2016,83 +2035,83 @@ describe('api/buf', function() describe('nvim_buf_is_loaded', function() it('works', function() -- record our buffer number for when we unload it - local bufnr = curbuf('get_number') + local bufnr = meths.nvim_buf_get_number(0) -- api should report that the buffer is loaded - ok(buffer('is_loaded', bufnr)) + ok(meths.nvim_buf_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' }) + meths.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1' }) command('hide enew') -- confirm the buffer is hidden, but still loaded - local infolist = nvim('eval', 'getbufinfo(' .. bufnr .. ')') + local infolist = meths.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) -- confirm the buffer is unloaded - infolist = nvim('eval', 'getbufinfo(' .. bufnr .. ')') + infolist = meths.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)) + eq(false, meths.nvim_buf_is_loaded(bufnr)) end) end) describe('nvim_buf_is_valid', function() it('works', function() - nvim('command', 'new') - local b = nvim('get_current_buf') - ok(buffer('is_valid', b)) - nvim('command', 'bw!') - ok(not buffer('is_valid', b)) + command('new') + local b = meths.nvim_get_current_buf() + ok(meths.nvim_buf_is_valid(b)) + command('bw!') + ok(not meths.nvim_buf_is_valid(b)) end) end) describe('nvim_buf_delete', function() it('allows for just deleting', function() - nvim('command', 'new') - local b = nvim('get_current_buf') - ok(buffer('is_valid', b)) - nvim('buf_delete', b, {}) - ok(not buffer('is_loaded', b)) - ok(not buffer('is_valid', b)) + command('new') + local b = meths.nvim_get_current_buf() + ok(meths.nvim_buf_is_valid(b)) + meths.nvim_buf_delete(b, {}) + ok(not meths.nvim_buf_is_loaded(b)) + ok(not meths.nvim_buf_is_valid(b)) end) it('allows for just unloading', function() - nvim('command', 'new') - local b = nvim('get_current_buf') - ok(buffer('is_valid', b)) - nvim('buf_delete', b, { unload = true }) - ok(not buffer('is_loaded', b)) - ok(buffer('is_valid', b)) + command('new') + local b = meths.nvim_get_current_buf() + ok(meths.nvim_buf_is_valid(b)) + meths.nvim_buf_delete(b, { unload = true }) + ok(not meths.nvim_buf_is_loaded(b)) + ok(meths.nvim_buf_is_valid(b)) end) end) describe('nvim_buf_get_mark', function() it('works', function() - 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')) + meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + meths.nvim_win_set_cursor(0, { 3, 4 }) + command('mark v') + eq({ 3, 0 }, meths.nvim_buf_get_mark(0, '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' }) - eq(true, curbufmeths.set_mark('z', 1, 1, {})) - eq({ 1, 1 }, curbufmeths.get_mark('z')) + meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + eq(true, meths.nvim_buf_set_mark(0, 'z', 1, 1, {})) + eq({ 1, 1 }, meths.nvim_buf_get_mark(0, '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' }) - eq(true, curbufmeths.set_mark('Z', 3, 2, {})) - eq({ 3, 2 }, curbufmeths.get_mark('Z')) - eq({ curbuf().id, 3, 3, 0 }, funcs.getpos("'Z")) + meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + eq(true, meths.nvim_buf_set_mark(0, 'Z', 3, 2, {})) + eq({ 3, 2 }, meths.nvim_buf_get_mark(0, 'Z')) + eq({ meths.nvim_get_current_buf().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, {})) - eq(false, pcall(curbufmeths.set_mark, 'fail', 1, 0, {})) + eq(false, pcall(meths.nvim_buf_set_mark, 0, '!', 1, 0, {})) + eq(false, pcall(meths.nvim_buf_set_mark, 0, 'fail', 1, 0, {})) end) it('fails when invalid buffer number is used', function() eq(false, pcall(meths.nvim_buf_set_mark, 99, 'a', 1, 1, {})) @@ -2101,33 +2120,33 @@ 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_mark('z', 3, 1, {}) - eq(true, curbufmeths.del_mark('z')) - eq({ 0, 0 }, curbufmeths.get_mark('z')) + meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + meths.nvim_buf_set_mark(0, 'z', 3, 1, {}) + eq(true, meths.nvim_buf_del_mark(0, 'z')) + eq({ 0, 0 }, meths.nvim_buf_get_mark(0, 'z')) end) it('works with file/uppercase marks', function() - 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')) + meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + meths.nvim_buf_set_mark(0, 'Z', 3, 3, {}) + eq(true, meths.nvim_buf_del_mark(0, 'Z')) + eq({ 0, 0 }, meths.nvim_buf_get_mark(0, 'Z')) end) it('returns false in marks not set in this buffer', function() local abuf = meths.nvim_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')) + meths.nvim_buf_set_lines(abuf, -1, -1, true, { 'a', 'bit of', 'text' }) + meths.nvim_buf_set_mark(abuf, 'A', 2, 2, {}) + eq(false, meths.nvim_buf_del_mark(0, 'A')) + eq({ 2, 2 }, meths.nvim_buf_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_mark('z', 3, 1, {}) - eq(true, curbufmeths.del_mark('z')) - eq(false, curbufmeths.del_mark('z')) -- Mark was already deleted + meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + meths.nvim_buf_set_mark(0, 'z', 3, 1, {}) + eq(true, meths.nvim_buf_del_mark(0, 'z')) + eq(false, meths.nvim_buf_del_mark(0, 'z')) -- Mark was already deleted end) it('fails when invalid marks names are used', function() - eq(false, pcall(curbufmeths.del_mark, '!')) - eq(false, pcall(curbufmeths.del_mark, 'fail')) + eq(false, pcall(meths.nvim_buf_del_mark, 0, '!')) + eq(false, pcall(meths.nvim_buf_del_mark, 0, 'fail')) end) it('fails when invalid buffer number is used', function() eq(false, pcall(meths.nvim_buf_del_mark, 99, 'a')) diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index af6404fe7f..254e7d4d42 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -2,8 +2,8 @@ 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 meths = helpers.meths +local command, eval, next_msg = helpers.command, helpers.eval, helpers.next_msg local nvim_prog = helpers.nvim_prog local pcall_err = helpers.pcall_err local sleep = vim.uv.sleep @@ -24,7 +24,7 @@ local function expectn(name, args) end local function sendkeys(keys) - nvim('input', keys) + meths.nvim_input(keys) -- give nvim some time to process msgpack requests before possibly sending -- more key presses - otherwise they all pile up in the queue and get -- processed at once @@ -37,7 +37,7 @@ local function open(activate, lines) local filename = helpers.tmpname() write_file(filename, table.concat(lines, '\n') .. '\n', true) command('edit ' .. filename) - local b = nvim('get_current_buf') + local b = meths.nvim_get_current_buf() -- what is the value of b:changedtick? local tick = eval('b:changedtick') @@ -45,7 +45,7 @@ local function open(activate, lines) -- arrive as expected if activate then local firstline = 0 - ok(buffer('attach', b, true, {})) + ok(meths.nvim_buf_attach(b, true, {})) expectn('nvim_buf_lines_event', { b, tick, firstline, -1, lines, false }) end @@ -62,12 +62,12 @@ local function editoriginal(activate, lines) end local function reopen(buf, expectedlines) - ok(buffer('detach', buf)) + ok(meths.nvim_buf_detach(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, {})) + ok(meths.nvim_buf_attach(buf, true, {})) local firstline = 0 expectn('nvim_buf_lines_event', { buf, tick, firstline, -1, expectedlines, false }) command('normal! gg') @@ -197,21 +197,21 @@ describe('API: buffer events:', function() -- 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, {})) + local b2 = meths.nvim_get_current_buf() + ok(meths.nvim_buf_attach(b2, true, {})) 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 }) -- turn off buffer events manually - buffer('detach', b2) + meths.nvim_buf_detach(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, {})) + local b3 = meths.nvim_get_current_buf() + ok(meths.nvim_buf_attach(b3, true, {})) tick = eval('b:changedtick') expectn('nvim_buf_lines_event', { b3, tick, 0, -1, { '' }, false }) eval('append(0, ["new line 1", "new line 2", "new line 3"])') @@ -222,7 +222,7 @@ describe('API: buffer events:', function() ) -- use the API itself to add a line to the start of the buffer - buffer('set_lines', b3, 0, 0, true, { 'New First Line' }) + meths.nvim_buf_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 }) end) @@ -306,8 +306,8 @@ describe('API: buffer events:', function() command('bdelete!') tick = 2 expectn('nvim_buf_detach_event', { b }) - local bnew = nvim('get_current_buf') - ok(buffer('attach', bnew, true, {})) + local bnew = meths.nvim_get_current_buf() + ok(meths.nvim_buf_attach(bnew, true, {})) expectn('nvim_buf_lines_event', { bnew, tick, 0, -1, { '' }, false }) sendkeys('i') sendkeys('h') @@ -472,25 +472,25 @@ describe('API: buffer events:', function() end) it('does not get confused if enabled/disabled many times', function() - local channel = nvim('get_api_info')[1] + local channel = meths.nvim_get_api_info()[1] local b, tick = editoriginal(false) -- Enable buffer events many times. - ok(buffer('attach', b, true, {})) - ok(buffer('attach', b, true, {})) - ok(buffer('attach', b, true, {})) - ok(buffer('attach', b, true, {})) - ok(buffer('attach', b, true, {})) + ok(meths.nvim_buf_attach(b, true, {})) + ok(meths.nvim_buf_attach(b, true, {})) + ok(meths.nvim_buf_attach(b, true, {})) + ok(meths.nvim_buf_attach(b, true, {})) + ok(meths.nvim_buf_attach(b, true, {})) expectn('nvim_buf_lines_event', { b, tick, 0, -1, origlines, false }) eval('rpcnotify(' .. channel .. ', "Hello There")') expectn('Hello There', {}) -- Disable buffer events many times. - ok(buffer('detach', b)) - ok(buffer('detach', b)) - ok(buffer('detach', b)) - ok(buffer('detach', b)) - ok(buffer('detach', b)) + ok(meths.nvim_buf_detach(b)) + ok(meths.nvim_buf_detach(b)) + ok(meths.nvim_buf_detach(b)) + ok(meths.nvim_buf_detach(b)) + ok(meths.nvim_buf_detach(b)) expectn('nvim_buf_detach_event', { b }) eval('rpcnotify(' .. channel .. ', "Hello Again")') expectn('Hello Again', {}) @@ -573,7 +573,7 @@ describe('API: buffer events:', function() it('works with :diffput and :diffget', function() local b1, tick1 = editoriginal(true, { 'AAA', 'BBB' }) - local channel = nvim('get_api_info')[1] + local channel = meths.nvim_get_api_info()[1] command('diffthis') command('rightbelow vsplit') local b2, tick2 = open(true, { 'BBB', 'CCC' }) @@ -690,7 +690,7 @@ describe('API: buffer events:', function() it('detaches if the buffer is closed', function() local b, tick = editoriginal(true, { 'AAA' }) - local channel = nvim('get_api_info')[1] + local channel = meths.nvim_get_api_info()[1] -- Test that buffer events are working. command('normal! x') @@ -729,7 +729,7 @@ describe('API: buffer events:', function() it(':enew! does not detach hidden buffer', function() local b, tick = editoriginal(true, { 'AAA', 'BBB' }) - local channel = nvim('get_api_info')[1] + local channel = meths.nvim_get_api_info()[1] command('set undoreload=1 hidden') command('normal! x') @@ -743,7 +743,7 @@ describe('API: buffer events:', function() it('stays attached if the buffer is hidden', function() local b, tick = editoriginal(true, { 'AAA' }) - local channel = nvim('get_api_info')[1] + local channel = meths.nvim_get_api_info()[1] -- Test that buffer events are working. command('normal! x') @@ -790,14 +790,14 @@ describe('API: buffer events:', function() it('does not send the buffer content if not requested', function() clear() local b, tick = editoriginal(false) - ok(buffer('attach', b, false, {})) + ok(meths.nvim_buf_attach(b, false, {})) 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(meths.nvim_buf_attach, b, false, { builtin = 'asfd' })) end) it('nvim_buf_attach returns response after delay #8634', function() @@ -873,8 +873,8 @@ describe('API: buffer events:', function() env = { VIMRUNTIME = os.getenv('VIMRUNTIME') }, }) - local b = nvim('get_current_buf') - ok(buffer('attach', b, true, {})) + local b = meths.nvim_get_current_buf() + ok(meths.nvim_buf_attach(b, true, {})) for _ = 1, 22 do table.insert(expected_lines, '~') diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua index f1e3c5155d..dc6a68da03 100644 --- a/test/functional/api/command_spec.lua +++ b/test/functional/api/command_spec.lua @@ -3,10 +3,8 @@ local helpers = require('test.functional.helpers')(after_each) local NIL = vim.NIL local clear = helpers.clear local command = helpers.command -local curbufmeths = helpers.curbufmeths local eq = helpers.eq local meths = helpers.meths -local bufmeths = helpers.bufmeths local matches = helpers.matches local source = helpers.source local pcall_err = helpers.pcall_err @@ -74,16 +72,16 @@ describe('nvim_get_commands', function() 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 }, meths.nvim_buf_get_commands(0, { 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 }, meths.nvim_buf_get_commands(0, { builtin = false })) -- Delete a command. command('delcommand Pwd') - eq({ Hello = cmd_dict }, curbufmeths.get_commands({ builtin = false })) + eq({ Hello = cmd_dict }, meths.nvim_buf_get_commands(0, { builtin = false })) -- {builtin=true} always returns empty for buffer-local case. - eq({}, curbufmeths.get_commands({ builtin = true })) + eq({}, meths.nvim_buf_get_commands(0, { builtin = true })) end) it('gets various command attributes', function() @@ -203,7 +201,7 @@ describe('nvim_create_user_command', function() it('works with strings', function() meths.nvim_create_user_command('SomeCommand', 'let g:command_fired = ', { nargs = 1 }) - meths.nvim_command('SomeCommand 42') + command('SomeCommand 42') eq(42, meths.nvim_eval('g:command_fired')) end) @@ -647,10 +645,10 @@ describe('nvim_create_user_command', function() it('can define buffer-local commands', function() local bufnr = meths.nvim_create_buf(false, false) - bufmeths.create_user_command(bufnr, 'Hello', '', {}) - matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello')) + meths.nvim_buf_create_user_command(bufnr, 'Hello', '', {}) + matches('Not an editor command: Hello', pcall_err(command, 'Hello')) meths.nvim_set_current_buf(bufnr) - meths.nvim_command('Hello') + command('Hello') assert_alive() end) @@ -762,15 +760,15 @@ describe('nvim_del_user_command', function() it('can delete global commands', function() meths.nvim_create_user_command('Hello', 'echo "Hi"', {}) - meths.nvim_command('Hello') + command('Hello') meths.nvim_del_user_command('Hello') - matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello')) + matches('Not an editor command: Hello', pcall_err(command, 'Hello')) end) it('can delete buffer-local commands', function() - bufmeths.create_user_command(0, 'Hello', 'echo "Hi"', {}) - meths.nvim_command('Hello') - bufmeths.del_user_command(0, 'Hello') - matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello')) + meths.nvim_buf_create_user_command(0, 'Hello', 'echo "Hi"', {}) + command('Hello') + meths.nvim_buf_del_user_command(0, 'Hello') + matches('Not an editor command: Hello', pcall_err(command, 'Hello')) end) end) diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 83fc5aa47f..668ce43588 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -4,8 +4,6 @@ local Screen = require('test.functional.ui.screen') local request = helpers.request local eq = helpers.eq local ok = helpers.ok -local curbufmeths = helpers.curbufmeths -local bufmeths = helpers.bufmeths local pcall_err = helpers.pcall_err local insert = helpers.insert local feed = helpers.feed @@ -26,21 +24,21 @@ local function set_extmark(ns_id, id, line, col, opts) if id ~= nil and id ~= 0 then opts.id = id end - return curbufmeths.set_extmark(ns_id, line, col, opts) + return meths.nvim_buf_set_extmark(0, ns_id, line, col, opts) end local function get_extmarks(ns_id, start, end_, opts) if opts == nil then opts = {} end - return curbufmeths.get_extmarks(ns_id, start, end_, opts) + return meths.nvim_buf_get_extmarks(0, ns_id, start, end_, opts) end local function get_extmark_by_id(ns_id, id, opts) if opts == nil then opts = {} end - return curbufmeths.get_extmark_by_id(ns_id, id, opts) + return meths.nvim_buf_get_extmark_by_id(0, ns_id, id, opts) end local function check_undo_redo(ns, mark, sr, sc, er, ec) --s = start, e = end @@ -198,11 +196,11 @@ describe('API/extmarks', function() eq({ row, col }, rv) -- remove the test marks - eq(true, curbufmeths.del_extmark(ns, marks[1])) - eq(false, curbufmeths.del_extmark(ns, marks[1])) - eq(true, curbufmeths.del_extmark(ns, marks[2])) - eq(false, curbufmeths.del_extmark(ns, marks[3])) - eq(false, curbufmeths.del_extmark(ns, 1000)) + eq(true, meths.nvim_buf_del_extmark(0, ns, marks[1])) + eq(false, meths.nvim_buf_del_extmark(0, ns, marks[1])) + eq(true, meths.nvim_buf_del_extmark(0, ns, marks[2])) + eq(false, meths.nvim_buf_del_extmark(0, ns, marks[3])) + eq(false, meths.nvim_buf_del_extmark(0, ns, 1000)) end) it('can clear a specific namespace range', function() @@ -210,7 +208,7 @@ describe('API/extmarks', function() set_extmark(ns2, 1, 0, 1) -- force a new undo buffer feed('o') - curbufmeths.clear_namespace(ns2, 0, -1) + meths.nvim_buf_clear_namespace(0, ns2, 0, -1) eq({ { 1, 0, 1 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('u') @@ -226,7 +224,7 @@ describe('API/extmarks', function() set_extmark(ns2, 1, 0, 1) -- force a new undo buffer feed('o') - curbufmeths.clear_namespace(-1, 0, -1) + meths.nvim_buf_clear_namespace(0, -1, 0, -1) eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 })) eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('u') @@ -244,14 +242,14 @@ describe('API/extmarks', function() 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 })) - curbufmeths.clear_namespace(ns, 0, -1) + meths.nvim_buf_clear_namespace(0, ns, 0, -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 })) feed('u') eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) - curbufmeths.clear_namespace(ns, 0, -1) + meths.nvim_buf_clear_namespace(0, ns, 0, -1) end) it('querying for information and ranges', function() @@ -933,7 +931,7 @@ describe('API/extmarks', function() -- Test unset feed('o') - curbufmeths.del_extmark(ns, marks[3]) + meths.nvim_buf_del_extmark(0, ns, marks[3]) feed('u') rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) -- undo does NOT restore deleted marks @@ -989,10 +987,10 @@ describe('API/extmarks', function() rv = get_extmarks(ns2, positions[2], positions[1]) eq(2, #rv) - curbufmeths.del_extmark(ns, marks[1]) + meths.nvim_buf_del_extmark(0, ns, marks[1]) rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(2, #rv) - curbufmeths.del_extmark(ns2, marks[1]) + meths.nvim_buf_del_extmark(0, ns2, marks[1]) rv = get_extmarks(ns2, { 0, 0 }, { -1, -1 }) eq(2, #rv) end) @@ -1429,7 +1427,7 @@ describe('API/extmarks', function() "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(meths.nvim_buf_del_extmark, 0, 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])) end) @@ -1480,8 +1478,8 @@ describe('API/extmarks', function() 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, { '', '' }) - local id = bufmeths.set_extmark(buf, ns, 1, 0, {}) - eq({ { id, 1, 0 } }, bufmeths.get_extmarks(buf, ns, 0, -1, {})) + local id = meths.nvim_buf_set_extmark(buf, ns, 1, 0, {}) + eq({ { id, 1, 0 } }, meths.nvim_buf_get_extmarks(buf, ns, 0, -1, {})) end) it('does not crash with append/delete/undo sequence', function() @@ -1497,24 +1495,24 @@ 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 }) + meths.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = false }) + meths.nvim_buf_set_extmark(0, 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 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) -- but both move when text is inserted before feed([[Iasdf]]) - -- eq({}, curbufmeths.get_lines(0, -1, true)) - eq({ { 1, 0, 9 }, { 2, 0, 17 } }, curbufmeths.get_extmarks(ns, 0, -1, {})) + -- eq({}, meths.nvim_buf_get_lines(0, 0, -1, true)) + eq({ { 1, 0, 9 }, { 2, 0, 17 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) -- clear text - curbufmeths.set_text(0, 0, 0, 17, {}) + meths.nvim_buf_set_text(0, 0, 0, 0, 17, {}) -- handles set_text correctly as well eq({ { 1, 0, 0 }, { 2, 0, 0 } }, meths.nvim_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, {})) + meths.nvim_buf_set_text(0, 0, 0, 0, 0, { 'asdfasdf' }) + eq({ { 1, 0, 0 }, { 2, 0, 8 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) feed('u') -- handles pasting @@ -1641,7 +1639,7 @@ describe('API/extmarks', function() right_gravity = true, }, }, get_extmark_by_id(ns, marks[3], { details = true })) - curbufmeths.clear_namespace(ns, 0, -1) + meths.nvim_buf_clear_namespace(0, 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') @@ -1770,7 +1768,7 @@ describe('Extmarks buffer api with many marks', function() for i = 1, 30 do lines[#lines + 1] = string.rep('x ', i) end - curbufmeths.set_lines(0, -1, true, lines) + meths.nvim_buf_set_lines(0, 0, -1, true, lines) local ns = ns1 local q = 0 for i = 0, 29 do @@ -1804,16 +1802,16 @@ describe('Extmarks buffer api with many marks', function() end) it('can clear all marks in ns', function() - curbufmeths.clear_namespace(ns1, 0, -1) + meths.nvim_buf_clear_namespace(0, ns1, 0, -1) eq({}, get_marks(ns1)) eq(ns_marks[ns2], get_marks(ns2)) - curbufmeths.clear_namespace(ns2, 0, -1) + meths.nvim_buf_clear_namespace(0, ns2, 0, -1) eq({}, get_marks(ns1)) eq({}, get_marks(ns2)) end) it('can clear line range', function() - curbufmeths.clear_namespace(ns1, 10, 20) + meths.nvim_buf_clear_namespace(0, ns1, 10, 20) for id, mark in pairs(ns_marks[ns1]) do if 10 <= mark[1] and mark[1] < 20 then ns_marks[ns1][id] = nil diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua index 07ce9d0c54..b86fe550a1 100644 --- a/test/functional/api/highlight_spec.lua +++ b/test/functional/api/highlight_spec.lua @@ -1,5 +1,5 @@ local helpers = require('test.functional.helpers')(after_each) -local clear, nvim = helpers.clear, helpers.nvim +local clear = helpers.clear local Screen = require('test.functional.ui.screen') local eq, eval = helpers.eq, helpers.eval local command = helpers.command @@ -52,22 +52,22 @@ describe('API: highlight', 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, meths.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, meths.nvim_get_hl_by_id(hl_id, true)) -- Test invalid id. eq('Invalid highlight id: 30000', pcall_err(meths.nvim_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, meths.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, meths.nvim_get_hl_by_id(hl_id, true)) -- Test nil argument. eq( @@ -102,14 +102,14 @@ describe('API: highlight', 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({}, meths.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, meths.nvim_get_hl_by_name('NewHighlight', false)) + eq(expected_rgb, meths.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, meths.nvim_get_hl_by_name('Normal', true)) -- Test invalid name. eq( @@ -137,10 +137,10 @@ describe('API: highlight', function() meths.nvim_set_hl(0, 'Normal', { ctermfg = 17, ctermbg = 213 }) meths.nvim_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 }, meths.nvim_get_hl_by_name('Normal', false)) eq( { foreground = 17, background = 213, nocombine = true }, - nvim('get_hl_by_name', 'NotNormal', false) + meths.nvim_get_hl_by_name('NotNormal', false) ) end) @@ -378,7 +378,7 @@ describe('API: set highlight', function() it("correctly sets 'Normal' internal properties", function() -- Normal has some special handling internally. #18024 meths.nvim_set_hl(0, 'Normal', { fg = '#000083', bg = '#0000F3' }) - eq({ foreground = 131, background = 243 }, nvim('get_hl_by_name', 'Normal', true)) + eq({ foreground = 131, background = 243 }, meths.nvim_get_hl_by_name('Normal', true)) end) it('does not segfault on invalid group name #20009', function() @@ -475,7 +475,7 @@ describe('API: get highlight', function() end) it('nvim_get_hl with create flag', function() - eq({}, nvim('get_hl', 0, { name = 'Foo', create = false })) + eq({}, meths.nvim_get_hl(0, { name = 'Foo', create = false })) eq(0, funcs.hlexists('Foo')) meths.nvim_get_hl(0, { name = 'Bar', create = true }) eq(1, funcs.hlexists('Bar')) diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index f633c96a7c..b7de7732e8 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -1,9 +1,7 @@ local helpers = require('test.functional.helpers')(after_each) -local bufmeths = helpers.bufmeths local clear = helpers.clear local command = helpers.command -local curbufmeths = helpers.curbufmeths local eq, neq = helpers.eq, helpers.neq local exec_lua = helpers.exec_lua local exec = helpers.exec @@ -112,7 +110,7 @@ describe('nvim_get_keymap', function() -- The buffer mapping should not show up eq({ foolong_bar_map_table }, meths.nvim_get_keymap('n')) - eq({ buffer_table }, curbufmeths.get_keymap('n')) + eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n')) end) it('considers scope for overlapping maps', function() @@ -124,11 +122,11 @@ describe('nvim_get_keymap', function() command('nnoremap foo bar') eq({ foo_bar_map_table }, meths.nvim_get_keymap('n')) - eq({ buffer_table }, curbufmeths.get_keymap('n')) + eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n')) end) it('can retrieve mapping for different buffers', function() - local original_buffer = curbufmeths.get_number() + local original_buffer = meths.nvim_buf_get_number(0) -- Place something in each of the buffers to make sure they stick around -- and set hidden so we can leave them command('set hidden') @@ -137,7 +135,7 @@ describe('nvim_get_keymap', function() command('new') command('normal! ihello 3') - local final_buffer = curbufmeths.get_number() + local final_buffer = meths.nvim_buf_get_number(0) command('nnoremap foo bar') -- Final buffer will have buffer mappings @@ -147,10 +145,10 @@ describe('nvim_get_keymap', function() eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n')) command('buffer ' .. original_buffer) - eq(original_buffer, curbufmeths.get_number()) + eq(original_buffer, meths.nvim_buf_get_number(0)) -- Original buffer won't have any mappings eq({}, meths.nvim_get_keymap('n')) - eq({}, curbufmeths.get_keymap('n')) + eq({}, meths.nvim_buf_get_keymap(0, 'n')) eq({ buffer_table }, meths.nvim_buf_get_keymap(final_buffer, 'n')) end) @@ -209,7 +207,7 @@ describe('nvim_get_keymap', function() function() make_new_windows(new_windows) command(map .. ' ' .. option_token .. ' foo bar') - local result = curbufmeths.get_keymap(mode)[1][option] + local result = meths.nvim_buf_get_keymap(0, mode)[1][option] eq(buffer_on_result, result) end ) @@ -246,7 +244,7 @@ describe('nvim_get_keymap', function() make_new_windows(new_windows) command(map .. ' foo bar') - local result = curbufmeths.get_keymap(mode)[1][option] + local result = meths.nvim_buf_get_keymap(0, mode)[1][option] eq(buffer_off_result, result) end ) @@ -290,7 +288,7 @@ describe('nvim_get_keymap', function() nnoremap fizz :call maparg_test_function() ]]) - local sid_result = curbufmeths.get_keymap('n')[1]['sid'] + local sid_result = meths.nvim_buf_get_keymap(0, 'n')[1]['sid'] eq(1, sid_result) eq('testing', meths.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) end) @@ -698,33 +696,33 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('can set mappings whose RHS is a ', function() meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, curbufmeths.get_lines(0, -1, 0)) -- imap to does nothing + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) -- imap to does nothing eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- also test for case insensitivity meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) -- note: RHS in returned mapargs() dict reflects the original RHS -- provided by the user eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- a single ^V in RHS is also (see :h map-empty-rhs) meths.nvim_set_keymap('i', 'lhs', '\022', {}) command('normal ilhs') - eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) eq(generate_mapargs('i', 'lhs', '\022', {}), get_mapargs('i', 'lhs')) end) it('treats an empty RHS in a mapping like a ', function() meths.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) end) @@ -743,7 +741,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() command([[call nvim_set_keymap('i', "\", "\", {})]]) eq(generate_mapargs('i', '', '\t', { sid = 0 }), get_mapargs('i', '')) feed('i ') - eq({ '\t' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '\t' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) end ) @@ -772,12 +770,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() meths.nvim_set_keymap('i', 'lhs', 'FlipFlop()', { expr = true }) command('normal ilhs') - eq({ '1' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '1' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) command('normal! ggVGd') command('normal ilhs') - eq({ '0' }, curbufmeths.get_lines(0, -1, 0)) + eq({ '0' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) end) it('can set mappings that do trigger other mappings', function() @@ -785,12 +783,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() meths.nvim_set_keymap('i', 'lhs', 'mhs', {}) command('normal imhs') - eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) + eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) command('normal! ggVGd') command('normal ilhs') - eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) + eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) end) it("can set noremap mappings that don't trigger other mappings", function() @@ -798,12 +796,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() meths.nvim_set_keymap('i', 'lhs', 'mhs', { noremap = true }) command('normal imhs') - eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0)) + eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) command('normal! ggVGd') command('normal ilhs') -- shouldn't trigger mhs-to-rhs mapping - eq({ 'mhs' }, curbufmeths.get_lines(0, -1, 0)) + eq({ 'mhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) end) it('can set nowait mappings that fire without waiting', function() @@ -817,7 +815,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed(c) sleep(5) end - eq({ 'shorter456' }, curbufmeths.get_lines(0, -1, 0)) + eq({ 'shorter456' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) end) -- Perform exhaustive tests of basic functionality @@ -1181,66 +1179,66 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() 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', {}) + pcall_err(meths.nvim_buf_set_keymap, -1, '', 'lhs', 'rhs', {}) ) end) it('can set mappings active in the current buffer but not others', function() local first, second = make_two_buffers(true) - bufmeths.set_keymap(0, '', 'lhs', 'irhs', {}) + meths.nvim_buf_set_keymap(0, '', 'lhs', 'irhs', {}) command('normal lhs') - eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, meths.nvim_buf_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({ '' }, meths.nvim_buf_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' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) end) it('can set local mappings in buffer other than current', function() local first = make_two_buffers(false) - bufmeths.set_keymap(first, '', 'lhs', 'irhs', {}) + meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) -- shouldn't do anything command('normal lhs') - eq({ '' }, bufmeths.get_lines(0, 0, 1, 1)) + eq({ '' }, meths.nvim_buf_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' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) end) it('can disable mappings made in another buffer, inside that buffer', function() local first = make_two_buffers(false) - bufmeths.set_keymap(first, '', 'lhs', 'irhs', {}) - bufmeths.del_keymap(first, '', 'lhs') + meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) + meths.nvim_buf_del_keymap(first, '', 'lhs') switch_to_buf(first) -- shouldn't do anything command('normal lhs') - eq({ '' }, bufmeths.get_lines(0, 0, 1, 1)) + eq({ '' }, meths.nvim_buf_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', {}) - eq('E31: No such mapping', pcall_err(bufmeths.del_keymap, second, '', 'lhs')) + meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) + eq('E31: No such mapping', pcall_err(meths.nvim_buf_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' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) end) it('does not crash when setting mapping in a non-existing buffer #13541', function() - pcall_err(bufmeths.set_keymap, 100, '', 'lsh', 'irhs', {}) + pcall_err(meths.nvim_buf_set_keymap, 100, '', 'lsh', 'irhs', {}) helpers.assert_alive() end) diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua index 3fc7b9986a..c80f7f4f7b 100644 --- a/test/functional/api/server_notifications_spec.lua +++ b/test/functional/api/server_notifications_spec.lua @@ -1,7 +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 +local eq, clear, eval, command, next_msg = + helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.next_msg local meths = helpers.meths local exec_lua = helpers.exec_lua local retry = helpers.retry @@ -14,7 +14,7 @@ describe('notify', function() before_each(function() clear() - channel = nvim('get_api_info')[1] + channel = meths.nvim_get_api_info()[1] end) after_each(function() @@ -33,14 +33,14 @@ describe('notify', function() describe('passing 0 as the channel id', function() it('sends the notification/args to all subscribed channels', function() - nvim('subscribe', 'event2') + meths.nvim_subscribe('event2') 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()) - nvim('unsubscribe', 'event2') - nvim('subscribe', 'event1') + meths.nvim_unsubscribe('event2') + meths.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()) @@ -49,9 +49,7 @@ describe('notify', function() it('does not crash for deeply nested variable', function() meths.nvim_set_var('l', {}) local nest_level = 1000 - meths.nvim_command( - ('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1) - ) + command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1)) eval('rpcnotify(' .. channel .. ', "event", g:l)') local msg = next_msg() eq('notification', msg[1]) @@ -81,10 +79,10 @@ describe('notify', function() clear { env = { NVIM_LOG_FILE = testlog, } } - nvim('subscribe', 'event1') - nvim('unsubscribe', 'doesnotexist') + meths.nvim_subscribe('event1') + meths.nvim_unsubscribe('doesnotexist') assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10) - nvim('unsubscribe', 'event1') + meths.nvim_unsubscribe('event1') assert_alive() end) diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua index 6878ac0218..e06d32f656 100644 --- a/test/functional/api/server_requests_spec.lua +++ b/test/functional/api/server_requests_spec.lua @@ -2,7 +2,7 @@ -- `rpcrequest` calls we need the client event loop to be running. local helpers = require('test.functional.helpers')(after_each) -local clear, nvim, eval = helpers.clear, helpers.nvim, helpers.eval +local clear, eval = helpers.clear, helpers.eval local eq, neq, run, stop = helpers.eq, helpers.neq, helpers.run, helpers.stop local nvim_prog, command, funcs = helpers.nvim_prog, helpers.command, helpers.funcs local source, next_msg = helpers.source, helpers.next_msg @@ -18,7 +18,7 @@ describe('server -> client', function() before_each(function() clear() - cid = nvim('get_api_info')[1] + cid = meths.nvim_get_api_info()[1] end) it('handles unexpected closed stream while preparing RPC response', function() @@ -47,7 +47,7 @@ describe('server -> client', function() local function on_request(method, args) eq('scall', method) eq({ 1, 2, 3 }, args) - nvim('command', 'let g:result = [4, 5, 6]') + command('let g:result = [4, 5, 6]') return eval('g:result') end run(on_request, nil, on_setup) @@ -77,15 +77,15 @@ describe('server -> client', function() describe('recursive call', function() it('works', function() local function on_setup() - nvim('set_var', 'result1', 0) - nvim('set_var', 'result2', 0) - nvim('set_var', 'result3', 0) - nvim('set_var', 'result4', 0) - 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')) - eq(32, nvim('get_var', 'result4')) + meths.nvim_set_var('result1', 0) + meths.nvim_set_var('result2', 0) + meths.nvim_set_var('result3', 0) + meths.nvim_set_var('result4', 0) + command('let g:result1 = rpcrequest(' .. cid .. ', "rcall", 2)') + eq(4, meths.nvim_get_var('result1')) + eq(8, meths.nvim_get_var('result2')) + eq(16, meths.nvim_get_var('result3')) + eq(32, meths.nvim_get_var('result4')) stop() end @@ -101,7 +101,7 @@ describe('server -> client', function() elseif n == 16 then cmd = 'let g:result4 = rpcrequest(' .. cid .. ', "rcall", ' .. n .. ')' end - nvim('command', cmd) + command(cmd) end return n end @@ -195,10 +195,10 @@ describe('server -> client', function() end) it('can send/receive notifications and make requests', function() - nvim('command', "call rpcnotify(vim, 'vim_set_current_line', 'SOME TEXT')") + command("call rpcnotify(vim, 'vim_set_current_line', 'SOME TEXT')") -- Wait for the notification to complete. - nvim('command', "call rpcrequest(vim, 'vim_eval', '0')") + command("call rpcrequest(vim, 'vim_eval', '0')") eq('SOME TEXT', eval("rpcrequest(vim, 'vim_get_current_line')")) end) @@ -212,7 +212,7 @@ describe('server -> client', function() eq(1, buf) eval("rpcnotify(vim, 'buffer_set_line', " .. buf .. ", 0, 'SOME TEXT')") - nvim('command', "call rpcrequest(vim, 'vim_eval', '0')") -- wait + command("call rpcrequest(vim, 'vim_eval', '0')") -- wait eq('SOME TEXT', eval("rpcrequest(vim, 'buffer_get_line', " .. buf .. ', 0)')) @@ -231,8 +231,8 @@ describe('server -> client', function() describe('jobstart()', function() local jobid before_each(function() - local channel = nvim('get_api_info')[1] - nvim('set_var', 'channel', channel) + local channel = meths.nvim_get_api_info()[1] + meths.nvim_set_var('channel', channel) source([[ function! s:OnEvent(id, data, event) call rpcnotify(g:channel, a:event, 0, a:data) diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua index f661f8e38b..830b547da5 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 -local curtabmeths = helpers.curtabmeths +local clear, eq, ok = helpers.clear, helpers.eq, helpers.ok +local meths = helpers.meths local funcs = helpers.funcs local request = helpers.request local NIL = vim.NIL @@ -13,35 +12,35 @@ describe('api/tabpage', function() describe('list_wins and get_win', function() it('works', function() - nvim('command', 'tabnew') - 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(win2, tabpage('get_win', tab2)) - nvim('set_current_win', win3) - eq(win3, tabpage('get_win', tab2)) + helpers.command('tabnew') + helpers.command('vsplit') + local tab1, tab2 = unpack(meths.nvim_list_tabpages()) + local win1, win2, win3 = unpack(meths.nvim_list_wins()) + eq({ win1 }, meths.nvim_tabpage_list_wins(tab1)) + eq({ win2, win3 }, meths.nvim_tabpage_list_wins(tab2)) + eq(win2, meths.nvim_tabpage_get_win(tab2)) + meths.nvim_set_current_win(win3) + eq(win3, meths.nvim_tabpage_get_win(tab2)) end) it('validates args', function() - eq('Invalid tabpage id: 23', pcall_err(tabpage, 'list_wins', 23)) + eq('Invalid tabpage id: 23', pcall_err(meths.nvim_tabpage_list_wins, 23)) end) end) 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')) + meths.nvim_tabpage_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_tabpage_get_var(0, 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('t:lua')) eq(1, funcs.exists('t:lua')) - curtabmeths.del_var('lua') + meths.nvim_tabpage_del_var(0, 'lua') eq(0, funcs.exists('t:lua')) - eq('Key not found: lua', pcall_err(curtabmeths.del_var, 'lua')) - curtabmeths.set_var('lua', 1) + eq('Key not found: lua', pcall_err(meths.nvim_tabpage_del_var, 0, 'lua')) + meths.nvim_tabpage_set_var(0, 'lua', 1) command('lockvar t:lua') - eq('Key is locked: lua', pcall_err(curtabmeths.del_var, 'lua')) - eq('Key is locked: lua', pcall_err(curtabmeths.set_var, 'lua', 1)) + eq('Key is locked: lua', pcall_err(meths.nvim_tabpage_del_var, 0, 'lua')) + eq('Key is locked: lua', pcall_err(meths.nvim_tabpage_set_var, 0, 'lua', 1)) end) it('tabpage_set_var returns the old value', function() @@ -62,28 +61,28 @@ describe('api/tabpage', function() describe('get_number', function() it('works', function() - local tabs = nvim('list_tabpages') - eq(1, tabpage('get_number', tabs[1])) + local tabs = meths.nvim_list_tabpages() + eq(1, meths.nvim_tabpage_get_number(tabs[1])) - nvim('command', 'tabnew') - local tab1, tab2 = unpack(nvim('list_tabpages')) - eq(1, tabpage('get_number', tab1)) - eq(2, tabpage('get_number', tab2)) + helpers.command('tabnew') + local tab1, tab2 = unpack(meths.nvim_list_tabpages()) + eq(1, meths.nvim_tabpage_get_number(tab1)) + eq(2, meths.nvim_tabpage_get_number(tab2)) - nvim('command', '-tabmove') - eq(2, tabpage('get_number', tab1)) - eq(1, tabpage('get_number', tab2)) + helpers.command('-tabmove') + eq(2, meths.nvim_tabpage_get_number(tab1)) + eq(1, meths.nvim_tabpage_get_number(tab2)) end) end) describe('is_valid', function() it('works', function() - nvim('command', 'tabnew') - local tab = nvim('list_tabpages')[2] - nvim('set_current_tabpage', tab) - ok(tabpage('is_valid', tab)) - nvim('command', 'tabclose') - ok(not tabpage('is_valid', tab)) + helpers.command('tabnew') + local tab = meths.nvim_list_tabpages()[2] + meths.nvim_set_current_tabpage(tab) + ok(meths.nvim_tabpage_is_valid(tab)) + helpers.command('tabclose') + ok(not meths.nvim_tabpage_is_valid(tab)) end) end) end) diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 3fd1cdab1e..ba2042d585 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -6,8 +6,9 @@ local fmt = string.format local dedent = helpers.dedent local assert_alive = helpers.assert_alive local NIL = vim.NIL -local clear, nvim, eq, neq = helpers.clear, helpers.nvim, helpers.eq, helpers.neq +local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq local command = helpers.command +local command_output = helpers.meths.command_output local exec = helpers.exec local exec_capture = helpers.exec_capture local eval = helpers.eval @@ -94,41 +95,40 @@ describe('API', function() end) it('does not set CA_COMMAND_BUSY #7254', function() - nvim('command', 'split') - nvim('command', 'autocmd WinEnter * startinsert') - nvim('command', 'wincmd w') - eq({ mode = 'i', blocking = false }, nvim('get_mode')) + command('split') + command('autocmd WinEnter * startinsert') + command('wincmd w') + eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) end) describe('nvim_exec2', function() it('always returns table', function() -- In built version this results into `vim.empty_dict()` - eq({}, nvim('exec2', 'echo "Hello"', {})) - eq({}, nvim('exec2', 'echo "Hello"', { output = false })) - eq({ output = 'Hello' }, nvim('exec2', 'echo "Hello"', { output = true })) + eq({}, meths.nvim_exec2('echo "Hello"', {})) + eq({}, meths.nvim_exec2('echo "Hello"', { output = false })) + eq({ output = 'Hello' }, meths.nvim_exec2('echo "Hello"', { output = true })) end) it('default options', function() -- Should be equivalent to { output = false } - nvim('exec2', "let x0 = 'a'", {}) - eq('a', nvim('get_var', 'x0')) + meths.nvim_exec2("let x0 = 'a'", {}) + eq('a', meths.nvim_get_var('x0')) end) it('one-line input', function() - nvim('exec2', "let x1 = 'a'", { output = false }) - eq('a', nvim('get_var', 'x1')) + meths.nvim_exec2("let x1 = 'a'", { output = false }) + eq('a', meths.nvim_get_var('x1')) end) it(':verbose set {option}?', function() - nvim('exec2', 'set nowrap', { output = false }) + meths.nvim_exec2('set nowrap', { output = false }) eq( { output = 'nowrap\n\tLast set from anonymous :source' }, - nvim('exec2', 'verbose set wrap?', { output = true }) + meths.nvim_exec2('verbose set wrap?', { output = true }) ) -- Using script var to force creation of a script item - nvim( - 'exec2', + meths.nvim_exec2( [[ let s:a = 1 set nowrap @@ -137,40 +137,39 @@ describe('API', function() ) eq( { output = 'nowrap\n\tLast set from anonymous :source (script id 1)' }, - nvim('exec2', 'verbose set wrap?', { output = true }) + meths.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 <")->empty() let s:a = 123 @@ -245,8 +241,7 @@ describe('API', function() eq( { output = '1\n0' }, - nvim( - 'exec2', + meths.nvim_exec2( [[ echo expand("")->empty() function s:a() abort @@ -259,8 +254,7 @@ describe('API', function() end) it('non-ASCII input', function() - nvim( - 'exec2', + meths.nvim_exec2( [=[ new exe "normal! i ax \n Ax " @@ -268,13 +262,12 @@ describe('API', function() ]=], { output = false } ) - nvim('command', '1') - eq(' --a1234-- ', nvim('get_current_line')) - nvim('command', '2') - eq(' --A1234-- ', nvim('get_current_line')) + command('1') + eq(' --a1234-- ', meths.nvim_get_current_line()) + command('2') + eq(' --A1234-- ', meths.nvim_get_current_line()) - nvim( - 'exec2', + meths.nvim_exec2( [[ new call setline(1,['xxx']) @@ -283,7 +276,7 @@ describe('API', function() ]], { output = false } ) - eq('ñxx', nvim('get_current_line')) + eq('ñxx', meths.nvim_get_current_line()) end) it('execution error', function() @@ -291,7 +284,7 @@ describe('API', function() '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('', meths.nvim_eval('v:errmsg')) -- v:errmsg was not updated. eq('', eval('v:exception')) eq( @@ -355,10 +348,10 @@ describe('API', function() it('returns output', function() eq( { output = 'this is spinal tap' }, - nvim('exec2', 'lua <]]) + command('set cmdheight=1') + meths.nvim_input([[:echo "hi\nhi2"]]) -- Verify hit-enter prompt. - eq({ mode = 'r', blocking = true }, nvim('get_mode')) - nvim('input', [[]]) + eq({ mode = 'r', blocking = true }, meths.nvim_get_mode()) + meths.nvim_input([[]]) -- Verify NO hit-enter prompt. - nvim('command_output', [[echo "hi\nhi2"]]) - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + command_output([[echo "hi\nhi2"]]) + eq({ mode = 'n', blocking = false }, meths.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', command_output([[echo "this is\nspinal tap"]])) + eq('no line ending!', command_output([[echon "no line ending!"]])) end) it('captures empty command output', function() - eq('', nvim('command_output', 'echo')) + eq('', command_output('echo')) end) it('captures single-char command output', function() - eq('x', nvim('command_output', 'echo "x"')) + eq('x', command_output('echo "x"')) 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', 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]]) + 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]]) + 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', command_output([[!echo foo]])) end) it('Vimscript validation error: fails with specific error', function() - local status, rv = pcall(nvim, 'command_output', 'bogus commannnd') + local status, rv = pcall(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 }, meths.nvim_get_mode()) end) it('Vimscript execution error: fails with specific error', function() - local status, rv = pcall(nvim, 'command_output', 'buffer 42') + local status, rv = pcall(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 }, meths.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))'), command_output('echo range(1000000)')) end) end) describe('nvim_eval', 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:')) + command('let g:v1 = "a"') + command('let g:v2 = [1, 2, {"v3": 3}]') + eq({ v1 = 'a', v2 = { 1, 2, { v3 = 3 } } }, meths.nvim_eval('g:')) end) it('handles NULL-initialized strings correctly', function() - eq(1, nvim('eval', "matcharg(1) == ['', '']")) - eq({ '', '' }, nvim('eval', 'matcharg(1)')) + eq(1, meths.nvim_eval("matcharg(1) == ['', '']")) + eq({ '', '' }, meths.nvim_eval('matcharg(1)')) end) it('works under deprecated name', function() @@ -551,10 +541,10 @@ describe('API', function() describe('nvim_call_function', 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' })) + meths.nvim_call_function('setqflist', { { { filename = 'something', lnum = 17 } }, 'r' }) + eq(17, meths.nvim_call_function('getqflist', {})[1].lnum) + eq(17, meths.nvim_call_function('eval', { 17 })) + eq('foo', meths.nvim_call_function('simplify', { 'this/./is//redundant/../../../foo' })) end) it('Vimscript validation error: returns specific error, does NOT update v:errmsg', function() @@ -629,18 +619,18 @@ describe('API', function() ]]) -- :help Dictionary-function - eq('Hello, World!', nvim('call_dict_function', 'g:test_dict_fn', 'F', { 'World' })) + eq('Hello, World!', meths.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')) + eq({ greeting = 'Hello', F = NIL }, meths.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 ...', meths.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')) + eq({ greeting = 'Hi', F2 = NIL }, meths.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@', meths.nvim_call_dict_function({ result = 'it works', G = 'G' }, 'G', {})) end) it('validation', function() @@ -758,20 +748,20 @@ describe('API', function() describe('nvim_notify', function() it('can notify a info message', function() - nvim('notify', 'hello world', 2, {}) + meths.nvim_notify('hello world', 2, {}) end) it('can be overridden', function() command('lua vim.notify = function(...) return 42 end') eq(42, meths.nvim_exec_lua("return vim.notify('Hello world')", {})) - nvim('notify', 'hello world', 4, {}) + meths.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()') - local v_errnum = string.match(nvim('eval', 'v:errmsg'), 'E%d*:') + local status, _ = pcall(meths.nvim_input, ':call bogus_fn()') + local v_errnum = string.match(meths.nvim_eval('v:errmsg'), 'E%d*:') eq(true, status) -- nvim_input() did not fail. eq('E117:', v_errnum) -- v:errmsg was updated. end) @@ -789,23 +779,23 @@ describe('API', function() end) local function run_streamed_paste_tests() it('stream: multiple chunks form one undo-block', function() - nvim('paste', '1/chunk 1 (start)\n', true, 1) - nvim('paste', '1/chunk 2 (end)\n', true, 3) + meths.nvim_paste('1/chunk 1 (start)\n', true, 1) + meths.nvim_paste('1/chunk 2 (end)\n', true, 3) local expected1 = [[ 1/chunk 1 (start) 1/chunk 2 (end) ]] expect(expected1) - nvim('paste', '2/chunk 1 (start)\n', true, 1) - nvim('paste', '2/chunk 2\n', true, 2) + meths.nvim_paste('2/chunk 1 (start)\n', true, 1) + meths.nvim_paste('2/chunk 2\n', true, 2) expect([[ 1/chunk 1 (start) 1/chunk 2 (end) 2/chunk 1 (start) 2/chunk 2 ]]) - nvim('paste', '2/chunk 3\n', true, 2) - nvim('paste', '2/chunk 4 (end)\n', true, 3) + meths.nvim_paste('2/chunk 3\n', true, 2) + meths.nvim_paste('2/chunk 4 (end)\n', true, 3) expect([[ 1/chunk 1 (start) 1/chunk 2 (end) @@ -821,10 +811,10 @@ describe('API', function() -- If nvim_paste() calls :undojoin without making any changes, this makes it an error. feed('afoou') feed('i') - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('aaaaaabbbbbbccccccdddddd') feed('u') expect('') @@ -840,17 +830,17 @@ describe('API', function() expect('') end) it('pasting one line', function() - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('aaaaaabbbbbbccccccdddddd') end) it('pasting multiple lines', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ aaaaaa bbbbbb @@ -870,17 +860,17 @@ describe('API', function() expect('||') end) it('pasting one line', function() - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('|aaaaaabbbbbbccccccdddddd|') end) it('pasting multiple lines', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ |aaaaaa bbbbbb @@ -900,17 +890,17 @@ describe('API', function() expect('||') end) it('pasting one line', function() - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('||aaaaaabbbbbbccccccdddddd') end) it('pasting multiple lines', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ ||aaaaaa bbbbbb @@ -934,24 +924,24 @@ describe('API', function() xxx|]]) end) it('with non-empty chunks', function() - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('|aaaaaabbbbbbccccccdddddd|') end) it('with empty first chunk', function() - nvim('paste', '', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('|bbbbbbccccccdddddd|') end) it('with all chunks empty', function() - nvim('paste', '', false, 1) - nvim('paste', '', false, 2) - nvim('paste', '', false, 2) - nvim('paste', '', false, 3) + meths.nvim_paste('', false, 1) + meths.nvim_paste('', false, 2) + meths.nvim_paste('', false, 2) + meths.nvim_paste('', false, 3) expect('||') end) end) @@ -969,17 +959,17 @@ describe('API', function() xxx]]) end) it('with non-empty chunks', function() - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('||aaaaaabbbbbbccccccdddddd') end) it('with empty first chunk', function() - nvim('paste', '', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('||bbbbbbccccccdddddd') end) end) @@ -997,17 +987,17 @@ describe('API', function() xxx]]) end) it('with non-empty chunks', function() - nvim('paste', 'aaaaaa', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('||aaaaaabbbbbbccccccdddddd') end) it('with empty first chunk', function() - nvim('paste', '', false, 1) - nvim('paste', 'bbbbbb', false, 2) - nvim('paste', 'cccccc', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('', false, 1) + meths.nvim_paste('bbbbbb', false, 2) + meths.nvim_paste('cccccc', false, 2) + meths.nvim_paste('dddddd', false, 3) expect('||bbbbbbccccccdddddd') end) end) @@ -1030,10 +1020,10 @@ describe('API', function() feed('ggV') end) it('pasting text without final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ aaaaaa bbbbbb @@ -1042,10 +1032,10 @@ describe('API', function() 123456789]]) end) it('pasting text with final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd\n', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd\n', false, 3) expect([[ aaaaaa bbbbbb @@ -1060,10 +1050,10 @@ describe('API', function() feed('2ggV') end) it('pasting text without final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ 123456789 aaaaaa @@ -1072,10 +1062,10 @@ describe('API', function() dddddd123456789]]) end) it('pasting text with final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd\n', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd\n', false, 3) expect([[ 123456789 aaaaaa @@ -1090,10 +1080,10 @@ describe('API', function() feed('3ggV') end) it('pasting text without final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ 123456789 987654321 @@ -1103,10 +1093,10 @@ describe('API', function() dddddd]]) end) it('pasting text with final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd\n', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd\n', false, 3) expect([[ 123456789 987654321 @@ -1122,10 +1112,10 @@ describe('API', function() feed('ggVG') end) it('pasting text without final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd', false, 3) expect([[ aaaaaa bbbbbb @@ -1133,10 +1123,10 @@ describe('API', function() dddddd]]) end) it('pasting text with final new line', function() - nvim('paste', 'aaaaaa\n', false, 1) - nvim('paste', 'bbbbbb\n', false, 2) - nvim('paste', 'cccccc\n', false, 2) - nvim('paste', 'dddddd\n', false, 3) + meths.nvim_paste('aaaaaa\n', false, 1) + meths.nvim_paste('bbbbbb\n', false, 2) + meths.nvim_paste('cccccc\n', false, 2) + meths.nvim_paste('dddddd\n', false, 3) expect([[ aaaaaa bbbbbb @@ -1158,17 +1148,17 @@ describe('API', function() end) it('non-streaming', function() -- With final "\n". - nvim('paste', 'line 1\nline 2\nline 3\n', true, -1) + meths.nvim_paste('line 1\nline 2\nline 3\n', true, -1) expect([[ line 1 line 2 line 3 ]]) eq({ 0, 4, 1, 0 }, funcs.getpos('.')) -- Cursor follows the paste. - eq(false, nvim('get_option_value', 'paste', {})) + eq(false, meths.nvim_get_option_value('paste', {})) command('%delete _') -- Without final "\n". - nvim('paste', 'line 1\nline 2\nline 3', true, -1) + meths.nvim_paste('line 1\nline 2\nline 3', true, -1) expect([[ line 1 line 2 @@ -1176,7 +1166,7 @@ describe('API', function() 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) + meths.nvim_paste('line 1\r\nline 2\r\nline 3\r\n', true, -1) expect([[ line 1 line 2 @@ -1185,7 +1175,7 @@ describe('API', function() 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) + meths.nvim_paste('line 1\r\nline 2\r\nline 3\r', true, -1) expect([[ line 1 line 2 @@ -1194,7 +1184,7 @@ describe('API', function() 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) + meths.nvim_paste('line 1\r\nline 2\r\nline 3', true, -1) expect([[ line 1 line 2 @@ -1202,27 +1192,27 @@ describe('API', function() 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) + meths.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(false, nvim('get_option_value', 'paste', {})) + eq(false, meths.nvim_get_option_value('paste', {})) end) it('Replace-mode', function() -- Within single line - nvim('put', { 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) + meths.nvim_put({ 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) command('normal l') command('startreplace') - nvim('paste', '123456', true, -1) + meths.nvim_paste('123456', true, -1) expect([[ a123456d eeffgghh iijjkkll]]) command('%delete _') -- Across lines - nvim('put', { 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) + meths.nvim_put({ 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) command('normal l') command('startreplace') - nvim('paste', '123\n456', true, -1) + meths.nvim_paste('123\n456', true, -1) expect([[ a123 456d @@ -1231,20 +1221,20 @@ describe('API', function() end) it('when searching in Visual mode', function() feed('v/') - nvim('paste', 'aabbccdd', true, -1) + meths.nvim_paste('aabbccdd', true, -1) eq('aabbccdd', funcs.getcmdline()) expect('') end) it('mappings are disabled in Cmdline mode', function() command('cnoremap a b') feed(':') - nvim('paste', 'a', true, -1) + meths.nvim_paste('a', true, -1) eq('a', funcs.getcmdline()) end) it('pasted text is saved in cmdline history when comes from mapping #20957', function() command('cnoremap ') feed(':') - nvim('paste', 'echo', true, -1) + meths.nvim_paste('echo', true, -1) eq('', funcs.histget(':')) feed('') eq('echo', funcs.histget(':')) @@ -1253,8 +1243,8 @@ describe('API', function() local screen = Screen.new(20, 4) screen:attach() feed(':') - nvim('paste', 'Foo', true, 1) - nvim('paste', '', true, 3) + meths.nvim_paste('Foo', true, 1) + meths.nvim_paste('', true, 3) screen:expect([[ | ~ |*2 @@ -1265,7 +1255,7 @@ describe('API', function() local screen = Screen.new(20, 4) screen:attach() feed(':') - nvim('paste', 'normal! \023\022\006\027', true, -1) + meths.nvim_paste('normal! \023\022\006\027', true, -1) screen:expect([[ | ~ |*2 @@ -1273,12 +1263,12 @@ describe('API', function() ]]) end) 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) + meths.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('.')) end) it('vim.paste() failure', function() - nvim('exec_lua', 'vim.paste = (function(lines, phase) error("fake fail") end)', {}) + meths.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)) end) end) @@ -1300,7 +1290,7 @@ describe('API', function() end) it('inserts text', function() -- linewise - nvim('put', { 'line 1', 'line 2', 'line 3' }, 'l', true, true) + meths.nvim_put({ 'line 1', 'line 2', 'line 3' }, 'l', true, true) expect([[ line 1 @@ -1309,14 +1299,14 @@ describe('API', function() eq({ 0, 4, 1, 0 }, funcs.getpos('.')) command('%delete _') -- charwise - nvim('put', { 'line 1', 'line 2', 'line 3' }, 'c', true, false) + meths.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 -- blockwise - nvim('put', { 'AA', 'BB' }, 'b', true, true) + meths.nvim_put({ 'AA', 'BB' }, 'b', true, true) expect([[ lAAine 1 lBBine 2 @@ -1324,35 +1314,35 @@ describe('API', function() eq({ 0, 2, 4, 0 }, funcs.getpos('.')) command('%delete _') -- Empty lines list. - nvim('put', {}, 'c', true, true) + meths.nvim_put({}, 'c', true, true) eq({ 0, 1, 1, 0 }, funcs.getpos('.')) expect([[]]) -- Single empty line. - nvim('put', { '' }, 'c', true, true) + meths.nvim_put({ '' }, 'c', true, true) eq({ 0, 1, 1, 0 }, funcs.getpos('.')) expect([[ ]]) - nvim('put', { 'AB' }, 'c', true, true) + meths.nvim_put({ 'AB' }, 'c', true, true) -- after=false, follow=true - nvim('put', { 'line 1', 'line 2' }, 'c', false, true) + meths.nvim_put({ 'line 1', 'line 2' }, 'c', false, true) expect([[ Aline 1 line 2B]]) eq({ 0, 2, 7, 0 }, funcs.getpos('.')) command('%delete _') - nvim('put', { 'AB' }, 'c', true, true) + meths.nvim_put({ 'AB' }, 'c', true, true) -- after=false, follow=false - nvim('put', { 'line 1', 'line 2' }, 'c', false, false) + meths.nvim_put({ 'line 1', 'line 2' }, 'c', false, false) expect([[ Aline 1 line 2B]]) eq({ 0, 1, 2, 0 }, funcs.getpos('.')) - eq('', nvim('eval', 'v:errmsg')) + eq('', meths.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) + meths.nvim_put({ 'line 1', 'line 2', 'line 3', '' }, '', true, true) expect([[ line 1 @@ -1361,7 +1351,7 @@ describe('API', function() 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) + meths.nvim_put({ 'line 1', 'line 2', 'line 3' }, '', true, true) expect([[ line 1 line 2 @@ -1399,22 +1389,22 @@ describe('API', function() describe('nvim_strwidth', function() it('works', function() - eq(3, nvim('strwidth', 'abc')) + eq(3, meths.nvim_strwidth('abc')) -- 6 + (neovim) -- 19 * 2 (each japanese character occupies two cells) - eq(44, nvim('strwidth', 'neovimのデザインかなりまともなのになってる。')) + eq(44, meths.nvim_strwidth('neovimのデザインかなりまともなのになってる。')) end) it('cannot handle NULs', function() - eq(0, nvim('strwidth', '\0abc')) + eq(0, meths.nvim_strwidth('\0abc')) end) end) describe('nvim_get_current_line, nvim_set_current_line', function() it('works', function() - eq('', nvim('get_current_line')) - nvim('set_current_line', 'abc') - eq('abc', nvim('get_current_line')) + eq('', meths.nvim_get_current_line()) + meths.nvim_set_current_line('abc') + eq('abc', meths.nvim_get_current_line()) end) end) @@ -1425,9 +1415,9 @@ 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')) + meths.nvim_set_var('lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_get_var('lua')) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('g:lua')) eq(1, funcs.exists('g:lua')) meths.nvim_del_var('lua') eq(0, funcs.exists('g:lua')) @@ -1435,8 +1425,8 @@ describe('API', function() meths.nvim_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')) + meths.nvim_set_var('dict_empty_key', { [''] = 'empty key' }) + eq({ [''] = 'empty key' }, meths.nvim_get_var('dict_empty_key')) -- Set locked g: var. command('lockvar lua') @@ -1549,182 +1539,182 @@ describe('API', function() end) it('truncates values with NULs in them', function() - nvim('set_var', 'xxx', 'ab\0cd') - eq('ab', nvim('get_var', 'xxx')) + meths.nvim_set_var('xxx', 'ab\0cd') + eq('ab', meths.nvim_get_var('xxx')) end) end) describe('nvim_get_option_value, nvim_set_option_value', function() it('works', function() - ok(nvim('get_option_value', 'equalalways', {})) - nvim('set_option_value', 'equalalways', false, {}) - ok(not nvim('get_option_value', 'equalalways', {})) + ok(meths.nvim_get_option_value('equalalways', {})) + meths.nvim_set_option_value('equalalways', false, {}) + ok(not meths.nvim_get_option_value('equalalways', {})) end) it('works to get global value of local options', function() - eq(false, nvim('get_option_value', 'lisp', {})) - eq(8, nvim('get_option_value', 'shiftwidth', {})) + eq(false, meths.nvim_get_option_value('lisp', {})) + eq(8, meths.nvim_get_option_value('shiftwidth', {})) 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' })) - 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' }) - eq('20', nvim('command_output', 'setglobal shiftwidth?'):match('%d+')) - eq('8', nvim('command_output', 'setlocal shiftwidth?'):match('%d+')) + meths.nvim_set_option_value('lisp', true, { scope = 'global' }) + eq(true, meths.nvim_get_option_value('lisp', { scope = 'global' })) + eq(false, meths.nvim_get_option_value('lisp', {})) + eq(nil, command_output('setglobal lisp?'):match('nolisp')) + eq('nolisp', command_output('setlocal lisp?'):match('nolisp')) + meths.nvim_set_option_value('shiftwidth', 20, { scope = 'global' }) + eq('20', command_output('setglobal shiftwidth?'):match('%d+')) + eq('8', 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?') + meths.nvim_set_option_value('equalalways', false, {}) + local status, rv = pcall(command_output, 'verbose set equalalways?') eq(true, status) 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?') + meths.nvim_exec_lua('vim.api.nvim_set_option_value("equalalways", true, {})', {}) + status, rv = pcall(command_output, 'verbose set equalalways?') eq(true, status) eq(' equalalways\n\tLast set from Lua', rv) end) it('updates whether the option has ever been set #25025', function() - eq(false, nvim('get_option_info2', 'autochdir', {}).was_set) - nvim('set_option_value', 'autochdir', true, {}) - eq(true, nvim('get_option_info2', 'autochdir', {}).was_set) + eq(false, meths.nvim_get_option_info2('autochdir', {}).was_set) + meths.nvim_set_option_value('autochdir', true, {}) + eq(true, meths.nvim_get_option_info2('autochdir', {}).was_set) - eq(false, nvim('get_option_info2', 'cmdwinheight', {}).was_set) - nvim('set_option_value', 'cmdwinheight', 10, {}) - eq(true, nvim('get_option_info2', 'cmdwinheight', {}).was_set) + eq(false, meths.nvim_get_option_info2('cmdwinheight', {}).was_set) + meths.nvim_set_option_value('cmdwinheight', 10, {}) + eq(true, meths.nvim_get_option_info2('cmdwinheight', {}).was_set) - eq(false, nvim('get_option_info2', 'debug', {}).was_set) - nvim('set_option_value', 'debug', 'beep', {}) - eq(true, nvim('get_option_info2', 'debug', {}).was_set) + eq(false, meths.nvim_get_option_info2('debug', {}).was_set) + meths.nvim_set_option_value('debug', 'beep', {}) + eq(true, meths.nvim_get_option_info2('debug', {}).was_set) end) it('validation', function() eq( "Invalid 'scope': expected 'local' or 'global'", - pcall_err(nvim, 'get_option_value', 'scrolloff', { scope = 'bogus' }) + pcall_err(meths.nvim_get_option_value, 'scrolloff', { scope = 'bogus' }) ) eq( "Invalid 'scope': expected 'local' or 'global'", - pcall_err(nvim, 'set_option_value', 'scrolloff', 1, { scope = 'bogus' }) + pcall_err(meths.nvim_set_option_value, 'scrolloff', 1, { scope = 'bogus' }) ) eq( "Invalid 'scope': expected String, got Integer", - pcall_err(nvim, 'get_option_value', 'scrolloff', { scope = 42 }) + pcall_err(meths.nvim_get_option_value, 'scrolloff', { scope = 42 }) ) eq( "Invalid 'value': expected valid option type, got Array", - pcall_err(nvim, 'set_option_value', 'scrolloff', {}, {}) + pcall_err(meths.nvim_set_option_value, 'scrolloff', {}, {}) ) eq( "Invalid value for option 'scrolloff': expected number, got boolean true", - pcall_err(nvim, 'set_option_value', 'scrolloff', true, {}) + pcall_err(meths.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', {}) + pcall_err(meths.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(0, meths.nvim_get_option_value('scrolloff', {})) + eq(-1, meths.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' })) - nvim('set_option_value', 'makeprg', 'hello', {}) - eq('hello', nvim('get_option_value', 'makeprg', { scope = 'global' })) - eq('hello', nvim('get_option_value', 'makeprg', {})) - eq('', nvim('get_option_value', 'makeprg', { scope = 'local' })) + meths.nvim_set_option_value('makeprg', 'hello', {}) + eq('hello', meths.nvim_get_option_value('makeprg', {})) + eq('', meths.nvim_get_option_value('makeprg', { scope = 'local' })) + meths.nvim_set_option_value('makeprg', 'world', { scope = 'local' }) + eq('world', meths.nvim_get_option_value('makeprg', { scope = 'local' })) + meths.nvim_set_option_value('makeprg', 'goodbye', { scope = 'global' }) + eq('goodbye', meths.nvim_get_option_value('makeprg', { scope = 'global' })) + meths.nvim_set_option_value('makeprg', 'hello', {}) + eq('hello', meths.nvim_get_option_value('makeprg', { scope = 'global' })) + eq('hello', meths.nvim_get_option_value('makeprg', {})) + eq('', meths.nvim_get_option_value('makeprg', { scope = 'local' })) end) it('clears the local value of an option with nil', function() -- Set global value - nvim('set_option_value', 'shiftwidth', 42, {}) - eq(42, nvim('get_option_value', 'shiftwidth', {})) + meths.nvim_set_option_value('shiftwidth', 42, {}) + eq(42, meths.nvim_get_option_value('shiftwidth', {})) -- Set local value - 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' })) + meths.nvim_set_option_value('shiftwidth', 8, { scope = 'local' }) + eq(8, meths.nvim_get_option_value('shiftwidth', {})) + eq(8, meths.nvim_get_option_value('shiftwidth', { scope = 'local' })) + eq(42, meths.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' })) + meths.nvim_set_option_value('shiftwidth', NIL, {}) + eq(42, meths.nvim_get_option_value('shiftwidth', {})) + eq(42, meths.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' }) - eq(42, nvim('get_option_value', 'shiftwidth', {})) - eq(42, nvim('get_option_value', 'shiftwidth', { scope = 'local' })) + meths.nvim_set_option_value('shiftwidth', 8, { scope = 'local' }) + meths.nvim_set_option_value('shiftwidth', NIL, { scope = 'local' }) + eq(42, meths.nvim_get_option_value('shiftwidth', {})) + eq(42, meths.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' })) - eq(1000, nvim('get_option_value', 'undolevels', {})) + meths.nvim_set_option_value('undolevels', 1000, {}) + meths.nvim_set_option_value('undolevels', 1200, { scope = 'local' }) + eq(1200, meths.nvim_get_option_value('undolevels', { scope = 'local' })) + meths.nvim_set_option_value('undolevels', NIL, { scope = 'local' }) + eq(-123456, meths.nvim_get_option_value('undolevels', { scope = 'local' })) + eq(1000, meths.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' })) - eq(true, nvim('get_option_value', 'autoread', {})) + meths.nvim_set_option_value('autoread', true, {}) + meths.nvim_set_option_value('autoread', false, { scope = 'local' }) + eq(false, meths.nvim_get_option_value('autoread', { scope = 'local' })) + meths.nvim_set_option_value('autoread', NIL, { scope = 'local' }) + eq(NIL, meths.nvim_get_option_value('autoread', { scope = 'local' })) + eq(true, meths.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' })) + meths.nvim_set_option_value('colorcolumn', '4,3', {}) + eq('4,3', meths.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', meths.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' })) + meths.nvim_set_option_value('colorcolumn', '4,3', { win = 0, scope = 'local' }) + eq('4,3', meths.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' })) + eq('', meths.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 })) + command('new') + local buf = meths.nvim_get_current_buf().id + meths.nvim_set_option_value('tagfunc', 'foobar', { buf = buf }) + eq('foobar', meths.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 })) + local win = meths.nvim_get_current_win().id + meths.nvim_set_option_value('number', true, { win = win }) + eq(true, meths.nvim_get_option_value('number', { win = win })) end) it('getting current buffer option does not adjust cursor #19381', function() - nvim('command', 'new') - local buf = nvim('get_current_buf').id - local win = nvim('get_current_win').id + command('new') + local buf = meths.nvim_get_current_buf().id + local win = meths.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 }, meths.nvim_win_get_cursor(win)) + meths.nvim_get_option_value('filetype', { buf = buf }) + eq({ 1, 9 }, meths.nvim_win_get_cursor(win)) end) it('can get default option values for filetypes', function() @@ -1736,156 +1726,156 @@ describe('API', function() xml = { formatexpr = 'xmlformat#Format()' }, } do for option, value in pairs(opts) do - eq(value, nvim('get_option_value', option, { filetype = ft })) + eq(value, meths.nvim_get_option_value(option, { filetype = ft })) end end command 'au FileType lua setlocal commentstring=NEW\\ %s' - eq('NEW %s', nvim('get_option_value', 'commentstring', { filetype = 'lua' })) + eq('NEW %s', meths.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' }) + pcall_err(meths.nvim_get_option_value, 'commentstring', { filetype = 'lua' }) ) end) it("value of 'modified' is always false for scratch buffers", function() - nvim('set_current_buf', nvim('create_buf', true, true)) + meths.nvim_set_current_buf(meths.nvim_create_buf(true, true)) insert([[ foo bar baz ]]) - eq(false, nvim('get_option_value', 'modified', {})) + eq(false, meths.nvim_get_option_value('modified', {})) end) end) describe('nvim_{get,set}_current_buf, nvim_list_bufs', function() it('works', function() - eq(1, #nvim('list_bufs')) - eq(nvim('list_bufs')[1], nvim('get_current_buf')) - nvim('command', 'new') - eq(2, #nvim('list_bufs')) - eq(nvim('list_bufs')[2], nvim('get_current_buf')) - nvim('set_current_buf', nvim('list_bufs')[1]) - eq(nvim('list_bufs')[1], nvim('get_current_buf')) + eq(1, #meths.nvim_list_bufs()) + eq(meths.nvim_list_bufs()[1], meths.nvim_get_current_buf()) + command('new') + eq(2, #meths.nvim_list_bufs()) + eq(meths.nvim_list_bufs()[2], meths.nvim_get_current_buf()) + meths.nvim_set_current_buf(meths.nvim_list_bufs()[1]) + eq(meths.nvim_list_bufs()[1], meths.nvim_get_current_buf()) end) end) describe('nvim_{get,set}_current_win, nvim_list_wins', function() it('works', function() - eq(1, #nvim('list_wins')) - eq(nvim('list_wins')[1], nvim('get_current_win')) - nvim('command', 'vsplit') - nvim('command', 'split') - eq(3, #nvim('list_wins')) - eq(nvim('list_wins')[1], nvim('get_current_win')) - nvim('set_current_win', nvim('list_wins')[2]) - eq(nvim('list_wins')[2], nvim('get_current_win')) + eq(1, #meths.nvim_list_wins()) + eq(meths.nvim_list_wins()[1], meths.nvim_get_current_win()) + command('vsplit') + command('split') + eq(3, #meths.nvim_list_wins()) + eq(meths.nvim_list_wins()[1], meths.nvim_get_current_win()) + meths.nvim_set_current_win(meths.nvim_list_wins()[2]) + eq(meths.nvim_list_wins()[2], meths.nvim_get_current_win()) end) end) describe('nvim_{get,set}_current_tabpage, nvim_list_tabpages', function() it('works', function() - eq(1, #nvim('list_tabpages')) - eq(nvim('list_tabpages')[1], nvim('get_current_tabpage')) - nvim('command', 'tabnew') - eq(2, #nvim('list_tabpages')) - eq(2, #nvim('list_wins')) - eq(nvim('list_wins')[2], nvim('get_current_win')) - eq(nvim('list_tabpages')[2], nvim('get_current_tabpage')) - nvim('set_current_win', nvim('list_wins')[1]) + eq(1, #meths.nvim_list_tabpages()) + eq(meths.nvim_list_tabpages()[1], meths.nvim_get_current_tabpage()) + command('tabnew') + eq(2, #meths.nvim_list_tabpages()) + eq(2, #meths.nvim_list_wins()) + eq(meths.nvim_list_wins()[2], meths.nvim_get_current_win()) + eq(meths.nvim_list_tabpages()[2], meths.nvim_get_current_tabpage()) + meths.nvim_set_current_win(meths.nvim_list_wins()[1]) -- Switching window also switches tabpages if necessary - eq(nvim('list_tabpages')[1], nvim('get_current_tabpage')) - eq(nvim('list_wins')[1], nvim('get_current_win')) - nvim('set_current_tabpage', nvim('list_tabpages')[2]) - eq(nvim('list_tabpages')[2], nvim('get_current_tabpage')) - eq(nvim('list_wins')[2], nvim('get_current_win')) + eq(meths.nvim_list_tabpages()[1], meths.nvim_get_current_tabpage()) + eq(meths.nvim_list_wins()[1], meths.nvim_get_current_win()) + meths.nvim_set_current_tabpage(meths.nvim_list_tabpages()[2]) + eq(meths.nvim_list_tabpages()[2], meths.nvim_get_current_tabpage()) + eq(meths.nvim_list_wins()[2], meths.nvim_get_current_win()) end) 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', [[]]) - eq(2, nvim('eval', "line('.')")) - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + meths.nvim_input('o') -- add a line + eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) + meths.nvim_input([[]]) + eq(2, meths.nvim_eval("line('.')")) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) - nvim('input', 'g') - eq({ mode = 'n', blocking = true }, nvim('get_mode')) + meths.nvim_input('g') + eq({ mode = 'n', blocking = true }, meths.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')) + meths.nvim_input('k') -- complete the operator + eq(1, meths.nvim_eval("line('.')")) -- verify the completed operator + eq({ mode = 'n', blocking = false }, meths.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')) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) end - nvim('input', 'g') + meths.nvim_input('g') for _ = 1, 4 do - eq({ mode = 'n', blocking = true }, nvim('get_mode')) + eq({ mode = 'n', blocking = true }, meths.nvim_get_mode()) end - nvim('input', 'g') + meths.nvim_input('g') for _ = 1, 7 do - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) end end) it('during normal-mode CTRL-W, returns blocking=true', function() - nvim('input', '') - eq({ mode = 'n', blocking = true }, nvim('get_mode')) + meths.nvim_input('') + eq({ mode = 'n', blocking = true }, meths.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')) + meths.nvim_input('s') -- complete the operator + eq(2, meths.nvim_eval("winnr('$')")) -- verify the completed operator + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) end) it('during press-enter prompt without UI returns blocking=false', function() - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + eq({ mode = 'n', blocking = false }, meths.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') - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + meths.nvim_input(':messages') + eq({ mode = 'n', blocking = false }, meths.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')) + meths.nvim_ui_attach(80, 20, {}) + eq({ mode = 'n', blocking = false }, meths.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') - eq({ mode = 'r', blocking = true }, nvim('get_mode')) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + meths.nvim_input(':messages') + eq({ mode = 'r', blocking = true }, meths.nvim_get_mode()) end) it('during getchar() returns blocking=false', function() - nvim('input', ':let g:test_input = nr2char(getchar())') + meths.nvim_input(':let g:test_input = nr2char(getchar())') -- 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 }, meths.nvim_get_mode()) + eq(0, meths.nvim_eval("exists('g:test_input')")) + meths.nvim_input('J') + eq('J', meths.nvim_eval('g:test_input')) + eq({ mode = 'n', blocking = false }, meths.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')) + meths.nvim_ui_attach(80, 20, {}) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") @@ -1907,34 +1897,34 @@ describe('API', function() }, NIL, }, meths.nvim_call_atomic(req)) - eq({ mode = 'r', blocking = true }, nvim('get_mode')) + eq({ mode = 'r', blocking = true }, meths.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')) + meths.nvim_input('ix') + eq({ mode = 'i', blocking = true }, meths.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')) + meths.nvim_input('gu') + eq({ mode = 'no', blocking = false }, meths.nvim_get_mode()) end) it("at '-- More --' prompt returns blocking=true #11899", function() command('set more') feed(':digraphs') - eq({ mode = 'rm', blocking = true }, nvim('get_mode')) + eq({ mode = 'rm', blocking = true }, meths.nvim_get_mode()) end) it('after mapping returns blocking=false #17257', function() command('nnoremap ') feed('') - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) end) it('after empty string mapping returns blocking=false #17257', function() command('nnoremap ""') feed('') - eq({ mode = 'n', blocking = false }, nvim('get_mode')) + eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) end) end) @@ -1943,16 +1933,16 @@ describe('API', function() helpers.insert([[ FIRST LINE SECOND LINE]]) - nvim('input', 'gg') - nvim('input', 'gu') + meths.nvim_input('gg') + meths.nvim_input('gu') -- Make any RPC request (can be non-async: op-pending does not block). - nvim('get_current_buf') + meths.nvim_get_current_buf() -- Buffer should not change. expect([[ FIRST LINE SECOND LINE]]) -- Now send input to complete the operator. - nvim('input', 'j') + meths.nvim_input('j') expect([[ first line second line]]) @@ -1966,7 +1956,7 @@ describe('API', function() feed('iabckkk') feed('d') -- Make any RPC request (can be non-async: op-pending does not block). - nvim('get_current_buf') + meths.nvim_get_current_buf() screen:expect([[ ^a$ | b$ | @@ -1980,12 +1970,12 @@ describe('API', function() helpers.insert([[ FIRST LINE SECOND LINE]]) - nvim('input', 'gg') - nvim('input', 'd') + meths.nvim_input('gg') + meths.nvim_input('d') -- Make any RPC request (must be async, because map-pending blocks). - nvim('get_api_info') + meths.nvim_get_api_info() -- Send input to complete the mapping. - nvim('input', 'd') + meths.nvim_input('d') expect([[ FIRST LINE SECOND LINE]]) @@ -1998,11 +1988,11 @@ describe('API', function() helpers.insert([[ FIRST LINE SECOND LINE]]) - nvim('input', 'ix') + meths.nvim_input('ix') -- Make any RPC request (must be async, because map-pending blocks). - nvim('get_api_info') + meths.nvim_get_api_info() -- Send input to complete the mapping. - nvim('input', 'x') + meths.nvim_input('x') expect([[ FIRST LINE SECOND LINfooE]]) @@ -2059,28 +2049,28 @@ describe('API', function() describe('nvim_get_context', function() it('validation', function() - eq("Invalid key: 'blah'", pcall_err(nvim, 'get_context', { blah = {} })) + eq("Invalid key: 'blah'", pcall_err(meths.nvim_get_context, { blah = {} })) eq( "Invalid 'types': expected Array, got Integer", - pcall_err(nvim, 'get_context', { types = 42 }) + pcall_err(meths.nvim_get_context, { types = 42 }) ) eq( "Invalid 'type': 'zub'", - pcall_err(nvim, 'get_context', { types = { 'jumps', 'zub', 'zam' } }) + pcall_err(meths.nvim_get_context, { types = { 'jumps', 'zub', 'zam' } }) ) end) it('returns map of current editor state', function() local opts = { types = { 'regs', 'jumps', 'bufs', 'gvars' } } - eq({}, parse_context(nvim('get_context', {}))) + eq({}, parse_context(meths.nvim_get_context({}))) feed('i123ddddddqahjklquuu') feed('gg') feed('G') command('edit! BUF1') command('edit BUF2') - nvim('set_var', 'one', 1) - nvim('set_var', 'Two', 2) - nvim('set_var', 'THREE', 3) + meths.nvim_set_var('one', 1) + meths.nvim_set_var('Two', 2) + meths.nvim_set_var('THREE', 3) local expected_ctx = { ['regs'] = { @@ -2105,72 +2095,72 @@ describe('API', function() ['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(meths.nvim_get_context(opts))) + eq(expected_ctx, parse_context(meths.nvim_get_context({}))) + eq(expected_ctx, parse_context(meths.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' } } - eq({}, parse_context(nvim('get_context', opts))) - - nvim('set_var', 'one', 1) - nvim('set_var', 'Two', 2) - nvim('set_var', 'THREE', 3) - local ctx = nvim('get_context', opts) - nvim('set_var', 'one', 'a') - nvim('set_var', 'Two', 'b') - nvim('set_var', 'THREE', 'c') + eq({}, parse_context(meths.nvim_get_context(opts))) + + meths.nvim_set_var('one', 1) + meths.nvim_set_var('Two', 2) + meths.nvim_set_var('THREE', 3) + local ctx = meths.nvim_get_context(opts) + meths.nvim_set_var('one', 'a') + meths.nvim_set_var('Two', 'b') + meths.nvim_set_var('THREE', 'c') eq({ 'a', 'b', 'c' }, eval('[g:one, g:Two, g:THREE]')) - nvim('load_context', ctx) + meths.nvim_load_context(ctx) 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 = { {} } }) + pcall_err(meths.nvim_load_context, { regs = { {} }, jumps = { {} } }) ) eq( 'E474: Failed to convert list to msgpack string buffer', - pcall_err(nvim, 'load_context', { regs = { { [''] = '' } } }) + pcall_err(meths.nvim_load_context, { regs = { { [''] = '' } } }) ) end) end) describe('nvim_replace_termcodes', function() it('escapes K_SPECIAL as K_SPECIAL KS_SPECIAL KE_FILLER', function() - eq('\128\254X', helpers.nvim('replace_termcodes', '\128', true, true, true)) + eq('\128\254X', helpers.meths.nvim_replace_termcodes('\128', true, true, true)) end) it('leaves non-K_SPECIAL string unchanged', function() - eq('abc', helpers.nvim('replace_termcodes', 'abc', true, true, true)) + eq('abc', helpers.meths.nvim_replace_termcodes('abc', true, true, true)) end) it('converts ', function() - eq('\\', helpers.nvim('replace_termcodes', '', true, true, true)) + eq('\\', helpers.meths.nvim_replace_termcodes('', true, true, true)) end) it('converts to K_SPECIAL KS_EXTRA KE_LEFTMOUSE', function() -- K_SPECIAL KS_EXTRA KE_LEFTMOUSE -- 0x80 0xfd 0x2c -- 128 253 44 - eq('\128\253\44', helpers.nvim('replace_termcodes', '', true, true, true)) + eq('\128\253\44', helpers.meths.nvim_replace_termcodes('', true, true, true)) end) it('converts keycodes', function() eq( '\nx\27x\rxxxxx', true, true, true) + helpers.meths.nvim_replace_termcodes('xxxx', true, true, true) ) end) it('does not convert keycodes if special=false', function() eq( 'xxxx', - helpers.nvim('replace_termcodes', 'xxxx', true, true, false) + helpers.meths.nvim_replace_termcodes('xxxx', true, true, false) ) end) @@ -2196,15 +2186,15 @@ describe('API', function() it('K_SPECIAL escaping', function() local function on_setup() -- notice the special char(…) \xe2\80\xa6 - nvim('feedkeys', ':let x1="…"\n', '', true) + meths.nvim_feedkeys(':let x1="…"\n', '', true) -- Both nvim_replace_termcodes and nvim_feedkeys escape \x80 - local inp = helpers.nvim('replace_termcodes', ':let x2="…"', true, true, true) - nvim('feedkeys', inp, '', true) -- escape_ks=true + local inp = helpers.meths.nvim_replace_termcodes(':let x2="…"', true, true, true) + meths.nvim_feedkeys(inp, '', true) -- escape_ks=true -- nvim_feedkeys with K_SPECIAL escaping disabled - inp = helpers.nvim('replace_termcodes', ':let x3="…"', true, true, true) - nvim('feedkeys', inp, '', false) -- escape_ks=false + inp = helpers.meths.nvim_replace_termcodes(':let x3="…"', true, true, true) + meths.nvim_feedkeys(inp, '', false) -- escape_ks=false helpers.stop() end @@ -2212,10 +2202,10 @@ describe('API', function() -- spin the loop a bit helpers.run(nil, nil, on_setup) - eq('…', nvim('get_var', 'x1')) + eq('…', meths.nvim_get_var('x1')) -- Because of the double escaping this is neq - neq('…', nvim('get_var', 'x2')) - eq('…', nvim('get_var', 'x3')) + neq('…', meths.nvim_get_var('x2')) + eq('…', meths.nvim_get_var('x3')) end) end) @@ -2709,20 +2699,20 @@ describe('API', function() end) it('can throw exceptions', function() - local status, err = pcall(nvim, 'get_option_value', 'invalid-option', {}) + local status, err = pcall(meths.nvim_get_option_value, 'invalid-option', {}) eq(false, status) ok(err:match("Unknown option 'invalid%-option'") ~= nil) end) it('does not truncate error message <1 MB #5984', function() local very_long_name = 'A' .. ('x'):rep(10000) .. 'Z' - local status, err = pcall(nvim, 'get_option_value', very_long_name, {}) + local status, err = pcall(meths.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' }) + local status, err = pcall(meths.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') @@ -2945,7 +2935,7 @@ describe('API', function() describe('nvim_list_uis', function() it('returns empty if --headless', function() -- Test runner defaults to --headless. - eq({}, nvim('list_uis')) + eq({}, meths.nvim_list_uis()) end) it('returns attached UIs', function() local screen = Screen.new(20, 4) @@ -2974,7 +2964,7 @@ describe('API', function() }, } - eq(expected, nvim('list_uis')) + eq(expected, meths.nvim_list_uis()) screen:detach() screen = Screen.new(44, 99) @@ -2983,7 +2973,7 @@ describe('API', function() expected[1].override = false expected[1].width = 44 expected[1].height = 99 - eq(expected, nvim('list_uis')) + eq(expected, meths.nvim_list_uis()) end) end) @@ -3007,7 +2997,7 @@ describe('API', function() eq( ' 1 %a "[No Name]" line 1\n' .. ' 2 h "[No Name]" line 0', - meths.nvim_command_output('ls') + command_output('ls') ) -- current buffer didn't change eq({ id = 1 }, meths.nvim_get_current_buf()) @@ -3436,13 +3426,13 @@ describe('API', function() end) it('can save message history', function() - nvim('command', 'set cmdheight=2') -- suppress Press ENTER - nvim('echo', { { 'msg\nmsg' }, { 'msg' } }, true, {}) + command('set cmdheight=2') -- suppress Press ENTER + meths.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 + command('set cmdheight=2') -- suppress Press ENTER nvim_async('echo', { { 'msg\nmsg' }, { 'msg' } }, false, {}) eq('', exec_capture('messages')) end) @@ -3630,12 +3620,12 @@ describe('API', function() it('works with deleted buffers', function() local fname = tmpname() write_file(fname, 'a\nbit of\text') - nvim('command', 'edit ' .. fname) + command('edit ' .. fname) local buf = meths.nvim_get_current_buf() meths.nvim_buf_set_mark(buf, 'F', 2, 2, {}) - nvim('command', 'new') -- Create new buf to avoid :bd failing - nvim('command', 'bd! ' .. buf.id) + command('new') -- Create new buf to avoid :bd failing + command('bd! ' .. buf.id) os.remove(fname) local mark = meths.nvim_get_mark('F', {}) diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 9542272447..87aa0ca2a8 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -1,21 +1,17 @@ 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 = +local clear, curbuf, curbuf_contents, curwin, eq, neq, ok, feed, insert, eval = helpers.clear, - helpers.nvim, - helpers.curbuf, + helpers.meths.nvim_get_current_buf, helpers.curbuf_contents, - helpers.window, - helpers.curwin, + helpers.meths.nvim_get_current_win, helpers.eq, helpers.neq, helpers.ok, helpers.feed, helpers.insert, - helpers.eval, - helpers.tabpage + helpers.eval local poke_eventloop = helpers.poke_eventloop -local curwinmeths = helpers.curwinmeths local exec = helpers.exec local funcs = helpers.funcs local request = helpers.request @@ -30,26 +26,35 @@ describe('API/win', function() describe('get_buf', function() it('works', function() - eq(curbuf(), window('get_buf', nvim('list_wins')[1])) - 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])) + eq(curbuf(), meths.nvim_win_get_buf(meths.nvim_list_wins()[1])) + command('new') + meths.nvim_set_current_win(meths.nvim_list_wins()[2]) + eq(curbuf(), meths.nvim_win_get_buf(meths.nvim_list_wins()[2])) + neq( + meths.nvim_win_get_buf(meths.nvim_list_wins()[1]), + meths.nvim_win_get_buf(meths.nvim_list_wins()[2]) + ) end) end) describe('set_buf', function() it('works', function() - nvim('command', 'new') - local windows = nvim('list_wins') - neq(window('get_buf', windows[2]), window('get_buf', windows[1])) - window('set_buf', windows[2], window('get_buf', windows[1])) - eq(window('get_buf', windows[2]), window('get_buf', windows[1])) + command('new') + local windows = meths.nvim_list_wins() + neq(meths.nvim_win_get_buf(windows[2]), meths.nvim_win_get_buf(windows[1])) + meths.nvim_win_set_buf(windows[2], meths.nvim_win_get_buf(windows[1])) + eq(meths.nvim_win_get_buf(windows[2]), meths.nvim_win_get_buf(windows[1])) end) it('validates args', function() - eq('Invalid buffer id: 23', pcall_err(window, 'set_buf', nvim('get_current_win'), 23)) - eq('Invalid window id: 23', pcall_err(window, 'set_buf', 23, nvim('get_current_buf'))) + eq( + 'Invalid buffer id: 23', + pcall_err(meths.nvim_win_set_buf, meths.nvim_get_current_win(), 23) + ) + eq( + 'Invalid window id: 23', + pcall_err(meths.nvim_win_set_buf, 23, meths.nvim_get_current_buf()) + ) end) it('disallowed in cmdwin if win={old_}curwin or buf=curbuf', function() @@ -84,12 +89,12 @@ describe('API/win', function() describe('{get,set}_cursor', function() it('works', function() - eq({ 1, 0 }, curwin('get_cursor')) - nvim('command', 'normal ityping\027o some text') + eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) + command('normal ityping\027o some text') eq('typing\n some text', curbuf_contents()) - eq({ 2, 10 }, curwin('get_cursor')) - curwin('set_cursor', { 2, 6 }) - nvim('command', 'normal i dumb') + eq({ 2, 10 }, meths.nvim_win_get_cursor(0)) + meths.nvim_win_set_cursor(0, { 2, 6 }) + command('normal i dumb') eq('typing\n some dumb text', curbuf_contents()) end) @@ -119,10 +124,10 @@ describe('API/win', function() ]], } -- cursor position is at beginning - eq({ 1, 0 }, window('get_cursor', win)) + eq({ 1, 0 }, meths.nvim_win_get_cursor(win)) -- move cursor to end - window('set_cursor', win, { 101, 0 }) + meths.nvim_win_set_cursor(win, { 101, 0 }) screen:expect { grid = [[ |*7 @@ -132,7 +137,7 @@ describe('API/win', function() } -- move cursor to the beginning again - window('set_cursor', win, { 1, 0 }) + meths.nvim_win_set_cursor(win, { 1, 0 }) screen:expect { grid = [[ ^prologue | @@ -141,11 +146,11 @@ describe('API/win', function() } -- move focus to new window - nvim('command', 'new') + command('new') neq(win, curwin()) -- sanity check, cursor position is kept - eq({ 1, 0 }, window('get_cursor', win)) + eq({ 1, 0 }, meths.nvim_win_get_cursor(win)) screen:expect { grid = [[ ^ | @@ -159,7 +164,7 @@ describe('API/win', function() } -- move cursor to end - window('set_cursor', win, { 101, 0 }) + meths.nvim_win_set_cursor(win, { 101, 0 }) screen:expect { grid = [[ ^ | @@ -173,7 +178,7 @@ describe('API/win', function() } -- move cursor to the beginning again - window('set_cursor', win, { 1, 0 }) + meths.nvim_win_set_cursor(win, { 1, 0 }) screen:expect { grid = [[ ^ | @@ -200,17 +205,17 @@ describe('API/win', function() -- cursor position is at beginning local win = curwin() - eq({ 1, 0 }, window('get_cursor', win)) + eq({ 1, 0 }, meths.nvim_win_get_cursor(win)) -- move cursor to column 5 - window('set_cursor', win, { 1, 5 }) + meths.nvim_win_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 }, meths.nvim_win_get_cursor(win)) end) it('updates cursorline and statusline ruler in non-current window', function() @@ -240,7 +245,7 @@ describe('API/win', function() {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 4,3 All}| | ]]) - window('set_cursor', oldwin, { 1, 0 }) + meths.nvim_win_set_cursor(oldwin, { 1, 0 }) screen:expect([[ aaa │{2:aaa }| bbb │bbb | @@ -278,7 +283,7 @@ describe('API/win', function() {3:[No Name] [+] }{4:[No Name] [+] }| | ]]) - window('set_cursor', oldwin, { 2, 0 }) + meths.nvim_win_set_cursor(oldwin, { 2, 0 }) screen:expect([[ aa{2:a} │{2:a}aa | bb{2:b} │bbb | @@ -293,32 +298,35 @@ 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])) - nvim('set_current_win', nvim('list_wins')[2]) - nvim('command', 'split') + command('vsplit') + eq( + meths.nvim_win_get_height(meths.nvim_list_wins()[2]), + meths.nvim_win_get_height(meths.nvim_list_wins()[1]) + ) + meths.nvim_set_current_win(meths.nvim_list_wins()[2]) + command('split') eq( - window('get_height', nvim('list_wins')[2]), - math.floor(window('get_height', nvim('list_wins')[1]) / 2) + meths.nvim_win_get_height(meths.nvim_list_wins()[2]), + math.floor(meths.nvim_win_get_height(meths.nvim_list_wins()[1]) / 2) ) - window('set_height', nvim('list_wins')[2], 2) - eq(2, window('get_height', nvim('list_wins')[2])) + meths.nvim_win_set_height(meths.nvim_list_wins()[2], 2) + eq(2, meths.nvim_win_get_height(meths.nvim_list_wins()[2])) end) it('correctly handles height=1', function() - nvim('command', 'split') - nvim('set_current_win', nvim('list_wins')[1]) - window('set_height', nvim('list_wins')[2], 1) - eq(1, window('get_height', nvim('list_wins')[2])) + command('split') + meths.nvim_set_current_win(meths.nvim_list_wins()[1]) + meths.nvim_win_set_height(meths.nvim_list_wins()[2], 1) + eq(1, meths.nvim_win_get_height(meths.nvim_list_wins()[2])) end) it('correctly handles height=1 with a winbar', function() - nvim('command', 'set winbar=foobar') - nvim('command', 'set winminheight=0') - nvim('command', 'split') - nvim('set_current_win', nvim('list_wins')[1]) - window('set_height', nvim('list_wins')[2], 1) - eq(1, window('get_height', nvim('list_wins')[2])) + command('set winbar=foobar') + command('set winminheight=0') + command('split') + meths.nvim_set_current_win(meths.nvim_list_wins()[1]) + meths.nvim_win_set_height(meths.nvim_list_wins()[2], 1) + eq(1, meths.nvim_win_get_height(meths.nvim_list_wins()[2])) end) it('do not cause ml_get errors with foldmethod=expr #19989', function() @@ -340,16 +348,19 @@ 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])) - nvim('set_current_win', nvim('list_wins')[2]) - nvim('command', 'vsplit') + command('split') + eq( + meths.nvim_win_get_width(meths.nvim_list_wins()[2]), + meths.nvim_win_get_width(meths.nvim_list_wins()[1]) + ) + meths.nvim_set_current_win(meths.nvim_list_wins()[2]) + command('vsplit') eq( - window('get_width', nvim('list_wins')[2]), - math.floor(window('get_width', nvim('list_wins')[1]) / 2) + meths.nvim_win_get_width(meths.nvim_list_wins()[2]), + math.floor(meths.nvim_win_get_width(meths.nvim_list_wins()[1]) / 2) ) - window('set_width', nvim('list_wins')[2], 2) - eq(2, window('get_width', nvim('list_wins')[2])) + meths.nvim_win_set_width(meths.nvim_list_wins()[2], 2) + eq(2, meths.nvim_win_get_width(meths.nvim_list_wins()[2])) end) it('do not cause ml_get errors with foldmethod=expr #19989', function() @@ -371,17 +382,17 @@ 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')) + meths.nvim_win_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_win_get_var(0, 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('w:lua')) eq(1, funcs.exists('w:lua')) - curwinmeths.del_var('lua') + meths.nvim_win_del_var(0, 'lua') eq(0, funcs.exists('w:lua')) - eq('Key not found: lua', pcall_err(curwinmeths.del_var, 'lua')) - curwinmeths.set_var('lua', 1) + eq('Key not found: lua', pcall_err(meths.nvim_win_del_var, 0, 'lua')) + meths.nvim_win_set_var(0, 'lua', 1) command('lockvar w:lua') - eq('Key is locked: lua', pcall_err(curwinmeths.del_var, 'lua')) - eq('Key is locked: lua', pcall_err(curwinmeths.set_var, 'lua', 1)) + eq('Key is locked: lua', pcall_err(meths.nvim_win_del_var, 0, 'lua')) + eq('Key is locked: lua', pcall_err(meths.nvim_win_set_var, 0, 'lua', 1)) end) it('window_set_var returns the old value', function() @@ -402,51 +413,51 @@ describe('API/win', function() describe('nvim_get_option_value, nvim_set_option_value', function() it('works', function() - nvim('set_option_value', 'colorcolumn', '4,3', {}) - eq('4,3', nvim('get_option_value', 'colorcolumn', {})) + meths.nvim_set_option_value('colorcolumn', '4,3', {}) + eq('4,3', meths.nvim_get_option_value('colorcolumn', {})) command('set modified hidden') command('enew') -- edit new buffer, window option is preserved - eq('4,3', nvim('get_option_value', 'colorcolumn', {})) + eq('4,3', meths.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' })) + meths.nvim_set_option_value('statusline', 'window-status', { win = 0 }) + eq('window-status', meths.nvim_get_option_value('statusline', { win = 0 })) + eq('', meths.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('', meths.nvim_get_option_value('statusline', { win = 0 })) eq('', eval('&l:statusline')) end) it('after switching windows #15390', 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('command', 'split') - nvim('command', 'wincmd J') - nvim('command', 'wincmd j') - eq('window-status', nvim('get_option_value', 'statusline', { win = win1.id })) + command('tabnew') + local tab1 = unpack(meths.nvim_list_tabpages()) + local win1 = unpack(meths.nvim_tabpage_list_wins(tab1)) + meths.nvim_set_option_value('statusline', 'window-status', { win = win1.id }) + command('split') + command('wincmd J') + command('wincmd j') + eq('window-status', meths.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, meths.nvim_get_option_value('scrolloff', { win = 0, scope = 'local' })) end) end) describe('get_position', function() it('works', function() - local height = window('get_height', nvim('list_wins')[1]) - 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])) + local height = meths.nvim_win_get_height(meths.nvim_list_wins()[1]) + local width = meths.nvim_win_get_width(meths.nvim_list_wins()[1]) + command('split') + command('vsplit') + eq({ 0, 0 }, meths.nvim_win_get_position(meths.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(meths.nvim_win_get_position(meths.nvim_list_wins()[2])) + local win3row, win3col = unpack(meths.nvim_win_get_position(meths.nvim_list_wins()[3])) eq(0, win2row) eq(0, win3col) ok(vsplit_pos - 1 <= win2col and win2col <= vsplit_pos + 1) @@ -456,46 +467,46 @@ describe('API/win', function() describe('get_position', 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]) + command('tabnew') + command('vsplit') + eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[1]), meths.nvim_list_tabpages()[1]) + eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[2]), meths.nvim_list_tabpages()[2]) + eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[3]), meths.nvim_list_tabpages()[2]) end) end) describe('get_number', function() it('works', function() - local wins = nvim('list_wins') - eq(1, window('get_number', wins[1])) + local wins = meths.nvim_list_wins() + eq(1, meths.nvim_win_get_number(wins[1])) - nvim('command', 'split') - local win1, win2 = unpack(nvim('list_wins')) - eq(1, window('get_number', win1)) - eq(2, window('get_number', win2)) + command('split') + local win1, win2 = unpack(meths.nvim_list_wins()) + eq(1, meths.nvim_win_get_number(win1)) + eq(2, meths.nvim_win_get_number(win2)) - nvim('command', 'wincmd J') - eq(2, window('get_number', win1)) - eq(1, window('get_number', win2)) + command('wincmd J') + eq(2, meths.nvim_win_get_number(win1)) + eq(1, meths.nvim_win_get_number(win2)) - nvim('command', 'tabnew') - local win3 = nvim('list_wins')[3] + command('tabnew') + local win3 = meths.nvim_list_wins()[3] -- First tab page - eq(2, window('get_number', win1)) - eq(1, window('get_number', win2)) + eq(2, meths.nvim_win_get_number(win1)) + eq(1, meths.nvim_win_get_number(win2)) -- Second tab page - eq(1, window('get_number', win3)) + eq(1, meths.nvim_win_get_number(win3)) end) end) describe('is_valid', function() it('works', function() - nvim('command', 'split') - local win = nvim('list_wins')[2] - nvim('set_current_win', win) - ok(window('is_valid', win)) - nvim('command', 'close') - ok(not window('is_valid', win)) + command('split') + local win = meths.nvim_list_wins()[2] + meths.nvim_set_current_win(win) + ok(meths.nvim_win_is_valid(win)) + command('close') + ok(not meths.nvim_win_is_valid(win)) end) end) @@ -671,42 +682,43 @@ describe('API/win', function() ddd eee]]) eq('Invalid window id: 23', pcall_err(meths.nvim_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('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { start_row = 5 })) + eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { start_row = -6 })) + eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { end_row = 5 })) + eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { end_row = -6 })) eq( "'start_row' is higher than 'end_row'", - pcall_err(curwinmeths.text_height, { start_row = 3, end_row = 1 }) + pcall_err(meths.nvim_win_text_height, 0, { start_row = 3, end_row = 1 }) ) eq( "'start_vcol' specified without 'start_row'", - pcall_err(curwinmeths.text_height, { end_row = 2, start_vcol = 0 }) + pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, start_vcol = 0 }) ) eq( "'end_vcol' specified without 'end_row'", - pcall_err(curwinmeths.text_height, { start_row = 2, end_vcol = 0 }) + pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, end_vcol = 0 }) ) eq( "Invalid 'start_vcol': out of range", - pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = -1 }) + pcall_err(meths.nvim_win_text_height, 0, { 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 }) + pcall_err(meths.nvim_win_text_height, 0, { 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 }) + pcall_err(meths.nvim_win_text_height, 0, { 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 }) + pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, end_vcol = X + 1 }) ) eq( "'start_vcol' is higher than 'end_vcol'", pcall_err( - curwinmeths.text_height, + meths.nvim_win_text_height, + 0, { start_row = 2, end_row = 2, start_vcol = 10, end_vcol = 5 } ) ) -- cgit From 795f896a5772d5e0795f86642bdf90c82efac45c Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Fri, 12 Jan 2024 17:59:57 +0000 Subject: test: rename (meths, funcs) -> (api, fn) --- test/functional/api/autocmd_spec.lua | 431 +++--- test/functional/api/buffer_spec.lua | 610 ++++---- test/functional/api/buffer_updates_spec.lua | 70 +- test/functional/api/command_spec.lua | 86 +- test/functional/api/extmark_spec.lua | 74 +- test/functional/api/highlight_spec.lua | 295 ++-- test/functional/api/keymap_spec.lua | 334 ++--- test/functional/api/proc_spec.lua | 14 +- test/functional/api/server_notifications_spec.lua | 20 +- test/functional/api/server_requests_spec.lua | 92 +- test/functional/api/tabpage_spec.lua | 62 +- test/functional/api/ui_spec.lua | 26 +- test/functional/api/version_spec.lua | 47 +- test/functional/api/vim_spec.lua | 1616 ++++++++++----------- test/functional/api/window_spec.lua | 604 ++++---- 15 files changed, 2155 insertions(+), 2226 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/autocmd_spec.lua b/test/functional/api/autocmd_spec.lua index 47cb8bfd54..e89abf6c64 100644 --- a/test/functional/api/autocmd_spec.lua +++ b/test/functional/api/autocmd_spec.lua @@ -6,7 +6,7 @@ local eq = helpers.eq local neq = helpers.neq local exec_lua = helpers.exec_lua local matches = helpers.matches -local meths = helpers.meths +local api = helpers.api local source = helpers.source local pcall_err = helpers.pcall_err @@ -17,7 +17,7 @@ describe('autocmd api', function() it('validation', function() eq( "Cannot use both 'callback' and 'command'", - pcall_err(meths.nvim_create_autocmd, 'BufReadPost', { + pcall_err(api.nvim_create_autocmd, 'BufReadPost', { pattern = '*.py,*.pyi', command = "echo 'Should Have Errored", callback = 'NotAllowed', @@ -25,7 +25,7 @@ describe('autocmd api', function() ) eq( "Cannot use both 'pattern' and 'buffer' for the same autocmd", - pcall_err(meths.nvim_create_autocmd, 'FileType', { + pcall_err(api.nvim_create_autocmd, 'FileType', { command = 'let g:called = g:called + 1', buffer = 0, pattern = '*.py', @@ -33,48 +33,48 @@ describe('autocmd api', function() ) eq( "Required: 'event'", - pcall_err(meths.nvim_create_autocmd, {}, { + pcall_err(api.nvim_create_autocmd, {}, { command = 'ls', }) ) - eq("Required: 'command' or 'callback'", pcall_err(meths.nvim_create_autocmd, 'FileType', {})) + eq("Required: 'command' or 'callback'", pcall_err(api.nvim_create_autocmd, 'FileType', {})) eq( "Invalid 'desc': expected String, got Integer", - pcall_err(meths.nvim_create_autocmd, 'FileType', { + pcall_err(api.nvim_create_autocmd, 'FileType', { command = 'ls', desc = 42, }) ) eq( "Invalid 'callback': expected Lua function or Vim function name, got Integer", - pcall_err(meths.nvim_create_autocmd, 'FileType', { + pcall_err(api.nvim_create_autocmd, 'FileType', { callback = 0, }) ) eq( "Invalid 'event' item: expected String, got Array", - pcall_err(meths.nvim_create_autocmd, { 'FileType', {} }, {}) + pcall_err(api.nvim_create_autocmd, { 'FileType', {} }, {}) ) eq( "Invalid 'group': 0", - pcall_err(meths.nvim_create_autocmd, 'FileType', { + pcall_err(api.nvim_create_autocmd, 'FileType', { group = 0, command = 'ls', }) ) - eq("Invalid 'event': 'foo'", pcall_err(meths.nvim_create_autocmd, 'foo', { command = '' })) + eq("Invalid 'event': 'foo'", pcall_err(api.nvim_create_autocmd, 'foo', { command = '' })) eq( "Invalid 'event': 'VimEnter '", - pcall_err(meths.nvim_create_autocmd, 'VimEnter ', { command = '' }) + pcall_err(api.nvim_create_autocmd, 'VimEnter ', { command = '' }) ) eq( "Invalid 'event': 'VimEnter foo'", - pcall_err(meths.nvim_create_autocmd, 'VimEnter foo', { command = '' }) + pcall_err(api.nvim_create_autocmd, 'VimEnter foo', { command = '' }) ) eq( "Invalid 'event': 'BufAdd,BufDelete'", - pcall_err(meths.nvim_create_autocmd, 'BufAdd,BufDelete', { command = '' }) + pcall_err(api.nvim_create_autocmd, 'BufAdd,BufDelete', { command = '' }) ) end) @@ -102,25 +102,25 @@ describe('autocmd api', function() end) it('allows passing buffer by key', function() - meths.nvim_set_var('called', 0) + api.nvim_set_var('called', 0) - meths.nvim_create_autocmd('FileType', { + api.nvim_create_autocmd('FileType', { command = 'let g:called = g:called + 1', buffer = 0, }) command 'set filetype=txt' - eq(1, meths.nvim_get_var('called')) + eq(1, api.nvim_get_var('called')) -- switch to a new buffer command 'new' command 'set filetype=python' - eq(1, meths.nvim_get_var('called')) + eq(1, api.nvim_get_var('called')) end) it('does not allow passing invalid buffers', function() - local ok, msg = pcall(meths.nvim_create_autocmd, 'FileType', { + local ok, msg = pcall(api.nvim_create_autocmd, 'FileType', { command = 'let g:called = g:called + 1', buffer = -1, }) @@ -145,7 +145,7 @@ describe('autocmd api', function() end) it('allow passing pattern and in same pattern', function() - local ok = pcall(meths.nvim_create_autocmd, 'BufReadPost', { + local ok = pcall(api.nvim_create_autocmd, 'BufReadPost', { pattern = '*.py,', command = "echo 'Should Not Error'", }) @@ -154,42 +154,42 @@ describe('autocmd api', function() end) it('should handle multiple values as comma separated list', function() - meths.nvim_create_autocmd('BufReadPost', { + api.nvim_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.nvim_get_autocmds { event = 'BufReadPost' }) + eq(2, #api.nvim_get_autocmds { event = 'BufReadPost' }) end) it('should handle multiple values as array', function() - meths.nvim_create_autocmd('BufReadPost', { + api.nvim_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.nvim_get_autocmds { event = 'BufReadPost' }) + eq(2, #api.nvim_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.nvim_create_autocmd('BufReadPost', { + api.nvim_create_autocmd('BufReadPost', { pattern = '*.py', command = cmd, desc = desc, }) - eq(desc, meths.nvim_get_autocmds { event = 'BufReadPost' }[1].desc) - eq(cmd, meths.nvim_get_autocmds { event = 'BufReadPost' }[1].command) + eq(desc, api.nvim_get_autocmds { event = 'BufReadPost' }[1].desc) + eq(cmd, api.nvim_get_autocmds { event = 'BufReadPost' }[1].command) end) it('can add description to one autocmd that uses a callback', function() local desc = 'Can show description' - meths.nvim_set_var('desc', desc) + api.nvim_set_var('desc', desc) local result = exec_lua([[ local callback = function() print 'Should Not Have Errored' end @@ -218,17 +218,17 @@ describe('autocmd api', function() }) ]]) - eq(nil, meths.nvim_get_autocmds({ event = 'BufReadPost' })[1].desc) + eq(nil, api.nvim_get_autocmds({ event = 'BufReadPost' })[1].desc) end) it('can add description to multiple autocmd', function() - meths.nvim_create_autocmd('BufReadPost', { + api.nvim_create_autocmd('BufReadPost', { pattern = { '*.py', '*.pyi' }, command = "echo 'Should Not Have Errored'", desc = 'Can show description', }) - local aus = meths.nvim_get_autocmds { event = 'BufReadPost' } + local aus = api.nvim_get_autocmds { event = 'BufReadPost' } eq(2, #aus) eq('Can show description', aus[1].desc) eq('Can show description', aus[2].desc) @@ -237,19 +237,19 @@ describe('autocmd api', function() pending('script and verbose settings', function() it('marks API client', function() - meths.nvim_create_autocmd('BufReadPost', { + api.nvim_create_autocmd('BufReadPost', { pattern = '*.py', command = "echo 'Should Not Have Errored'", desc = 'Can show description', }) - local aus = meths.nvim_get_autocmds { event = 'BufReadPost' } + local aus = api.nvim_get_autocmds { event = 'BufReadPost' } eq(1, #aus, aus) end) end) it('removes an autocommand if the callback returns true', function() - meths.nvim_set_var('some_condition', false) + api.nvim_set_var('some_condition', false) exec_lua [[ vim.api.nvim_create_autocmd("User", { @@ -261,21 +261,21 @@ describe('autocmd api', function() }) ]] - meths.nvim_exec_autocmds('User', { pattern = 'Test' }) + api.nvim_exec_autocmds('User', { pattern = 'Test' }) - local aus = meths.nvim_get_autocmds({ event = 'User', pattern = 'Test' }) + local aus = api.nvim_get_autocmds({ event = 'User', pattern = 'Test' }) local first = aus[1] eq(true, first.id > 0) - meths.nvim_set_var('some_condition', true) - meths.nvim_exec_autocmds('User', { pattern = 'Test' }) - eq({}, meths.nvim_get_autocmds({ event = 'User', pattern = 'Test' })) + api.nvim_set_var('some_condition', true) + api.nvim_exec_autocmds('User', { pattern = 'Test' }) + eq({}, api.nvim_get_autocmds({ event = 'User', pattern = 'Test' })) end) it('receives an args table', function() - local group_id = meths.nvim_create_augroup('TestGroup', {}) + local group_id = api.nvim_create_augroup('TestGroup', {}) -- Having an existing autocmd calling expand("") shouldn't change args #18964 - meths.nvim_create_autocmd('User', { + api.nvim_create_autocmd('User', { group = 'TestGroup', pattern = 'Te*', command = 'call expand("")', @@ -291,7 +291,7 @@ describe('autocmd api', function() }) ]] - meths.nvim_exec_autocmds('User', { pattern = 'Test pattern' }) + api.nvim_exec_autocmds('User', { pattern = 'Test pattern' }) eq({ id = autocmd_id, group = group_id, @@ -299,7 +299,7 @@ describe('autocmd api', function() match = 'Test pattern', file = 'Test pattern', buf = 1, - }, meths.nvim_get_var('autocmd_args')) + }, api.nvim_get_var('autocmd_args')) -- Test without a group autocmd_id = exec_lua [[ @@ -311,7 +311,7 @@ describe('autocmd api', function() }) ]] - meths.nvim_exec_autocmds('User', { pattern = 'some_pat' }) + api.nvim_exec_autocmds('User', { pattern = 'some_pat' }) eq({ id = autocmd_id, group = nil, @@ -319,7 +319,7 @@ describe('autocmd api', function() match = 'some_pat', file = 'some_pat', buf = 1, - }, meths.nvim_get_var('autocmd_args')) + }, api.nvim_get_var('autocmd_args')) end) it('can receive arbitrary data', function() @@ -361,43 +361,43 @@ describe('autocmd api', function() it('validation', function() eq( "Invalid 'group': 9997999", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { group = 9997999, }) ) eq( "Invalid 'group': 'bogus'", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { group = 'bogus', }) ) eq( "Invalid 'group': 0", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { group = 0, }) ) eq( "Invalid 'group': expected String or Integer, got Array", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { group = {}, }) ) eq( "Invalid 'buffer': expected Integer or Array, got Boolean", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { buffer = true, }) ) eq( "Invalid 'event': expected String or Array", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { event = true, }) ) eq( "Invalid 'pattern': expected String or Array, got Boolean", - pcall_err(meths.nvim_get_autocmds, { + pcall_err(api.nvim_get_autocmds, { pattern = true, }) ) @@ -408,7 +408,7 @@ describe('autocmd api', function() command [[au! InsertEnter]] command [[au InsertEnter * :echo "1"]] - local aus = meths.nvim_get_autocmds { event = 'InsertEnter' } + local aus = api.nvim_get_autocmds { event = 'InsertEnter' } eq(1, #aus) end) @@ -417,7 +417,7 @@ describe('autocmd api', function() command [[au InsertEnter * :echo "1"]] command [[au InsertEnter * :echo "2"]] - local aus = meths.nvim_get_autocmds { event = 'InsertEnter' } + local aus = api.nvim_get_autocmds { event = 'InsertEnter' } eq(2, #aus) end) @@ -426,8 +426,8 @@ describe('autocmd api', function() command [[au InsertEnter * :echo "1"]] command [[au InsertEnter * :echo "2"]] - local string_aus = meths.nvim_get_autocmds { event = 'InsertEnter' } - local array_aus = meths.nvim_get_autocmds { event = { 'InsertEnter' } } + local string_aus = api.nvim_get_autocmds { event = 'InsertEnter' } + local array_aus = api.nvim_get_autocmds { event = { 'InsertEnter' } } eq(string_aus, array_aus) end) @@ -437,7 +437,7 @@ describe('autocmd api', function() command [[au InsertEnter * :echo "1"]] command [[au InsertEnter * :echo "2"]] - local aus = meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + local aus = api.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(2, #aus) end) @@ -451,7 +451,7 @@ describe('autocmd api', function() \ }) ]] - local aus = meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + local aus = api.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } local first = aus[1] eq(first.id, nil) @@ -459,8 +459,8 @@ describe('autocmd api', function() local second = aus[2] neq(second.id, nil) - meths.nvim_del_autocmd(second.id) - local new_aus = meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + api.nvim_del_autocmd(second.id) + local new_aus = api.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(1, #new_aus) eq(first, new_aus[1]) end) @@ -469,7 +469,7 @@ describe('autocmd api', function() command [[au! InsertEnter]] command [[au InsertEnter * :echo "1"]] - local aus = meths.nvim_get_autocmds { event = 'InsertEnter' } + local aus = api.nvim_get_autocmds { event = 'InsertEnter' } eq({ { buflocal = false, @@ -487,7 +487,7 @@ describe('autocmd api', function() command [[au InsertEnter :echo "1"]] command [[au InsertEnter :echo "2"]] - local aus = meths.nvim_get_autocmds { event = 'InsertEnter', buffer = 0 } + local aus = api.nvim_get_autocmds { event = 'InsertEnter', buffer = 0 } eq({ { buffer = 2, @@ -499,7 +499,7 @@ describe('autocmd api', function() }, }, aus) - aus = meths.nvim_get_autocmds { event = 'InsertEnter', buffer = 1 } + aus = api.nvim_get_autocmds { event = 'InsertEnter', buffer = 1 } eq({ { buffer = 1, @@ -511,7 +511,7 @@ describe('autocmd api', function() }, }, aus) - aus = meths.nvim_get_autocmds { event = 'InsertEnter', buffer = { 1, 2 } } + aus = api.nvim_get_autocmds { event = 'InsertEnter', buffer = { 1, 2 } } eq({ { buffer = 1, @@ -533,50 +533,50 @@ describe('autocmd api', function() eq( "Invalid 'buffer': expected Integer or Array, got String", - pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = 'foo' }) + pcall_err(api.nvim_get_autocmds, { event = 'InsertEnter', buffer = 'foo' }) ) eq( "Invalid 'buffer': expected Integer, got String", - pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = { 'foo', 42 } }) + pcall_err(api.nvim_get_autocmds, { event = 'InsertEnter', buffer = { 'foo', 42 } }) ) eq( 'Invalid buffer id: 42', - pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = { 42 } }) + pcall_err(api.nvim_get_autocmds, { event = 'InsertEnter', buffer = { 42 } }) ) local bufs = {} for _ = 1, 257 do - table.insert(bufs, meths.nvim_create_buf(true, false)) + table.insert(bufs, api.nvim_create_buf(true, false)) end eq( 'Too many buffers (maximum of 256)', - pcall_err(meths.nvim_get_autocmds, { event = 'InsertEnter', buffer = bufs }) + pcall_err(api.nvim_get_autocmds, { event = 'InsertEnter', buffer = bufs }) ) end) it('returns autocmds when group is specified by id', function() - local auid = meths.nvim_create_augroup('nvim_test_augroup', { clear = true }) - meths.nvim_create_autocmd('FileType', { group = auid, command = 'echo "1"' }) - meths.nvim_create_autocmd('FileType', { group = auid, command = 'echo "2"' }) + local auid = api.nvim_create_augroup('nvim_test_augroup', { clear = true }) + api.nvim_create_autocmd('FileType', { group = auid, command = 'echo "1"' }) + api.nvim_create_autocmd('FileType', { group = auid, command = 'echo "2"' }) - local aus = meths.nvim_get_autocmds { group = auid } + local aus = api.nvim_get_autocmds { group = auid } eq(2, #aus) - local aus2 = meths.nvim_get_autocmds { group = auid, event = 'InsertEnter' } + local aus2 = api.nvim_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' - meths.nvim_create_augroup(auname, { clear = true }) - meths.nvim_create_autocmd('FileType', { group = auname, command = 'echo "1"' }) - meths.nvim_create_autocmd('FileType', { group = auname, command = 'echo "2"' }) + api.nvim_create_augroup(auname, { clear = true }) + api.nvim_create_autocmd('FileType', { group = auname, command = 'echo "1"' }) + api.nvim_create_autocmd('FileType', { group = auname, command = 'echo "2"' }) - local aus = meths.nvim_get_autocmds { group = auname } + local aus = api.nvim_get_autocmds { group = auname } eq(2, #aus) - local aus2 = meths.nvim_get_autocmds { group = auname, event = 'InsertEnter' } + local aus2 = api.nvim_get_autocmds { group = auname, event = 'InsertEnter' } eq(0, #aus2) end) @@ -609,7 +609,7 @@ describe('autocmd api', function() it('can retrieve a callback from an autocmd', function() local content = 'I Am A Callback' - meths.nvim_set_var('content', content) + api.nvim_set_var('content', content) local result = exec_lua([[ local cb = function() return vim.g.content end @@ -671,7 +671,7 @@ describe('autocmd api', function() end) it('returns all groups if no group is specified', function() - local aus = meths.nvim_get_autocmds { event = 'InsertEnter' } + local aus = api.nvim_get_autocmds { event = 'InsertEnter' } if #aus ~= 4 then eq({}, aus) end @@ -680,7 +680,7 @@ describe('autocmd api', function() end) it('returns only the group specified', function() - local aus = meths.nvim_get_autocmds { + local aus = api.nvim_get_autocmds { event = 'InsertEnter', group = 'GroupOne', } @@ -691,7 +691,7 @@ describe('autocmd api', function() end) it('returns only the group specified, multiple values', function() - local aus = meths.nvim_get_autocmds { + local aus = api.nvim_get_autocmds { event = 'InsertEnter', group = 'GroupTwo', } @@ -706,7 +706,7 @@ describe('autocmd api', function() describe('groups: 2', function() it('raises error for undefined augroup name', function() - local success, code = unpack(meths.nvim_exec_lua( + local success, code = unpack(api.nvim_exec_lua( [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { @@ -724,7 +724,7 @@ describe('autocmd api', function() end) it('raises error for undefined augroup id', function() - local success, code = unpack(meths.nvim_exec_lua( + local success, code = unpack(api.nvim_exec_lua( [[ return {pcall(function() -- Make sure the augroup is deleted @@ -745,7 +745,7 @@ describe('autocmd api', function() end) it('raises error for invalid group type', function() - local success, code = unpack(meths.nvim_exec_lua( + local success, code = unpack(api.nvim_exec_lua( [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { @@ -763,7 +763,7 @@ describe('autocmd api', function() end) it('raises error for invalid pattern array', function() - local success, code = unpack(meths.nvim_exec_lua( + local success, code = unpack(api.nvim_exec_lua( [[ return {pcall(function() vim.api.nvim_create_autocmd("FileType", { @@ -792,7 +792,7 @@ describe('autocmd api', function() end) it('returns for literal match', function() - local aus = meths.nvim_get_autocmds { + local aus = api.nvim_get_autocmds { event = 'InsertEnter', pattern = '*', } @@ -803,7 +803,7 @@ describe('autocmd api', function() it('returns for multiple matches', function() -- vim.api.nvim_get_autocmds - local aus = meths.nvim_get_autocmds { + local aus = api.nvim_get_autocmds { event = 'InsertEnter', pattern = { '*.one', '*.two' }, } @@ -815,17 +815,17 @@ describe('autocmd api', function() end) it('should work for buffer autocmds', function() - local normalized_aus = meths.nvim_get_autocmds { + local normalized_aus = api.nvim_get_autocmds { event = 'InsertEnter', pattern = '', } - local raw_aus = meths.nvim_get_autocmds { + local raw_aus = api.nvim_get_autocmds { event = 'InsertEnter', pattern = '', } - local zero_aus = meths.nvim_get_autocmds { + local zero_aus = api.nvim_get_autocmds { event = 'InsertEnter', pattern = '', } @@ -841,110 +841,110 @@ describe('autocmd api', function() it('validation', function() eq( "Invalid 'group': 9997999", - pcall_err(meths.nvim_exec_autocmds, 'FileType', { + pcall_err(api.nvim_exec_autocmds, 'FileType', { group = 9997999, }) ) eq( "Invalid 'group': 'bogus'", - pcall_err(meths.nvim_exec_autocmds, 'FileType', { + pcall_err(api.nvim_exec_autocmds, 'FileType', { group = 'bogus', }) ) eq( "Invalid 'group': expected String or Integer, got Array", - pcall_err(meths.nvim_exec_autocmds, 'FileType', { + pcall_err(api.nvim_exec_autocmds, 'FileType', { group = {}, }) ) eq( "Invalid 'group': 0", - pcall_err(meths.nvim_exec_autocmds, 'FileType', { + pcall_err(api.nvim_exec_autocmds, 'FileType', { group = 0, }) ) eq( "Invalid 'buffer': expected Buffer, got Array", - pcall_err(meths.nvim_exec_autocmds, 'FileType', { + pcall_err(api.nvim_exec_autocmds, 'FileType', { buffer = {}, }) ) eq( "Invalid 'event' item: expected String, got Array", - pcall_err(meths.nvim_exec_autocmds, { 'FileType', {} }, {}) + pcall_err(api.nvim_exec_autocmds, { 'FileType', {} }, {}) ) end) it('can trigger builtin autocmds', function() - meths.nvim_set_var('autocmd_executed', false) + api.nvim_set_var('autocmd_executed', false) - meths.nvim_create_autocmd('BufReadPost', { + api.nvim_create_autocmd('BufReadPost', { pattern = '*', command = 'let g:autocmd_executed = v:true', }) - eq(false, meths.nvim_get_var('autocmd_executed')) - meths.nvim_exec_autocmds('BufReadPost', {}) - eq(true, meths.nvim_get_var('autocmd_executed')) + eq(false, api.nvim_get_var('autocmd_executed')) + api.nvim_exec_autocmds('BufReadPost', {}) + eq(true, api.nvim_get_var('autocmd_executed')) end) it('can trigger multiple patterns', function() - meths.nvim_set_var('autocmd_executed', 0) + api.nvim_set_var('autocmd_executed', 0) - meths.nvim_create_autocmd('BufReadPost', { + api.nvim_create_autocmd('BufReadPost', { pattern = '*', command = 'let g:autocmd_executed += 1', }) - meths.nvim_exec_autocmds('BufReadPost', { pattern = { '*.lua', '*.vim' } }) - eq(2, meths.nvim_get_var('autocmd_executed')) + api.nvim_exec_autocmds('BufReadPost', { pattern = { '*.lua', '*.vim' } }) + eq(2, api.nvim_get_var('autocmd_executed')) - meths.nvim_create_autocmd('BufReadPre', { + api.nvim_create_autocmd('BufReadPre', { pattern = { 'bar', 'foo' }, command = 'let g:autocmd_executed += 10', }) - meths.nvim_exec_autocmds('BufReadPre', { pattern = { 'foo', 'bar', 'baz', 'frederick' } }) - eq(22, meths.nvim_get_var('autocmd_executed')) + api.nvim_exec_autocmds('BufReadPre', { pattern = { 'foo', 'bar', 'baz', 'frederick' } }) + eq(22, api.nvim_get_var('autocmd_executed')) end) it('can pass the buffer', function() - meths.nvim_set_var('buffer_executed', -1) - eq(-1, meths.nvim_get_var('buffer_executed')) + api.nvim_set_var('buffer_executed', -1) + eq(-1, api.nvim_get_var('buffer_executed')) - meths.nvim_create_autocmd('BufLeave', { + api.nvim_create_autocmd('BufLeave', { pattern = '*', command = 'let g:buffer_executed = +expand("")', }) -- Doesn't execute for other non-matching events - meths.nvim_exec_autocmds('CursorHold', { buffer = 1 }) - eq(-1, meths.nvim_get_var('buffer_executed')) + api.nvim_exec_autocmds('CursorHold', { buffer = 1 }) + eq(-1, api.nvim_get_var('buffer_executed')) - meths.nvim_exec_autocmds('BufLeave', { buffer = 1 }) - eq(1, meths.nvim_get_var('buffer_executed')) + api.nvim_exec_autocmds('BufLeave', { buffer = 1 }) + eq(1, api.nvim_get_var('buffer_executed')) end) it('can pass the filename, pattern match', function() - meths.nvim_set_var('filename_executed', 'none') - eq('none', meths.nvim_get_var('filename_executed')) + api.nvim_set_var('filename_executed', 'none') + eq('none', api.nvim_get_var('filename_executed')) - meths.nvim_create_autocmd('BufEnter', { + api.nvim_create_autocmd('BufEnter', { pattern = '*.py', command = 'let g:filename_executed = expand("")', }) -- Doesn't execute for other non-matching events - meths.nvim_exec_autocmds('CursorHold', { buffer = 1 }) - eq('none', meths.nvim_get_var('filename_executed')) + api.nvim_exec_autocmds('CursorHold', { buffer = 1 }) + eq('none', api.nvim_get_var('filename_executed')) command('edit __init__.py') - eq('__init__.py', meths.nvim_get_var('filename_executed')) + eq('__init__.py', api.nvim_get_var('filename_executed')) end) it('cannot pass buf and fname', function() local ok = pcall( - meths.nvim_exec_autocmds, + api.nvim_exec_autocmds, 'BufReadPre', { pattern = 'literally_cannot_error.rs', buffer = 1 } ) @@ -952,73 +952,73 @@ describe('autocmd api', function() end) it('can pass the filename, exact match', function() - meths.nvim_set_var('filename_executed', 'none') - eq('none', meths.nvim_get_var('filename_executed')) + api.nvim_set_var('filename_executed', 'none') + eq('none', api.nvim_get_var('filename_executed')) command('edit other_file.txt') command('edit __init__.py') - eq('none', meths.nvim_get_var('filename_executed')) + eq('none', api.nvim_get_var('filename_executed')) - meths.nvim_create_autocmd('CursorHoldI', { + api.nvim_create_autocmd('CursorHoldI', { pattern = '__init__.py', command = 'let g:filename_executed = expand("")', }) -- Doesn't execute for other non-matching events - meths.nvim_exec_autocmds('CursorHoldI', { buffer = 1 }) - eq('none', meths.nvim_get_var('filename_executed')) + api.nvim_exec_autocmds('CursorHoldI', { buffer = 1 }) + eq('none', api.nvim_get_var('filename_executed')) - meths.nvim_exec_autocmds('CursorHoldI', { buffer = meths.nvim_get_current_buf() }) - eq('__init__.py', meths.nvim_get_var('filename_executed')) + api.nvim_exec_autocmds('CursorHoldI', { buffer = api.nvim_get_current_buf() }) + eq('__init__.py', api.nvim_get_var('filename_executed')) -- Reset filename - meths.nvim_set_var('filename_executed', 'none') + api.nvim_set_var('filename_executed', 'none') - meths.nvim_exec_autocmds('CursorHoldI', { pattern = '__init__.py' }) - eq('__init__.py', meths.nvim_get_var('filename_executed')) + api.nvim_exec_autocmds('CursorHoldI', { pattern = '__init__.py' }) + eq('__init__.py', api.nvim_get_var('filename_executed')) end) it('works with user autocmds', function() - meths.nvim_set_var('matched', 'none') + api.nvim_set_var('matched', 'none') - meths.nvim_create_autocmd('User', { + api.nvim_create_autocmd('User', { pattern = 'TestCommand', command = 'let g:matched = "matched"', }) - meths.nvim_exec_autocmds('User', { pattern = 'OtherCommand' }) - eq('none', meths.nvim_get_var('matched')) - meths.nvim_exec_autocmds('User', { pattern = 'TestCommand' }) - eq('matched', meths.nvim_get_var('matched')) + api.nvim_exec_autocmds('User', { pattern = 'OtherCommand' }) + eq('none', api.nvim_get_var('matched')) + api.nvim_exec_autocmds('User', { pattern = 'TestCommand' }) + eq('matched', api.nvim_get_var('matched')) end) it('can pass group by id', function() - meths.nvim_set_var('group_executed', false) + api.nvim_set_var('group_executed', false) - local auid = meths.nvim_create_augroup('nvim_test_augroup', { clear = true }) - meths.nvim_create_autocmd('FileType', { + local auid = api.nvim_create_augroup('nvim_test_augroup', { clear = true }) + api.nvim_create_autocmd('FileType', { group = auid, command = 'let g:group_executed = v:true', }) - eq(false, meths.nvim_get_var('group_executed')) - meths.nvim_exec_autocmds('FileType', { group = auid }) - eq(true, meths.nvim_get_var('group_executed')) + eq(false, api.nvim_get_var('group_executed')) + api.nvim_exec_autocmds('FileType', { group = auid }) + eq(true, api.nvim_get_var('group_executed')) end) it('can pass group by name', function() - meths.nvim_set_var('group_executed', false) + api.nvim_set_var('group_executed', false) local auname = 'nvim_test_augroup' - meths.nvim_create_augroup(auname, { clear = true }) - meths.nvim_create_autocmd('FileType', { + api.nvim_create_augroup(auname, { clear = true }) + api.nvim_create_autocmd('FileType', { group = auname, command = 'let g:group_executed = v:true', }) - eq(false, meths.nvim_get_var('group_executed')) - meths.nvim_exec_autocmds('FileType', { group = auname }) - eq(true, meths.nvim_get_var('group_executed')) + eq(false, api.nvim_get_var('group_executed')) + api.nvim_exec_autocmds('FileType', { group = auname }) + eq(true, api.nvim_get_var('group_executed')) end) end) @@ -1026,7 +1026,7 @@ describe('autocmd api', function() before_each(function() clear() - meths.nvim_set_var('executed', 0) + api.nvim_set_var('executed', 0) end) local make_counting_autocmd = function(opts) @@ -1040,7 +1040,7 @@ describe('autocmd api', function() resulting.group = opts.group resulting.once = opts.once - meths.nvim_create_autocmd('FileType', resulting) + api.nvim_create_autocmd('FileType', resulting) end local set_ft = function(ft) @@ -1049,12 +1049,12 @@ describe('autocmd api', function() end local get_executed_count = function() - return meths.nvim_get_var('executed') + return api.nvim_get_var('executed') end it('can be added in a group', function() local augroup = 'TestGroup' - meths.nvim_create_augroup(augroup, { clear = true }) + api.nvim_create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup } set_ft('txt') @@ -1083,7 +1083,7 @@ describe('autocmd api', function() end) it('errors on unexpected keys', function() - local success, code = pcall(meths.nvim_create_autocmd, 'FileType', { + local success, code = pcall(api.nvim_create_autocmd, 'FileType', { pattern = '*', not_a_valid_key = 'NotDefined', }) @@ -1190,8 +1190,8 @@ describe('autocmd api', function() it('groups can be cleared', function() local augroup = 'TestGroup' - meths.nvim_create_augroup(augroup, { clear = true }) - meths.nvim_create_autocmd('FileType', { + api.nvim_create_augroup(augroup, { clear = true }) + api.nvim_create_autocmd('FileType', { group = augroup, command = 'let g:executed = g:executed + 1', }) @@ -1200,8 +1200,8 @@ describe('autocmd api', function() set_ft('txt') eq(2, get_executed_count(), 'should only count twice') - meths.nvim_create_augroup(augroup, { clear = true }) - eq({}, meths.nvim_get_autocmds { group = augroup }) + api.nvim_create_augroup(augroup, { clear = true }) + eq({}, api.nvim_get_autocmds { group = augroup }) set_ft('txt') set_ft('txt') @@ -1210,22 +1210,22 @@ describe('autocmd api', function() it('can delete non-existent groups with pcall', function() eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_name, 'noexist')]]) - eq('Vim:E367: No such group: "noexist"', pcall_err(meths.nvim_del_augroup_by_name, 'noexist')) + eq('Vim:E367: No such group: "noexist"', pcall_err(api.nvim_del_augroup_by_name, 'noexist')) eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_id, -12342)]]) - eq('Vim:E367: No such group: "--Deleted--"', pcall_err(meths.nvim_del_augroup_by_id, -12312)) + eq('Vim:E367: No such group: "--Deleted--"', pcall_err(api.nvim_del_augroup_by_id, -12312)) eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_id, 0)]]) - eq('Vim:E367: No such group: "[NULL]"', pcall_err(meths.nvim_del_augroup_by_id, 0)) + eq('Vim:E367: No such group: "[NULL]"', pcall_err(api.nvim_del_augroup_by_id, 0)) eq(false, exec_lua [[return pcall(vim.api.nvim_del_augroup_by_id, 12342)]]) - eq('Vim:E367: No such group: "[NULL]"', pcall_err(meths.nvim_del_augroup_by_id, 12312)) + eq('Vim:E367: No such group: "[NULL]"', pcall_err(api.nvim_del_augroup_by_id, 12312)) end) it('groups work with once', function() local augroup = 'TestGroup' - meths.nvim_create_augroup(augroup, { clear = true }) + api.nvim_create_augroup(augroup, { clear = true }) make_counting_autocmd { group = augroup, once = true } set_ft('txt') @@ -1237,7 +1237,7 @@ describe('autocmd api', function() it('autocmds can be registered multiple times.', function() local augroup = 'TestGroup' - meths.nvim_create_augroup(augroup, { clear = true }) + api.nvim_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 } @@ -1251,16 +1251,16 @@ describe('autocmd api', function() it('can be deleted', function() local augroup = 'WillBeDeleted' - meths.nvim_create_augroup(augroup, { clear = true }) - meths.nvim_create_autocmd({ 'FileType' }, { + api.nvim_create_augroup(augroup, { clear = true }) + api.nvim_create_autocmd({ 'FileType' }, { pattern = '*', command = "echo 'does not matter'", }) -- Clears the augroup from before, which erases the autocmd - meths.nvim_create_augroup(augroup, { clear = true }) + api.nvim_create_augroup(augroup, { clear = true }) - local result = #meths.nvim_get_autocmds { group = augroup } + local result = #api.nvim_get_autocmds { group = augroup } eq(0, result) end) @@ -1268,10 +1268,10 @@ describe('autocmd api', function() it('can be used for buffer local autocmds', function() local augroup = 'WillBeDeleted' - meths.nvim_set_var('value_set', false) + api.nvim_set_var('value_set', false) - meths.nvim_create_augroup(augroup, { clear = true }) - meths.nvim_create_autocmd('FileType', { + api.nvim_create_augroup(augroup, { clear = true }) + api.nvim_create_autocmd('FileType', { pattern = '', command = 'let g:value_set = v:true', }) @@ -1279,7 +1279,7 @@ describe('autocmd api', function() command 'new' command 'set filetype=python' - eq(false, meths.nvim_get_var('value_set')) + eq(false, api.nvim_get_var('value_set')) end) it('can accept vimscript functions', function() @@ -1302,7 +1302,7 @@ describe('autocmd api', function() set filetype=txt ]] - eq(2, meths.nvim_get_var('vimscript_executed')) + eq(2, api.nvim_get_var('vimscript_executed')) end) end) @@ -1314,11 +1314,11 @@ describe('autocmd api', function() command('augroup! TEMP_A') - eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_A' })) + eq(false, pcall(api.nvim_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.nvim_get_autocmds { event = 'BufReadPost' }) + eq(1, #api.nvim_get_autocmds { event = 'BufReadPost' }) end) it('legacy: remove augroups that have no autocmds', function() @@ -1327,8 +1327,8 @@ describe('autocmd api', function() command('augroup! TEMP_AB') - eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_AB' })) - eq(0, #meths.nvim_get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(api.nvim_get_autocmds, { group = 'TEMP_AB' })) + eq(0, #api.nvim_get_autocmds { event = 'BufReadPost' }) end) it('legacy: multiple remove and add augroup', function() @@ -1340,7 +1340,7 @@ describe('autocmd api', function() command('augroup! TEMP_ABC') -- Should still have one autocmd :'( - local aus = meths.nvim_get_autocmds { event = 'BufReadPost' } + local aus = api.nvim_get_autocmds { event = 'BufReadPost' } eq(1, #aus, aus) command('augroup TEMP_ABC') @@ -1349,13 +1349,13 @@ describe('autocmd api', function() command('augroup END') -- Should now have two autocmds :'( - aus = meths.nvim_get_autocmds { event = 'BufReadPost' } + aus = api.nvim_get_autocmds { event = 'BufReadPost' } eq(2, #aus, aus) command('augroup! TEMP_ABC') - eq(false, pcall(meths.nvim_get_autocmds, { group = 'TEMP_ABC' })) - eq(2, #meths.nvim_get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(api.nvim_get_autocmds, { group = 'TEMP_ABC' })) + eq(2, #api.nvim_get_autocmds { event = 'BufReadPost' }) end) it('api: should clear and not return any autocmds for delete groups by id', function() @@ -1363,13 +1363,13 @@ describe('autocmd api', function() command('autocmd! BufReadPost *.py :echo "Hello"') command('augroup END') - local augroup_id = meths.nvim_create_augroup('TEMP_ABCD', { clear = false }) - meths.nvim_del_augroup_by_id(augroup_id) + local augroup_id = api.nvim_create_augroup('TEMP_ABCD', { clear = false }) + api.nvim_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.nvim_get_autocmds, { group = 'TEMP_ABCD' })) - eq(0, #meths.nvim_get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(api.nvim_get_autocmds, { group = 'TEMP_ABCD' })) + eq(0, #api.nvim_get_autocmds { event = 'BufReadPost' }) end) it('api: should clear and not return any autocmds for delete groups by name', function() @@ -1377,12 +1377,12 @@ describe('autocmd api', function() command('autocmd! BufReadPost *.py :echo "Hello"') command('augroup END') - meths.nvim_del_augroup_by_name('TEMP_ABCDE') + api.nvim_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.nvim_get_autocmds, { group = 'TEMP_ABCDE' })) - eq(0, #meths.nvim_get_autocmds { event = 'BufReadPost' }) + eq(false, pcall(api.nvim_get_autocmds, { group = 'TEMP_ABCDE' })) + eq(0, #api.nvim_get_autocmds { event = 'BufReadPost' }) end) end) @@ -1390,18 +1390,18 @@ describe('autocmd api', function() it('validation', function() eq( "Cannot use both 'pattern' and 'buffer'", - pcall_err(meths.nvim_clear_autocmds, { + pcall_err(api.nvim_clear_autocmds, { pattern = '*', buffer = 42, }) ) eq( "Invalid 'event' item: expected String, got Array", - pcall_err(meths.nvim_clear_autocmds, { + pcall_err(api.nvim_clear_autocmds, { event = { 'FileType', {} }, }) ) - eq("Invalid 'group': 0", pcall_err(meths.nvim_clear_autocmds, { group = 0 })) + eq("Invalid 'group': 0", pcall_err(api.nvim_clear_autocmds, { group = 0 })) end) it('should clear based on event + pattern', function() @@ -1409,17 +1409,17 @@ describe('autocmd api', function() command('autocmd InsertEnter *.txt :echo "Text Files Are Cool"') local search = { event = 'InsertEnter', pattern = '*.txt' } - local before_delete = meths.nvim_get_autocmds(search) + local before_delete = api.nvim_get_autocmds(search) eq(1, #before_delete) - local before_delete_all = meths.nvim_get_autocmds { event = search.event } + local before_delete_all = api.nvim_get_autocmds { event = search.event } eq(2, #before_delete_all) - meths.nvim_clear_autocmds(search) - local after_delete = meths.nvim_get_autocmds(search) + api.nvim_clear_autocmds(search) + local after_delete = api.nvim_get_autocmds(search) eq(0, #after_delete) - local after_delete_all = meths.nvim_get_autocmds { event = search.event } + local after_delete_all = api.nvim_get_autocmds { event = search.event } eq(1, #after_delete_all) end) @@ -1428,11 +1428,11 @@ describe('autocmd api', function() command('autocmd InsertEnter *.txt :echo "Text Files Are Cool"') local search = { event = 'InsertEnter' } - local before_delete = meths.nvim_get_autocmds(search) + local before_delete = api.nvim_get_autocmds(search) eq(2, #before_delete) - meths.nvim_clear_autocmds(search) - local after_delete = meths.nvim_get_autocmds(search) + api.nvim_clear_autocmds(search) + local after_delete = api.nvim_get_autocmds(search) eq(0, #after_delete) end) @@ -1443,18 +1443,17 @@ describe('autocmd api', function() command('autocmd InsertLeave *.TestPat2 :echo "Leave 2"') local search = { pattern = '*.TestPat1' } - local before_delete = meths.nvim_get_autocmds(search) + local before_delete = api.nvim_get_autocmds(search) eq(2, #before_delete) local before_delete_events = - meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + api.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(4, #before_delete_events) - meths.nvim_clear_autocmds(search) - local after_delete = meths.nvim_get_autocmds(search) + api.nvim_clear_autocmds(search) + local after_delete = api.nvim_get_autocmds(search) eq(0, #after_delete) - local after_delete_events = - meths.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } + local after_delete_events = api.nvim_get_autocmds { event = { 'InsertEnter', 'InsertLeave' } } eq(2, #after_delete_events) end) @@ -1464,11 +1463,11 @@ describe('autocmd api', function() command('autocmd InsertEnter *.TestPat1 :echo "Enter Pattern"') local search = { event = 'InsertEnter' } - local before_delete = meths.nvim_get_autocmds(search) + local before_delete = api.nvim_get_autocmds(search) eq(2, #before_delete) - meths.nvim_clear_autocmds { buffer = 0 } - local after_delete = meths.nvim_get_autocmds(search) + api.nvim_clear_autocmds { buffer = 0 } + local after_delete = api.nvim_get_autocmds(search) eq(1, #after_delete) eq('*.TestPat1', after_delete[1].pattern) end) @@ -1481,17 +1480,17 @@ describe('autocmd api', function() command('augroup END') local search = { event = 'InsertEnter', group = 'TestNvimClearAutocmds' } - local before_delete = meths.nvim_get_autocmds(search) + local before_delete = api.nvim_get_autocmds(search) eq(2, #before_delete) -- Doesn't clear without passing group. - meths.nvim_clear_autocmds { buffer = 0 } - local without_group = meths.nvim_get_autocmds(search) + api.nvim_clear_autocmds { buffer = 0 } + local without_group = api.nvim_get_autocmds(search) eq(2, #without_group) -- Doesn't clear with passing group. - meths.nvim_clear_autocmds { buffer = 0, group = search.group } - local with_group = meths.nvim_get_autocmds(search) + api.nvim_clear_autocmds { buffer = 0, group = search.group } + local with_group = api.nvim_get_autocmds(search) eq(1, #with_group) end) end) diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index b1b4c9f583..10be4c56a7 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -4,8 +4,8 @@ local clear = helpers.clear local eq = helpers.eq local ok = helpers.ok local describe_lua_and_rpc = helpers.describe_lua_and_rpc(describe) -local meths = helpers.meths -local funcs = helpers.funcs +local api = helpers.api +local fn = helpers.fn local request = helpers.request local exc_exec = helpers.exc_exec local exec_lua = helpers.exec_lua @@ -41,120 +41,114 @@ describe('api/buf', function() end) it("doesn't crash just after set undolevels=1 #24894", function() - local buf = meths.nvim_create_buf(false, true) - meths.nvim_buf_set_option(buf, 'undolevels', -1) - meths.nvim_buf_set_lines(buf, 0, 1, false, {}) + local buf = api.nvim_create_buf(false, true) + api.nvim_buf_set_option(buf, 'undolevels', -1) + api.nvim_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. - meths.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) + api.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) -- Set the current cursor to {3, 2}. - meths.nvim_win_set_cursor(0, { 3, 2 }) + api.nvim_win_set_cursor(0, { 3, 2 }) -- add 2 lines and delete 1 line above the current cursor position. - meths.nvim_buf_set_lines(0, 1, 2, true, { 'line5', 'line6' }) + api.nvim_buf_set_lines(0, 1, 2, true, { 'line5', 'line6' }) -- check the current set of lines in the buffer. - eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, meths.nvim_buf_get_lines(0, 0, -1, true)) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, api.nvim_buf_get_lines(0, 0, -1, true)) -- cursor should be moved below by 1 line. - eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) + eq({ 4, 2 }, api.nvim_win_get_cursor(0)) -- add a line after the current cursor position. - meths.nvim_buf_set_lines(0, 5, 5, true, { 'line7' }) + api.nvim_buf_set_lines(0, 5, 5, true, { 'line7' }) -- check the current set of lines in the buffer. eq( { 'line1', 'line5', 'line6', 'line3', 'line4', 'line7' }, - meths.nvim_buf_get_lines(0, 0, -1, true) + api.nvim_buf_get_lines(0, 0, -1, true) ) -- cursor position is unchanged. - eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) + eq({ 4, 2 }, api.nvim_win_get_cursor(0)) -- overwrite current cursor line. - meths.nvim_buf_set_lines(0, 3, 5, true, { 'line8', 'line9' }) + api.nvim_buf_set_lines(0, 3, 5, true, { 'line8', 'line9' }) -- check the current set of lines in the buffer. eq( { 'line1', 'line5', 'line6', 'line8', 'line9', 'line7' }, - meths.nvim_buf_get_lines(0, 0, -1, true) + api.nvim_buf_get_lines(0, 0, -1, true) ) -- cursor position is unchanged. - eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) + eq({ 4, 2 }, api.nvim_win_get_cursor(0)) -- delete current cursor line. - meths.nvim_buf_set_lines(0, 3, 5, true, {}) + api.nvim_buf_set_lines(0, 3, 5, true, {}) -- check the current set of lines in the buffer. - eq({ 'line1', 'line5', 'line6', 'line7' }, meths.nvim_buf_get_lines(0, 0, -1, true)) + eq({ 'line1', 'line5', 'line6', 'line7' }, api.nvim_buf_get_lines(0, 0, -1, true)) -- cursor position is unchanged. - eq({ 4, 2 }, meths.nvim_win_get_cursor(0)) + eq({ 4, 2 }, api.nvim_win_get_cursor(0)) end) it('cursor position is maintained in non-current window', function() - meths.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) - meths.nvim_win_set_cursor(0, { 3, 2 }) - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + api.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) + api.nvim_win_set_cursor(0, { 3, 2 }) + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('new') - meths.nvim_buf_set_lines(buf, 1, 2, true, { 'line5', 'line6' }) - eq( - { 'line1', 'line5', 'line6', 'line3', 'line4' }, - meths.nvim_buf_get_lines(buf, 0, -1, true) - ) - eq({ 4, 2 }, meths.nvim_win_get_cursor(win)) + api.nvim_buf_set_lines(buf, 1, 2, true, { 'line5', 'line6' }) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, api.nvim_buf_get_lines(buf, 0, -1, true)) + eq({ 4, 2 }, api.nvim_win_get_cursor(win)) end) it('cursor position is maintained in TWO non-current windows', function() - meths.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) - meths.nvim_win_set_cursor(0, { 3, 2 }) - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + api.nvim_buf_set_lines(0, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) + api.nvim_win_set_cursor(0, { 3, 2 }) + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('split') - meths.nvim_win_set_cursor(0, { 4, 2 }) - local win2 = meths.nvim_get_current_win() + api.nvim_win_set_cursor(0, { 4, 2 }) + local win2 = api.nvim_get_current_win() -- set current window to third one with another buffer command('new') - meths.nvim_buf_set_lines(buf, 1, 2, true, { 'line5', 'line6' }) - eq( - { 'line1', 'line5', 'line6', 'line3', 'line4' }, - meths.nvim_buf_get_lines(buf, 0, -1, true) - ) - eq({ 4, 2 }, meths.nvim_win_get_cursor(win)) - eq({ 5, 2 }, meths.nvim_win_get_cursor(win2)) + api.nvim_buf_set_lines(buf, 1, 2, true, { 'line5', 'line6' }) + eq({ 'line1', 'line5', 'line6', 'line3', 'line4' }, api.nvim_buf_get_lines(buf, 0, -1, true)) + eq({ 4, 2 }, api.nvim_win_get_cursor(win)) + eq({ 5, 2 }, api.nvim_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 = meths.nvim_buf_get_number(0) + local bufnr = api.nvim_buf_get_number(0) -- replace the buffer contents with these three lines - meths.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) + api.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) -- check the line count is correct - eq(4, meths.nvim_buf_line_count(bufnr)) + eq(4, api.nvim_buf_line_count(bufnr)) -- force unload the buffer (this will discard changes) command('new') command('bunload! ' .. bufnr) -- line count for an unloaded buffer should always be 0 - eq(0, meths.nvim_buf_line_count(bufnr)) + eq(0, api.nvim_buf_line_count(bufnr)) end) it('get_lines has defined behaviour for unloaded buffers', function() -- we'll need to know our bufnr for when it gets unloaded - local bufnr = meths.nvim_buf_get_number(0) + local bufnr = api.nvim_buf_get_number(0) -- replace the buffer contents with these three lines - meths.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) + api.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1', 'line2', 'line3', 'line4' }) -- confirm that getting lines works - eq({ 'line2', 'line3' }, meths.nvim_buf_get_lines(bufnr, 1, 3, true)) + eq({ 'line2', 'line3' }, api.nvim_buf_get_lines(bufnr, 1, 3, true)) -- force unload the buffer (this will discard changes) command('new') command('bunload! ' .. bufnr) -- attempting to get lines now always gives empty list - eq({}, meths.nvim_buf_get_lines(bufnr, 1, 3, true)) + eq({}, api.nvim_buf_get_lines(bufnr, 1, 3, true)) -- it's impossible to get out-of-bounds errors for an unloaded buffer - eq({}, meths.nvim_buf_get_lines(bufnr, 8888, 9999, true)) + eq({}, api.nvim_buf_get_lines(bufnr, 8888, 9999, true)) end) describe('handles topline', function() @@ -167,22 +161,22 @@ describe('api/buf', function() [3] = { reverse = true }, } screen:attach() - meths.nvim_buf_set_lines( + api.nvim_buf_set_lines( 0, 0, -1, true, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' } ) - meths.nvim_set_option_value('modified', false, {}) + api.nvim_set_option_value('modified', false, {}) end) it('of current window', function() - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('new | wincmd w') - meths.nvim_win_set_cursor(win, { 8, 0 }) + api.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -198,7 +192,7 @@ describe('api/buf', function() ]], } - meths.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + api.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) screen:expect { grid = [[ | @@ -214,7 +208,7 @@ describe('api/buf', function() } -- replacing topline keeps it the topline - meths.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + api.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) screen:expect { grid = [[ | @@ -230,7 +224,7 @@ describe('api/buf', function() } -- inserting just before topline does not scroll up if cursor would be moved - meths.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) + api.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) screen:expect { grid = [[ | @@ -246,7 +240,7 @@ describe('api/buf', function() unchanged = true, } - meths.nvim_win_set_cursor(0, { 7, 0 }) + api.nvim_win_set_cursor(0, { 7, 0 }) screen:expect { grid = [[ | @@ -261,7 +255,7 @@ describe('api/buf', function() ]], } - meths.nvim_buf_set_lines(buf, 4, 4, true, { 'mmmeeeee' }) + api.nvim_buf_set_lines(buf, 4, 4, true, { 'mmmeeeee' }) screen:expect { grid = [[ | @@ -278,11 +272,11 @@ describe('api/buf', function() end) it('of non-current window', function() - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('new') - meths.nvim_win_set_cursor(win, { 8, 0 }) + api.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -298,7 +292,7 @@ describe('api/buf', function() ]], } - meths.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + api.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) screen:expect { grid = [[ ^ | @@ -314,7 +308,7 @@ describe('api/buf', function() } -- replacing topline keeps it the topline - meths.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + api.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) screen:expect { grid = [[ ^ | @@ -330,7 +324,7 @@ describe('api/buf', function() } -- inserting just before topline scrolls up - meths.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) + api.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) screen:expect { grid = [[ ^ | @@ -347,12 +341,12 @@ describe('api/buf', function() end) it('of split windows with same buffer', function() - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('split') - meths.nvim_win_set_cursor(win, { 8, 0 }) - meths.nvim_win_set_cursor(0, { 1, 0 }) + api.nvim_win_set_cursor(win, { 8, 0 }) + api.nvim_win_set_cursor(0, { 1, 0 }) screen:expect { grid = [[ @@ -370,7 +364,7 @@ describe('api/buf', function() | ]], } - meths.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) + api.nvim_buf_set_lines(buf, 0, 2, true, { 'aaabbb' }) screen:expect { grid = [[ @@ -390,7 +384,7 @@ describe('api/buf', function() } -- replacing topline keeps it the topline - meths.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) + api.nvim_buf_set_lines(buf, 3, 4, true, { 'wwweeee' }) screen:expect { grid = [[ ^aaabbb | @@ -409,7 +403,7 @@ describe('api/buf', function() } -- inserting just before topline scrolls up - meths.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) + api.nvim_buf_set_lines(buf, 3, 3, true, { 'mmm' }) screen:expect { grid = [[ ^aaabbb | @@ -430,15 +424,15 @@ describe('api/buf', function() end) it('handles clearing out non-current buffer #24911', function() - local buf = meths.nvim_get_current_buf() - meths.nvim_buf_set_lines(buf, 0, -1, true, { 'aaa', 'bbb', 'ccc' }) + local buf = api.nvim_get_current_buf() + api.nvim_buf_set_lines(buf, 0, -1, true, { 'aaa', 'bbb', 'ccc' }) command('new') - meths.nvim_buf_set_lines(0, 0, -1, true, { 'xxx', 'yyy', 'zzz' }) + api.nvim_buf_set_lines(0, 0, -1, true, { 'xxx', 'yyy', 'zzz' }) - meths.nvim_buf_set_lines(buf, 0, -1, true, {}) - eq({ 'xxx', 'yyy', 'zzz' }, meths.nvim_buf_get_lines(0, 0, -1, true)) - eq({ '' }, meths.nvim_buf_get_lines(buf, 0, -1, true)) + api.nvim_buf_set_lines(buf, 0, -1, true, {}) + eq({ 'xxx', 'yyy', 'zzz' }, api.nvim_buf_get_lines(0, 0, -1, true)) + eq({ '' }, api.nvim_buf_get_lines(buf, 0, -1, true)) end) end) @@ -520,24 +514,24 @@ describe('api/buf', function() end) end) - describe_lua_and_rpc('nvim_buf_get_lines, nvim_buf_set_lines', function(api) + describe_lua_and_rpc('nvim_buf_get_lines, nvim_buf_set_lines', function(lua_or_rpc) local function get_lines(...) - return api.meths.nvim_buf_get_lines(0, ...) + return lua_or_rpc.nvim_buf_get_lines(0, ...) end local function set_lines(...) - return api.meths.nvim_buf_set_lines(0, ...) + return lua_or_rpc.nvim_buf_set_lines(0, ...) end local function line_count() - return api.meths.nvim_buf_line_count(0) + return lua_or_rpc.nvim_buf_line_count(0) end it('fails correctly when input is not valid', function() - eq(1, api.meths.nvim_buf_get_number(0)) + eq(1, lua_or_rpc.nvim_buf_get_number(0)) eq( [['replacement string' item contains newlines]], - pcall_err(api.meths.nvim_buf_set_lines, 1, 1, 2, false, { 'b\na' }) + pcall_err(lua_or_rpc.nvim_buf_set_lines, 1, 1, 2, false, { 'b\na' }) ) end) @@ -545,7 +539,7 @@ describe('api/buf', function() command('set nomodifiable') eq( [[Buffer is not 'modifiable']], - pcall_err(api.meths.nvim_buf_set_lines, 1, 1, 2, false, { 'a', 'b' }) + pcall_err(lua_or_rpc.nvim_buf_set_lines, 1, 1, 2, false, { 'a', 'b' }) ) end) @@ -701,7 +695,7 @@ describe('api/buf', function() Who would win? A real window with proper text]]) - local buf = api.meths.nvim_create_buf(false, true) + local buf = lua_or_rpc.nvim_create_buf(false, true) screen:expect([[ Who would win? | A real window | @@ -710,7 +704,7 @@ describe('api/buf', function() | ]]) - api.meths.nvim_buf_set_lines(buf, 0, -1, true, { 'or some', 'scratchy text' }) + lua_or_rpc.nvim_buf_set_lines(buf, 0, -1, true, { 'or some', 'scratchy text' }) feed('i') -- provoke redraw screen:expect([[ Who would win? | @@ -726,41 +720,41 @@ describe('api/buf', function() visible buffer line 1 line 2 ]]) - local hiddenbuf = api.meths.nvim_create_buf(false, true) + local hiddenbuf = lua_or_rpc.nvim_create_buf(false, true) command('vsplit') command('vsplit') feed('lll') - eq(3, funcs.winnr()) + eq(3, fn.winnr()) feed('h') - eq(2, funcs.winnr()) - api.meths.nvim_buf_set_lines(hiddenbuf, 0, -1, true, { 'hidden buffer line 1', 'line 2' }) + eq(2, fn.winnr()) + lua_or_rpc.nvim_buf_set_lines(hiddenbuf, 0, -1, true, { 'hidden buffer line 1', 'line 2' }) feed('p') - eq(3, funcs.winnr()) + eq(3, fn.winnr()) end) it('set_lines on unloaded buffer #8659 #22670', function() - local bufnr = meths.nvim_buf_get_number(0) - meths.nvim_buf_set_lines(bufnr, 0, -1, false, { 'a', 'b', 'c' }) - meths.nvim_buf_set_name(bufnr, 'set_lines') + local bufnr = api.nvim_get_current_buf().id + lua_or_rpc.nvim_buf_set_lines(bufnr, 0, -1, false, { 'a', 'b', 'c' }) + lua_or_rpc.nvim_buf_set_name(bufnr, 'set_lines') finally(function() os.remove('set_lines') end) command('write!') command('new') command('bunload! ' .. bufnr) - local new_bufnr = funcs.bufnr('set_lines', true) - meths.nvim_buf_set_lines(new_bufnr, 0, -1, false, {}) - eq({ '' }, meths.nvim_buf_get_lines(new_bufnr, 0, -1, false)) + local new_bufnr = fn.bufnr('set_lines', true) + lua_or_rpc.nvim_buf_set_lines(new_bufnr, 0, -1, false, {}) + eq({ '' }, lua_or_rpc.nvim_buf_get_lines(new_bufnr, 0, -1, false)) end) end) describe('nvim_buf_set_text', function() local function get_lines(...) - return meths.nvim_buf_get_lines(0, ...) + return api.nvim_buf_get_lines(0, ...) end local function set_text(...) - return meths.nvim_buf_set_text(0, ...) + return api.nvim_buf_set_text(0, ...) end it('works', function() @@ -840,12 +834,12 @@ describe('api/buf', function() ]]) -- position the cursor on `!` - meths.nvim_win_set_cursor(0, { 1, 11 }) + api.nvim_win_set_cursor(0, { 1, 11 }) -- replace 'world' with '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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 9 }, api.nvim_win_get_cursor(0)) end) it('updates the cursor position in non-current window', function() @@ -853,18 +847,18 @@ describe('api/buf', function() hello world!]]) -- position the cursor on `!` - meths.nvim_win_set_cursor(0, { 1, 11 }) + api.nvim_win_set_cursor(0, { 1, 11 }) - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('new') -- replace 'world' with 'foo' - meths.nvim_buf_set_text(buf, 0, 6, 0, 11, { 'foo' }) - eq({ 'hello foo!' }, meths.nvim_buf_get_lines(buf, 0, -1, true)) + api.nvim_buf_set_text(buf, 0, 6, 0, 11, { 'foo' }) + eq({ 'hello foo!' }, api.nvim_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.nvim_win_get_cursor(win)) + eq({ 1, 9 }, api.nvim_win_get_cursor(win)) end) it('updates the cursor position in TWO non-current windows', function() @@ -872,24 +866,24 @@ describe('api/buf', function() hello world!]]) -- position the cursor on `!` - meths.nvim_win_set_cursor(0, { 1, 11 }) - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + api.nvim_win_set_cursor(0, { 1, 11 }) + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('split') - local win2 = meths.nvim_get_current_win() + local win2 = api.nvim_get_current_win() -- position the cursor on `w` - meths.nvim_win_set_cursor(0, { 1, 6 }) + api.nvim_win_set_cursor(0, { 1, 6 }) command('new') -- replace 'hello' with 'foo' - meths.nvim_buf_set_text(buf, 0, 0, 0, 5, { 'foo' }) - eq({ 'foo world!' }, meths.nvim_buf_get_lines(buf, 0, -1, true)) + api.nvim_buf_set_text(buf, 0, 0, 0, 5, { 'foo' }) + eq({ 'foo world!' }, api.nvim_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.nvim_win_get_cursor(win)) - eq({ 1, 4 }, meths.nvim_win_get_cursor(win2)) + eq({ 1, 9 }, api.nvim_win_get_cursor(win)) + eq({ 1, 4 }, api.nvim_win_get_cursor(win2)) end) describe('when text is being added right at cursor position #22526', function() @@ -898,12 +892,12 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'c' - meths.nvim_win_set_cursor(0, { 1, 2 }) + api.nvim_win_set_cursor(0, { 1, 2 }) -- add 'xxx' before 'c' set_text(0, 2, 0, 2, { 'xxx' }) eq({ 'abxxxcd' }, get_lines(0, -1, true)) -- cursor should be on 'c' - eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 5 }, api.nvim_win_get_cursor(0)) end) it('updates the cursor position only in non-current window when in INSERT mode', function() @@ -911,7 +905,7 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'c' - meths.nvim_win_set_cursor(0, { 1, 2 }) + api.nvim_win_set_cursor(0, { 1, 2 }) -- open vertical split feed('v') -- get into INSERT mode to treat cursor @@ -921,13 +915,13 @@ describe('api/buf', function() 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 2 }, api.nvim_win_get_cursor(0)) -- quit INSERT mode feed('') -- close current window feed('c') -- in another window cursor should be on 'c' - eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 5 }, api.nvim_win_get_cursor(0)) end) end) @@ -937,12 +931,12 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'b' - meths.nvim_win_set_cursor(0, { 1, 1 }) + api.nvim_win_set_cursor(0, { 1, 1 }) -- delete 'b' set_text(0, 1, 0, 2, {}) eq({ 'acd' }, get_lines(0, -1, true)) -- cursor is now on 'c' - eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 1 }, api.nvim_win_get_cursor(0)) end) it('maintains INSERT-mode cursor position current/non-current window', function() @@ -950,7 +944,7 @@ describe('api/buf', function() abcd]]) -- position the cursor on 'b' - meths.nvim_win_set_cursor(0, { 1, 1 }) + api.nvim_win_set_cursor(0, { 1, 1 }) -- open vertical split feed('v') -- get into INSERT mode to treat cursor @@ -960,13 +954,13 @@ describe('api/buf', function() set_text(0, 1, 0, 2, {}) eq({ 'acd' }, get_lines(0, -1, true)) -- cursor in the current window should stay after 'a' - eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 1 }, api.nvim_win_get_cursor(0)) -- quit INSERT mode feed('') -- close current window feed('c') -- cursor in non-current window should stay on 'c' - eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 1 }, api.nvim_win_get_cursor(0)) end) end) @@ -978,7 +972,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on ' ' before 'first' - meths.nvim_win_set_cursor(0, { 1, 14 }) + api.nvim_win_set_cursor(0, { 1, 14 }) set_text(0, 15, 2, 11, { 'the line we do not want', @@ -990,7 +984,7 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay at the same position - eq({ 1, 14 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 14 }, api.nvim_win_get_cursor(0)) end) it('maintains cursor position if at start_row and column is still valid', function() @@ -1000,7 +994,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'f' in 'first' - meths.nvim_win_set_cursor(0, { 1, 15 }) + api.nvim_win_set_cursor(0, { 1, 15 }) set_text(0, 15, 2, 11, { 'the line we do not want', @@ -1012,7 +1006,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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 15 }, api.nvim_win_get_cursor(0)) end) it('adjusts cursor column to keep it valid if start_row got smaller', function() @@ -1022,7 +1016,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 't' in 'first' - meths.nvim_win_set_cursor(0, { 1, 19 }) + api.nvim_win_set_cursor(0, { 1, 19 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 24, {'last'}) @@ -1031,7 +1025,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 18 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 18 }, cursor) end) @@ -1043,7 +1037,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 't' in 'first' - meths.nvim_win_set_cursor(0, { 1, 19 }) + api.nvim_win_set_cursor(0, { 1, 19 }) -- enter INSERT mode to treat cursor as being after 't' feed('a') @@ -1054,7 +1048,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 19 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 19 }, cursor) end) @@ -1066,7 +1060,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'w' in 'want' - meths.nvim_win_set_cursor(0, { 2, 31 }) + api.nvim_win_set_cursor(0, { 2, 31 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { @@ -1083,7 +1077,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 5 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 5 }, cursor) end) @@ -1097,7 +1091,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'w' in 'want' - meths.nvim_win_set_cursor(0, { 2, 31 }) + api.nvim_win_set_cursor(0, { 2, 31 }) -- enter INSERT mode feed('a') @@ -1116,7 +1110,7 @@ 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, 6 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 6 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 6 }, cursor) end @@ -1129,7 +1123,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'n' in 'finally' - meths.nvim_win_set_cursor(0, { 3, 6 }) + api.nvim_win_set_cursor(0, { 3, 6 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 11, { @@ -1145,7 +1139,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 12 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 12 }, cursor) end) @@ -1157,7 +1151,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'r' in 'there' - meths.nvim_win_set_cursor(0, { 2, 8 }) + api.nvim_win_set_cursor(0, { 2, 8 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 15, 2, 12, {}) @@ -1166,7 +1160,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 15 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 15 }, cursor) end) @@ -1178,7 +1172,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'r' in 'there' - meths.nvim_win_set_cursor(0, { 2, 8 }) + api.nvim_win_set_cursor(0, { 2, 8 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 2, 4, {}) @@ -1187,7 +1181,7 @@ describe('api/buf', function() eq({ 'finally the last one' }, get_lines(0, -1, true)) -- cursor should end up in column 0 - eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 0 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 0 }, cursor) end) @@ -1199,7 +1193,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' in 'finally' - meths.nvim_win_set_cursor(0, { 3, 10 }) + api.nvim_win_set_cursor(0, { 3, 10 }) set_text(0, 15, 2, 11, { '1', 'this 2', 'and then' }) eq({ @@ -1208,7 +1202,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 }, meths.nvim_win_get_cursor(0)) + eq({ 3, 7 }, api.nvim_win_get_cursor(0)) end) it( @@ -1220,7 +1214,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' at 'finally' - meths.nvim_win_set_cursor(0, { 3, 10 }) + api.nvim_win_set_cursor(0, { 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' }) @@ -1231,7 +1225,7 @@ describe('api/buf', function() 'and then the last one', }, get_lines(0, -1, true)) -- cursor should end up after 'n' in 'then' - eq({ 3, 8 }, meths.nvim_win_get_cursor(0)) + eq({ 3, 8 }, api.nvim_win_get_cursor(0)) end ) @@ -1242,7 +1236,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'y' in 'finally' - meths.nvim_win_set_cursor(0, { 3, 10 }) + api.nvim_win_set_cursor(0, { 3, 10 }) set_text(2, 4, 2, 11, { 'then' }) eq({ @@ -1251,7 +1245,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 }, meths.nvim_win_get_cursor(0)) + eq({ 3, 7 }, api.nvim_win_get_cursor(0)) end) it('does not move cursor column after end of a line', function() @@ -1260,7 +1254,7 @@ describe('api/buf', function() !!!]]) -- position cursor on the last '1' - meths.nvim_win_set_cursor(0, { 2, 2 }) + api.nvim_win_set_cursor(0, { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 33, 1, 3, {}) @@ -1269,7 +1263,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 32 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 32 }, cursor) end) @@ -1278,7 +1272,7 @@ describe('api/buf', function() insert('\n!!!') -- position cursor on the last '1' - meths.nvim_win_set_cursor(0, { 2, 2 }) + api.nvim_win_set_cursor(0, { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 1, 3, {}) @@ -1287,7 +1281,7 @@ describe('api/buf', function() eq({ '' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 0 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 0 }, cursor) end) @@ -1300,7 +1294,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'want' - meths.nvim_win_set_cursor(0, { 2, 34 }) + api.nvim_win_set_cursor(0, { 2, 34 }) -- turn on virtualedit command('set virtualedit=all') @@ -1318,7 +1312,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 12 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 2, 12 }, cursor) -- coladd should be 0 @@ -1337,7 +1331,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'want' - meths.nvim_win_set_cursor(0, { 2, 34 }) + api.nvim_win_set_cursor(0, { 2, 34 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1358,7 +1352,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 26 }, api.nvim_win_get_cursor(0)) -- 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 @@ -1379,7 +1373,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'first' - meths.nvim_win_set_cursor(0, { 1, 19 }) + api.nvim_win_set_cursor(0, { 1, 19 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1400,7 +1394,7 @@ 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({ 1, 38 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 38 }, api.nvim_win_get_cursor(0)) -- 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 @@ -1422,7 +1416,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 't' in 'first' - meths.nvim_win_set_cursor(0, { 1, 19 }) + api.nvim_win_set_cursor(0, { 1, 19 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol just a bit @@ -1443,7 +1437,7 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay at the same screen column - eq({ 1, 22 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 22 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 22 }, cursor) -- coladd should become 0 @@ -1466,7 +1460,7 @@ describe('api/buf', function() and finally the last one]]) -- position cursor on 'e' in 'more' - meths.nvim_win_set_cursor(0, { 3, 11 }) + api.nvim_win_set_cursor(0, { 3, 11 }) -- turn on virtualedit command('set virtualedit=all') -- move cursor after eol @@ -1487,7 +1481,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 26 }, api.nvim_win_get_cursor(0)) -- 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 @@ -1510,17 +1504,17 @@ describe('api/buf', function() line]]) -- position the cursor on 'i' - meths.nvim_win_set_cursor(0, { 3, 2 }) + api.nvim_win_set_cursor(0, { 3, 2 }) set_text(1, 6, 2, 0, {}) eq({ 'first line', 'second line' }, get_lines(0, -1, true)) -- cursor should stay on 'i' - eq({ 2, 8 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 8 }, api.nvim_win_get_cursor(0)) -- add a newline back 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 }, meths.nvim_win_get_cursor(0)) + eq({ 3, 2 }, api.nvim_win_get_cursor(0)) end) it( @@ -1532,11 +1526,11 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 'h' in 'the' - meths.nvim_win_set_cursor(0, { 3, 13 }) + api.nvim_win_set_cursor(0, { 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 16 }, api.nvim_win_get_cursor(0)) -- add deleted lines back set_text(0, 14, 0, 14, { ' first', @@ -1549,7 +1543,7 @@ describe('api/buf', function() 'and finally the last one', }, get_lines(0, -1, true)) -- cursor should return back to the original position - eq({ 3, 13 }, meths.nvim_win_get_cursor(0)) + eq({ 3, 13 }, api.nvim_win_get_cursor(0)) end ) @@ -1562,7 +1556,7 @@ describe('api/buf', function() and finally the last one]]) -- position the cursor on 's' in 'last' - meths.nvim_win_set_cursor(0, { 3, 18 }) + api.nvim_win_set_cursor(0, { 3, 18 }) set_text(0, 15, 2, 11, { 'the line we do not want', 'but hopefully', @@ -1573,7 +1567,7 @@ describe('api/buf', function() 'but hopefully the last one', }, get_lines(0, -1, true)) -- cursor should stay on 's' - eq({ 2, 20 }, meths.nvim_win_get_cursor(0)) + eq({ 2, 20 }, api.nvim_win_get_cursor(0)) set_text(0, 15, 1, 13, { 'first', @@ -1587,7 +1581,7 @@ describe('api/buf', function() 'and finally the last one', }, get_lines(0, -1, true)) -- cursor should return back to the original position - eq({ 3, 18 }, meths.nvim_win_get_cursor(0)) + eq({ 3, 18 }, api.nvim_win_get_cursor(0)) end ) @@ -1597,7 +1591,7 @@ describe('api/buf', function() ]]) -- position cursor at the empty line - meths.nvim_win_set_cursor(0, { 2, 0 }) + api.nvim_win_set_cursor(0, { 2, 0 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 33, 1, 0, {'!'}) @@ -1606,7 +1600,7 @@ 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 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 33 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 33 }, cursor) end) @@ -1617,7 +1611,7 @@ describe('api/buf', function() eq({ '', '' }, get_lines(0, -1, true)) -- position cursor on the last '1' - meths.nvim_win_set_cursor(0, { 2, 2 }) + api.nvim_win_set_cursor(0, { 2, 2 }) local cursor = exec_lua([[ vim.api.nvim_buf_set_text(0, 0, 0, 1, 0, {''}) @@ -1626,7 +1620,7 @@ describe('api/buf', function() eq({ '' }, get_lines(0, -1, true)) -- cursor should end up on '!' - eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 0 }, api.nvim_win_get_cursor(0)) -- immediate call to nvim_win_get_cursor should have returned the same position eq({ 1, 0 }, cursor) end) @@ -1638,46 +1632,46 @@ describe('api/buf', function() end) it('adjusts extmarks', function() - local ns = meths.nvim_create_namespace('my-fancy-plugin') + local ns = api.nvim_create_namespace('my-fancy-plugin') insert([[ foo bar baz ]]) - local id1 = meths.nvim_buf_set_extmark(0, ns, 0, 1, {}) - local id2 = meths.nvim_buf_set_extmark(0, ns, 0, 7, {}) - local id3 = meths.nvim_buf_set_extmark(0, ns, 1, 1, {}) + local id1 = api.nvim_buf_set_extmark(0, ns, 0, 1, {}) + local id2 = api.nvim_buf_set_extmark(0, ns, 0, 7, {}) + local id3 = api.nvim_buf_set_extmark(0, ns, 1, 1, {}) set_text(0, 4, 0, 7, { 'q' }) eq({ 'foo q', 'baz' }, get_lines(0, 2, true)) -- mark before replacement point is unaffected - eq({ 0, 1 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) + eq({ 0, 1 }, api.nvim_buf_get_extmark_by_id(0, ns, id1, {})) -- mark gets shifted back because the replacement was shorter - eq({ 0, 5 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) + eq({ 0, 5 }, api.nvim_buf_get_extmark_by_id(0, ns, id2, {})) -- mark on the next line is unaffected - eq({ 1, 1 }, meths.nvim_buf_get_extmark_by_id(0, ns, id3, {})) + eq({ 1, 1 }, api.nvim_buf_get_extmark_by_id(0, 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 }, meths.nvim_buf_get_extmark_by_id(0, ns, id3, {})) + eq({ 0, 6 }, api.nvim_buf_get_extmark_by_id(0, ns, id3, {})) -- but mark before replacement point is still unaffected - eq({ 0, 1 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) + eq({ 0, 1 }, api.nvim_buf_get_extmark_by_id(0, ns, id1, {})) -- and the mark in the middle was shifted to the end of the insertion - eq({ 0, 6 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) + eq({ 0, 6 }, api.nvim_buf_get_extmark_by_id(0, ns, id2, {})) -- marks should be put back into the same place after undoing set_text(0, 0, 0, 2, { '' }) feed('u') - eq({ 0, 1 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) - eq({ 0, 6 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) - eq({ 0, 6 }, meths.nvim_buf_get_extmark_by_id(0, ns, id3, {})) + eq({ 0, 1 }, api.nvim_buf_get_extmark_by_id(0, ns, id1, {})) + eq({ 0, 6 }, api.nvim_buf_get_extmark_by_id(0, ns, id2, {})) + eq({ 0, 6 }, api.nvim_buf_get_extmark_by_id(0, 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 }, meths.nvim_buf_get_extmark_by_id(0, ns, id1, {})) - eq({ 0, 8 }, meths.nvim_buf_get_extmark_by_id(0, ns, id2, {})) - eq({ 0, 8 }, meths.nvim_buf_get_extmark_by_id(0, ns, id3, {})) + eq({ 0, 3 }, api.nvim_buf_get_extmark_by_id(0, ns, id1, {})) + eq({ 0, 8 }, api.nvim_buf_get_extmark_by_id(0, ns, id2, {})) + eq({ 0, 8 }, api.nvim_buf_get_extmark_by_id(0, ns, id3, {})) end) it('correctly marks changed region for redraw #13890', function() @@ -1689,7 +1683,7 @@ describe('api/buf', function() BBB ]]) - meths.nvim_buf_set_text(0, 0, 0, 1, 3, { 'XXX', 'YYY' }) + api.nvim_buf_set_text(0, 0, 0, 1, 3, { 'XXX', 'YYY' }) screen:expect([[ XXX | @@ -1724,7 +1718,7 @@ describe('api/buf', function() 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.nvim_win_set_cursor(0, { 1, 0 }) + api.nvim_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, {''}) @@ -1742,22 +1736,22 @@ describe('api/buf', function() [3] = { reverse = true }, } screen:attach() - meths.nvim_buf_set_lines( + api.nvim_buf_set_lines( 0, 0, -1, true, { 'aaa', 'bbb', 'ccc', 'ddd', 'www', 'xxx', 'yyy', 'zzz' } ) - meths.nvim_set_option_value('modified', false, {}) + api.nvim_set_option_value('modified', false, {}) end) it('of current window', function() - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('new | wincmd w') - meths.nvim_win_set_cursor(win, { 8, 0 }) + api.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -1772,7 +1766,7 @@ describe('api/buf', function() | ]], } - meths.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + api.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) screen:expect { grid = [[ @@ -1790,11 +1784,11 @@ describe('api/buf', function() end) it('of non-current window', function() - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('new') - meths.nvim_win_set_cursor(win, { 8, 0 }) + api.nvim_win_set_cursor(win, { 8, 0 }) screen:expect { grid = [[ @@ -1810,7 +1804,7 @@ describe('api/buf', function() ]], } - meths.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + api.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) screen:expect { grid = [[ ^ | @@ -1827,12 +1821,12 @@ describe('api/buf', function() end) it('of split windows with same buffer', function() - local win = meths.nvim_get_current_win() - local buf = meths.nvim_get_current_buf() + local win = api.nvim_get_current_win() + local buf = api.nvim_get_current_buf() command('split') - meths.nvim_win_set_cursor(win, { 8, 0 }) - meths.nvim_win_set_cursor(0, { 1, 1 }) + api.nvim_win_set_cursor(win, { 8, 0 }) + api.nvim_win_set_cursor(0, { 1, 1 }) screen:expect { grid = [[ @@ -1850,7 +1844,7 @@ describe('api/buf', function() | ]], } - meths.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) + api.nvim_buf_set_text(buf, 0, 3, 1, 0, { 'X' }) screen:expect { grid = [[ @@ -1872,8 +1866,8 @@ describe('api/buf', function() end) end) - describe_lua_and_rpc('nvim_buf_get_text', function(api) - local get_text = api.meths.nvim_buf_get_text + describe_lua_and_rpc('nvim_buf_get_text', function(lua_or_rpc) + local get_text = lua_or_rpc.nvim_buf_get_text before_each(function() insert([[ hello foo! @@ -1898,7 +1892,7 @@ describe('api/buf', function() eq('Index out of bounds', pcall_err(get_text, 0, 0, 0, 3, 0, {})) eq('Index out of bounds', pcall_err(get_text, 0, 0, 0, -4, 0, {})) -- no ml_get errors should happen #19017 - eq('', meths.nvim_get_vvar('errmsg')) + eq('', api.nvim_get_vvar('errmsg')) end) it('errors when start is greater than end', function() @@ -1908,10 +1902,10 @@ describe('api/buf', function() end) describe('nvim_buf_get_offset', function() - local get_offset = meths.nvim_buf_get_offset + local get_offset = api.nvim_buf_get_offset it('works', function() - meths.nvim_buf_set_lines(0, 0, -1, true, { 'Some\r', 'exa\000mple', '', 'buf\rfer', 'text' }) - eq(5, meths.nvim_buf_line_count(0)) + api.nvim_buf_set_lines(0, 0, -1, true, { 'Some\r', 'exa\000mple', '', 'buf\rfer', 'text' }) + eq(5, api.nvim_buf_line_count(0)) eq(0, get_offset(0, 0)) eq(6, get_offset(0, 1)) eq(15, get_offset(0, 2)) @@ -1921,33 +1915,33 @@ describe('api/buf', function() eq('Index out of bounds', pcall_err(get_offset, 0, 6)) eq('Index out of bounds', pcall_err(get_offset, 0, -1)) - meths.nvim_set_option_value('eol', false, {}) - meths.nvim_set_option_value('fixeol', false, {}) + api.nvim_set_option_value('eol', false, {}) + api.nvim_set_option_value('fixeol', false, {}) eq(28, get_offset(0, 5)) -- fileformat is ignored - meths.nvim_set_option_value('fileformat', 'dos', {}) + api.nvim_set_option_value('fileformat', 'dos', {}) eq(0, get_offset(0, 0)) eq(6, get_offset(0, 1)) eq(15, get_offset(0, 2)) eq(16, get_offset(0, 3)) eq(24, get_offset(0, 4)) eq(28, get_offset(0, 5)) - meths.nvim_set_option_value('eol', true, {}) + api.nvim_set_option_value('eol', true, {}) eq(29, get_offset(0, 5)) command('set hidden') command('enew') - eq(6, meths.nvim_buf_get_offset(1, 1)) + eq(6, api.nvim_buf_get_offset(1, 1)) command('bunload! 1') - eq(-1, meths.nvim_buf_get_offset(1, 1)) - eq(-1, meths.nvim_buf_get_offset(1, 0)) + eq(-1, api.nvim_buf_get_offset(1, 1)) + eq(-1, api.nvim_buf_get_offset(1, 0)) end) it('works in empty buffer', function() eq(0, get_offset(0, 0)) eq(1, get_offset(0, 1)) - eq(-1, funcs.line2byte('$')) + eq(-1, fn.line2byte('$')) end) it('works in buffer with one line inserted', function() @@ -1959,28 +1953,28 @@ describe('api/buf', function() describe('nvim_buf_get_var, nvim_buf_set_var, nvim_buf_del_var', function() it('works', function() - meths.nvim_buf_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_buf_get_var(0, 'lua')) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('b:lua')) - eq(1, funcs.exists('b:lua')) - meths.nvim_buf_del_var(0, 'lua') - eq(0, funcs.exists('b:lua')) - eq('Key not found: lua', pcall_err(meths.nvim_buf_del_var, 0, 'lua')) - meths.nvim_buf_set_var(0, 'lua', 1) + api.nvim_buf_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_buf_get_var(0, 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_eval('b:lua')) + eq(1, fn.exists('b:lua')) + api.nvim_buf_del_var(0, 'lua') + eq(0, fn.exists('b:lua')) + eq('Key not found: lua', pcall_err(api.nvim_buf_del_var, 0, 'lua')) + api.nvim_buf_set_var(0, 'lua', 1) command('lockvar b:lua') - eq('Key is locked: lua', pcall_err(meths.nvim_buf_del_var, 0, 'lua')) - eq('Key is locked: lua', pcall_err(meths.nvim_buf_set_var, 0, 'lua', 1)) - eq('Key is read-only: changedtick', pcall_err(meths.nvim_buf_del_var, 0, 'changedtick')) - eq('Key is read-only: changedtick', pcall_err(meths.nvim_buf_set_var, 0, 'changedtick', 1)) + eq('Key is locked: lua', pcall_err(api.nvim_buf_del_var, 0, 'lua')) + eq('Key is locked: lua', pcall_err(api.nvim_buf_set_var, 0, 'lua', 1)) + eq('Key is read-only: changedtick', pcall_err(api.nvim_buf_del_var, 0, 'changedtick')) + eq('Key is read-only: changedtick', pcall_err(api.nvim_buf_set_var, 0, 'changedtick', 1)) end) end) describe('nvim_buf_get_changedtick', function() it('works', function() - eq(2, meths.nvim_buf_get_changedtick(0)) - meths.nvim_buf_set_lines(0, 0, 1, false, { 'abc\0', '\0def', 'ghi' }) - eq(3, meths.nvim_buf_get_changedtick(0)) - eq(3, meths.nvim_buf_get_var(0, 'changedtick')) + eq(2, api.nvim_buf_get_changedtick(0)) + api.nvim_buf_set_lines(0, 0, 1, false, { 'abc\0', '\0def', 'ghi' }) + eq(3, api.nvim_buf_get_changedtick(0)) + eq(3, api.nvim_buf_get_var(0, 'changedtick')) end) it('buffer_set_var returns the old value', function() @@ -2001,33 +1995,33 @@ describe('api/buf', function() describe('nvim_get_option_value, nvim_set_option_value', function() it('works', function() - eq(8, meths.nvim_get_option_value('shiftwidth', {})) - meths.nvim_set_option_value('shiftwidth', 4, {}) - eq(4, meths.nvim_get_option_value('shiftwidth', {})) + eq(8, api.nvim_get_option_value('shiftwidth', {})) + api.nvim_set_option_value('shiftwidth', 4, {}) + eq(4, api.nvim_get_option_value('shiftwidth', {})) -- global-local option - meths.nvim_set_option_value('define', 'test', { buf = 0 }) - eq('test', meths.nvim_get_option_value('define', { buf = 0 })) + api.nvim_set_option_value('define', 'test', { buf = 0 }) + eq('test', api.nvim_get_option_value('define', { buf = 0 })) -- Doesn't change the global value - eq('', meths.nvim_get_option_value('define', { scope = 'global' })) + eq('', api.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, meths.nvim_get_option_value('undolevels', { buf = 0 })) + eq(-123456, api.nvim_get_option_value('undolevels', { buf = 0 })) end) end) describe('nvim_buf_get_name, nvim_buf_set_name', function() it('works', function() command('new') - eq('', meths.nvim_buf_get_name(0)) - local new_name = meths.nvim_eval('resolve(tempname())') - meths.nvim_buf_set_name(0, new_name) - eq(new_name, meths.nvim_buf_get_name(0)) + eq('', api.nvim_buf_get_name(0)) + local new_name = api.nvim_eval('resolve(tempname())') + api.nvim_buf_set_name(0, new_name) + eq(new_name, api.nvim_buf_get_name(0)) command('w!') - eq(1, funcs.filereadable(new_name)) + eq(1, fn.filereadable(new_name)) os.remove(new_name) end) end) @@ -2035,121 +2029,121 @@ describe('api/buf', function() describe('nvim_buf_is_loaded', function() it('works', function() -- record our buffer number for when we unload it - local bufnr = meths.nvim_buf_get_number(0) + local bufnr = api.nvim_buf_get_number(0) -- api should report that the buffer is loaded - ok(meths.nvim_buf_is_loaded(bufnr)) + ok(api.nvim_buf_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 - meths.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1' }) + api.nvim_buf_set_lines(bufnr, 0, -1, true, { 'line1' }) command('hide enew') -- confirm the buffer is hidden, but still loaded - local infolist = meths.nvim_eval('getbufinfo(' .. bufnr .. ')') + local infolist = api.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) -- confirm the buffer is unloaded - infolist = meths.nvim_eval('getbufinfo(' .. bufnr .. ')') + infolist = api.nvim_eval('getbufinfo(' .. bufnr .. ')') eq(0, infolist[1].loaded) -- nvim_buf_is_loaded() should also report the buffer as unloaded - eq(false, meths.nvim_buf_is_loaded(bufnr)) + eq(false, api.nvim_buf_is_loaded(bufnr)) end) end) describe('nvim_buf_is_valid', function() it('works', function() command('new') - local b = meths.nvim_get_current_buf() - ok(meths.nvim_buf_is_valid(b)) + local b = api.nvim_get_current_buf() + ok(api.nvim_buf_is_valid(b)) command('bw!') - ok(not meths.nvim_buf_is_valid(b)) + ok(not api.nvim_buf_is_valid(b)) end) end) describe('nvim_buf_delete', function() it('allows for just deleting', function() command('new') - local b = meths.nvim_get_current_buf() - ok(meths.nvim_buf_is_valid(b)) - meths.nvim_buf_delete(b, {}) - ok(not meths.nvim_buf_is_loaded(b)) - ok(not meths.nvim_buf_is_valid(b)) + local b = api.nvim_get_current_buf() + ok(api.nvim_buf_is_valid(b)) + api.nvim_buf_delete(b, {}) + ok(not api.nvim_buf_is_loaded(b)) + ok(not api.nvim_buf_is_valid(b)) end) it('allows for just unloading', function() command('new') - local b = meths.nvim_get_current_buf() - ok(meths.nvim_buf_is_valid(b)) - meths.nvim_buf_delete(b, { unload = true }) - ok(not meths.nvim_buf_is_loaded(b)) - ok(meths.nvim_buf_is_valid(b)) + local b = api.nvim_get_current_buf() + ok(api.nvim_buf_is_valid(b)) + api.nvim_buf_delete(b, { unload = true }) + ok(not api.nvim_buf_is_loaded(b)) + ok(api.nvim_buf_is_valid(b)) end) end) describe('nvim_buf_get_mark', function() it('works', function() - meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) - meths.nvim_win_set_cursor(0, { 3, 4 }) + api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + api.nvim_win_set_cursor(0, { 3, 4 }) command('mark v') - eq({ 3, 0 }, meths.nvim_buf_get_mark(0, 'v')) + eq({ 3, 0 }, api.nvim_buf_get_mark(0, 'v')) end) end) describe('nvim_buf_set_mark', function() it('works with buffer local marks', function() - meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) - eq(true, meths.nvim_buf_set_mark(0, 'z', 1, 1, {})) - eq({ 1, 1 }, meths.nvim_buf_get_mark(0, 'z')) - eq({ 0, 1, 2, 0 }, funcs.getpos("'z")) + api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + eq(true, api.nvim_buf_set_mark(0, 'z', 1, 1, {})) + eq({ 1, 1 }, api.nvim_buf_get_mark(0, 'z')) + eq({ 0, 1, 2, 0 }, fn.getpos("'z")) end) it('works with file/uppercase marks', function() - meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) - eq(true, meths.nvim_buf_set_mark(0, 'Z', 3, 2, {})) - eq({ 3, 2 }, meths.nvim_buf_get_mark(0, 'Z')) - eq({ meths.nvim_get_current_buf().id, 3, 3, 0 }, funcs.getpos("'Z")) + api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + eq(true, api.nvim_buf_set_mark(0, 'Z', 3, 2, {})) + eq({ 3, 2 }, api.nvim_buf_get_mark(0, 'Z')) + eq({ api.nvim_get_current_buf().id, 3, 3, 0 }, fn.getpos("'Z")) end) it('fails when invalid marks names are used', function() - eq(false, pcall(meths.nvim_buf_set_mark, 0, '!', 1, 0, {})) - eq(false, pcall(meths.nvim_buf_set_mark, 0, 'fail', 1, 0, {})) + eq(false, pcall(api.nvim_buf_set_mark, 0, '!', 1, 0, {})) + eq(false, pcall(api.nvim_buf_set_mark, 0, 'fail', 1, 0, {})) end) it('fails when invalid buffer number is used', function() - eq(false, pcall(meths.nvim_buf_set_mark, 99, 'a', 1, 1, {})) + eq(false, pcall(api.nvim_buf_set_mark, 99, 'a', 1, 1, {})) end) end) describe('nvim_buf_del_mark', function() it('works with buffer local marks', function() - meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) - meths.nvim_buf_set_mark(0, 'z', 3, 1, {}) - eq(true, meths.nvim_buf_del_mark(0, 'z')) - eq({ 0, 0 }, meths.nvim_buf_get_mark(0, 'z')) + api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + api.nvim_buf_set_mark(0, 'z', 3, 1, {}) + eq(true, api.nvim_buf_del_mark(0, 'z')) + eq({ 0, 0 }, api.nvim_buf_get_mark(0, 'z')) end) it('works with file/uppercase marks', function() - meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) - meths.nvim_buf_set_mark(0, 'Z', 3, 3, {}) - eq(true, meths.nvim_buf_del_mark(0, 'Z')) - eq({ 0, 0 }, meths.nvim_buf_get_mark(0, 'Z')) + api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + api.nvim_buf_set_mark(0, 'Z', 3, 3, {}) + eq(true, api.nvim_buf_del_mark(0, 'Z')) + eq({ 0, 0 }, api.nvim_buf_get_mark(0, 'Z')) end) it('returns false in marks not set in this buffer', function() - local abuf = meths.nvim_create_buf(false, true) - meths.nvim_buf_set_lines(abuf, -1, -1, true, { 'a', 'bit of', 'text' }) - meths.nvim_buf_set_mark(abuf, 'A', 2, 2, {}) - eq(false, meths.nvim_buf_del_mark(0, 'A')) - eq({ 2, 2 }, meths.nvim_buf_get_mark(abuf, 'A')) + local abuf = api.nvim_create_buf(false, true) + api.nvim_buf_set_lines(abuf, -1, -1, true, { 'a', 'bit of', 'text' }) + api.nvim_buf_set_mark(abuf, 'A', 2, 2, {}) + eq(false, api.nvim_buf_del_mark(0, 'A')) + eq({ 2, 2 }, api.nvim_buf_get_mark(abuf, 'A')) end) it('returns false if mark was not deleted', function() - meths.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) - meths.nvim_buf_set_mark(0, 'z', 3, 1, {}) - eq(true, meths.nvim_buf_del_mark(0, 'z')) - eq(false, meths.nvim_buf_del_mark(0, 'z')) -- Mark was already deleted + api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) + api.nvim_buf_set_mark(0, 'z', 3, 1, {}) + eq(true, api.nvim_buf_del_mark(0, 'z')) + eq(false, api.nvim_buf_del_mark(0, 'z')) -- Mark was already deleted end) it('fails when invalid marks names are used', function() - eq(false, pcall(meths.nvim_buf_del_mark, 0, '!')) - eq(false, pcall(meths.nvim_buf_del_mark, 0, 'fail')) + eq(false, pcall(api.nvim_buf_del_mark, 0, '!')) + eq(false, pcall(api.nvim_buf_del_mark, 0, 'fail')) end) it('fails when invalid buffer number is used', function() - eq(false, pcall(meths.nvim_buf_del_mark, 99, 'a')) + eq(false, pcall(api.nvim_buf_del_mark, 99, 'a')) end) end) end) diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index 254e7d4d42..050d4adfec 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -1,8 +1,8 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local eq, ok = helpers.eq, helpers.ok -local funcs = helpers.funcs -local meths = helpers.meths +local fn = helpers.fn +local api = helpers.api local command, eval, next_msg = helpers.command, helpers.eval, helpers.next_msg local nvim_prog = helpers.nvim_prog local pcall_err = helpers.pcall_err @@ -24,7 +24,7 @@ local function expectn(name, args) end local function sendkeys(keys) - meths.nvim_input(keys) + api.nvim_input(keys) -- give nvim some time to process msgpack requests before possibly sending -- more key presses - otherwise they all pile up in the queue and get -- processed at once @@ -37,7 +37,7 @@ local function open(activate, lines) local filename = helpers.tmpname() write_file(filename, table.concat(lines, '\n') .. '\n', true) command('edit ' .. filename) - local b = meths.nvim_get_current_buf() + local b = api.nvim_get_current_buf() -- what is the value of b:changedtick? local tick = eval('b:changedtick') @@ -45,7 +45,7 @@ local function open(activate, lines) -- arrive as expected if activate then local firstline = 0 - ok(meths.nvim_buf_attach(b, true, {})) + ok(api.nvim_buf_attach(b, true, {})) expectn('nvim_buf_lines_event', { b, tick, firstline, -1, lines, false }) end @@ -62,12 +62,12 @@ local function editoriginal(activate, lines) end local function reopen(buf, expectedlines) - ok(meths.nvim_buf_detach(buf)) + ok(api.nvim_buf_detach(buf)) expectn('nvim_buf_detach_event', { buf }) -- for some reason the :edit! increments tick by 2 command('edit!') local tick = eval('b:changedtick') - ok(meths.nvim_buf_attach(buf, true, {})) + ok(api.nvim_buf_attach(buf, true, {})) local firstline = 0 expectn('nvim_buf_lines_event', { buf, tick, firstline, -1, expectedlines, false }) command('normal! gg') @@ -197,21 +197,21 @@ describe('API: buffer events:', function() -- add a line at the start of an empty file command('enew') tick = eval('b:changedtick') - local b2 = meths.nvim_get_current_buf() - ok(meths.nvim_buf_attach(b2, true, {})) + local b2 = api.nvim_get_current_buf() + ok(api.nvim_buf_attach(b2, true, {})) 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 }) -- turn off buffer events manually - meths.nvim_buf_detach(b2) + api.nvim_buf_detach(b2) expectn('nvim_buf_detach_event', { b2 }) -- add multiple lines to a blank file command('enew!') - local b3 = meths.nvim_get_current_buf() - ok(meths.nvim_buf_attach(b3, true, {})) + local b3 = api.nvim_get_current_buf() + ok(api.nvim_buf_attach(b3, true, {})) tick = eval('b:changedtick') expectn('nvim_buf_lines_event', { b3, tick, 0, -1, { '' }, false }) eval('append(0, ["new line 1", "new line 2", "new line 3"])') @@ -222,7 +222,7 @@ describe('API: buffer events:', function() ) -- use the API itself to add a line to the start of the buffer - meths.nvim_buf_set_lines(b3, 0, 0, true, { 'New First Line' }) + api.nvim_buf_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 }) end) @@ -306,8 +306,8 @@ describe('API: buffer events:', function() command('bdelete!') tick = 2 expectn('nvim_buf_detach_event', { b }) - local bnew = meths.nvim_get_current_buf() - ok(meths.nvim_buf_attach(bnew, true, {})) + local bnew = api.nvim_get_current_buf() + ok(api.nvim_buf_attach(bnew, true, {})) expectn('nvim_buf_lines_event', { bnew, tick, 0, -1, { '' }, false }) sendkeys('i') sendkeys('h') @@ -472,25 +472,25 @@ describe('API: buffer events:', function() end) it('does not get confused if enabled/disabled many times', function() - local channel = meths.nvim_get_api_info()[1] + local channel = api.nvim_get_api_info()[1] local b, tick = editoriginal(false) -- Enable buffer events many times. - ok(meths.nvim_buf_attach(b, true, {})) - ok(meths.nvim_buf_attach(b, true, {})) - ok(meths.nvim_buf_attach(b, true, {})) - ok(meths.nvim_buf_attach(b, true, {})) - ok(meths.nvim_buf_attach(b, true, {})) + ok(api.nvim_buf_attach(b, true, {})) + ok(api.nvim_buf_attach(b, true, {})) + ok(api.nvim_buf_attach(b, true, {})) + ok(api.nvim_buf_attach(b, true, {})) + ok(api.nvim_buf_attach(b, true, {})) expectn('nvim_buf_lines_event', { b, tick, 0, -1, origlines, false }) eval('rpcnotify(' .. channel .. ', "Hello There")') expectn('Hello There', {}) -- Disable buffer events many times. - ok(meths.nvim_buf_detach(b)) - ok(meths.nvim_buf_detach(b)) - ok(meths.nvim_buf_detach(b)) - ok(meths.nvim_buf_detach(b)) - ok(meths.nvim_buf_detach(b)) + ok(api.nvim_buf_detach(b)) + ok(api.nvim_buf_detach(b)) + ok(api.nvim_buf_detach(b)) + ok(api.nvim_buf_detach(b)) + ok(api.nvim_buf_detach(b)) expectn('nvim_buf_detach_event', { b }) eval('rpcnotify(' .. channel .. ', "Hello Again")') expectn('Hello Again', {}) @@ -573,7 +573,7 @@ describe('API: buffer events:', function() it('works with :diffput and :diffget', function() local b1, tick1 = editoriginal(true, { 'AAA', 'BBB' }) - local channel = meths.nvim_get_api_info()[1] + local channel = api.nvim_get_api_info()[1] command('diffthis') command('rightbelow vsplit') local b2, tick2 = open(true, { 'BBB', 'CCC' }) @@ -690,7 +690,7 @@ describe('API: buffer events:', function() it('detaches if the buffer is closed', function() local b, tick = editoriginal(true, { 'AAA' }) - local channel = meths.nvim_get_api_info()[1] + local channel = api.nvim_get_api_info()[1] -- Test that buffer events are working. command('normal! x') @@ -729,7 +729,7 @@ describe('API: buffer events:', function() it(':enew! does not detach hidden buffer', function() local b, tick = editoriginal(true, { 'AAA', 'BBB' }) - local channel = meths.nvim_get_api_info()[1] + local channel = api.nvim_get_api_info()[1] command('set undoreload=1 hidden') command('normal! x') @@ -743,7 +743,7 @@ describe('API: buffer events:', function() it('stays attached if the buffer is hidden', function() local b, tick = editoriginal(true, { 'AAA' }) - local channel = meths.nvim_get_api_info()[1] + local channel = api.nvim_get_api_info()[1] -- Test that buffer events are working. command('normal! x') @@ -790,14 +790,14 @@ describe('API: buffer events:', function() it('does not send the buffer content if not requested', function() clear() local b, tick = editoriginal(false) - ok(meths.nvim_buf_attach(b, false, {})) + ok(api.nvim_buf_attach(b, false, {})) 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(meths.nvim_buf_attach, b, false, { builtin = 'asfd' })) + eq("Invalid key: 'builtin'", pcall_err(api.nvim_buf_attach, b, false, { builtin = 'asfd' })) end) it('nvim_buf_attach returns response after delay #8634', function() @@ -869,12 +869,12 @@ describe('API: buffer events:', function() it('when :terminal lines change', function() local buffer_lines = {} local expected_lines = {} - funcs.termopen({ nvim_prog, '-u', 'NONE', '-i', 'NONE', '-n', '-c', 'set shortmess+=A' }, { + fn.termopen({ nvim_prog, '-u', 'NONE', '-i', 'NONE', '-n', '-c', 'set shortmess+=A' }, { env = { VIMRUNTIME = os.getenv('VIMRUNTIME') }, }) - local b = meths.nvim_get_current_buf() - ok(meths.nvim_buf_attach(b, true, {})) + local b = api.nvim_get_current_buf() + ok(api.nvim_buf_attach(b, true, {})) for _ = 1, 22 do table.insert(expected_lines, '~') diff --git a/test/functional/api/command_spec.lua b/test/functional/api/command_spec.lua index dc6a68da03..f73b9c8b13 100644 --- a/test/functional/api/command_spec.lua +++ b/test/functional/api/command_spec.lua @@ -4,14 +4,14 @@ local NIL = vim.NIL local clear = helpers.clear local command = helpers.command local eq = helpers.eq -local meths = helpers.meths +local api = helpers.api local matches = helpers.matches local source = helpers.source local pcall_err = helpers.pcall_err local exec_lua = helpers.exec_lua local assert_alive = helpers.assert_alive local feed = helpers.feed -local funcs = helpers.funcs +local fn = helpers.fn describe('nvim_get_commands', function() local cmd_dict = { @@ -49,39 +49,39 @@ describe('nvim_get_commands', function() before_each(clear) it('gets empty list if no commands were defined', function() - eq({}, meths.nvim_get_commands({ builtin = false })) + eq({}, api.nvim_get_commands({ builtin = false })) end) it('validation', function() - eq('builtin=true not implemented', pcall_err(meths.nvim_get_commands, { builtin = true })) - eq("Invalid key: 'foo'", pcall_err(meths.nvim_get_commands, { foo = 'blah' })) + eq('builtin=true not implemented', pcall_err(api.nvim_get_commands, { builtin = true })) + eq("Invalid key: 'foo'", pcall_err(api.nvim_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.nvim_get_commands({ builtin = false })) + eq({ Hello = cmd_dict }, api.nvim_get_commands({ builtin = false })) -- Define another command. command('command -nargs=? Pwd pwd') - eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, meths.nvim_get_commands({ builtin = false })) + eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, api.nvim_get_commands({ builtin = false })) -- Delete a command. command('delcommand Pwd') - eq({ Hello = cmd_dict }, meths.nvim_get_commands({ builtin = false })) + eq({ Hello = cmd_dict }, api.nvim_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 }, meths.nvim_buf_get_commands(0, { builtin = false })) + eq({ Hello = cmd_dict }, api.nvim_buf_get_commands(0, { builtin = false })) -- Define another buffer-local command. command('command -buffer -nargs=? Pwd pwd') - eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, meths.nvim_buf_get_commands(0, { builtin = false })) + eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, api.nvim_buf_get_commands(0, { builtin = false })) -- Delete a command. command('delcommand Pwd') - eq({ Hello = cmd_dict }, meths.nvim_buf_get_commands(0, { builtin = false })) + eq({ Hello = cmd_dict }, api.nvim_buf_get_commands(0, { builtin = false })) -- {builtin=true} always returns empty for buffer-local case. - eq({}, meths.nvim_buf_get_commands(0, { builtin = true })) + eq({}, api.nvim_buf_get_commands(0, { builtin = true })) end) it('gets various command attributes', function() @@ -169,9 +169,9 @@ describe('nvim_get_commands', function() let s:foo = 1 command -complete=custom,ListUsers -nargs=+ Finger !finger ]]) - eq({ Finger = cmd1 }, meths.nvim_get_commands({ builtin = false })) + eq({ Finger = cmd1 }, api.nvim_get_commands({ builtin = false })) command('command -nargs=1 -complete=dir -addr=arguments -count=10 TestCmd pwd ') - eq({ Finger = cmd1, TestCmd = cmd0 }, meths.nvim_get_commands({ builtin = false })) + eq({ Finger = cmd1, TestCmd = cmd0 }, api.nvim_get_commands({ builtin = false })) source([[ function! s:foo() abort @@ -191,7 +191,7 @@ describe('nvim_get_commands', function() -- TODO(justinmk): Order is stable but undefined. Sort before return? eq( { Cmd2 = cmd2, Cmd3 = cmd3, Cmd4 = cmd4, Finger = cmd1, TestCmd = cmd0 }, - meths.nvim_get_commands({ builtin = false }) + api.nvim_get_commands({ builtin = false }) ) end) end) @@ -200,9 +200,9 @@ describe('nvim_create_user_command', function() before_each(clear) it('works with strings', function() - meths.nvim_create_user_command('SomeCommand', 'let g:command_fired = ', { nargs = 1 }) + api.nvim_create_user_command('SomeCommand', 'let g:command_fired = ', { nargs = 1 }) command('SomeCommand 42') - eq(42, meths.nvim_eval('g:command_fired')) + eq(42, api.nvim_eval('g:command_fired')) end) it('works with Lua functions', function() @@ -644,10 +644,10 @@ describe('nvim_create_user_command', function() end) it('can define buffer-local commands', function() - local bufnr = meths.nvim_create_buf(false, false) - meths.nvim_buf_create_user_command(bufnr, 'Hello', '', {}) + local bufnr = api.nvim_create_buf(false, false) + api.nvim_buf_create_user_command(bufnr, 'Hello', '', {}) matches('Not an editor command: Hello', pcall_err(command, 'Hello')) - meths.nvim_set_current_buf(bufnr) + api.nvim_set_current_buf(bufnr) command('Hello') assert_alive() end) @@ -670,9 +670,9 @@ describe('nvim_create_user_command', function() ]] feed(':Test a') - eq('Test aaa', funcs.getcmdline()) + eq('Test aaa', fn.getcmdline()) feed('Test b') - eq('Test bbb', funcs.getcmdline()) + eq('Test bbb', fn.getcmdline()) end) it('does not allow invalid command names', function() @@ -729,29 +729,29 @@ describe('nvim_create_user_command', function() vim.api.nvim_cmd({ cmd = 'echo', args = { '&verbose' }, mods = opts.smods }, {}) end, {}) ]] - eq('3', meths.nvim_cmd({ cmd = 'MyEcho', mods = { verbose = 3 } }, { output = true })) + eq('3', api.nvim_cmd({ cmd = 'MyEcho', mods = { verbose = 3 } }, { output = true })) - eq(1, #meths.nvim_list_tabpages()) + eq(1, #api.nvim_list_tabpages()) exec_lua [[ vim.api.nvim_create_user_command('MySplit', function(opts) vim.api.nvim_cmd({ cmd = 'split', mods = opts.smods }, {}) end, {}) ]] - meths.nvim_cmd({ cmd = 'MySplit' }, {}) - eq(1, #meths.nvim_list_tabpages()) - eq(2, #meths.nvim_list_wins()) - meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) - eq(2, #meths.nvim_list_tabpages()) - eq(2, funcs.tabpagenr()) - meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) - eq(3, #meths.nvim_list_tabpages()) - eq(2, funcs.tabpagenr()) - meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 3 } }, {}) - eq(4, #meths.nvim_list_tabpages()) - eq(4, funcs.tabpagenr()) - meths.nvim_cmd({ cmd = 'MySplit', mods = { tab = 0 } }, {}) - eq(5, #meths.nvim_list_tabpages()) - eq(1, funcs.tabpagenr()) + api.nvim_cmd({ cmd = 'MySplit' }, {}) + eq(1, #api.nvim_list_tabpages()) + eq(2, #api.nvim_list_wins()) + api.nvim_cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) + eq(2, #api.nvim_list_tabpages()) + eq(2, fn.tabpagenr()) + api.nvim_cmd({ cmd = 'MySplit', mods = { tab = 1 } }, {}) + eq(3, #api.nvim_list_tabpages()) + eq(2, fn.tabpagenr()) + api.nvim_cmd({ cmd = 'MySplit', mods = { tab = 3 } }, {}) + eq(4, #api.nvim_list_tabpages()) + eq(4, fn.tabpagenr()) + api.nvim_cmd({ cmd = 'MySplit', mods = { tab = 0 } }, {}) + eq(5, #api.nvim_list_tabpages()) + eq(1, fn.tabpagenr()) end) end) @@ -759,16 +759,16 @@ describe('nvim_del_user_command', function() before_each(clear) it('can delete global commands', function() - meths.nvim_create_user_command('Hello', 'echo "Hi"', {}) + api.nvim_create_user_command('Hello', 'echo "Hi"', {}) command('Hello') - meths.nvim_del_user_command('Hello') + api.nvim_del_user_command('Hello') matches('Not an editor command: Hello', pcall_err(command, 'Hello')) end) it('can delete buffer-local commands', function() - meths.nvim_buf_create_user_command(0, 'Hello', 'echo "Hi"', {}) + api.nvim_buf_create_user_command(0, 'Hello', 'echo "Hi"', {}) command('Hello') - meths.nvim_buf_del_user_command(0, 'Hello') + api.nvim_buf_del_user_command(0, 'Hello') matches('Not an editor command: Hello', pcall_err(command, 'Hello')) end) end) diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 668ce43588..ed7c52971d 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -10,7 +10,7 @@ local feed = helpers.feed local clear = helpers.clear local command = helpers.command local exec = helpers.exec -local meths = helpers.meths +local api = helpers.api local assert_alive = helpers.assert_alive local function expect(contents) @@ -24,21 +24,21 @@ local function set_extmark(ns_id, id, line, col, opts) if id ~= nil and id ~= 0 then opts.id = id end - return meths.nvim_buf_set_extmark(0, ns_id, line, col, opts) + return api.nvim_buf_set_extmark(0, ns_id, line, col, opts) end local function get_extmarks(ns_id, start, end_, opts) if opts == nil then opts = {} end - return meths.nvim_buf_get_extmarks(0, ns_id, start, end_, opts) + return api.nvim_buf_get_extmarks(0, ns_id, start, end_, opts) end local function get_extmark_by_id(ns_id, id, opts) if opts == nil then opts = {} end - return meths.nvim_buf_get_extmark_by_id(0, ns_id, id, opts) + return api.nvim_buf_get_extmark_by_id(0, ns_id, id, opts) end local function check_undo_redo(ns, mark, sr, sc, er, ec) --s = start, e = end @@ -196,11 +196,11 @@ describe('API/extmarks', function() eq({ row, col }, rv) -- remove the test marks - eq(true, meths.nvim_buf_del_extmark(0, ns, marks[1])) - eq(false, meths.nvim_buf_del_extmark(0, ns, marks[1])) - eq(true, meths.nvim_buf_del_extmark(0, ns, marks[2])) - eq(false, meths.nvim_buf_del_extmark(0, ns, marks[3])) - eq(false, meths.nvim_buf_del_extmark(0, ns, 1000)) + eq(true, api.nvim_buf_del_extmark(0, ns, marks[1])) + eq(false, api.nvim_buf_del_extmark(0, ns, marks[1])) + eq(true, api.nvim_buf_del_extmark(0, ns, marks[2])) + eq(false, api.nvim_buf_del_extmark(0, ns, marks[3])) + eq(false, api.nvim_buf_del_extmark(0, ns, 1000)) end) it('can clear a specific namespace range', function() @@ -208,7 +208,7 @@ describe('API/extmarks', function() set_extmark(ns2, 1, 0, 1) -- force a new undo buffer feed('o') - meths.nvim_buf_clear_namespace(0, ns2, 0, -1) + api.nvim_buf_clear_namespace(0, ns2, 0, -1) eq({ { 1, 0, 1 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('u') @@ -224,7 +224,7 @@ describe('API/extmarks', function() set_extmark(ns2, 1, 0, 1) -- force a new undo buffer feed('o') - meths.nvim_buf_clear_namespace(0, -1, 0, -1) + api.nvim_buf_clear_namespace(0, -1, 0, -1) eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 })) eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 })) feed('u') @@ -242,14 +242,14 @@ describe('API/extmarks', function() 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 })) - meths.nvim_buf_clear_namespace(0, ns, 0, -1) + api.nvim_buf_clear_namespace(0, ns, 0, -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 })) feed('u') eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 })) - meths.nvim_buf_clear_namespace(0, ns, 0, -1) + api.nvim_buf_clear_namespace(0, ns, 0, -1) end) it('querying for information and ranges', function() @@ -931,7 +931,7 @@ describe('API/extmarks', function() -- Test unset feed('o') - meths.nvim_buf_del_extmark(0, ns, marks[3]) + api.nvim_buf_del_extmark(0, ns, marks[3]) feed('u') rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) -- undo does NOT restore deleted marks @@ -987,10 +987,10 @@ describe('API/extmarks', function() rv = get_extmarks(ns2, positions[2], positions[1]) eq(2, #rv) - meths.nvim_buf_del_extmark(0, ns, marks[1]) + api.nvim_buf_del_extmark(0, ns, marks[1]) rv = get_extmarks(ns, { 0, 0 }, { -1, -1 }) eq(2, #rv) - meths.nvim_buf_del_extmark(0, ns2, marks[1]) + api.nvim_buf_del_extmark(0, ns2, marks[1]) rv = get_extmarks(ns2, { 0, 0 }, { -1, -1 }) eq(2, #rv) end) @@ -1427,7 +1427,7 @@ describe('API/extmarks', function() "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(meths.nvim_buf_del_extmark, 0, ns_invalid, marks[1])) + eq("Invalid 'ns_id': 3", pcall_err(api.nvim_buf_del_extmark, 0, 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])) end) @@ -1470,7 +1470,7 @@ describe('API/extmarks', function() it('in read-only buffer', function() command('view! runtime/doc/help.txt') - eq(true, meths.nvim_get_option_value('ro', {})) + eq(true, api.nvim_get_option_value('ro', {})) local id = set_extmark(ns, 0, 0, 2) eq({ { id, 0, 2 } }, get_extmarks(ns, 0, -1)) end) @@ -1478,8 +1478,8 @@ describe('API/extmarks', function() 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, { '', '' }) - local id = meths.nvim_buf_set_extmark(buf, ns, 1, 0, {}) - eq({ { id, 1, 0 } }, meths.nvim_buf_get_extmarks(buf, ns, 0, -1, {})) + local id = api.nvim_buf_set_extmark(buf, ns, 1, 0, {}) + eq({ { id, 1, 0 } }, api.nvim_buf_get_extmarks(buf, ns, 0, -1, {})) end) it('does not crash with append/delete/undo sequence', function() @@ -1495,30 +1495,30 @@ 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. - meths.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = false }) - meths.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = true }) + api.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = false }) + api.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = true }) feed([[Aasdfasdf]]) - eq({ { 1, 0, 5 }, { 2, 0, 13 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) + eq({ { 1, 0, 5 }, { 2, 0, 13 } }, api.nvim_buf_get_extmarks(0, ns, 0, -1, {})) -- but both move when text is inserted before feed([[Iasdf]]) - -- eq({}, meths.nvim_buf_get_lines(0, 0, -1, true)) - eq({ { 1, 0, 9 }, { 2, 0, 17 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) + -- eq({}, api.nvim_buf_get_lines(0, 0, -1, true)) + eq({ { 1, 0, 9 }, { 2, 0, 17 } }, api.nvim_buf_get_extmarks(0, ns, 0, -1, {})) -- clear text - meths.nvim_buf_set_text(0, 0, 0, 0, 17, {}) + api.nvim_buf_set_text(0, 0, 0, 0, 17, {}) -- handles set_text correctly as well - eq({ { 1, 0, 0 }, { 2, 0, 0 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) - meths.nvim_buf_set_text(0, 0, 0, 0, 0, { 'asdfasdf' }) - eq({ { 1, 0, 0 }, { 2, 0, 8 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) + eq({ { 1, 0, 0 }, { 2, 0, 0 } }, api.nvim_buf_get_extmarks(0, ns, 0, -1, {})) + api.nvim_buf_set_text(0, 0, 0, 0, 0, { 'asdfasdf' }) + eq({ { 1, 0, 0 }, { 2, 0, 8 } }, api.nvim_buf_get_extmarks(0, ns, 0, -1, {})) feed('u') -- handles pasting exec([[let @a='asdfasdf']]) feed([["ap]]) - eq({ { 1, 0, 0 }, { 2, 0, 8 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {})) + eq({ { 1, 0, 0 }, { 2, 0, 8 } }, api.nvim_buf_get_extmarks(0, ns, 0, -1, {})) end) it('can accept "end_row" or "end_line" #16548', function() @@ -1545,7 +1545,7 @@ describe('API/extmarks', function() it('in prompt buffer', function() feed('dd') local id = set_extmark(ns, marks[1], 0, 0, {}) - meths.nvim_set_option_value('buftype', 'prompt', {}) + api.nvim_set_option_value('buftype', 'prompt', {}) feed('i') eq({ { id, 0, 2 } }, get_extmarks(ns, 0, -1)) end) @@ -1639,7 +1639,7 @@ describe('API/extmarks', function() right_gravity = true, }, }, get_extmark_by_id(ns, marks[3], { details = true })) - meths.nvim_buf_clear_namespace(0, ns, 0, -1) + api.nvim_buf_clear_namespace(0, 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') @@ -1693,7 +1693,7 @@ describe('API/extmarks', function() screen = Screen.new(40, 6) screen:attach() feed('dd6iaaa bbb cccgg') - meths.nvim_set_option_value('signcolumn', 'auto:2', {}) + api.nvim_set_option_value('signcolumn', 'auto:2', {}) set_extmark(ns, 1, 0, 0, { invalidate = true, sign_text = 'S1', end_row = 1 }) set_extmark(ns, 2, 1, 0, { invalidate = true, sign_text = 'S2', end_row = 2 }) -- mark with invalidate is removed @@ -1768,7 +1768,7 @@ describe('Extmarks buffer api with many marks', function() for i = 1, 30 do lines[#lines + 1] = string.rep('x ', i) end - meths.nvim_buf_set_lines(0, 0, -1, true, lines) + api.nvim_buf_set_lines(0, 0, -1, true, lines) local ns = ns1 local q = 0 for i = 0, 29 do @@ -1802,16 +1802,16 @@ describe('Extmarks buffer api with many marks', function() end) it('can clear all marks in ns', function() - meths.nvim_buf_clear_namespace(0, ns1, 0, -1) + api.nvim_buf_clear_namespace(0, ns1, 0, -1) eq({}, get_marks(ns1)) eq(ns_marks[ns2], get_marks(ns2)) - meths.nvim_buf_clear_namespace(0, ns2, 0, -1) + api.nvim_buf_clear_namespace(0, ns2, 0, -1) eq({}, get_marks(ns1)) eq({}, get_marks(ns2)) end) it('can clear line range', function() - meths.nvim_buf_clear_namespace(0, ns1, 10, 20) + api.nvim_buf_clear_namespace(0, ns1, 10, 20) for id, mark in pairs(ns_marks[ns1]) do if 10 <= mark[1] and mark[1] < 20 then ns_marks[ns1][id] = nil diff --git a/test/functional/api/highlight_spec.lua b/test/functional/api/highlight_spec.lua index b86fe550a1..1973d3e1c7 100644 --- a/test/functional/api/highlight_spec.lua +++ b/test/functional/api/highlight_spec.lua @@ -4,8 +4,8 @@ local Screen = require('test.functional.ui.screen') local eq, eval = helpers.eq, helpers.eval local command = helpers.command local exec_capture = helpers.exec_capture -local meths = helpers.meths -local funcs = helpers.funcs +local api = helpers.api +local fn = helpers.fn local pcall_err = helpers.pcall_err local ok = helpers.ok local assert_alive = helpers.assert_alive @@ -52,128 +52,125 @@ describe('API: highlight', function() it('nvim_get_hl_by_id', function() local hl_id = eval("hlID('NewHighlight')") - eq(expected_cterm, meths.nvim_get_hl_by_id(hl_id, false)) + eq(expected_cterm, api.nvim_get_hl_by_id(hl_id, false)) hl_id = eval("hlID('NewHighlight')") -- Test valid id. - eq(expected_rgb, meths.nvim_get_hl_by_id(hl_id, true)) + eq(expected_rgb, api.nvim_get_hl_by_id(hl_id, true)) -- Test invalid id. - eq('Invalid highlight id: 30000', pcall_err(meths.nvim_get_hl_by_id, 30000, false)) + eq('Invalid highlight id: 30000', pcall_err(api.nvim_get_hl_by_id, 30000, false)) -- Test all highlight properties. command('hi NewHighlight gui=underline,bold,italic,reverse,strikethrough,altfont,nocombine') - eq(expected_rgb2, meths.nvim_get_hl_by_id(hl_id, true)) + eq(expected_rgb2, api.nvim_get_hl_by_id(hl_id, true)) -- Test undercurl command('hi NewHighlight gui=undercurl') - eq(expected_undercurl, meths.nvim_get_hl_by_id(hl_id, true)) + eq(expected_undercurl, api.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.nvim_get_hl_by_id, { nil }, false) + pcall_err(api.nvim_get_hl_by_id, { nil }, false) ) -- Test 0 argument. - eq('Invalid highlight id: 0', pcall_err(meths.nvim_get_hl_by_id, 0, false)) + eq('Invalid highlight id: 0', pcall_err(api.nvim_get_hl_by_id, 0, false)) -- Test -1 argument. - eq('Invalid highlight id: -1', pcall_err(meths.nvim_get_hl_by_id, -1, false)) + eq('Invalid highlight id: -1', pcall_err(api.nvim_get_hl_by_id, -1, false)) -- Test highlight group without ctermbg value. 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.nvim_get_hl_by_id(hl_id, false)) + eq({ foreground = 10 }, api.nvim_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.nvim_get_hl_by_id(hl_id, false)) + eq({ background = 13 }, api.nvim_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.nvim_get_hl_by_id(hl_id, false)) + eq({ foreground = 10, background = 13 }, api.nvim_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 } -- Test `Normal` default values. - eq({}, meths.nvim_get_hl_by_name('Normal', true)) + eq({}, api.nvim_get_hl_by_name('Normal', true)) - eq(expected_cterm, meths.nvim_get_hl_by_name('NewHighlight', false)) - eq(expected_rgb, meths.nvim_get_hl_by_name('NewHighlight', true)) + eq(expected_cterm, api.nvim_get_hl_by_name('NewHighlight', false)) + eq(expected_rgb, api.nvim_get_hl_by_name('NewHighlight', true)) -- Test `Normal` modified values. command('hi Normal guifg=red guibg=yellow') - eq(expected_normal, meths.nvim_get_hl_by_name('Normal', true)) + eq(expected_normal, api.nvim_get_hl_by_name('Normal', true)) -- Test invalid name. eq( "Invalid highlight name: 'unknown_highlight'", - pcall_err(meths.nvim_get_hl_by_name, 'unknown_highlight', false) + pcall_err(api.nvim_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.nvim_get_hl_by_name, { nil }, false) + pcall_err(api.nvim_get_hl_by_name, { nil }, false) ) -- Test empty string argument. - eq('Invalid highlight name', pcall_err(meths.nvim_get_hl_by_name, '', false)) + eq('Invalid highlight name', pcall_err(api.nvim_get_hl_by_name, '', false)) -- Test "standout" attribute. #8054 - eq({ underline = true }, meths.nvim_get_hl_by_name('cursorline', 0)) + eq({ underline = true }, api.nvim_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.nvim_get_hl_by_name('cursorline', 0)) + eq({ underline = true, standout = true }, api.nvim_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.nvim_set_hl(0, 'Normal', { ctermfg = 17, ctermbg = 213 }) - meths.nvim_set_hl(0, 'NotNormal', { ctermfg = 17, ctermbg = 213, nocombine = true }) + api.nvim_set_hl(0, 'Normal', { ctermfg = 17, ctermbg = 213 }) + api.nvim_set_hl(0, 'NotNormal', { ctermfg = 17, ctermbg = 213, nocombine = true }) -- Note colors are "cterm" values, not rgb-as-ints - eq({ foreground = 17, background = 213 }, meths.nvim_get_hl_by_name('Normal', false)) + eq({ foreground = 17, background = 213 }, api.nvim_get_hl_by_name('Normal', false)) eq( { foreground = 17, background = 213, nocombine = true }, - meths.nvim_get_hl_by_name('NotNormal', false) + api.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.nvim_get_hl_by_name, 'Shrubbery', true) - ) - eq(0, funcs.hlID('Shrubbery')) + eq("Invalid highlight name: 'Shrubbery'", pcall_err(api.nvim_get_hl_by_name, 'Shrubbery', true)) + eq(0, fn.hlID('Shrubbery')) - local hl_id = meths.nvim_get_hl_id_by_name('Shrubbery') + local hl_id = api.nvim_get_hl_id_by_name('Shrubbery') ok(hl_id > 0) - eq(hl_id, funcs.hlID('Shrubbery')) + eq(hl_id, fn.hlID('Shrubbery')) command('hi Shrubbery guifg=#888888 guibg=#888888') eq( { foreground = tonumber('0x888888'), background = tonumber('0x888888') }, - meths.nvim_get_hl_by_id(hl_id, true) + api.nvim_get_hl_by_id(hl_id, true) ) eq( { foreground = tonumber('0x888888'), background = tonumber('0x888888') }, - meths.nvim_get_hl_by_name('Shrubbery', true) + api.nvim_get_hl_by_name('Shrubbery', true) ) end) it("nvim_buf_add_highlight to other buffer doesn't crash if undo is disabled #12873", function() command('vsplit file') - local err, _ = pcall(meths.nvim_set_option_value, 'undofile', false, { buf = 1 }) + local err, _ = pcall(api.nvim_set_option_value, 'undofile', false, { buf = 1 }) eq(true, err) - err, _ = pcall(meths.nvim_set_option_value, 'undolevels', -1, { buf = 1 }) + err, _ = pcall(api.nvim_set_option_value, 'undolevels', -1, { buf = 1 }) eq(true, err) - err, _ = pcall(meths.nvim_buf_add_highlight, 1, -1, 'Question', 0, 0, -1) + err, _ = pcall(api.nvim_buf_add_highlight, 1, -1, 'Question', 0, 0, -1) eq(true, err) assert_alive() end) @@ -244,8 +241,8 @@ describe('API: set highlight', function() } local function get_ns() - local ns = meths.nvim_create_namespace('Test_set_hl') - meths.nvim_set_hl_ns(ns) + local ns = api.nvim_create_namespace('Test_set_hl') + api.nvim_set_hl_ns(ns) return ns end @@ -254,51 +251,51 @@ describe('API: set highlight', function() it('validation', function() eq( "Invalid 'blend': out of range", - pcall_err(meths.nvim_set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = 999 }) + pcall_err(api.nvim_set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = 999 }) ) eq( "Invalid 'blend': expected Integer, got Array", - pcall_err(meths.nvim_set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = {} }) + pcall_err(api.nvim_set_hl, 0, 'Test_hl3', { fg = '#FF00FF', blend = {} }) ) end) it('can set gui highlight', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight1) - eq(highlight1, meths.nvim_get_hl_by_name('Test_hl', true)) + api.nvim_set_hl(ns, 'Test_hl', highlight1) + eq(highlight1, api.nvim_get_hl_by_name('Test_hl', true)) end) it('can set cterm highlight', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight2_config) - eq(highlight2_result, meths.nvim_get_hl_by_name('Test_hl', false)) + api.nvim_set_hl(ns, 'Test_hl', highlight2_config) + eq(highlight2_result, api.nvim_get_hl_by_name('Test_hl', false)) end) it('can set empty cterm attr', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', { cterm = {} }) - eq({}, meths.nvim_get_hl_by_name('Test_hl', false)) + api.nvim_set_hl(ns, 'Test_hl', { cterm = {} }) + eq({}, api.nvim_get_hl_by_name('Test_hl', false)) end) it('cterm attr defaults to gui attr', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight1) + api.nvim_set_hl(ns, 'Test_hl', highlight1) eq({ bold = true, italic = true, - }, meths.nvim_get_hl_by_name('Test_hl', false)) + }, api.nvim_get_hl_by_name('Test_hl', false)) end) it('can overwrite attr for cterm', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight3_config) - eq(highlight3_result_gui, meths.nvim_get_hl_by_name('Test_hl', true)) - eq(highlight3_result_cterm, meths.nvim_get_hl_by_name('Test_hl', false)) + api.nvim_set_hl(ns, 'Test_hl', highlight3_config) + eq(highlight3_result_gui, api.nvim_get_hl_by_name('Test_hl', true)) + eq(highlight3_result_cterm, api.nvim_get_hl_by_name('Test_hl', false)) end) it('only allows one underline attribute #22371', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', { + api.nvim_set_hl(ns, 'Test_hl', { underdouble = true, underdotted = true, cterm = { @@ -306,21 +303,21 @@ describe('API: set highlight', function() undercurl = true, }, }) - eq({ undercurl = true }, meths.nvim_get_hl_by_name('Test_hl', false)) - eq({ underdotted = true }, meths.nvim_get_hl_by_name('Test_hl', true)) + eq({ undercurl = true }, api.nvim_get_hl_by_name('Test_hl', false)) + eq({ underdotted = true }, api.nvim_get_hl_by_name('Test_hl', true)) end) it('can set a highlight in the global namespace', function() - meths.nvim_set_hl(0, 'Test_hl', highlight2_config) + api.nvim_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') ) - meths.nvim_set_hl(0, 'Test_hl', { background = highlight_color.bg }) + api.nvim_set_hl(0, 'Test_hl', { background = highlight_color.bg }) eq('Test_hl xxx guibg=#0032aa', exec_capture('highlight Test_hl')) - meths.nvim_set_hl(0, 'Test_hl2', highlight3_config) + api.nvim_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') @@ -328,63 +325,63 @@ describe('API: set highlight', function() -- Colors are stored with the name they are defined, but -- with canonical casing - meths.nvim_set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue' }) + api.nvim_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.nvim_set_hl(0, 'Test_hl3', { bg = 'red', fg = 'blue' }) + api.nvim_set_hl(0, 'Test_hl3', { bg = 'red', fg = 'blue' }) eq('Test_hl3 xxx guifg=Blue guibg=Red', exec_capture('highlight Test_hl3')) - meths.nvim_set_hl(0, 'Test_hl3', { bg = 'red' }) + api.nvim_set_hl(0, 'Test_hl3', { bg = 'red' }) eq('Test_hl3 xxx guibg=Red', exec_capture('highlight Test_hl3')) - meths.nvim_set_hl(0, 'Test_hl3', { ctermbg = 9, ctermfg = 12 }) + api.nvim_set_hl(0, 'Test_hl3', { ctermbg = 9, ctermfg = 12 }) eq('Test_hl3 xxx ctermfg=12 ctermbg=9', exec_capture('highlight Test_hl3')) - meths.nvim_set_hl(0, 'Test_hl3', { ctermbg = 'red', ctermfg = 'blue' }) + api.nvim_set_hl(0, 'Test_hl3', { ctermbg = 'red', ctermfg = 'blue' }) eq('Test_hl3 xxx ctermfg=12 ctermbg=9', exec_capture('highlight Test_hl3')) - meths.nvim_set_hl(0, 'Test_hl3', { ctermbg = 9 }) + api.nvim_set_hl(0, 'Test_hl3', { ctermbg = 9 }) eq('Test_hl3 xxx ctermbg=9', exec_capture('highlight Test_hl3')) eq( "Invalid highlight color: 'redd'", - pcall_err(meths.nvim_set_hl, 0, 'Test_hl3', { fg = 'redd' }) + pcall_err(api.nvim_set_hl, 0, 'Test_hl3', { fg = 'redd' }) ) eq( "Invalid highlight color: 'bleu'", - pcall_err(meths.nvim_set_hl, 0, 'Test_hl3', { ctermfg = 'bleu' }) + pcall_err(api.nvim_set_hl, 0, 'Test_hl3', { ctermfg = 'bleu' }) ) - meths.nvim_set_hl(0, 'Test_hl3', { fg = '#FF00FF' }) + api.nvim_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.nvim_set_hl, 0, 'Test_hl3', { ctermfg = '#FF00FF' }) + pcall_err(api.nvim_set_hl, 0, 'Test_hl3', { ctermfg = '#FF00FF' }) ) for _, fg_val in ipairs { nil, 'NONE', 'nOnE', '', -1 } do - meths.nvim_set_hl(0, 'Test_hl3', { fg = fg_val }) + api.nvim_set_hl(0, 'Test_hl3', { fg = fg_val }) eq('Test_hl3 xxx cleared', exec_capture('highlight Test_hl3')) end - meths.nvim_set_hl(0, 'Test_hl3', { fg = '#FF00FF', blend = 50 }) + api.nvim_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.nvim_set_hl(0, 'Normal', { fg = '#000083', bg = '#0000F3' }) - eq({ foreground = 131, background = 243 }, meths.nvim_get_hl_by_name('Normal', true)) + api.nvim_set_hl(0, 'Normal', { fg = '#000083', bg = '#0000F3' }) + eq({ foreground = 131, background = 243 }, api.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.nvim_set_hl, 0, 'foo bar', { bold = true }) + pcall_err(api.nvim_set_hl, 0, 'foo bar', { bold = true }) ) assert_alive() end) @@ -452,14 +449,14 @@ describe('API: get highlight', function() local function get_ns() -- Test namespace filtering behavior - local ns2 = meths.nvim_create_namespace('Another_namespace') - meths.nvim_set_hl(ns2, 'Test_hl', { ctermfg = 23 }) - meths.nvim_set_hl(ns2, 'Test_another_hl', { link = 'Test_hl' }) - meths.nvim_set_hl(ns2, 'Test_hl_link', { link = 'Test_another_hl' }) - meths.nvim_set_hl(ns2, 'Test_another_hl_link', { link = 'Test_hl_link' }) + local ns2 = api.nvim_create_namespace('Another_namespace') + api.nvim_set_hl(ns2, 'Test_hl', { ctermfg = 23 }) + api.nvim_set_hl(ns2, 'Test_another_hl', { link = 'Test_hl' }) + api.nvim_set_hl(ns2, 'Test_hl_link', { link = 'Test_another_hl' }) + api.nvim_set_hl(ns2, 'Test_another_hl_link', { link = 'Test_hl_link' }) - local ns = meths.nvim_create_namespace('Test_set_hl') - meths.nvim_set_hl_ns(ns) + local ns = api.nvim_create_namespace('Test_set_hl') + api.nvim_set_hl_ns(ns) return ns end @@ -469,24 +466,24 @@ describe('API: get highlight', function() it('validation', function() eq( "Invalid 'name': expected String, got Integer", - pcall_err(meths.nvim_get_hl, 0, { name = 177 }) + pcall_err(api.nvim_get_hl, 0, { name = 177 }) ) - eq('Highlight id out of bounds', pcall_err(meths.nvim_get_hl, 0, { name = 'Test set hl' })) + eq('Highlight id out of bounds', pcall_err(api.nvim_get_hl, 0, { name = 'Test set hl' })) end) it('nvim_get_hl with create flag', function() - eq({}, meths.nvim_get_hl(0, { name = 'Foo', create = false })) - eq(0, funcs.hlexists('Foo')) - meths.nvim_get_hl(0, { name = 'Bar', create = true }) - eq(1, funcs.hlexists('Bar')) - meths.nvim_get_hl(0, { name = 'FooBar' }) - eq(1, funcs.hlexists('FooBar')) + eq({}, api.nvim_get_hl(0, { name = 'Foo', create = false })) + eq(0, fn.hlexists('Foo')) + api.nvim_get_hl(0, { name = 'Bar', create = true }) + eq(1, fn.hlexists('Bar')) + api.nvim_get_hl(0, { name = 'FooBar' }) + eq(1, fn.hlexists('FooBar')) end) it('can get all highlights in current namespace', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', { bg = '#B4BEFE' }) - meths.nvim_set_hl(ns, 'Test_hl_link', { link = 'Test_hl' }) + api.nvim_set_hl(ns, 'Test_hl', { bg = '#B4BEFE' }) + api.nvim_set_hl(ns, 'Test_hl_link', { link = 'Test_hl' }) eq({ Test_hl = { bg = 11845374, @@ -494,42 +491,42 @@ describe('API: get highlight', function() Test_hl_link = { link = 'Test_hl', }, - }, meths.nvim_get_hl(ns, {})) + }, api.nvim_get_hl(ns, {})) end) it('can get gui highlight', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight1) - eq(highlight1, meths.nvim_get_hl(ns, { name = 'Test_hl' })) + api.nvim_set_hl(ns, 'Test_hl', highlight1) + eq(highlight1, api.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('can get cterm highlight', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight2) - eq(highlight2, meths.nvim_get_hl(ns, { name = 'Test_hl' })) + api.nvim_set_hl(ns, 'Test_hl', highlight2) + eq(highlight2, api.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('can get empty cterm attr', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', { cterm = {} }) - eq({}, meths.nvim_get_hl(ns, { name = 'Test_hl' })) + api.nvim_set_hl(ns, 'Test_hl', { cterm = {} }) + eq({}, api.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('cterm attr defaults to gui attr', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight1) - eq(highlight1, meths.nvim_get_hl(ns, { name = 'Test_hl' })) + api.nvim_set_hl(ns, 'Test_hl', highlight1) + eq(highlight1, api.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('can overwrite attr for cterm', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', highlight3_config) - eq(highlight3_result, meths.nvim_get_hl(ns, { name = 'Test_hl' })) + api.nvim_set_hl(ns, 'Test_hl', highlight3_config) + eq(highlight3_result, api.nvim_get_hl(ns, { name = 'Test_hl' })) end) it('only allows one underline attribute #22371', function() local ns = get_ns() - meths.nvim_set_hl(ns, 'Test_hl', { + api.nvim_set_hl(ns, 'Test_hl', { underdouble = true, underdotted = true, cterm = { @@ -539,33 +536,33 @@ describe('API: get highlight', function() }) eq( { underdotted = true, cterm = { undercurl = true } }, - meths.nvim_get_hl(ns, { name = 'Test_hl' }) + api.nvim_get_hl(ns, { name = 'Test_hl' }) ) end) it('can get a highlight in the global namespace', function() - meths.nvim_set_hl(0, 'Test_hl', highlight2) - eq(highlight2, meths.nvim_get_hl(0, { name = 'Test_hl' })) + api.nvim_set_hl(0, 'Test_hl', highlight2) + eq(highlight2, api.nvim_get_hl(0, { name = 'Test_hl' })) - meths.nvim_set_hl(0, 'Test_hl', { background = highlight_color.bg }) + api.nvim_set_hl(0, 'Test_hl', { background = highlight_color.bg }) eq({ bg = 12970, - }, meths.nvim_get_hl(0, { name = 'Test_hl' })) + }, api.nvim_get_hl(0, { name = 'Test_hl' })) - meths.nvim_set_hl(0, 'Test_hl2', highlight3_config) - eq(highlight3_result, meths.nvim_get_hl(0, { name = 'Test_hl2' })) + api.nvim_set_hl(0, 'Test_hl2', highlight3_config) + eq(highlight3_result, api.nvim_get_hl(0, { name = 'Test_hl2' })) -- Colors are stored with the name they are defined, but -- with canonical casing - meths.nvim_set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue' }) + api.nvim_set_hl(0, 'Test_hl3', { bg = 'reD', fg = 'bLue' }) eq({ bg = 16711680, fg = 255, - }, meths.nvim_get_hl(0, { name = 'Test_hl3' })) + }, api.nvim_get_hl(0, { name = 'Test_hl3' })) end) it('nvim_get_hl by id', function() - local hl_id = meths.nvim_get_hl_id_by_name('NewHighlight') + local hl_id = api.nvim_get_hl_id_by_name('NewHighlight') command( 'hi NewHighlight cterm=underline ctermbg=green guifg=red guibg=yellow guisp=blue gui=bold' @@ -577,14 +574,14 @@ describe('API: get highlight', function() bold = true, ctermbg = 10, cterm = { underline = true }, - }, meths.nvim_get_hl(0, { id = hl_id })) + }, api.nvim_get_hl(0, { id = hl_id })) -- Test 0 argument - eq('Highlight id out of bounds', pcall_err(meths.nvim_get_hl, 0, { id = 0 })) + eq('Highlight id out of bounds', pcall_err(api.nvim_get_hl, 0, { id = 0 })) eq( "Invalid 'id': expected Integer, got String", - pcall_err(meths.nvim_get_hl, 0, { id = 'Test_set_hl' }) + pcall_err(api.nvim_get_hl, 0, { id = 'Test_set_hl' }) ) -- Test all highlight properties. @@ -602,7 +599,7 @@ describe('API: get highlight', function() underline = true, ctermbg = 10, cterm = { underline = true }, - }, meths.nvim_get_hl(0, { id = hl_id })) + }, api.nvim_get_hl(0, { id = hl_id })) -- Test undercurl command('hi NewHighlight gui=undercurl') @@ -613,16 +610,16 @@ describe('API: get highlight', function() undercurl = true, ctermbg = 10, cterm = { underline = true }, - }, meths.nvim_get_hl(0, { id = hl_id })) + }, api.nvim_get_hl(0, { id = hl_id })) end) it('can correctly detect links', function() command('hi String guifg=#a6e3a1 ctermfg=NONE') command('hi link @string string') command('hi link @string.cpp @string') - eq({ fg = 10937249 }, meths.nvim_get_hl(0, { name = 'String' })) - eq({ link = 'String' }, meths.nvim_get_hl(0, { name = '@string' })) - eq({ fg = 10937249 }, meths.nvim_get_hl(0, { name = '@string.cpp', link = false })) + eq({ fg = 10937249 }, api.nvim_get_hl(0, { name = 'String' })) + eq({ link = 'String' }, api.nvim_get_hl(0, { name = '@string' })) + eq({ fg = 10937249 }, api.nvim_get_hl(0, { name = '@string.cpp', link = false })) end) it('can get all attributes for a linked group', function() @@ -631,55 +628,55 @@ describe('API: get highlight', function() command('hi! link Foo Bar') eq( { link = 'Bar', fg = tonumber('00ff00', 16), bold = true, underline = true }, - meths.nvim_get_hl(0, { name = 'Foo', link = true }) + api.nvim_get_hl(0, { name = 'Foo', link = true }) ) end) it('can set link as well as other attributes', function() command('hi Bar guifg=red') local hl = { link = 'Bar', fg = tonumber('00ff00', 16), bold = true, cterm = { bold = true } } - meths.nvim_set_hl(0, 'Foo', hl) - eq(hl, meths.nvim_get_hl(0, { name = 'Foo', link = true })) + api.nvim_set_hl(0, 'Foo', hl) + eq(hl, api.nvim_get_hl(0, { name = 'Foo', link = true })) end) it("doesn't contain unset groups", function() - local id = meths.nvim_get_hl_id_by_name '@foobar.hubbabubba' + local id = api.nvim_get_hl_id_by_name '@foobar.hubbabubba' ok(id > 0) - local data = meths.nvim_get_hl(0, {}) + local data = api.nvim_get_hl(0, {}) eq(nil, data['@foobar.hubbabubba']) eq(nil, data['@foobar']) command 'hi @foobar.hubbabubba gui=bold' - data = meths.nvim_get_hl(0, {}) + data = api.nvim_get_hl(0, {}) 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.nvim_get_hl(0, {}) + data = api.nvim_get_hl(0, {}) eq({}, data['@foobar.hubbabubba']) eq(nil, data['@foobar']) end) it('should return default flag', function() - meths.nvim_set_hl(0, 'Tried', { fg = '#00ff00', default = true }) - eq({ fg = tonumber('00ff00', 16), default = true }, meths.nvim_get_hl(0, { name = 'Tried' })) + api.nvim_set_hl(0, 'Tried', { fg = '#00ff00', default = true }) + eq({ fg = tonumber('00ff00', 16), default = true }, api.nvim_get_hl(0, { name = 'Tried' })) end) it('should not output empty gui and cterm #23474', function() - meths.nvim_set_hl(0, 'Foo', { default = true }) - meths.nvim_set_hl(0, 'Bar', { default = true, fg = '#ffffff' }) - meths.nvim_set_hl(0, 'FooBar', { default = true, fg = '#ffffff', cterm = { bold = true } }) - meths.nvim_set_hl( + api.nvim_set_hl(0, 'Foo', { default = true }) + api.nvim_set_hl(0, 'Bar', { default = true, fg = '#ffffff' }) + api.nvim_set_hl(0, 'FooBar', { default = true, fg = '#ffffff', cterm = { bold = true } }) + api.nvim_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.nvim_get_hl(0, { name = 'Foo' })) + eq({ default = true }, api.nvim_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')) @@ -688,27 +685,27 @@ describe('API: get highlight', function() it('can override exist highlight group by force #20323', function() local white = tonumber('ffffff', 16) local green = tonumber('00ff00', 16) - meths.nvim_set_hl(0, 'Foo', { fg = white }) - meths.nvim_set_hl(0, 'Foo', { fg = green, force = true }) - eq({ fg = green }, meths.nvim_get_hl(0, { name = 'Foo' })) - meths.nvim_set_hl(0, 'Bar', { link = 'Comment', default = true }) - meths.nvim_set_hl(0, 'Bar', { link = 'Foo', default = true, force = true }) - eq({ link = 'Foo', default = true }, meths.nvim_get_hl(0, { name = 'Bar' })) + api.nvim_set_hl(0, 'Foo', { fg = white }) + api.nvim_set_hl(0, 'Foo', { fg = green, force = true }) + eq({ fg = green }, api.nvim_get_hl(0, { name = 'Foo' })) + api.nvim_set_hl(0, 'Bar', { link = 'Comment', default = true }) + api.nvim_set_hl(0, 'Bar', { link = 'Foo', default = true, force = true }) + eq({ link = 'Foo', default = true }, api.nvim_get_hl(0, { name = 'Bar' })) end) end) describe('API: set/get highlight namespace', function() it('set/get highlight namespace', function() - eq(0, meths.nvim_get_hl_ns({})) - local ns = meths.nvim_create_namespace('') - meths.nvim_set_hl_ns(ns) - eq(ns, meths.nvim_get_hl_ns({})) + eq(0, api.nvim_get_hl_ns({})) + local ns = api.nvim_create_namespace('') + api.nvim_set_hl_ns(ns) + eq(ns, api.nvim_get_hl_ns({})) end) it('set/get window highlight namespace', function() - eq(-1, meths.nvim_get_hl_ns({ winid = 0 })) - local ns = meths.nvim_create_namespace('') - meths.nvim_win_set_hl_ns(0, ns) - eq(ns, meths.nvim_get_hl_ns({ winid = 0 })) + eq(-1, api.nvim_get_hl_ns({ winid = 0 })) + local ns = api.nvim_create_namespace('') + api.nvim_win_set_hl_ns(0, ns) + eq(ns, api.nvim_get_hl_ns({ winid = 0 })) end) end) diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index b7de7732e8..4f57f6d0bd 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -6,8 +6,8 @@ local eq, neq = helpers.eq, helpers.neq local exec_lua = helpers.exec_lua local exec = helpers.exec local feed = helpers.feed -local funcs = helpers.funcs -local meths = helpers.meths +local fn = helpers.fn +local api = helpers.api local source = helpers.source local pcall_err = helpers.pcall_err @@ -55,7 +55,7 @@ describe('nvim_get_keymap', function() } it('returns empty list when no map', function() - eq({}, meths.nvim_get_keymap('n')) + eq({}, api.nvim_get_keymap('n')) end) it('returns list of all applicable mappings', function() @@ -64,8 +64,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.nvim_get_keymap('n')) - eq({ funcs.maparg('foo', 'n', false, true) }, meths.nvim_get_keymap('n')) + eq({ foo_bar_map_table }, api.nvim_get_keymap('n')) + eq({ fn.maparg('foo', 'n', false, true) }, api.nvim_get_keymap('n')) -- Add another mapping command('nnoremap foo_longer bar_longer') @@ -74,11 +74,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.nvim_get_keymap('n')) + eq({ foolong_bar_map_table, foo_bar_map_table }, api.nvim_get_keymap('n')) -- Remove a mapping command('unmap foo_longer') - eq({ foo_bar_map_table }, meths.nvim_get_keymap('n')) + eq({ foo_bar_map_table }, api.nvim_get_keymap('n')) end) it('works for other modes', function() @@ -92,7 +92,7 @@ describe('nvim_get_keymap', function() insert_table['mode'] = 'i' insert_table['mode_bits'] = 0x10 - eq({ insert_table }, meths.nvim_get_keymap('i')) + eq({ insert_table }, api.nvim_get_keymap('i')) end) it('considers scope', function() @@ -109,8 +109,8 @@ describe('nvim_get_keymap', function() command('nnoremap foo bar') -- The buffer mapping should not show up - eq({ foolong_bar_map_table }, meths.nvim_get_keymap('n')) - eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n')) + eq({ foolong_bar_map_table }, api.nvim_get_keymap('n')) + eq({ buffer_table }, api.nvim_buf_get_keymap(0, 'n')) end) it('considers scope for overlapping maps', function() @@ -121,12 +121,12 @@ describe('nvim_get_keymap', function() command('nnoremap foo bar') - eq({ foo_bar_map_table }, meths.nvim_get_keymap('n')) - eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n')) + eq({ foo_bar_map_table }, api.nvim_get_keymap('n')) + eq({ buffer_table }, api.nvim_buf_get_keymap(0, 'n')) end) it('can retrieve mapping for different buffers', function() - local original_buffer = meths.nvim_buf_get_number(0) + local original_buffer = api.nvim_buf_get_number(0) -- Place something in each of the buffers to make sure they stick around -- and set hidden so we can leave them command('set hidden') @@ -135,21 +135,21 @@ describe('nvim_get_keymap', function() command('new') command('normal! ihello 3') - local final_buffer = meths.nvim_buf_get_number(0) + local final_buffer = api.nvim_buf_get_number(0) command('nnoremap foo bar') -- Final buffer will have buffer mappings local buffer_table = shallowcopy(foo_bar_map_table) buffer_table['buffer'] = final_buffer - eq({ buffer_table }, meths.nvim_buf_get_keymap(final_buffer, 'n')) - eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n')) + eq({ buffer_table }, api.nvim_buf_get_keymap(final_buffer, 'n')) + eq({ buffer_table }, api.nvim_buf_get_keymap(0, 'n')) command('buffer ' .. original_buffer) - eq(original_buffer, meths.nvim_buf_get_number(0)) + eq(original_buffer, api.nvim_buf_get_number(0)) -- Original buffer won't have any mappings - eq({}, meths.nvim_get_keymap('n')) - eq({}, meths.nvim_buf_get_keymap(0, 'n')) - eq({ buffer_table }, meths.nvim_buf_get_keymap(final_buffer, 'n')) + eq({}, api.nvim_get_keymap('n')) + eq({}, api.nvim_buf_get_keymap(0, 'n')) + eq({ buffer_table }, api.nvim_buf_get_keymap(final_buffer, 'n')) end) -- Test toggle switches for basic options @@ -189,7 +189,7 @@ describe('nvim_get_keymap', function() function() make_new_windows(new_windows) command(map .. ' ' .. option_token .. ' foo bar') - local result = meths.nvim_get_keymap(mode)[1][option] + local result = api.nvim_get_keymap(mode)[1][option] eq(global_on_result, result) end ) @@ -207,7 +207,7 @@ describe('nvim_get_keymap', function() function() make_new_windows(new_windows) command(map .. ' ' .. option_token .. ' foo bar') - local result = meths.nvim_buf_get_keymap(0, mode)[1][option] + local result = api.nvim_buf_get_keymap(0, mode)[1][option] eq(buffer_on_result, result) end ) @@ -226,7 +226,7 @@ describe('nvim_get_keymap', function() function() make_new_windows(new_windows) command(map .. ' baz bat') - local result = meths.nvim_get_keymap(mode)[1][option] + local result = api.nvim_get_keymap(mode)[1][option] eq(global_off_result, result) end ) @@ -244,7 +244,7 @@ describe('nvim_get_keymap', function() make_new_windows(new_windows) command(map .. ' foo bar') - local result = meths.nvim_buf_get_keymap(0, mode)[1][option] + local result = api.nvim_buf_get_keymap(0, mode)[1][option] eq(buffer_off_result, result) end ) @@ -275,9 +275,9 @@ describe('nvim_get_keymap', function() nnoremap fizz :call maparg_test_function() ]]) - local sid_result = meths.nvim_get_keymap('n')[1]['sid'] + local sid_result = api.nvim_get_keymap('n')[1]['sid'] eq(1, sid_result) - eq('testing', meths.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) + eq('testing', api.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) end) it('returns script numbers for buffer maps', function() @@ -288,15 +288,15 @@ describe('nvim_get_keymap', function() nnoremap fizz :call maparg_test_function() ]]) - local sid_result = meths.nvim_buf_get_keymap(0, 'n')[1]['sid'] + local sid_result = api.nvim_buf_get_keymap(0, 'n')[1]['sid'] eq(1, sid_result) - eq('testing', meths.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) + eq('testing', api.nvim_call_function('' .. sid_result .. '_maparg_test_function', {})) end) it('works with and others', function() command('nnoremap :let g:maparg_test_var = 1') - eq('', meths.nvim_get_keymap('n')[1]['lhs']) - eq(':let g:maparg_test_var = 1', meths.nvim_get_keymap('n')[1]['rhs']) + eq('', api.nvim_get_keymap('n')[1]['lhs']) + eq(':let g:maparg_test_var = 1', api.nvim_get_keymap('n')[1]['rhs']) end) it('works correctly despite various &cpo settings', function() @@ -339,7 +339,7 @@ describe('nvim_get_keymap', function() -- wrapper around get_keymap() that drops "lhsraw" and "lhsrawalt" which are hard to check local function get_keymap_noraw(...) - local ret = meths.nvim_get_keymap(...) + local ret = api.nvim_get_keymap(...) for _, item in ipairs(ret) do item.lhsraw = nil item.lhsrawalt = nil @@ -390,7 +390,7 @@ describe('nvim_get_keymap', function() lnum = 0, } command('nnoremap \\| \\| ') - eq({ space_table }, meths.nvim_get_keymap('n')) + eq({ space_table }, api.nvim_get_keymap('n')) end) it('can handle lua mappings', function() @@ -419,7 +419,7 @@ describe('nvim_get_keymap', function() ]]) eq(3, exec_lua([[return GlobalCount]])) - local mapargs = meths.nvim_get_keymap('n') + local mapargs = api.nvim_get_keymap('n') mapargs[1].callback = nil eq({ lhs = 'asdf', @@ -440,7 +440,7 @@ describe('nvim_get_keymap', function() end) it('can handle map descriptions', function() - meths.nvim_set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) + api.nvim_set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) eq({ lhs = 'lhs', lhsraw = 'lhs', @@ -458,7 +458,7 @@ describe('nvim_get_keymap', function() noremap = 0, lnum = 0, desc = 'map description', - }, meths.nvim_get_keymap('n')[1]) + }, api.nvim_get_keymap('n')[1]) end) end) @@ -511,7 +511,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- Gets a maparg() dict from Nvim, if one exists. local function get_mapargs(mode, lhs) - local mapargs = funcs.maparg(lhs, normalize_mapmode(mode), mode:sub(-1) == 'a', true) + local mapargs = fn.maparg(lhs, normalize_mapmode(mode), mode:sub(-1) == 'a', true) -- drop "lhsraw" and "lhsrawalt" which are hard to check mapargs.lhsraw = nil mapargs.lhsrawalt = nil @@ -520,9 +520,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('error on empty LHS', function() -- escape parentheses in lua string, else comparison fails erroneously - eq('Invalid (empty) LHS', pcall_err(meths.nvim_set_keymap, '', '', 'rhs', {})) - eq('Invalid (empty) LHS', pcall_err(meths.nvim_set_keymap, '', '', '', {})) - eq('Invalid (empty) LHS', pcall_err(meths.nvim_del_keymap, '', '')) + eq('Invalid (empty) LHS', pcall_err(api.nvim_set_keymap, '', '', 'rhs', {})) + eq('Invalid (empty) LHS', pcall_err(api.nvim_set_keymap, '', '', '', {})) + eq('Invalid (empty) LHS', pcall_err(api.nvim_del_keymap, '', '')) end) it('error if LHS longer than MAXMAPLEN', function() @@ -534,19 +534,19 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end -- exactly 50 chars should be fine - meths.nvim_set_keymap('', lhs, 'rhs', {}) + api.nvim_set_keymap('', lhs, 'rhs', {}) -- del_keymap should unmap successfully - meths.nvim_del_keymap('', lhs) + api.nvim_del_keymap('', lhs) eq({}, get_mapargs('', lhs)) -- 51 chars should produce an error lhs = lhs .. '1' eq( 'LHS exceeds maximum map length: ' .. lhs, - pcall_err(meths.nvim_set_keymap, '', lhs, 'rhs', {}) + pcall_err(api.nvim_set_keymap, '', lhs, 'rhs', {}) ) - eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(meths.nvim_del_keymap, '', lhs)) + eq('LHS exceeds maximum map length: ' .. lhs, pcall_err(api.nvim_del_keymap, '', lhs)) end) it('does not throw errors when rhs is longer than MAXMAPLEN', function() @@ -556,65 +556,65 @@ describe('nvim_set_keymap, nvim_del_keymap', function() rhs = rhs .. (i % 10) end rhs = rhs .. '1' - meths.nvim_set_keymap('', 'lhs', rhs, {}) + api.nvim_set_keymap('', 'lhs', rhs, {}) eq(generate_mapargs('', 'lhs', rhs), get_mapargs('', 'lhs')) end) it('error on invalid mode shortname', function() - eq('Invalid mode shortname: " "', pcall_err(meths.nvim_set_keymap, ' ', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "m"', pcall_err(meths.nvim_set_keymap, 'm', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "?"', pcall_err(meths.nvim_set_keymap, '?', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "y"', pcall_err(meths.nvim_set_keymap, 'y', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "p"', pcall_err(meths.nvim_set_keymap, 'p', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "a"', pcall_err(meths.nvim_set_keymap, 'a', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "oa"', pcall_err(meths.nvim_set_keymap, 'oa', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "!o"', pcall_err(meths.nvim_set_keymap, '!o', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "!i"', pcall_err(meths.nvim_set_keymap, '!i', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "!!"', pcall_err(meths.nvim_set_keymap, '!!', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "map"', pcall_err(meths.nvim_set_keymap, 'map', 'lhs', 'rhs', {})) - eq('Invalid mode shortname: "vmap"', pcall_err(meths.nvim_set_keymap, 'vmap', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: " "', pcall_err(api.nvim_set_keymap, ' ', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "m"', pcall_err(api.nvim_set_keymap, 'm', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "?"', pcall_err(api.nvim_set_keymap, '?', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "y"', pcall_err(api.nvim_set_keymap, 'y', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "p"', pcall_err(api.nvim_set_keymap, 'p', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "a"', pcall_err(api.nvim_set_keymap, 'a', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "oa"', pcall_err(api.nvim_set_keymap, 'oa', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "!o"', pcall_err(api.nvim_set_keymap, '!o', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "!i"', pcall_err(api.nvim_set_keymap, '!i', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "!!"', pcall_err(api.nvim_set_keymap, '!!', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "map"', pcall_err(api.nvim_set_keymap, 'map', 'lhs', 'rhs', {})) + eq('Invalid mode shortname: "vmap"', pcall_err(api.nvim_set_keymap, 'vmap', 'lhs', 'rhs', {})) eq( 'Invalid mode shortname: "xnoremap"', - pcall_err(meths.nvim_set_keymap, 'xnoremap', 'lhs', 'rhs', {}) + pcall_err(api.nvim_set_keymap, 'xnoremap', 'lhs', 'rhs', {}) ) - eq('Invalid mode shortname: " "', pcall_err(meths.nvim_del_keymap, ' ', 'lhs')) - eq('Invalid mode shortname: "m"', pcall_err(meths.nvim_del_keymap, 'm', 'lhs')) - eq('Invalid mode shortname: "?"', pcall_err(meths.nvim_del_keymap, '?', 'lhs')) - eq('Invalid mode shortname: "y"', pcall_err(meths.nvim_del_keymap, 'y', 'lhs')) - eq('Invalid mode shortname: "p"', pcall_err(meths.nvim_del_keymap, 'p', 'lhs')) - eq('Invalid mode shortname: "a"', pcall_err(meths.nvim_del_keymap, 'a', 'lhs')) - eq('Invalid mode shortname: "oa"', pcall_err(meths.nvim_del_keymap, 'oa', 'lhs')) - eq('Invalid mode shortname: "!o"', pcall_err(meths.nvim_del_keymap, '!o', 'lhs')) - eq('Invalid mode shortname: "!i"', pcall_err(meths.nvim_del_keymap, '!i', 'lhs')) - eq('Invalid mode shortname: "!!"', pcall_err(meths.nvim_del_keymap, '!!', 'lhs')) - eq('Invalid mode shortname: "map"', pcall_err(meths.nvim_del_keymap, 'map', 'lhs')) - eq('Invalid mode shortname: "vmap"', pcall_err(meths.nvim_del_keymap, 'vmap', 'lhs')) - eq('Invalid mode shortname: "xnoremap"', pcall_err(meths.nvim_del_keymap, 'xnoremap', 'lhs')) + eq('Invalid mode shortname: " "', pcall_err(api.nvim_del_keymap, ' ', 'lhs')) + eq('Invalid mode shortname: "m"', pcall_err(api.nvim_del_keymap, 'm', 'lhs')) + eq('Invalid mode shortname: "?"', pcall_err(api.nvim_del_keymap, '?', 'lhs')) + eq('Invalid mode shortname: "y"', pcall_err(api.nvim_del_keymap, 'y', 'lhs')) + eq('Invalid mode shortname: "p"', pcall_err(api.nvim_del_keymap, 'p', 'lhs')) + eq('Invalid mode shortname: "a"', pcall_err(api.nvim_del_keymap, 'a', 'lhs')) + eq('Invalid mode shortname: "oa"', pcall_err(api.nvim_del_keymap, 'oa', 'lhs')) + eq('Invalid mode shortname: "!o"', pcall_err(api.nvim_del_keymap, '!o', 'lhs')) + eq('Invalid mode shortname: "!i"', pcall_err(api.nvim_del_keymap, '!i', 'lhs')) + eq('Invalid mode shortname: "!!"', pcall_err(api.nvim_del_keymap, '!!', 'lhs')) + eq('Invalid mode shortname: "map"', pcall_err(api.nvim_del_keymap, 'map', 'lhs')) + eq('Invalid mode shortname: "vmap"', pcall_err(api.nvim_del_keymap, 'vmap', 'lhs')) + eq('Invalid mode shortname: "xnoremap"', pcall_err(api.nvim_del_keymap, 'xnoremap', 'lhs')) end) it('error on invalid optnames', function() eq( "Invalid key: 'silentt'", - pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { silentt = true }) + pcall_err(api.nvim_set_keymap, 'n', 'lhs', 'rhs', { silentt = true }) ) - eq("Invalid key: 'sidd'", pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { sidd = false })) + eq("Invalid key: 'sidd'", pcall_err(api.nvim_set_keymap, 'n', 'lhs', 'rhs', { sidd = false })) eq( "Invalid key: 'nowaiT'", - pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { nowaiT = false }) + pcall_err(api.nvim_set_keymap, 'n', 'lhs', 'rhs', { nowaiT = false }) ) end) it('error on option key', function() eq( "Invalid key: 'buffer'", - pcall_err(meths.nvim_set_keymap, 'n', 'lhs', 'rhs', { buffer = true }) + pcall_err(api.nvim_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.nvim_set_keymap, 'n', 'lhs', 'rhs', { replace_keycodes = true }) + pcall_err(api.nvim_set_keymap, 'n', 'lhs', 'rhs', { replace_keycodes = true }) ) end) @@ -624,45 +624,45 @@ describe('nvim_set_keymap, nvim_del_keymap', 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.nvim_set_keymap, 'n', 'lhs', 'rhs', opts)) + eq(opt .. ' is not a boolean', pcall_err(api.nvim_set_keymap, 'n', 'lhs', 'rhs', opts)) end) end -- Perform tests of basic functionality it('sets ordinary mappings', function() - meths.nvim_set_keymap('n', 'lhs', 'rhs', {}) + api.nvim_set_keymap('n', 'lhs', 'rhs', {}) eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', 'lhs')) - meths.nvim_set_keymap('v', 'lhs', 'rhs', {}) + api.nvim_set_keymap('v', 'lhs', 'rhs', {}) eq(generate_mapargs('v', 'lhs', 'rhs'), get_mapargs('v', 'lhs')) end) it('does not throw when LHS or RHS have leading/trailing whitespace', function() - meths.nvim_set_keymap('n', ' lhs', 'rhs', {}) + api.nvim_set_keymap('n', ' lhs', 'rhs', {}) eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', ' lhs')) - meths.nvim_set_keymap('n', 'lhs ', 'rhs', {}) + api.nvim_set_keymap('n', 'lhs ', 'rhs', {}) eq(generate_mapargs('n', 'lhs', 'rhs'), get_mapargs('n', 'lhs ')) - meths.nvim_set_keymap('v', ' lhs ', '\trhs\t\f', {}) + api.nvim_set_keymap('v', ' lhs ', '\trhs\t\f', {}) eq(generate_mapargs('v', 'lhs', '\trhs\t\f'), get_mapargs('v', ' lhs ')) end) it('can set noremap mappings', function() - meths.nvim_set_keymap('x', 'lhs', 'rhs', { noremap = true }) + api.nvim_set_keymap('x', 'lhs', 'rhs', { noremap = true }) eq(generate_mapargs('x', 'lhs', 'rhs', { noremap = true }), get_mapargs('x', 'lhs')) - meths.nvim_set_keymap('t', 'lhs', 'rhs', { noremap = true }) + api.nvim_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() - meths.nvim_set_keymap('v', 'lhs', 'rhs', {}) - meths.nvim_del_keymap('v', 'lhs') + api.nvim_set_keymap('v', 'lhs', 'rhs', {}) + api.nvim_del_keymap('v', 'lhs') eq({}, get_mapargs('v', 'lhs')) - meths.nvim_set_keymap('t', 'lhs', 'rhs', { noremap = true }) - meths.nvim_del_keymap('t', 'lhs') + api.nvim_set_keymap('t', 'lhs', 'rhs', { noremap = true }) + api.nvim_del_keymap('t', 'lhs') eq({}, get_mapargs('t', 'lhs')) end) @@ -670,8 +670,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() it('"!" and empty string are synonyms for mapmode-nvo', function() local nvo_shortnames = { '', '!' } for _, name in ipairs(nvo_shortnames) do - meths.nvim_set_keymap(name, 'lhs', 'rhs', {}) - meths.nvim_del_keymap(name, 'lhs') + api.nvim_set_keymap(name, 'lhs', 'rhs', {}) + api.nvim_del_keymap(name, 'lhs') eq({}, get_mapargs(name, 'lhs')) end end) @@ -681,48 +681,48 @@ describe('nvim_set_keymap, nvim_del_keymap', function() for _, rhs in ipairs(special_chars) do local mapmode = '!' it('can set mappings with special characters, lhs: ' .. lhs .. ', rhs: ' .. rhs, function() - meths.nvim_set_keymap(mapmode, lhs, rhs, {}) + api.nvim_set_keymap(mapmode, lhs, rhs, {}) eq(generate_mapargs(mapmode, lhs, rhs), get_mapargs(mapmode, lhs)) end) end end it('can set mappings containing literal keycodes', function() - meths.nvim_set_keymap('n', '\n\r\n', 'rhs', {}) + api.nvim_set_keymap('n', '\n\r\n', 'rhs', {}) local expected = generate_mapargs('n', '', 'rhs') eq(expected, get_mapargs('n', '')) end) it('can set mappings whose RHS is a ', function() - meths.nvim_set_keymap('i', 'lhs', '', {}) + api.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) -- imap to does nothing + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, 0)) -- imap to does nothing eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- also test for case insensitivity - meths.nvim_set_keymap('i', 'lhs', '', {}) + api.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, 0)) -- note: RHS in returned mapargs() dict reflects the original RHS -- provided by the user eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) - meths.nvim_set_keymap('i', 'lhs', '', {}) + api.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, 0)) eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) -- a single ^V in RHS is also (see :h map-empty-rhs) - meths.nvim_set_keymap('i', 'lhs', '\022', {}) + api.nvim_set_keymap('i', 'lhs', '\022', {}) command('normal ilhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, 0)) eq(generate_mapargs('i', 'lhs', '\022', {}), get_mapargs('i', 'lhs')) end) it('treats an empty RHS in a mapping like a ', function() - meths.nvim_set_keymap('i', 'lhs', '', {}) + api.nvim_set_keymap('i', 'lhs', '', {}) command('normal ilhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, 0)) eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs')) end) @@ -730,8 +730,8 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- Taken from the legacy test: test_mapping.vim. Exposes a bug in which -- replace_termcodes changes the length of the mapping's LHS, but -- do_map continues to use the *old* length of LHS. - meths.nvim_set_keymap('i', '', 'foo', {}) - meths.nvim_del_keymap('i', '') + api.nvim_set_keymap('i', '', 'foo', {}) + api.nvim_del_keymap('i', '') eq({}, get_mapargs('i', '')) end) @@ -741,18 +741,18 @@ describe('nvim_set_keymap, nvim_del_keymap', function() command([[call nvim_set_keymap('i', "\", "\", {})]]) eq(generate_mapargs('i', '', '\t', { sid = 0 }), get_mapargs('i', '')) feed('i ') - eq({ '\t' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '\t' }, api.nvim_buf_get_lines(0, 0, -1, 0)) end ) it('throws appropriate error messages when setting maps', function() - meths.nvim_set_keymap('l', 'lhs', 'rhs', {}) + api.nvim_set_keymap('l', 'lhs', 'rhs', {}) eq( 'E227: mapping already exists for lhs', - pcall_err(meths.nvim_set_keymap, 'l', 'lhs', 'rhs', { unique = true }) + pcall_err(api.nvim_set_keymap, 'l', 'lhs', 'rhs', { unique = true }) ) -- different mapmode, no error should be thrown - meths.nvim_set_keymap('t', 'lhs', 'rhs', { unique = true }) + api.nvim_set_keymap('t', 'lhs', 'rhs', { unique = true }) end) it('can set mappings whose RHS change dynamically', function() @@ -763,50 +763,50 @@ describe('nvim_set_keymap, nvim_del_keymap', function() return g:flip endfunction ]]) - eq(1, meths.nvim_call_function('FlipFlop', {})) - eq(0, meths.nvim_call_function('FlipFlop', {})) - eq(1, meths.nvim_call_function('FlipFlop', {})) - eq(0, meths.nvim_call_function('FlipFlop', {})) + eq(1, api.nvim_call_function('FlipFlop', {})) + eq(0, api.nvim_call_function('FlipFlop', {})) + eq(1, api.nvim_call_function('FlipFlop', {})) + eq(0, api.nvim_call_function('FlipFlop', {})) - meths.nvim_set_keymap('i', 'lhs', 'FlipFlop()', { expr = true }) + api.nvim_set_keymap('i', 'lhs', 'FlipFlop()', { expr = true }) command('normal ilhs') - eq({ '1' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '1' }, api.nvim_buf_get_lines(0, 0, -1, 0)) command('normal! ggVGd') command('normal ilhs') - eq({ '0' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ '0' }, api.nvim_buf_get_lines(0, 0, -1, 0)) end) it('can set mappings that do trigger other mappings', function() - meths.nvim_set_keymap('i', 'mhs', 'rhs', {}) - meths.nvim_set_keymap('i', 'lhs', 'mhs', {}) + api.nvim_set_keymap('i', 'mhs', 'rhs', {}) + api.nvim_set_keymap('i', 'lhs', 'mhs', {}) command('normal imhs') - eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ 'rhs' }, api.nvim_buf_get_lines(0, 0, -1, 0)) command('normal! ggVGd') command('normal ilhs') - eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ 'rhs' }, api.nvim_buf_get_lines(0, 0, -1, 0)) end) it("can set noremap mappings that don't trigger other mappings", function() - meths.nvim_set_keymap('i', 'mhs', 'rhs', {}) - meths.nvim_set_keymap('i', 'lhs', 'mhs', { noremap = true }) + api.nvim_set_keymap('i', 'mhs', 'rhs', {}) + api.nvim_set_keymap('i', 'lhs', 'mhs', { noremap = true }) command('normal imhs') - eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ 'rhs' }, api.nvim_buf_get_lines(0, 0, -1, 0)) command('normal! ggVGd') command('normal ilhs') -- shouldn't trigger mhs-to-rhs mapping - eq({ 'mhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ 'mhs' }, api.nvim_buf_get_lines(0, 0, -1, 0)) end) it('can set nowait mappings that fire without waiting', function() - meths.nvim_set_keymap('i', '123456', 'longer', {}) - meths.nvim_set_keymap('i', '123', 'shorter', { nowait = true }) + api.nvim_set_keymap('i', '123456', 'longer', {}) + api.nvim_set_keymap('i', '123', 'shorter', { nowait = true }) -- feed keys one at a time; if all keys arrive atomically, the longer -- mapping will trigger @@ -815,29 +815,29 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed(c) sleep(5) end - eq({ 'shorter456' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) + eq({ 'shorter456' }, api.nvim_buf_get_lines(0, 0, -1, 0)) end) -- Perform exhaustive tests of basic functionality 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() - meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', {}) + api.nvim_set_keymap(mapmode, 'lhs', 'rhs', {}) 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 - meths.nvim_del_keymap(mapmode, 'lhs') + api.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) end for _, mapmode in ipairs(mapmodes) do it('can set/unset noremap mappings using mapmode ' .. mapmode, function() - meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', { noremap = true }) + api.nvim_set_keymap(mapmode, 'lhs', 'rhs', { noremap = true }) eq(generate_mapargs(mapmode, 'lhs', 'rhs', { noremap = true }), get_mapargs(mapmode, 'lhs')) - meths.nvim_del_keymap(mapmode, 'lhs') + api.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) end @@ -849,12 +849,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function() -- Test with single mappings for _, maparg in ipairs(optnames) do it('can set/unset ' .. mapmode .. '-mappings with maparg: ' .. maparg, function() - meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = true }) + api.nvim_set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = true }) eq( generate_mapargs(mapmode, 'lhs', 'rhs', { [maparg] = true }), get_mapargs(mapmode, 'lhs') ) - meths.nvim_del_keymap(mapmode, 'lhs') + api.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end) it( @@ -864,9 +864,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() .. maparg .. ', whose value is false', function() - meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = false }) + api.nvim_set_keymap(mapmode, 'lhs', 'rhs', { [maparg] = false }) eq(generate_mapargs(mapmode, 'lhs', 'rhs'), get_mapargs(mapmode, 'lhs')) - meths.nvim_del_keymap(mapmode, 'lhs') + api.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end ) @@ -886,9 +886,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() .. opt3, function() local opts = { [opt1] = true, [opt2] = false, [opt3] = true } - meths.nvim_set_keymap(mapmode, 'lhs', 'rhs', opts) + api.nvim_set_keymap(mapmode, 'lhs', 'rhs', opts) eq(generate_mapargs(mapmode, 'lhs', 'rhs', opts), get_mapargs(mapmode, 'lhs')) - meths.nvim_del_keymap(mapmode, 'lhs') + api.nvim_del_keymap(mapmode, 'lhs') eq({}, get_mapargs(mapmode, 'lhs')) end ) @@ -926,7 +926,7 @@ 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'), '^')) + assert.truthy(string.match(fn.mapcheck('asdf', 'n'), '^')) end) it('maparg() returns lua mapping correctly', function() @@ -939,9 +939,9 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]]) ) - assert.truthy(string.match(funcs.maparg('asdf', 'n'), '^')) + assert.truthy(string.match(fn.maparg('asdf', 'n'), '^')) - local mapargs = funcs.maparg('asdf', 'n', false, true) + local mapargs = fn.maparg('asdf', 'n', false, true) mapargs.callback = nil mapargs.lhsraw = nil mapargs.lhsrawalt = nil @@ -968,7 +968,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('aa') - eq({ 'πfoo<' }, meths.nvim_buf_get_lines(0, 0, -1, false)) + eq({ 'πfoo<' }, api.nvim_buf_get_lines(0, 0, -1, false)) end) it('can make lua expr mappings without replacing keycodes', function() @@ -978,7 +978,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('iaa') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, false)) end) it('lua expr mapping returning nil is equivalent to returning an empty string', function() @@ -988,7 +988,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() feed('iaa') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, false)) end) it('does not reset pum in lua mapping', function() @@ -1091,7 +1091,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function() end) it('can set descriptions on mappings', function() - meths.nvim_set_keymap('n', 'lhs', 'rhs', { desc = 'map description' }) + api.nvim_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) @@ -1106,10 +1106,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] feed 'iThe foo and the bar and the foo again' - eq('The 1 and the bar and the 2 again', meths.nvim_get_current_line()) + eq('The 1 and the bar and the 2 again', api.nvim_get_current_line()) feed ':let x = "The foo is the one"' - eq('The 3 is the one', meths.nvim_eval 'x') + eq('The 3 is the one', api.nvim_eval 'x') end) it('can define insert mode abbreviations with lua callbacks', function() @@ -1122,10 +1122,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] feed 'iThe foo and the bar and the foo again' - eq('The 1 and the bar and the 2 again', meths.nvim_get_current_line()) + eq('The 1 and the bar and the 2 again', api.nvim_get_current_line()) feed ':let x = "The foo is the one"' - eq('The foo is the one', meths.nvim_eval 'x') + eq('The foo is the one', api.nvim_eval 'x') end) it('can define cmdline mode abbreviations with lua callbacks', function() @@ -1138,10 +1138,10 @@ describe('nvim_set_keymap, nvim_del_keymap', function() ]] feed 'iThe foo and the bar and the foo again' - eq('The foo and the bar and the foo again', meths.nvim_get_current_line()) + eq('The foo and the bar and the foo again', api.nvim_get_current_line()) feed ':let x = "The foo is the one"' - eq('The 1 is the one', meths.nvim_eval 'x') + eq('The 1 is the one', api.nvim_eval 'x') end) end) @@ -1164,9 +1164,9 @@ 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.nvim_call_function('bufnr', { '%' }) + local first_buf = api.nvim_call_function('bufnr', { '%' }) command('new') - local second_buf = meths.nvim_call_function('bufnr', { '%' }) + local second_buf = api.nvim_call_function('bufnr', { '%' }) neq(second_buf, first_buf) -- sanity check if start_from_first then @@ -1179,66 +1179,66 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() it('rejects negative bufnr values', function() eq( 'Wrong type for argument 1 when calling nvim_buf_set_keymap, expecting Buffer', - pcall_err(meths.nvim_buf_set_keymap, -1, '', 'lhs', 'rhs', {}) + pcall_err(api.nvim_buf_set_keymap, -1, '', 'lhs', 'rhs', {}) ) end) it('can set mappings active in the current buffer but not others', function() local first, second = make_two_buffers(true) - meths.nvim_buf_set_keymap(0, '', 'lhs', 'irhs', {}) + api.nvim_buf_set_keymap(0, '', 'lhs', 'irhs', {}) command('normal lhs') - eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, api.nvim_buf_get_lines(0, 0, 1, 1)) -- mapping should have no effect in new buffer switch_to_buf(second) command('normal lhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, 1, 1)) -- mapping should remain active in old buffer switch_to_buf(first) command('normal ^lhs') - eq({ 'rhsrhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ 'rhsrhs' }, api.nvim_buf_get_lines(0, 0, 1, 1)) end) it('can set local mappings in buffer other than current', function() local first = make_two_buffers(false) - meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) + api.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) -- shouldn't do anything command('normal lhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, 1, 1)) -- should take effect switch_to_buf(first) command('normal lhs') - eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, api.nvim_buf_get_lines(0, 0, 1, 1)) end) it('can disable mappings made in another buffer, inside that buffer', function() local first = make_two_buffers(false) - meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) - meths.nvim_buf_del_keymap(first, '', 'lhs') + api.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) + api.nvim_buf_del_keymap(first, '', 'lhs') switch_to_buf(first) -- shouldn't do anything command('normal lhs') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, 1, 1)) end) it("can't disable mappings given wrong buffer handle", function() local first, second = make_two_buffers(false) - meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) - eq('E31: No such mapping', pcall_err(meths.nvim_buf_del_keymap, second, '', 'lhs')) + api.nvim_buf_set_keymap(first, '', 'lhs', 'irhs', {}) + eq('E31: No such mapping', pcall_err(api.nvim_buf_del_keymap, second, '', 'lhs')) -- should still work switch_to_buf(first) command('normal lhs') - eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1)) + eq({ 'rhs' }, api.nvim_buf_get_lines(0, 0, 1, 1)) end) it('does not crash when setting mapping in a non-existing buffer #13541', function() - pcall_err(meths.nvim_buf_set_keymap, 100, '', 'lsh', 'irhs', {}) + pcall_err(api.nvim_buf_set_keymap, 100, '', 'lsh', 'irhs', {}) helpers.assert_alive() end) @@ -1264,7 +1264,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('aa') - eq({ 'πfoo<' }, meths.nvim_buf_get_lines(0, 0, -1, false)) + eq({ 'πfoo<' }, api.nvim_buf_get_lines(0, 0, -1, false)) end) it('can make lua expr mappings without replacing keycodes', function() @@ -1274,7 +1274,7 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function() feed('iaa') - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false)) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, false)) end) it('can overwrite lua mappings', function() diff --git a/test/functional/api/proc_spec.lua b/test/functional/api/proc_spec.lua index 82a3968ab7..50c441792c 100644 --- a/test/functional/api/proc_spec.lua +++ b/test/functional/api/proc_spec.lua @@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local eq = helpers.eq -local funcs = helpers.funcs +local fn = helpers.fn local neq = helpers.neq local nvim_argv = helpers.nvim_argv local request = helpers.request @@ -15,28 +15,28 @@ describe('API', function() describe('nvim_get_proc_children', function() it('returns child process ids', function() - local this_pid = funcs.getpid() + local this_pid = fn.getpid() -- Might be non-zero already (left-over from some other test?), -- but this is not what is tested here. local initial_children = request('nvim_get_proc_children', this_pid) - local job1 = funcs.jobstart(nvim_argv) + local job1 = fn.jobstart(nvim_argv) retry(nil, nil, function() eq(#initial_children + 1, #request('nvim_get_proc_children', this_pid)) end) - local job2 = funcs.jobstart(nvim_argv) + local job2 = fn.jobstart(nvim_argv) retry(nil, nil, function() eq(#initial_children + 2, #request('nvim_get_proc_children', this_pid)) end) - funcs.jobstop(job1) + fn.jobstop(job1) retry(nil, nil, function() eq(#initial_children + 1, #request('nvim_get_proc_children', this_pid)) end) - funcs.jobstop(job2) + fn.jobstop(job2) retry(nil, nil, function() eq(#initial_children, #request('nvim_get_proc_children', this_pid)) end) @@ -60,7 +60,7 @@ describe('API', function() describe('nvim_get_proc', function() it('returns process info', function() - local pid = funcs.getpid() + local pid = fn.getpid() local pinfo = request('nvim_get_proc', pid) eq((is_os('win') and 'nvim.exe' or 'nvim'), pinfo.name) eq(pid, pinfo.pid) diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua index c80f7f4f7b..f6058b14ee 100644 --- a/test/functional/api/server_notifications_spec.lua +++ b/test/functional/api/server_notifications_spec.lua @@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each) local assert_log = helpers.assert_log local eq, clear, eval, command, next_msg = helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.next_msg -local meths = helpers.meths +local api = helpers.api local exec_lua = helpers.exec_lua local retry = helpers.retry local assert_alive = helpers.assert_alive @@ -14,7 +14,7 @@ describe('notify', function() before_each(function() clear() - channel = meths.nvim_get_api_info()[1] + channel = api.nvim_get_api_info()[1] end) after_each(function() @@ -33,21 +33,21 @@ describe('notify', function() describe('passing 0 as the channel id', function() it('sends the notification/args to all subscribed channels', function() - meths.nvim_subscribe('event2') + api.nvim_subscribe('event2') 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()) - meths.nvim_unsubscribe('event2') - meths.nvim_subscribe('event1') + api.nvim_unsubscribe('event2') + api.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()) end) it('does not crash for deeply nested variable', function() - meths.nvim_set_var('l', {}) + api.nvim_set_var('l', {}) local nest_level = 1000 command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1)) eval('rpcnotify(' .. channel .. ', "event", g:l)') @@ -79,10 +79,10 @@ describe('notify', function() clear { env = { NVIM_LOG_FILE = testlog, } } - meths.nvim_subscribe('event1') - meths.nvim_unsubscribe('doesnotexist') + api.nvim_subscribe('event1') + api.nvim_unsubscribe('doesnotexist') assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10) - meths.nvim_unsubscribe('event1') + api.nvim_unsubscribe('event1') assert_alive() end) @@ -106,7 +106,7 @@ describe('notify', function() exec_lua([[ return {pcall(vim.rpcrequest, ..., 'nvim_eval', '1+1')}]], catchan) ) retry(nil, 3000, function() - eq({}, meths.nvim_get_chan_info(catchan)) + eq({}, api.nvim_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 e06d32f656..5e508e7513 100644 --- a/test/functional/api/server_requests_spec.lua +++ b/test/functional/api/server_requests_spec.lua @@ -4,10 +4,10 @@ local helpers = require('test.functional.helpers')(after_each) local clear, eval = helpers.clear, helpers.eval local eq, neq, run, stop = helpers.eq, helpers.neq, helpers.run, helpers.stop -local nvim_prog, command, funcs = helpers.nvim_prog, helpers.command, helpers.funcs +local nvim_prog, command, fn = helpers.nvim_prog, helpers.command, helpers.fn local source, next_msg = helpers.source, helpers.next_msg local ok = helpers.ok -local meths = helpers.meths +local api = helpers.api local spawn, merge_args = helpers.spawn, helpers.merge_args local set_session = helpers.set_session local pcall_err = helpers.pcall_err @@ -18,7 +18,7 @@ describe('server -> client', function() before_each(function() clear() - cid = meths.nvim_get_api_info()[1] + cid = api.nvim_get_api_info()[1] end) it('handles unexpected closed stream while preparing RPC response', function() @@ -77,15 +77,15 @@ describe('server -> client', function() describe('recursive call', function() it('works', function() local function on_setup() - meths.nvim_set_var('result1', 0) - meths.nvim_set_var('result2', 0) - meths.nvim_set_var('result3', 0) - meths.nvim_set_var('result4', 0) + api.nvim_set_var('result1', 0) + api.nvim_set_var('result2', 0) + api.nvim_set_var('result3', 0) + api.nvim_set_var('result4', 0) command('let g:result1 = rpcrequest(' .. cid .. ', "rcall", 2)') - eq(4, meths.nvim_get_var('result1')) - eq(8, meths.nvim_get_var('result2')) - eq(16, meths.nvim_get_var('result3')) - eq(32, meths.nvim_get_var('result4')) + eq(4, api.nvim_get_var('result1')) + eq(8, api.nvim_get_var('result2')) + eq(16, api.nvim_get_var('result3')) + eq(32, api.nvim_get_var('result4')) stop() end @@ -113,12 +113,12 @@ 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', fn.rpcrequest(cid, 'doit')) stop() end local function on_request(method) if method == 'doit' then - funcs.rpcnotify(cid, 'headsup') + fn.rpcnotify(cid, 'headsup') eq(true, received) return 'retval' end @@ -231,8 +231,8 @@ describe('server -> client', function() describe('jobstart()', function() local jobid before_each(function() - local channel = meths.nvim_get_api_info()[1] - meths.nvim_set_var('channel', channel) + local channel = api.nvim_get_api_info()[1] + api.nvim_set_var('channel', channel) source([[ function! s:OnEvent(id, data, event) call rpcnotify(g:channel, a:event, 0, a:data) @@ -244,7 +244,7 @@ describe('server -> client', function() \ 'rpc': v:true \ } ]]) - meths.nvim_set_var('args', { + api.nvim_set_var('args', { nvim_prog, '-ll', 'test/functional/api/rpc_fixture.lua', @@ -256,7 +256,7 @@ describe('server -> client', function() end) after_each(function() - pcall(funcs.jobstop, jobid) + pcall(fn.jobstop, jobid) end) if helpers.skip(helpers.is_os('win')) then @@ -264,16 +264,16 @@ describe('server -> client', function() end it('rpc and text stderr can be combined', function() - local status, rv = pcall(funcs.rpcrequest, jobid, 'poll') + local status, rv = pcall(fn.rpcrequest, jobid, 'poll') if not status then error(string.format('missing nvim Lua module? (%s)', rv)) end eq('ok', rv) - funcs.rpcnotify(jobid, 'ping') + fn.rpcnotify(jobid, 'ping') eq({ 'notification', 'pong', {} }, next_msg()) - eq('done!', funcs.rpcrequest(jobid, 'write_stderr', 'fluff\n')) + eq('done!', fn.rpcrequest(jobid, 'write_stderr', 'fluff\n')) eq({ 'notification', 'stderr', { 0, { 'fluff', '' } } }, next_msg()) - pcall(funcs.rpcrequest, jobid, 'exit') + pcall(fn.rpcrequest, jobid, 'exit') eq({ 'notification', 'stderr', { 0, { '' } } }, next_msg()) eq({ 'notification', 'exit', { 0, 0 } }, next_msg()) end) @@ -282,29 +282,29 @@ describe('server -> client', function() describe('connecting to another (peer) nvim', function() local nvim_argv = merge_args(helpers.nvim_argv, { '--headless' }) local function connect_test(server, mode, address) - local serverpid = funcs.getpid() + local serverpid = fn.getpid() local client = spawn(nvim_argv, false, nil, true) set_session(client) - local clientpid = funcs.getpid() + local clientpid = fn.getpid() neq(serverpid, clientpid) - local id = funcs.sockconnect(mode, address, { rpc = true }) + local id = fn.sockconnect(mode, address, { rpc = true }) ok(id > 0) - funcs.rpcrequest(id, 'nvim_set_current_line', 'hello') - local client_id = funcs.rpcrequest(id, 'nvim_get_api_info')[1] + fn.rpcrequest(id, 'nvim_set_current_line', 'hello') + local client_id = fn.rpcrequest(id, 'nvim_get_api_info')[1] set_session(server) - eq(serverpid, funcs.getpid()) - eq('hello', meths.nvim_get_current_line()) + eq(serverpid, fn.getpid()) + eq('hello', api.nvim_get_current_line()) -- method calls work both ways - funcs.rpcrequest(client_id, 'nvim_set_current_line', 'howdy!') - eq(id, funcs.rpcrequest(client_id, 'nvim_get_api_info')[1]) + fn.rpcrequest(client_id, 'nvim_set_current_line', 'howdy!') + eq(id, fn.rpcrequest(client_id, 'nvim_get_api_info')[1]) set_session(client) - eq(clientpid, funcs.getpid()) - eq('howdy!', meths.nvim_get_current_line()) + eq(clientpid, fn.getpid()) + eq('howdy!', api.nvim_get_current_line()) server:close() client:close() @@ -313,7 +313,7 @@ describe('server -> client', function() it('via named pipe', function() local server = spawn(nvim_argv) set_session(server) - local address = funcs.serverlist()[1] + local address = fn.serverlist()[1] local first = string.sub(address, 1, 1) ok(first == '/' or first == '\\') connect_test(server, 'pipe', address) @@ -322,7 +322,7 @@ 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(fn.serverstart, '127.0.0.1:') if not status then pending('no ipv4 stack') end @@ -333,7 +333,7 @@ describe('server -> client', function() it('via ipv6 address', function() local server = spawn(nvim_argv) set_session(server) - local status, address = pcall(funcs.serverstart, '::1:') + local status, address = pcall(fn.serverstart, '::1:') if not status then pending('no ipv6 stack') end @@ -344,7 +344,7 @@ describe('server -> client', function() it('via hostname', function() local server = spawn(nvim_argv) set_session(server) - local address = funcs.serverstart('localhost:') + local address = fn.serverstart('localhost:') eq('localhost:', string.sub(address, 1, 10)) connect_test(server, 'tcp', address) end) @@ -352,12 +352,12 @@ describe('server -> client', function() it('does not crash on receiving UI events', function() local server = spawn(nvim_argv) set_session(server) - local address = funcs.serverlist()[1] + local address = fn.serverlist()[1] local client = spawn(nvim_argv, false, nil, true) set_session(client) - local id = funcs.sockconnect('pipe', address, { rpc = true }) - funcs.rpcrequest(id, 'nvim_ui_attach', 80, 24, {}) + local id = fn.sockconnect('pipe', address, { rpc = true }) + fn.rpcrequest(id, 'nvim_ui_attach', 80, 24, {}) assert_alive() server:close() @@ -367,18 +367,18 @@ describe('server -> client', function() describe('connecting to its own pipe address', function() it('does not deadlock', function() - local address = funcs.serverlist()[1] + local address = fn.serverlist()[1] local first = string.sub(address, 1, 1) ok(first == '/' or first == '\\') - local serverpid = funcs.getpid() + local serverpid = fn.getpid() - local id = funcs.sockconnect('pipe', address, { rpc = true }) + local id = fn.sockconnect('pipe', address, { rpc = true }) - funcs.rpcrequest(id, 'nvim_set_current_line', 'hello') - eq('hello', meths.nvim_get_current_line()) - eq(serverpid, funcs.rpcrequest(id, 'nvim_eval', 'getpid()')) + fn.rpcrequest(id, 'nvim_set_current_line', 'hello') + eq('hello', api.nvim_get_current_line()) + eq(serverpid, fn.rpcrequest(id, 'nvim_eval', 'getpid()')) - eq(id, funcs.rpcrequest(id, 'nvim_get_api_info')[1]) + eq(id, fn.rpcrequest(id, 'nvim_get_api_info')[1]) end) end) end) diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua index 830b547da5..65b030fc60 100644 --- a/test/functional/api/tabpage_spec.lua +++ b/test/functional/api/tabpage_spec.lua @@ -1,7 +1,7 @@ local helpers = require('test.functional.helpers')(after_each) local clear, eq, ok = helpers.clear, helpers.eq, helpers.ok -local meths = helpers.meths -local funcs = helpers.funcs +local api = helpers.api +local fn = helpers.fn local request = helpers.request local NIL = vim.NIL local pcall_err = helpers.pcall_err @@ -14,33 +14,33 @@ describe('api/tabpage', function() it('works', function() helpers.command('tabnew') helpers.command('vsplit') - local tab1, tab2 = unpack(meths.nvim_list_tabpages()) - local win1, win2, win3 = unpack(meths.nvim_list_wins()) - eq({ win1 }, meths.nvim_tabpage_list_wins(tab1)) - eq({ win2, win3 }, meths.nvim_tabpage_list_wins(tab2)) - eq(win2, meths.nvim_tabpage_get_win(tab2)) - meths.nvim_set_current_win(win3) - eq(win3, meths.nvim_tabpage_get_win(tab2)) + local tab1, tab2 = unpack(api.nvim_list_tabpages()) + local win1, win2, win3 = unpack(api.nvim_list_wins()) + eq({ win1 }, api.nvim_tabpage_list_wins(tab1)) + eq({ win2, win3 }, api.nvim_tabpage_list_wins(tab2)) + eq(win2, api.nvim_tabpage_get_win(tab2)) + api.nvim_set_current_win(win3) + eq(win3, api.nvim_tabpage_get_win(tab2)) end) it('validates args', function() - eq('Invalid tabpage id: 23', pcall_err(meths.nvim_tabpage_list_wins, 23)) + eq('Invalid tabpage id: 23', pcall_err(api.nvim_tabpage_list_wins, 23)) end) end) describe('{get,set,del}_var', function() it('works', function() - meths.nvim_tabpage_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_tabpage_get_var(0, 'lua')) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('t:lua')) - eq(1, funcs.exists('t:lua')) - meths.nvim_tabpage_del_var(0, 'lua') - eq(0, funcs.exists('t:lua')) - eq('Key not found: lua', pcall_err(meths.nvim_tabpage_del_var, 0, 'lua')) - meths.nvim_tabpage_set_var(0, 'lua', 1) + api.nvim_tabpage_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_tabpage_get_var(0, 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_eval('t:lua')) + eq(1, fn.exists('t:lua')) + api.nvim_tabpage_del_var(0, 'lua') + eq(0, fn.exists('t:lua')) + eq('Key not found: lua', pcall_err(api.nvim_tabpage_del_var, 0, 'lua')) + api.nvim_tabpage_set_var(0, 'lua', 1) command('lockvar t:lua') - eq('Key is locked: lua', pcall_err(meths.nvim_tabpage_del_var, 0, 'lua')) - eq('Key is locked: lua', pcall_err(meths.nvim_tabpage_set_var, 0, 'lua', 1)) + eq('Key is locked: lua', pcall_err(api.nvim_tabpage_del_var, 0, 'lua')) + eq('Key is locked: lua', pcall_err(api.nvim_tabpage_set_var, 0, 'lua', 1)) end) it('tabpage_set_var returns the old value', function() @@ -61,28 +61,28 @@ describe('api/tabpage', function() describe('get_number', function() it('works', function() - local tabs = meths.nvim_list_tabpages() - eq(1, meths.nvim_tabpage_get_number(tabs[1])) + local tabs = api.nvim_list_tabpages() + eq(1, api.nvim_tabpage_get_number(tabs[1])) helpers.command('tabnew') - local tab1, tab2 = unpack(meths.nvim_list_tabpages()) - eq(1, meths.nvim_tabpage_get_number(tab1)) - eq(2, meths.nvim_tabpage_get_number(tab2)) + local tab1, tab2 = unpack(api.nvim_list_tabpages()) + eq(1, api.nvim_tabpage_get_number(tab1)) + eq(2, api.nvim_tabpage_get_number(tab2)) helpers.command('-tabmove') - eq(2, meths.nvim_tabpage_get_number(tab1)) - eq(1, meths.nvim_tabpage_get_number(tab2)) + eq(2, api.nvim_tabpage_get_number(tab1)) + eq(1, api.nvim_tabpage_get_number(tab2)) end) end) describe('is_valid', function() it('works', function() helpers.command('tabnew') - local tab = meths.nvim_list_tabpages()[2] - meths.nvim_set_current_tabpage(tab) - ok(meths.nvim_tabpage_is_valid(tab)) + local tab = api.nvim_list_tabpages()[2] + api.nvim_set_current_tabpage(tab) + ok(api.nvim_tabpage_is_valid(tab)) helpers.command('tabclose') - ok(not meths.nvim_tabpage_is_valid(tab)) + ok(not api.nvim_tabpage_is_valid(tab)) end) end) end) diff --git a/test/functional/api/ui_spec.lua b/test/functional/api/ui_spec.lua index e74a35e97e..3e1f1ec965 100644 --- a/test/functional/api/ui_spec.lua +++ b/test/functional/api/ui_spec.lua @@ -6,7 +6,7 @@ local eq = helpers.eq local eval = helpers.eval local exec = helpers.exec local feed = helpers.feed -local meths = helpers.meths +local api = helpers.api local request = helpers.request local pcall_err = helpers.pcall_err @@ -23,39 +23,39 @@ describe('nvim_ui_attach()', function() end) it('validation', function() - eq('No such UI option: foo', pcall_err(meths.nvim_ui_attach, 80, 24, { foo = { 'foo' } })) + eq('No such UI option: foo', pcall_err(api.nvim_ui_attach, 80, 24, { foo = { 'foo' } })) eq( "Invalid 'ext_linegrid': expected Boolean, got Array", - pcall_err(meths.nvim_ui_attach, 80, 24, { ext_linegrid = {} }) + pcall_err(api.nvim_ui_attach, 80, 24, { ext_linegrid = {} }) ) eq( "Invalid 'override': expected Boolean, got Array", - pcall_err(meths.nvim_ui_attach, 80, 24, { override = {} }) + pcall_err(api.nvim_ui_attach, 80, 24, { override = {} }) ) eq( "Invalid 'rgb': expected Boolean, got Array", - pcall_err(meths.nvim_ui_attach, 80, 24, { rgb = {} }) + pcall_err(api.nvim_ui_attach, 80, 24, { rgb = {} }) ) eq( "Invalid 'term_name': expected String, got Boolean", - pcall_err(meths.nvim_ui_attach, 80, 24, { term_name = true }) + pcall_err(api.nvim_ui_attach, 80, 24, { term_name = true }) ) eq( "Invalid 'term_colors': expected Integer, got Boolean", - pcall_err(meths.nvim_ui_attach, 80, 24, { term_colors = true }) + pcall_err(api.nvim_ui_attach, 80, 24, { term_colors = true }) ) eq( "Invalid 'stdin_fd': expected Integer, got String", - pcall_err(meths.nvim_ui_attach, 80, 24, { stdin_fd = 'foo' }) + pcall_err(api.nvim_ui_attach, 80, 24, { stdin_fd = 'foo' }) ) eq( "Invalid 'stdin_tty': expected Boolean, got String", - pcall_err(meths.nvim_ui_attach, 80, 24, { stdin_tty = 'foo' }) + pcall_err(api.nvim_ui_attach, 80, 24, { stdin_tty = 'foo' }) ) eq( "Invalid 'stdout_tty': expected Boolean, got String", - pcall_err(meths.nvim_ui_attach, 80, 24, { stdout_tty = 'foo' }) + pcall_err(api.nvim_ui_attach, 80, 24, { stdout_tty = 'foo' }) ) eq('UI not attached to channel: 1', pcall_err(request, 'nvim_ui_try_resize', 40, 10)) @@ -117,17 +117,17 @@ it('autocmds VimSuspend/VimResume #22041', function() end) eq({ 's', 'r', 's' }, eval('g:ev')) screen.suspended = false - meths.nvim_input_mouse('move', '', '', 0, 0, 0) + api.nvim_input_mouse('move', '', '', 0, 0, 0) eq({ 's', 'r', 's', 'r' }, eval('g:ev')) feed('') screen:expect(function() eq(true, screen.suspended) end) - meths.nvim_ui_set_focus(false) + api.nvim_ui_set_focus(false) eq({ 's', 'r', 's', 'r', 's' }, eval('g:ev')) screen.suspended = false - meths.nvim_ui_set_focus(true) + api.nvim_ui_set_focus(true) eq({ 's', 'r', 's', 'r', 's', 'r' }, eval('g:ev')) command('suspend | suspend | suspend') diff --git a/test/functional/api/version_spec.lua b/test/functional/api/version_spec.lua index fefafb8f98..c304f1aa88 100644 --- a/test/functional/api/version_spec.lua +++ b/test/functional/api/version_spec.lua @@ -1,7 +1,6 @@ local helpers = require('test.functional.helpers')(after_each) -local clear, funcs, eq = helpers.clear, helpers.funcs, helpers.eq -local call = helpers.call -local meths = helpers.meths +local clear, fn, eq = helpers.clear, helpers.fn, helpers.eq +local api = helpers.api local function read_mpack_file(fname) local fd = io.open(fname, 'rb') @@ -19,7 +18,7 @@ describe("api_info()['version']", function() before_each(clear) it('returns API level', function() - local version = call('api_info')['version'] + local version = fn.api_info()['version'] local current = version['api_level'] local compat = version['api_compatible'] eq('number', type(current)) @@ -28,7 +27,7 @@ describe("api_info()['version']", function() end) it('returns Nvim version', function() - local version = call('api_info')['version'] + local version = fn.api_info()['version'] local major = version['major'] local minor = version['minor'] local patch = version['patch'] @@ -38,10 +37,10 @@ describe("api_info()['version']", function() 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)) + eq(1, fn.has('nvim-' .. major .. '.' .. minor .. '.' .. patch)) + eq(0, fn.has('nvim-' .. major .. '.' .. minor .. '.' .. (patch + 1))) + eq(0, fn.has('nvim-' .. major .. '.' .. (minor + 1) .. '.' .. patch)) + eq(0, fn.has('nvim-' .. (major + 1) .. '.' .. minor .. '.' .. patch)) assert(build == nil or type(build) == 'string') end) end) @@ -90,14 +89,14 @@ describe('api metadata', function() end end - local api, compat, stable, api_level + local api_info, compat, stable, api_level local old_api = {} setup(function() clear() -- Ensure a session before requesting api_info. - api = meths.nvim_get_api_info()[2] - compat = api.version.api_compatible - api_level = api.version.api_level - if api.version.api_prerelease then + api_info = api.nvim_get_api_info()[2] + compat = api_info.version.api_compatible + api_level = api_info.version.api_level + if api_info.version.api_prerelease then stable = api_level - 1 else stable = api_level @@ -108,7 +107,7 @@ describe('api metadata', function() old_api[level] = read_mpack_file(path) if old_api[level] == nil then local errstr = 'missing metadata fixture for stable level ' .. level .. '. ' - if level == api_level and not api.version.api_prerelease then + if level == api_level and not api_info.version.api_prerelease then errstr = ( errstr .. 'If NVIM_API_CURRENT was bumped, ' @@ -125,7 +124,7 @@ describe('api metadata', function() end) it('functions are compatible with old metadata or have new level', function() - local funcs_new = name_table(api.functions) + local funcs_new = name_table(api_info.functions) local funcs_compat = {} for level = compat, stable do for _, f in ipairs(old_api[level].functions) do @@ -146,7 +145,7 @@ describe('api metadata', function() funcs_compat[level] = name_table(old_api[level].functions) end - for _, f in ipairs(api.functions) do + for _, f in ipairs(api_info.functions) do if f.since <= stable then local f_old = funcs_compat[f.since][f.name] if f_old == nil then @@ -159,7 +158,7 @@ describe('api metadata', function() .. (stable + 1) .. '.' ) - if not api.version.api_prerelease then + if not api_info.version.api_prerelease then errstr = ( errstr .. ' Also bump NVIM_API_CURRENT and set ' @@ -172,7 +171,7 @@ describe('api metadata', function() end end elseif f.since > api_level then - if api.version.api_prerelease then + if api_info.version.api_prerelease then error('New function ' .. f.name .. ' should use since value ' .. api_level) else error( @@ -188,7 +187,7 @@ describe('api metadata', function() end) 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_new = name_table(api_info.ui_events) local ui_events_compat = {} -- UI events were formalized in level 3 @@ -202,7 +201,7 @@ 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_info.ui_events) do if e.since <= stable then local e_old = ui_events_compat[e.since][e.name] if e_old == nil then @@ -214,7 +213,7 @@ describe('api metadata', function() .. (stable + 1) .. '.' ) - if not api.version.api_prerelease then + if not api_info.version.api_prerelease then errstr = ( errstr .. ' Also bump NVIM_API_CURRENT and set ' @@ -224,7 +223,7 @@ describe('api metadata', function() error(errstr) end elseif e.since > api_level then - if api.version.api_prerelease then + if api_info.version.api_prerelease then error('New UI event ' .. e.name .. ' should use since value ' .. api_level) else error( @@ -241,7 +240,7 @@ describe('api metadata', function() it('ui_options are preserved from older levels', function() local available_options = {} - for _, option in ipairs(api.ui_options) do + for _, option in ipairs(api_info.ui_options) do available_options[option] = true end -- UI options were versioned from level 4 diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index ba2042d585..aa3b4419cc 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -8,13 +8,13 @@ local assert_alive = helpers.assert_alive local NIL = vim.NIL local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq local command = helpers.command -local command_output = helpers.meths.command_output +local command_output = helpers.api.command_output local exec = helpers.exec local exec_capture = helpers.exec_capture local eval = helpers.eval local expect = helpers.expect -local funcs = helpers.funcs -local meths = helpers.meths +local fn = helpers.fn +local api = helpers.api local matches = helpers.matches local pesc = vim.pesc local mkdir_p = helpers.mkdir_p @@ -71,7 +71,7 @@ describe('API', function() end) it('handles errors in async requests', function() - local error_types = meths.nvim_get_api_info()[2].error_types + local error_types = api.nvim_get_api_info()[2].error_types nvim_async('bogus') eq({ 'notification', @@ -83,7 +83,7 @@ describe('API', function() end) it('failed async request emits nvim_error_event', function() - local error_types = meths.nvim_get_api_info()[2].error_types + local error_types = api.nvim_get_api_info()[2].error_types nvim_async('command', 'bogus') eq({ 'notification', @@ -98,37 +98,37 @@ describe('API', function() command('split') command('autocmd WinEnter * startinsert') command('wincmd w') - eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'i', blocking = false }, api.nvim_get_mode()) end) describe('nvim_exec2', function() it('always returns table', function() -- In built version this results into `vim.empty_dict()` - eq({}, meths.nvim_exec2('echo "Hello"', {})) - eq({}, meths.nvim_exec2('echo "Hello"', { output = false })) - eq({ output = 'Hello' }, meths.nvim_exec2('echo "Hello"', { output = true })) + eq({}, api.nvim_exec2('echo "Hello"', {})) + eq({}, api.nvim_exec2('echo "Hello"', { output = false })) + eq({ output = 'Hello' }, api.nvim_exec2('echo "Hello"', { output = true })) end) it('default options', function() -- Should be equivalent to { output = false } - meths.nvim_exec2("let x0 = 'a'", {}) - eq('a', meths.nvim_get_var('x0')) + api.nvim_exec2("let x0 = 'a'", {}) + eq('a', api.nvim_get_var('x0')) end) it('one-line input', function() - meths.nvim_exec2("let x1 = 'a'", { output = false }) - eq('a', meths.nvim_get_var('x1')) + api.nvim_exec2("let x1 = 'a'", { output = false }) + eq('a', api.nvim_get_var('x1')) end) it(':verbose set {option}?', function() - meths.nvim_exec2('set nowrap', { output = false }) + api.nvim_exec2('set nowrap', { output = false }) eq( { output = 'nowrap\n\tLast set from anonymous :source' }, - meths.nvim_exec2('verbose set wrap?', { output = true }) + api.nvim_exec2('verbose set wrap?', { output = true }) ) -- Using script var to force creation of a script item - meths.nvim_exec2( + api.nvim_exec2( [[ let s:a = 1 set nowrap @@ -137,39 +137,39 @@ describe('API', function() ) eq( { output = 'nowrap\n\tLast set from anonymous :source (script id 1)' }, - meths.nvim_exec2('verbose set wrap?', { output = true }) + api.nvim_exec2('verbose set wrap?', { output = true }) ) end) it('multiline input', function() -- Heredoc + empty lines. - meths.nvim_exec2("let x2 = 'a'\n", { output = false }) - eq('a', meths.nvim_get_var('x2')) - meths.nvim_exec2('lua <")->empty() let s:a = 123 @@ -241,7 +241,7 @@ describe('API', function() eq( { output = '1\n0' }, - meths.nvim_exec2( + api.nvim_exec2( [[ echo expand("")->empty() function s:a() abort @@ -254,7 +254,7 @@ describe('API', function() end) it('non-ASCII input', function() - meths.nvim_exec2( + api.nvim_exec2( [=[ new exe "normal! i ax \n Ax " @@ -263,11 +263,11 @@ describe('API', function() { output = false } ) command('1') - eq(' --a1234-- ', meths.nvim_get_current_line()) + eq(' --a1234-- ', api.nvim_get_current_line()) command('2') - eq(' --A1234-- ', meths.nvim_get_current_line()) + eq(' --A1234-- ', api.nvim_get_current_line()) - meths.nvim_exec2( + api.nvim_exec2( [[ new call setline(1,['xxx']) @@ -276,7 +276,7 @@ describe('API', function() ]], { output = false } ) - eq('ñxx', meths.nvim_get_current_line()) + eq('ñxx', api.nvim_get_current_line()) end) it('execution error', function() @@ -284,7 +284,7 @@ describe('API', function() 'nvim_exec2(): Vim:E492: Not an editor command: bogus_command', pcall_err(request, 'nvim_exec2', 'bogus_command', {}) ) - eq('', meths.nvim_eval('v:errmsg')) -- v:errmsg was not updated. + eq('', api.nvim_eval('v:errmsg')) -- v:errmsg was not updated. eq('', eval('v:exception')) eq( @@ -319,7 +319,7 @@ describe('API', function() write_file(fname, 'echo "hello"\n') local sourcing_fname = tmpname() write_file(sourcing_fname, 'call nvim_exec2("source ' .. fname .. '", {"output": v:false})\n') - meths.nvim_exec2('set verbose=2', { output = false }) + api.nvim_exec2('set verbose=2', { output = false }) local traceback_output = dedent([[ line 0: sourcing "%s" line 0: sourcing "%s" @@ -336,7 +336,7 @@ describe('API', function() ) eq( { output = traceback_output }, - meths.nvim_exec2( + api.nvim_exec2( 'call nvim_exec2("source ' .. sourcing_fname .. '", {"output": v:false})', { output = true } ) @@ -348,10 +348,10 @@ describe('API', function() it('returns output', function() eq( { output = 'this is spinal tap' }, - meths.nvim_exec2('lua <]]) + api.nvim_input([[:echo "hi\nhi2"]]) -- Verify hit-enter prompt. - eq({ mode = 'r', blocking = true }, meths.nvim_get_mode()) - meths.nvim_input([[]]) + eq({ mode = 'r', blocking = true }, api.nvim_get_mode()) + api.nvim_input([[]]) -- Verify NO hit-enter prompt. command_output([[echo "hi\nhi2"]]) - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('captures command output', function() @@ -500,7 +500,7 @@ describe('API', function() 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 }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('Vimscript execution error: fails with specific error', function() @@ -509,7 +509,7 @@ describe('API', function() 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 }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('does not cause heap buffer overflow with large output', function() @@ -521,12 +521,12 @@ describe('API', function() it('works', function() command('let g:v1 = "a"') command('let g:v2 = [1, 2, {"v3": 3}]') - eq({ v1 = 'a', v2 = { 1, 2, { v3 = 3 } } }, meths.nvim_eval('g:')) + eq({ v1 = 'a', v2 = { 1, 2, { v3 = 3 } } }, api.nvim_eval('g:')) end) it('handles NULL-initialized strings correctly', function() - eq(1, meths.nvim_eval("matcharg(1) == ['', '']")) - eq({ '', '' }, meths.nvim_eval('matcharg(1)')) + eq(1, api.nvim_eval("matcharg(1) == ['', '']")) + eq({ '', '' }, api.nvim_eval('matcharg(1)')) end) it('works under deprecated name', function() @@ -541,10 +541,10 @@ describe('API', function() describe('nvim_call_function', function() it('works', function() - meths.nvim_call_function('setqflist', { { { filename = 'something', lnum = 17 } }, 'r' }) - eq(17, meths.nvim_call_function('getqflist', {})[1].lnum) - eq(17, meths.nvim_call_function('eval', { 17 })) - eq('foo', meths.nvim_call_function('simplify', { 'this/./is//redundant/../../../foo' })) + api.nvim_call_function('setqflist', { { { filename = 'something', lnum = 17 } }, 'r' }) + eq(17, api.nvim_call_function('getqflist', {})[1].lnum) + eq(17, api.nvim_call_function('eval', { 17 })) + eq('foo', api.nvim_call_function('simplify', { 'this/./is//redundant/../../../foo' })) end) it('Vimscript validation error: returns specific error, does NOT update v:errmsg', function() @@ -619,18 +619,18 @@ describe('API', function() ]]) -- :help Dictionary-function - eq('Hello, World!', meths.nvim_call_dict_function('g:test_dict_fn', 'F', { 'World' })) + eq('Hello, World!', api.nvim_call_dict_function('g:test_dict_fn', 'F', { 'World' })) -- Funcref is sent as NIL over RPC. - eq({ greeting = 'Hello', F = NIL }, meths.nvim_get_var('test_dict_fn')) + eq({ greeting = 'Hello', F = NIL }, api.nvim_get_var('test_dict_fn')) -- :help numbered-function - eq('Hi, Moon ...', meths.nvim_call_dict_function('g:test_dict_fn2', 'F2', { 'Moon' })) + eq('Hi, Moon ...', api.nvim_call_dict_function('g:test_dict_fn2', 'F2', { 'Moon' })) -- Funcref is sent as NIL over RPC. - eq({ greeting = 'Hi', F2 = NIL }, meths.nvim_get_var('test_dict_fn2')) + eq({ greeting = 'Hi', F2 = NIL }, api.nvim_get_var('test_dict_fn2')) -- Function specified via RPC dict. source('function! G() dict\n return "@".(self.result)."@"\nendfunction') - eq('@it works@', meths.nvim_call_dict_function({ result = 'it works', G = 'G' }, 'G', {})) + eq('@it works@', api.nvim_call_dict_function({ result = 'it works', G = 'G' }, 'G', {})) end) it('validation', function() @@ -675,8 +675,8 @@ describe('API', function() local start_dir before_each(function() - funcs.mkdir('Xtestdir') - start_dir = funcs.getcwd() + fn.mkdir('Xtestdir') + start_dir = fn.getcwd() end) after_each(function() @@ -684,84 +684,84 @@ describe('API', function() end) it('works', function() - meths.nvim_set_current_dir('Xtestdir') - eq(funcs.getcwd(), start_dir .. helpers.get_pathsep() .. 'Xtestdir') + api.nvim_set_current_dir('Xtestdir') + eq(fn.getcwd(), start_dir .. helpers.get_pathsep() .. 'Xtestdir') end) it('sets previous directory', function() - meths.nvim_set_current_dir('Xtestdir') + api.nvim_set_current_dir('Xtestdir') command('cd -') - eq(funcs.getcwd(), start_dir) + eq(fn.getcwd(), start_dir) end) end) describe('nvim_exec_lua', function() it('works', function() - meths.nvim_exec_lua('vim.api.nvim_set_var("test", 3)', {}) - eq(3, meths.nvim_get_var('test')) + api.nvim_exec_lua('vim.api.nvim_set_var("test", 3)', {}) + eq(3, api.nvim_get_var('test')) - eq(17, meths.nvim_exec_lua('a, b = ...\nreturn a + b', { 10, 7 })) + eq(17, api.nvim_exec_lua('a, b = ...\nreturn a + b', { 10, 7 })) - eq(NIL, meths.nvim_exec_lua('function xx(a,b)\nreturn a..b\nend', {})) - eq('xy', meths.nvim_exec_lua('return xx(...)', { 'x', 'y' })) + eq(NIL, api.nvim_exec_lua('function xx(a,b)\nreturn a..b\nend', {})) + eq('xy', api.nvim_exec_lua('return xx(...)', { 'x', 'y' })) -- Deprecated name: nvim_execute_lua. - eq('xy', meths.nvim_execute_lua('return xx(...)', { 'x', 'y' })) + eq('xy', api.nvim_execute_lua('return xx(...)', { 'x', 'y' })) end) it('reports errors', function() eq( [[Error loading lua: [string ""]:0: '=' expected near '+']], - pcall_err(meths.nvim_exec_lua, 'a+*b', {}) + pcall_err(api.nvim_exec_lua, 'a+*b', {}) ) eq( [[Error loading lua: [string ""]:0: unexpected symbol near '1']], - pcall_err(meths.nvim_exec_lua, '1+2', {}) + pcall_err(api.nvim_exec_lua, '1+2', {}) ) eq( [[Error loading lua: [string ""]:0: unexpected symbol]], - pcall_err(meths.nvim_exec_lua, 'aa=bb\0', {}) + pcall_err(api.nvim_exec_lua, 'aa=bb\0', {}) ) eq( [[attempt to call global 'bork' (a nil value)]], - pcall_err(meths.nvim_exec_lua, 'bork()', {}) + pcall_err(api.nvim_exec_lua, 'bork()', {}) ) - eq('did\nthe\nfail', pcall_err(meths.nvim_exec_lua, 'error("did\\nthe\\nfail")', {})) + eq('did\nthe\nfail', pcall_err(api.nvim_exec_lua, 'error("did\\nthe\\nfail")', {})) end) it('uses native float values', function() - eq(2.5, meths.nvim_exec_lua('return select(1, ...)', { 2.5 })) - eq('2.5', meths.nvim_exec_lua('return vim.inspect(...)', { 2.5 })) + eq(2.5, api.nvim_exec_lua('return select(1, ...)', { 2.5 })) + eq('2.5', api.nvim_exec_lua('return vim.inspect(...)', { 2.5 })) -- "special" float values are still accepted as return values. - eq(2.5, meths.nvim_exec_lua("return vim.api.nvim_eval('2.5')", {})) + eq(2.5, api.nvim_exec_lua("return vim.api.nvim_eval('2.5')", {})) eq( '{\n [false] = 2.5,\n [true] = 3\n}', - meths.nvim_exec_lua("return vim.inspect(vim.api.nvim_eval('2.5'))", {}) + api.nvim_exec_lua("return vim.inspect(vim.api.nvim_eval('2.5'))", {}) ) end) end) describe('nvim_notify', function() it('can notify a info message', function() - meths.nvim_notify('hello world', 2, {}) + api.nvim_notify('hello world', 2, {}) end) it('can be overridden', function() command('lua vim.notify = function(...) return 42 end') - eq(42, meths.nvim_exec_lua("return vim.notify('Hello world')", {})) - meths.nvim_notify('hello world', 4, {}) + eq(42, api.nvim_exec_lua("return vim.notify('Hello world')", {})) + api.nvim_notify('hello world', 4, {}) end) end) describe('nvim_input', function() it('Vimscript error: does NOT fail, updates v:errmsg', function() - local status, _ = pcall(meths.nvim_input, ':call bogus_fn()') - local v_errnum = string.match(meths.nvim_eval('v:errmsg'), 'E%d*:') + local status, _ = pcall(api.nvim_input, ':call bogus_fn()') + local v_errnum = string.match(api.nvim_eval('v:errmsg'), 'E%d*:') eq(true, status) -- nvim_input() did not fail. eq('E117:', v_errnum) -- v:errmsg was updated. end) @@ -779,23 +779,23 @@ describe('API', function() end) local function run_streamed_paste_tests() it('stream: multiple chunks form one undo-block', function() - meths.nvim_paste('1/chunk 1 (start)\n', true, 1) - meths.nvim_paste('1/chunk 2 (end)\n', true, 3) + api.nvim_paste('1/chunk 1 (start)\n', true, 1) + api.nvim_paste('1/chunk 2 (end)\n', true, 3) local expected1 = [[ 1/chunk 1 (start) 1/chunk 2 (end) ]] expect(expected1) - meths.nvim_paste('2/chunk 1 (start)\n', true, 1) - meths.nvim_paste('2/chunk 2\n', true, 2) + api.nvim_paste('2/chunk 1 (start)\n', true, 1) + api.nvim_paste('2/chunk 2\n', true, 2) expect([[ 1/chunk 1 (start) 1/chunk 2 (end) 2/chunk 1 (start) 2/chunk 2 ]]) - meths.nvim_paste('2/chunk 3\n', true, 2) - meths.nvim_paste('2/chunk 4 (end)\n', true, 3) + api.nvim_paste('2/chunk 3\n', true, 2) + api.nvim_paste('2/chunk 4 (end)\n', true, 3) expect([[ 1/chunk 1 (start) 1/chunk 2 (end) @@ -811,10 +811,10 @@ describe('API', function() -- If nvim_paste() calls :undojoin without making any changes, this makes it an error. feed('afoou') feed('i') - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('aaaaaabbbbbbccccccdddddd') feed('u') expect('') @@ -830,17 +830,17 @@ describe('API', function() expect('') end) it('pasting one line', function() - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('aaaaaabbbbbbccccccdddddd') end) it('pasting multiple lines', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ aaaaaa bbbbbb @@ -860,17 +860,17 @@ describe('API', function() expect('||') end) it('pasting one line', function() - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('|aaaaaabbbbbbccccccdddddd|') end) it('pasting multiple lines', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ |aaaaaa bbbbbb @@ -890,17 +890,17 @@ describe('API', function() expect('||') end) it('pasting one line', function() - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('||aaaaaabbbbbbccccccdddddd') end) it('pasting multiple lines', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ ||aaaaaa bbbbbb @@ -924,24 +924,24 @@ describe('API', function() xxx|]]) end) it('with non-empty chunks', function() - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('|aaaaaabbbbbbccccccdddddd|') end) it('with empty first chunk', function() - meths.nvim_paste('', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('|bbbbbbccccccdddddd|') end) it('with all chunks empty', function() - meths.nvim_paste('', false, 1) - meths.nvim_paste('', false, 2) - meths.nvim_paste('', false, 2) - meths.nvim_paste('', false, 3) + api.nvim_paste('', false, 1) + api.nvim_paste('', false, 2) + api.nvim_paste('', false, 2) + api.nvim_paste('', false, 3) expect('||') end) end) @@ -959,17 +959,17 @@ describe('API', function() xxx]]) end) it('with non-empty chunks', function() - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('||aaaaaabbbbbbccccccdddddd') end) it('with empty first chunk', function() - meths.nvim_paste('', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('||bbbbbbccccccdddddd') end) end) @@ -987,17 +987,17 @@ describe('API', function() xxx]]) end) it('with non-empty chunks', function() - meths.nvim_paste('aaaaaa', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('||aaaaaabbbbbbccccccdddddd') end) it('with empty first chunk', function() - meths.nvim_paste('', false, 1) - meths.nvim_paste('bbbbbb', false, 2) - meths.nvim_paste('cccccc', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('', false, 1) + api.nvim_paste('bbbbbb', false, 2) + api.nvim_paste('cccccc', false, 2) + api.nvim_paste('dddddd', false, 3) expect('||bbbbbbccccccdddddd') end) end) @@ -1020,10 +1020,10 @@ describe('API', function() feed('ggV') end) it('pasting text without final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ aaaaaa bbbbbb @@ -1032,10 +1032,10 @@ describe('API', function() 123456789]]) end) it('pasting text with final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd\n', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd\n', false, 3) expect([[ aaaaaa bbbbbb @@ -1050,10 +1050,10 @@ describe('API', function() feed('2ggV') end) it('pasting text without final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ 123456789 aaaaaa @@ -1062,10 +1062,10 @@ describe('API', function() dddddd123456789]]) end) it('pasting text with final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd\n', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd\n', false, 3) expect([[ 123456789 aaaaaa @@ -1080,10 +1080,10 @@ describe('API', function() feed('3ggV') end) it('pasting text without final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ 123456789 987654321 @@ -1093,10 +1093,10 @@ describe('API', function() dddddd]]) end) it('pasting text with final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd\n', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd\n', false, 3) expect([[ 123456789 987654321 @@ -1112,10 +1112,10 @@ describe('API', function() feed('ggVG') end) it('pasting text without final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd', false, 3) expect([[ aaaaaa bbbbbb @@ -1123,10 +1123,10 @@ describe('API', function() dddddd]]) end) it('pasting text with final new line', function() - meths.nvim_paste('aaaaaa\n', false, 1) - meths.nvim_paste('bbbbbb\n', false, 2) - meths.nvim_paste('cccccc\n', false, 2) - meths.nvim_paste('dddddd\n', false, 3) + api.nvim_paste('aaaaaa\n', false, 1) + api.nvim_paste('bbbbbb\n', false, 2) + api.nvim_paste('cccccc\n', false, 2) + api.nvim_paste('dddddd\n', false, 3) expect([[ aaaaaa bbbbbb @@ -1148,71 +1148,71 @@ describe('API', function() end) it('non-streaming', function() -- With final "\n". - meths.nvim_paste('line 1\nline 2\nline 3\n', true, -1) + api.nvim_paste('line 1\nline 2\nline 3\n', true, -1) expect([[ line 1 line 2 line 3 ]]) - eq({ 0, 4, 1, 0 }, funcs.getpos('.')) -- Cursor follows the paste. - eq(false, meths.nvim_get_option_value('paste', {})) + eq({ 0, 4, 1, 0 }, fn.getpos('.')) -- Cursor follows the paste. + eq(false, api.nvim_get_option_value('paste', {})) command('%delete _') -- Without final "\n". - meths.nvim_paste('line 1\nline 2\nline 3', true, -1) + api.nvim_paste('line 1\nline 2\nline 3', true, -1) expect([[ line 1 line 2 line 3]]) - eq({ 0, 3, 6, 0 }, funcs.getpos('.')) + eq({ 0, 3, 6, 0 }, fn.getpos('.')) command('%delete _') -- CRLF #10872 - meths.nvim_paste('line 1\r\nline 2\r\nline 3\r\n', true, -1) + api.nvim_paste('line 1\r\nline 2\r\nline 3\r\n', true, -1) expect([[ line 1 line 2 line 3 ]]) - eq({ 0, 4, 1, 0 }, funcs.getpos('.')) + eq({ 0, 4, 1, 0 }, fn.getpos('.')) command('%delete _') -- CRLF without final "\n". - meths.nvim_paste('line 1\r\nline 2\r\nline 3\r', true, -1) + api.nvim_paste('line 1\r\nline 2\r\nline 3\r', true, -1) expect([[ line 1 line 2 line 3 ]]) - eq({ 0, 4, 1, 0 }, funcs.getpos('.')) + eq({ 0, 4, 1, 0 }, fn.getpos('.')) command('%delete _') -- CRLF without final "\r\n". - meths.nvim_paste('line 1\r\nline 2\r\nline 3', true, -1) + api.nvim_paste('line 1\r\nline 2\r\nline 3', true, -1) expect([[ line 1 line 2 line 3]]) - eq({ 0, 3, 6, 0 }, funcs.getpos('.')) + eq({ 0, 3, 6, 0 }, fn.getpos('.')) command('%delete _') -- Various other junk. - meths.nvim_paste('line 1\r\n\r\rline 2\nline 3\rline 4\r', true, -1) + api.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(false, meths.nvim_get_option_value('paste', {})) + eq({ 0, 7, 1, 0 }, fn.getpos('.')) + eq(false, api.nvim_get_option_value('paste', {})) end) it('Replace-mode', function() -- Within single line - meths.nvim_put({ 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) + api.nvim_put({ 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) command('normal l') command('startreplace') - meths.nvim_paste('123456', true, -1) + api.nvim_paste('123456', true, -1) expect([[ a123456d eeffgghh iijjkkll]]) command('%delete _') -- Across lines - meths.nvim_put({ 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) + api.nvim_put({ 'aabbccdd', 'eeffgghh', 'iijjkkll' }, 'c', true, false) command('normal l') command('startreplace') - meths.nvim_paste('123\n456', true, -1) + api.nvim_paste('123\n456', true, -1) expect([[ a123 456d @@ -1221,30 +1221,30 @@ describe('API', function() end) it('when searching in Visual mode', function() feed('v/') - meths.nvim_paste('aabbccdd', true, -1) - eq('aabbccdd', funcs.getcmdline()) + api.nvim_paste('aabbccdd', true, -1) + eq('aabbccdd', fn.getcmdline()) expect('') end) it('mappings are disabled in Cmdline mode', function() command('cnoremap a b') feed(':') - meths.nvim_paste('a', true, -1) - eq('a', funcs.getcmdline()) + api.nvim_paste('a', true, -1) + eq('a', fn.getcmdline()) end) it('pasted text is saved in cmdline history when comes from mapping #20957', function() command('cnoremap ') feed(':') - meths.nvim_paste('echo', true, -1) - eq('', funcs.histget(':')) + api.nvim_paste('echo', true, -1) + eq('', fn.histget(':')) feed('') - eq('echo', funcs.histget(':')) + eq('echo', fn.histget(':')) end) it('pasting with empty last chunk in Cmdline mode', function() local screen = Screen.new(20, 4) screen:attach() feed(':') - meths.nvim_paste('Foo', true, 1) - meths.nvim_paste('', true, 3) + api.nvim_paste('Foo', true, 1) + api.nvim_paste('', true, 3) screen:expect([[ | ~ |*2 @@ -1255,7 +1255,7 @@ describe('API', function() local screen = Screen.new(20, 4) screen:attach() feed(':') - meths.nvim_paste('normal! \023\022\006\027', true, -1) + api.nvim_paste('normal! \023\022\006\027', true, -1) screen:expect([[ | ~ |*2 @@ -1263,12 +1263,12 @@ describe('API', function() ]]) end) it('crlf=false does not break lines at CR, CRLF', function() - meths.nvim_paste('line 1\r\n\r\rline 2\nline 3\rline 4\r', false, -1) + api.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 }, fn.getpos('.')) end) it('vim.paste() failure', function() - meths.nvim_exec_lua('vim.paste = (function(lines, phase) error("fake fail") end)', {}) + api.nvim_exec_lua('vim.paste = (function(lines, phase) error("fake fail") end)', {}) eq('fake fail', pcall_err(request, 'nvim_paste', 'line 1\nline 2\nline 3', false, 1)) end) end) @@ -1290,78 +1290,78 @@ describe('API', function() end) it('inserts text', function() -- linewise - meths.nvim_put({ 'line 1', 'line 2', 'line 3' }, 'l', true, true) + api.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 }, fn.getpos('.')) command('%delete _') -- charwise - meths.nvim_put({ 'line 1', 'line 2', 'line 3' }, 'c', true, false) + api.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 }, fn.getpos('.')) -- follow=false -- blockwise - meths.nvim_put({ 'AA', 'BB' }, 'b', true, true) + api.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 }, fn.getpos('.')) command('%delete _') -- Empty lines list. - meths.nvim_put({}, 'c', true, true) - eq({ 0, 1, 1, 0 }, funcs.getpos('.')) + api.nvim_put({}, 'c', true, true) + eq({ 0, 1, 1, 0 }, fn.getpos('.')) expect([[]]) -- Single empty line. - meths.nvim_put({ '' }, 'c', true, true) - eq({ 0, 1, 1, 0 }, funcs.getpos('.')) + api.nvim_put({ '' }, 'c', true, true) + eq({ 0, 1, 1, 0 }, fn.getpos('.')) expect([[ ]]) - meths.nvim_put({ 'AB' }, 'c', true, true) + api.nvim_put({ 'AB' }, 'c', true, true) -- after=false, follow=true - meths.nvim_put({ 'line 1', 'line 2' }, 'c', false, true) + api.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 }, fn.getpos('.')) command('%delete _') - meths.nvim_put({ 'AB' }, 'c', true, true) + api.nvim_put({ 'AB' }, 'c', true, true) -- after=false, follow=false - meths.nvim_put({ 'line 1', 'line 2' }, 'c', false, false) + api.nvim_put({ 'line 1', 'line 2' }, 'c', false, false) expect([[ Aline 1 line 2B]]) - eq({ 0, 1, 2, 0 }, funcs.getpos('.')) - eq('', meths.nvim_eval('v:errmsg')) + eq({ 0, 1, 2, 0 }, fn.getpos('.')) + eq('', api.nvim_eval('v:errmsg')) end) it('detects charwise/linewise text (empty {type})', function() -- linewise (final item is empty string) - meths.nvim_put({ 'line 1', 'line 2', 'line 3', '' }, '', true, true) + api.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 }, fn.getpos('.')) command('%delete _') -- charwise (final item is non-empty) - meths.nvim_put({ 'line 1', 'line 2', 'line 3' }, '', true, true) + api.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 }, fn.getpos('.')) end) it('allows block width', function() -- behave consistently with setreg(); support "\022{NUM}" return by getregtype() - meths.nvim_put({ 'line 1', 'line 2', 'line 3' }, 'l', false, false) + api.nvim_put({ 'line 1', 'line 2', 'line 3' }, 'l', false, false) expect([[ line 1 line 2 @@ -1369,69 +1369,69 @@ describe('API', function() ]]) -- larger width create spaces - meths.nvim_put({ 'a', 'bc' }, 'b3', false, false) + api.nvim_put({ 'a', 'bc' }, 'b3', false, false) expect([[ a line 1 bc line 2 line 3 ]]) -- smaller width is ignored - meths.nvim_put({ 'xxx', 'yyy' }, '\0221', false, true) + api.nvim_put({ 'xxx', 'yyy' }, '\0221', false, true) expect([[ xxxa line 1 yyybc line 2 line 3 ]]) - eq("Invalid 'type': 'bx'", pcall_err(meths.nvim_put, { 'xxx', 'yyy' }, 'bx', false, true)) - eq("Invalid 'type': 'b3x'", pcall_err(meths.nvim_put, { 'xxx', 'yyy' }, 'b3x', false, true)) + eq("Invalid 'type': 'bx'", pcall_err(api.nvim_put, { 'xxx', 'yyy' }, 'bx', false, true)) + eq("Invalid 'type': 'b3x'", pcall_err(api.nvim_put, { 'xxx', 'yyy' }, 'b3x', false, true)) end) end) describe('nvim_strwidth', function() it('works', function() - eq(3, meths.nvim_strwidth('abc')) + eq(3, api.nvim_strwidth('abc')) -- 6 + (neovim) -- 19 * 2 (each japanese character occupies two cells) - eq(44, meths.nvim_strwidth('neovimのデザインかなりまともなのになってる。')) + eq(44, api.nvim_strwidth('neovimのデザインかなりまともなのになってる。')) end) it('cannot handle NULs', function() - eq(0, meths.nvim_strwidth('\0abc')) + eq(0, api.nvim_strwidth('\0abc')) end) end) describe('nvim_get_current_line, nvim_set_current_line', function() it('works', function() - eq('', meths.nvim_get_current_line()) - meths.nvim_set_current_line('abc') - eq('abc', meths.nvim_get_current_line()) + eq('', api.nvim_get_current_line()) + api.nvim_set_current_line('abc') + eq('abc', api.nvim_get_current_line()) end) end) describe('set/get/del variables', function() it('validation', function() - eq('Key not found: bogus', pcall_err(meths.nvim_get_var, 'bogus')) - eq('Key not found: bogus', pcall_err(meths.nvim_del_var, 'bogus')) + eq('Key not found: bogus', pcall_err(api.nvim_get_var, 'bogus')) + eq('Key not found: bogus', pcall_err(api.nvim_del_var, 'bogus')) end) it('nvim_get_var, nvim_set_var, nvim_del_var', function() - meths.nvim_set_var('lua', { 1, 2, { ['3'] = 1 } }) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_get_var('lua')) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('g:lua')) - eq(1, funcs.exists('g:lua')) - meths.nvim_del_var('lua') - eq(0, funcs.exists('g:lua')) - eq('Key not found: lua', pcall_err(meths.nvim_del_var, 'lua')) - meths.nvim_set_var('lua', 1) + api.nvim_set_var('lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_get_var('lua')) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_eval('g:lua')) + eq(1, fn.exists('g:lua')) + api.nvim_del_var('lua') + eq(0, fn.exists('g:lua')) + eq('Key not found: lua', pcall_err(api.nvim_del_var, 'lua')) + api.nvim_set_var('lua', 1) -- Empty keys are allowed in Vim dicts (and msgpack). - meths.nvim_set_var('dict_empty_key', { [''] = 'empty key' }) - eq({ [''] = 'empty key' }, meths.nvim_get_var('dict_empty_key')) + api.nvim_set_var('dict_empty_key', { [''] = 'empty key' }) + eq({ [''] = 'empty key' }, api.nvim_get_var('dict_empty_key')) -- Set locked g: var. command('lockvar lua') - eq('Key is locked: lua', pcall_err(meths.nvim_del_var, 'lua')) - eq('Key is locked: lua', pcall_err(meths.nvim_set_var, 'lua', 1)) + eq('Key is locked: lua', pcall_err(api.nvim_del_var, 'lua')) + eq('Key is locked: lua', pcall_err(api.nvim_set_var, 'lua', 1)) exec([[ function Test() @@ -1441,8 +1441,8 @@ describe('API', function() let g:Unknown_func = function('Test') let g:Unknown_script_func = function('s:Test') ]]) - eq(NIL, meths.nvim_get_var('Unknown_func')) - eq(NIL, meths.nvim_get_var('Unknown_script_func')) + eq(NIL, api.nvim_get_var('Unknown_func')) + eq(NIL, api.nvim_get_var('Unknown_script_func')) -- Check if autoload works properly local pathsep = helpers.get_pathsep() @@ -1454,40 +1454,40 @@ describe('API', function() write_file(autoload_file, [[let testload#value = 2]]) clear { args_rm = { '-u' }, env = { XDG_CONFIG_HOME = xconfig, XDG_DATA_HOME = xdata } } - eq(2, meths.nvim_get_var('testload#value')) + eq(2, api.nvim_get_var('testload#value')) rmdir('Xhome') end) it('nvim_get_vvar, nvim_set_vvar', function() eq('Key is read-only: count', pcall_err(request, 'nvim_set_vvar', 'count', 42)) eq('Dictionary is locked', pcall_err(request, 'nvim_set_vvar', 'nosuchvar', 42)) - meths.nvim_set_vvar('errmsg', 'set by API') - eq('set by API', meths.nvim_get_vvar('errmsg')) - meths.nvim_set_vvar('errmsg', 42) + api.nvim_set_vvar('errmsg', 'set by API') + eq('set by API', api.nvim_get_vvar('errmsg')) + api.nvim_set_vvar('errmsg', 42) eq('42', eval('v:errmsg')) - meths.nvim_set_vvar('oldfiles', { 'one', 'two' }) + api.nvim_set_vvar('oldfiles', { 'one', 'two' }) eq({ 'one', 'two' }, eval('v:oldfiles')) - meths.nvim_set_vvar('oldfiles', {}) + api.nvim_set_vvar('oldfiles', {}) eq({}, eval('v:oldfiles')) eq( 'Setting v:oldfiles to value with wrong type', - pcall_err(meths.nvim_set_vvar, 'oldfiles', 'a') + pcall_err(api.nvim_set_vvar, 'oldfiles', 'a') ) eq({}, eval('v:oldfiles')) feed('i foo foo foo0/foo') - eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 1 }, api.nvim_win_get_cursor(0)) eq(1, eval('v:searchforward')) feed('n') - eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) - meths.nvim_set_vvar('searchforward', 0) + eq({ 1, 5 }, api.nvim_win_get_cursor(0)) + api.nvim_set_vvar('searchforward', 0) eq(0, eval('v:searchforward')) feed('n') - eq({ 1, 1 }, meths.nvim_win_get_cursor(0)) - meths.nvim_set_vvar('searchforward', 1) + eq({ 1, 1 }, api.nvim_win_get_cursor(0)) + api.nvim_set_vvar('searchforward', 1) eq(1, eval('v:searchforward')) feed('n') - eq({ 1, 5 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 5 }, api.nvim_win_get_cursor(0)) local screen = Screen.new(60, 3) screen:set_default_attr_ids({ @@ -1503,7 +1503,7 @@ describe('API', function() | ]], } - meths.nvim_set_vvar('hlsearch', 0) + api.nvim_set_vvar('hlsearch', 0) eq(0, eval('v:hlsearch')) screen:expect { grid = [[ @@ -1512,7 +1512,7 @@ describe('API', function() | ]], } - meths.nvim_set_vvar('hlsearch', 1) + api.nvim_set_vvar('hlsearch', 1) eq(1, eval('v:hlsearch')) screen:expect { grid = [[ @@ -1539,182 +1539,182 @@ describe('API', function() end) it('truncates values with NULs in them', function() - meths.nvim_set_var('xxx', 'ab\0cd') - eq('ab', meths.nvim_get_var('xxx')) + api.nvim_set_var('xxx', 'ab\0cd') + eq('ab', api.nvim_get_var('xxx')) end) end) describe('nvim_get_option_value, nvim_set_option_value', function() it('works', function() - ok(meths.nvim_get_option_value('equalalways', {})) - meths.nvim_set_option_value('equalalways', false, {}) - ok(not meths.nvim_get_option_value('equalalways', {})) + ok(api.nvim_get_option_value('equalalways', {})) + api.nvim_set_option_value('equalalways', false, {}) + ok(not api.nvim_get_option_value('equalalways', {})) end) it('works to get global value of local options', function() - eq(false, meths.nvim_get_option_value('lisp', {})) - eq(8, meths.nvim_get_option_value('shiftwidth', {})) + eq(false, api.nvim_get_option_value('lisp', {})) + eq(8, api.nvim_get_option_value('shiftwidth', {})) end) it('works to set global value of local options', function() - meths.nvim_set_option_value('lisp', true, { scope = 'global' }) - eq(true, meths.nvim_get_option_value('lisp', { scope = 'global' })) - eq(false, meths.nvim_get_option_value('lisp', {})) + api.nvim_set_option_value('lisp', true, { scope = 'global' }) + eq(true, api.nvim_get_option_value('lisp', { scope = 'global' })) + eq(false, api.nvim_get_option_value('lisp', {})) eq(nil, command_output('setglobal lisp?'):match('nolisp')) eq('nolisp', command_output('setlocal lisp?'):match('nolisp')) - meths.nvim_set_option_value('shiftwidth', 20, { scope = 'global' }) + api.nvim_set_option_value('shiftwidth', 20, { scope = 'global' }) eq('20', command_output('setglobal shiftwidth?'):match('%d+')) eq('8', command_output('setlocal shiftwidth?'):match('%d+')) end) it('updates where the option was last set from', function() - meths.nvim_set_option_value('equalalways', false, {}) + api.nvim_set_option_value('equalalways', false, {}) local status, rv = pcall(command_output, 'verbose set equalalways?') eq(true, status) ok( nil ~= string.find(rv, 'noequalalways\n' .. '\tLast set from API client %(channel id %d+%)') ) - meths.nvim_exec_lua('vim.api.nvim_set_option_value("equalalways", true, {})', {}) + api.nvim_exec_lua('vim.api.nvim_set_option_value("equalalways", true, {})', {}) status, rv = pcall(command_output, 'verbose set equalalways?') eq(true, status) eq(' equalalways\n\tLast set from Lua', rv) end) it('updates whether the option has ever been set #25025', function() - eq(false, meths.nvim_get_option_info2('autochdir', {}).was_set) - meths.nvim_set_option_value('autochdir', true, {}) - eq(true, meths.nvim_get_option_info2('autochdir', {}).was_set) + eq(false, api.nvim_get_option_info2('autochdir', {}).was_set) + api.nvim_set_option_value('autochdir', true, {}) + eq(true, api.nvim_get_option_info2('autochdir', {}).was_set) - eq(false, meths.nvim_get_option_info2('cmdwinheight', {}).was_set) - meths.nvim_set_option_value('cmdwinheight', 10, {}) - eq(true, meths.nvim_get_option_info2('cmdwinheight', {}).was_set) + eq(false, api.nvim_get_option_info2('cmdwinheight', {}).was_set) + api.nvim_set_option_value('cmdwinheight', 10, {}) + eq(true, api.nvim_get_option_info2('cmdwinheight', {}).was_set) - eq(false, meths.nvim_get_option_info2('debug', {}).was_set) - meths.nvim_set_option_value('debug', 'beep', {}) - eq(true, meths.nvim_get_option_info2('debug', {}).was_set) + eq(false, api.nvim_get_option_info2('debug', {}).was_set) + api.nvim_set_option_value('debug', 'beep', {}) + eq(true, api.nvim_get_option_info2('debug', {}).was_set) end) it('validation', function() eq( "Invalid 'scope': expected 'local' or 'global'", - pcall_err(meths.nvim_get_option_value, 'scrolloff', { scope = 'bogus' }) + pcall_err(api.nvim_get_option_value, 'scrolloff', { scope = 'bogus' }) ) eq( "Invalid 'scope': expected 'local' or 'global'", - pcall_err(meths.nvim_set_option_value, 'scrolloff', 1, { scope = 'bogus' }) + pcall_err(api.nvim_set_option_value, 'scrolloff', 1, { scope = 'bogus' }) ) eq( "Invalid 'scope': expected String, got Integer", - pcall_err(meths.nvim_get_option_value, 'scrolloff', { scope = 42 }) + pcall_err(api.nvim_get_option_value, 'scrolloff', { scope = 42 }) ) eq( "Invalid 'value': expected valid option type, got Array", - pcall_err(meths.nvim_set_option_value, 'scrolloff', {}, {}) + pcall_err(api.nvim_set_option_value, 'scrolloff', {}, {}) ) eq( "Invalid value for option 'scrolloff': expected number, got boolean true", - pcall_err(meths.nvim_set_option_value, 'scrolloff', true, {}) + pcall_err(api.nvim_set_option_value, 'scrolloff', true, {}) ) eq( 'Invalid value for option \'scrolloff\': expected number, got string "wrong"', - pcall_err(meths.nvim_set_option_value, 'scrolloff', 'wrong', {}) + pcall_err(api.nvim_set_option_value, 'scrolloff', 'wrong', {}) ) end) it('can get local values when global value is set', function() - eq(0, meths.nvim_get_option_value('scrolloff', {})) - eq(-1, meths.nvim_get_option_value('scrolloff', { scope = 'local' })) + eq(0, api.nvim_get_option_value('scrolloff', {})) + eq(-1, api.nvim_get_option_value('scrolloff', { scope = 'local' })) end) it('can set global and local values', function() - meths.nvim_set_option_value('makeprg', 'hello', {}) - eq('hello', meths.nvim_get_option_value('makeprg', {})) - eq('', meths.nvim_get_option_value('makeprg', { scope = 'local' })) - meths.nvim_set_option_value('makeprg', 'world', { scope = 'local' }) - eq('world', meths.nvim_get_option_value('makeprg', { scope = 'local' })) - meths.nvim_set_option_value('makeprg', 'goodbye', { scope = 'global' }) - eq('goodbye', meths.nvim_get_option_value('makeprg', { scope = 'global' })) - meths.nvim_set_option_value('makeprg', 'hello', {}) - eq('hello', meths.nvim_get_option_value('makeprg', { scope = 'global' })) - eq('hello', meths.nvim_get_option_value('makeprg', {})) - eq('', meths.nvim_get_option_value('makeprg', { scope = 'local' })) + api.nvim_set_option_value('makeprg', 'hello', {}) + eq('hello', api.nvim_get_option_value('makeprg', {})) + eq('', api.nvim_get_option_value('makeprg', { scope = 'local' })) + api.nvim_set_option_value('makeprg', 'world', { scope = 'local' }) + eq('world', api.nvim_get_option_value('makeprg', { scope = 'local' })) + api.nvim_set_option_value('makeprg', 'goodbye', { scope = 'global' }) + eq('goodbye', api.nvim_get_option_value('makeprg', { scope = 'global' })) + api.nvim_set_option_value('makeprg', 'hello', {}) + eq('hello', api.nvim_get_option_value('makeprg', { scope = 'global' })) + eq('hello', api.nvim_get_option_value('makeprg', {})) + eq('', api.nvim_get_option_value('makeprg', { scope = 'local' })) end) it('clears the local value of an option with nil', function() -- Set global value - meths.nvim_set_option_value('shiftwidth', 42, {}) - eq(42, meths.nvim_get_option_value('shiftwidth', {})) + api.nvim_set_option_value('shiftwidth', 42, {}) + eq(42, api.nvim_get_option_value('shiftwidth', {})) -- Set local value - meths.nvim_set_option_value('shiftwidth', 8, { scope = 'local' }) - eq(8, meths.nvim_get_option_value('shiftwidth', {})) - eq(8, meths.nvim_get_option_value('shiftwidth', { scope = 'local' })) - eq(42, meths.nvim_get_option_value('shiftwidth', { scope = 'global' })) + api.nvim_set_option_value('shiftwidth', 8, { scope = 'local' }) + eq(8, api.nvim_get_option_value('shiftwidth', {})) + eq(8, api.nvim_get_option_value('shiftwidth', { scope = 'local' })) + eq(42, api.nvim_get_option_value('shiftwidth', { scope = 'global' })) -- Clear value without scope - meths.nvim_set_option_value('shiftwidth', NIL, {}) - eq(42, meths.nvim_get_option_value('shiftwidth', {})) - eq(42, meths.nvim_get_option_value('shiftwidth', { scope = 'local' })) + api.nvim_set_option_value('shiftwidth', NIL, {}) + eq(42, api.nvim_get_option_value('shiftwidth', {})) + eq(42, api.nvim_get_option_value('shiftwidth', { scope = 'local' })) -- Clear value with explicit scope - meths.nvim_set_option_value('shiftwidth', 8, { scope = 'local' }) - meths.nvim_set_option_value('shiftwidth', NIL, { scope = 'local' }) - eq(42, meths.nvim_get_option_value('shiftwidth', {})) - eq(42, meths.nvim_get_option_value('shiftwidth', { scope = 'local' })) + api.nvim_set_option_value('shiftwidth', 8, { scope = 'local' }) + api.nvim_set_option_value('shiftwidth', NIL, { scope = 'local' }) + eq(42, api.nvim_get_option_value('shiftwidth', {})) + eq(42, api.nvim_get_option_value('shiftwidth', { scope = 'local' })) -- Now try with options with a special "local is unset" value (e.g. 'undolevels') - meths.nvim_set_option_value('undolevels', 1000, {}) - meths.nvim_set_option_value('undolevels', 1200, { scope = 'local' }) - eq(1200, meths.nvim_get_option_value('undolevels', { scope = 'local' })) - meths.nvim_set_option_value('undolevels', NIL, { scope = 'local' }) - eq(-123456, meths.nvim_get_option_value('undolevels', { scope = 'local' })) - eq(1000, meths.nvim_get_option_value('undolevels', {})) + api.nvim_set_option_value('undolevels', 1000, {}) + api.nvim_set_option_value('undolevels', 1200, { scope = 'local' }) + eq(1200, api.nvim_get_option_value('undolevels', { scope = 'local' })) + api.nvim_set_option_value('undolevels', NIL, { scope = 'local' }) + eq(-123456, api.nvim_get_option_value('undolevels', { scope = 'local' })) + eq(1000, api.nvim_get_option_value('undolevels', {})) - meths.nvim_set_option_value('autoread', true, {}) - meths.nvim_set_option_value('autoread', false, { scope = 'local' }) - eq(false, meths.nvim_get_option_value('autoread', { scope = 'local' })) - meths.nvim_set_option_value('autoread', NIL, { scope = 'local' }) - eq(NIL, meths.nvim_get_option_value('autoread', { scope = 'local' })) - eq(true, meths.nvim_get_option_value('autoread', {})) + api.nvim_set_option_value('autoread', true, {}) + api.nvim_set_option_value('autoread', false, { scope = 'local' }) + eq(false, api.nvim_get_option_value('autoread', { scope = 'local' })) + api.nvim_set_option_value('autoread', NIL, { scope = 'local' }) + eq(NIL, api.nvim_get_option_value('autoread', { scope = 'local' })) + eq(true, api.nvim_get_option_value('autoread', {})) end) it('set window options', function() - meths.nvim_set_option_value('colorcolumn', '4,3', {}) - eq('4,3', meths.nvim_get_option_value('colorcolumn', { scope = 'local' })) + api.nvim_set_option_value('colorcolumn', '4,3', {}) + eq('4,3', api.nvim_get_option_value('colorcolumn', { scope = 'local' })) command('set modified hidden') command('enew') -- edit new buffer, window option is preserved - eq('4,3', meths.nvim_get_option_value('colorcolumn', { scope = 'local' })) + eq('4,3', api.nvim_get_option_value('colorcolumn', { scope = 'local' })) end) it('set local window options', function() - meths.nvim_set_option_value('colorcolumn', '4,3', { win = 0, scope = 'local' }) - eq('4,3', meths.nvim_get_option_value('colorcolumn', { win = 0, scope = 'local' })) + api.nvim_set_option_value('colorcolumn', '4,3', { win = 0, scope = 'local' }) + eq('4,3', api.nvim_get_option_value('colorcolumn', { win = 0, scope = 'local' })) command('set modified hidden') command('enew') -- edit new buffer, window option is reset - eq('', meths.nvim_get_option_value('colorcolumn', { win = 0, scope = 'local' })) + eq('', api.nvim_get_option_value('colorcolumn', { win = 0, scope = 'local' })) end) it('get buffer or window-local options', function() command('new') - local buf = meths.nvim_get_current_buf().id - meths.nvim_set_option_value('tagfunc', 'foobar', { buf = buf }) - eq('foobar', meths.nvim_get_option_value('tagfunc', { buf = buf })) + local buf = api.nvim_get_current_buf().id + api.nvim_set_option_value('tagfunc', 'foobar', { buf = buf }) + eq('foobar', api.nvim_get_option_value('tagfunc', { buf = buf })) - local win = meths.nvim_get_current_win().id - meths.nvim_set_option_value('number', true, { win = win }) - eq(true, meths.nvim_get_option_value('number', { win = win })) + local win = api.nvim_get_current_win().id + api.nvim_set_option_value('number', true, { win = win }) + eq(true, api.nvim_get_option_value('number', { win = win })) end) it('getting current buffer option does not adjust cursor #19381', function() command('new') - local buf = meths.nvim_get_current_buf().id - local win = meths.nvim_get_current_win().id + local buf = api.nvim_get_current_buf().id + local win = api.nvim_get_current_win().id insert('some text') feed('0v$') - eq({ 1, 9 }, meths.nvim_win_get_cursor(win)) - meths.nvim_get_option_value('filetype', { buf = buf }) - eq({ 1, 9 }, meths.nvim_win_get_cursor(win)) + eq({ 1, 9 }, api.nvim_win_get_cursor(win)) + api.nvim_get_option_value('filetype', { buf = buf }) + eq({ 1, 9 }, api.nvim_win_get_cursor(win)) end) it('can get default option values for filetypes', function() @@ -1726,156 +1726,156 @@ describe('API', function() xml = { formatexpr = 'xmlformat#Format()' }, } do for option, value in pairs(opts) do - eq(value, meths.nvim_get_option_value(option, { filetype = ft })) + eq(value, api.nvim_get_option_value(option, { filetype = ft })) end end command 'au FileType lua setlocal commentstring=NEW\\ %s' - eq('NEW %s', meths.nvim_get_option_value('commentstring', { filetype = 'lua' })) + eq('NEW %s', api.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(meths.nvim_get_option_value, 'commentstring', { filetype = 'lua' }) + pcall_err(api.nvim_get_option_value, 'commentstring', { filetype = 'lua' }) ) end) it("value of 'modified' is always false for scratch buffers", function() - meths.nvim_set_current_buf(meths.nvim_create_buf(true, true)) + api.nvim_set_current_buf(api.nvim_create_buf(true, true)) insert([[ foo bar baz ]]) - eq(false, meths.nvim_get_option_value('modified', {})) + eq(false, api.nvim_get_option_value('modified', {})) end) end) describe('nvim_{get,set}_current_buf, nvim_list_bufs', function() it('works', function() - eq(1, #meths.nvim_list_bufs()) - eq(meths.nvim_list_bufs()[1], meths.nvim_get_current_buf()) + eq(1, #api.nvim_list_bufs()) + eq(api.nvim_list_bufs()[1], api.nvim_get_current_buf()) command('new') - eq(2, #meths.nvim_list_bufs()) - eq(meths.nvim_list_bufs()[2], meths.nvim_get_current_buf()) - meths.nvim_set_current_buf(meths.nvim_list_bufs()[1]) - eq(meths.nvim_list_bufs()[1], meths.nvim_get_current_buf()) + eq(2, #api.nvim_list_bufs()) + eq(api.nvim_list_bufs()[2], api.nvim_get_current_buf()) + api.nvim_set_current_buf(api.nvim_list_bufs()[1]) + eq(api.nvim_list_bufs()[1], api.nvim_get_current_buf()) end) end) describe('nvim_{get,set}_current_win, nvim_list_wins', function() it('works', function() - eq(1, #meths.nvim_list_wins()) - eq(meths.nvim_list_wins()[1], meths.nvim_get_current_win()) + eq(1, #api.nvim_list_wins()) + eq(api.nvim_list_wins()[1], api.nvim_get_current_win()) command('vsplit') command('split') - eq(3, #meths.nvim_list_wins()) - eq(meths.nvim_list_wins()[1], meths.nvim_get_current_win()) - meths.nvim_set_current_win(meths.nvim_list_wins()[2]) - eq(meths.nvim_list_wins()[2], meths.nvim_get_current_win()) + eq(3, #api.nvim_list_wins()) + eq(api.nvim_list_wins()[1], api.nvim_get_current_win()) + api.nvim_set_current_win(api.nvim_list_wins()[2]) + eq(api.nvim_list_wins()[2], api.nvim_get_current_win()) end) end) describe('nvim_{get,set}_current_tabpage, nvim_list_tabpages', function() it('works', function() - eq(1, #meths.nvim_list_tabpages()) - eq(meths.nvim_list_tabpages()[1], meths.nvim_get_current_tabpage()) + eq(1, #api.nvim_list_tabpages()) + eq(api.nvim_list_tabpages()[1], api.nvim_get_current_tabpage()) command('tabnew') - eq(2, #meths.nvim_list_tabpages()) - eq(2, #meths.nvim_list_wins()) - eq(meths.nvim_list_wins()[2], meths.nvim_get_current_win()) - eq(meths.nvim_list_tabpages()[2], meths.nvim_get_current_tabpage()) - meths.nvim_set_current_win(meths.nvim_list_wins()[1]) + eq(2, #api.nvim_list_tabpages()) + eq(2, #api.nvim_list_wins()) + eq(api.nvim_list_wins()[2], api.nvim_get_current_win()) + eq(api.nvim_list_tabpages()[2], api.nvim_get_current_tabpage()) + api.nvim_set_current_win(api.nvim_list_wins()[1]) -- Switching window also switches tabpages if necessary - eq(meths.nvim_list_tabpages()[1], meths.nvim_get_current_tabpage()) - eq(meths.nvim_list_wins()[1], meths.nvim_get_current_win()) - meths.nvim_set_current_tabpage(meths.nvim_list_tabpages()[2]) - eq(meths.nvim_list_tabpages()[2], meths.nvim_get_current_tabpage()) - eq(meths.nvim_list_wins()[2], meths.nvim_get_current_win()) + eq(api.nvim_list_tabpages()[1], api.nvim_get_current_tabpage()) + eq(api.nvim_list_wins()[1], api.nvim_get_current_win()) + api.nvim_set_current_tabpage(api.nvim_list_tabpages()[2]) + eq(api.nvim_list_tabpages()[2], api.nvim_get_current_tabpage()) + eq(api.nvim_list_wins()[2], api.nvim_get_current_win()) end) end) describe('nvim_get_mode', function() it('during normal-mode `g` returns blocking=true', function() - meths.nvim_input('o') -- add a line - eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) - meths.nvim_input([[]]) - eq(2, meths.nvim_eval("line('.')")) - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + api.nvim_input('o') -- add a line + eq({ mode = 'i', blocking = false }, api.nvim_get_mode()) + api.nvim_input([[]]) + eq(2, api.nvim_eval("line('.')")) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) - meths.nvim_input('g') - eq({ mode = 'n', blocking = true }, meths.nvim_get_mode()) + api.nvim_input('g') + eq({ mode = 'n', blocking = true }, api.nvim_get_mode()) - meths.nvim_input('k') -- complete the operator - eq(1, meths.nvim_eval("line('.')")) -- verify the completed operator - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + api.nvim_input('k') -- complete the operator + eq(1, api.nvim_eval("line('.')")) -- verify the completed operator + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('returns the correct result multiple consecutive times', function() for _ = 1, 5 do - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end - meths.nvim_input('g') + api.nvim_input('g') for _ = 1, 4 do - eq({ mode = 'n', blocking = true }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = true }, api.nvim_get_mode()) end - meths.nvim_input('g') + api.nvim_input('g') for _ = 1, 7 do - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end end) it('during normal-mode CTRL-W, returns blocking=true', function() - meths.nvim_input('') - eq({ mode = 'n', blocking = true }, meths.nvim_get_mode()) + api.nvim_input('') + eq({ mode = 'n', blocking = true }, api.nvim_get_mode()) - meths.nvim_input('s') -- complete the operator - eq(2, meths.nvim_eval("winnr('$')")) -- verify the completed operator - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + api.nvim_input('s') -- complete the operator + eq(2, api.nvim_eval("winnr('$')")) -- verify the completed operator + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('during press-enter prompt without UI returns blocking=false', function() - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") command("echom 'msg4'") command("echom 'msg5'") - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) - meths.nvim_input(':messages') - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) + api.nvim_input(':messages') + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('during press-enter prompt returns blocking=true', function() - meths.nvim_ui_attach(80, 20, {}) - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + api.nvim_ui_attach(80, 20, {}) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") command("echom 'msg4'") command("echom 'msg5'") - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) - meths.nvim_input(':messages') - eq({ mode = 'r', blocking = true }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) + api.nvim_input(':messages') + eq({ mode = 'r', blocking = true }, api.nvim_get_mode()) end) it('during getchar() returns blocking=false', function() - meths.nvim_input(':let g:test_input = nr2char(getchar())') + api.nvim_input(':let g:test_input = nr2char(getchar())') -- Events are enabled during getchar(), RPC calls are *not* blocked. #5384 - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) - eq(0, meths.nvim_eval("exists('g:test_input')")) - meths.nvim_input('J') - eq('J', meths.nvim_eval('g:test_input')) - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) + eq(0, api.nvim_eval("exists('g:test_input')")) + api.nvim_input('J') + eq('J', api.nvim_eval('g:test_input')) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) -- TODO: bug #6247#issuecomment-286403810 it('batched with input', function() - meths.nvim_ui_attach(80, 20, {}) - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + api.nvim_ui_attach(80, 20, {}) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) command("echom 'msg1'") command("echom 'msg2'") command("echom 'msg3'") @@ -1896,35 +1896,35 @@ describe('API', function() 1, }, NIL, - }, meths.nvim_call_atomic(req)) - eq({ mode = 'r', blocking = true }, meths.nvim_get_mode()) + }, api.nvim_call_atomic(req)) + eq({ mode = 'r', blocking = true }, api.nvim_get_mode()) end) it('during insert-mode map-pending, returns blocking=true #6166', function() command('inoremap xx foo') - meths.nvim_input('ix') - eq({ mode = 'i', blocking = true }, meths.nvim_get_mode()) + api.nvim_input('ix') + eq({ mode = 'i', blocking = true }, api.nvim_get_mode()) end) it('during normal-mode gU, returns blocking=false #6166', function() - meths.nvim_input('gu') - eq({ mode = 'no', blocking = false }, meths.nvim_get_mode()) + api.nvim_input('gu') + eq({ mode = 'no', blocking = false }, api.nvim_get_mode()) end) it("at '-- More --' prompt returns blocking=true #11899", function() command('set more') feed(':digraphs') - eq({ mode = 'rm', blocking = true }, meths.nvim_get_mode()) + eq({ mode = 'rm', blocking = true }, api.nvim_get_mode()) end) it('after mapping returns blocking=false #17257', function() command('nnoremap ') feed('') - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) it('after empty string mapping returns blocking=false #17257', function() command('nnoremap ""') feed('') - eq({ mode = 'n', blocking = false }, meths.nvim_get_mode()) + eq({ mode = 'n', blocking = false }, api.nvim_get_mode()) end) end) @@ -1933,16 +1933,16 @@ describe('API', function() helpers.insert([[ FIRST LINE SECOND LINE]]) - meths.nvim_input('gg') - meths.nvim_input('gu') + api.nvim_input('gg') + api.nvim_input('gu') -- Make any RPC request (can be non-async: op-pending does not block). - meths.nvim_get_current_buf() + api.nvim_get_current_buf() -- Buffer should not change. expect([[ FIRST LINE SECOND LINE]]) -- Now send input to complete the operator. - meths.nvim_input('j') + api.nvim_input('j') expect([[ first line second line]]) @@ -1956,7 +1956,7 @@ describe('API', function() feed('iabckkk') feed('d') -- Make any RPC request (can be non-async: op-pending does not block). - meths.nvim_get_current_buf() + api.nvim_get_current_buf() screen:expect([[ ^a$ | b$ | @@ -1970,12 +1970,12 @@ describe('API', function() helpers.insert([[ FIRST LINE SECOND LINE]]) - meths.nvim_input('gg') - meths.nvim_input('d') + api.nvim_input('gg') + api.nvim_input('d') -- Make any RPC request (must be async, because map-pending blocks). - meths.nvim_get_api_info() + api.nvim_get_api_info() -- Send input to complete the mapping. - meths.nvim_input('d') + api.nvim_input('d') expect([[ FIRST LINE SECOND LINE]]) @@ -1988,11 +1988,11 @@ describe('API', function() helpers.insert([[ FIRST LINE SECOND LINE]]) - meths.nvim_input('ix') + api.nvim_input('ix') -- Make any RPC request (must be async, because map-pending blocks). - meths.nvim_get_api_info() + api.nvim_get_api_info() -- Send input to complete the mapping. - meths.nvim_input('x') + api.nvim_input('x') expect([[ FIRST LINE SECOND LINfooE]]) @@ -2000,24 +2000,24 @@ describe('API', function() it('does not interrupt Insert mode i_CTRL-O #10035', function() feed('iHello World') - eq({ mode = 'niI', blocking = false }, meths.nvim_get_mode()) -- fast event + eq({ mode = 'niI', blocking = false }, api.nvim_get_mode()) -- fast event eq(2, eval('1+1')) -- causes K_EVENT key - eq({ mode = 'niI', blocking = false }, meths.nvim_get_mode()) -- still in ctrl-o mode + eq({ mode = 'niI', blocking = false }, api.nvim_get_mode()) -- still in ctrl-o mode feed('dd') - eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) -- left ctrl-o mode + eq({ mode = 'i', blocking = false }, api.nvim_get_mode()) -- left ctrl-o mode expect('') -- executed the command end) it('does not interrupt Select mode v_CTRL-O #15688', function() feed('iHello Worldgh') - eq({ mode = 'vs', blocking = false }, meths.nvim_get_mode()) -- fast event - eq({ mode = 'vs', blocking = false }, meths.nvim_get_mode()) -- again #15288 + eq({ mode = 'vs', blocking = false }, api.nvim_get_mode()) -- fast event + eq({ mode = 'vs', blocking = false }, api.nvim_get_mode()) -- again #15288 eq(2, eval('1+1')) -- causes K_EVENT key - eq({ mode = 'vs', blocking = false }, meths.nvim_get_mode()) -- still in ctrl-o mode + eq({ mode = 'vs', blocking = false }, api.nvim_get_mode()) -- still in ctrl-o mode feed('^') - eq({ mode = 's', blocking = false }, meths.nvim_get_mode()) -- left ctrl-o mode + eq({ mode = 's', blocking = false }, api.nvim_get_mode()) -- left ctrl-o mode feed('h') - eq({ mode = 'i', blocking = false }, meths.nvim_get_mode()) -- entered insert mode + eq({ mode = 'i', blocking = false }, api.nvim_get_mode()) -- entered insert mode expect('h') -- selection is the whole line and is replaced end) @@ -2043,34 +2043,34 @@ describe('API', function() feed('') eq(2, eval('1+1')) -- causes K_EVENT key feed('.') - eq('…', funcs.getcmdline()) -- digraph ",." worked + eq('…', fn.getcmdline()) -- digraph ",." worked end) end) describe('nvim_get_context', function() it('validation', function() - eq("Invalid key: 'blah'", pcall_err(meths.nvim_get_context, { blah = {} })) + eq("Invalid key: 'blah'", pcall_err(api.nvim_get_context, { blah = {} })) eq( "Invalid 'types': expected Array, got Integer", - pcall_err(meths.nvim_get_context, { types = 42 }) + pcall_err(api.nvim_get_context, { types = 42 }) ) eq( "Invalid 'type': 'zub'", - pcall_err(meths.nvim_get_context, { types = { 'jumps', 'zub', 'zam' } }) + pcall_err(api.nvim_get_context, { types = { 'jumps', 'zub', 'zam' } }) ) end) it('returns map of current editor state', function() local opts = { types = { 'regs', 'jumps', 'bufs', 'gvars' } } - eq({}, parse_context(meths.nvim_get_context({}))) + eq({}, parse_context(api.nvim_get_context({}))) feed('i123ddddddqahjklquuu') feed('gg') feed('G') command('edit! BUF1') command('edit BUF2') - meths.nvim_set_var('one', 1) - meths.nvim_set_var('Two', 2) - meths.nvim_set_var('THREE', 3) + api.nvim_set_var('one', 1) + api.nvim_set_var('Two', 2) + api.nvim_set_var('THREE', 3) local expected_ctx = { ['regs'] = { @@ -2095,72 +2095,72 @@ describe('API', function() ['gvars'] = { { 'one', 1 }, { 'Two', 2 }, { 'THREE', 3 } }, } - eq(expected_ctx, parse_context(meths.nvim_get_context(opts))) - eq(expected_ctx, parse_context(meths.nvim_get_context({}))) - eq(expected_ctx, parse_context(meths.nvim_get_context({ types = {} }))) + eq(expected_ctx, parse_context(api.nvim_get_context(opts))) + eq(expected_ctx, parse_context(api.nvim_get_context({}))) + eq(expected_ctx, parse_context(api.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' } } - eq({}, parse_context(meths.nvim_get_context(opts))) - - meths.nvim_set_var('one', 1) - meths.nvim_set_var('Two', 2) - meths.nvim_set_var('THREE', 3) - local ctx = meths.nvim_get_context(opts) - meths.nvim_set_var('one', 'a') - meths.nvim_set_var('Two', 'b') - meths.nvim_set_var('THREE', 'c') + eq({}, parse_context(api.nvim_get_context(opts))) + + api.nvim_set_var('one', 1) + api.nvim_set_var('Two', 2) + api.nvim_set_var('THREE', 3) + local ctx = api.nvim_get_context(opts) + api.nvim_set_var('one', 'a') + api.nvim_set_var('Two', 'b') + api.nvim_set_var('THREE', 'c') eq({ 'a', 'b', 'c' }, eval('[g:one, g:Two, g:THREE]')) - meths.nvim_load_context(ctx) + api.nvim_load_context(ctx) 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(meths.nvim_load_context, { regs = { {} }, jumps = { {} } }) + pcall_err(api.nvim_load_context, { regs = { {} }, jumps = { {} } }) ) eq( 'E474: Failed to convert list to msgpack string buffer', - pcall_err(meths.nvim_load_context, { regs = { { [''] = '' } } }) + pcall_err(api.nvim_load_context, { regs = { { [''] = '' } } }) ) end) end) describe('nvim_replace_termcodes', function() it('escapes K_SPECIAL as K_SPECIAL KS_SPECIAL KE_FILLER', function() - eq('\128\254X', helpers.meths.nvim_replace_termcodes('\128', true, true, true)) + eq('\128\254X', helpers.api.nvim_replace_termcodes('\128', true, true, true)) end) it('leaves non-K_SPECIAL string unchanged', function() - eq('abc', helpers.meths.nvim_replace_termcodes('abc', true, true, true)) + eq('abc', helpers.api.nvim_replace_termcodes('abc', true, true, true)) end) it('converts ', function() - eq('\\', helpers.meths.nvim_replace_termcodes('', true, true, true)) + eq('\\', helpers.api.nvim_replace_termcodes('', true, true, true)) end) it('converts to K_SPECIAL KS_EXTRA KE_LEFTMOUSE', function() -- K_SPECIAL KS_EXTRA KE_LEFTMOUSE -- 0x80 0xfd 0x2c -- 128 253 44 - eq('\128\253\44', helpers.meths.nvim_replace_termcodes('', true, true, true)) + eq('\128\253\44', helpers.api.nvim_replace_termcodes('', true, true, true)) end) it('converts keycodes', function() eq( '\nx\27x\rxxxxx', true, true, true) + helpers.api.nvim_replace_termcodes('xxxx', true, true, true) ) end) it('does not convert keycodes if special=false', function() eq( 'xxxx', - helpers.meths.nvim_replace_termcodes('xxxx', true, true, false) + helpers.api.nvim_replace_termcodes('xxxx', true, true, false) ) end) @@ -2172,13 +2172,13 @@ describe('API', function() -- then `return str` in vim_replace_termcodes body will make Neovim free -- `str.data` twice: once when freeing arguments, then when freeing return -- value. - eq('', meths.nvim_replace_termcodes('', true, true, true)) + eq('', api.nvim_replace_termcodes('', true, true, true)) end) -- Not exactly the case, as nvim_replace_termcodes() escapes K_SPECIAL in Unicode it('translates the result of keytrans() on string with 0x80 byte back', function() local s = 'ff\128\253\097tt' - eq(s, meths.nvim_replace_termcodes(funcs.keytrans(s), true, true, true)) + eq(s, api.nvim_replace_termcodes(fn.keytrans(s), true, true, true)) end) end) @@ -2186,15 +2186,15 @@ describe('API', function() it('K_SPECIAL escaping', function() local function on_setup() -- notice the special char(…) \xe2\80\xa6 - meths.nvim_feedkeys(':let x1="…"\n', '', true) + api.nvim_feedkeys(':let x1="…"\n', '', true) -- Both nvim_replace_termcodes and nvim_feedkeys escape \x80 - local inp = helpers.meths.nvim_replace_termcodes(':let x2="…"', true, true, true) - meths.nvim_feedkeys(inp, '', true) -- escape_ks=true + local inp = helpers.api.nvim_replace_termcodes(':let x2="…"', true, true, true) + api.nvim_feedkeys(inp, '', true) -- escape_ks=true -- nvim_feedkeys with K_SPECIAL escaping disabled - inp = helpers.meths.nvim_replace_termcodes(':let x3="…"', true, true, true) - meths.nvim_feedkeys(inp, '', false) -- escape_ks=false + inp = helpers.api.nvim_replace_termcodes(':let x3="…"', true, true, true) + api.nvim_feedkeys(inp, '', false) -- escape_ks=false helpers.stop() end @@ -2202,10 +2202,10 @@ describe('API', function() -- spin the loop a bit helpers.run(nil, nil, on_setup) - eq('…', meths.nvim_get_var('x1')) + eq('…', api.nvim_get_var('x1')) -- Because of the double escaping this is neq - neq('…', meths.nvim_get_var('x2')) - eq('…', meths.nvim_get_var('x3')) + neq('…', api.nvim_get_var('x2')) + eq('…', api.nvim_get_var('x3')) end) end) @@ -2240,7 +2240,7 @@ describe('API', function() silent! call nvim_out_write("\n") redir END ]]) - eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', meths.nvim_get_var('out')) + eq('\naaa\n' .. ('a'):rep(5002) .. '\naaa', api.nvim_get_var('out')) end) it('blank line in message', function() @@ -2426,18 +2426,18 @@ describe('API', function() } it('returns {} for invalid channel', function() - eq({}, meths.nvim_get_chan_info(0)) - eq({}, meths.nvim_get_chan_info(-1)) + eq({}, api.nvim_get_chan_info(0)) + eq({}, api.nvim_get_chan_info(-1)) -- more preallocated numbers might be added, try something high - eq({}, meths.nvim_get_chan_info(10)) + eq({}, api.nvim_get_chan_info(10)) end) it('stream=stdio channel', function() - eq({ [1] = testinfo, [2] = stderr }, meths.nvim_list_chans()) - eq(testinfo, meths.nvim_get_chan_info(1)) - eq(stderr, meths.nvim_get_chan_info(2)) + eq({ [1] = testinfo, [2] = stderr }, api.nvim_list_chans()) + eq(testinfo, api.nvim_get_chan_info(1)) + eq(stderr, api.nvim_get_chan_info(2)) - meths.nvim_set_client_info( + api.nvim_set_client_info( 'functionaltests', { major = 0, minor = 3, patch = 17 }, 'ui', @@ -2456,9 +2456,9 @@ describe('API', function() attributes = { license = 'Apache2' }, }, } - eq({ info = info }, meths.nvim_get_var('info_event')) - eq({ [1] = info, [2] = stderr }, meths.nvim_list_chans()) - eq(info, meths.nvim_get_chan_info(1)) + eq({ info = info }, api.nvim_get_var('info_event')) + eq({ [1] = info, [2] = stderr }, api.nvim_list_chans()) + eq(info, api.nvim_get_chan_info(1)) end) it('stream=job channel', function() @@ -2471,9 +2471,9 @@ describe('API', function() mode = 'rpc', client = {}, } - eq({ info = info }, meths.nvim_get_var('opened_event')) - eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.nvim_list_chans()) - eq(info, meths.nvim_get_chan_info(3)) + eq({ info = info }, api.nvim_get_var('opened_event')) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, api.nvim_list_chans()) + eq(info, api.nvim_get_chan_info(3)) eval( 'rpcrequest(3, "nvim_set_client_info", "amazing-cat", {}, "remote",' .. '{"nvim_command":{"n_args":1}},' -- and so on @@ -2492,8 +2492,8 @@ describe('API', function() attributes = { description = 'The Amazing Cat' }, }, } - eq({ info = info }, meths.nvim_get_var('info_event')) - eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.nvim_list_chans()) + eq({ info = info }, api.nvim_get_var('info_event')) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, api.nvim_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", @@ -2503,8 +2503,8 @@ describe('API', function() it('stream=job :terminal channel', function() command(':terminal') - eq({ id = 1 }, meths.nvim_get_current_buf()) - eq(3, meths.nvim_get_option_value('channel', { buf = 1 })) + eq({ id = 1 }, api.nvim_get_current_buf()) + eq(3, api.nvim_get_option_value('channel', { buf = 1 })) local info = { stream = 'job', @@ -2514,20 +2514,20 @@ describe('API', function() buffer = 1, pty = '?', } - local event = meths.nvim_get_var('opened_event') + local event = api.nvim_get_var('opened_event') if not is_os('win') then info.pty = event.info.pty neq(nil, string.match(info.pty, '^/dev/')) end eq({ info = info }, event) info.buffer = { id = 1 } - eq({ [1] = testinfo, [2] = stderr, [3] = info }, meths.nvim_list_chans()) - eq(info, meths.nvim_get_chan_info(3)) + eq({ [1] = testinfo, [2] = stderr, [3] = info }, api.nvim_list_chans()) + eq(info, api.nvim_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), { + fn.termopen(('%s -u NONE -i NONE'):format(progpath_esc), { env = { VIMRUNTIME = os.getenv('VIMRUNTIME') }, }) eq(-1, eval('jobwait([&channel], 0)[0]')) -- Running? @@ -2562,13 +2562,13 @@ describe('API', function() describe('nvim_call_atomic', function() it('works', function() - meths.nvim_buf_set_lines(0, 0, -1, true, { 'first' }) + api.nvim_buf_set_lines(0, 0, -1, true, { 'first' }) local req = { { 'nvim_get_current_line', {} }, { 'nvim_set_current_line', { 'second' } }, } - eq({ { 'first', NIL }, NIL }, meths.nvim_call_atomic(req)) - eq({ 'second' }, meths.nvim_buf_get_lines(0, 0, -1, true)) + eq({ { 'first', NIL }, NIL }, api.nvim_call_atomic(req)) + eq({ 'second' }, api.nvim_buf_get_lines(0, 0, -1, true)) end) it('allows multiple return values', function() @@ -2578,11 +2578,11 @@ describe('API', function() { 'nvim_get_var', { 'avar' } }, { 'nvim_get_var', { 'bvar' } }, } - eq({ { NIL, NIL, true, 'string' }, NIL }, meths.nvim_call_atomic(req)) + eq({ { NIL, NIL, true, 'string' }, NIL }, api.nvim_call_atomic(req)) end) it('is aborted by errors in call', function() - local error_types = meths.nvim_get_api_info()[2].error_types + local error_types = api.nvim_get_api_info()[2].error_types local req = { { 'nvim_set_var', { 'one', 1 } }, { 'nvim_buf_set_lines', {} }, @@ -2595,9 +2595,9 @@ describe('API', function() error_types.Exception.id, 'Wrong number of arguments: expecting 5 but got 0', }, - }, meths.nvim_call_atomic(req)) - eq(1, meths.nvim_get_var('one')) - eq(false, pcall(meths.nvim_get_var, 'two')) + }, api.nvim_call_atomic(req)) + eq(1, api.nvim_get_var('one')) + eq(false, pcall(api.nvim_get_var, 'two')) -- still returns all previous successful calls req = { @@ -2609,7 +2609,7 @@ describe('API', function() } eq( { { NIL, NIL, 5 }, { 3, error_types.Validation.id, 'Index out of bounds' } }, - meths.nvim_call_atomic(req) + api.nvim_call_atomic(req) ) req = { @@ -2618,9 +2618,9 @@ describe('API', function() } eq( { {}, { 0, error_types.Exception.id, 'Invalid method: i_am_not_a_method' } }, - meths.nvim_call_atomic(req) + api.nvim_call_atomic(req) ) - eq(5, meths.nvim_get_var('avar')) + eq(5, api.nvim_get_var('avar')) end) it('validation', function() @@ -2629,28 +2629,25 @@ describe('API', function() { 'nvim_set_var' }, { 'nvim_set_var', { 'avar', 2 } }, } - eq("Invalid 'calls' item: expected 2-item Array", pcall_err(meths.nvim_call_atomic, req)) + eq("Invalid 'calls' item: expected 2-item Array", pcall_err(api.nvim_call_atomic, req)) -- call before was done, but not after - eq(1, meths.nvim_get_var('avar')) + eq(1, api.nvim_get_var('avar')) req = { { 'nvim_set_var', { 'bvar', { 2, 3 } } }, 12, } - eq( - "Invalid 'calls' item: expected Array, got Integer", - pcall_err(meths.nvim_call_atomic, req) - ) - eq({ 2, 3 }, meths.nvim_get_var('bvar')) + eq("Invalid 'calls' item: expected Array, got Integer", pcall_err(api.nvim_call_atomic, req)) + eq({ 2, 3 }, api.nvim_get_var('bvar')) req = { { 'nvim_set_current_line', 'little line' }, { 'nvim_set_var', { 'avar', 3 } }, } - eq('Invalid call args: expected Array, got String', pcall_err(meths.nvim_call_atomic, req)) + eq('Invalid call args: expected Array, got String', pcall_err(api.nvim_call_atomic, req)) -- call before was done, but not after - eq(1, meths.nvim_get_var('avar')) - eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, true)) + eq(1, api.nvim_get_var('avar')) + eq({ '' }, api.nvim_buf_get_lines(0, 0, -1, true)) end) end) @@ -2664,55 +2661,55 @@ describe('API', function() rmdir 'Xtest' end) before_each(function() - meths.nvim_set_current_dir 'Xtest' + api.nvim_set_current_dir 'Xtest' end) it('returns nothing with empty &runtimepath', function() - meths.nvim_set_option_value('runtimepath', '', {}) - eq({}, meths.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', '', {}) + eq({}, api.nvim_list_runtime_paths()) end) it('returns single runtimepath', function() - meths.nvim_set_option_value('runtimepath', 'a', {}) - eq({ 'a' }, meths.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', 'a', {}) + eq({ 'a' }, api.nvim_list_runtime_paths()) end) it('returns two runtimepaths', function() - meths.nvim_set_option_value('runtimepath', 'a,b', {}) - eq({ 'a', 'b' }, meths.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', 'a,b', {}) + eq({ 'a', 'b' }, api.nvim_list_runtime_paths()) end) it('returns empty strings when appropriate', function() - meths.nvim_set_option_value('runtimepath', 'a,,b', {}) - eq({ 'a', '', 'b' }, meths.nvim_list_runtime_paths()) - meths.nvim_set_option_value('runtimepath', ',a,b', {}) - eq({ '', 'a', 'b' }, meths.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', 'a,,b', {}) + eq({ 'a', '', 'b' }, api.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', ',a,b', {}) + eq({ '', 'a', 'b' }, api.nvim_list_runtime_paths()) -- Trailing "," is ignored. Use ",," if you really really want CWD. - meths.nvim_set_option_value('runtimepath', 'a,b,', {}) - eq({ 'a', 'b' }, meths.nvim_list_runtime_paths()) - meths.nvim_set_option_value('runtimepath', 'a,b,,', {}) - eq({ 'a', 'b', '' }, meths.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', 'a,b,', {}) + eq({ 'a', 'b' }, api.nvim_list_runtime_paths()) + api.nvim_set_option_value('runtimepath', 'a,b,,', {}) + eq({ 'a', 'b', '' }, api.nvim_list_runtime_paths()) end) it('truncates too long paths', function() local long_path = ('/a'):rep(8192) - meths.nvim_set_option_value('runtimepath', long_path, {}) - local paths_list = meths.nvim_list_runtime_paths() + api.nvim_set_option_value('runtimepath', long_path, {}) + local paths_list = api.nvim_list_runtime_paths() eq({}, paths_list) end) end) it('can throw exceptions', function() - local status, err = pcall(meths.nvim_get_option_value, 'invalid-option', {}) + local status, err = pcall(api.nvim_get_option_value, 'invalid-option', {}) eq(false, status) ok(err:match("Unknown option 'invalid%-option'") ~= nil) end) it('does not truncate error message <1 MB #5984', function() local very_long_name = 'A' .. ('x'):rep(10000) .. 'Z' - local status, err = pcall(meths.nvim_get_option_value, very_long_name, {}) + local status, err = pcall(api.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(meths.nvim_set_current_dir, { 'not', 'a', 'dir' }) + local status, err = pcall(api.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') @@ -2722,7 +2719,7 @@ describe('API', function() describe('nvim_parse_expression', function() before_each(function() - meths.nvim_set_option_value('isident', '', {}) + api.nvim_set_option_value('isident', '', {}) end) local function simplify_east_api_node(line, east_api_node) @@ -2855,7 +2852,7 @@ describe('API', function() nz_flags_exps = nz_flags_exps or {} for _, flags in ipairs(opts.flags) do local err, msg = pcall(function() - local east_api = meths.nvim_parse_expression(str, FLAGS_TO_STR[flags], true) + local east_api = api.nvim_parse_expression(str, FLAGS_TO_STR[flags], true) local east_hl = east_api.highlight east_api.highlight = nil local ast = simplify_east_api(str, east_api) @@ -2935,7 +2932,7 @@ describe('API', function() describe('nvim_list_uis', function() it('returns empty if --headless', function() -- Test runner defaults to --headless. - eq({}, meths.nvim_list_uis()) + eq({}, api.nvim_list_uis()) end) it('returns attached UIs', function() local screen = Screen.new(20, 4) @@ -2964,7 +2961,7 @@ describe('API', function() }, } - eq(expected, meths.nvim_list_uis()) + eq(expected, api.nvim_list_uis()) screen:detach() screen = Screen.new(44, 99) @@ -2973,39 +2970,39 @@ describe('API', function() expected[1].override = false expected[1].width = 44 expected[1].height = 99 - eq(expected, meths.nvim_list_uis()) + eq(expected, api.nvim_list_uis()) end) end) describe('nvim_create_namespace', function() it('works', function() - eq({}, meths.nvim_get_namespaces()) - eq(1, meths.nvim_create_namespace('ns-1')) - eq(2, meths.nvim_create_namespace('ns-2')) - eq(1, meths.nvim_create_namespace('ns-1')) - eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, meths.nvim_get_namespaces()) - eq(3, meths.nvim_create_namespace('')) - eq(4, meths.nvim_create_namespace('')) - eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, meths.nvim_get_namespaces()) + eq({}, api.nvim_get_namespaces()) + eq(1, api.nvim_create_namespace('ns-1')) + eq(2, api.nvim_create_namespace('ns-2')) + eq(1, api.nvim_create_namespace('ns-1')) + eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, api.nvim_get_namespaces()) + eq(3, api.nvim_create_namespace('')) + eq(4, api.nvim_create_namespace('')) + eq({ ['ns-1'] = 1, ['ns-2'] = 2 }, api.nvim_get_namespaces()) end) end) describe('nvim_create_buf', function() it('works', function() - eq({ id = 2 }, meths.nvim_create_buf(true, false)) - eq({ id = 3 }, meths.nvim_create_buf(false, false)) + eq({ id = 2 }, api.nvim_create_buf(true, false)) + eq({ id = 3 }, api.nvim_create_buf(false, false)) eq( ' 1 %a "[No Name]" line 1\n' .. ' 2 h "[No Name]" line 0', command_output('ls') ) -- current buffer didn't change - eq({ id = 1 }, meths.nvim_get_current_buf()) + eq({ id = 1 }, api.nvim_get_current_buf()) local screen = Screen.new(20, 4) screen:attach() - meths.nvim_buf_set_lines(2, 0, -1, true, { 'some text' }) - meths.nvim_set_current_buf(2) + api.nvim_buf_set_lines(2, 0, -1, true, { 'some text' }) + api.nvim_set_current_buf(2) screen:expect( [[ ^some text | @@ -3019,43 +3016,43 @@ describe('API', function() end) it('can change buftype before visiting', function() - meths.nvim_set_option_value('hidden', false, {}) - eq({ id = 2 }, meths.nvim_create_buf(true, false)) - meths.nvim_set_option_value('buftype', 'nofile', { buf = 2 }) - meths.nvim_buf_set_lines(2, 0, -1, true, { 'test text' }) + api.nvim_set_option_value('hidden', false, {}) + eq({ id = 2 }, api.nvim_create_buf(true, false)) + api.nvim_set_option_value('buftype', 'nofile', { buf = 2 }) + api.nvim_buf_set_lines(2, 0, -1, true, { 'test text' }) command('split | buffer 2') - eq({ id = 2 }, meths.nvim_get_current_buf()) + eq({ id = 2 }, api.nvim_get_current_buf()) -- if the buf_set_option("buftype") didn't work, this would error out. command('close') - eq({ id = 1 }, meths.nvim_get_current_buf()) + eq({ id = 1 }, api.nvim_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') - eq({ id = 2 }, meths.nvim_create_buf(true, false)) - meths.nvim_buf_set_lines(2, 0, -1, true, { 'test', 'text' }) + eq({ id = 2 }, api.nvim_create_buf(true, false)) + api.nvim_buf_set_lines(2, 0, -1, true, { 'test', 'text' }) eq(false, eval('g:fired')) end) it('TextChanged and TextChangedI do not trigger without changes', function() - local buf = meths.nvim_create_buf(true, false) + local buf = api.nvim_create_buf(true, false) command([[let g:changed = '']]) - meths.nvim_create_autocmd({ 'TextChanged', 'TextChangedI' }, { + api.nvim_create_autocmd({ 'TextChanged', 'TextChangedI' }, { buffer = buf, command = 'let g:changed ..= mode()', }) - meths.nvim_set_current_buf(buf) + api.nvim_set_current_buf(buf) feed('i') - eq('', meths.nvim_get_var('changed')) + eq('', api.nvim_get_var('changed')) end) it('scratch-buffer', function() - eq({ id = 2 }, meths.nvim_create_buf(false, true)) - eq({ id = 3 }, meths.nvim_create_buf(true, true)) - eq({ id = 4 }, meths.nvim_create_buf(true, true)) + eq({ id = 2 }, api.nvim_create_buf(false, true)) + eq({ id = 3 }, api.nvim_create_buf(true, true)) + eq({ id = 4 }, api.nvim_create_buf(true, true)) local scratch_bufs = { 2, 3, 4 } eq( ' 1 %a "[No Name]" line 1\n' @@ -3064,7 +3061,7 @@ describe('API', function() exec_capture('ls') ) -- current buffer didn't change - eq({ id = 1 }, meths.nvim_get_current_buf()) + eq({ id = 1 }, api.nvim_get_current_buf()) local screen = Screen.new(20, 4) screen:set_default_attr_ids({ @@ -3076,27 +3073,27 @@ describe('API', function() -- Editing a scratch-buffer does NOT change its properties. -- local edited_buf = 2 - meths.nvim_buf_set_lines(edited_buf, 0, -1, true, { 'some text' }) + api.nvim_buf_set_lines(edited_buf, 0, -1, true, { 'some text' }) for _, b in ipairs(scratch_bufs) do - eq('nofile', meths.nvim_get_option_value('buftype', { buf = b })) - eq('hide', meths.nvim_get_option_value('bufhidden', { buf = b })) - eq(false, meths.nvim_get_option_value('swapfile', { buf = b })) - eq(false, meths.nvim_get_option_value('modeline', { buf = b })) + eq('nofile', api.nvim_get_option_value('buftype', { buf = b })) + eq('hide', api.nvim_get_option_value('bufhidden', { buf = b })) + eq(false, api.nvim_get_option_value('swapfile', { buf = b })) + eq(false, api.nvim_get_option_value('modeline', { buf = b })) end -- -- Visiting a scratch-buffer DOES NOT change its properties. -- - meths.nvim_set_current_buf(edited_buf) + api.nvim_set_current_buf(edited_buf) screen:expect([[ ^some text | {1:~ }|*2 | ]]) - eq('nofile', meths.nvim_get_option_value('buftype', { buf = edited_buf })) - eq('hide', meths.nvim_get_option_value('bufhidden', { buf = edited_buf })) - eq(false, meths.nvim_get_option_value('swapfile', { buf = edited_buf })) - eq(false, meths.nvim_get_option_value('modeline', { buf = edited_buf })) + eq('nofile', api.nvim_get_option_value('buftype', { buf = edited_buf })) + eq('hide', api.nvim_get_option_value('bufhidden', { buf = edited_buf })) + eq(false, api.nvim_get_option_value('swapfile', { buf = edited_buf })) + eq(false, api.nvim_get_option_value('modeline', { buf = edited_buf })) -- Scratch buffer can be wiped without error. command('bwipe') @@ -3118,11 +3115,11 @@ describe('API', function() describe('nvim_get_runtime_file', function() local p = helpers.alter_slashes it('can find files', function() - eq({}, meths.nvim_get_runtime_file('bork.borkbork', false)) - eq({}, meths.nvim_get_runtime_file('bork.borkbork', true)) - eq(1, #meths.nvim_get_runtime_file('autoload/msgpack.vim', false)) - eq(1, #meths.nvim_get_runtime_file('autoload/msgpack.vim', true)) - local val = meths.nvim_get_runtime_file('autoload/remote/*.vim', true) + eq({}, api.nvim_get_runtime_file('bork.borkbork', false)) + eq({}, api.nvim_get_runtime_file('bork.borkbork', true)) + eq(1, #api.nvim_get_runtime_file('autoload/msgpack.vim', false)) + eq(1, #api.nvim_get_runtime_file('autoload/msgpack.vim', true)) + local val = api.nvim_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')) @@ -3131,37 +3128,37 @@ describe('API', function() ok(endswith(val[1], p 'autoload/remote/host.vim')) ok(endswith(val[2], p 'autoload/remote/define.vim')) end - val = meths.nvim_get_runtime_file('autoload/remote/*.vim', false) + val = api.nvim_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') ) - val = meths.nvim_get_runtime_file('lua', true) + val = api.nvim_get_runtime_file('lua', true) eq(1, #val) ok(endswith(val[1], p 'lua')) - val = meths.nvim_get_runtime_file('lua/vim', true) + val = api.nvim_get_runtime_file('lua/vim', true) eq(1, #val) ok(endswith(val[1], p 'lua/vim')) end) it('can find directories', function() - local val = meths.nvim_get_runtime_file('lua/', true) + local val = api.nvim_get_runtime_file('lua/', true) eq(1, #val) ok(endswith(val[1], p 'lua/')) - val = meths.nvim_get_runtime_file('lua/vim/', true) + val = api.nvim_get_runtime_file('lua/vim/', true) eq(1, #val) ok(endswith(val[1], p 'lua/vim/')) - eq({}, meths.nvim_get_runtime_file('foobarlang/', true)) + eq({}, api.nvim_get_runtime_file('foobarlang/', true)) end) it('can handle bad patterns', function() skip(is_os('win')) - eq('Vim:E220: Missing }.', pcall_err(meths.nvim_get_runtime_file, '{', false)) + eq('Vim:E220: Missing }.', pcall_err(api.nvim_get_runtime_file, '{', false)) eq( 'Vim(echo):E5555: API call: Vim:E220: Missing }.', @@ -3172,25 +3169,25 @@ describe('API', function() describe('nvim_get_all_options_info', function() it('should have key value pairs of option names', function() - local options_info = meths.nvim_get_all_options_info() + local options_info = api.nvim_get_all_options_info() neq(nil, options_info.listchars) neq(nil, options_info.tabstop) - eq(meths.nvim_get_option_info 'winhighlight', options_info.winhighlight) + eq(api.nvim_get_option_info 'winhighlight', options_info.winhighlight) end) it('should not crash when echoed', function() - meths.nvim_exec2('echo nvim_get_all_options_info()', { output = true }) + api.nvim_exec2('echo nvim_get_all_options_info()', { output = true }) end) end) describe('nvim_get_option_info', function() it('should error for unknown options', function() - eq("Invalid option (not found): 'bogus'", pcall_err(meths.nvim_get_option_info, 'bogus')) + eq("Invalid option (not found): 'bogus'", pcall_err(api.nvim_get_option_info, 'bogus')) end) it('should return the same options for short and long name', function() - eq(meths.nvim_get_option_info 'winhl', meths.nvim_get_option_info 'winhighlight') + eq(api.nvim_get_option_info 'winhl', api.nvim_get_option_info 'winhighlight') end) it('should have information about window options', function() @@ -3208,7 +3205,7 @@ describe('API', function() shortname = 'winhl', type = 'string', was_set = false, - }, meths.nvim_get_option_info 'winhl') + }, api.nvim_get_option_info 'winhl') end) it('should have information about buffer options', function() @@ -3226,13 +3223,13 @@ describe('API', function() shortname = 'ft', type = 'string', was_set = false, - }, meths.nvim_get_option_info 'filetype') + }, api.nvim_get_option_info 'filetype') end) it('should have information about global options', function() -- precondition: the option was changed from its default -- in test setup. - eq(false, meths.nvim_get_option_value('showcmd', {})) + eq(false, api.nvim_get_option_value('showcmd', {})) eq({ allows_duplicates = true, @@ -3248,9 +3245,9 @@ describe('API', function() shortname = 'sc', type = 'boolean', was_set = true, - }, meths.nvim_get_option_info 'showcmd') + }, api.nvim_get_option_info 'showcmd') - meths.nvim_set_option_value('showcmd', true, {}) + api.nvim_set_option_value('showcmd', true, {}) eq({ allows_duplicates = true, @@ -3266,7 +3263,7 @@ describe('API', function() shortname = 'sc', type = 'boolean', was_set = true, - }, meths.nvim_get_option_info 'showcmd') + }, api.nvim_get_option_info 'showcmd') end) end) @@ -3293,18 +3290,18 @@ describe('API', function() ) exec_lua 'vim.cmd.vsplit()' - meths.nvim_create_buf(false, false) + api.nvim_create_buf(false, false) - bufs = meths.nvim_list_bufs() - wins = meths.nvim_list_wins() + bufs = api.nvim_list_bufs() + wins = api.nvim_list_wins() - meths.nvim_win_set_buf(wins[1].id, bufs[1].id) - meths.nvim_win_set_buf(wins[2].id, bufs[2].id) + api.nvim_win_set_buf(wins[1].id, bufs[1].id) + api.nvim_win_set_buf(wins[2].id, bufs[2].id) - meths.nvim_set_current_win(wins[2].id) - meths.nvim_exec('source ' .. fname, false) + api.nvim_set_current_win(wins[2].id) + api.nvim_exec('source ' .. fname, false) - meths.nvim_set_current_win(wins[1].id) + api.nvim_set_current_win(wins[1].id) end) after_each(function() @@ -3312,9 +3309,9 @@ describe('API', function() end) it('should return option information', function() - eq(meths.nvim_get_option_info('dictionary'), meths.nvim_get_option_info2('dictionary', {})) -- buffer - eq(meths.nvim_get_option_info('fillchars'), meths.nvim_get_option_info2('fillchars', {})) -- window - eq(meths.nvim_get_option_info('completeopt'), meths.nvim_get_option_info2('completeopt', {})) -- global + eq(api.nvim_get_option_info('dictionary'), api.nvim_get_option_info2('dictionary', {})) -- buffer + eq(api.nvim_get_option_info('fillchars'), api.nvim_get_option_info2('fillchars', {})) -- window + eq(api.nvim_get_option_info('completeopt'), api.nvim_get_option_info2('completeopt', {})) -- global end) describe('last set', function() @@ -3346,21 +3343,21 @@ describe('API', function() for _, t in pairs(tests) do it(t.desc, function() -- Switch to the target buffer/window so that curbuf/curwin are used. - meths.nvim_set_current_win(wins[2].id) - local info = meths.nvim_get_option_info2(unpack(t.args)) + api.nvim_set_current_win(wins[2].id) + local info = api.nvim_get_option_info2(unpack(t.args)) eq(t.linenr, info.last_set_linenr) eq(t.sid, info.last_set_sid) end) end it('is provided for cross-buffer requests', function() - local info = meths.nvim_get_option_info2('formatprg', { buf = bufs[2].id }) + local info = api.nvim_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.nvim_get_option_info2('listchars', { win = wins[2].id }) + local info = api.nvim_get_option_info2('listchars', { win = wins[2].id }) eq(6, info.last_set_linenr) eq(1, info.last_set_sid) end) @@ -3427,7 +3424,7 @@ describe('API', function() it('can save message history', function() command('set cmdheight=2') -- suppress Press ENTER - meths.nvim_echo({ { 'msg\nmsg' }, { 'msg' } }, true, {}) + api.nvim_echo({ { 'msg\nmsg' }, { 'msg' } }, true, {}) eq('msg\nmsgmsg', exec_capture('messages')) end) @@ -3465,15 +3462,15 @@ describe('API', function() end) it('can batch process sequences', function() - local b = meths.nvim_create_buf(true, true) - meths.nvim_open_win( + local b = api.nvim_create_buf(true, true) + api.nvim_open_win( b, false, { width = 79, height = 31, row = 1, col = 1, relative = 'editor' } ) - local t = meths.nvim_open_term(b, {}) + local t = api.nvim_open_term(b, {}) - meths.nvim_chan_send(t, io.open('test/functional/fixtures/smile2.cat', 'r'):read('*a')) + api.nvim_chan_send(t, io.open('test/functional/fixtures/smile2.cat', 'r'):read('*a')) screen:expect { grid = [[ ^ | @@ -3579,56 +3576,53 @@ describe('API', function() describe('nvim_del_mark', function() it('works', function() - local buf = meths.nvim_create_buf(false, true) - meths.nvim_buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) - eq(true, meths.nvim_buf_set_mark(buf, 'F', 2, 2, {})) - eq(true, meths.nvim_del_mark('F')) - eq({ 0, 0 }, meths.nvim_buf_get_mark(buf, 'F')) + local buf = api.nvim_create_buf(false, true) + api.nvim_buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) + eq(true, api.nvim_buf_set_mark(buf, 'F', 2, 2, {})) + eq(true, api.nvim_del_mark('F')) + eq({ 0, 0 }, api.nvim_buf_get_mark(buf, 'F')) end) it('validation', function() - eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(meths.nvim_del_mark, 'f')) - eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(meths.nvim_del_mark, '!')) - eq( - "Invalid mark name (must be a single char): 'fail'", - pcall_err(meths.nvim_del_mark, 'fail') - ) + eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(api.nvim_del_mark, 'f')) + eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(api.nvim_del_mark, '!')) + eq("Invalid mark name (must be a single char): 'fail'", pcall_err(api.nvim_del_mark, 'fail')) end) end) describe('nvim_get_mark', function() it('works', function() - local buf = meths.nvim_create_buf(false, true) - meths.nvim_buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) - meths.nvim_buf_set_mark(buf, 'F', 2, 2, {}) - meths.nvim_buf_set_name(buf, 'mybuf') - local mark = meths.nvim_get_mark('F', {}) + local buf = api.nvim_create_buf(false, true) + api.nvim_buf_set_lines(buf, -1, -1, true, { 'a', 'bit of', 'text' }) + api.nvim_buf_set_mark(buf, 'F', 2, 2, {}) + api.nvim_buf_set_name(buf, 'mybuf') + local mark = api.nvim_get_mark('F', {}) -- Compare the path tail only 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.nvim_get_mark, 'f', {})) - eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(meths.nvim_get_mark, '!', {})) + eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(api.nvim_get_mark, 'f', {})) + eq("Invalid mark name (must be file/uppercase): '!'", pcall_err(api.nvim_get_mark, '!', {})) eq( "Invalid mark name (must be a single char): 'fail'", - pcall_err(meths.nvim_get_mark, 'fail', {}) + pcall_err(api.nvim_get_mark, 'fail', {}) ) end) it('returns the expected when mark is not set', function() - eq(true, meths.nvim_del_mark('A')) - eq({ 0, 0, 0, '' }, meths.nvim_get_mark('A', {})) + eq(true, api.nvim_del_mark('A')) + eq({ 0, 0, 0, '' }, api.nvim_get_mark('A', {})) end) it('works with deleted buffers', function() local fname = tmpname() write_file(fname, 'a\nbit of\text') command('edit ' .. fname) - local buf = meths.nvim_get_current_buf() + local buf = api.nvim_get_current_buf() - meths.nvim_buf_set_mark(buf, 'F', 2, 2, {}) + api.nvim_buf_set_mark(buf, 'F', 2, 2, {}) command('new') -- Create new buf to avoid :bd failing command('bd! ' .. buf.id) os.remove(fname) - local mark = meths.nvim_get_mark('F', {}) + local mark = api.nvim_get_mark('F', {}) -- To avoid comparing relative vs absolute path local mfname = mark[4] local tail_patt = [[[\/][^\/]*$]] @@ -3642,72 +3636,72 @@ describe('API', function() eq({ str = '%StatusLineStringWithHighlights', width = 31, - }, meths.nvim_eval_statusline('%%StatusLineString%#WarningMsg#WithHighlights', {})) + }, api.nvim_eval_statusline('%%StatusLineString%#WarningMsg#WithHighlights', {})) end) it("doesn't exceed maxwidth", function() eq({ str = 'Should be trun>', width = 15, - }, meths.nvim_eval_statusline('Should be truncated%<', { maxwidth = 15 })) + }, api.nvim_eval_statusline('Should be truncated%<', { maxwidth = 15 })) end) it('supports ASCII fillchar', function() eq( { str = 'a~~~b', width = 5 }, - meths.nvim_eval_statusline('a%=b', { fillchar = '~', maxwidth = 5 }) + api.nvim_eval_statusline('a%=b', { fillchar = '~', maxwidth = 5 }) ) end) it('supports single-width multibyte fillchar', function() eq( { str = 'a━━━b', width = 5 }, - meths.nvim_eval_statusline('a%=b', { fillchar = '━', maxwidth = 5 }) + api.nvim_eval_statusline('a%=b', { fillchar = '━', maxwidth = 5 }) ) end) it('treats double-width fillchar as single-width', function() eq( { str = 'a哦哦哦b', width = 5 }, - meths.nvim_eval_statusline('a%=b', { fillchar = '哦', maxwidth = 5 }) + api.nvim_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.nvim_eval_statusline('a%=b', { fillchar = '\031', maxwidth = 5 }) + api.nvim_eval_statusline('a%=b', { fillchar = '\031', maxwidth = 5 }) ) end) it('rejects multiple-character fillchar', function() eq( "Invalid 'fillchar': expected single character", - pcall_err(meths.nvim_eval_statusline, '', { fillchar = 'aa' }) + pcall_err(api.nvim_eval_statusline, '', { fillchar = 'aa' }) ) end) it('rejects empty string fillchar', function() eq( "Invalid 'fillchar': expected single character", - pcall_err(meths.nvim_eval_statusline, '', { fillchar = '' }) + pcall_err(api.nvim_eval_statusline, '', { fillchar = '' }) ) end) it('rejects non-string fillchar', function() eq( "Invalid 'fillchar': expected String, got Integer", - pcall_err(meths.nvim_eval_statusline, '', { fillchar = 1 }) + pcall_err(api.nvim_eval_statusline, '', { fillchar = 1 }) ) end) it('rejects invalid string', function() - eq('E539: Illegal character <}>', pcall_err(meths.nvim_eval_statusline, '%{%}', {})) + eq('E539: Illegal character <}>', pcall_err(api.nvim_eval_statusline, '%{%}', {})) end) it('supports various items', function() - eq({ str = '0', width = 1 }, meths.nvim_eval_statusline('%l', { maxwidth = 5 })) + eq({ str = '0', width = 1 }, api.nvim_eval_statusline('%l', { maxwidth = 5 })) command('set readonly') - eq({ str = '[RO]', width = 4 }, meths.nvim_eval_statusline('%r', { maxwidth = 5 })) + eq({ str = '[RO]', width = 4 }, api.nvim_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.nvim_eval_statusline('%S', { maxwidth = 5 })) + eq({ str = '1234', width = 4 }, api.nvim_eval_statusline('%S', { maxwidth = 5 })) feed('56') screen:expect({ any = '123456' }) - eq({ str = '<3456', width = 5 }, meths.nvim_eval_statusline('%S', { maxwidth = 5 })) + eq({ str = '<3456', width = 5 }, api.nvim_eval_statusline('%S', { maxwidth = 5 })) end) describe('highlight parsing', function() it('works', function() @@ -3720,7 +3714,7 @@ describe('API', function() { start = 24, group = 'User1' }, }, }, - meths.nvim_eval_statusline( + api.nvim_eval_statusline( '%#WarningMsg#TextWithWarningHighlight%1*TextWithUserHighlight', { highlights = true } ) @@ -3733,7 +3727,7 @@ describe('API', function() highlights = { { start = 0, group = 'StatusLine' }, }, - }, meths.nvim_eval_statusline('TextWithNoHighlight', { highlights = true })) + }, api.nvim_eval_statusline('TextWithNoHighlight', { highlights = true })) end) it('works with inactive statusline', function() command('split') @@ -3747,9 +3741,9 @@ describe('API', function() { start = 19, group = 'WarningMsg' }, }, }, - meths.nvim_eval_statusline( + api.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', - { winid = meths.nvim_list_wins()[2].id, highlights = true } + { winid = api.nvim_list_wins()[2].id, highlights = true } ) ) end) @@ -3763,7 +3757,7 @@ describe('API', function() { start = 19, group = 'WarningMsg' }, }, }, - meths.nvim_eval_statusline( + api.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', { use_tabline = true, highlights = true } ) @@ -3779,7 +3773,7 @@ describe('API', function() { start = 19, group = 'WarningMsg' }, }, }, - meths.nvim_eval_statusline( + api.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', { use_winbar = true, highlights = true } ) @@ -3807,7 +3801,7 @@ describe('API', function() { group = 'ErrorMsg', start = 8 }, { group = 'Normal', start = 10 }, }, - }, meths.nvim_eval_statusline( + }, api.nvim_eval_statusline( '%C%s%=%l ', { use_statuscol_lnum = 4, highlights = true } )) @@ -3820,18 +3814,15 @@ describe('API', function() { group = 'ErrorMsg', start = 1 }, }, }, - meths.nvim_eval_statusline( - '%l%#ErrorMsg# ', - { use_statuscol_lnum = 3, highlights = true } - ) + api.nvim_eval_statusline('%l%#ErrorMsg# ', { use_statuscol_lnum = 3, highlights = true }) ) end) it('no memory leak with click functions', function() - meths.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {}) + api.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {}) eq({ str = 'StatusLineStringWithClickFunc', width = 29, - }, meths.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {})) + }, api.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {})) end) end) end) @@ -3874,7 +3865,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('echo foo', {})) + }, api.nvim_parse_cmd('echo foo', {})) end) it('works with ranges', function() eq({ @@ -3914,7 +3905,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('4,6s/math.random/math.max/', {})) + }, api.nvim_parse_cmd('4,6s/math.random/math.max/', {})) end) it('works with count', function() eq({ @@ -3955,7 +3946,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('buffer 1', {})) + }, api.nvim_parse_cmd('buffer 1', {})) end) it('works with register', function() eq({ @@ -3996,7 +3987,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('put +', {})) + }, api.nvim_parse_cmd('put +', {})) eq({ cmd = 'put', args = {}, @@ -4035,7 +4026,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('put', {})) + }, api.nvim_parse_cmd('put', {})) end) it('works with range, count and register', function() eq({ @@ -4077,7 +4068,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('1,3delete * 5', {})) + }, api.nvim_parse_cmd('1,3delete * 5', {})) end) it('works with bang', function() eq({ @@ -4117,7 +4108,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('w!', {})) + }, api.nvim_parse_cmd('w!', {})) end) it('works with modifiers', function() eq( @@ -4159,7 +4150,7 @@ describe('API', function() vertical = false, }, }, - meths.nvim_parse_cmd( + api.nvim_parse_cmd( '15verbose silent! horizontal topleft tab filter /foo/ split foo.txt', {} ) @@ -4203,7 +4194,7 @@ describe('API', function() vertical = false, }, }, - meths.nvim_parse_cmd( + api.nvim_parse_cmd( '0verbose unsilent botright 0tab confirm filter! /foo/ split foo.txt', {} ) @@ -4248,7 +4239,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('4,6MyCommand! test it', {})) + }, api.nvim_parse_cmd('4,6MyCommand! test it', {})) end) it('works for commands separated by bar', function() eq({ @@ -4288,7 +4279,7 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('argadd a.txt | argadd b.txt', {})) + }, api.nvim_parse_cmd('argadd a.txt | argadd b.txt', {})) end) it('works for nargs=1', function() command('command -nargs=1 MyCommand echo ') @@ -4328,28 +4319,28 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('MyCommand test it', {})) + }, api.nvim_parse_cmd('MyCommand test it', {})) end) it('validates command', function() - eq('Error while parsing command line', pcall_err(meths.nvim_parse_cmd, '', {})) - eq('Error while parsing command line', pcall_err(meths.nvim_parse_cmd, '" foo', {})) + eq('Error while parsing command line', pcall_err(api.nvim_parse_cmd, '', {})) + eq('Error while parsing command line', pcall_err(api.nvim_parse_cmd, '" foo', {})) eq( 'Error while parsing command line: E492: Not an editor command: Fubar', - pcall_err(meths.nvim_parse_cmd, 'Fubar', {}) + pcall_err(api.nvim_parse_cmd, 'Fubar', {}) ) command('command! Fubar echo foo') eq( 'Error while parsing command line: E477: No ! allowed', - pcall_err(meths.nvim_parse_cmd, 'Fubar!', {}) + pcall_err(api.nvim_parse_cmd, 'Fubar!', {}) ) eq( 'Error while parsing command line: E481: No range allowed', - pcall_err(meths.nvim_parse_cmd, '4,6Fubar', {}) + pcall_err(api.nvim_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.nvim_parse_cmd, 'F', {}) + pcall_err(api.nvim_parse_cmd, 'F', {}) ) end) it('does not interfere with printing line in Ex mode #19400', function() @@ -4371,7 +4362,7 @@ describe('API', function() Entering Ex mode. Type "visual" to go to Normal mode. | :1^ | ]]) - eq('Error while parsing command line', pcall_err(meths.nvim_parse_cmd, '', {})) + eq('Error while parsing command line', pcall_err(api.nvim_parse_cmd, '', {})) feed('') screen:expect([[ foo | @@ -4384,10 +4375,10 @@ describe('API', function() ]]) end) it('does not move cursor or change search history/pattern #19878 #19890', function() - meths.nvim_buf_set_lines(0, 0, -1, true, { 'foo', 'bar', 'foo', 'bar' }) - eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) - eq('', funcs.getreg('/')) - eq('', funcs.histget('search')) + api.nvim_buf_set_lines(0, 0, -1, true, { 'foo', 'bar', 'foo', 'bar' }) + eq({ 1, 0 }, api.nvim_win_get_cursor(0)) + eq('', fn.getreg('/')) + eq('', fn.histget('search')) feed(':') -- call the API in cmdline mode to test whether it changes search history eq({ cmd = 'normal', @@ -4426,15 +4417,15 @@ describe('API', function() verbose = -1, vertical = false, }, - }, meths.nvim_parse_cmd('+2;/bar/normal! x', {})) - eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) - eq('', funcs.getreg('/')) - eq('', funcs.histget('search')) + }, api.nvim_parse_cmd('+2;/bar/normal! x', {})) + eq({ 1, 0 }, api.nvim_win_get_cursor(0)) + eq('', fn.getreg('/')) + eq('', fn.histget('search')) end) it('result can be used directly by nvim_cmd #20051', function() - eq('foo', meths.nvim_cmd(meths.nvim_parse_cmd('echo "foo"', {}), { output = true })) - meths.nvim_cmd(meths.nvim_parse_cmd('set cursorline', {}), {}) - eq(true, meths.nvim_get_option_value('cursorline', {})) + eq('foo', api.nvim_cmd(api.nvim_parse_cmd('echo "foo"', {}), { output = true })) + api.nvim_cmd(api.nvim_parse_cmd('set cursorline', {}), {}) + eq(true, api.nvim_get_option_value('cursorline', {})) end) it('no side-effects (error messages) in pcall() #20339', function() eq( @@ -4447,86 +4438,83 @@ describe('API', function() describe('nvim_cmd', function() it('works', function() - meths.nvim_cmd({ cmd = 'set', args = { 'cursorline' } }, {}) - eq(true, meths.nvim_get_option_value('cursorline', {})) + api.nvim_cmd({ cmd = 'set', args = { 'cursorline' } }, {}) + eq(true, api.nvim_get_option_value('cursorline', {})) end) it('validation', function() - eq("Invalid 'cmd': expected non-empty String", pcall_err(meths.nvim_cmd, { cmd = '' }, {})) - eq("Invalid 'cmd': expected String, got Array", pcall_err(meths.nvim_cmd, { cmd = {} }, {})) + eq("Invalid 'cmd': expected non-empty String", pcall_err(api.nvim_cmd, { cmd = '' }, {})) + eq("Invalid 'cmd': expected String, got Array", pcall_err(api.nvim_cmd, { cmd = {} }, {})) eq( "Invalid 'args': expected Array, got Boolean", - pcall_err(meths.nvim_cmd, { cmd = 'set', args = true }, {}) + pcall_err(api.nvim_cmd, { cmd = 'set', args = true }, {}) ) eq( 'Invalid command arg: expected non-whitespace', - pcall_err(meths.nvim_cmd, { cmd = 'set', args = { ' ' } }, {}) + pcall_err(api.nvim_cmd, { cmd = 'set', args = { ' ' } }, {}) ) eq( 'Invalid command arg: expected valid type, got Array', - pcall_err(meths.nvim_cmd, { cmd = 'set', args = { {} } }, {}) - ) - eq( - 'Wrong number of arguments', - pcall_err(meths.nvim_cmd, { cmd = 'aboveleft', args = {} }, {}) + pcall_err(api.nvim_cmd, { cmd = 'set', args = { {} } }, {}) ) + eq('Wrong number of arguments', pcall_err(api.nvim_cmd, { cmd = 'aboveleft', args = {} }, {})) eq( 'Command cannot accept bang: print', - pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, bang = true }, {}) + pcall_err(api.nvim_cmd, { cmd = 'print', args = {}, bang = true }, {}) ) eq( 'Command cannot accept range: set', - pcall_err(meths.nvim_cmd, { cmd = 'set', args = {}, range = { 1 } }, {}) + pcall_err(api.nvim_cmd, { cmd = 'set', args = {}, range = { 1 } }, {}) ) eq( "Invalid 'range': expected Array, got Boolean", - pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, range = true }, {}) + pcall_err(api.nvim_cmd, { cmd = 'print', args = {}, range = true }, {}) ) eq( "Invalid 'range': expected <=2 elements", - pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, range = { 1, 2, 3, 4 } }, {}) + pcall_err(api.nvim_cmd, { cmd = 'print', args = {}, range = { 1, 2, 3, 4 } }, {}) ) eq( 'Invalid range element: expected non-negative Integer', - pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, range = { -1 } }, {}) + pcall_err(api.nvim_cmd, { cmd = 'print', args = {}, range = { -1 } }, {}) ) eq( 'Command cannot accept count: set', - pcall_err(meths.nvim_cmd, { cmd = 'set', args = {}, count = 1 }, {}) + pcall_err(api.nvim_cmd, { cmd = 'set', args = {}, count = 1 }, {}) ) eq( "Invalid 'count': expected Integer, got Boolean", - pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, count = true }, {}) + pcall_err(api.nvim_cmd, { cmd = 'print', args = {}, count = true }, {}) ) eq( "Invalid 'count': expected non-negative Integer", - pcall_err(meths.nvim_cmd, { cmd = 'print', args = {}, count = -1 }, {}) + pcall_err(api.nvim_cmd, { cmd = 'print', args = {}, count = -1 }, {}) ) eq( 'Command cannot accept register: set', - pcall_err(meths.nvim_cmd, { cmd = 'set', args = {}, reg = 'x' }, {}) + pcall_err(api.nvim_cmd, { cmd = 'set', args = {}, reg = 'x' }, {}) ) eq( 'Cannot use register "=', - pcall_err(meths.nvim_cmd, { cmd = 'put', args = {}, reg = '=' }, {}) + pcall_err(api.nvim_cmd, { cmd = 'put', args = {}, reg = '=' }, {}) ) eq( "Invalid 'reg': expected single character, got xx", - pcall_err(meths.nvim_cmd, { cmd = 'put', args = {}, reg = 'xx' }, {}) + pcall_err(api.nvim_cmd, { cmd = 'put', args = {}, reg = 'xx' }, {}) ) -- #20681 - eq('Invalid command: "win_getid"', pcall_err(meths.nvim_cmd, { cmd = 'win_getid' }, {})) - eq('Invalid command: "echo "hi""', pcall_err(meths.nvim_cmd, { cmd = 'echo "hi"' }, {})) + eq('Invalid command: "win_getid"', pcall_err(api.nvim_cmd, { cmd = 'win_getid' }, {})) + eq('Invalid command: "echo "hi""', pcall_err(api.nvim_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.nvim_cmd({ cmd = 'set', args = {}, magic = {} }, {})) + eq('', api.nvim_cmd({ cmd = 'set', args = {}, magic = {} }, {})) -- Lua call does not allow non-empty list-like {} for dict item. eq( @@ -4544,11 +4532,11 @@ describe('API', function() end) it('captures output', function() - eq('foo', meths.nvim_cmd({ cmd = 'echo', args = { '"foo"' } }, { output = true })) + eq('foo', api.nvim_cmd({ cmd = 'echo', args = { '"foo"' } }, { output = true })) end) it('sets correct script context', function() - meths.nvim_cmd({ cmd = 'set', args = { 'cursorline' } }, {}) + api.nvim_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+%)')) end) @@ -4563,7 +4551,7 @@ describe('API', function() line5 line6 ]] - meths.nvim_cmd({ cmd = 'del', range = { 2, 4 } }, {}) + api.nvim_cmd({ cmd = 'del', range = { 2, 4 } }, {}) expect [[ line1 you didn't expect this @@ -4581,7 +4569,7 @@ describe('API', function() line5 line6 ]] - meths.nvim_cmd({ cmd = 'del', range = { 2 }, count = 4 }, {}) + api.nvim_cmd({ cmd = 'del', range = { 2 }, count = 4 }, {}) expect [[ line1 line5 @@ -4598,7 +4586,7 @@ describe('API', function() line5 line6 ]] - meths.nvim_cmd({ cmd = 'del', range = { 2, 4 }, reg = 'a' }, {}) + api.nvim_cmd({ cmd = 'del', range = { 2, 4 }, reg = 'a' }, {}) command('1put a') expect [[ line1 @@ -4611,29 +4599,29 @@ describe('API', function() ]] end) it('works with bang', function() - meths.nvim_create_user_command('Foo', 'echo ""', { bang = true }) - eq('!', meths.nvim_cmd({ cmd = 'Foo', bang = true }, { output = true })) - eq('', meths.nvim_cmd({ cmd = 'Foo', bang = false }, { output = true })) + api.nvim_create_user_command('Foo', 'echo ""', { bang = true }) + eq('!', api.nvim_cmd({ cmd = 'Foo', bang = true }, { output = true })) + eq('', api.nvim_cmd({ cmd = 'Foo', bang = false }, { output = true })) end) it('works with modifiers', function() -- with silent = true output is still captured eq( '1', - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'echomsg', args = { '1' }, mods = { silent = true } }, { output = true } ) ) -- but message isn't added to message history - eq('', meths.nvim_cmd({ cmd = 'messages' }, { output = true })) + eq('', api.nvim_cmd({ cmd = 'messages' }, { output = true })) - meths.nvim_create_user_command('Foo', 'set verbose', {}) - eq(' verbose=1', meths.nvim_cmd({ cmd = 'Foo', mods = { verbose = 1 } }, { output = true })) + api.nvim_create_user_command('Foo', 'set verbose', {}) + eq(' verbose=1', api.nvim_cmd({ cmd = 'Foo', mods = { verbose = 1 } }, { output = true })) - meths.nvim_create_user_command('Mods', "echo ''", {}) + api.nvim_create_user_command('Mods', "echo ''", {}) eq( 'keepmarks keeppatterns silent 3verbose aboveleft horizontal', - meths.nvim_cmd({ + api.nvim_cmd({ cmd = 'Mods', mods = { horizontal = true, @@ -4645,19 +4633,19 @@ describe('API', function() }, }, { output = true }) ) - eq(0, meths.nvim_get_option_value('verbose', {})) + eq(0, api.nvim_get_option_value('verbose', {})) command('edit foo.txt | edit bar.txt') eq( ' 1 #h "foo.txt" line 1', - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'buffers', mods = { filter = { pattern = 'foo', force = false } } }, { output = true } ) ) eq( ' 2 %a "bar.txt" line 1', - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'buffers', mods = { filter = { pattern = 'foo', force = true } } }, { output = true } ) @@ -4665,10 +4653,10 @@ describe('API', function() -- with emsg_silent = true error is suppressed feed([[:lua vim.api.nvim_cmd({ cmd = 'call', mods = { emsg_silent = true } }, {})]]) - eq('', meths.nvim_cmd({ cmd = 'messages' }, { output = true })) + eq('', api.nvim_cmd({ cmd = 'messages' }, { output = true })) -- error from the next command typed is not suppressed #21420 feed(':call') - eq('E471: Argument required', meths.nvim_cmd({ cmd = 'messages' }, { output = true })) + eq('E471: Argument required', api.nvim_cmd({ cmd = 'messages' }, { output = true })) end) it('works with magic.file', function() exec_lua([[ @@ -4678,7 +4666,7 @@ describe('API', function() ]]) eq( uv.cwd(), - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'Foo', args = { '%:p:h' }, magic = { file = true } }, { output = true } ) @@ -4690,24 +4678,24 @@ describe('API', function() echo a:000 endfunction ]]) - meths.nvim_create_user_command('Foo', 'call FooFunc()', { nargs = '+' }) + api.nvim_create_user_command('Foo', 'call FooFunc()', { nargs = '+' }) eq( [=[['a quick', 'brown fox', 'jumps over the', 'lazy dog']]=], - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'Foo', args = { 'a quick', 'brown fox', 'jumps over the', 'lazy dog' } }, { output = true } ) ) eq( [=[['test \ \\ \"""\', 'more\ tests\" ']]=], - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'Foo', args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, { output = true } ) ) end) it('splits arguments correctly for Lua callback', function() - meths.nvim_exec_lua( + api.nvim_exec_lua( [[ local function FooFunc(opts) vim.print(opts.fargs) @@ -4719,14 +4707,14 @@ describe('API', function() ) eq( [[{ "a quick", "brown fox", "jumps over the", "lazy dog" }]], - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'Foo', args = { 'a quick', 'brown fox', 'jumps over the', 'lazy dog' } }, { output = true } ) ) eq( [[{ 'test \\ \\\\ \\"""\\', 'more\\ tests\\" ' }]], - meths.nvim_cmd( + api.nvim_cmd( { cmd = 'Foo', args = { [[test \ \\ \"""\]], [[more\ tests\" ]] } }, { output = true } ) @@ -4734,13 +4722,13 @@ describe('API', function() end) it('works with buffer names', function() command('edit foo.txt | edit bar.txt') - meths.nvim_cmd({ cmd = 'buffer', args = { 'foo.txt' } }, {}) - eq('foo.txt', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t')) - meths.nvim_cmd({ cmd = 'buffer', args = { 'bar.txt' } }, {}) - eq('bar.txt', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t')) + api.nvim_cmd({ cmd = 'buffer', args = { 'foo.txt' } }, {}) + eq('foo.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t')) + api.nvim_cmd({ cmd = 'buffer', args = { 'bar.txt' } }, {}) + eq('bar.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t')) end) it('triggers CmdUndefined event if command is not found', function() - meths.nvim_exec_lua( + api.nvim_exec_lua( [[ vim.api.nvim_create_autocmd("CmdUndefined", { pattern = "Foo", @@ -4751,17 +4739,17 @@ describe('API', function() ]], {} ) - eq('foo', meths.nvim_cmd({ cmd = 'Foo' }, { output = true })) + eq('foo', api.nvim_cmd({ cmd = 'Foo' }, { output = true })) end) it('errors if command is not implemented', function() - eq('Command not implemented: winpos', pcall_err(meths.nvim_cmd, { cmd = 'winpos' }, {})) + eq('Command not implemented: winpos', pcall_err(api.nvim_cmd, { cmd = 'winpos' }, {})) end) it('works with empty arguments list', function() - meths.nvim_cmd({ cmd = 'update' }, {}) - meths.nvim_cmd({ cmd = 'buffer', count = 0 }, {}) + api.nvim_cmd({ cmd = 'update' }, {}) + api.nvim_cmd({ cmd = 'buffer', count = 0 }, {}) end) it("doesn't suppress errors when used in keymapping", function() - meths.nvim_exec_lua( + api.nvim_exec_lua( [[ vim.keymap.set("n", "[l", function() vim.api.nvim_cmd({ cmd = "echo", args = {"foo"} }, {}) end) @@ -4772,31 +4760,31 @@ describe('API', function() neq(nil, string.find(eval('v:errmsg'), 'E5108:')) end) it('handles 0 range #19608', function() - meths.nvim_buf_set_lines(0, 0, -1, false, { 'aa' }) - meths.nvim_cmd({ cmd = 'delete', range = { 0 } }, {}) + api.nvim_buf_set_lines(0, 0, -1, false, { 'aa' }) + api.nvim_cmd({ cmd = 'delete', range = { 0 } }, {}) command('undo') - eq({ 'aa' }, meths.nvim_buf_get_lines(0, 0, 1, false)) + eq({ 'aa' }, api.nvim_buf_get_lines(0, 0, 1, false)) assert_alive() end) it('supports filename expansion', function() - meths.nvim_cmd({ cmd = 'argadd', args = { '%:p:h:t', '%:p:h:t' } }, {}) - local arg = funcs.expand('%:p:h:t') - eq({ arg, arg }, funcs.argv()) + api.nvim_cmd({ cmd = 'argadd', args = { '%:p:h:t', '%:p:h:t' } }, {}) + local arg = fn.expand('%:p:h:t') + eq({ arg, arg }, fn.argv()) end) it("'make' command works when argument count isn't 1 #19696", function() command('set makeprg=echo') command('set shellquote=') - matches('^:!echo ', meths.nvim_cmd({ cmd = 'make' }, { output = true })) + matches('^:!echo ', api.nvim_cmd({ cmd = 'make' }, { output = true })) assert_alive() matches( '^:!echo foo bar', - meths.nvim_cmd({ cmd = 'make', args = { 'foo', 'bar' } }, { output = true }) + api.nvim_cmd({ cmd = 'make', args = { 'foo', 'bar' } }, { output = true }) ) assert_alive() - local arg_pesc = pesc(funcs.expand('%:p:h:t')) + local arg_pesc = pesc(fn.expand('%:p:h:t')) matches( ('^:!echo %s %s'):format(arg_pesc, arg_pesc), - meths.nvim_cmd({ cmd = 'make', args = { '%:p:h:t', '%:p:h:t' } }, { output = true }) + api.nvim_cmd({ cmd = 'make', args = { '%:p:h:t', '%:p:h:t' } }, { output = true }) ) assert_alive() end) @@ -4806,7 +4794,7 @@ describe('API', function() screen:set_default_attr_ids({ [0] = { bold = true, foreground = Screen.colors.Blue }, }) - meths.nvim_cmd({ cmd = 'echo', args = { [['hello']] } }, { output = true }) + api.nvim_cmd({ cmd = 'echo', args = { [['hello']] } }, { output = true }) screen:expect { grid = [[ ^ | @@ -4829,29 +4817,29 @@ describe('API', function() } end) it('works with non-String args', function() - eq('2', meths.nvim_cmd({ cmd = 'echo', args = { 2 } }, { output = true })) - eq('1', meths.nvim_cmd({ cmd = 'echo', args = { true } }, { output = true })) + eq('2', api.nvim_cmd({ cmd = 'echo', args = { 2 } }, { output = true })) + eq('1', api.nvim_cmd({ cmd = 'echo', args = { true } }, { output = true })) end) describe('first argument as count', function() it('works', function() command('vsplit | enew') - meths.nvim_cmd({ cmd = 'bdelete', args = { meths.nvim_get_current_buf() } }, {}) - eq(1, meths.nvim_get_current_buf().id) + api.nvim_cmd({ cmd = 'bdelete', args = { api.nvim_get_current_buf() } }, {}) + eq(1, api.nvim_get_current_buf().id) end) it('works with :sleep using milliseconds', function() local start = uv.now() - meths.nvim_cmd({ cmd = 'sleep', args = { '100m' } }, {}) + api.nvim_cmd({ cmd = 'sleep', args = { '100m' } }, {}) ok(uv.now() - start <= 300) end) end) it(':call with unknown function does not crash #26289', function() eq( 'Vim:E117: Unknown function: UnknownFunc', - pcall_err(meths.nvim_cmd, { cmd = 'call', args = { 'UnknownFunc()' } }, {}) + pcall_err(api.nvim_cmd, { cmd = 'call', args = { 'UnknownFunc()' } }, {}) ) end) it(':throw does not crash #24556', function() - eq('42', pcall_err(meths.nvim_cmd, { cmd = 'throw', args = { '42' } }, {})) + eq('42', pcall_err(api.nvim_cmd, { cmd = 'throw', args = { '42' } }, {})) end) it('can use :return #24556', function() exec([[ @@ -4862,8 +4850,8 @@ describe('API', function() endfunc let g:result = Foo() ]]) - eq('before', meths.nvim_get_var('pos')) - eq({ 1, 2, 3 }, meths.nvim_get_var('result')) + eq('before', api.nvim_get_var('pos')) + eq({ 1, 2, 3 }, api.nvim_get_var('result')) end) end) end) diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 87aa0ca2a8..d30a6460a6 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -2,9 +2,9 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') local clear, curbuf, curbuf_contents, curwin, eq, neq, ok, feed, insert, eval = helpers.clear, - helpers.meths.nvim_get_current_buf, + helpers.api.nvim_get_current_buf, helpers.curbuf_contents, - helpers.meths.nvim_get_current_win, + helpers.api.nvim_get_current_win, helpers.eq, helpers.neq, helpers.ok, @@ -13,10 +13,10 @@ local clear, curbuf, curbuf_contents, curwin, eq, neq, ok, feed, insert, eval = helpers.eval local poke_eventloop = helpers.poke_eventloop local exec = helpers.exec -local funcs = helpers.funcs +local fn = helpers.fn local request = helpers.request local NIL = vim.NIL -local meths = helpers.meths +local api = helpers.api local command = helpers.command local pcall_err = helpers.pcall_err local assert_alive = helpers.assert_alive @@ -26,13 +26,13 @@ describe('API/win', function() describe('get_buf', function() it('works', function() - eq(curbuf(), meths.nvim_win_get_buf(meths.nvim_list_wins()[1])) + eq(curbuf(), api.nvim_win_get_buf(api.nvim_list_wins()[1])) command('new') - meths.nvim_set_current_win(meths.nvim_list_wins()[2]) - eq(curbuf(), meths.nvim_win_get_buf(meths.nvim_list_wins()[2])) + api.nvim_set_current_win(api.nvim_list_wins()[2]) + eq(curbuf(), api.nvim_win_get_buf(api.nvim_list_wins()[2])) neq( - meths.nvim_win_get_buf(meths.nvim_list_wins()[1]), - meths.nvim_win_get_buf(meths.nvim_list_wins()[2]) + api.nvim_win_get_buf(api.nvim_list_wins()[1]), + api.nvim_win_get_buf(api.nvim_list_wins()[2]) ) end) end) @@ -40,27 +40,21 @@ describe('API/win', function() describe('set_buf', function() it('works', function() command('new') - local windows = meths.nvim_list_wins() - neq(meths.nvim_win_get_buf(windows[2]), meths.nvim_win_get_buf(windows[1])) - meths.nvim_win_set_buf(windows[2], meths.nvim_win_get_buf(windows[1])) - eq(meths.nvim_win_get_buf(windows[2]), meths.nvim_win_get_buf(windows[1])) + local windows = api.nvim_list_wins() + neq(api.nvim_win_get_buf(windows[2]), api.nvim_win_get_buf(windows[1])) + api.nvim_win_set_buf(windows[2], api.nvim_win_get_buf(windows[1])) + eq(api.nvim_win_get_buf(windows[2]), api.nvim_win_get_buf(windows[1])) end) it('validates args', function() - eq( - 'Invalid buffer id: 23', - pcall_err(meths.nvim_win_set_buf, meths.nvim_get_current_win(), 23) - ) - eq( - 'Invalid window id: 23', - pcall_err(meths.nvim_win_set_buf, 23, meths.nvim_get_current_buf()) - ) + eq('Invalid buffer id: 23', pcall_err(api.nvim_win_set_buf, api.nvim_get_current_win(), 23)) + eq('Invalid window id: 23', pcall_err(api.nvim_win_set_buf, 23, api.nvim_get_current_buf())) end) it('disallowed in cmdwin if win={old_}curwin or buf=curbuf', function() - local new_buf = meths.nvim_create_buf(true, true) - local old_win = meths.nvim_get_current_win() - local new_win = meths.nvim_open_win(new_buf, false, { + local new_buf = api.nvim_create_buf(true, true) + local old_win = api.nvim_get_current_win() + local new_win = api.nvim_open_win(new_buf, false, { relative = 'editor', row = 10, col = 10, @@ -70,36 +64,36 @@ describe('API/win', function() feed('q:') eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_win_set_buf, 0, new_buf) + pcall_err(api.nvim_win_set_buf, 0, new_buf) ) eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_win_set_buf, old_win, new_buf) + pcall_err(api.nvim_win_set_buf, old_win, new_buf) ) eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_win_set_buf, new_win, 0) + pcall_err(api.nvim_win_set_buf, new_win, 0) ) - local next_buf = meths.nvim_create_buf(true, true) - meths.nvim_win_set_buf(new_win, next_buf) - eq(next_buf, meths.nvim_win_get_buf(new_win)) + local next_buf = api.nvim_create_buf(true, true) + api.nvim_win_set_buf(new_win, next_buf) + eq(next_buf, api.nvim_win_get_buf(new_win)) end) end) describe('{get,set}_cursor', function() it('works', function() - eq({ 1, 0 }, meths.nvim_win_get_cursor(0)) + eq({ 1, 0 }, api.nvim_win_get_cursor(0)) command('normal ityping\027o some text') eq('typing\n some text', curbuf_contents()) - eq({ 2, 10 }, meths.nvim_win_get_cursor(0)) - meths.nvim_win_set_cursor(0, { 2, 6 }) + eq({ 2, 10 }, api.nvim_win_get_cursor(0)) + api.nvim_win_set_cursor(0, { 2, 6 }) 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.nvim_win_set_cursor, 1, { 'b\na' })) + eq('Invalid window id: 1', pcall_err(api.nvim_win_set_cursor, 1, { 'b\na' })) end) it('updates the screen, and also when the window is unfocused', function() @@ -124,10 +118,10 @@ describe('API/win', function() ]], } -- cursor position is at beginning - eq({ 1, 0 }, meths.nvim_win_get_cursor(win)) + eq({ 1, 0 }, api.nvim_win_get_cursor(win)) -- move cursor to end - meths.nvim_win_set_cursor(win, { 101, 0 }) + api.nvim_win_set_cursor(win, { 101, 0 }) screen:expect { grid = [[ |*7 @@ -137,7 +131,7 @@ describe('API/win', function() } -- move cursor to the beginning again - meths.nvim_win_set_cursor(win, { 1, 0 }) + api.nvim_win_set_cursor(win, { 1, 0 }) screen:expect { grid = [[ ^prologue | @@ -150,7 +144,7 @@ describe('API/win', function() neq(win, curwin()) -- sanity check, cursor position is kept - eq({ 1, 0 }, meths.nvim_win_get_cursor(win)) + eq({ 1, 0 }, api.nvim_win_get_cursor(win)) screen:expect { grid = [[ ^ | @@ -164,7 +158,7 @@ describe('API/win', function() } -- move cursor to end - meths.nvim_win_set_cursor(win, { 101, 0 }) + api.nvim_win_set_cursor(win, { 101, 0 }) screen:expect { grid = [[ ^ | @@ -178,7 +172,7 @@ describe('API/win', function() } -- move cursor to the beginning again - meths.nvim_win_set_cursor(win, { 1, 0 }) + api.nvim_win_set_cursor(win, { 1, 0 }) screen:expect { grid = [[ ^ | @@ -205,17 +199,17 @@ describe('API/win', function() -- cursor position is at beginning local win = curwin() - eq({ 1, 0 }, meths.nvim_win_get_cursor(win)) + eq({ 1, 0 }, api.nvim_win_get_cursor(win)) -- move cursor to column 5 - meths.nvim_win_set_cursor(win, { 1, 5 }) + api.nvim_win_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 }, meths.nvim_win_get_cursor(win)) + eq({ 2, 5 }, api.nvim_win_get_cursor(win)) end) it('updates cursorline and statusline ruler in non-current window', function() @@ -245,7 +239,7 @@ describe('API/win', function() {3:[No Name] [+] 4,3 All }{4:[No Name] [+] 4,3 All}| | ]]) - meths.nvim_win_set_cursor(oldwin, { 1, 0 }) + api.nvim_win_set_cursor(oldwin, { 1, 0 }) screen:expect([[ aaa │{2:aaa }| bbb │bbb | @@ -283,7 +277,7 @@ describe('API/win', function() {3:[No Name] [+] }{4:[No Name] [+] }| | ]]) - meths.nvim_win_set_cursor(oldwin, { 2, 0 }) + api.nvim_win_set_cursor(oldwin, { 2, 0 }) screen:expect([[ aa{2:a} │{2:a}aa | bb{2:b} │bbb | @@ -300,33 +294,33 @@ describe('API/win', function() it('works', function() command('vsplit') eq( - meths.nvim_win_get_height(meths.nvim_list_wins()[2]), - meths.nvim_win_get_height(meths.nvim_list_wins()[1]) + api.nvim_win_get_height(api.nvim_list_wins()[2]), + api.nvim_win_get_height(api.nvim_list_wins()[1]) ) - meths.nvim_set_current_win(meths.nvim_list_wins()[2]) + api.nvim_set_current_win(api.nvim_list_wins()[2]) command('split') eq( - meths.nvim_win_get_height(meths.nvim_list_wins()[2]), - math.floor(meths.nvim_win_get_height(meths.nvim_list_wins()[1]) / 2) + api.nvim_win_get_height(api.nvim_list_wins()[2]), + math.floor(api.nvim_win_get_height(api.nvim_list_wins()[1]) / 2) ) - meths.nvim_win_set_height(meths.nvim_list_wins()[2], 2) - eq(2, meths.nvim_win_get_height(meths.nvim_list_wins()[2])) + api.nvim_win_set_height(api.nvim_list_wins()[2], 2) + eq(2, api.nvim_win_get_height(api.nvim_list_wins()[2])) end) it('correctly handles height=1', function() command('split') - meths.nvim_set_current_win(meths.nvim_list_wins()[1]) - meths.nvim_win_set_height(meths.nvim_list_wins()[2], 1) - eq(1, meths.nvim_win_get_height(meths.nvim_list_wins()[2])) + api.nvim_set_current_win(api.nvim_list_wins()[1]) + api.nvim_win_set_height(api.nvim_list_wins()[2], 1) + eq(1, api.nvim_win_get_height(api.nvim_list_wins()[2])) end) it('correctly handles height=1 with a winbar', function() command('set winbar=foobar') command('set winminheight=0') command('split') - meths.nvim_set_current_win(meths.nvim_list_wins()[1]) - meths.nvim_win_set_height(meths.nvim_list_wins()[2], 1) - eq(1, meths.nvim_win_get_height(meths.nvim_list_wins()[2])) + api.nvim_set_current_win(api.nvim_list_wins()[1]) + api.nvim_win_set_height(api.nvim_list_wins()[2], 1) + eq(1, api.nvim_win_get_height(api.nvim_list_wins()[2])) end) it('do not cause ml_get errors with foldmethod=expr #19989', function() @@ -342,7 +336,7 @@ describe('API/win', function() call nvim_win_set_height(w, 5) ]]) feed('l') - eq('', meths.nvim_get_vvar('errmsg')) + eq('', api.nvim_get_vvar('errmsg')) end) end) @@ -350,17 +344,17 @@ describe('API/win', function() it('works', function() command('split') eq( - meths.nvim_win_get_width(meths.nvim_list_wins()[2]), - meths.nvim_win_get_width(meths.nvim_list_wins()[1]) + api.nvim_win_get_width(api.nvim_list_wins()[2]), + api.nvim_win_get_width(api.nvim_list_wins()[1]) ) - meths.nvim_set_current_win(meths.nvim_list_wins()[2]) + api.nvim_set_current_win(api.nvim_list_wins()[2]) command('vsplit') eq( - meths.nvim_win_get_width(meths.nvim_list_wins()[2]), - math.floor(meths.nvim_win_get_width(meths.nvim_list_wins()[1]) / 2) + api.nvim_win_get_width(api.nvim_list_wins()[2]), + math.floor(api.nvim_win_get_width(api.nvim_list_wins()[1]) / 2) ) - meths.nvim_win_set_width(meths.nvim_list_wins()[2], 2) - eq(2, meths.nvim_win_get_width(meths.nvim_list_wins()[2])) + api.nvim_win_set_width(api.nvim_list_wins()[2], 2) + eq(2, api.nvim_win_get_width(api.nvim_list_wins()[2])) end) it('do not cause ml_get errors with foldmethod=expr #19989', function() @@ -376,23 +370,23 @@ describe('API/win', function() call nvim_win_set_width(w, 5) ]]) feed('l') - eq('', meths.nvim_get_vvar('errmsg')) + eq('', api.nvim_get_vvar('errmsg')) end) end) describe('{get,set,del}_var', function() it('works', function() - meths.nvim_win_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_win_get_var(0, 'lua')) - eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('w:lua')) - eq(1, funcs.exists('w:lua')) - meths.nvim_win_del_var(0, 'lua') - eq(0, funcs.exists('w:lua')) - eq('Key not found: lua', pcall_err(meths.nvim_win_del_var, 0, 'lua')) - meths.nvim_win_set_var(0, 'lua', 1) + api.nvim_win_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_win_get_var(0, 'lua')) + eq({ 1, 2, { ['3'] = 1 } }, api.nvim_eval('w:lua')) + eq(1, fn.exists('w:lua')) + api.nvim_win_del_var(0, 'lua') + eq(0, fn.exists('w:lua')) + eq('Key not found: lua', pcall_err(api.nvim_win_del_var, 0, 'lua')) + api.nvim_win_set_var(0, 'lua', 1) command('lockvar w:lua') - eq('Key is locked: lua', pcall_err(meths.nvim_win_del_var, 0, 'lua')) - eq('Key is locked: lua', pcall_err(meths.nvim_win_set_var, 0, 'lua', 1)) + eq('Key is locked: lua', pcall_err(api.nvim_win_del_var, 0, 'lua')) + eq('Key is locked: lua', pcall_err(api.nvim_win_set_var, 0, 'lua', 1)) end) it('window_set_var returns the old value', function() @@ -413,51 +407,51 @@ describe('API/win', function() describe('nvim_get_option_value, nvim_set_option_value', function() it('works', function() - meths.nvim_set_option_value('colorcolumn', '4,3', {}) - eq('4,3', meths.nvim_get_option_value('colorcolumn', {})) + api.nvim_set_option_value('colorcolumn', '4,3', {}) + eq('4,3', api.nvim_get_option_value('colorcolumn', {})) command('set modified hidden') command('enew') -- edit new buffer, window option is preserved - eq('4,3', meths.nvim_get_option_value('colorcolumn', {})) + eq('4,3', api.nvim_get_option_value('colorcolumn', {})) -- global-local option - meths.nvim_set_option_value('statusline', 'window-status', { win = 0 }) - eq('window-status', meths.nvim_get_option_value('statusline', { win = 0 })) - eq('', meths.nvim_get_option_value('statusline', { scope = 'global' })) + api.nvim_set_option_value('statusline', 'window-status', { win = 0 }) + eq('window-status', api.nvim_get_option_value('statusline', { win = 0 })) + eq('', api.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('', meths.nvim_get_option_value('statusline', { win = 0 })) + eq('', api.nvim_get_option_value('statusline', { win = 0 })) eq('', eval('&l:statusline')) end) it('after switching windows #15390', function() command('tabnew') - local tab1 = unpack(meths.nvim_list_tabpages()) - local win1 = unpack(meths.nvim_tabpage_list_wins(tab1)) - meths.nvim_set_option_value('statusline', 'window-status', { win = win1.id }) + local tab1 = unpack(api.nvim_list_tabpages()) + local win1 = unpack(api.nvim_tabpage_list_wins(tab1)) + api.nvim_set_option_value('statusline', 'window-status', { win = win1.id }) command('split') command('wincmd J') command('wincmd j') - eq('window-status', meths.nvim_get_option_value('statusline', { win = win1.id })) + eq('window-status', api.nvim_get_option_value('statusline', { win = win1.id })) assert_alive() end) it('returns values for unset local options', function() - eq(-1, meths.nvim_get_option_value('scrolloff', { win = 0, scope = 'local' })) + eq(-1, api.nvim_get_option_value('scrolloff', { win = 0, scope = 'local' })) end) end) describe('get_position', function() it('works', function() - local height = meths.nvim_win_get_height(meths.nvim_list_wins()[1]) - local width = meths.nvim_win_get_width(meths.nvim_list_wins()[1]) + local height = api.nvim_win_get_height(api.nvim_list_wins()[1]) + local width = api.nvim_win_get_width(api.nvim_list_wins()[1]) command('split') command('vsplit') - eq({ 0, 0 }, meths.nvim_win_get_position(meths.nvim_list_wins()[1])) + eq({ 0, 0 }, api.nvim_win_get_position(api.nvim_list_wins()[1])) local vsplit_pos = math.floor(width / 2) local split_pos = math.floor(height / 2) - local win2row, win2col = unpack(meths.nvim_win_get_position(meths.nvim_list_wins()[2])) - local win3row, win3col = unpack(meths.nvim_win_get_position(meths.nvim_list_wins()[3])) + local win2row, win2col = unpack(api.nvim_win_get_position(api.nvim_list_wins()[2])) + local win3row, win3col = unpack(api.nvim_win_get_position(api.nvim_list_wins()[3])) eq(0, win2row) eq(0, win3col) ok(vsplit_pos - 1 <= win2col and win2col <= vsplit_pos + 1) @@ -469,91 +463,91 @@ describe('API/win', function() it('works', function() command('tabnew') command('vsplit') - eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[1]), meths.nvim_list_tabpages()[1]) - eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[2]), meths.nvim_list_tabpages()[2]) - eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[3]), meths.nvim_list_tabpages()[2]) + eq(api.nvim_win_get_tabpage(api.nvim_list_wins()[1]), api.nvim_list_tabpages()[1]) + eq(api.nvim_win_get_tabpage(api.nvim_list_wins()[2]), api.nvim_list_tabpages()[2]) + eq(api.nvim_win_get_tabpage(api.nvim_list_wins()[3]), api.nvim_list_tabpages()[2]) end) end) describe('get_number', function() it('works', function() - local wins = meths.nvim_list_wins() - eq(1, meths.nvim_win_get_number(wins[1])) + local wins = api.nvim_list_wins() + eq(1, api.nvim_win_get_number(wins[1])) command('split') - local win1, win2 = unpack(meths.nvim_list_wins()) - eq(1, meths.nvim_win_get_number(win1)) - eq(2, meths.nvim_win_get_number(win2)) + local win1, win2 = unpack(api.nvim_list_wins()) + eq(1, api.nvim_win_get_number(win1)) + eq(2, api.nvim_win_get_number(win2)) command('wincmd J') - eq(2, meths.nvim_win_get_number(win1)) - eq(1, meths.nvim_win_get_number(win2)) + eq(2, api.nvim_win_get_number(win1)) + eq(1, api.nvim_win_get_number(win2)) command('tabnew') - local win3 = meths.nvim_list_wins()[3] + local win3 = api.nvim_list_wins()[3] -- First tab page - eq(2, meths.nvim_win_get_number(win1)) - eq(1, meths.nvim_win_get_number(win2)) + eq(2, api.nvim_win_get_number(win1)) + eq(1, api.nvim_win_get_number(win2)) -- Second tab page - eq(1, meths.nvim_win_get_number(win3)) + eq(1, api.nvim_win_get_number(win3)) end) end) describe('is_valid', function() it('works', function() command('split') - local win = meths.nvim_list_wins()[2] - meths.nvim_set_current_win(win) - ok(meths.nvim_win_is_valid(win)) + local win = api.nvim_list_wins()[2] + api.nvim_set_current_win(win) + ok(api.nvim_win_is_valid(win)) command('close') - ok(not meths.nvim_win_is_valid(win)) + ok(not api.nvim_win_is_valid(win)) end) end) describe('close', function() it('can close current window', function() - local oldwin = meths.nvim_get_current_win() + local oldwin = api.nvim_get_current_win() command('split') - local newwin = meths.nvim_get_current_win() - meths.nvim_win_close(newwin, false) - eq({ oldwin }, meths.nvim_list_wins()) + local newwin = api.nvim_get_current_win() + api.nvim_win_close(newwin, false) + eq({ oldwin }, api.nvim_list_wins()) end) it('can close noncurrent window', function() - local oldwin = meths.nvim_get_current_win() + local oldwin = api.nvim_get_current_win() command('split') - local newwin = meths.nvim_get_current_win() - meths.nvim_win_close(oldwin, false) - eq({ newwin }, meths.nvim_list_wins()) + local newwin = api.nvim_get_current_win() + api.nvim_win_close(oldwin, false) + eq({ newwin }, api.nvim_list_wins()) end) it("handles changed buffer when 'hidden' is unset", function() command('set nohidden') - local oldwin = meths.nvim_get_current_win() + local oldwin = api.nvim_get_current_win() insert('text') command('new') - local newwin = meths.nvim_get_current_win() + local newwin = api.nvim_get_current_win() eq( 'Vim:E37: No write since last change (add ! to override)', - pcall_err(meths.nvim_win_close, oldwin, false) + pcall_err(api.nvim_win_close, oldwin, false) ) - eq({ newwin, oldwin }, meths.nvim_list_wins()) + eq({ newwin, oldwin }, api.nvim_list_wins()) end) it('handles changed buffer with force', function() - local oldwin = meths.nvim_get_current_win() + local oldwin = api.nvim_get_current_win() insert('text') command('new') - local newwin = meths.nvim_get_current_win() - meths.nvim_win_close(oldwin, true) - eq({ newwin }, meths.nvim_list_wins()) + local newwin = api.nvim_get_current_win() + api.nvim_win_close(oldwin, true) + eq({ newwin }, api.nvim_list_wins()) end) it('in cmdline-window #9767', function() command('split') - eq(2, #meths.nvim_list_wins()) - local oldwin = meths.nvim_get_current_win() - local otherwin = meths.nvim_open_win(0, false, { + eq(2, #api.nvim_list_wins()) + local oldwin = api.nvim_get_current_win() + local otherwin = api.nvim_open_win(0, false, { relative = 'editor', row = 10, col = 10, @@ -562,20 +556,20 @@ describe('API/win', function() }) -- Open cmdline-window. feed('q:') - eq(4, #meths.nvim_list_wins()) - eq(':', funcs.getcmdwintype()) + eq(4, #api.nvim_list_wins()) + eq(':', fn.getcmdwintype()) -- Not allowed to close previous window from cmdline-window. eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_win_close, oldwin, true) + pcall_err(api.nvim_win_close, oldwin, true) ) -- Closing other windows is fine. - meths.nvim_win_close(otherwin, true) - eq(false, meths.nvim_win_is_valid(otherwin)) + api.nvim_win_close(otherwin, true) + eq(false, api.nvim_win_is_valid(otherwin)) -- Close cmdline-window. - meths.nvim_win_close(0, true) - eq(2, #meths.nvim_list_wins()) - eq('', funcs.getcmdwintype()) + api.nvim_win_close(0, true) + eq(2, #api.nvim_list_wins()) + eq('', fn.getcmdwintype()) end) it('closing current (float) window of another tabpage #15313', function() @@ -583,7 +577,7 @@ describe('API/win', function() command('botright split') local prevwin = curwin().id eq(2, eval('tabpagenr()')) - local win = meths.nvim_open_win(0, true, { + local win = api.nvim_open_win(0, true, { relative = 'editor', row = 10, col = 10, @@ -593,67 +587,67 @@ describe('API/win', function() local tab = eval('tabpagenr()') command('tabprevious') eq(1, eval('tabpagenr()')) - meths.nvim_win_close(win, false) + api.nvim_win_close(win, false) - eq(prevwin, meths.nvim_tabpage_get_win(tab).id) + eq(prevwin, api.nvim_tabpage_get_win(tab).id) assert_alive() end) end) describe('hide', function() it('can hide current window', function() - local oldwin = meths.nvim_get_current_win() + local oldwin = api.nvim_get_current_win() command('split') - local newwin = meths.nvim_get_current_win() - meths.nvim_win_hide(newwin) - eq({ oldwin }, meths.nvim_list_wins()) + local newwin = api.nvim_get_current_win() + api.nvim_win_hide(newwin) + eq({ oldwin }, api.nvim_list_wins()) end) it('can hide noncurrent window', function() - local oldwin = meths.nvim_get_current_win() + local oldwin = api.nvim_get_current_win() command('split') - local newwin = meths.nvim_get_current_win() - meths.nvim_win_hide(oldwin) - eq({ newwin }, meths.nvim_list_wins()) + local newwin = api.nvim_get_current_win() + api.nvim_win_hide(oldwin) + eq({ newwin }, api.nvim_list_wins()) end) it('does not close the buffer', function() - local oldwin = meths.nvim_get_current_win() - local oldbuf = meths.nvim_get_current_buf() - local buf = meths.nvim_create_buf(true, false) - local newwin = meths.nvim_open_win(buf, true, { + local oldwin = api.nvim_get_current_win() + local oldbuf = api.nvim_get_current_buf() + local buf = api.nvim_create_buf(true, false) + local newwin = api.nvim_open_win(buf, true, { relative = 'win', row = 3, col = 3, width = 12, height = 3, }) - meths.nvim_win_hide(newwin) - eq({ oldwin }, meths.nvim_list_wins()) - eq({ oldbuf, buf }, meths.nvim_list_bufs()) + api.nvim_win_hide(newwin) + eq({ oldwin }, api.nvim_list_wins()) + eq({ oldbuf, buf }, api.nvim_list_bufs()) end) it('deletes the buffer when bufhidden=wipe', function() - local oldwin = meths.nvim_get_current_win() - local oldbuf = meths.nvim_get_current_buf() - local buf = meths.nvim_create_buf(true, false).id - local newwin = meths.nvim_open_win(buf, true, { + local oldwin = api.nvim_get_current_win() + local oldbuf = api.nvim_get_current_buf() + local buf = api.nvim_create_buf(true, false).id + local newwin = api.nvim_open_win(buf, true, { relative = 'win', row = 3, col = 3, width = 12, height = 3, }) - meths.nvim_set_option_value('bufhidden', 'wipe', { buf = buf }) - meths.nvim_win_hide(newwin) - eq({ oldwin }, meths.nvim_list_wins()) - eq({ oldbuf }, meths.nvim_list_bufs()) + api.nvim_set_option_value('bufhidden', 'wipe', { buf = buf }) + api.nvim_win_hide(newwin) + eq({ oldwin }, api.nvim_list_wins()) + eq({ oldbuf }, api.nvim_list_bufs()) end) it('in the cmdwin', function() feed('q:') -- Can close the cmdwin. - meths.nvim_win_hide(0) - eq('', funcs.getcmdwintype()) + api.nvim_win_hide(0) + eq('', fn.getcmdwintype()) - local old_win = meths.nvim_get_current_win() - local other_win = meths.nvim_open_win(0, false, { + local old_win = api.nvim_get_current_win() + local other_win = api.nvim_open_win(0, false, { relative = 'win', row = 3, col = 3, @@ -664,60 +658,60 @@ describe('API/win', function() -- Cannot close the previous window. eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_win_hide, old_win) + pcall_err(api.nvim_win_hide, old_win) ) -- Can close other windows. - meths.nvim_win_hide(other_win) - eq(false, meths.nvim_win_is_valid(other_win)) + api.nvim_win_hide(other_win) + eq(false, api.nvim_win_is_valid(other_win)) end) end) describe('text_height', function() it('validation', function() - local X = meths.nvim_get_vvar('maxcol') + local X = api.nvim_get_vvar('maxcol') insert([[ aaa bbb ccc ddd eee]]) - eq('Invalid window id: 23', pcall_err(meths.nvim_win_text_height, 23, {})) - eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { start_row = 5 })) - eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { start_row = -6 })) - eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { end_row = 5 })) - eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { end_row = -6 })) + eq('Invalid window id: 23', pcall_err(api.nvim_win_text_height, 23, {})) + eq('Line index out of bounds', pcall_err(api.nvim_win_text_height, 0, { start_row = 5 })) + eq('Line index out of bounds', pcall_err(api.nvim_win_text_height, 0, { start_row = -6 })) + eq('Line index out of bounds', pcall_err(api.nvim_win_text_height, 0, { end_row = 5 })) + eq('Line index out of bounds', pcall_err(api.nvim_win_text_height, 0, { end_row = -6 })) eq( "'start_row' is higher than 'end_row'", - pcall_err(meths.nvim_win_text_height, 0, { start_row = 3, end_row = 1 }) + pcall_err(api.nvim_win_text_height, 0, { start_row = 3, end_row = 1 }) ) eq( "'start_vcol' specified without 'start_row'", - pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, start_vcol = 0 }) + pcall_err(api.nvim_win_text_height, 0, { end_row = 2, start_vcol = 0 }) ) eq( "'end_vcol' specified without 'end_row'", - pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, end_vcol = 0 }) + pcall_err(api.nvim_win_text_height, 0, { start_row = 2, end_vcol = 0 }) ) eq( "Invalid 'start_vcol': out of range", - pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, start_vcol = -1 }) + pcall_err(api.nvim_win_text_height, 0, { start_row = 2, start_vcol = -1 }) ) eq( "Invalid 'start_vcol': out of range", - pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, start_vcol = X + 1 }) + pcall_err(api.nvim_win_text_height, 0, { start_row = 2, start_vcol = X + 1 }) ) eq( "Invalid 'end_vcol': out of range", - pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, end_vcol = -1 }) + pcall_err(api.nvim_win_text_height, 0, { end_row = 2, end_vcol = -1 }) ) eq( "Invalid 'end_vcol': out of range", - pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, end_vcol = X + 1 }) + pcall_err(api.nvim_win_text_height, 0, { end_row = 2, end_vcol = X + 1 }) ) eq( "'start_vcol' is higher than 'end_vcol'", pcall_err( - meths.nvim_win_text_height, + api.nvim_win_text_height, 0, { start_row = 2, end_row = 2, start_vcol = 10, end_vcol = 5 } ) @@ -725,7 +719,7 @@ describe('API/win', function() end) it('with two diff windows', function() - local X = meths.nvim_get_vvar('maxcol') + local X = api.nvim_get_vvar('maxcol') local screen = Screen.new(45, 22) screen:set_default_attr_ids({ [0] = { foreground = Screen.colors.Blue1, bold = true }, @@ -787,80 +781,71 @@ describe('API/win', function() | ]], } - eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1000, {})) - eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, {})) - eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1000, { start_row = 0 })) - eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, { start_row = 0 })) - eq({ all = 15, fill = 0 }, meths.nvim_win_text_height(1000, { end_row = -1 })) - eq({ all = 15, fill = 0 }, meths.nvim_win_text_height(1000, { end_row = 40 })) - eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = -1 })) - eq({ all = 20, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = 40 })) - eq({ all = 10, fill = 5 }, meths.nvim_win_text_height(1000, { start_row = 23 })) - eq({ all = 13, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 18 })) - eq({ all = 11, fill = 0 }, meths.nvim_win_text_height(1000, { end_row = 23 })) - eq({ all = 11, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = 18 })) - eq({ all = 11, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 3, end_row = 39 })) - eq({ all = 11, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 1, end_row = 34 })) - eq({ all = 9, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 4, end_row = 38 })) - eq({ all = 9, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 2, end_row = 33 })) - eq({ all = 9, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 5, end_row = 37 })) - eq({ all = 9, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 3, end_row = 32 })) - eq({ all = 9, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 17, end_row = 25 })) - eq({ all = 9, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 15, end_row = 20 })) - eq({ all = 7, fill = 0 }, meths.nvim_win_text_height(1000, { start_row = 18, end_row = 24 })) - eq({ all = 7, fill = 3 }, meths.nvim_win_text_height(1001, { start_row = 16, end_row = 19 })) - eq({ all = 6, fill = 5 }, meths.nvim_win_text_height(1000, { start_row = -1 })) - eq( - { all = 5, fill = 5 }, - meths.nvim_win_text_height(1000, { start_row = -1, start_vcol = X }) - ) + eq({ all = 20, fill = 5 }, api.nvim_win_text_height(1000, {})) + eq({ all = 20, fill = 5 }, api.nvim_win_text_height(1001, {})) + eq({ all = 20, fill = 5 }, api.nvim_win_text_height(1000, { start_row = 0 })) + eq({ all = 20, fill = 5 }, api.nvim_win_text_height(1001, { start_row = 0 })) + eq({ all = 15, fill = 0 }, api.nvim_win_text_height(1000, { end_row = -1 })) + eq({ all = 15, fill = 0 }, api.nvim_win_text_height(1000, { end_row = 40 })) + eq({ all = 20, fill = 5 }, api.nvim_win_text_height(1001, { end_row = -1 })) + eq({ all = 20, fill = 5 }, api.nvim_win_text_height(1001, { end_row = 40 })) + eq({ all = 10, fill = 5 }, api.nvim_win_text_height(1000, { start_row = 23 })) + eq({ all = 13, fill = 3 }, api.nvim_win_text_height(1001, { start_row = 18 })) + eq({ all = 11, fill = 0 }, api.nvim_win_text_height(1000, { end_row = 23 })) + eq({ all = 11, fill = 5 }, api.nvim_win_text_height(1001, { end_row = 18 })) + eq({ all = 11, fill = 0 }, api.nvim_win_text_height(1000, { start_row = 3, end_row = 39 })) + eq({ all = 11, fill = 3 }, api.nvim_win_text_height(1001, { start_row = 1, end_row = 34 })) + eq({ all = 9, fill = 0 }, api.nvim_win_text_height(1000, { start_row = 4, end_row = 38 })) + eq({ all = 9, fill = 3 }, api.nvim_win_text_height(1001, { start_row = 2, end_row = 33 })) + eq({ all = 9, fill = 0 }, api.nvim_win_text_height(1000, { start_row = 5, end_row = 37 })) + eq({ all = 9, fill = 3 }, api.nvim_win_text_height(1001, { start_row = 3, end_row = 32 })) + eq({ all = 9, fill = 0 }, api.nvim_win_text_height(1000, { start_row = 17, end_row = 25 })) + eq({ all = 9, fill = 3 }, api.nvim_win_text_height(1001, { start_row = 15, end_row = 20 })) + eq({ all = 7, fill = 0 }, api.nvim_win_text_height(1000, { start_row = 18, end_row = 24 })) + eq({ all = 7, fill = 3 }, api.nvim_win_text_height(1001, { start_row = 16, end_row = 19 })) + eq({ all = 6, fill = 5 }, api.nvim_win_text_height(1000, { start_row = -1 })) + eq({ all = 5, fill = 5 }, api.nvim_win_text_height(1000, { start_row = -1, start_vcol = X })) eq( { all = 0, fill = 0 }, - meths.nvim_win_text_height(1000, { start_row = -1, start_vcol = X, end_row = -1 }) + api.nvim_win_text_height(1000, { start_row = -1, start_vcol = X, end_row = -1 }) ) eq( { all = 0, fill = 0 }, - meths.nvim_win_text_height( + api.nvim_win_text_height( 1000, { start_row = -1, start_vcol = X, end_row = -1, end_vcol = X } ) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height( + api.nvim_win_text_height( 1000, { start_row = -1, start_vcol = 0, end_row = -1, end_vcol = X } ) ) - eq({ all = 3, fill = 2 }, meths.nvim_win_text_height(1001, { end_row = 0 })) - eq({ all = 2, fill = 2 }, meths.nvim_win_text_height(1001, { end_row = 0, end_vcol = 0 })) + eq({ all = 3, fill = 2 }, api.nvim_win_text_height(1001, { end_row = 0 })) + eq({ all = 2, fill = 2 }, api.nvim_win_text_height(1001, { end_row = 0, end_vcol = 0 })) eq( { all = 2, fill = 2 }, - meths.nvim_win_text_height(1001, { start_row = 0, end_row = 0, end_vcol = 0 }) + api.nvim_win_text_height(1001, { start_row = 0, end_row = 0, end_vcol = 0 }) ) eq( { all = 0, fill = 0 }, - meths.nvim_win_text_height( - 1001, - { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = 0 } - ) + api.nvim_win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = 0 }) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height( - 1001, - { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = X } - ) + api.nvim_win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 0, end_vcol = X }) ) - eq({ all = 11, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = 18 })) + eq({ all = 11, fill = 5 }, api.nvim_win_text_height(1001, { end_row = 18 })) eq( { all = 9, fill = 3 }, - meths.nvim_win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 18 }) + api.nvim_win_text_height(1001, { start_row = 0, start_vcol = 0, end_row = 18 }) ) - eq({ all = 10, fill = 5 }, meths.nvim_win_text_height(1001, { end_row = 18, end_vcol = 0 })) + eq({ all = 10, fill = 5 }, api.nvim_win_text_height(1001, { end_row = 18, end_vcol = 0 })) eq( { all = 8, fill = 3 }, - meths.nvim_win_text_height( + api.nvim_win_text_height( 1001, { start_row = 0, start_vcol = 0, end_row = 18, end_vcol = 0 } ) @@ -868,7 +853,7 @@ describe('API/win', function() end) it('with wrapped lines', function() - local X = meths.nvim_get_vvar('maxcol') + local X = api.nvim_get_vvar('maxcol') local screen = Screen.new(45, 22) screen:set_default_attr_ids({ [0] = { foreground = Screen.colors.Blue1, bold = true }, @@ -880,15 +865,15 @@ describe('API/win', function() set number cpoptions+=n call setline(1, repeat([repeat('foobar-', 36)], 3)) ]]) - local ns = meths.nvim_create_namespace('') - meths.nvim_buf_set_extmark( + local ns = api.nvim_create_namespace('') + api.nvim_buf_set_extmark( 0, ns, 1, 100, { virt_text = { { ('?'):rep(15), 'Search' } }, virt_text_pos = 'inline' } ) - meths.nvim_buf_set_extmark( + api.nvim_buf_set_extmark( 0, ns, 2, @@ -928,155 +913,122 @@ describe('API/win', function() | ]], } - eq({ all = 21, fill = 0 }, meths.nvim_win_text_height(0, {})) - eq({ all = 6, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, end_row = 0 })) - eq({ all = 7, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 1, end_row = 1 })) - eq({ all = 8, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 2, end_row = 2 })) + eq({ all = 21, fill = 0 }, api.nvim_win_text_height(0, {})) + eq({ all = 6, fill = 0 }, api.nvim_win_text_height(0, { start_row = 0, end_row = 0 })) + eq({ all = 7, fill = 0 }, api.nvim_win_text_height(0, { start_row = 1, end_row = 1 })) + eq({ all = 8, fill = 0 }, api.nvim_win_text_height(0, { start_row = 2, end_row = 2 })) eq( { all = 0, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 0 }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 0 }) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 41 }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 41 }) ) eq( { all = 2, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 42 }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 42 }) ) eq( { all = 2, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 86 }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 86 }) ) eq( { all = 3, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 87 }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 87 }) ) eq( { all = 6, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 266 } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 266 }) ) eq( { all = 7, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 267 } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 267 }) ) eq( { all = 7, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 311 } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 311 }) ) eq( { all = 7, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 312 } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = 312 }) ) eq( { all = 7, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = X }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 0, end_row = 1, end_vcol = X }) ) eq( { all = 7, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 40, end_row = 1, end_vcol = X }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 40, end_row = 1, end_vcol = X }) ) eq( { all = 6, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 41, end_row = 1, end_vcol = X }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 41, end_row = 1, end_vcol = X }) ) eq( { all = 6, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 85, end_row = 1, end_vcol = X }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 85, end_row = 1, end_vcol = X }) ) eq( { all = 5, fill = 0 }, - meths.nvim_win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = X }) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = X }) ) eq( { all = 2, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 265, end_row = 1, end_vcol = X } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 265, end_row = 1, end_vcol = X }) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 266, end_row = 1, end_vcol = X } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 266, end_row = 1, end_vcol = X }) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 310, end_row = 1, end_vcol = X } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 310, end_row = 1, end_vcol = X }) ) eq( { all = 0, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 311, end_row = 1, end_vcol = X } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 311, end_row = 1, end_vcol = X }) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = 131 } - ) + api.nvim_win_text_height(0, { start_row = 1, start_vcol = 86, end_row = 1, end_vcol = 131 }) ) eq( { all = 1, fill = 0 }, - meths.nvim_win_text_height( + api.nvim_win_text_height( 0, { start_row = 1, start_vcol = 221, end_row = 1, end_vcol = 266 } ) ) - eq({ all = 18, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 131 })) - eq({ all = 19, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 130 })) - eq({ all = 20, fill = 0 }, meths.nvim_win_text_height(0, { end_row = 2, end_vcol = 311 })) - eq({ all = 21, fill = 0 }, meths.nvim_win_text_height(0, { end_row = 2, end_vcol = 312 })) + eq({ all = 18, fill = 0 }, api.nvim_win_text_height(0, { start_row = 0, start_vcol = 131 })) + eq({ all = 19, fill = 0 }, api.nvim_win_text_height(0, { start_row = 0, start_vcol = 130 })) + eq({ all = 20, fill = 0 }, api.nvim_win_text_height(0, { end_row = 2, end_vcol = 311 })) + eq({ all = 21, fill = 0 }, api.nvim_win_text_height(0, { end_row = 2, end_vcol = 312 })) eq( { all = 17, fill = 0 }, - meths.nvim_win_text_height( + api.nvim_win_text_height( 0, { start_row = 0, start_vcol = 131, end_row = 2, end_vcol = 311 } ) ) eq( { all = 19, fill = 0 }, - meths.nvim_win_text_height( + api.nvim_win_text_height( 0, { start_row = 0, start_vcol = 130, end_row = 2, end_vcol = 312 } ) ) - eq({ all = 16, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 221 })) - eq({ all = 17, fill = 0 }, meths.nvim_win_text_height(0, { start_row = 0, start_vcol = 220 })) - eq({ all = 14, fill = 0 }, meths.nvim_win_text_height(0, { end_row = 2, end_vcol = 41 })) - eq({ all = 15, fill = 0 }, meths.nvim_win_text_height(0, { end_row = 2, end_vcol = 42 })) + eq({ all = 16, fill = 0 }, api.nvim_win_text_height(0, { start_row = 0, start_vcol = 221 })) + eq({ all = 17, fill = 0 }, api.nvim_win_text_height(0, { start_row = 0, start_vcol = 220 })) + eq({ all = 14, fill = 0 }, api.nvim_win_text_height(0, { end_row = 2, end_vcol = 41 })) + eq({ all = 15, fill = 0 }, api.nvim_win_text_height(0, { end_row = 2, end_vcol = 42 })) eq( { all = 9, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 0, start_vcol = 221, end_row = 2, end_vcol = 41 } - ) + api.nvim_win_text_height(0, { start_row = 0, start_vcol = 221, end_row = 2, end_vcol = 41 }) ) eq( { all = 11, fill = 0 }, - meths.nvim_win_text_height( - 0, - { start_row = 0, start_vcol = 220, end_row = 2, end_vcol = 42 } - ) + api.nvim_win_text_height(0, { start_row = 0, start_vcol = 220, end_row = 2, end_vcol = 42 }) ) end) end) @@ -1084,7 +1036,7 @@ describe('API/win', function() describe('open_win', function() it('noautocmd option works', function() command('autocmd BufEnter,BufLeave,BufWinEnter * let g:fired = 1') - meths.nvim_open_win(meths.nvim_create_buf(true, true), true, { + api.nvim_open_win(api.nvim_create_buf(true, true), true, { relative = 'win', row = 3, col = 3, @@ -1092,23 +1044,23 @@ describe('API/win', function() height = 3, noautocmd = true, }) - eq(0, funcs.exists('g:fired')) - meths.nvim_open_win(meths.nvim_create_buf(true, true), true, { + eq(0, fn.exists('g:fired')) + api.nvim_open_win(api.nvim_create_buf(true, true), true, { relative = 'win', row = 3, col = 3, width = 12, height = 3, }) - eq(1, funcs.exists('g:fired')) + eq(1, fn.exists('g:fired')) end) it('disallowed in cmdwin if enter=true or buf=curbuf', function() - local new_buf = meths.nvim_create_buf(true, true) + local new_buf = api.nvim_create_buf(true, true) feed('q:') eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_open_win, new_buf, true, { + pcall_err(api.nvim_open_win, new_buf, true, { relative = 'editor', row = 5, col = 5, @@ -1118,7 +1070,7 @@ describe('API/win', function() ) eq( 'E11: Invalid in command-line window; executes, CTRL-C quits', - pcall_err(meths.nvim_open_win, 0, false, { + pcall_err(api.nvim_open_win, 0, false, { relative = 'editor', row = 5, col = 5, @@ -1129,7 +1081,7 @@ describe('API/win', function() eq( new_buf, - meths.nvim_win_get_buf(meths.nvim_open_win(new_buf, false, { + api.nvim_win_get_buf(api.nvim_open_win(new_buf, false, { relative = 'editor', row = 5, col = 5, @@ -1140,10 +1092,10 @@ describe('API/win', function() end) it('aborts if buffer is invalid', function() - local wins_before = meths.nvim_list_wins() + local wins_before = api.nvim_list_wins() eq( 'Invalid buffer id: 1337', - pcall_err(meths.nvim_open_win, 1337, false, { + pcall_err(api.nvim_open_win, 1337, false, { relative = 'editor', row = 5, col = 5, @@ -1151,14 +1103,14 @@ describe('API/win', function() height = 5, }) ) - eq(wins_before, meths.nvim_list_wins()) + eq(wins_before, api.nvim_list_wins()) end) end) describe('get_config', function() it('includes border', function() local b = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' } - local win = meths.nvim_open_win(0, true, { + local win = api.nvim_open_win(0, true, { relative = 'win', row = 3, col = 3, @@ -1167,7 +1119,7 @@ describe('API/win', function() border = b, }) - local cfg = meths.nvim_win_get_config(win) + local cfg = api.nvim_win_get_config(win) eq(b, cfg.border) end) @@ -1182,7 +1134,7 @@ describe('API/win', function() { 'g', 'Constant' }, { 'h', 'PreProc' }, } - local win = meths.nvim_open_win(0, true, { + local win = api.nvim_open_win(0, true, { relative = 'win', row = 3, col = 3, @@ -1191,14 +1143,14 @@ describe('API/win', function() border = b, }) - local cfg = meths.nvim_win_get_config(win) + local cfg = api.nvim_win_get_config(win) eq(b, cfg.border) end) it('includes title and footer', function() local title = { { 'A', { 'StatusLine', 'TabLine' } }, { 'B' }, { 'C', 'WinBar' } } local footer = { { 'A', 'WinBar' }, { 'B' }, { 'C', { 'StatusLine', 'TabLine' } } } - local win = meths.nvim_open_win(0, true, { + local win = api.nvim_open_win(0, true, { relative = 'win', row = 3, col = 3, @@ -1209,7 +1161,7 @@ describe('API/win', function() footer = footer, }) - local cfg = meths.nvim_win_get_config(win) + local cfg = api.nvim_win_get_config(win) eq(title, cfg.title) eq(footer, cfg.footer) end) @@ -1217,7 +1169,7 @@ describe('API/win', function() describe('set_config', function() it('no crash with invalid title', function() - local win = meths.nvim_open_win(0, true, { + local win = api.nvim_open_win(0, true, { width = 10, height = 10, relative = 'editor', @@ -1228,14 +1180,14 @@ describe('API/win', function() }) eq( 'title/footer cannot be an empty array', - pcall_err(meths.nvim_win_set_config, win, { title = {} }) + pcall_err(api.nvim_win_set_config, win, { title = {} }) ) command('redraw!') assert_alive() end) it('no crash with invalid footer', function() - local win = meths.nvim_open_win(0, true, { + local win = api.nvim_open_win(0, true, { width = 10, height = 10, relative = 'editor', @@ -1246,7 +1198,7 @@ describe('API/win', function() }) eq( 'title/footer cannot be an empty array', - pcall_err(meths.nvim_win_set_config, win, { footer = {} }) + pcall_err(api.nvim_win_set_config, win, { footer = {} }) ) command('redraw!') assert_alive() -- cgit From e5d9b15044d56acd48569b3ca7ac9dabdeaa750e Mon Sep 17 00:00:00 2001 From: bfredl Date: Mon, 25 Dec 2023 13:06:00 +0100 Subject: fix(buffer_updates): correct buffer updates when splitting empty line fixes #11591 --- test/functional/api/buffer_updates_spec.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index b0efcf0dab..8e43d28322 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -349,6 +349,16 @@ describe('API: buffer events:', function() expectn('nvim_buf_lines_event', { b, tick, 3, 4, {}, false }) end) + it('visual paste split empty line', function() + local b, tick = editoriginal(true, { 'abc', '{', 'def', '}' }) + command('normal! ggyyjjvi{p') + expectn('nvim_buf_lines_event', { b, tick + 1, 2, 3, { '' }, false }) + expectn('nvim_buf_lines_event', { b, tick + 2, 2, 3, { '}' }, false }) + expectn('nvim_buf_lines_event', { b, tick + 3, 3, 4, {}, false }) + expectn('nvim_buf_lines_event', { b, tick + 3, 2, 3, { '' }, false }) + expectn('nvim_buf_lines_event', { b, tick + 4, 3, 3, { 'abc', '}' }, false }) + end) + it('when lines are filtered', function() -- Test filtering lines with !cat local b, tick = editoriginal(true, { 'A', 'C', 'E', 'B', 'D', 'F' }) -- cgit From 8f02ae82e203920b472d17e75a61763f3a409a7b Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Tue, 16 Jan 2024 13:26:21 +0000 Subject: test: use integers for API Buffer/Window/Tabpage EXT types --- test/functional/api/buffer_spec.lua | 4 +- test/functional/api/buffer_updates_spec.lua | 2 +- test/functional/api/extmark_spec.lua | 54 +++++++++++++------------- test/functional/api/vim_spec.lua | 59 +++++++++++++++-------------- test/functional/api/window_spec.lua | 10 ++--- 5 files changed, 65 insertions(+), 64 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua index 10be4c56a7..78d220ff57 100644 --- a/test/functional/api/buffer_spec.lua +++ b/test/functional/api/buffer_spec.lua @@ -733,7 +733,7 @@ describe('api/buf', function() end) it('set_lines on unloaded buffer #8659 #22670', function() - local bufnr = api.nvim_get_current_buf().id + local bufnr = api.nvim_get_current_buf() lua_or_rpc.nvim_buf_set_lines(bufnr, 0, -1, false, { 'a', 'b', 'c' }) lua_or_rpc.nvim_buf_set_name(bufnr, 'set_lines') finally(function() @@ -2101,7 +2101,7 @@ describe('api/buf', function() api.nvim_buf_set_lines(0, -1, -1, true, { 'a', 'bit of', 'text' }) eq(true, api.nvim_buf_set_mark(0, 'Z', 3, 2, {})) eq({ 3, 2 }, api.nvim_buf_get_mark(0, 'Z')) - eq({ api.nvim_get_current_buf().id, 3, 3, 0 }, fn.getpos("'Z")) + eq({ api.nvim_get_current_buf(), 3, 3, 0 }, fn.getpos("'Z")) end) it('fails when invalid marks names are used', function() eq(false, pcall(api.nvim_buf_set_mark, 0, '!', 1, 0, {})) diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index 40fa129772..d68c60e54c 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -820,7 +820,7 @@ describe('API: buffer events:', function() [1] = 'notification', [2] = 'nvim_buf_changedtick_event', [3] = { - [1] = { id = 1 }, + [1] = 1, [2] = 2, }, }, next_msg()) diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index ed7c52971d..54f4aaab03 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1895,7 +1895,7 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, }, }, }) @@ -1921,27 +1921,27 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- notification from 1st call - { { id = 1000 }, ns, marks[1], 1, 0 }, + { 1000, ns, marks[1], 1, 0 }, -- notifications from 2nd call - { { id = 1000 }, ns, marks[1], 1, 0 }, - { { id = 1000 }, ns, marks[2], 1, 2 }, + { 1000, ns, marks[1], 1, 0 }, + { 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 }, + { 1000, ns, marks[1], 1, 0 }, + { 1000, ns, marks[2], 1, 2 }, + { 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 }, + { 1000, ns, marks[1], 1, 0 }, + { 1000, ns, marks[2], 1, 2 }, + { 1000, ns, marks[3], 1, 4 }, + { 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 }, + { 1000, ns, marks[1], 1, 0 }, + { 1000, ns, marks[2], 1, 2 }, + { 1000, ns, marks[3], 1, 4 }, + { 1000, ns, marks[4], 1, 6 }, -- eol - { { id = 1000 }, ns, marks[5], 2, 11 }, + { 1000, ns, marks[5], 2, 11 }, }, }, }) @@ -1966,9 +1966,9 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, -- updated and wrapped to 3rd line - { { id = 1000 }, ns, marks[1], 2, 2 }, + { 1000, ns, marks[1], 2, 2 }, }, }, }) @@ -1983,9 +1983,9 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, -- updated and wrapped to 3rd line - { { id = 1000 }, ns, marks[1], 2, 2 }, + { 1000, ns, marks[1], 2, 2 }, -- scrolled up one line, should be handled by grid scroll }, }, @@ -2021,13 +2021,13 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, -- updated after split - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, }, [4] = { -- only after split - { { id = 1001 }, ns, marks[1], 1, 16 }, + { 1001, ns, marks[1], 1, 16 }, }, }, }) @@ -2054,14 +2054,14 @@ describe('API/win_extmark', function() extmarks = { [2] = { -- positioned at the end of the 2nd line - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, -- updated after split - { { id = 1000 }, ns, marks[1], 1, 16 }, + { 1000, ns, marks[1], 1, 16 }, }, [4] = { - { { id = 1001 }, ns, marks[1], 1, 16 }, + { 1001, ns, marks[1], 1, 16 }, -- updated - { { id = 1001 }, ns, marks[1], 2, 2 }, + { 1001, ns, marks[1], 2, 2 }, }, }, }) diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index aa3b4419cc..8d9789a3ce 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -1697,19 +1697,20 @@ describe('API', function() it('get buffer or window-local options', function() command('new') - local buf = api.nvim_get_current_buf().id + local buf = api.nvim_get_current_buf() api.nvim_set_option_value('tagfunc', 'foobar', { buf = buf }) eq('foobar', api.nvim_get_option_value('tagfunc', { buf = buf })) - local win = api.nvim_get_current_win().id + local win = api.nvim_get_current_win() api.nvim_set_option_value('number', true, { win = win }) eq(true, api.nvim_get_option_value('number', { win = win })) end) it('getting current buffer option does not adjust cursor #19381', function() command('new') - local buf = api.nvim_get_current_buf().id - local win = api.nvim_get_current_win().id + local buf = api.nvim_get_current_buf() + print(vim.inspect(api.nvim_get_current_buf())) + local win = api.nvim_get_current_win() insert('some text') feed('0v$') eq({ 1, 9 }, api.nvim_win_get_cursor(win)) @@ -2503,7 +2504,7 @@ describe('API', function() it('stream=job :terminal channel', function() command(':terminal') - eq({ id = 1 }, api.nvim_get_current_buf()) + eq(1, api.nvim_get_current_buf()) eq(3, api.nvim_get_option_value('channel', { buf = 1 })) local info = { @@ -2520,7 +2521,7 @@ describe('API', function() neq(nil, string.match(info.pty, '^/dev/')) end eq({ info = info }, event) - info.buffer = { id = 1 } + info.buffer = 1 eq({ [1] = testinfo, [2] = stderr, [3] = info }, api.nvim_list_chans()) eq(info, api.nvim_get_chan_info(3)) @@ -2989,15 +2990,15 @@ describe('API', function() describe('nvim_create_buf', function() it('works', function() - eq({ id = 2 }, api.nvim_create_buf(true, false)) - eq({ id = 3 }, api.nvim_create_buf(false, false)) + eq(2, api.nvim_create_buf(true, false)) + eq(3, api.nvim_create_buf(false, false)) eq( ' 1 %a "[No Name]" line 1\n' .. ' 2 h "[No Name]" line 0', command_output('ls') ) -- current buffer didn't change - eq({ id = 1 }, api.nvim_get_current_buf()) + eq(1, api.nvim_get_current_buf()) local screen = Screen.new(20, 4) screen:attach() @@ -3017,21 +3018,21 @@ describe('API', function() it('can change buftype before visiting', function() api.nvim_set_option_value('hidden', false, {}) - eq({ id = 2 }, api.nvim_create_buf(true, false)) + eq(2, api.nvim_create_buf(true, false)) api.nvim_set_option_value('buftype', 'nofile', { buf = 2 }) api.nvim_buf_set_lines(2, 0, -1, true, { 'test text' }) command('split | buffer 2') - eq({ id = 2 }, api.nvim_get_current_buf()) + eq(2, api.nvim_get_current_buf()) -- if the buf_set_option("buftype") didn't work, this would error out. command('close') - eq({ id = 1 }, api.nvim_get_current_buf()) + eq(1, api.nvim_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') - eq({ id = 2 }, api.nvim_create_buf(true, false)) + eq(2, api.nvim_create_buf(true, false)) api.nvim_buf_set_lines(2, 0, -1, true, { 'test', 'text' }) eq(false, eval('g:fired')) @@ -3050,9 +3051,9 @@ describe('API', function() end) it('scratch-buffer', function() - eq({ id = 2 }, api.nvim_create_buf(false, true)) - eq({ id = 3 }, api.nvim_create_buf(true, true)) - eq({ id = 4 }, api.nvim_create_buf(true, true)) + eq(2, api.nvim_create_buf(false, true)) + eq(3, api.nvim_create_buf(true, true)) + eq(4, api.nvim_create_buf(true, true)) local scratch_bufs = { 2, 3, 4 } eq( ' 1 %a "[No Name]" line 1\n' @@ -3061,7 +3062,7 @@ describe('API', function() exec_capture('ls') ) -- current buffer didn't change - eq({ id = 1 }, api.nvim_get_current_buf()) + eq(1, api.nvim_get_current_buf()) local screen = Screen.new(20, 4) screen:set_default_attr_ids({ @@ -3295,13 +3296,13 @@ describe('API', function() bufs = api.nvim_list_bufs() wins = api.nvim_list_wins() - api.nvim_win_set_buf(wins[1].id, bufs[1].id) - api.nvim_win_set_buf(wins[2].id, bufs[2].id) + api.nvim_win_set_buf(wins[1], bufs[1]) + api.nvim_win_set_buf(wins[2], bufs[2]) - api.nvim_set_current_win(wins[2].id) + api.nvim_set_current_win(wins[2]) api.nvim_exec('source ' .. fname, false) - api.nvim_set_current_win(wins[1].id) + api.nvim_set_current_win(wins[1]) end) after_each(function() @@ -3343,7 +3344,7 @@ describe('API', function() for _, t in pairs(tests) do it(t.desc, function() -- Switch to the target buffer/window so that curbuf/curwin are used. - api.nvim_set_current_win(wins[2].id) + api.nvim_set_current_win(wins[2]) local info = api.nvim_get_option_info2(unpack(t.args)) eq(t.linenr, info.last_set_linenr) eq(t.sid, info.last_set_sid) @@ -3351,13 +3352,13 @@ describe('API', function() end it('is provided for cross-buffer requests', function() - local info = api.nvim_get_option_info2('formatprg', { buf = bufs[2].id }) + local info = api.nvim_get_option_info2('formatprg', { buf = bufs[2] }) eq(2, info.last_set_linenr) eq(1, info.last_set_sid) end) it('is provided for cross-window requests', function() - local info = api.nvim_get_option_info2('listchars', { win = wins[2].id }) + local info = api.nvim_get_option_info2('listchars', { win = wins[2] }) eq(6, info.last_set_linenr) eq(1, info.last_set_sid) end) @@ -3597,7 +3598,7 @@ describe('API', function() local mark = api.nvim_get_mark('F', {}) -- Compare the path tail only assert(string.find(mark[4], 'mybuf$')) - eq({ 2, 2, buf.id, mark[4] }, mark) + eq({ 2, 2, buf, mark[4] }, mark) end) it('validation', function() eq("Invalid mark name (must be file/uppercase): 'f'", pcall_err(api.nvim_get_mark, 'f', {})) @@ -3619,7 +3620,7 @@ describe('API', function() api.nvim_buf_set_mark(buf, 'F', 2, 2, {}) command('new') -- Create new buf to avoid :bd failing - command('bd! ' .. buf.id) + command('bd! ' .. buf) os.remove(fname) local mark = api.nvim_get_mark('F', {}) @@ -3628,7 +3629,7 @@ 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, mark[4] }, mark) end) end) describe('nvim_eval_statusline', function() @@ -3743,7 +3744,7 @@ describe('API', function() }, api.nvim_eval_statusline( 'TextWithNoHighlight%#WarningMsg#TextWithWarningHighlight', - { winid = api.nvim_list_wins()[2].id, highlights = true } + { winid = api.nvim_list_wins()[2], highlights = true } ) ) end) @@ -4824,7 +4825,7 @@ describe('API', function() it('works', function() command('vsplit | enew') api.nvim_cmd({ cmd = 'bdelete', args = { api.nvim_get_current_buf() } }, {}) - eq(1, api.nvim_get_current_buf().id) + eq(1, api.nvim_get_current_buf()) end) it('works with :sleep using milliseconds', function() local start = uv.now() diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index d30a6460a6..4e71e4ab85 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -428,11 +428,11 @@ describe('API/win', function() command('tabnew') local tab1 = unpack(api.nvim_list_tabpages()) local win1 = unpack(api.nvim_tabpage_list_wins(tab1)) - api.nvim_set_option_value('statusline', 'window-status', { win = win1.id }) + api.nvim_set_option_value('statusline', 'window-status', { win = win1 }) command('split') command('wincmd J') command('wincmd j') - eq('window-status', api.nvim_get_option_value('statusline', { win = win1.id })) + eq('window-status', api.nvim_get_option_value('statusline', { win = win1 })) assert_alive() end) @@ -575,7 +575,7 @@ describe('API/win', function() it('closing current (float) window of another tabpage #15313', function() command('tabedit') command('botright split') - local prevwin = curwin().id + local prevwin = curwin() eq(2, eval('tabpagenr()')) local win = api.nvim_open_win(0, true, { relative = 'editor', @@ -589,7 +589,7 @@ describe('API/win', function() eq(1, eval('tabpagenr()')) api.nvim_win_close(win, false) - eq(prevwin, api.nvim_tabpage_get_win(tab).id) + eq(prevwin, api.nvim_tabpage_get_win(tab)) assert_alive() end) end) @@ -627,7 +627,7 @@ describe('API/win', function() it('deletes the buffer when bufhidden=wipe', function() local oldwin = api.nvim_get_current_win() local oldbuf = api.nvim_get_current_buf() - local buf = api.nvim_create_buf(true, false).id + local buf = api.nvim_create_buf(true, false) local newwin = api.nvim_open_win(buf, true, { relative = 'win', row = 3, -- cgit From b536e0ba37addaea5507b054120e4c1e122c4405 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Mon, 15 Jan 2024 16:10:51 +0000 Subject: test: big cleanup followup Followup to 07a7c0ec --- test/functional/api/vim_spec.lua | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 8d9789a3ce..fb10ed34e5 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -8,7 +8,7 @@ local assert_alive = helpers.assert_alive local NIL = vim.NIL local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq local command = helpers.command -local command_output = helpers.api.command_output +local command_output = helpers.api.nvim_command_output local exec = helpers.exec local exec_capture = helpers.exec_capture local eval = helpers.eval @@ -19,6 +19,7 @@ local matches = helpers.matches local pesc = vim.pesc local mkdir_p = helpers.mkdir_p local ok, nvim_async, feed = helpers.ok, helpers.nvim_async, helpers.feed +local async_meths = helpers.async_meths local is_os = helpers.is_os local parse_context = helpers.parse_context local request = helpers.request @@ -76,7 +77,7 @@ describe('API', function() eq({ 'notification', 'nvim_error_event', - { error_types.Exception.id, 'Invalid method: nvim_bogus' }, + { error_types.Exception.id, 'Invalid method: bogus' }, }, next_msg()) -- error didn't close channel. assert_alive() @@ -84,7 +85,7 @@ describe('API', function() it('failed async request emits nvim_error_event', function() local error_types = api.nvim_get_api_info()[2].error_types - nvim_async('command', 'bogus') + async_meths.nvim_command('bogus') eq({ 'notification', 'nvim_error_event', @@ -2081,13 +2082,13 @@ describe('API', function() { ['rc'] = { 'hjkl' }, ['n'] = 97 }, }, - ['jumps'] = eval(([[ + ['jumps'] = eval((([[ filter(map(add( getjumplist()[0], { 'bufnr': bufnr('%'), 'lnum': getcurpos()[1] }), 'filter( { "f": expand("#".v:val.bufnr.":p"), "l": v:val.lnum }, { k, v -> k != "l" || v != 1 })'), '!empty(v:val.f)') - ]]):gsub('\n', '')), + ]]):gsub('\n', ''))), ['bufs'] = eval([[ filter(map(getbufinfo(), '{ "f": v:val.name }'), '!empty(v:val.f)') @@ -2301,7 +2302,7 @@ describe('API', function() end) it('can show one line', function() - nvim_async('err_write', 'has bork\n') + async_meths.nvim_err_write('has bork\n') screen:expect([[ ^ | {0:~ }|*6 @@ -2310,7 +2311,7 @@ describe('API', function() end) it('shows return prompt when more than &cmdheight lines', function() - nvim_async('err_write', 'something happened\nvery bad\n') + async_meths.nvim_err_write('something happened\nvery bad\n') screen:expect([[ | {0:~ }|*3 @@ -2322,7 +2323,7 @@ describe('API', function() end) it('shows return prompt after all lines are shown', function() - nvim_async('err_write', 'FAILURE\nERROR\nEXCEPTION\nTRACEBACK\n') + async_meths.nvim_err_write('FAILURE\nERROR\nEXCEPTION\nTRACEBACK\n') screen:expect([[ | {0:~ }| @@ -2337,8 +2338,8 @@ describe('API', function() it('handles multiple calls', function() -- without linebreak text is joined to one line - nvim_async('err_write', 'very ') - nvim_async('err_write', 'fail\n') + async_meths.nvim_err_write('very ') + async_meths.nvim_err_write('fail\n') screen:expect([[ ^ | {0:~ }|*6 @@ -2347,7 +2348,7 @@ describe('API', function() helpers.poke_eventloop() -- shows up to &cmdheight lines - nvim_async('err_write', 'more fail\ntoo fail\n') + async_meths.nvim_err_write('more fail\ntoo fail\n') screen:expect([[ | {0:~ }|*3 @@ -2360,7 +2361,7 @@ describe('API', function() end) it('NUL bytes in message', function() - nvim_async('err_write', 'aaa\0bbb\0\0ccc\nddd\0\0\0eee\n') + async_meths.nvim_err_write('aaa\0bbb\0\0ccc\nddd\0\0\0eee\n') screen:expect { grid = [[ | @@ -2389,7 +2390,7 @@ describe('API', function() end) it('shows only one return prompt after all lines are shown', function() - nvim_async('err_writeln', 'FAILURE\nERROR\nEXCEPTION\nTRACEBACK') + async_meths.nvim_err_writeln('FAILURE\nERROR\nEXCEPTION\nTRACEBACK') screen:expect([[ | {0:~ }| @@ -3394,8 +3395,7 @@ describe('API', function() end) it('can show highlighted line', function() - nvim_async( - 'echo', + async_meths.nvim_echo( { { 'msg_a' }, { 'msg_b', 'Statement' }, { 'msg_c', 'Special' } }, true, {} @@ -3410,7 +3410,7 @@ describe('API', function() end) it('can show highlighted multiline', function() - nvim_async('echo', { { 'msg_a\nmsg_a', 'Statement' }, { 'msg_b', 'Special' } }, true, {}) + async_meths.nvim_echo({ { 'msg_a\nmsg_a', 'Statement' }, { 'msg_b', 'Special' } }, true, {}) screen:expect { grid = [[ | @@ -3431,7 +3431,7 @@ describe('API', function() it('can disable saving message history', function() command('set cmdheight=2') -- suppress Press ENTER - nvim_async('echo', { { 'msg\nmsg' }, { 'msg' } }, false, {}) + async_meths.nvim_echo({ { 'msg\nmsg' }, { 'msg' } }, false, {}) eq('', exec_capture('messages')) end) end) -- cgit From 13b83a3ea2f7c03fdd307eb746d784b41ee43da2 Mon Sep 17 00:00:00 2001 From: Lewis Russell Date: Mon, 15 Jan 2024 21:14:32 +0000 Subject: test: move format_{string,luav} to a separate module --- test/functional/api/vim_spec.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index fb10ed34e5..91f61b5053 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -34,7 +34,7 @@ local insert = helpers.insert local skip = helpers.skip local pcall_err = helpers.pcall_err -local format_string = helpers.format_string +local format_string = require('test.format_string').format_string local intchar2lua = helpers.intchar2lua local mergedicts_copy = helpers.mergedicts_copy local endswith = vim.endswith -- cgit From 437d35dbf7d9ff6f6e561377f5d23d7e4ac4d565 Mon Sep 17 00:00:00 2001 From: Luuk van Baal Date: Wed, 17 Jan 2024 13:31:07 +0100 Subject: fix(extmarks): do not remove invalid marks from decor upon deletion --- test/functional/api/extmark_spec.lua | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 54f4aaab03..19ad26fa86 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1712,6 +1712,10 @@ describe('API/extmarks', function() aaa bbb ccc |*2 | ]]) + -- decor is not removed twice + command('d3') + api.nvim_buf_del_extmark(0, ns, 1) + command('silent undo') -- mark is deleted with undo_restore == false set_extmark(ns, 1, 0, 0, { invalidate = true, undo_restore = false, sign_text = 'S1' }) set_extmark(ns, 2, 1, 0, { invalidate = true, undo_restore = false, sign_text = 'S2' }) -- cgit From 98a4ed0a110625e63950d85b26f3e4614393ea04 Mon Sep 17 00:00:00 2001 From: Raphael Date: Sat, 20 Jan 2024 08:08:44 +0800 Subject: feat(api): support getting abbreviations (#26868) --- test/functional/api/keymap_spec.lua | 51 +++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/keymap_spec.lua b/test/functional/api/keymap_spec.lua index 4f57f6d0bd..0decd710e9 100644 --- a/test/functional/api/keymap_spec.lua +++ b/test/functional/api/keymap_spec.lua @@ -460,6 +460,57 @@ describe('nvim_get_keymap', function() desc = 'map description', }, api.nvim_get_keymap('n')[1]) end) + + it('can get abbreviations', function() + command('inoreabbr foo bar') + command('cnoreabbr foo baz') + + local mapargs_i = { + abbr = 1, + buffer = 0, + expr = 0, + lhs = 'foo', + lhsraw = 'foo', + lnum = 0, + mode = 'i', + mode_bits = 0x10, + noremap = 1, + nowait = 0, + rhs = 'bar', + script = 0, + scriptversion = 1, + sid = 0, + silent = 0, + } + local mapargs_c = { + abbr = 1, + buffer = 1, + expr = 0, + lhs = 'foo', + lhsraw = 'foo', + lnum = 0, + mode = 'c', + mode_bits = 0x08, + noremap = 1, + nowait = 0, + rhs = 'baz', + script = 0, + scriptversion = 1, + sid = 0, + silent = 0, + } + + local curbuf = api.nvim_get_current_buf() + + eq({ mapargs_i }, api.nvim_get_keymap('ia')) + eq({}, api.nvim_buf_get_keymap(curbuf, 'ia')) + + eq({}, api.nvim_get_keymap('ca')) + eq({ mapargs_c }, api.nvim_buf_get_keymap(curbuf, 'ca')) + + eq({ mapargs_i }, api.nvim_get_keymap('!a')) + eq({ mapargs_c }, api.nvim_buf_get_keymap(curbuf, '!a')) + end) end) describe('nvim_set_keymap, nvim_del_keymap', function() -- cgit From 215244f74950d6099863fcf5e59213431f59d40f Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 22 Jan 2024 06:25:06 +0800 Subject: fix(extmarks): missing "spell" and "conceal" in details (#27116) --- test/functional/api/extmark_spec.lua | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 19ad26fa86..cb16f49e7c 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1639,6 +1639,40 @@ describe('API/extmarks', function() right_gravity = true, }, }, get_extmark_by_id(ns, marks[3], { details = true })) + set_extmark(ns, marks[4], 0, 0, { + end_col = 1, + conceal = 'a', + spell = true, + }) + eq({ + 0, + 0, + { + conceal = 'a', + end_col = 1, + end_right_gravity = false, + end_row = 0, + ns_id = 1, + right_gravity = true, + spell = true, + }, + }, get_extmark_by_id(ns, marks[4], { details = true })) + set_extmark(ns, marks[5], 0, 0, { + end_col = 1, + spell = false, + }) + eq({ + 0, + 0, + { + end_col = 1, + end_right_gravity = false, + end_row = 0, + ns_id = 1, + right_gravity = true, + spell = false, + }, + }, get_extmark_by_id(ns, marks[5], { details = true })) api.nvim_buf_clear_namespace(0, ns, 0, -1) -- legacy sign mark includes sign name command('sign define sign1 text=s1 texthl=Title linehl=LineNR numhl=Normal culhl=CursorLine') -- cgit From 6ea6b3fee27d51607ca4a5ace46dbc38a4481bcb Mon Sep 17 00:00:00 2001 From: Gregory Anders <8965202+gpanders@users.noreply.github.com> Date: Wed, 24 Jan 2024 16:36:25 -0600 Subject: feat(ui): add support for OSC 8 hyperlinks (#27109) Extmarks can contain URLs which can then be drawn in any supporting UI. In the TUI, for example, URLs are "drawn" by emitting the OSC 8 control sequence to the TTY. On terminals which support the OSC 8 sequence this will create clickable hyperlinks. URLs are treated as inline highlights in the decoration subsystem, so are included in the `DecorSignHighlight` structure. However, unlike other inline highlights they use allocated memory which must be freed, so they set the `ext` flag in `DecorInline` so that their lifetimes are managed along with other allocated memory like virtual text. The decoration subsystem then adds the URLs as a new highlight attribute. The highlight subsystem maintains a set of unique URLs to avoid duplicating allocations for the same string. To attach a URL to an existing highlight attribute we call `hl_add_url` which finds the URL in the set (allocating and adding it if it does not exist) and sets the `url` highlight attribute to the index of the URL in the set (using an index helps keep the size of the `HlAttrs` struct small). This has the potential to lead to an increase in highlight attributes if a URL is used over a range that contains many different highlight attributes, because now each existing attribute must be combined with the URL. In practice, however, URLs typically span a range containing a single highlight (e.g. link text in Markdown), so this is likely just a pathological edge case. When a new highlight attribute is defined with a URL it is copied to all attached UIs with the `hl_attr_define` UI event. The TUI manages its own set of URLs (just like the highlight subsystem) to minimize allocations. The TUI keeps track of which URL is "active" for the cell it is printing. If no URL is active and a cell containing a URL is printed, the opening OSC 8 sequence is emitted and that URL becomes the actively tracked URL. If the cursor is moved while in the middle of a URL span, we emit the terminating OSC sequence to prevent the hyperlink from spanning multiple lines. This does not support nested hyperlinks, but that is a rare (and, frankly, bizarre) use case. If a valid use case for nested hyperlinks ever presents itself we can address that issue then. --- test/functional/api/extmark_spec.lua | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index cb16f49e7c..0a286965f2 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1791,6 +1791,13 @@ describe('API/extmarks', function() feed('vj2ed') eq({}, get_extmark_by_id(ns, 4, {})) end) + + it('can set a URL', function() + set_extmark(ns, 1, 0, 0, { url = 'https://example.com', end_col = 3 }) + local extmarks = get_extmarks(ns, 0, -1, { details = true }) + eq(1, #extmarks) + eq('https://example.com', extmarks[1][4].url) + end) end) describe('Extmarks buffer api with many marks', function() -- cgit From 7367838359bfb5fadf72ea2aeea2f84efb34590e Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 27 Jan 2024 14:03:44 +0800 Subject: fix(api): limit depth of nvim_cmd (#27225) --- test/functional/api/vim_spec.lua | 50 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 91f61b5053..5cf48412a8 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -399,6 +399,19 @@ describe('API', function() ]], } end) + + it('errors properly when command too recursive', function() + exec_lua([[ + _G.success = false + vim.api.nvim_create_user_command('Test', function() + vim.api.nvim_exec2('Test', {}) + _G.success = true + end, {}) + ]]) + pcall_err(command, 'Test') + assert_alive() + eq(false, exec_lua('return _G.success')) + end) end) describe('nvim_command', function() @@ -4560,6 +4573,7 @@ describe('API', function() line6 ]] end) + it('works with count', function() insert [[ line1 @@ -4577,6 +4591,7 @@ describe('API', function() line6 ]] end) + it('works with register', function() insert [[ line1 @@ -4599,11 +4614,13 @@ describe('API', function() line6 ]] end) + it('works with bang', function() api.nvim_create_user_command('Foo', 'echo ""', { bang = true }) eq('!', api.nvim_cmd({ cmd = 'Foo', bang = true }, { output = true })) eq('', api.nvim_cmd({ cmd = 'Foo', bang = false }, { output = true })) end) + it('works with modifiers', function() -- with silent = true output is still captured eq( @@ -4659,6 +4676,7 @@ describe('API', function() feed(':call') eq('E471: Argument required', api.nvim_cmd({ cmd = 'messages' }, { output = true })) end) + it('works with magic.file', function() exec_lua([[ vim.api.nvim_create_user_command("Foo", function(opts) @@ -4673,6 +4691,7 @@ describe('API', function() ) ) end) + it('splits arguments correctly', function() exec([[ function! FooFunc(...) @@ -4695,6 +4714,7 @@ describe('API', function() ) ) end) + it('splits arguments correctly for Lua callback', function() api.nvim_exec_lua( [[ @@ -4721,6 +4741,7 @@ describe('API', function() ) ) end) + it('works with buffer names', function() command('edit foo.txt | edit bar.txt') api.nvim_cmd({ cmd = 'buffer', args = { 'foo.txt' } }, {}) @@ -4728,6 +4749,7 @@ describe('API', function() api.nvim_cmd({ cmd = 'buffer', args = { 'bar.txt' } }, {}) eq('bar.txt', fn.fnamemodify(api.nvim_buf_get_name(0), ':t')) end) + it('triggers CmdUndefined event if command is not found', function() api.nvim_exec_lua( [[ @@ -4742,13 +4764,16 @@ describe('API', function() ) eq('foo', api.nvim_cmd({ cmd = 'Foo' }, { output = true })) end) + it('errors if command is not implemented', function() eq('Command not implemented: winpos', pcall_err(api.nvim_cmd, { cmd = 'winpos' }, {})) end) + it('works with empty arguments list', function() api.nvim_cmd({ cmd = 'update' }, {}) api.nvim_cmd({ cmd = 'buffer', count = 0 }, {}) end) + it("doesn't suppress errors when used in keymapping", function() api.nvim_exec_lua( [[ @@ -4760,6 +4785,7 @@ describe('API', function() feed('[l') neq(nil, string.find(eval('v:errmsg'), 'E5108:')) end) + it('handles 0 range #19608', function() api.nvim_buf_set_lines(0, 0, -1, false, { 'aa' }) api.nvim_cmd({ cmd = 'delete', range = { 0 } }, {}) @@ -4767,12 +4793,14 @@ describe('API', function() eq({ 'aa' }, api.nvim_buf_get_lines(0, 0, 1, false)) assert_alive() end) + it('supports filename expansion', function() api.nvim_cmd({ cmd = 'argadd', args = { '%:p:h:t', '%:p:h:t' } }, {}) local arg = fn.expand('%:p:h:t') eq({ arg, arg }, fn.argv()) end) - it("'make' command works when argument count isn't 1 #19696", function() + + it(":make command works when argument count isn't 1 #19696", function() command('set makeprg=echo') command('set shellquote=') matches('^:!echo ', api.nvim_cmd({ cmd = 'make' }, { output = true })) @@ -4789,6 +4817,7 @@ describe('API', function() ) assert_alive() end) + it("doesn't display messages when output=true", function() local screen = Screen.new(40, 6) screen:attach() @@ -4817,31 +4846,37 @@ describe('API', function() ]], } end) + it('works with non-String args', function() eq('2', api.nvim_cmd({ cmd = 'echo', args = { 2 } }, { output = true })) eq('1', api.nvim_cmd({ cmd = 'echo', args = { true } }, { output = true })) end) + describe('first argument as count', function() it('works', function() command('vsplit | enew') api.nvim_cmd({ cmd = 'bdelete', args = { api.nvim_get_current_buf() } }, {}) eq(1, api.nvim_get_current_buf()) end) + it('works with :sleep using milliseconds', function() local start = uv.now() api.nvim_cmd({ cmd = 'sleep', args = { '100m' } }, {}) ok(uv.now() - start <= 300) end) end) + it(':call with unknown function does not crash #26289', function() eq( 'Vim:E117: Unknown function: UnknownFunc', pcall_err(api.nvim_cmd, { cmd = 'call', args = { 'UnknownFunc()' } }, {}) ) end) + it(':throw does not crash #24556', function() eq('42', pcall_err(api.nvim_cmd, { cmd = 'throw', args = { '42' } }, {})) end) + it('can use :return #24556', function() exec([[ func Foo() @@ -4854,5 +4889,18 @@ describe('API', function() eq('before', api.nvim_get_var('pos')) eq({ 1, 2, 3 }, api.nvim_get_var('result')) end) + + it('errors properly when command too recursive #27210', function() + exec_lua([[ + _G.success = false + vim.api.nvim_create_user_command('Test', function() + vim.api.nvim_cmd({ cmd = 'Test' }, {}) + _G.success = true + end, {}) + ]]) + pcall_err(command, 'Test') + assert_alive() + eq(false, exec_lua('return _G.success')) + end) end) end) -- cgit From cf140fb25b94c556396fe942a4af3e8db9effa37 Mon Sep 17 00:00:00 2001 From: Sean Dewar Date: Thu, 27 Jul 2023 01:38:23 +0100 Subject: vim-patch:9.1.0047: issues with temp curwin/buf while cmdwin is open Problem: Things that temporarily change/restore curwin/buf (e.g: win_execute, some autocmds) may break assumptions that curwin/buf is the cmdwin when "cmdwin_type != 0", causing issues. Solution: Expose the cmdwin's real win/buf and check that instead. Also try to ensure these variables are NULL if "cmdwin_type == 0", allowing them to be used directly in most cases without checking cmdwin_type. (Sean Dewar) Reset and save `cmdwin_old_curwin` in a similar fashion. Apply suitable changes for API functions and add Lua tests. https://github.com/vim/vim/commit/988f74311c26ea9917e84fbae608de226dba7e5f --- test/functional/api/window_spec.lua | 133 +++++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 3 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index 4e71e4ab85..aadf59eb5a 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -1,18 +1,20 @@ local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') -local clear, curbuf, curbuf_contents, curwin, eq, neq, ok, feed, insert, eval = +local clear, curbuf, curbuf_contents, curwin, eq, neq, matches, ok, feed, insert, eval = helpers.clear, helpers.api.nvim_get_current_buf, helpers.curbuf_contents, helpers.api.nvim_get_current_win, helpers.eq, helpers.neq, + helpers.matches, helpers.ok, helpers.feed, helpers.insert, helpers.eval local poke_eventloop = helpers.poke_eventloop local exec = helpers.exec +local exec_lua = helpers.exec_lua local fn = helpers.fn local request = helpers.request local NIL = vim.NIL @@ -51,7 +53,7 @@ describe('API/win', function() eq('Invalid window id: 23', pcall_err(api.nvim_win_set_buf, 23, api.nvim_get_current_buf())) end) - it('disallowed in cmdwin if win={old_}curwin or buf=curbuf', function() + it('disallowed in cmdwin if win=cmdwin_{old_cur}win or buf=cmdwin_buf', function() local new_buf = api.nvim_create_buf(true, true) local old_win = api.nvim_get_current_win() local new_win = api.nvim_open_win(new_buf, false, { @@ -74,6 +76,36 @@ describe('API/win', function() 'E11: Invalid in command-line window; executes, CTRL-C quits', pcall_err(api.nvim_win_set_buf, new_win, 0) ) + matches( + 'E11: Invalid in command%-line window; executes, CTRL%-C quits$', + pcall_err( + exec_lua, + [[ + local cmdwin_buf = vim.api.nvim_get_current_buf() + local new_win, new_buf = ... + vim.api.nvim_buf_call(new_buf, function() + vim.api.nvim_win_set_buf(new_win, cmdwin_buf) + end) + ]], + new_win, + new_buf + ) + ) + matches( + 'E11: Invalid in command%-line window; executes, CTRL%-C quits$', + pcall_err( + exec_lua, + [[ + local cmdwin_win = vim.api.nvim_get_current_win() + local new_win, new_buf = ... + vim.api.nvim_win_call(new_win, function() + vim.api.nvim_win_set_buf(cmdwin_win, new_buf) + end) + ]], + new_win, + new_buf + ) + ) local next_buf = api.nvim_create_buf(true, true) api.nvim_win_set_buf(new_win, next_buf) @@ -546,6 +578,7 @@ describe('API/win', function() it('in cmdline-window #9767', function() command('split') eq(2, #api.nvim_list_wins()) + local oldbuf = api.nvim_get_current_buf() local oldwin = api.nvim_get_current_win() local otherwin = api.nvim_open_win(0, false, { relative = 'editor', @@ -570,6 +603,46 @@ describe('API/win', function() api.nvim_win_close(0, true) eq(2, #api.nvim_list_wins()) eq('', fn.getcmdwintype()) + + -- Closing curwin in context of a different window shouldn't close cmdwin. + otherwin = api.nvim_open_win(0, false, { + relative = 'editor', + row = 10, + col = 10, + width = 10, + height = 10, + }) + feed('q:') + exec_lua( + [[ + vim.api.nvim_win_call(..., function() + vim.api.nvim_win_close(0, true) + end) + ]], + otherwin + ) + eq(false, api.nvim_win_is_valid(otherwin)) + eq(':', fn.getcmdwintype()) + -- Closing cmdwin in context of a non-previous window is still OK. + otherwin = api.nvim_open_win(oldbuf, false, { + relative = 'editor', + row = 10, + col = 10, + width = 10, + height = 10, + }) + exec_lua( + [[ + local otherwin, cmdwin = ... + vim.api.nvim_win_call(otherwin, function() + vim.api.nvim_win_close(cmdwin, true) + end) + ]], + otherwin, + api.nvim_get_current_win() + ) + eq('', fn.getcmdwintype()) + eq(true, api.nvim_win_is_valid(otherwin)) end) it('closing current (float) window of another tabpage #15313', function() @@ -646,6 +719,7 @@ describe('API/win', function() api.nvim_win_hide(0) eq('', fn.getcmdwintype()) + local old_buf = api.nvim_get_current_buf() local old_win = api.nvim_get_current_win() local other_win = api.nvim_open_win(0, false, { relative = 'win', @@ -663,6 +737,45 @@ describe('API/win', function() -- Can close other windows. api.nvim_win_hide(other_win) eq(false, api.nvim_win_is_valid(other_win)) + + -- Closing curwin in context of a different window shouldn't close cmdwin. + other_win = api.nvim_open_win(old_buf, false, { + relative = 'editor', + row = 10, + col = 10, + width = 10, + height = 10, + }) + exec_lua( + [[ + vim.api.nvim_win_call(..., function() + vim.api.nvim_win_hide(0) + end) + ]], + other_win + ) + eq(false, api.nvim_win_is_valid(other_win)) + eq(':', fn.getcmdwintype()) + -- Closing cmdwin in context of a non-previous window is still OK. + other_win = api.nvim_open_win(old_buf, false, { + relative = 'editor', + row = 10, + col = 10, + width = 10, + height = 10, + }) + exec_lua( + [[ + local otherwin, cmdwin = ... + vim.api.nvim_win_call(otherwin, function() + vim.api.nvim_win_hide(cmdwin) + end) + ]], + other_win, + api.nvim_get_current_win() + ) + eq('', fn.getcmdwintype()) + eq(true, api.nvim_win_is_valid(other_win)) end) end) @@ -1055,7 +1168,7 @@ describe('API/win', function() eq(1, fn.exists('g:fired')) end) - it('disallowed in cmdwin if enter=true or buf=curbuf', function() + it('disallowed in cmdwin if enter=true or buf=cmdwin_buf', function() local new_buf = api.nvim_create_buf(true, true) feed('q:') eq( @@ -1078,6 +1191,20 @@ describe('API/win', function() height = 5, }) ) + matches( + 'E11: Invalid in command%-line window; executes, CTRL%-C quits$', + pcall_err( + exec_lua, + [[ + local cmdwin_buf = vim.api.nvim_get_current_buf() + vim.api.nvim_buf_call(vim.api.nvim_create_buf(false, true), function() + vim.api.nvim_open_win(cmdwin_buf, false, { + relative='editor', row=5, col=5, width=5, height=5, + }) + end) + ]] + ) + ) eq( new_buf, -- cgit From b0e85010fe8128a73d6aeae1af3a308d3791140f Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Mon, 29 Jan 2024 08:32:24 +0800 Subject: test: more tests for nvim_tabpage_get_win (#27248) --- test/functional/api/tabpage_spec.lua | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua index 65b030fc60..f801c55de9 100644 --- a/test/functional/api/tabpage_spec.lua +++ b/test/functional/api/tabpage_spec.lua @@ -12,15 +12,19 @@ describe('api/tabpage', function() describe('list_wins and get_win', function() it('works', function() - helpers.command('tabnew') - helpers.command('vsplit') + command('tabnew') + command('vsplit') local tab1, tab2 = unpack(api.nvim_list_tabpages()) local win1, win2, win3 = unpack(api.nvim_list_wins()) eq({ win1 }, api.nvim_tabpage_list_wins(tab1)) + eq(win1, api.nvim_tabpage_get_win(tab1)) eq({ win2, win3 }, api.nvim_tabpage_list_wins(tab2)) eq(win2, api.nvim_tabpage_get_win(tab2)) api.nvim_set_current_win(win3) eq(win3, api.nvim_tabpage_get_win(tab2)) + command('tabprev') + eq(win1, api.nvim_tabpage_get_win(tab1)) + eq(win3, api.nvim_tabpage_get_win(tab2)) end) it('validates args', function() @@ -64,12 +68,12 @@ describe('api/tabpage', function() local tabs = api.nvim_list_tabpages() eq(1, api.nvim_tabpage_get_number(tabs[1])) - helpers.command('tabnew') + command('tabnew') local tab1, tab2 = unpack(api.nvim_list_tabpages()) eq(1, api.nvim_tabpage_get_number(tab1)) eq(2, api.nvim_tabpage_get_number(tab2)) - helpers.command('-tabmove') + command('-tabmove') eq(2, api.nvim_tabpage_get_number(tab1)) eq(1, api.nvim_tabpage_get_number(tab2)) end) @@ -77,11 +81,11 @@ describe('api/tabpage', function() describe('is_valid', function() it('works', function() - helpers.command('tabnew') + command('tabnew') local tab = api.nvim_list_tabpages()[2] api.nvim_set_current_tabpage(tab) ok(api.nvim_tabpage_is_valid(tab)) - helpers.command('tabclose') + command('tabclose') ok(not api.nvim_tabpage_is_valid(tab)) end) end) -- cgit From 15e77a56b711102fdc123e15b3f37d49bc0b1df1 Mon Sep 17 00:00:00 2001 From: Gregory Anders <8965202+gpanders@users.noreply.github.com> Date: Sun, 28 Jan 2024 21:13:58 -0600 Subject: feat(extmarks): subpriorities (relative to declaration order) (#27131) The "priority" field of extmarks can be used to set priorities of extmarks which dictates which highlight group a range will actually have when there are multiple extmarks applied. However, when multiple extmarks have the same priority, the only way to enforce an actual priority is through the order in which the extmarks are set. It is not always possible or desirable to set extmarks in a specific order, however, so we add a new "subpriority" field that explicitly enforces the ordering of extmarks that have the same priority. For now this will be used only to enforce priority of treesitter highlights. A single node in a treesitter tree may match multiple captures, in which case that node will have multiple extmarks set. The order in which captures are returned from the treesitter API is not _necessarily_ in the same order they are defined in a query file, so we use the new subpriority field to force that ordering. For now subpriorites are not documented and are not meant to be used by external code, and it only applies to ephemeral extmarks. We indicate the "private" nature of subpriorities by prefixing the field name with an "_". --- test/functional/api/extmark_spec.lua | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 0a286965f2..2acfbfc949 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1798,6 +1798,36 @@ describe('API/extmarks', function() eq(1, #extmarks) eq('https://example.com', extmarks[1][4].url) end) + + it('respects priority', function() + screen = Screen.new(15, 10) + screen:attach() + + set_extmark(ns, marks[1], 0, 0, { + hl_group = 'Comment', + end_col = 2, + priority = 20, + }) + + -- Extmark defined after first extmark but has lower priority, first extmark "wins" + set_extmark(ns, marks[2], 0, 0, { + hl_group = 'String', + end_col = 2, + priority = 10, + }) + + screen:expect { + grid = [[ + {1:12}34^5 | + {2:~ }|*8 + | + ]], + attr_ids = { + [1] = { foreground = Screen.colors.Blue1 }, + [2] = { foreground = Screen.colors.Blue1, bold = true }, + }, + } + end) end) describe('Extmarks buffer api with many marks', function() -- cgit From ca9f6f56949d66f0f6467fa64b215f861fe0a3bf Mon Sep 17 00:00:00 2001 From: Will Hopkins Date: Sun, 28 Jan 2024 23:18:33 -0800 Subject: feat(api): add nvim_tabpage_set_win (#27222) Allows setting the current window of a non-current tabpage without switching tabpages. --- test/functional/api/tabpage_spec.lua | 56 ++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/tabpage_spec.lua b/test/functional/api/tabpage_spec.lua index f801c55de9..36955c4ace 100644 --- a/test/functional/api/tabpage_spec.lua +++ b/test/functional/api/tabpage_spec.lua @@ -32,6 +32,62 @@ describe('api/tabpage', function() end) end) + describe('set_win', function() + it('works', function() + command('tabnew') + command('vsplit') + local tab1, tab2 = unpack(api.nvim_list_tabpages()) + local win1, win2, win3 = unpack(api.nvim_list_wins()) + eq({ win1 }, api.nvim_tabpage_list_wins(tab1)) + eq({ win2, win3 }, api.nvim_tabpage_list_wins(tab2)) + eq(win2, api.nvim_tabpage_get_win(tab2)) + api.nvim_tabpage_set_win(tab2, win3) + eq(win3, api.nvim_tabpage_get_win(tab2)) + end) + + it('works in non-current tabpages', function() + command('tabnew') + command('vsplit') + local tab1, tab2 = unpack(api.nvim_list_tabpages()) + local win1, win2, win3 = unpack(api.nvim_list_wins()) + eq({ win1 }, api.nvim_tabpage_list_wins(tab1)) + eq({ win2, win3 }, api.nvim_tabpage_list_wins(tab2)) + eq(win2, api.nvim_tabpage_get_win(tab2)) + eq(win2, api.nvim_get_current_win()) + + command('tabprev') + + eq(tab1, api.nvim_get_current_tabpage()) + + eq(win2, api.nvim_tabpage_get_win(tab2)) + api.nvim_tabpage_set_win(tab2, win3) + eq(win3, api.nvim_tabpage_get_win(tab2)) + + command('tabnext') + eq(win3, api.nvim_get_current_win()) + end) + + it('throws an error when the window does not belong to the tabpage', function() + command('tabnew') + command('vsplit') + local tab1, tab2 = unpack(api.nvim_list_tabpages()) + local win1, win2, win3 = unpack(api.nvim_list_wins()) + eq({ win1 }, api.nvim_tabpage_list_wins(tab1)) + eq({ win2, win3 }, api.nvim_tabpage_list_wins(tab2)) + eq(win2, api.nvim_get_current_win()) + + eq( + string.format('Window does not belong to tabpage %d', tab2), + pcall_err(api.nvim_tabpage_set_win, tab2, win1) + ) + + eq( + string.format('Window does not belong to tabpage %d', tab1), + pcall_err(api.nvim_tabpage_set_win, tab1, win3) + ) + end) + end) + describe('{get,set,del}_var', function() it('works', function() api.nvim_tabpage_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } }) -- cgit From 6bba4becedaea5a330c0c9d9427fb495e8092dac Mon Sep 17 00:00:00 2001 From: Will Hopkins Date: Wed, 31 Jan 2024 19:43:35 -0800 Subject: feat(api): make nvim_open_win support non-floating windows (#25550) Adds support to `nvim_open_win` and `nvim_win_set_config` for creating and manipulating split (non-floating) windows. --- test/functional/api/window_spec.lua | 579 ++++++++++++++++++++++++++++++++++++ 1 file changed, 579 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua index aadf59eb5a..097a546ef2 100644 --- a/test/functional/api/window_spec.lua +++ b/test/functional/api/window_spec.lua @@ -1232,6 +1232,437 @@ describe('API/win', function() ) eq(wins_before, api.nvim_list_wins()) end) + + it('creates a split window', function() + local win = api.nvim_open_win(0, true, { + vertical = false, + }) + eq('', api.nvim_win_get_config(win).relative) + end) + + it('creates split windows in the correct direction', function() + local initial_win = api.nvim_get_current_win() + local win = api.nvim_open_win(0, true, { + vertical = true, + }) + eq('', api.nvim_win_get_config(win).relative) + + local layout = fn.winlayout() + + eq({ + 'row', + { + { 'leaf', win }, + { 'leaf', initial_win }, + }, + }, layout) + end) + + it("respects the 'split' option", function() + local initial_win = api.nvim_get_current_win() + local win = api.nvim_open_win(0, true, { + split = 'below', + }) + eq('', api.nvim_win_get_config(win).relative) + + local layout = fn.winlayout() + + eq({ + 'col', + { + { 'leaf', initial_win }, + { 'leaf', win }, + }, + }, layout) + end) + + it( + "doesn't change tp_curwin when splitting window in non-current tab with enter=false", + function() + local tab1 = api.nvim_get_current_tabpage() + local tab1_win = api.nvim_get_current_win() + + helpers.command('tabnew') + local tab2 = api.nvim_get_current_tabpage() + local tab2_win = api.nvim_get_current_win() + + eq({ tab1_win, tab2_win }, api.nvim_list_wins()) + eq({ tab1, tab2 }, api.nvim_list_tabpages()) + + api.nvim_set_current_tabpage(tab1) + eq(tab1_win, api.nvim_get_current_win()) + + local tab2_prevwin = fn.tabpagewinnr(tab2, '#') + + -- split in tab2 whine in tab2, with enter = false + local tab2_win2 = api.nvim_open_win(api.nvim_create_buf(false, true), false, { + win = tab2_win, + split = 'right', + }) + eq(tab1_win, api.nvim_get_current_win()) -- we should still be in the first tp + eq(tab1_win, api.nvim_tabpage_get_win(tab1)) + + eq(tab2_win, api.nvim_tabpage_get_win(tab2)) -- tab2's tp_curwin should not have changed + eq(tab2_prevwin, fn.tabpagewinnr(tab2, '#')) -- tab2's tp_prevwin should not have changed + eq({ tab1_win, tab2_win, tab2_win2 }, api.nvim_list_wins()) + eq({ tab2_win, tab2_win2 }, api.nvim_tabpage_list_wins(tab2)) + end + ) + + it('creates splits in the correct location', function() + local first_win = api.nvim_get_current_win() + -- specifying window 0 should create a split next to the current window + local win = api.nvim_open_win(0, true, { + vertical = false, + }) + local layout = fn.winlayout() + eq({ + 'col', + { + { 'leaf', win }, + { 'leaf', first_win }, + }, + }, layout) + -- not specifying a window should create a top-level split + local win2 = api.nvim_open_win(0, true, { + split = 'left', + win = -1, + }) + layout = fn.winlayout() + eq({ + 'row', + { + { 'leaf', win2 }, + { + 'col', + { + { 'leaf', win }, + { 'leaf', first_win }, + }, + }, + }, + }, layout) + + -- specifying a window should create a split next to that window + local win3 = api.nvim_open_win(0, true, { + win = win, + vertical = false, + }) + layout = fn.winlayout() + eq({ + 'row', + { + { 'leaf', win2 }, + { + 'col', + { + { 'leaf', win3 }, + { 'leaf', win }, + { 'leaf', first_win }, + }, + }, + }, + }, layout) + end) + end) + + describe('set_config', function() + it('moves a split into a float', function() + local win = api.nvim_open_win(0, true, { + vertical = false, + }) + eq('', api.nvim_win_get_config(win).relative) + api.nvim_win_set_config(win, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + }) + eq('editor', api.nvim_win_get_config(win).relative) + end) + + it('throws error when attempting to move the last window', function() + local err = pcall_err(api.nvim_win_set_config, 0, { + vertical = false, + }) + eq('Cannot move last window', err) + end) + + it('passing retval of get_config results in no-op', function() + -- simple split layout + local win = api.nvim_open_win(0, true, { + split = 'left', + }) + local layout = fn.winlayout() + local config = api.nvim_win_get_config(win) + api.nvim_win_set_config(win, config) + eq(layout, fn.winlayout()) + + -- nested split layout + local win2 = api.nvim_open_win(0, true, { + vertical = true, + }) + local win3 = api.nvim_open_win(0, true, { + win = win2, + vertical = false, + }) + layout = fn.winlayout() + config = api.nvim_win_get_config(win2) + api.nvim_win_set_config(win2, config) + eq(layout, fn.winlayout()) + + config = api.nvim_win_get_config(win3) + api.nvim_win_set_config(win3, config) + eq(layout, fn.winlayout()) + end) + + it('moves a float into a split', function() + local layout = fn.winlayout() + eq('leaf', layout[1]) + local win = api.nvim_open_win(0, true, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + }) + api.nvim_win_set_config(win, { + split = 'below', + win = -1, + }) + eq('', api.nvim_win_get_config(win).relative) + layout = fn.winlayout() + eq('col', layout[1]) + eq(2, #layout[2]) + eq(win, layout[2][2][2]) + end) + + it('respects the "split" option', function() + local layout = fn.winlayout() + eq('leaf', layout[1]) + local first_win = layout[2] + local win = api.nvim_open_win(0, true, { + relative = 'editor', + row = 5, + col = 5, + width = 5, + height = 5, + }) + api.nvim_win_set_config(win, { + split = 'right', + win = first_win, + }) + layout = fn.winlayout() + eq('row', layout[1]) + eq(2, #layout[2]) + eq(win, layout[2][2][2]) + local config = api.nvim_win_get_config(win) + eq('', config.relative) + eq('right', config.split) + api.nvim_win_set_config(win, { + split = 'below', + win = first_win, + }) + layout = fn.winlayout() + eq('col', layout[1]) + eq(2, #layout[2]) + eq(win, layout[2][2][2]) + config = api.nvim_win_get_config(win) + eq('', config.relative) + eq('below', config.split) + end) + + it('creates top-level splits', function() + local win = api.nvim_open_win(0, true, { + vertical = false, + }) + local win2 = api.nvim_open_win(0, true, { + vertical = true, + win = -1, + }) + local layout = fn.winlayout() + eq('row', layout[1]) + eq(2, #layout[2]) + eq(win2, layout[2][1][2]) + api.nvim_win_set_config(win, { + split = 'below', + win = -1, + }) + layout = fn.winlayout() + eq('col', layout[1]) + eq(2, #layout[2]) + eq('row', layout[2][1][1]) + eq(win, layout[2][2][2]) + end) + + it('moves splits to other tabpages', function() + local curtab = api.nvim_get_current_tabpage() + local win = api.nvim_open_win(0, false, { split = 'left' }) + command('tabnew') + local tabnr = api.nvim_get_current_tabpage() + command('tabprev') -- return to the initial tab + + api.nvim_win_set_config(win, { + split = 'right', + win = api.nvim_tabpage_get_win(tabnr), + }) + + eq(tabnr, api.nvim_win_get_tabpage(win)) + -- we are changing the config, the current tabpage should not change + eq(curtab, api.nvim_get_current_tabpage()) + + command('tabnext') -- switch to the new tabpage so we can get the layout + local layout = fn.winlayout() + + eq({ + 'row', + { + { 'leaf', api.nvim_tabpage_get_win(tabnr) }, + { 'leaf', win }, + }, + }, layout) + end) + + it('correctly moves curwin when moving curwin to a different tabpage', function() + local curtab = api.nvim_get_current_tabpage() + command('tabnew') + local tab2 = api.nvim_get_current_tabpage() + local tab2_win = api.nvim_get_current_win() + + command('tabprev') -- return to the initial tab + + local neighbor = api.nvim_get_current_win() + + -- create and enter a new split + local win = api.nvim_open_win(0, true, { + vertical = false, + }) + + eq(curtab, api.nvim_win_get_tabpage(win)) + + eq({ win, neighbor }, api.nvim_tabpage_list_wins(curtab)) + + -- move the current win to a different tabpage + api.nvim_win_set_config(win, { + split = 'right', + win = api.nvim_tabpage_get_win(tab2), + }) + + eq(curtab, api.nvim_get_current_tabpage()) + + -- win should have moved to tab2 + eq(tab2, api.nvim_win_get_tabpage(win)) + -- tp_curwin of tab2 should not have changed + eq(tab2_win, api.nvim_tabpage_get_win(tab2)) + -- win lists should be correct + eq({ tab2_win, win }, api.nvim_tabpage_list_wins(tab2)) + eq({ neighbor }, api.nvim_tabpage_list_wins(curtab)) + + -- current win should have moved to neighboring win + eq(neighbor, api.nvim_tabpage_get_win(curtab)) + end) + + it('splits windows in non-current tabpage', function() + local curtab = api.nvim_get_current_tabpage() + command('tabnew') + local tabnr = api.nvim_get_current_tabpage() + command('tabprev') -- return to the initial tab + + local win = api.nvim_open_win(0, false, { + vertical = false, + win = api.nvim_tabpage_get_win(tabnr), + }) + + eq(tabnr, api.nvim_win_get_tabpage(win)) + -- since enter = false, the current tabpage should not change + eq(curtab, api.nvim_get_current_tabpage()) + end) + + it('moves the current split window', function() + local initial_win = api.nvim_get_current_win() + local win = api.nvim_open_win(0, true, { + vertical = true, + }) + local win2 = api.nvim_open_win(0, true, { + vertical = true, + }) + api.nvim_set_current_win(win) + eq({ + 'row', + { + { 'leaf', win2 }, + { 'leaf', win }, + { 'leaf', initial_win }, + }, + }, fn.winlayout()) + + api.nvim_win_set_config(0, { + vertical = false, + win = 0, + }) + eq(win, api.nvim_get_current_win()) + eq({ + 'col', + { + { 'leaf', win }, + { + 'row', + { + { 'leaf', win2 }, + { 'leaf', initial_win }, + }, + }, + }, + }, fn.winlayout()) + + api.nvim_set_current_win(win2) + local win3 = api.nvim_open_win(0, true, { + vertical = true, + }) + eq(win3, api.nvim_get_current_win()) + + eq({ + 'col', + { + { 'leaf', win }, + { + 'row', + { + { 'leaf', win3 }, + { 'leaf', win2 }, + { 'leaf', initial_win }, + }, + }, + }, + }, fn.winlayout()) + + api.nvim_win_set_config(0, { + vertical = false, + win = 0, + }) + + eq(win3, api.nvim_get_current_win()) + eq({ + 'col', + { + { 'leaf', win }, + { + 'row', + { + { + 'col', + { + { 'leaf', win3 }, + { 'leaf', win2 }, + }, + }, + { 'leaf', initial_win }, + }, + }, + }, + }, fn.winlayout()) + end) end) describe('get_config', function() @@ -1292,6 +1723,154 @@ describe('API/win', function() eq(title, cfg.title) eq(footer, cfg.footer) end) + + it('includes split for normal windows', function() + local win = api.nvim_open_win(0, true, { + vertical = true, + win = -1, + }) + eq('left', api.nvim_win_get_config(win).split) + api.nvim_win_set_config(win, { + vertical = false, + win = -1, + }) + eq('above', api.nvim_win_get_config(win).split) + api.nvim_win_set_config(win, { + split = 'below', + win = -1, + }) + eq('below', api.nvim_win_get_config(win).split) + end) + + it('includes split when splitting with ex commands', function() + local win = api.nvim_get_current_win() + eq('left', api.nvim_win_get_config(win).split) + + command('vsplit') + local win2 = api.nvim_get_current_win() + + -- initial window now be marked as right split + -- since it was split with a vertical split + -- and 'splitright' is false by default + eq('right', api.nvim_win_get_config(win).split) + eq('left', api.nvim_win_get_config(win2).split) + + api.nvim_set_option_value('splitbelow', true, { + scope = 'global', + }) + api.nvim_win_close(win, true) + command('split') + local win3 = api.nvim_get_current_win() + eq('below', api.nvim_win_get_config(win3).split) + end) + + it("includes the correct 'split' option in complex layouts", function() + local initial_win = api.nvim_get_current_win() + local win = api.nvim_open_win(0, false, { + split = 'right', + win = -1, + }) + + local win2 = api.nvim_open_win(0, false, { + split = 'below', + win = win, + }) + + api.nvim_win_set_config(win2, { + width = 50, + }) + + api.nvim_win_set_config(win, { + split = 'left', + win = -1, + }) + + local win3 = api.nvim_open_win(0, false, { + split = 'above', + win = -1, + }) + local float = api.nvim_open_win(0, false, { + relative = 'editor', + width = 40, + height = 20, + col = 20, + row = 10, + }) + api.nvim_win_set_config(float, { + split = 'right', + win = -1, + }) + + local layout = fn.winlayout() + + eq({ + 'row', + { + { + 'col', + { + { 'leaf', win3 }, + { + 'row', + { + { 'leaf', win }, + { 'leaf', initial_win }, + { 'leaf', win2 }, + }, + }, + }, + }, + { + 'leaf', + float, + }, + }, + }, layout) + + eq('above', api.nvim_win_get_config(win3).split) + eq('left', api.nvim_win_get_config(win).split) + eq('left', api.nvim_win_get_config(initial_win).split) + eq('right', api.nvim_win_get_config(win2).split) + eq('right', api.nvim_win_get_config(float).split) + end) + end) + + describe('set_config', function() + it('no crash with invalid title', function() + local win = api.nvim_open_win(0, true, { + width = 10, + height = 10, + relative = 'editor', + row = 10, + col = 10, + title = { { 'test' } }, + border = 'single', + }) + eq( + 'title/footer cannot be an empty array', + pcall_err(api.nvim_win_set_config, win, { title = {} }) + ) + command('redraw!') + assert_alive() + end) + + it('no crash with invalid footer', function() + local win = api.nvim_open_win(0, true, { + width = 10, + height = 10, + relative = 'editor', + row = 10, + col = 10, + footer = { { 'test' } }, + border = 'single', + }) + eq( + 'title/footer cannot be an empty array', + pcall_err(api.nvim_win_set_config, win, { footer = {} }) + ) + command('redraw!') + assert_alive() + end) end) describe('set_config', function() -- cgit From 6725565258930ba430cfb925fd1671596a8a4342 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Wed, 7 Feb 2024 12:11:22 +0800 Subject: fix(event-loop): process input before events (#27358) Problem: When nvim_input is followed immediately by non-fast events on RPC, both events and input are available after the polling done by the os_inchar() in state_enter(), but state_enter() then chooses to process events even if input is available, which is inconsistent with state_handle_k_event() that stops processing events once input is available. Solution: Also check for available input after the os_inchar() in state_enter(). --- test/functional/api/vim_spec.lua | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 5cf48412a8..4cd46f5e91 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -95,6 +95,14 @@ describe('API', function() assert_alive() end) + it('input is processed first when followed immediately by non-fast events', function() + api.nvim_set_current_line('ab') + async_meths.nvim_input('x') + async_meths.nvim_exec_lua('_G.res1 = vim.api.nvim_get_current_line()', {}) + async_meths.nvim_exec_lua('_G.res2 = vim.api.nvim_get_current_line()', {}) + eq({ 'b', 'b' }, exec_lua('return { _G.res1, _G.res2 }')) + end) + it('does not set CA_COMMAND_BUSY #7254', function() command('split') command('autocmd WinEnter * startinsert') -- cgit From b162adbb7ca4f980e938a4a06a49218a9ed496cf Mon Sep 17 00:00:00 2001 From: nikolightsaber <103886134+nikolightsaber@users.noreply.github.com> Date: Thu, 8 Feb 2024 11:59:31 +0100 Subject: feat(api): pass 0 to nvim_get_chan_info for current channel (#27321) Getting current channel info was kind of annoying via RPC. Two functions had to be called: 1. `nvim_get_api_info` which returns `[channel_id, meta_data]`. - This results in `channel_id = api.nvim_get_api_info()[0]`. - Here the meta_data is sent but never used. 2. Finally call `nvim_get_chan_info(channel_id)`. This commit reduces the need for `nvim_get_api_info` as passing 0 returns current channel info. --- test/functional/api/vim_spec.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 4cd46f5e91..15b05e4de7 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -2449,7 +2449,6 @@ describe('API', function() } it('returns {} for invalid channel', function() - eq({}, api.nvim_get_chan_info(0)) eq({}, api.nvim_get_chan_info(-1)) -- more preallocated numbers might be added, try something high eq({}, api.nvim_get_chan_info(10)) @@ -2457,6 +2456,8 @@ describe('API', function() it('stream=stdio channel', function() eq({ [1] = testinfo, [2] = stderr }, api.nvim_list_chans()) + -- 0 should return current channel + eq(testinfo, api.nvim_get_chan_info(0)) eq(testinfo, api.nvim_get_chan_info(1)) eq(stderr, api.nvim_get_chan_info(2)) @@ -2522,6 +2523,7 @@ describe('API', function() "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(info, eval('rpcrequest(3, "nvim_get_chan_info", 0)')) end) it('stream=job :terminal channel', function() -- cgit From 0185152802d4a84258a9a04c1d86a7e27d37d721 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Mon, 12 Feb 2024 05:50:39 -0800 Subject: refactor(tests): get channel id via nvim_get_chan_info #27441 Minor "best practices" nudge. --- test/functional/api/buffer_updates_spec.lua | 14 +++++++------- test/functional/api/server_notifications_spec.lua | 2 +- test/functional/api/server_requests_spec.lua | 14 +++++++------- 3 files changed, 15 insertions(+), 15 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/buffer_updates_spec.lua b/test/functional/api/buffer_updates_spec.lua index d68c60e54c..262ca40e28 100644 --- a/test/functional/api/buffer_updates_spec.lua +++ b/test/functional/api/buffer_updates_spec.lua @@ -482,7 +482,7 @@ describe('API: buffer events:', function() end) it('does not get confused if enabled/disabled many times', function() - local channel = api.nvim_get_api_info()[1] + local channel = api.nvim_get_chan_info(0).id local b, tick = editoriginal(false) -- Enable buffer events many times. @@ -564,7 +564,7 @@ describe('API: buffer events:', function() -- 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] + local channel1 = request(1, 'nvim_get_chan_info', 0).id eval('rpcnotify(' .. channel1 .. ', "Hello")') wantn(1, 'Hello', {}) @@ -576,14 +576,14 @@ describe('API: buffer events:', function() -- make sure there are no other pending nvim_buf_lines_event messages going to -- channel 1 - channel1 = request(1, 'nvim_get_api_info')[1] + channel1 = request(1, 'nvim_get_chan_info', 0).id 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 channel = api.nvim_get_api_info()[1] + local channel = api.nvim_get_chan_info(0).id command('diffthis') command('rightbelow vsplit') local b2, tick2 = open(true, { 'BBB', 'CCC' }) @@ -700,7 +700,7 @@ describe('API: buffer events:', function() it('detaches if the buffer is closed', function() local b, tick = editoriginal(true, { 'AAA' }) - local channel = api.nvim_get_api_info()[1] + local channel = api.nvim_get_chan_info(0).id -- Test that buffer events are working. command('normal! x') @@ -739,7 +739,7 @@ describe('API: buffer events:', function() it(':enew! does not detach hidden buffer', function() local b, tick = editoriginal(true, { 'AAA', 'BBB' }) - local channel = api.nvim_get_api_info()[1] + local channel = api.nvim_get_chan_info(0).id command('set undoreload=1 hidden') command('normal! x') @@ -753,7 +753,7 @@ describe('API: buffer events:', function() it('stays attached if the buffer is hidden', function() local b, tick = editoriginal(true, { 'AAA' }) - local channel = api.nvim_get_api_info()[1] + local channel = api.nvim_get_chan_info(0).id -- Test that buffer events are working. command('normal! x') diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua index f6058b14ee..d1608a951c 100644 --- a/test/functional/api/server_notifications_spec.lua +++ b/test/functional/api/server_notifications_spec.lua @@ -14,7 +14,7 @@ describe('notify', function() before_each(function() clear() - channel = api.nvim_get_api_info()[1] + channel = api.nvim_get_chan_info(0).id end) after_each(function() diff --git a/test/functional/api/server_requests_spec.lua b/test/functional/api/server_requests_spec.lua index 5e508e7513..298dbac217 100644 --- a/test/functional/api/server_requests_spec.lua +++ b/test/functional/api/server_requests_spec.lua @@ -18,18 +18,18 @@ describe('server -> client', function() before_each(function() clear() - cid = api.nvim_get_api_info()[1] + cid = api.nvim_get_chan_info(0).id end) it('handles unexpected closed stream while preparing RPC response', function() source([[ let g:_nvim_args = [v:progpath, '--embed', '--headless', '-n', '-u', 'NONE', '-i', 'NONE', ] let ch1 = jobstart(g:_nvim_args, {'rpc': v:true}) - let child1_ch = rpcrequest(ch1, "nvim_get_api_info")[0] + let child1_ch = rpcrequest(ch1, "nvim_get_chan_info", 0).id call rpcnotify(ch1, 'nvim_eval', 'rpcrequest('.child1_ch.', "nvim_get_api_info")') let ch2 = jobstart(g:_nvim_args, {'rpc': v:true}) - let child2_ch = rpcrequest(ch2, "nvim_get_api_info")[0] + let child2_ch = rpcrequest(ch2, "nvim_get_chan_info", 0).id call rpcnotify(ch2, 'nvim_eval', 'rpcrequest('.child2_ch.', "nvim_get_api_info")') call jobstop(ch1) @@ -231,7 +231,7 @@ describe('server -> client', function() describe('jobstart()', function() local jobid before_each(function() - local channel = api.nvim_get_api_info()[1] + local channel = api.nvim_get_chan_info(0).id api.nvim_set_var('channel', channel) source([[ function! s:OnEvent(id, data, event) @@ -292,7 +292,7 @@ describe('server -> client', function() ok(id > 0) fn.rpcrequest(id, 'nvim_set_current_line', 'hello') - local client_id = fn.rpcrequest(id, 'nvim_get_api_info')[1] + local client_id = fn.rpcrequest(id, 'nvim_get_chan_info', 0).id set_session(server) eq(serverpid, fn.getpid()) @@ -300,7 +300,7 @@ describe('server -> client', function() -- method calls work both ways fn.rpcrequest(client_id, 'nvim_set_current_line', 'howdy!') - eq(id, fn.rpcrequest(client_id, 'nvim_get_api_info')[1]) + eq(id, fn.rpcrequest(client_id, 'nvim_get_chan_info', 0).id) set_session(client) eq(clientpid, fn.getpid()) @@ -378,7 +378,7 @@ describe('server -> client', function() eq('hello', api.nvim_get_current_line()) eq(serverpid, fn.rpcrequest(id, 'nvim_eval', 'getpid()')) - eq(id, fn.rpcrequest(id, 'nvim_get_api_info')[1]) + eq(id, fn.rpcrequest(id, 'nvim_get_chan_info', 0).id) end) end) end) -- cgit From 5fd1bac65ed07310eda5fd976b651cc493002849 Mon Sep 17 00:00:00 2001 From: luukvbaal Date: Sat, 17 Feb 2024 00:44:31 +0100 Subject: fix(api): don't use stl 'fillchar' for "use_statuscol_lnum" (#27501) Problem: nvim_eval_statusline() uses "stl" from 'fillchars' with "use_statuscol_lnum". Solution: Reorder "fillchar" else chain. --- test/functional/api/vim_spec.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 15b05e4de7..3d2fa7cd1f 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -3806,7 +3806,8 @@ describe('API', function() it('works with statuscolumn', function() exec([[ let &stc='%C%s%=%l ' - set cul nu nuw=3 scl=yes:2 fdc=2 + " should not use "stl" from 'fillchars' + set cul nu nuw=3 scl=yes:2 fdc=2 fillchars=stl:# call setline(1, repeat(['aaaaa'], 5)) let g:ns = nvim_create_namespace('') call sign_define('a', {'text':'aa', 'texthl':'IncSearch', 'numhl':'Normal'}) -- cgit From 848fc8ede84b9cfc4e651e0e3b449060a8a8d70c Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Sat, 17 Feb 2024 08:45:35 +0800 Subject: test: more tests for nvim_eval_statusline "fillchar" (#27502) --- test/functional/api/vim_spec.lua | 71 +++++++++++++++++++++++++++++++--------- 1 file changed, 55 insertions(+), 16 deletions(-) (limited to 'test/functional/api') diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua index 3d2fa7cd1f..9a4a457637 100644 --- a/test/functional/api/vim_spec.lua +++ b/test/functional/api/vim_spec.lua @@ -3655,6 +3655,7 @@ describe('API', function() eq({ 2, 2, buf, mark[4] }, mark) end) end) + describe('nvim_eval_statusline', function() it('works', function() eq({ @@ -3662,57 +3663,89 @@ describe('API', function() width = 31, }, api.nvim_eval_statusline('%%StatusLineString%#WarningMsg#WithHighlights', {})) end) + it("doesn't exceed maxwidth", function() eq({ str = 'Should be trun>', width = 15, }, api.nvim_eval_statusline('Should be truncated%<', { maxwidth = 15 })) end) - it('supports ASCII fillchar', function() + + it('has correct default fillchar', function() + local oldwin = api.nvim_get_current_win() + command('set fillchars=stl:#,stlnc:$,wbr:%') + command('new') + eq({ str = 'a###b', width = 5 }, api.nvim_eval_statusline('a%=b', { maxwidth = 5 })) eq( - { str = 'a~~~b', width = 5 }, - api.nvim_eval_statusline('a%=b', { fillchar = '~', maxwidth = 5 }) + { str = 'a$$$b', width = 5 }, + api.nvim_eval_statusline('a%=b', { winid = oldwin, maxwidth = 5 }) ) - end) - it('supports single-width multibyte fillchar', function() eq( - { str = 'a━━━b', width = 5 }, - api.nvim_eval_statusline('a%=b', { fillchar = '━', maxwidth = 5 }) + { str = 'a%%%b', width = 5 }, + api.nvim_eval_statusline('a%=b', { use_winbar = true, maxwidth = 5 }) ) - end) - it('treats double-width fillchar as single-width', function() eq( - { str = 'a哦哦哦b', width = 5 }, - api.nvim_eval_statusline('a%=b', { fillchar = '哦', maxwidth = 5 }) + { str = 'a b', width = 5 }, + api.nvim_eval_statusline('a%=b', { use_tabline = true, maxwidth = 5 }) ) - end) - it('treats control character fillchar as single-width', function() eq( - { str = 'a\031\031\031b', width = 5 }, - api.nvim_eval_statusline('a%=b', { fillchar = '\031', maxwidth = 5 }) + { str = 'a b', width = 5 }, + api.nvim_eval_statusline('a%=b', { use_statuscol_lnum = 1, maxwidth = 5 }) ) end) + + for fc, desc in pairs({ + ['~'] = 'supports ASCII fillchar', + ['━'] = 'supports single-width multibyte fillchar', + ['c̳'] = 'supports single-width fillchar with composing', + ['哦'] = 'treats double-width fillchar as single-width', + ['\031'] = 'treats control character fillchar as single-width', + }) do + it(desc, function() + eq( + { str = 'a' .. fc:rep(3) .. 'b', width = 5 }, + api.nvim_eval_statusline('a%=b', { fillchar = fc, maxwidth = 5 }) + ) + eq( + { str = 'a' .. fc:rep(3) .. 'b', width = 5 }, + api.nvim_eval_statusline('a%=b', { fillchar = fc, use_winbar = true, maxwidth = 5 }) + ) + eq( + { str = 'a' .. fc:rep(3) .. 'b', width = 5 }, + api.nvim_eval_statusline('a%=b', { fillchar = fc, use_tabline = true, maxwidth = 5 }) + ) + eq( + { str = 'a' .. fc:rep(3) .. 'b', width = 5 }, + api.nvim_eval_statusline('a%=b', { fillchar = fc, use_statuscol_lnum = 1, maxwidth = 5 }) + ) + end) + end + it('rejects multiple-character fillchar', function() eq( "Invalid 'fillchar': expected single character", pcall_err(api.nvim_eval_statusline, '', { fillchar = 'aa' }) ) end) + it('rejects empty string fillchar', function() eq( "Invalid 'fillchar': expected single character", pcall_err(api.nvim_eval_statusline, '', { fillchar = '' }) ) end) + it('rejects non-string fillchar', function() eq( "Invalid 'fillchar': expected String, got Integer", pcall_err(api.nvim_eval_statusline, '', { fillchar = 1 }) ) end) + it('rejects invalid string', function() eq('E539: Illegal character <}>', pcall_err(api.nvim_eval_statusline, '%{%}', {})) end) + it('supports various items', function() eq({ str = '0', width = 1 }, api.nvim_eval_statusline('%l', { maxwidth = 5 })) command('set readonly') @@ -3727,6 +3760,7 @@ describe('API', function() screen:expect({ any = '123456' }) eq({ str = '<3456', width = 5 }, api.nvim_eval_statusline('%S', { maxwidth = 5 })) end) + describe('highlight parsing', function() it('works', function() eq( @@ -3744,6 +3778,7 @@ describe('API', function() ) ) end) + it('works with no highlight', function() eq({ str = 'TextWithNoHighlight', @@ -3753,9 +3788,9 @@ describe('API', function() }, }, api.nvim_eval_statusline('TextWithNoHighlight', { highlights = true })) end) + it('works with inactive statusline', function() command('split') - eq( { str = 'TextWithNoHighlightTextWithWarningHighlight', @@ -3771,6 +3806,7 @@ describe('API', function() ) ) end) + it('works with tabline', function() eq( { @@ -3787,6 +3823,7 @@ describe('API', function() ) ) end) + it('works with winbar', function() eq( { @@ -3803,6 +3840,7 @@ describe('API', function() ) ) end) + it('works with statuscolumn', function() exec([[ let &stc='%C%s%=%l ' @@ -3842,6 +3880,7 @@ describe('API', function() api.nvim_eval_statusline('%l%#ErrorMsg# ', { use_statuscol_lnum = 3, highlights = true }) ) end) + it('no memory leak with click functions', function() api.nvim_eval_statusline('%@ClickFunc@StatusLineStringWithClickFunc%T', {}) eq({ -- cgit