aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/README.md6
-rw-r--r--test/functional/api/buffer_spec.lua7
-rw-r--r--test/functional/api/extmark_spec.lua18
-rw-r--r--test/functional/api/server_notifications_spec.lua2
-rw-r--r--test/functional/api/vim_spec.lua27
-rw-r--r--test/functional/api/window_spec.lua10
-rw-r--r--test/functional/autocmd/modechanged_spec.lua31
-rw-r--r--test/functional/autocmd/recording_spec.lua52
-rw-r--r--test/functional/autocmd/searchwrapped_spec.lua53
-rw-r--r--test/functional/core/fileio_spec.lua9
-rw-r--r--test/functional/core/startup_spec.lua2
-rw-r--r--test/functional/editor/macro_spec.lua27
-rw-r--r--test/functional/ex_cmds/cd_spec.lua13
-rw-r--r--test/functional/fixtures/api_level_8.mpackbin0 -> 28544 bytes
-rw-r--r--test/functional/legacy/059_utf8_spell_checking_spec.lua1010
-rw-r--r--test/functional/legacy/autochdir_spec.lua38
-rw-r--r--test/functional/legacy/autocmd_option_spec.lua420
-rw-r--r--test/functional/legacy/fnamemodify_spec.lua2
-rw-r--r--test/functional/legacy/packadd_spec.lua3
-rw-r--r--test/functional/legacy/prompt_buffer_spec.lua87
-rw-r--r--test/functional/legacy/searchpos_spec.lua2
-rw-r--r--test/functional/lua/diagnostic_spec.lua446
-rw-r--r--test/functional/lua/uri_spec.lua6
-rw-r--r--test/functional/lua/vim_spec.lua112
-rw-r--r--test/functional/options/chars_spec.lua92
-rw-r--r--test/functional/plugin/health_spec.lua6
-rw-r--r--test/functional/plugin/lsp/incremental_sync_spec.lua443
-rw-r--r--test/functional/plugin/lsp_spec.lua10
-rw-r--r--test/functional/terminal/buffer_spec.lua38
-rw-r--r--test/functional/terminal/cursor_spec.lua704
-rw-r--r--test/functional/terminal/scrollback_spec.lua70
-rw-r--r--test/functional/terminal/tui_spec.lua74
-rw-r--r--test/functional/treesitter/parser_spec.lua49
-rw-r--r--test/functional/ui/cursor_spec.lua4
-rw-r--r--test/functional/ui/decorations_spec.lua63
-rw-r--r--test/functional/ui/diff_spec.lua26
-rw-r--r--test/functional/ui/fold_spec.lua112
-rw-r--r--test/functional/ui/highlight_spec.lua18
-rw-r--r--test/functional/ui/sign_spec.lua93
-rw-r--r--test/functional/vimscript/screenpos_spec.lua51
-rw-r--r--test/functional/vimscript/timer_spec.lua10
-rw-r--r--test/helpers.lua14
-rw-r--r--test/unit/os/shell_spec.lua1
-rw-r--r--test/unit/path_spec.lua14
44 files changed, 3005 insertions, 1270 deletions
diff --git a/test/README.md b/test/README.md
index 37aa54c157..c6e173ead2 100644
--- a/test/README.md
+++ b/test/README.md
@@ -116,7 +116,7 @@ Filtering Tests
### Filter by name
-Another filter method is by setting a pattern of test name to `TEST_FILTER`.
+Another filter method is by setting a pattern of test name to `TEST_FILTER` or `TEST_FILTER_OUT`.
``` lua
it('foo api',function()
@@ -131,6 +131,10 @@ To run only test with filter name:
TEST_FILTER='foo.*api' make functionaltest
+To run all tests except ones matching a filter:
+
+ TEST_FILTER_OUT='foo.*api' make functionaltest
+
### Filter by file
To run a *specific* unit test:
diff --git a/test/functional/api/buffer_spec.lua b/test/functional/api/buffer_spec.lua
index a0c97804b7..688f3abba5 100644
--- a/test/functional/api/buffer_spec.lua
+++ b/test/functional/api/buffer_spec.lua
@@ -629,6 +629,13 @@ describe('api/buf', function()
-- Doesn't change the global value
eq([[^\s*#\s*define]], nvim('get_option', 'define'))
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, curbuf('get_option', 'undolevels'))
+ end)
end)
describe('nvim_buf_get_name, nvim_buf_set_name', function()
diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua
index 50b4b85d2a..a8f538b951 100644
--- a/test/functional/api/extmark_spec.lua
+++ b/test/functional/api/extmark_spec.lua
@@ -104,10 +104,10 @@ describe('API/extmarks', function()
it("can end extranges past final newline using end_col = 0", function()
set_extmark(ns, marks[1], 0, 0, {
end_col = 0,
- end_line = 1
+ end_row = 1
})
eq("end_col value outside range",
- pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_line = 1 }))
+ pcall_err(set_extmark, ns, marks[2], 0, 0, { end_col = 1, end_row = 1 }))
end)
it('adds, updates and deletes marks', function()
@@ -420,7 +420,7 @@ describe('API/extmarks', function()
end)
it('marks move with open line', function()
- -- open_line in misc1.c
+ -- open_line in change.c
-- testing marks below are also moved
feed("yyP")
set_extmark(ns, marks[1], 0, 4)
@@ -489,7 +489,7 @@ describe('API/extmarks', function()
end)
it('marks move with line splits (using enter)', function()
- -- open_line in misc1.c
+ -- open_line in change.c
-- testing marks below are also moved
feed("yyP")
set_extmark(ns, marks[1], 0, 4)
@@ -500,7 +500,7 @@ describe('API/extmarks', function()
end)
it('marks at last line move on insert new line', function()
- -- open_line in misc1.c
+ -- open_line in change.c
set_extmark(ns, marks[1], 0, 4)
feed('0i<cr><esc>')
check_undo_redo(ns, marks[1], 0, 4, 1, 4)
@@ -1424,6 +1424,14 @@ describe('API/extmarks', function()
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
+ })
+ eq({ {1, 0, 0, { end_col = 0, end_row = 1 }} }, get_extmarks(ns, 0, -1, {details=true}))
+ end)
end)
describe('Extmarks buffer api with many marks', function()
diff --git a/test/functional/api/server_notifications_spec.lua b/test/functional/api/server_notifications_spec.lua
index 6367cc5caa..1c00f001ff 100644
--- a/test/functional/api/server_notifications_spec.lua
+++ b/test/functional/api/server_notifications_spec.lua
@@ -81,6 +81,8 @@ describe('notify', function()
if isCI() then
pending('hangs on CI #14083 #15251')
return
+ elseif helpers.skip_fragile(pending) then
+ return
end
if helpers.pending_win32(pending) then return end
local catchan = eval("jobstart(['cat'], {'rpc': v:true})")
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index 21de4925b5..d53208a915 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -949,6 +949,33 @@ describe('API', function()
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', {}))
+ 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'}))
+ 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'}))
+ end)
+ end)
+
describe('nvim_{get,set}_current_buf, nvim_list_bufs', function()
it('works', function()
eq(1, #nvim('list_bufs'))
diff --git a/test/functional/api/window_spec.lua b/test/functional/api/window_spec.lua
index 11755a9d97..4d2ffa316a 100644
--- a/test/functional/api/window_spec.lua
+++ b/test/functional/api/window_spec.lua
@@ -222,9 +222,9 @@ describe('API/win', function()
eq('', nvim('get_option', 'statusline'))
command("set modified")
command("enew") -- global-local: not preserved in new buffer
- eq("Failed to get value for option 'statusline'",
- pcall_err(curwin, 'get_option', 'statusline'))
- eq('', eval('&l:statusline')) -- confirm local value was not copied
+ -- confirm local value was not copied
+ eq('', curwin('get_option', 'statusline'))
+ eq('', eval('&l:statusline'))
end)
it('after switching windows #15390', function()
@@ -238,6 +238,10 @@ describe('API/win', function()
eq('window-status', window('get_option', win1, 'statusline'))
assert_alive()
end)
+
+ it('returns values for unset local options', function()
+ eq(-1, curwin('get_option', 'scrolloff'))
+ end)
end)
describe('get_position', function()
diff --git a/test/functional/autocmd/modechanged_spec.lua b/test/functional/autocmd/modechanged_spec.lua
new file mode 100644
index 0000000000..be5a291ac9
--- /dev/null
+++ b/test/functional/autocmd/modechanged_spec.lua
@@ -0,0 +1,31 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eval, eq = helpers.clear, helpers.eval, helpers.eq
+local feed, command = helpers.feed, helpers.command
+
+describe('ModeChanged', function()
+ before_each(function()
+ clear()
+ command('let g:count = 0')
+ command('au ModeChanged * let g:event = copy(v:event)')
+ command('au ModeChanged * let g:count += 1')
+ end)
+
+ it('picks up terminal mode changes', function()
+ command("term")
+ feed('i')
+ eq({
+ old_mode = 'nt',
+ new_mode = 't'
+ }, eval('g:event'))
+ feed('<c-\\><c-n>')
+ eq({
+ old_mode = 't',
+ new_mode = 'nt'
+ }, eval('g:event'))
+ eq(3, eval('g:count'))
+ command("bd!")
+
+ -- v:event is cleared after the autocommand is done
+ eq({}, eval('v:event'))
+ end)
+end)
diff --git a/test/functional/autocmd/recording_spec.lua b/test/functional/autocmd/recording_spec.lua
new file mode 100644
index 0000000000..81152758de
--- /dev/null
+++ b/test/functional/autocmd/recording_spec.lua
@@ -0,0 +1,52 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local eq = helpers.eq
+local eval = helpers.eval
+local source_vim = helpers.source
+
+describe('RecordingEnter', function()
+ before_each(clear)
+ it('works', function()
+ source_vim [[
+ let g:recorded = 0
+ autocmd RecordingEnter * let g:recorded += 1
+ execute "normal! qqyyq"
+ ]]
+ eq(1, eval('g:recorded'))
+ end)
+
+ it('gives a correct reg_recording()', function()
+ source_vim [[
+ let g:recording = ''
+ autocmd RecordingEnter * let g:recording = reg_recording()
+ execute "normal! qqyyq"
+ ]]
+ eq('q', eval('g:recording'))
+ end)
+end)
+
+describe('RecordingLeave', function()
+ before_each(clear)
+ it('works', function()
+ source_vim [[
+ let g:recorded = 0
+ autocmd RecordingLeave * let g:recorded += 1
+ execute "normal! qqyyq"
+ ]]
+ eq(1, eval('g:recorded'))
+ end)
+
+ it('gives the correct reg_recorded()', function()
+ source_vim [[
+ let g:recorded = 'a'
+ let g:recording = ''
+ autocmd RecordingLeave * let g:recording = reg_recording()
+ autocmd RecordingLeave * let g:recorded = reg_recorded()
+ execute "normal! qqyyq"
+ ]]
+ eq('q', eval 'g:recording')
+ eq('', eval 'g:recorded')
+ eq('q', eval 'reg_recorded()')
+ end)
+end)
diff --git a/test/functional/autocmd/searchwrapped_spec.lua b/test/functional/autocmd/searchwrapped_spec.lua
new file mode 100644
index 0000000000..46c2c99b3d
--- /dev/null
+++ b/test/functional/autocmd/searchwrapped_spec.lua
@@ -0,0 +1,53 @@
+local helpers = require('test.functional.helpers')(after_each)
+
+local clear = helpers.clear
+local command = helpers.command
+local curbufmeths = helpers.curbufmeths
+local eq = helpers.eq
+local eval = helpers.eval
+local feed = helpers.feed
+
+describe('autocmd SearchWrapped', function()
+ before_each(function()
+ clear()
+ command('set ignorecase')
+ command('let g:test = 0')
+ command('autocmd! SearchWrapped * let g:test += 1')
+ curbufmeths.set_lines(0, 1, false, {
+ 'The quick brown fox',
+ 'jumps over the lazy dog'})
+ end)
+
+ it('gets triggered when search wraps the end', function()
+ feed('/the<Return>')
+ eq(0, eval('g:test'))
+
+ feed('n')
+ eq(1, eval('g:test'))
+
+ feed('nn')
+ eq(2, eval('g:test'))
+ end)
+
+ it('gets triggered when search wraps in reverse order', function()
+ feed('/the<Return>')
+ eq(0, eval('g:test'))
+
+ feed('NN')
+ eq(1, eval('g:test'))
+
+ feed('NN')
+ eq(2, eval('g:test'))
+ end)
+
+ it('does not get triggered on failed searches', function()
+ feed('/blargh<Return>')
+ eq(0, eval('g:test'))
+
+ feed('NN')
+ eq(0, eval('g:test'))
+
+ feed('NN')
+ eq(0, eval('g:test'))
+ end)
+end)
diff --git a/test/functional/core/fileio_spec.lua b/test/functional/core/fileio_spec.lua
index f4c476560d..c68bc18eed 100644
--- a/test/functional/core/fileio_spec.lua
+++ b/test/functional/core/fileio_spec.lua
@@ -15,6 +15,7 @@ local read_file = helpers.read_file
local trim = helpers.trim
local currentdir = helpers.funcs.getcwd
local iswin = helpers.iswin
+local assert_alive = helpers.assert_alive
describe('fileio', function()
before_each(function()
@@ -26,6 +27,7 @@ describe('fileio', function()
os.remove('Xtest_startup_file1~')
os.remove('Xtest_startup_file2')
os.remove('Xtest_тест.md')
+ os.remove('Xtest-u8-int-max')
rmdir('Xtest_startup_swapdir')
rmdir('Xtest_backupdir')
end)
@@ -128,5 +130,12 @@ describe('fileio', function()
table.insert(text, '')
eq(text, funcs.readfile(fname, 'b'))
end)
+ it('read invalid u8 over INT_MAX doesn\'t segfault', function()
+ clear()
+ command('call writefile(0zFFFFFFFF, "Xtest-u8-int-max")')
+ -- This should not segfault
+ command('edit ++enc=utf32 Xtest-u8-int-max')
+ assert_alive()
+ end)
end)
diff --git a/test/functional/core/startup_spec.lua b/test/functional/core/startup_spec.lua
index d1dce0f8da..4220d68ee1 100644
--- a/test/functional/core/startup_spec.lua
+++ b/test/functional/core/startup_spec.lua
@@ -560,7 +560,7 @@ describe('user config init', function()
it('loads default lua config, but shows an error', function()
clear{ args_rm={'-u'}, env=xenv }
- feed('<cr>') -- TODO check this, test execution is blocked without it
+ feed('<cr>') -- confirm "Conflicting config ..." message
eq(1, eval('g:lua_rc'))
matches('^E5422: Conflicting configs', meths.exec('messages', true))
end)
diff --git a/test/functional/editor/macro_spec.lua b/test/functional/editor/macro_spec.lua
index 102d8fc723..c0c9256af2 100644
--- a/test/functional/editor/macro_spec.lua
+++ b/test/functional/editor/macro_spec.lua
@@ -6,6 +6,8 @@ local feed = helpers.feed
local clear = helpers.clear
local expect = helpers.expect
local command = helpers.command
+local insert = helpers.insert
+local curbufmeths = helpers.curbufmeths
describe('macros', function()
before_each(clear)
@@ -27,4 +29,29 @@ describe('macros', function()
expect('llllll')
eq(eval('@i'), 'lxxx')
end)
+
+ it('can be replayed with Q', function()
+ insert [[hello
+hello
+hello]]
+ feed [[gg]]
+
+ feed [[qqAFOO<esc>q]]
+ eq({'helloFOO', 'hello', 'hello'}, curbufmeths.get_lines(0, -1, false))
+
+ feed[[Q]]
+ eq({'helloFOOFOO', 'hello', 'hello'}, curbufmeths.get_lines(0, -1, false))
+
+ feed[[G3Q]]
+ eq({'helloFOOFOO', 'hello', 'helloFOOFOOFOO'}, curbufmeths.get_lines(0, -1, false))
+ end)
+end)
+
+describe('reg_recorded()', function()
+ before_each(clear)
+
+ it('returns the correct value', function()
+ feed [[qqyyq]]
+ eq('q', eval('reg_recorded()'))
+ end)
end)
diff --git a/test/functional/ex_cmds/cd_spec.lua b/test/functional/ex_cmds/cd_spec.lua
index 283fcf9672..f9cce0deb6 100644
--- a/test/functional/ex_cmds/cd_spec.lua
+++ b/test/functional/ex_cmds/cd_spec.lua
@@ -294,7 +294,16 @@ describe("getcwd()", function ()
command('set autochdir')
command('edit ' .. directories.global .. '/foo')
eq(curdir .. pathsep .. directories.global, cwd())
+ eq(curdir, wcwd())
+ call('mkdir', 'bar')
+ command('edit ' .. 'bar/foo')
+ eq(curdir .. pathsep .. directories.global .. pathsep .. 'bar', cwd())
+ eq(curdir, wcwd())
+ command('lcd ..')
+ eq(curdir .. pathsep .. directories.global, cwd())
+ eq(curdir .. pathsep .. directories.global, wcwd())
+ command('edit')
+ eq(curdir .. pathsep .. directories.global .. pathsep .. 'bar', cwd())
+ eq(curdir .. pathsep .. directories.global, wcwd())
end)
end)
-
-
diff --git a/test/functional/fixtures/api_level_8.mpack b/test/functional/fixtures/api_level_8.mpack
new file mode 100644
index 0000000000..0447fce3ed
--- /dev/null
+++ b/test/functional/fixtures/api_level_8.mpack
Binary files differ
diff --git a/test/functional/legacy/059_utf8_spell_checking_spec.lua b/test/functional/legacy/059_utf8_spell_checking_spec.lua
deleted file mode 100644
index 8630ac58ef..0000000000
--- a/test/functional/legacy/059_utf8_spell_checking_spec.lua
+++ /dev/null
@@ -1,1010 +0,0 @@
--- Tests for spell checking with 'encoding' set to "utf-8".
-
-local helpers = require('test.functional.helpers')(after_each)
-local feed, insert, source = helpers.feed, helpers.insert, helpers.source
-local clear, feed_command, expect = helpers.clear, helpers.feed_command, helpers.expect
-local write_file, call = helpers.write_file, helpers.call
-
-local function write_latin1(name, text)
- text = call('iconv', text, 'utf-8', 'latin-1')
- write_file(name, text)
-end
-
-describe("spell checking with 'encoding' set to utf-8", function()
- setup(function()
- clear()
- feed_command("syntax off")
- write_latin1('Xtest1.aff',[[
- SET ISO8859-1
- TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ
-
- FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
-
- SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞ¿
- SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
-
- MIDWORD '-
-
- KEP =
- RAR ?
- BAD !
-
- PFX I N 1
- PFX I 0 in .
-
- PFX O Y 1
- PFX O 0 out .
-
- SFX S Y 2
- SFX S 0 s [^s]
- SFX S 0 es s
-
- SFX N N 3
- SFX N 0 en [^n]
- SFX N 0 nen n
- SFX N 0 n .
-
- REP 3
- REP g ch
- REP ch g
- REP svp s.v.p.
-
- MAP 9
- MAP aàáâãäå
- MAP eèéêë
- MAP iìíîï
- MAP oòóôõö
- MAP uùúûü
- MAP nñ
- MAP cç
- MAP yÿý
- MAP sß
- ]])
- write_latin1('Xtest1.dic', [[
- 123456
- test/NO
- # comment
- wrong
- Comment
- OK
- uk
- put/ISO
- the end
- deol
- déôr
- ]])
- write_latin1('Xtest2.aff', [[
- SET ISO8859-1
-
- FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
-
- PFXPOSTPONE
-
- MIDWORD '-
-
- KEP =
- RAR ?
- BAD !
-
- PFX I N 1
- PFX I 0 in .
-
- PFX O Y 1
- PFX O 0 out [a-z]
-
- SFX S Y 2
- SFX S 0 s [^s]
- SFX S 0 es s
-
- SFX N N 3
- SFX N 0 en [^n]
- SFX N 0 nen n
- SFX N 0 n .
-
- REP 3
- REP g ch
- REP ch g
- REP svp s.v.p.
-
- MAP 9
- MAP aàáâãäå
- MAP eèéêë
- MAP iìíîï
- MAP oòóôõö
- MAP uùúûü
- MAP nñ
- MAP cç
- MAP yÿý
- MAP sß
- ]])
- write_latin1('Xtest3.aff', [[
- SET ISO8859-1
-
- COMPOUNDMIN 3
- COMPOUNDRULE m*
- NEEDCOMPOUND x
- ]])
- write_latin1('Xtest3.dic', [[
- 1234
- foo/m
- bar/mx
- mï/m
- la/mx
- ]])
- write_latin1('Xtest4.aff', [[
- SET ISO8859-1
-
- FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
-
- COMPOUNDRULE m+
- COMPOUNDRULE sm*e
- COMPOUNDRULE sm+
- COMPOUNDMIN 3
- COMPOUNDWORDMAX 3
- COMPOUNDFORBIDFLAG t
-
- COMPOUNDSYLMAX 5
- SYLLABLE aáeéiíoóöõuúüûy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui
-
- MAP 9
- MAP aàáâãäå
- MAP eèéêë
- MAP iìíîï
- MAP oòóôõö
- MAP uùúûü
- MAP nñ
- MAP cç
- MAP yÿý
- MAP sß
-
- NEEDAFFIX x
-
- PFXPOSTPONE
-
- MIDWORD '-
-
- SFX q N 1
- SFX q 0 -ok .
-
- SFX a Y 2
- SFX a 0 s .
- SFX a 0 ize/t .
-
- PFX p N 1
- PFX p 0 pre .
-
- PFX P N 1
- PFX P 0 nou .
- ]])
- write_latin1('Xtest4.dic', [[
- 1234
- word/mP
- util/am
- pro/xq
- tomato/m
- bork/mp
- start/s
- end/e
- ]])
- write_latin1('Xtest5.aff', [[
- SET ISO8859-1
-
- FLAG long
-
- NEEDAFFIX !!
-
- COMPOUNDRULE ssmm*ee
-
- NEEDCOMPOUND xx
- COMPOUNDPERMITFLAG pp
-
- SFX 13 Y 1
- SFX 13 0 bork .
-
- SFX a1 Y 1
- SFX a1 0 a1 .
-
- SFX aé Y 1
- SFX aé 0 aé .
-
- PFX zz Y 1
- PFX zz 0 pre/pp .
-
- PFX yy Y 1
- PFX yy 0 nou .
- ]])
- write_latin1('Xtest5.dic', [[
- 1234
- foo/a1aé!!
- bar/zz13ee
- start/ss
- end/eeyy
- middle/mmxx
- ]])
- write_latin1('Xtest6.aff', [[
- SET ISO8859-1
-
- FLAG caplong
-
- NEEDAFFIX A!
-
- COMPOUNDRULE sMm*Ee
-
- NEEDCOMPOUND Xx
-
- COMPOUNDPERMITFLAG p
-
- SFX N3 Y 1
- SFX N3 0 bork .
-
- SFX A1 Y 1
- SFX A1 0 a1 .
-
- SFX Aé Y 1
- SFX Aé 0 aé .
-
- PFX Zz Y 1
- PFX Zz 0 pre/p .
- ]])
- write_latin1('Xtest6.dic', [[
- 1234
- mee/A1AéA!
- bar/ZzN3Ee
- lead/s
- end/Ee
- middle/MmXx
- ]])
- write_latin1('Xtest7.aff', [[
- SET ISO8859-1
-
- FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
-
- FLAG num
-
- NEEDAFFIX 9999
-
- COMPOUNDRULE 2,77*123
-
- NEEDCOMPOUND 1
- COMPOUNDPERMITFLAG 432
-
- SFX 61003 Y 1
- SFX 61003 0 meat .
-
- SFX 391 Y 1
- SFX 391 0 a1 .
-
- SFX 111 Y 1
- SFX 111 0 aé .
-
- PFX 17 Y 1
- PFX 17 0 pre/432 .
- ]])
- write_latin1('Xtest7.dic', [[
- 1234
- mee/391,111,9999
- bar/17,61003,123
- lead/2
- tail/123
- middle/77,1
- ]])
- write_latin1('Xtest8.aff', [[
- SET ISO8859-1
-
- NOSPLITSUGS
- ]])
- write_latin1('Xtest8.dic', [[
- 1234
- foo
- bar
- faabar
- ]])
- write_latin1('Xtest9.aff', [[
- ]])
- write_latin1('Xtest9.dic', [[
- 1234
- foo
- bar
- ]])
- write_latin1('Xtest-sal.aff', [[
- SET ISO8859-1
- TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ
-
- FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ
- UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ
-
- MIDWORD '-
-
- KEP =
- RAR ?
- BAD !
-
- PFX I N 1
- PFX I 0 in .
-
- PFX O Y 1
- PFX O 0 out .
-
- SFX S Y 2
- SFX S 0 s [^s]
- SFX S 0 es s
-
- SFX N N 3
- SFX N 0 en [^n]
- SFX N 0 nen n
- SFX N 0 n .
-
- REP 3
- REP g ch
- REP ch g
- REP svp s.v.p.
-
- MAP 9
- MAP aàáâãäå
- MAP eèéêë
- MAP iìíîï
- MAP oòóôõö
- MAP uùúûü
- MAP nñ
- MAP cç
- MAP yÿý
- MAP sß
-
- SAL AH(AEIOUY)-^ *H
- SAL AR(AEIOUY)-^ *R
- SAL A(HR)^ *
- SAL A^ *
- SAL AH(AEIOUY)- H
- SAL AR(AEIOUY)- R
- SAL A(HR) _
- SAL À^ *
- SAL Å^ *
- SAL BB- _
- SAL B B
- SAL CQ- _
- SAL CIA X
- SAL CH X
- SAL C(EIY)- S
- SAL CK K
- SAL COUGH^ KF
- SAL CC< C
- SAL C K
- SAL DG(EIY) K
- SAL DD- _
- SAL D T
- SAL É< E
- SAL EH(AEIOUY)-^ *H
- SAL ER(AEIOUY)-^ *R
- SAL E(HR)^ *
- SAL ENOUGH^$ *NF
- SAL E^ *
- SAL EH(AEIOUY)- H
- SAL ER(AEIOUY)- R
- SAL E(HR) _
- SAL FF- _
- SAL F F
- SAL GN^ N
- SAL GN$ N
- SAL GNS$ NS
- SAL GNED$ N
- SAL GH(AEIOUY)- K
- SAL GH _
- SAL GG9 K
- SAL G K
- SAL H H
- SAL IH(AEIOUY)-^ *H
- SAL IR(AEIOUY)-^ *R
- SAL I(HR)^ *
- SAL I^ *
- SAL ING6 N
- SAL IH(AEIOUY)- H
- SAL IR(AEIOUY)- R
- SAL I(HR) _
- SAL J K
- SAL KN^ N
- SAL KK- _
- SAL K K
- SAL LAUGH^ LF
- SAL LL- _
- SAL L L
- SAL MB$ M
- SAL MM M
- SAL M M
- SAL NN- _
- SAL N N
- SAL OH(AEIOUY)-^ *H
- SAL OR(AEIOUY)-^ *R
- SAL O(HR)^ *
- SAL O^ *
- SAL OH(AEIOUY)- H
- SAL OR(AEIOUY)- R
- SAL O(HR) _
- SAL PH F
- SAL PN^ N
- SAL PP- _
- SAL P P
- SAL Q K
- SAL RH^ R
- SAL ROUGH^ RF
- SAL RR- _
- SAL R R
- SAL SCH(EOU)- SK
- SAL SC(IEY)- S
- SAL SH X
- SAL SI(AO)- X
- SAL SS- _
- SAL S S
- SAL TI(AO)- X
- SAL TH @
- SAL TCH-- _
- SAL TOUGH^ TF
- SAL TT- _
- SAL T T
- SAL UH(AEIOUY)-^ *H
- SAL UR(AEIOUY)-^ *R
- SAL U(HR)^ *
- SAL U^ *
- SAL UH(AEIOUY)- H
- SAL UR(AEIOUY)- R
- SAL U(HR) _
- SAL V^ W
- SAL V F
- SAL WR^ R
- SAL WH^ W
- SAL W(AEIOU)- W
- SAL X^ S
- SAL X KS
- SAL Y(AEIOU)- Y
- SAL ZZ- _
- SAL Z S
- ]])
- write_file('Xtest.utf-8.add', [[
- /regions=usgbnz
- elequint/2
- elekwint/3
- ]])
- end)
-
- teardown(function()
- os.remove('Xtest-sal.aff')
- os.remove('Xtest.aff')
- os.remove('Xtest.dic')
- os.remove('Xtest.utf-8.add')
- os.remove('Xtest.utf-8.add.spl')
- os.remove('Xtest.utf-8.spl')
- os.remove('Xtest.utf-8.sug')
- os.remove('Xtest1.aff')
- os.remove('Xtest1.dic')
- os.remove('Xtest2.aff')
- os.remove('Xtest3.aff')
- os.remove('Xtest3.dic')
- os.remove('Xtest4.aff')
- os.remove('Xtest4.dic')
- os.remove('Xtest5.aff')
- os.remove('Xtest5.dic')
- os.remove('Xtest6.aff')
- os.remove('Xtest6.dic')
- os.remove('Xtest7.aff')
- os.remove('Xtest7.dic')
- os.remove('Xtest8.aff')
- os.remove('Xtest8.dic')
- os.remove('Xtest9.aff')
- os.remove('Xtest9.dic')
- end)
-
- -- Function to test .aff/.dic with list of good and bad words. This was a
- -- Vim function in the original legacy test.
- local function test_one(aff, dic)
- -- Generate a .spl file from a .dic and .aff file.
- if helpers.iswin() then
- os.execute('copy /y Xtest'..aff..'.aff Xtest.aff')
- os.execute('copy /y Xtest'..dic..'.dic Xtest.dic')
- else
- os.execute('cp -f Xtest'..aff..'.aff Xtest.aff')
- os.execute('cp -f Xtest'..dic..'.dic Xtest.dic')
- end
- source([[
- set spellfile=
- function! SpellDumpNoShow()
- " spelling scores depend on what happens to be drawn on screen
- spelldump
- %yank
- quit
- endfunction
- $put =''
- $put ='test ]]..aff..'-'..dic..[['
- mkspell! Xtest Xtest
- " Use that spell file.
- set spl=Xtest.utf-8.spl spell
- " List all valid words.
- call SpellDumpNoShow()
- $put
- $put ='-------'
- " Find all bad words and suggestions for them.
- 1;/^]]..aff..[[good:
- normal 0f:]s
- let prevbad = ''
- while 1
- let [bad, a] = spellbadword()
- if bad == '' || bad == prevbad || bad == 'badend'
- break
- endif
- let prevbad = bad
- let lst = spellsuggest(bad, 3)
- normal mm
- $put =bad
- $put =string(lst)
- normal `m]s
- endwhile
- ]])
- end
-
- it('part 1-1', function()
- insert([[
- 1good: wrong OK puts. Test the end
- bad: inputs comment ok Ok. test déôl end the
- badend
-
- test2:
- elequint test elekwint test elekwent asdf
- ]])
- test_one(1, 1)
- feed_command([[$put =soundfold('goobledygoook')]])
- feed_command([[$put =soundfold('kóopërÿnôven')]])
- feed_command([[$put =soundfold('oeverloos gezwets edale')]])
- -- And now with SAL instead of SOFO items; test automatic reloading.
- if helpers.iswin() then
- os.execute('copy /y Xtest-sal.aff Xtest.aff')
- else
- os.execute('cp -f Xtest-sal.aff Xtest.aff')
- end
- feed_command('mkspell! Xtest Xtest')
- feed_command([[$put =soundfold('goobledygoook')]])
- feed_command([[$put =soundfold('kóopërÿnôven')]])
- feed_command([[$put =soundfold('oeverloos gezwets edale')]])
- -- Also use an addition file.
- feed_command('mkspell! Xtest.utf-8.add.spl Xtest.utf-8.add')
- feed_command('set spellfile=Xtest.utf-8.add')
- feed_command('/^test2:')
- feed(']s')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed_command('set spl=Xtest_us.utf-8.spl')
- feed_command('/^test2:')
- feed(']smm')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed('`m]s')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed_command('set spl=Xtest_gb.utf-8.spl')
- feed_command('/^test2:')
- feed(']smm')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed('`m]s')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed_command('set spl=Xtest_nz.utf-8.spl')
- feed_command('/^test2:')
- feed(']smm')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed('`m]s')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed_command('set spl=Xtest_ca.utf-8.spl')
- feed_command('/^test2:')
- feed(']smm')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed('`m]s')
- feed_command('let [str, a] = spellbadword()')
- feed_command('$put =str')
- feed_command('1,/^test 1-1/-1d')
- expect([[
- test 1-1
- # file: Xtest.utf-8.spl
- Comment
- deol
- déôr
- input
- OK
- output
- outputs
- outtest
- put
- puts
- test
- testen
- testn
- the end
- uk
- wrong
- -------
- bad
- ['put', 'uk', 'OK']
- inputs
- ['input', 'puts', 'outputs']
- comment
- ['Comment', 'outtest', 'the end']
- ok
- ['OK', 'uk', 'put']
- Ok
- ['OK', 'Uk', 'Put']
- test
- ['Test', 'testn', 'testen']
- déôl
- ['deol', 'déôr', 'test']
- end
- ['put', 'uk', 'test']
- the
- ['put', 'uk', 'test']
- gebletegek
- kepereneven
- everles gesvets etele
- kbltykk
- kprnfn
- *fls kswts tl
- elekwent
- elequint
- elekwint
- elekwint
- elekwent
- elequint
- elekwent
- elequint
- elekwint]])
- end)
-
- it('part 2-1', function()
- insert([[
- 2good: puts
- bad: inputs comment ok Ok end the. test déôl
- badend
- ]])
- -- Postponed prefixes.
- test_one(2, 1)
- feed_command('1,/^test 2-1/-1d')
- expect([=[
- test 2-1
- # file: Xtest.utf-8.spl
- Comment
- deol
- déôr
- OK
- put
- input
- output
- puts
- outputs
- test
- outtest
- testen
- testn
- the end
- uk
- wrong
- -------
- bad
- ['put', 'uk', 'OK']
- inputs
- ['input', 'puts', 'outputs']
- comment
- ['Comment']
- ok
- ['OK', 'uk', 'put']
- Ok
- ['OK', 'Uk', 'Put']
- end
- ['put', 'uk', 'deol']
- the
- ['put', 'uk', 'test']
- test
- ['Test', 'testn', 'testen']
- déôl
- ['deol', 'déôr', 'test']]=])
- end)
-
- it('part 3-3', function()
- insert([[
- Test rules for compounding.
-
- 3good: foo mï foobar foofoobar barfoo barbarfoo
- bad: bar la foomï barmï mïfoo mïbar mïmï lala mïla lamï foola labar
- badend
- ]])
- test_one(3, 3)
- feed_command('1,/^test 3-3/-1d')
- expect([=[
- test 3-3
- # file: Xtest.utf-8.spl
- foo
- mï
- -------
- bad
- ['foo', 'mï']
- bar
- ['barfoo', 'foobar', 'foo']
- la
- ['mï', 'foo']
- foomï
- ['foo mï', 'foo', 'foofoo']
- barmï
- ['barfoo', 'mï', 'barbar']
- mïfoo
- ['mï foo', 'foo', 'foofoo']
- mïbar
- ['foobar', 'barbar', 'mï']
- mïmï
- ['mï mï', 'mï']
- lala
- []
- mïla
- ['mï', 'mï mï']
- lamï
- ['mï', 'mï mï']
- foola
- ['foo', 'foobar', 'foofoo']
- labar
- ['barbar', 'foobar']]=])
- end)
-
- it('part 4-4', function()
- insert([[
- Tests for compounding.
-
- 4good: word util bork prebork start end wordutil wordutils pro-ok
- bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork
- tomato tomatotomato startend startword startwordword startwordend
- startwordwordend startwordwordwordend prebork preborkbork
- preborkborkbork
- nouword
- bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato
- endstart endend startstart wordend wordstart
- preborkprebork preborkpreborkbork
- startwordwordwordwordend borkpreborkpreborkbork
- utilsbork startnouword
- badend
- ]])
- test_one(4, 4)
- feed_command('1,/^test 4-4/-1d')
- expect([=[
- test 4-4
- # file: Xtest.utf-8.spl
- bork
- prebork
- end
- pro-ok
- start
- tomato
- util
- utilize
- utils
- word
- nouword
- -------
- bad
- ['end', 'bork', 'word']
- wordutilize
- ['word utilize', 'wordutils', 'wordutil']
- pro
- ['bork', 'word', 'end']
- borkborkborkborkborkbork
- ['bork borkborkborkborkbork', 'borkbork borkborkborkbork', 'borkborkbork borkborkbork']
- tomatotomatotomato
- ['tomato tomatotomato', 'tomatotomato tomato', 'tomato tomato tomato']
- endstart
- ['end start', 'start']
- endend
- ['end end', 'end']
- startstart
- ['start start']
- wordend
- ['word end', 'word', 'wordword']
- wordstart
- ['word start', 'bork start']
- preborkprebork
- ['prebork prebork', 'preborkbork', 'preborkborkbork']
- preborkpreborkbork
- ['prebork preborkbork', 'preborkborkbork', 'preborkborkborkbork']
- startwordwordwordwordend
- ['startwordwordwordword end', 'startwordwordwordword', 'start wordwordwordword end']
- borkpreborkpreborkbork
- ['bork preborkpreborkbork', 'bork prebork preborkbork', 'bork preborkprebork bork']
- utilsbork
- ['utilbork', 'utils bork', 'util bork']
- startnouword
- ['start nouword', 'startword', 'startborkword']]=])
- end)
-
- it('part 5-5', function()
- insert([[
- Test affix flags with two characters
-
- 5good: fooa1 fooaé bar prebar barbork prebarbork startprebar
- start end startend startmiddleend nouend
- bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart
- startprobar startnouend
- badend
- ]])
- test_one(5, 5)
- feed_command('1,/^test 5-5/-1d')
- expect([=[
- test 5-5
- # file: Xtest.utf-8.spl
- bar
- barbork
- end
- fooa1
- fooaé
- nouend
- prebar
- prebarbork
- start
- -------
- bad
- ['bar', 'end', 'fooa1']
- foo
- ['fooa1', 'fooaé', 'bar']
- fooa2
- ['fooa1', 'fooaé', 'bar']
- prabar
- ['prebar', 'bar', 'bar bar']
- probarbirk
- ['prebarbork']
- middle
- []
- startmiddle
- ['startmiddleend', 'startmiddlebar']
- middleend
- []
- endstart
- ['end start', 'start']
- startprobar
- ['startprebar', 'start prebar', 'startbar']
- startnouend
- ['start nouend', 'startend']]=])
- end)
-
- it('part 6-6', function()
- insert([[
- 6good: meea1 meeaé bar prebar barbork prebarbork leadprebar
- lead end leadend leadmiddleend
- bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead
- leadprobar
- badend
- ]])
- test_one(6, 6)
- feed_command('1,/^test 6-6/-1d')
- expect([=[
- test 6-6
- # file: Xtest.utf-8.spl
- bar
- barbork
- end
- lead
- meea1
- meeaé
- prebar
- prebarbork
- -------
- bad
- ['bar', 'end', 'lead']
- mee
- ['meea1', 'meeaé', 'bar']
- meea2
- ['meea1', 'meeaé', 'lead']
- prabar
- ['prebar', 'bar', 'leadbar']
- probarbirk
- ['prebarbork']
- middle
- []
- leadmiddle
- ['leadmiddleend', 'leadmiddlebar']
- middleend
- []
- endlead
- ['end lead', 'lead', 'end end']
- leadprobar
- ['leadprebar', 'lead prebar', 'leadbar']]=])
- end)
-
- it('part 7-7', function()
- insert([[
- 7good: meea1 meeaé bar prebar barmeat prebarmeat leadprebar
- lead tail leadtail leadmiddletail
- bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead
- leadprobar
- badend
- ]])
- -- Compound words.
- test_one(7, 7)
- -- Assert buffer contents.
- feed_command('1,/^test 7-7/-1d')
- expect([=[
- test 7-7
- # file: Xtest.utf-8.spl
- bar
- barmeat
- lead
- meea1
- meeaé
- prebar
- prebarmeat
- tail
- -------
- bad
- ['bar', 'lead', 'tail']
- mee
- ['meea1', 'meeaé', 'bar']
- meea2
- ['meea1', 'meeaé', 'lead']
- prabar
- ['prebar', 'bar', 'leadbar']
- probarmaat
- ['prebarmeat']
- middle
- []
- leadmiddle
- ['leadmiddlebar']
- middletail
- []
- taillead
- ['tail lead', 'tail']
- leadprobar
- ['leadprebar', 'lead prebar', 'leadbar']]=])
- end)
-
- it('part 8-8', function()
- insert([[
- 8good: foo bar faabar
- bad: foobar barfoo
- badend
- ]])
- -- NOSPLITSUGS
- test_one(8, 8)
- -- Assert buffer contents.
- feed_command('1,/^test 8-8/-1d')
- expect([=[
- test 8-8
- # file: Xtest.utf-8.spl
- bar
- faabar
- foo
- -------
- bad
- ['bar', 'foo']
- foobar
- ['faabar', 'foo bar', 'bar']
- barfoo
- ['bar foo', 'bar', 'foo']]=])
- end)
-
- it('part 9-9', function()
- insert([[
- 9good: 0b1011 0777 1234 0x01ff
- badend
- ]])
- -- NOSPLITSUGS
- test_one(9, 9)
- -- Assert buffer contents.
- feed_command('1,/^test 9-9/-1d')
- expect([=[
- test 9-9
- # file: Xtest.utf-8.spl
- bar
- foo
- -------]=])
- end)
-end)
diff --git a/test/functional/legacy/autochdir_spec.lua b/test/functional/legacy/autochdir_spec.lua
index 466e3ed830..37a94476a0 100644
--- a/test/functional/legacy/autochdir_spec.lua
+++ b/test/functional/legacy/autochdir_spec.lua
@@ -1,10 +1,11 @@
local lfs = require('lfs')
local helpers = require('test.functional.helpers')(after_each)
-local clear, eq = helpers.clear, helpers.eq
-local eval, command = helpers.eval, helpers.command
+local clear, eq, matches = helpers.clear, helpers.eq, helpers.matches
+local eval, command, call = helpers.eval, helpers.command, helpers.call
+local exec_capture = helpers.exec_capture
describe('autochdir behavior', function()
- local dir = 'Xtest-functional-legacy-autochdir'
+ local dir = 'Xtest_functional_legacy_autochdir'
before_each(function()
lfs.mkdir(dir)
@@ -23,4 +24,35 @@ describe('autochdir behavior', function()
eq('Xtest', eval("expand('%')"))
eq(dir, eval([[substitute(getcwd(), '.*[/\\]\(\k*\)', '\1', '')]]))
end)
+
+ it(':verbose pwd shows whether autochdir is used', function()
+ local subdir = 'Xautodir'
+ command('cd '..dir)
+ local cwd = eval('getcwd()')
+ command('edit global.txt')
+ matches('%[global%].*'..dir, exec_capture('verbose pwd'))
+ call('mkdir', subdir)
+ command('split '..subdir..'/local.txt')
+ command('lcd '..subdir)
+ matches('%[window%].*'..dir..'[/\\]'..subdir, exec_capture('verbose pwd'))
+ command('set autochdir')
+ command('wincmd w')
+ matches('%[autochdir%].*'..dir, exec_capture('verbose pwd'))
+ command('lcd '..cwd)
+ matches('%[window%].*'..dir, exec_capture('verbose pwd'))
+ command('tcd '..cwd)
+ matches('%[tabpage%].*'..dir, exec_capture('verbose pwd'))
+ command('cd '..cwd)
+ matches('%[global%].*'..dir, exec_capture('verbose pwd'))
+ command('edit')
+ matches('%[autochdir%].*'..dir, exec_capture('verbose pwd'))
+ command('wincmd w')
+ matches('%[autochdir%].*'..dir..'[/\\]'..subdir, exec_capture('verbose pwd'))
+ command('set noautochdir')
+ matches('%[autochdir%].*'..dir..'[/\\]'..subdir, exec_capture('verbose pwd'))
+ command('wincmd w')
+ matches('%[global%].*'..dir, exec_capture('verbose pwd'))
+ command('wincmd w')
+ matches('%[window%].*'..dir..'[/\\]'..subdir, exec_capture('verbose pwd'))
+ end)
end)
diff --git a/test/functional/legacy/autocmd_option_spec.lua b/test/functional/legacy/autocmd_option_spec.lua
index 1914818215..5e586d3a6a 100644
--- a/test/functional/legacy/autocmd_option_spec.lua
+++ b/test/functional/legacy/autocmd_option_spec.lua
@@ -1,6 +1,6 @@
local helpers = require('test.functional.helpers')(after_each)
local nvim = helpers.meths
-local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq
+local clear, eq, neq, eval = helpers.clear, helpers.eq, helpers.neq, helpers.eval
local curbuf, buf = helpers.curbuf, helpers.bufmeths
local curwin = helpers.curwin
local exec_capture = helpers.exec_capture
@@ -10,11 +10,14 @@ local function declare_hook_function()
source([[
fu! AutoCommand(match, bufnr, winnr)
let l:acc = {
- \ 'option' : a:match,
- \ 'oldval' : v:option_old,
- \ 'newval' : v:option_new,
- \ 'scope' : v:option_type,
- \ 'attr' : {
+ \ 'option' : a:match,
+ \ 'oldval' : v:option_old,
+ \ 'oldval_l' : v:option_oldlocal,
+ \ 'oldval_g' : v:option_oldglobal,
+ \ 'newval' : v:option_new,
+ \ 'scope' : v:option_type,
+ \ 'cmd' : v:option_command,
+ \ 'attr' : {
\ 'bufnr' : a:bufnr,
\ 'winnr' : a:winnr,
\ }
@@ -42,13 +45,16 @@ local function get_result()
return ret
end
-local function expected_table(option, oldval, newval, scope, attr)
+local function expected_table(option, oldval, oldval_l, oldval_g, newval, scope, cmd, attr)
return {
- option = option,
- oldval = tostring(oldval),
- newval = tostring(newval),
- scope = scope,
- attr = attr,
+ option = option,
+ oldval = tostring(oldval),
+ oldval_l = tostring(oldval_l),
+ oldval_g = tostring(oldval_g),
+ newval = tostring(newval),
+ scope = scope,
+ cmd = cmd,
+ attr = attr,
}
end
@@ -66,7 +72,7 @@ local function expected_combination(...)
end
for i, v in ipairs(args) do
- local attr = v[5]
+ local attr = v[8]
if not attr then
-- remove attr entries
ret[i].attr = nil
@@ -112,7 +118,7 @@ local function get_new_window_number()
end
describe('au OptionSet', function()
- describe('with any opton (*)', function()
+ describe('with any option (*)', function()
before_each(function()
clear()
@@ -123,44 +129,44 @@ describe('au OptionSet', function()
it('should be called in setting number option', function()
command('set nu')
- expected_combination({'number', 0, 1, 'global'})
+ expected_combination({'number', 0, 0, 0, 1, 'global', 'set'})
command('setlocal nonu')
- expected_combination({'number', 1, 0, 'local'})
+ expected_combination({'number', 1, 1, '', 0, 'local', 'setlocal'})
command('setglobal nonu')
- expected_combination({'number', 1, 0, 'global'})
+ expected_combination({'number', 1, '', 1, 0, 'global', 'setglobal'})
end)
it('should be called in setting autoindent option',function()
command('setlocal ai')
- expected_combination({'autoindent', 0, 1, 'local'})
+ expected_combination({'autoindent', 0, 0, '', 1, 'local', 'setlocal'})
command('setglobal ai')
- expected_combination({'autoindent', 0, 1, 'global'})
+ expected_combination({'autoindent', 0, '', 0, 1, 'global', 'setglobal'})
command('set noai')
- expected_combination({'autoindent', 1, 0, 'global'})
+ expected_combination({'autoindent', 1, 1, 1, 0, 'global', 'set'})
end)
it('should be called in inverting global autoindent option',function()
command('set ai!')
- expected_combination({'autoindent', 0, 1, 'global'})
+ expected_combination({'autoindent', 0, 0, 0, 1, 'global', 'set'})
end)
it('should be called in being unset local autoindent option',function()
command('setlocal ai')
- expected_combination({'autoindent', 0, 1, 'local'})
+ expected_combination({'autoindent', 0, 0, '', 1, 'local', 'setlocal'})
command('setlocal ai<')
- expected_combination({'autoindent', 1, 0, 'local'})
+ expected_combination({'autoindent', 1, 1, '', 0, 'local', 'setlocal'})
end)
it('should be called in setting global list and number option at the same time',function()
command('set list nu')
expected_combination(
- {'list', 0, 1, 'global'},
- {'number', 0, 1, 'global'}
+ {'list', 0, 0, 0, 1, 'global', 'set'},
+ {'number', 0, 0, 0, 1, 'global', 'set'}
)
end)
@@ -171,25 +177,27 @@ describe('au OptionSet', function()
it('should be called in setting local acd', function()
command('setlocal acd')
- expected_combination({'autochdir', 0, 1, 'local'})
+ expected_combination({'autochdir', 0, 0, '', 1, 'local', 'setlocal'})
end)
it('should be called in setting autoread', function()
command('set noar')
- expected_combination({'autoread', 1, 0, 'global'})
+ expected_combination({'autoread', 1, 1, 1, 0, 'global', 'set'})
command('setlocal ar')
- expected_combination({'autoread', 0, 1, 'local'})
+ expected_combination({'autoread', 0, 0, '', 1, 'local', 'setlocal'})
end)
it('should be called in inverting global autoread', function()
command('setglobal invar')
- expected_combination({'autoread', 1, 0, 'global'})
+ expected_combination({'autoread', 1, '', 1, 0, 'global', 'setglobal'})
end)
it('should be called in setting backspace option through :let', function()
+ local oldval = eval('&backspace')
+
command('let &bs=""')
- expected_combination({'backspace', 'indent,eol,start', '', 'global'})
+ expected_combination({'backspace', oldval, oldval, oldval, '', 'global', 'set'})
end)
describe('being set by setbufvar()', function()
@@ -200,7 +208,7 @@ describe('au OptionSet', function()
it('should trigger using correct option name', function()
command('call setbufvar(1, "&backup", 1)')
- expected_combination({'backup', 0, 1, 'local'})
+ expected_combination({'backup', 0, 0, '', 1, 'local', 'setlocal'})
end)
it('should trigger if the current buffer is different from the targetted buffer', function()
@@ -208,9 +216,339 @@ describe('au OptionSet', function()
local new_bufnr = buf.get_number(new_buffer)
command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
- expected_combination({'buftype', '', 'nofile', 'local', {bufnr = new_bufnr}})
+ expected_combination({'buftype', '', '', '', 'nofile', 'local', 'setlocal', {bufnr = new_bufnr}})
end)
end)
+
+ it('with string global option', function()
+ local oldval = eval('&backupext')
+
+ command('set backupext=foo')
+ expected_combination({'backupext', oldval, oldval, oldval, 'foo', 'global', 'set'})
+
+ command('set backupext&')
+ expected_combination({'backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set'})
+
+ command('setglobal backupext=bar')
+ expected_combination({'backupext', oldval, '', oldval, 'bar', 'global', 'setglobal'})
+
+ command('noa set backupext&')
+ -- As this is a global option this sets the global value even though :setlocal is used!
+ command('setlocal backupext=baz')
+ expected_combination({'backupext', oldval, oldval, '', 'baz', 'local', 'setlocal'})
+
+ command('noa setglobal backupext=ext_global')
+ command('noa setlocal backupext=ext_local') -- Sets the global(!) value
+ command('set backupext=foo')
+ expected_combination({
+ 'backupext', 'ext_local', 'ext_local', 'ext_local', 'foo', 'global', 'set'
+ })
+ end)
+
+ it('with string global-local (to buffer) option', function()
+ local oldval = eval('&tags')
+
+ command('set tags=tagpath')
+ expected_combination({'tags', oldval, oldval, oldval, 'tagpath', 'global', 'set'})
+
+ command('set tags&')
+ expected_combination({'tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set'})
+
+ command('setglobal tags=tagpath1')
+ expected_combination({'tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal'})
+
+ command('setlocal tags=tagpath2')
+ expected_combination({'tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal'})
+
+ -- Note: v:option_old is the old global value for global-local string options
+ -- but the old local value for all other kinds of options.
+ command('noa setglobal tags=tag_global')
+ command('noa setlocal tags=tag_local')
+ command('set tags=tagpath')
+ expected_combination({
+ 'tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set'
+ })
+
+ -- Note: v:option_old is the old global value for global-local string options
+ -- but the old local value for all other kinds of options.
+ command('noa set tags=tag_global')
+ command('noa setlocal tags=')
+ command('set tags=tagpath')
+ expected_combination({'tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set'})
+ end)
+
+ it('with string local (to buffer) option', function()
+ local oldval = eval('&spelllang')
+
+ command('set spelllang=elvish,klingon')
+ expected_combination({'spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set'})
+
+ command('set spelllang&')
+ expected_combination({
+ 'spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set'
+ })
+
+ command('setglobal spelllang=elvish')
+ expected_combination({'spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal'})
+
+ command('noa set spelllang&')
+ command('setlocal spelllang=klingon')
+ expected_combination({'spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal'})
+
+ -- Note: v:option_old is the old global value for global-local string options
+ -- but the old local value for all other kinds of options.
+ command('noa setglobal spelllang=spellglobal')
+ command('noa setlocal spelllang=spelllocal')
+ command('set spelllang=foo')
+ expected_combination({
+ 'spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set'
+ })
+ end)
+
+ it('with string global-local (to window) option', function()
+ local oldval = eval('&statusline')
+
+ command('set statusline=foo')
+ expected_combination({'statusline', oldval, oldval, '', 'foo', 'global', 'set'})
+
+ -- Note: v:option_old is the old global value for global-local string options
+ -- but the old local value for all other kinds of options.
+ command('set statusline&')
+ expected_combination({'statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set'})
+
+ command('setglobal statusline=bar')
+ expected_combination({'statusline', oldval, '', oldval, 'bar', 'global', 'setglobal'})
+
+ command('noa set statusline&')
+ command('setlocal statusline=baz')
+ expected_combination({'statusline', oldval, oldval, '', 'baz', 'local', 'setlocal'})
+
+ -- Note: v:option_old is the old global value for global-local string options
+ -- but the old local value for all other kinds of options.
+ command('noa setglobal statusline=bar')
+ command('noa setlocal statusline=baz')
+ command('set statusline=foo')
+ expected_combination({'statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set'})
+ end)
+
+ it('with string local (to window) option', function()
+ local oldval = eval('&foldignore')
+
+ command('set foldignore=fo')
+ expected_combination({'foldignore', oldval, oldval, oldval, 'fo', 'global', 'set'})
+
+ command('set foldignore&')
+ expected_combination({'foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set'})
+
+ command('setglobal foldignore=bar')
+ expected_combination({'foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal'})
+
+ command('noa set foldignore&')
+ command('setlocal foldignore=baz')
+ expected_combination({'foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal'})
+
+ command('noa setglobal foldignore=glob')
+ command('noa setlocal foldignore=loc')
+ command('set foldignore=fo')
+ expected_combination({'foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set'})
+ end)
+
+ it('with number global option', function()
+ command('noa setglobal cmdheight=8')
+ command('noa setlocal cmdheight=1') -- Sets the global(!) value
+ command('setglobal cmdheight=2')
+ expected_combination({'cmdheight', 1, '', 1, 2, 'global', 'setglobal'})
+
+ command('noa setglobal cmdheight=8')
+ command('noa setlocal cmdheight=1') -- Sets the global(!) value
+ command('setlocal cmdheight=2')
+ expected_combination({'cmdheight', 1, 1, '', 2, 'local', 'setlocal'})
+
+ command('noa setglobal cmdheight=8')
+ command('noa setlocal cmdheight=1') -- Sets the global(!) value
+ command('set cmdheight=2')
+ expected_combination({'cmdheight', 1, 1, 1, 2, 'global', 'set'})
+
+ command('noa set cmdheight=8')
+ command('set cmdheight=2')
+ expected_combination({'cmdheight', 8, 8, 8, 2, 'global', 'set'})
+ end)
+
+ it('with number global-local (to buffer) option', function()
+ command('noa setglobal undolevels=8')
+ command('noa setlocal undolevels=1')
+ command('setglobal undolevels=2')
+ expected_combination({'undolevels', 8, '', 8, 2, 'global', 'setglobal'})
+
+ command('noa setglobal undolevels=8')
+ command('noa setlocal undolevels=1')
+ command('setlocal undolevels=2')
+ expected_combination({'undolevels', 1, 1, '', 2, 'local', 'setlocal'})
+
+ command('noa setglobal undolevels=8')
+ command('noa setlocal undolevels=1')
+ command('set undolevels=2')
+ expected_combination({'undolevels', 1, 1, 8, 2, 'global', 'set'})
+
+ command('noa set undolevels=8')
+ command('set undolevels=2')
+ expected_combination({'undolevels', 8, 8, 8, 2, 'global', 'set'})
+ end)
+
+ it('with number local (to buffer) option', function()
+ command('noa setglobal wrapmargin=8')
+ command('noa setlocal wrapmargin=1')
+ command('setglobal wrapmargin=2')
+ expected_combination({'wrapmargin', 8, '', 8, 2, 'global', 'setglobal'})
+
+ command('noa setglobal wrapmargin=8')
+ command('noa setlocal wrapmargin=1')
+ command('setlocal wrapmargin=2')
+ expected_combination({'wrapmargin', 1, 1, '', 2, 'local', 'setlocal'})
+
+ command('noa setglobal wrapmargin=8')
+ command('noa setlocal wrapmargin=1')
+ command('set wrapmargin=2')
+ expected_combination({'wrapmargin', 1, 1, 8, 2, 'global', 'set'})
+
+ command('noa set wrapmargin=8')
+ command('set wrapmargin=2')
+ expected_combination({'wrapmargin', 8, 8, 8, 2, 'global', 'set'})
+ end)
+
+ it('with number global-local (to window) option', function()
+ command('noa setglobal scrolloff=8')
+ command('noa setlocal scrolloff=1')
+ command('setglobal scrolloff=2')
+ expected_combination({'scrolloff', 8, '', 8, 2, 'global', 'setglobal'})
+
+ command('noa setglobal scrolloff=8')
+ command('noa setlocal scrolloff=1')
+ command('setlocal scrolloff=2')
+ expected_combination({'scrolloff', 1, 1, '', 2, 'local', 'setlocal'})
+
+ command('noa setglobal scrolloff=8')
+ command('noa setlocal scrolloff=1')
+ command('set scrolloff=2')
+ expected_combination({'scrolloff', 1, 1, 8, 2, 'global', 'set'})
+
+ command('noa set scrolloff=8')
+ command('set scrolloff=2')
+ expected_combination({'scrolloff', 8, 8, 8, 2, 'global', 'set'})
+ end)
+
+ it('with number local (to window) option', function()
+ command('noa setglobal foldcolumn=8')
+ command('noa setlocal foldcolumn=1')
+ command('setglobal foldcolumn=2')
+ expected_combination({'foldcolumn', 8, '', 8, 2, 'global', 'setglobal'})
+
+ command('noa setglobal foldcolumn=8')
+ command('noa setlocal foldcolumn=1')
+ command('setlocal foldcolumn=2')
+ expected_combination({'foldcolumn', 1, 1, '', 2, 'local', 'setlocal'})
+
+ command('noa setglobal foldcolumn=8')
+ command('noa setlocal foldcolumn=1')
+ command('set foldcolumn=2')
+ expected_combination({'foldcolumn', 1, 1, 8, 2, 'global', 'set'})
+
+ command('noa set foldcolumn=8')
+ command('set foldcolumn=2')
+ expected_combination({'foldcolumn', 8, 8, 8, 2, 'global', 'set'})
+ end)
+
+ it('with boolean global option', function()
+ command('noa setglobal nowrapscan')
+ command('noa setlocal wrapscan') -- Sets the global(!) value
+ command('setglobal nowrapscan')
+ expected_combination({'wrapscan', 1, '', 1, 0, 'global', 'setglobal'})
+
+ command('noa setglobal nowrapscan')
+ command('noa setlocal wrapscan') -- Sets the global(!) value
+ command('setlocal nowrapscan')
+ expected_combination({'wrapscan', 1, 1, '', 0, 'local', 'setlocal'})
+
+ command('noa setglobal nowrapscan')
+ command('noa setlocal wrapscan') -- Sets the global(!) value
+ command('set nowrapscan')
+ expected_combination({'wrapscan', 1, 1, 1, 0, 'global', 'set'})
+
+ command('noa set nowrapscan')
+ command('set wrapscan')
+ expected_combination({'wrapscan', 0, 0, 0, 1, 'global', 'set'})
+ end)
+
+ it('with boolean global-local (to buffer) option', function()
+ command('noa setglobal noautoread')
+ command('noa setlocal autoread')
+ command('setglobal autoread')
+ expected_combination({'autoread', 0, '', 0, 1, 'global', 'setglobal'})
+
+ command('noa setglobal noautoread')
+ command('noa setlocal autoread')
+ command('setlocal noautoread')
+ expected_combination({'autoread', 1, 1, '', 0, 'local', 'setlocal'})
+
+ command('noa setglobal noautoread')
+ command('noa setlocal autoread')
+ command('set autoread')
+ expected_combination({'autoread', 1, 1, 0, 1, 'global', 'set'})
+
+ command('noa set noautoread')
+ command('set autoread')
+ expected_combination({'autoread', 0, 0, 0, 1, 'global', 'set'})
+ end)
+
+ it('with boolean local (to buffer) option', function()
+ command('noa setglobal nocindent')
+ command('noa setlocal cindent')
+ command('setglobal cindent')
+ expected_combination({'cindent', 0, '', 0, 1, 'global', 'setglobal'})
+
+ command('noa setglobal nocindent')
+ command('noa setlocal cindent')
+ command('setlocal nocindent')
+ expected_combination({'cindent', 1, 1, '', 0, 'local', 'setlocal'})
+
+ command('noa setglobal nocindent')
+ command('noa setlocal cindent')
+ command('set cindent')
+ expected_combination({'cindent', 1, 1, 0, 1, 'global', 'set'})
+
+ command('noa set nocindent')
+ command('set cindent')
+ expected_combination({'cindent', 0, 0, 0, 1, 'global', 'set'})
+ end)
+
+ it('with boolean local (to window) option', function()
+ command('noa setglobal nocursorcolumn')
+ command('noa setlocal cursorcolumn')
+ command('setglobal cursorcolumn')
+ expected_combination({'cursorcolumn', 0, '', 0, 1, 'global', 'setglobal'})
+
+ command('noa setglobal nocursorcolumn')
+ command('noa setlocal cursorcolumn')
+ command('setlocal nocursorcolumn')
+ expected_combination({'cursorcolumn', 1, 1, '', 0, 'local', 'setlocal'})
+
+ command('noa setglobal nocursorcolumn')
+ command('noa setlocal cursorcolumn')
+ command('set cursorcolumn')
+ expected_combination({'cursorcolumn', 1, 1, 0, 1, 'global', 'set'})
+
+ command('noa set nocursorcolumn')
+ command('set cursorcolumn')
+ expected_combination({'cursorcolumn', 0, 0, 0, 1, 'global', 'set'})
+ end)
+
+ it('with option value converted internally', function()
+ command('noa set backspace=1')
+ command('set backspace=2')
+ expected_combination(({
+ 'backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set'
+ }))
+ end)
end)
describe('with specific option', function()
@@ -228,13 +566,13 @@ describe('au OptionSet', function()
expected_empty()
command('setlocal ro')
- expected_combination({'readonly', 0, 1, 'local'})
+ expected_combination({'readonly', 0, 0, '', 1, 'local', 'setlocal'})
command('setglobal ro')
- expected_combination({'readonly', 0, 1, 'global'})
+ expected_combination({'readonly', 0, '', 0, 1, 'global', 'setglobal'})
command('set noro')
- expected_combination({'readonly', 1, 0, 'global'})
+ expected_combination({'readonly', 1, 1, 1, 0, 'global', 'set'})
end)
describe('being set by setbufvar()', function()
@@ -249,7 +587,7 @@ describe('au OptionSet', function()
set_hook('backup')
command('call setbufvar(1, "&backup", 1)')
- expected_combination({'backup', 0, 1, 'local'})
+ expected_combination({'backup', 0, 0, '', 1, 'local', 'setlocal'})
end)
it('should trigger if the current buffer is different from the targetted buffer', function()
@@ -259,7 +597,7 @@ describe('au OptionSet', function()
local new_bufnr = buf.get_number(new_buffer)
command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
- expected_combination({'buftype', '', 'nofile', 'local', {bufnr = new_bufnr}})
+ expected_combination({'buftype', '', '', '', 'nofile', 'local', 'setlocal', {bufnr = new_bufnr}})
end)
end)
@@ -275,7 +613,7 @@ describe('au OptionSet', function()
set_hook('backup')
command('call setwinvar(1, "&backup", 1)')
- expected_combination({'backup', 0, 1, 'local'})
+ expected_combination({'backup', 0, 0, '', 1, 'local', 'setlocal'})
end)
it('should not trigger if the current window is different from the targetted window', function()
@@ -295,7 +633,7 @@ describe('au OptionSet', function()
nvim.set_option('autochdir', true)
eq(true, nvim.get_option('autochdir'))
- expected_combination({'autochdir', '0', '1', 'global'})
+ expected_combination({'autochdir', 0, '', 0, 1, 'global', 'setglobal'})
end)
it('should trigger if a number option be set globally', function()
@@ -303,7 +641,7 @@ describe('au OptionSet', function()
nvim.set_option('cmdheight', 5)
eq(5, nvim.get_option('cmdheight'))
- expected_combination({'cmdheight', 1, 5, 'global'})
+ expected_combination({'cmdheight', 1, '', 1, 5, 'global', 'setglobal'})
end)
it('should trigger if a string option be set globally', function()
@@ -311,7 +649,7 @@ describe('au OptionSet', function()
nvim.set_option('ambiwidth', 'double')
eq('double', nvim.get_option('ambiwidth'))
- expected_combination({'ambiwidth', 'single', 'double', 'global'})
+ expected_combination({'ambiwidth', 'single', '', 'single', 'double', 'global', 'setglobal'})
end)
end)
end)
diff --git a/test/functional/legacy/fnamemodify_spec.lua b/test/functional/legacy/fnamemodify_spec.lua
index 6a5538c26f..6262db3a2f 100644
--- a/test/functional/legacy/fnamemodify_spec.lua
+++ b/test/functional/legacy/fnamemodify_spec.lua
@@ -29,7 +29,7 @@ describe('filename modifiers', function()
call assert_equal('test.out', fnamemodify('test.out', ':.'))
call assert_equal('../testdir/a', fnamemodify('../testdir/a', ':.'))
call assert_equal(fnamemodify(tmpdir, ':~').'/test.out', fnamemodify('test.out', ':~'))
- call assert_equal('../testdir/a', fnamemodify('../testdir/a', ':~'))
+ call assert_equal(fnamemodify(tmpdir, ':~').'/../testdir/a', fnamemodify('../testdir/a', ':~'))
call assert_equal('a', fnamemodify('../testdir/a', ':t'))
call assert_equal('', fnamemodify('.', ':p:t'))
call assert_equal('test.out', fnamemodify('test.out', ':p:t'))
diff --git a/test/functional/legacy/packadd_spec.lua b/test/functional/legacy/packadd_spec.lua
index 48cd3ef9f8..4f9f5a0237 100644
--- a/test/functional/legacy/packadd_spec.lua
+++ b/test/functional/legacy/packadd_spec.lua
@@ -20,6 +20,9 @@ describe('packadd', function()
func SetUp()
let s:topdir = expand(getcwd() . '/Xdir')
+ if isdirectory(s:topdir)
+ call delete(s:topdir, 'rf')
+ endif
exe 'set packpath=' . s:topdir
let s:plugdir = expand(s:topdir . '/pack/mine/opt/mytest')
endfunc
diff --git a/test/functional/legacy/prompt_buffer_spec.lua b/test/functional/legacy/prompt_buffer_spec.lua
index 513be807be..47eca19de3 100644
--- a/test/functional/legacy/prompt_buffer_spec.lua
+++ b/test/functional/legacy/prompt_buffer_spec.lua
@@ -1,9 +1,12 @@
local helpers = require('test.functional.helpers')(after_each)
local Screen = require('test.functional.ui.screen')
-local feed= helpers.feed
+local feed = helpers.feed
local source = helpers.source
local clear = helpers.clear
local feed_command = helpers.feed_command
+local poke_eventloop = helpers.poke_eventloop
+local meths = helpers.meths
+local eq = helpers.eq
describe('prompt buffer', function()
local screen
@@ -28,12 +31,17 @@ describe('prompt buffer', function()
func TimerFunc(text)
call append(line("$") - 1, 'Result: "' . a:text .'"')
endfunc
+
+ func SwitchWindows()
+ call timer_start(0, {-> execute("wincmd p|wincmd p", "")})
+ endfunc
]])
feed_command("set noshowmode | set laststatus=0")
feed_command("call setline(1, 'other buffer')")
feed_command("new")
feed_command("set buftype=prompt")
feed_command("call prompt_setcallback(bufnr(''), function('TextEntered'))")
+ feed_command("eval bufnr('')->prompt_setprompt('cmd: ')")
end)
after_each(function()
@@ -56,10 +64,10 @@ describe('prompt buffer', function()
feed("i")
feed("hello\n")
screen:expect([[
- % hello |
+ cmd: hello |
Command: "hello" |
Result: "hello" |
- % ^ |
+ cmd: ^ |
[Prompt] [+] |
other buffer |
~ |
@@ -98,7 +106,7 @@ describe('prompt buffer', function()
feed("i")
feed("hello<BS><BS>")
screen:expect([[
- % hel^ |
+ cmd: hel^ |
~ |
~ |
~ |
@@ -111,7 +119,20 @@ describe('prompt buffer', function()
]])
feed("<Left><Left><Left><BS>-")
screen:expect([[
- % -^hel |
+ cmd: -^hel |
+ ~ |
+ ~ |
+ ~ |
+ [Prompt] [+] |
+ other buffer |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]])
+ feed("<C-O>lz")
+ screen:expect([[
+ cmd: -hz^el |
~ |
~ |
~ |
@@ -124,7 +145,7 @@ describe('prompt buffer', function()
]])
feed("<End>x")
screen:expect([[
- % -helx^ |
+ cmd: -hzelx^ |
~ |
~ |
~ |
@@ -150,4 +171,58 @@ describe('prompt buffer', function()
]])
end)
+ it('switch windows', function()
+ feed_command("set showmode")
+ feed("i")
+ screen:expect([[
+ cmd: ^ |
+ ~ |
+ ~ |
+ ~ |
+ [Prompt] [+] |
+ other buffer |
+ ~ |
+ ~ |
+ ~ |
+ -- INSERT -- |
+ ]])
+ feed("<C-O>:call SwitchWindows()<CR>")
+ poke_eventloop()
+ screen:expect([[
+ cmd: ^ |
+ ~ |
+ ~ |
+ ~ |
+ [Prompt] [+] |
+ other buffer |
+ ~ |
+ ~ |
+ ~ |
+ -- INSERT -- |
+ ]])
+ feed("<Esc>")
+ poke_eventloop()
+ screen:expect([[
+ cmd:^ |
+ ~ |
+ ~ |
+ ~ |
+ [Prompt] [+] |
+ other buffer |
+ ~ |
+ ~ |
+ ~ |
+ |
+ ]])
+ end)
+
+ it('keeps insert mode after aucmd_restbuf in callback', function()
+ source [[
+ let s:buf = nvim_create_buf(1, 1)
+ call timer_start(0, {-> nvim_buf_set_lines(s:buf, -1, -1, 0, ['walrus'])})
+ startinsert
+ ]]
+ poke_eventloop()
+ eq({ mode = "i", blocking = false }, meths.get_mode())
+ end)
end)
diff --git a/test/functional/legacy/searchpos_spec.lua b/test/functional/legacy/searchpos_spec.lua
index 60f1edcd3f..fc18341c38 100644
--- a/test/functional/legacy/searchpos_spec.lua
+++ b/test/functional/legacy/searchpos_spec.lua
@@ -17,7 +17,7 @@ describe('searchpos', function()
call('cursor', 1, 1)
eq({1, 1, 2}, eval([[searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')]]))
call('cursor', 1, 2)
- eq({2, 1, 1}, eval([[searchpos('\%(\([a-z]\)\|\_.\)\{-}xyz', 'pcW')]]))
+ eq({2, 1, 1}, eval([['\%(\([a-z]\)\|\_.\)\{-}xyz'->searchpos('pcW')]]))
command('set cpo-=c')
call('cursor', 1, 2)
diff --git a/test/functional/lua/diagnostic_spec.lua b/test/functional/lua/diagnostic_spec.lua
index ec53916024..a88da63e90 100644
--- a/test/functional/lua/diagnostic_spec.lua
+++ b/test/functional/lua/diagnostic_spec.lua
@@ -110,20 +110,35 @@ describe('vim.diagnostic', function()
it('retrieves diagnostics from all buffers and namespaces', function()
local result = exec_lua [[
- vim.diagnostic.set(diagnostic_ns, 1, {
+ local other_bufnr = vim.api.nvim_create_buf(true, false)
+ local lines = vim.api.nvim_buf_get_lines(diagnostic_bufnr, 0, -1, true)
+ vim.api.nvim_buf_set_lines(other_bufnr, 0, 1, false, lines)
+
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
make_error('Diagnostic #1', 1, 1, 1, 1),
make_error('Diagnostic #2', 2, 1, 2, 1),
})
- vim.diagnostic.set(other_ns, 2, {
+ vim.diagnostic.set(other_ns, other_bufnr, {
make_error('Diagnostic #3', 3, 1, 3, 1),
})
return vim.diagnostic.get()
]]
eq(3, #result)
- eq(2, exec_lua([[return #vim.tbl_filter(function(d) return d.bufnr == 1 end, ...)]], result))
+ eq(2, exec_lua([[return #vim.tbl_filter(function(d) return d.bufnr == diagnostic_bufnr end, ...)]], result))
eq('Diagnostic #1', result[1].message)
end)
+ it('resolves buffer number 0 to the current buffer', function()
+ eq(2, exec_lua [[
+ vim.api.nvim_set_current_buf(diagnostic_bufnr)
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
+ make_error('Diagnostic #1', 1, 1, 1, 1),
+ make_error('Diagnostic #2', 2, 1, 2, 1),
+ })
+ return #vim.diagnostic.get(0)
+ ]])
+ end)
+
it('saves and count a single error', function()
eq(1, exec_lua [[
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
@@ -271,6 +286,8 @@ describe('vim.diagnostic', function()
describe('show() and hide()', function()
it('works', function()
local result = exec_lua [[
+ local other_bufnr = vim.api.nvim_create_buf(true, false)
+
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
local result = {}
@@ -284,36 +301,289 @@ describe('vim.diagnostic', function()
local ns_2_diags = {
make_warning("Warning 1", 2, 1, 2, 5),
}
+ local other_buffer_diags = {
+ make_info("This is interesting", 0, 0, 0, 0)
+ }
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, ns_1_diags)
vim.diagnostic.set(other_ns, diagnostic_bufnr, ns_2_diags)
+ vim.diagnostic.set(diagnostic_ns, other_bufnr, other_buffer_diags)
- -- Both
- table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) + count_extmarks(diagnostic_bufnr, other_ns))
+ -- All buffers and namespaces
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
-- Hide one namespace
vim.diagnostic.hide(diagnostic_ns)
- table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns))
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
-- Show one namespace
vim.diagnostic.show(diagnostic_ns)
- table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns))
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ -- Hide one buffer
+ vim.diagnostic.hide(nil, other_bufnr)
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
- -- Hide all namespaces
+ -- Hide everything
vim.diagnostic.hide()
- table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) + count_extmarks(diagnostic_bufnr, other_ns))
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ -- Show one buffer
+ vim.diagnostic.show(nil, diagnostic_bufnr)
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ return result
+ ]]
+
+ eq(4, result[1])
+ eq(1, result[2])
+ eq(4, result[3])
+ eq(3, result[4])
+ eq(0, result[5])
+ eq(3, result[6])
+ end)
+
+ it("doesn't error after bwipeout on buffer", function()
+ exec_lua [[
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {{ lnum = 0, end_lnum = 0, col = 0, end_col = 0 }})
+ vim.cmd("bwipeout! " .. diagnostic_bufnr)
+
+ vim.diagnostic.show(diagnostic_ns)
+ vim.diagnostic.hide(diagnostic_ns)
+ ]]
+ end)
+ end)
- -- Show all namespaces
- vim.diagnostic.show()
- table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) + count_extmarks(diagnostic_bufnr, other_ns))
+ describe('enable() and disable()', function()
+ it('works without arguments', function()
+ local result = exec_lua [[
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+
+ local result = {}
+
+ vim.diagnostic.config({ underline = false, virtual_text = true })
+
+ local ns_1_diags = {
+ make_error("Error 1", 1, 1, 1, 5),
+ make_warning("Warning on Server 1", 2, 1, 2, 5),
+ }
+ local ns_2_diags = {
+ make_warning("Warning 1", 2, 1, 2, 5),
+ }
+
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, ns_1_diags)
+ vim.diagnostic.set(other_ns, diagnostic_bufnr, ns_2_diags)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns))
+
+ vim.diagnostic.disable()
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns))
+
+ -- Create a new buffer
+ local other_bufnr = vim.api.nvim_create_buf(true, false)
+ local other_buffer_diags = {
+ make_info("This is interesting", 0, 0, 0, 0)
+ }
+
+ vim.diagnostic.set(diagnostic_ns, other_bufnr, other_buffer_diags)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.enable()
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
return result
]]
eq(3, result[1])
eq(0, result[2])
- eq(2, result[3])
- eq(0, result[4])
+ eq(0, result[3])
+ eq(4, result[4])
+ end)
+
+ it('works with only a buffer argument', function()
+ local result = exec_lua [[
+ local other_bufnr = vim.api.nvim_create_buf(true, false)
+
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+
+ local result = {}
+
+ vim.diagnostic.config({ underline = false, virtual_text = true })
+
+ local ns_1_diags = {
+ make_error("Error 1", 1, 1, 1, 5),
+ make_warning("Warning on Server 1", 2, 1, 2, 5),
+ }
+ local ns_2_diags = {
+ make_warning("Warning 1", 2, 1, 2, 5),
+ }
+ local other_buffer_diags = {
+ make_info("This is interesting", 0, 0, 0, 0)
+ }
+
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, ns_1_diags)
+ vim.diagnostic.set(other_ns, diagnostic_bufnr, ns_2_diags)
+ vim.diagnostic.set(diagnostic_ns, other_bufnr, other_buffer_diags)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.disable(diagnostic_bufnr)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.enable(diagnostic_bufnr)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.disable(other_bufnr)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ return result
+ ]]
+
+ eq(4, result[1])
+ eq(1, result[2])
+ eq(4, result[3])
+ eq(3, result[4])
+ end)
+
+ it('works with only a namespace argument', function()
+ local result = exec_lua [[
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+
+ local result = {}
+
+ vim.diagnostic.config({ underline = false, virtual_text = true })
+
+ local ns_1_diags = {
+ make_error("Error 1", 1, 1, 1, 5),
+ make_warning("Warning on Server 1", 2, 1, 2, 5),
+ }
+ local ns_2_diags = {
+ make_warning("Warning 1", 2, 1, 2, 5),
+ }
+
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, ns_1_diags)
+ vim.diagnostic.set(other_ns, diagnostic_bufnr, ns_2_diags)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns))
+
+ vim.diagnostic.disable(nil, diagnostic_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns))
+
+ vim.diagnostic.enable(nil, diagnostic_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns))
+
+ vim.diagnostic.disable(nil, other_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns))
+
+ return result
+ ]]
+
+ eq(3, result[1])
+ eq(1, result[2])
+ eq(3, result[3])
+ eq(2, result[4])
+ end)
+
+ it('works with both a buffer and a namespace argument', function()
+ local result = exec_lua [[
+ local other_bufnr = vim.api.nvim_create_buf(true, false)
+
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+
+ local result = {}
+
+ vim.diagnostic.config({ underline = false, virtual_text = true })
+
+ local ns_1_diags = {
+ make_error("Error 1", 1, 1, 1, 5),
+ make_warning("Warning on Server 1", 2, 1, 2, 5),
+ }
+ local ns_2_diags = {
+ make_warning("Warning 1", 2, 1, 2, 5),
+ }
+ local other_buffer_diags = {
+ make_info("This is interesting", 0, 0, 0, 0)
+ }
+
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, ns_1_diags)
+ vim.diagnostic.set(other_ns, diagnostic_bufnr, ns_2_diags)
+ vim.diagnostic.set(diagnostic_ns, other_bufnr, other_buffer_diags)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.disable(diagnostic_bufnr, diagnostic_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.disable(diagnostic_bufnr, other_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ vim.diagnostic.enable(diagnostic_bufnr, diagnostic_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ -- Should have no effect
+ vim.diagnostic.disable(other_bufnr, other_ns)
+
+ table.insert(result, count_extmarks(diagnostic_bufnr, diagnostic_ns) +
+ count_extmarks(diagnostic_bufnr, other_ns) +
+ count_extmarks(other_bufnr, diagnostic_ns))
+
+ return result
+ ]]
+
+ eq(4, result[1])
+ eq(2, result[2])
+ eq(1, result[3])
+ eq(3, result[4])
eq(3, result[5])
end)
end)
@@ -380,6 +650,15 @@ describe('vim.diagnostic', function()
]])
end)
+
+ it("doesn't error after bwipeout called on buffer", function()
+ exec_lua [[
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {{ lnum = 0, end_lnum = 0, col = 0, end_col = 0 }})
+ vim.cmd("bwipeout! " .. diagnostic_bufnr)
+
+ vim.diagnostic.reset(diagnostic_ns)
+ ]]
+ end)
end)
describe('get_next_pos()', function()
@@ -437,6 +716,19 @@ describe('vim.diagnostic', function()
return vim.diagnostic.get_prev_pos { namespace = diagnostic_ns }
]])
end)
+
+ it('works with diagnostics past the end of the line #16349', function()
+ eq({4, 0}, exec_lua [[
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
+ make_error('Diagnostic #1', 3, 9001, 3, 9001),
+ make_error('Diagnostic #2', 4, 0, 4, 0),
+ })
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+ vim.api.nvim_win_set_cursor(0, {1, 1})
+ vim.diagnostic.goto_next { float = false }
+ return vim.diagnostic.get_next_pos { namespace = diagnostic_ns }
+ ]])
+ end)
end)
describe('get_prev_pos()', function()
@@ -633,7 +925,7 @@ describe('vim.diagnostic', function()
]]
eq(1, exec_lua [[return count_diagnostics(diagnostic_bufnr, vim.diagnostic.severity.ERROR, diagnostic_ns)]])
- -- eq(1, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
+ eq(1, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
end)
it('allows filtering by severity', function()
@@ -1032,6 +1324,44 @@ describe('vim.diagnostic', function()
end)
describe('open_float()', function()
+ it('can display a header', function()
+ eq({'Diagnostics:', '1. Syntax error'}, exec_lua [[
+ local diagnostics = {
+ make_error("Syntax error", 0, 1, 0, 3),
+ }
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
+ local float_bufnr, winnr = vim.diagnostic.open_float()
+ local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
+ vim.api.nvim_win_close(winnr, true)
+ return lines
+ ]])
+
+ eq({"We're no strangers to love...", '1. Syntax error'}, exec_lua [[
+ local diagnostics = {
+ make_error("Syntax error", 0, 1, 0, 3),
+ }
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
+ local float_bufnr, winnr = vim.diagnostic.open_float({header = "We're no strangers to love..."})
+ local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
+ vim.api.nvim_win_close(winnr, true)
+ return lines
+ ]])
+
+ eq({'You know the rules', '1. Syntax error'}, exec_lua [[
+ local diagnostics = {
+ make_error("Syntax error", 0, 1, 0, 3),
+ }
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
+ local float_bufnr, winnr = vim.diagnostic.open_float({header = {'You know the rules', 'Search'}})
+ local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
+ vim.api.nvim_win_close(winnr, true)
+ return lines
+ ]])
+ end)
+
it('can show diagnostics from the whole buffer', function()
eq({'1. Syntax error', '2. Some warning'}, exec_lua [[
local diagnostics = {
@@ -1040,7 +1370,7 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header = false})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header = false, scope="buffer"})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1057,7 +1387,7 @@ describe('vim.diagnostic', function()
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
vim.api.nvim_win_set_cursor(0, {2, 1})
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header=false, scope="line"})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header=false})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1072,7 +1402,7 @@ describe('vim.diagnostic', function()
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
vim.api.nvim_win_set_cursor(0, {1, 1})
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header=false, scope="line", pos=1})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header=false, pos=1})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1089,7 +1419,7 @@ describe('vim.diagnostic', function()
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
vim.api.nvim_win_set_cursor(0, {2, 2})
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header=false, scope="cursor"})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header=false, scope="cursor"})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1104,7 +1434,7 @@ describe('vim.diagnostic', function()
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
vim.api.nvim_win_set_cursor(0, {1, 1})
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header=false, scope="cursor", pos={1,3}})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header=false, scope="cursor", pos={1,3}})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1119,7 +1449,7 @@ describe('vim.diagnostic', function()
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
vim.api.nvim_win_set_cursor(0, {1, 1})
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header=false, scope="cursor", pos={0,first_line_len}})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header=false, scope="cursor", pos={0,first_line_len}})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1136,7 +1466,7 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {scope="line"})
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr)
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return #lines
@@ -1189,7 +1519,7 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {show_header = false})
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {header = false})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return #lines
@@ -1203,7 +1533,7 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {show_header = false, scope = "line", pos = 5})
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {header = false, pos = 5})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return #lines
@@ -1219,7 +1549,7 @@ describe('vim.diagnostic', function()
}
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {
- show_header = false,
+ header = false,
source = "if_many",
})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
@@ -1229,7 +1559,7 @@ describe('vim.diagnostic', function()
eq({"1. source x: Syntax error"}, exec_lua [[
local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {
- show_header = false,
+ header = false,
source = "always",
})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
@@ -1244,7 +1574,7 @@ describe('vim.diagnostic', function()
}
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, {
- show_header = false,
+ header = false,
source = "if_many",
})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
@@ -1268,7 +1598,7 @@ describe('vim.diagnostic', function()
vim.diagnostic.config({severity_sort = false})
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { show_header = false })
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { header = false })
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1276,7 +1606,7 @@ describe('vim.diagnostic', function()
eq({"1. Syntax error", "2. Error", "3. Warning", "4. Info"}, exec_lua [[
vim.diagnostic.config({severity_sort = true})
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { show_header = false })
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { header = false })
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1284,7 +1614,7 @@ describe('vim.diagnostic', function()
eq({"1. Info", "2. Warning", "3. Error", "4. Syntax error"}, exec_lua [[
vim.diagnostic.config({severity_sort = { reverse = true } })
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { show_header = false })
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { header = false })
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1308,7 +1638,7 @@ describe('vim.diagnostic', function()
make_warning('Warning', 0, 0, 0, 1),
})
- local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { show_header = false })
+ local float_bufnr, winnr = vim.diagnostic.open_float(diagnostic_bufnr, { header = false })
if not float_bufnr then
return 0
end
@@ -1335,7 +1665,7 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header = false, number = "always"})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header = false, scope = "buffer"})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1348,7 +1678,7 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {show_header = false, prefix = ""})
+ local float_bufnr, winnr = vim.diagnostic.open_float({header = false, scope = "buffer", prefix = ""})
local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
vim.api.nvim_win_close(winnr, true)
return lines
@@ -1357,12 +1687,12 @@ describe('vim.diagnostic', function()
eq({'1. Syntax error', '2. Some warning'}, exec_lua [[
local diagnostics = {
make_error("Syntax error", 0, 1, 0, 3),
- make_warning("Some warning", 1, 1, 1, 3),
+ make_warning("Some warning", 0, 1, 0, 3),
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {
- show_header = false,
+ local float_bufnr, winnr = vim.diagnostic.open_float({
+ header = false,
prefix = function(_, i, total)
-- Only show a number if there is more than one diagnostic
if total > 1 then
@@ -1382,8 +1712,8 @@ describe('vim.diagnostic', function()
}
vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
- local float_bufnr, winnr = vim.diagnostic.open_float(0, {
- show_header = false,
+ local float_bufnr, winnr = vim.diagnostic.open_float({
+ header = false,
prefix = function(_, i, total)
-- Only show a number if there is more than one diagnostic
if total > 1 then
@@ -1397,8 +1727,22 @@ describe('vim.diagnostic', function()
return lines
]])
- eq("Error executing lua: .../diagnostic.lua:0: prefix: expected 'string' or 'function', got 42",
- pcall_err(exec_lua, [[ vim.diagnostic.open_float(0, { prefix = 42 }) ]]))
+ eq("Error executing lua: .../diagnostic.lua:0: prefix: expected 'string' or 'table' or 'function', got 42",
+ pcall_err(exec_lua, [[ vim.diagnostic.open_float({ prefix = 42 }) ]]))
+ end)
+
+ it('works with the old signature', function()
+ eq({'1. Syntax error'}, exec_lua [[
+ local diagnostics = {
+ make_error("Syntax error", 0, 1, 0, 3),
+ }
+ vim.api.nvim_win_set_buf(0, diagnostic_bufnr)
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, diagnostics)
+ local float_bufnr, winnr = vim.diagnostic.open_float(0, { header = false })
+ local lines = vim.api.nvim_buf_get_lines(float_bufnr, 0, -1, false)
+ vim.api.nvim_win_close(winnr, true)
+ return lines
+ ]])
end)
end)
@@ -1588,5 +1932,27 @@ describe('vim.diagnostic', function()
return {show_called, hide_called}
]])
end)
+
+ it('triggers the autocommand when diagnostics are set', function()
+ eq(1, exec_lua [[
+ vim.g.diagnostic_autocmd_triggered = 0
+ vim.cmd('autocmd DiagnosticChanged * let g:diagnostic_autocmd_triggered = 1')
+ vim.api.nvim_buf_set_name(diagnostic_bufnr, "test | test")
+ vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
+ make_error('Diagnostic', 0, 0, 0, 0)
+ })
+ return vim.g.diagnostic_autocmd_triggered
+ ]])
+ end)
+
+ it('triggers the autocommand when diagnostics are cleared', function()
+ eq(1, exec_lua [[
+ vim.g.diagnostic_autocmd_triggered = 0
+ vim.cmd('autocmd DiagnosticChanged * let g:diagnostic_autocmd_triggered = 1')
+ vim.api.nvim_buf_set_name(diagnostic_bufnr, "test | test")
+ vim.diagnostic.reset(diagnostic_ns, diagnostic_bufnr)
+ return vim.g.diagnostic_autocmd_triggered
+ ]])
+ end)
end)
end)
diff --git a/test/functional/lua/uri_spec.lua b/test/functional/lua/uri_spec.lua
index 81f1820986..dbfbe2dbfe 100644
--- a/test/functional/lua/uri_spec.lua
+++ b/test/functional/lua/uri_spec.lua
@@ -143,8 +143,8 @@ describe('URI methods', function()
end)
it('uri_to_fname returns non-file scheme URI without authority unchanged', function()
- eq('zipfile:/path/to/archive.zip%3A%3Afilename.txt', exec_lua [[
- return vim.uri_to_fname('zipfile:/path/to/archive.zip%3A%3Afilename.txt')
+ eq('zipfile:///path/to/archive.zip%3A%3Afilename.txt', exec_lua [[
+ return vim.uri_to_fname('zipfile:///path/to/archive.zip%3A%3Afilename.txt')
]])
end)
end)
@@ -186,7 +186,7 @@ describe('URI methods', function()
end)
it('uri_to_bufnr & uri_from_bufnr returns original uri for non-file uris without authority', function()
- local uri = 'zipfile:/path/to/archive.zip%3A%3Afilename.txt'
+ local uri = 'zipfile:///path/to/archive.zip%3A%3Afilename.txt'
local test_case = string.format([[
local uri = '%s'
return vim.uri_from_bufnr(vim.uri_to_bufnr(uri))
diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua
index 3832d27a22..317f92fcdc 100644
--- a/test/functional/lua/vim_spec.lua
+++ b/test/functional/lua/vim_spec.lua
@@ -131,9 +131,9 @@ describe('lua stdlib', function()
eq(false, funcs.luaeval('vim.startswith("123", "2")'))
eq(false, funcs.luaeval('vim.startswith("123", "1234")'))
- eq("Error executing lua: vim/shared.lua:0: prefix: expected string, got nil",
+ matches("prefix: expected string, got nil",
pcall_err(exec_lua, 'return vim.startswith("123", nil)'))
- eq("Error executing lua: vim/shared.lua:0: s: expected string, got nil",
+ matches("s: expected string, got nil",
pcall_err(exec_lua, 'return vim.startswith(nil, "123")'))
end)
@@ -147,9 +147,9 @@ describe('lua stdlib', function()
eq(false, funcs.luaeval('vim.endswith("123", "2")'))
eq(false, funcs.luaeval('vim.endswith("123", "1234")'))
- eq("Error executing lua: vim/shared.lua:0: suffix: expected string, got nil",
+ matches("suffix: expected string, got nil",
pcall_err(exec_lua, 'return vim.endswith("123", nil)'))
- eq("Error executing lua: vim/shared.lua:0: s: expected string, got nil",
+ matches("s: expected string, got nil",
pcall_err(exec_lua, 'return vim.endswith(nil, "123")'))
end)
@@ -220,9 +220,9 @@ describe('lua stdlib', function()
eq({"yy","xx"}, exec_lua("return test_table"))
-- Validates args.
- eq('Error executing lua: vim.schedule: expected function',
+ matches('vim.schedule: expected function',
pcall_err(exec_lua, "vim.schedule('stringly')"))
- eq('Error executing lua: vim.schedule: expected function',
+ matches('vim.schedule: expected function',
pcall_err(exec_lua, "vim.schedule()"))
exec_lua([[
@@ -232,7 +232,7 @@ describe('lua stdlib', function()
]])
feed("<cr>")
- eq('Error executing vim.schedule lua callback: [string "<nvim>"]:2: big failure\nvery async', remove_trace(eval("v:errmsg")))
+ matches('big failure\nvery async', remove_trace(eval("v:errmsg")))
local screen = Screen.new(60,5)
screen:set_default_attr_ids({
@@ -300,16 +300,16 @@ describe('lua stdlib', function()
}
for _, t in ipairs(loops) do
- eq("Error executing lua: vim/shared.lua:0: Infinite loop detected", pcall_err(split, t[1], t[2]))
+ matches("Infinite loop detected", pcall_err(split, t[1], t[2]))
end
-- Validates args.
eq(true, pcall(split, 'string', 'string'))
- eq('Error executing lua: vim/shared.lua:0: s: expected string, got number',
+ matches('s: expected string, got number',
pcall_err(split, 1, 'string'))
- eq('Error executing lua: vim/shared.lua:0: sep: expected string, got number',
+ matches('sep: expected string, got number',
pcall_err(split, 'string', 1))
- eq('Error executing lua: vim/shared.lua:0: kwargs: expected table, got number',
+ matches('kwargs: expected table, got number',
pcall_err(split, 'string', 'string', 1))
end)
@@ -330,7 +330,7 @@ describe('lua stdlib', function()
end
-- Validates args.
- eq('Error executing lua: vim/shared.lua:0: s: expected string, got number',
+ matches('s: expected string, got number',
pcall_err(trim, 2))
end)
@@ -396,7 +396,21 @@ describe('lua stdlib', function()
return t1.f() ~= t2.f()
]]))
- eq('Error executing lua: vim/shared.lua:0: Cannot deepcopy object of type thread',
+ ok(exec_lua([[
+ local t1 = {a = 5}
+ t1.self = t1
+ local t2 = vim.deepcopy(t1)
+ return t2.self == t2 and t2.self ~= t1
+ ]]))
+
+ ok(exec_lua([[
+ local mt = {mt=true}
+ local t1 = setmetatable({a = 5}, mt)
+ local t2 = vim.deepcopy(t1)
+ return getmetatable(t2) == mt
+ ]]))
+
+ matches('Cannot deepcopy object of type thread',
pcall_err(exec_lua, [[
local thread = coroutine.create(function () return 0 end)
local t = {thr = thread}
@@ -409,7 +423,7 @@ describe('lua stdlib', function()
eq('foo%%%-bar', exec_lua([[return vim.pesc(vim.pesc('foo-bar'))]]))
-- Validates args.
- eq('Error executing lua: vim/shared.lua:0: s: expected string, got number',
+ matches('s: expected string, got number',
pcall_err(exec_lua, [[return vim.pesc(2)]]))
end)
@@ -534,19 +548,19 @@ describe('lua stdlib', function()
return c.x.a == 1 and c.x.b == 2 and c.x.c == nil and count == 1
]]))
- eq('Error executing lua: vim/shared.lua:0: invalid "behavior": nil',
+ matches('invalid "behavior": nil',
pcall_err(exec_lua, [[
return vim.tbl_extend()
]])
)
- eq('Error executing lua: vim/shared.lua:0: wrong number of arguments (given 1, expected at least 3)',
+ matches('wrong number of arguments %(given 1, expected at least 3%)',
pcall_err(exec_lua, [[
return vim.tbl_extend("keep")
]])
)
- eq('Error executing lua: vim/shared.lua:0: wrong number of arguments (given 2, expected at least 3)',
+ matches('wrong number of arguments %(given 2, expected at least 3%)',
pcall_err(exec_lua, [[
return vim.tbl_extend("keep", {})
]])
@@ -647,19 +661,19 @@ describe('lua stdlib', function()
return vim.tbl_deep_extend("force", a, b)
]]), {a = 123 })
- eq('Error executing lua: vim/shared.lua:0: invalid "behavior": nil',
+ matches('invalid "behavior": nil',
pcall_err(exec_lua, [[
return vim.tbl_deep_extend()
]])
)
- eq('Error executing lua: vim/shared.lua:0: wrong number of arguments (given 1, expected at least 3)',
+ matches('wrong number of arguments %(given 1, expected at least 3%)',
pcall_err(exec_lua, [[
return vim.tbl_deep_extend("keep")
]])
)
- eq('Error executing lua: vim/shared.lua:0: wrong number of arguments (given 2, expected at least 3)',
+ matches('wrong number of arguments %(given 2, expected at least 3%)',
pcall_err(exec_lua, [[
return vim.tbl_deep_extend("keep", {})
]])
@@ -692,7 +706,7 @@ describe('lua stdlib', function()
it('vim.list_extend', function()
eq({1,2,3}, exec_lua [[ return vim.list_extend({1}, {2,3}) ]])
- eq('Error executing lua: vim/shared.lua:0: src: expected table, got nil',
+ matches('src: expected table, got nil',
pcall_err(exec_lua, [[ return vim.list_extend({1}, nil) ]]))
eq({1,2}, exec_lua [[ return vim.list_extend({1}, {2;a=1}) ]])
eq(true, exec_lua [[ local a = {1} return vim.list_extend(a, {2;a=1}) == a ]])
@@ -716,7 +730,7 @@ describe('lua stdlib', function()
assert(vim.deep_equal(a, { A = 1; [1] = 'A'; }))
vim.tbl_add_reverse_lookup(a)
]]
- matches('^Error executing lua: vim/shared%.lua:0: The reverse lookup found an existing value for "[1A]" while processing key "[1A]"$',
+ matches('The reverse lookup found an existing value for "[1A]" while processing key "[1A]"$',
pcall_err(exec_lua, code))
end)
@@ -757,7 +771,7 @@ describe('lua stdlib', function()
end)
it('vim.fn should error when calling API function', function()
- eq('Error executing lua: vim.lua:0: Tried to call API function with vim.fn: use vim.api.nvim_get_current_line instead',
+ matches('Tried to call API function with vim.fn: use vim.api.nvim_get_current_line instead',
pcall_err(exec_lua, "vim.fn.nvim_get_current_line()"))
end)
@@ -893,37 +907,37 @@ describe('lua stdlib', function()
exec_lua("vim.validate{arg1={{}, 't' }, arg2={ 'foo', 's' }}")
exec_lua("vim.validate{arg1={2, function(a) return (a % 2) == 0 end, 'even number' }}")
- eq('Error executing lua: [string "<nvim>"]:0: opt[1]: expected table, got number',
+ matches('expected table, got number',
pcall_err(exec_lua, "vim.validate{ 1, 'x' }"))
- eq('Error executing lua: [string "<nvim>"]:0: invalid type name: x',
+ matches('invalid type name: x',
pcall_err(exec_lua, "vim.validate{ arg1={ 1, 'x' }}"))
- eq('Error executing lua: [string "<nvim>"]:0: invalid type name: 1',
+ matches('invalid type name: 1',
pcall_err(exec_lua, "vim.validate{ arg1={ 1, 1 }}"))
- eq('Error executing lua: [string "<nvim>"]:0: invalid type name: nil',
+ matches('invalid type name: nil',
pcall_err(exec_lua, "vim.validate{ arg1={ 1 }}"))
-- Validated parameters are required by default.
- eq('Error executing lua: [string "<nvim>"]:0: arg1: expected string, got nil',
+ matches('arg1: expected string, got nil',
pcall_err(exec_lua, "vim.validate{ arg1={ nil, 's' }}"))
-- Explicitly required.
- eq('Error executing lua: [string "<nvim>"]:0: arg1: expected string, got nil',
+ matches('arg1: expected string, got nil',
pcall_err(exec_lua, "vim.validate{ arg1={ nil, 's', false }}"))
- eq('Error executing lua: [string "<nvim>"]:0: arg1: expected table, got number',
+ matches('arg1: expected table, got number',
pcall_err(exec_lua, "vim.validate{arg1={1, 't'}}"))
- eq('Error executing lua: [string "<nvim>"]:0: arg2: expected string, got number',
+ matches('arg2: expected string, got number',
pcall_err(exec_lua, "vim.validate{arg1={{}, 't'}, arg2={1, 's'}}"))
- eq('Error executing lua: [string "<nvim>"]:0: arg2: expected string, got nil',
+ matches('arg2: expected string, got nil',
pcall_err(exec_lua, "vim.validate{arg1={{}, 't'}, arg2={nil, 's'}}"))
- eq('Error executing lua: [string "<nvim>"]:0: arg2: expected string, got nil',
+ matches('arg2: expected string, got nil',
pcall_err(exec_lua, "vim.validate{arg1={{}, 't'}, arg2={nil, 's'}}"))
- eq('Error executing lua: [string "<nvim>"]:0: arg1: expected even number, got 3',
+ matches('arg1: expected even number, got 3',
pcall_err(exec_lua, "vim.validate{arg1={3, function(a) return a == 1 end, 'even number'}}"))
- eq('Error executing lua: [string "<nvim>"]:0: arg1: expected ?, got 3',
+ matches('arg1: expected %?, got 3',
pcall_err(exec_lua, "vim.validate{arg1={3, function(a) return a == 1 end}}"))
-- Pass an additional message back.
- eq('Error executing lua: [string "<nvim>"]:0: arg1: expected ?, got 3. Info: TEST_MSG',
+ matches('arg1: expected %?, got 3. Info: TEST_MSG',
pcall_err(exec_lua, "vim.validate{arg1={3, function(a) return a == 1, 'TEST_MSG' end}}"))
end)
@@ -968,7 +982,7 @@ describe('lua stdlib', function()
]]
eq(NIL, funcs.luaeval "vim.g.to_delete")
- matches([[^Error executing lua: .*: attempt to index .* nil value]],
+ matches([[attempt to index .* nil value]],
pcall_err(exec_lua, 'return vim.g[0].testing'))
end)
@@ -995,7 +1009,7 @@ describe('lua stdlib', function()
return {vim.b.nonexistant == vim.NIL, vim.b.nullvar == vim.NIL}
]])
- matches([[^Error executing lua: .*: attempt to index .* nil value]],
+ matches([[attempt to index .* nil value]],
pcall_err(exec_lua, 'return vim.b[BUF][0].testing'))
eq({hello="world"}, funcs.luaeval "vim.b.to_delete")
@@ -1032,7 +1046,7 @@ describe('lua stdlib', function()
eq(NIL, funcs.luaeval "vim.w.nonexistant")
eq(NIL, funcs.luaeval "vim.w[WIN].nonexistant")
- matches([[^Error executing lua: .*: attempt to index .* nil value]],
+ matches([[attempt to index .* nil value]],
pcall_err(exec_lua, 'return vim.w[WIN][0].testing'))
eq({hello="world"}, funcs.luaeval "vim.w.to_delete")
@@ -1064,7 +1078,7 @@ describe('lua stdlib', function()
eq(123, funcs.luaeval "vim.t[0].other")
eq(NIL, funcs.luaeval "vim.t[0].nonexistant")
- matches([[^Error executing lua: .*: attempt to index .* nil value]],
+ matches([[attempt to index .* nil value]],
pcall_err(exec_lua, 'return vim.t[0][0].testing'))
eq({hello="world"}, funcs.luaeval "vim.t.to_delete")
@@ -1094,7 +1108,7 @@ describe('lua stdlib', function()
eq(funcs.luaeval "vim.api.nvim_get_vvar('progpath')", funcs.luaeval "vim.v.progpath")
eq(false, funcs.luaeval "vim.v['false']")
eq(NIL, funcs.luaeval "vim.v.null")
- matches([[^Error executing lua: .*: attempt to index .* nil value]],
+ matches([[attempt to index .* nil value]],
pcall_err(exec_lua, 'return vim.v[0].progpath'))
end)
@@ -1114,9 +1128,9 @@ describe('lua stdlib', function()
]]
eq('', funcs.luaeval "vim.bo.filetype")
eq(true, funcs.luaeval "vim.bo[BUF].modifiable")
- matches("^Error executing lua: .*: Invalid option name: 'nosuchopt'$",
+ matches("Invalid option name: 'nosuchopt'$",
pcall_err(exec_lua, 'return vim.bo.nosuchopt'))
- matches("^Error executing lua: .*: Expected lua string$",
+ matches("Expected lua string$",
pcall_err(exec_lua, 'return vim.bo[0][0].autoread'))
end)
@@ -1133,9 +1147,9 @@ describe('lua stdlib', function()
eq(0, funcs.luaeval "vim.wo.cole")
eq(0, funcs.luaeval "vim.wo[0].cole")
eq(0, funcs.luaeval "vim.wo[1001].cole")
- matches("^Error executing lua: .*: Invalid option name: 'notanopt'$",
+ matches("Invalid option name: 'notanopt'$",
pcall_err(exec_lua, 'return vim.wo.notanopt'))
- matches("^Error executing lua: .*: Expected lua string$",
+ matches("Expected lua string$",
pcall_err(exec_lua, 'return vim.wo[0][0].list'))
eq(2, funcs.luaeval "vim.wo[1000].cole")
exec_lua [[
@@ -1226,7 +1240,7 @@ describe('lua stdlib', function()
vim.opt.makeprg = "global-local"
table.insert(result, vim.api.nvim_get_option('makeprg'))
- table.insert(result, (pcall(vim.api.nvim_buf_get_option, 0, 'makeprg')))
+ table.insert(result, vim.api.nvim_buf_get_option(0, 'makeprg'))
vim.opt_local.mp = "only-local"
table.insert(result, vim.api.nvim_get_option('makeprg'))
@@ -1244,7 +1258,7 @@ describe('lua stdlib', function()
-- Set -> global & local
eq("global-local", result[1])
- eq(false, result[2])
+ eq("", result[2])
-- Setlocal -> only local
eq("global-local", result[3])
@@ -1254,9 +1268,9 @@ describe('lua stdlib', function()
eq("only-global", result[5])
eq("only-local", result[6])
- -- set -> doesn't override previously set value
+ -- Set -> sets global value and resets local value
eq("global-local", result[7])
- eq("only-local", result[8])
+ eq("", result[8])
end)
it('should allow you to retrieve window opts even if they have not been set', function()
diff --git a/test/functional/options/chars_spec.lua b/test/functional/options/chars_spec.lua
index 5439ca3dba..a082204980 100644
--- a/test/functional/options/chars_spec.lua
+++ b/test/functional/options/chars_spec.lua
@@ -67,36 +67,52 @@ describe("'fillchars'", function()
shouldfail('eob:xy') -- two ascii chars
shouldfail('eob:\255', 'eob:<ff>') -- invalid UTF-8
end)
- it('has global value', function()
- screen:try_resize(50, 5)
- insert("foo\nbar")
- command('set laststatus=0')
- command('1,2fold')
- command('vsplit')
- command('set fillchars=fold:x')
- screen:expect([[
- ^+-- 2 lines: fooxxxxxxxx│+-- 2 lines: fooxxxxxxx|
- ~ │~ |
- ~ │~ |
- ~ │~ |
- |
- ]])
- end)
- it('has local window value', function()
- screen:try_resize(50, 5)
- insert("foo\nbar")
- command('set laststatus=0')
- command('1,2fold')
- command('vsplit')
- command('setl fillchars=fold:x')
- screen:expect([[
- ^+-- 2 lines: fooxxxxxxxx│+-- 2 lines: foo·······|
- ~ │~ |
- ~ │~ |
- ~ │~ |
- |
- ]])
- end)
+ end)
+ it('has global value', function()
+ screen:try_resize(50, 5)
+ insert("foo\nbar")
+ command('set laststatus=0')
+ command('1,2fold')
+ command('vsplit')
+ command('set fillchars=fold:x')
+ screen:expect([[
+ ^+-- 2 lines: fooxxxxxxxx│+-- 2 lines: fooxxxxxxx|
+ ~ │~ |
+ ~ │~ |
+ ~ │~ |
+ |
+ ]])
+ end)
+ it('has window-local value', function()
+ screen:try_resize(50, 5)
+ insert("foo\nbar")
+ command('set laststatus=0')
+ command('1,2fold')
+ command('vsplit')
+ command('setl fillchars=fold:x')
+ screen:expect([[
+ ^+-- 2 lines: fooxxxxxxxx│+-- 2 lines: foo·······|
+ ~ │~ |
+ ~ │~ |
+ ~ │~ |
+ |
+ ]])
+ end)
+ it('using :set clears window-local value', function()
+ screen:try_resize(50, 5)
+ insert("foo\nbar")
+ command('set laststatus=0')
+ command('setl fillchars=fold:x')
+ command('1,2fold')
+ command('vsplit')
+ command('set fillchars&')
+ screen:expect([[
+ ^+-- 2 lines: foo········│+-- 2 lines: fooxxxxxxx|
+ ~ │~ |
+ ~ │~ |
+ ~ │~ |
+ |
+ ]])
end)
end)
@@ -122,7 +138,7 @@ describe("'listchars'", function()
|
]])
end)
- it('has value local to window', function()
+ it('has window-local value', function()
feed('i<tab><tab><tab><esc>')
command('set list laststatus=0')
command('setl listchars=tab:<->')
@@ -136,4 +152,18 @@ describe("'listchars'", function()
|
]])
end)
+ it('using :set clears window-local value', function()
+ feed('i<tab><tab><tab><esc>')
+ command('set list laststatus=0')
+ command('setl listchars=tab:<->')
+ command('vsplit')
+ command('set listchars=tab:>-,eol:$')
+ screen:expect([[
+ >------->-------^>-------$│<------><------><------>|
+ ~ │~ |
+ ~ │~ |
+ ~ │~ |
+ |
+ ]])
+ end)
end)
diff --git a/test/functional/plugin/health_spec.lua b/test/functional/plugin/health_spec.lua
index b567b3e20c..37de5d0ce6 100644
--- a/test/functional/plugin/health_spec.lua
+++ b/test/functional/plugin/health_spec.lua
@@ -156,7 +156,7 @@ describe('health.vim', function()
test_plug.submodule_failed: require("test_plug.submodule_failed.health").check()
========================================================================
- ERROR: Failed to run healthcheck for "test_plug.submodule_failed" plugin. Exception:
- function health#check, line 24]])
+ function health#check, line 20]])
eq(expected, received)
end)
@@ -167,7 +167,7 @@ describe('health.vim', function()
broken: health#broken#check
========================================================================
- ERROR: Failed to run healthcheck for "broken" plugin. Exception:
- function health#check[24]..health#broken#check, line 1
+ function health#check[20]..health#broken#check, line 1
caused an error
]])
end)
@@ -186,7 +186,7 @@ describe('health.vim', function()
test_plug.submodule_failed: require("test_plug.submodule_failed.health").check()
========================================================================
- ERROR: Failed to run healthcheck for "test_plug.submodule_failed" plugin. Exception:
- function health#check, line 24]])
+ function health#check, line 20]])
eq(expected, received)
end)
diff --git a/test/functional/plugin/lsp/incremental_sync_spec.lua b/test/functional/plugin/lsp/incremental_sync_spec.lua
index fe4f8f3593..4e3eddb960 100644
--- a/test/functional/plugin/lsp/incremental_sync_spec.lua
+++ b/test/functional/plugin/lsp/incremental_sync_spec.lua
@@ -66,6 +66,7 @@ local function test_edit(prev_buffer, edit_operations, expected_text_changes, of
exec_lua("test_unreg = 'test1'")
end
+
describe('incremental synchronization', function()
describe('single line edit', function()
it('inserting a character in an empty buffer', function()
@@ -163,54 +164,314 @@ describe('incremental synchronization', function()
}
test_edit({"a"}, {"rb"}, expected_text_changes, 'utf-16', '\n')
end)
- describe('multi-byte edits', function()
- it('join and undo', function()
- local expected_text_changes = {
- {
- range = {
- ['start'] = {
- character = 11,
- line = 0
- },
- ['end'] = {
- character = 11,
- line = 0
- }
+ it('deleting a line', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 0
},
- rangeLength = 0,
- text = ' test3'
- },{
- range = {
- ['start'] = {
- character = 0,
- line = 1
- },
- ['end'] = {
- character = 0,
- line = 2
- }
+ ['end'] = {
+ character = 0,
+ line = 1
+ }
+ },
+ rangeLength = 12,
+ text = ''
+ }
+ }
+ test_edit({"hello world"}, {"dd"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('deleting an empty line', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
},
- rangeLength = 6,
- text = ''
- },{
- range = {
- ['start'] = {
- character = 11,
- line = 0
- },
- ['end'] = {
- character = 17,
- line = 0
- }
+ ['end'] = {
+ character = 0,
+ line = 2
+ }
+ },
+ rangeLength = 1,
+ text = ''
+ }
+ }
+ test_edit({"hello world", ""}, {"jdd"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('adding a line', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
+ },
+ ['end'] = {
+ character = 0,
+ line = 1
+ }
+ },
+ rangeLength = 0,
+ text = 'hello world\n'
+ }
+ }
+ test_edit({"hello world"}, {"yyp"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('adding an empty line', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
},
- rangeLength = 6,
- text = '\ntest3'
+ ['end'] = {
+ character = 0,
+ line = 1
+ }
},
+ rangeLength = 0,
+ text = '\n'
}
- test_edit({"test1 test2", "test3"}, {"J", "u"}, expected_text_changes, 'utf-16', '\n')
- end)
+ }
+ test_edit({"hello world"}, {"o"}, expected_text_changes, 'utf-16', '\n')
end)
end)
+ describe('multi line edit', function()
+ it('deletion and insertion', function()
+ local expected_text_changes = {
+ -- delete "_fsda" from end of line 1
+ {
+ range = {
+ ['start'] = {
+ character = 4,
+ line = 1
+ },
+ ['end'] = {
+ character = 9,
+ line = 1
+ }
+ },
+ rangeLength = 5,
+ text = ''
+ },
+ -- delete "hello world\n" from line 2
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 2
+ },
+ ['end'] = {
+ character = 0,
+ line = 3
+ }
+ },
+ rangeLength = 12,
+ text = ''
+ },
+ -- delete "1234" from beginning of line 2
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 2
+ },
+ ['end'] = {
+ character = 4,
+ line = 2
+ }
+ },
+ rangeLength = 4,
+ text = ''
+ },
+ -- add " asdf" to end of line 1
+ {
+ range = {
+ ['start'] = {
+ character = 4,
+ line = 1
+ },
+ ['end'] = {
+ character = 4,
+ line = 1
+ }
+ },
+ rangeLength = 0,
+ text = ' asdf'
+ },
+ -- delete " asdf\n" from line 2
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 2
+ },
+ ['end'] = {
+ character = 0,
+ line = 3
+ }
+ },
+ rangeLength = 6,
+ text = ''
+ },
+ -- undo entire deletion
+ {
+ range = {
+ ['start'] = {
+ character = 4,
+ line = 1
+ },
+ ['end'] = {
+ character = 9,
+ line = 1
+ }
+ },
+ rangeLength = 5,
+ text = "_fdsa\nhello world\n1234 asdf"
+ },
+ -- redo entire deletion
+ {
+ range = {
+ ['start'] = {
+ character = 4,
+ line = 1
+ },
+ ['end'] = {
+ character = 9,
+ line = 3
+ }
+ },
+ rangeLength = 27,
+ text = ' asdf'
+ },
+ }
+ local original_lines = {
+ "\\begin{document}",
+ "test_fdsa",
+ "hello world",
+ "1234 asdf",
+ "\\end{document}"
+ }
+ test_edit(original_lines, {"jf_vejjbhhdu<C-R>"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ end)
+
+ describe('multi-operation edits', function()
+ it('mult-line substitution', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ["end"] = {
+ character = 11,
+ line = 2 },
+ ["start"] = {
+ character = 10,
+ line = 2 } },
+ rangeLength = 1,
+ text = '',
+ },{
+ range = {
+ ["end"] = {
+ character = 10,
+ line = 2 },
+ start = {
+ character = 10,
+ line = 2 } },
+ rangeLength = 0,
+ text = '2',
+ },{
+ range = {
+ ["end"] = {
+ character = 11,
+ line = 3 },
+ ["start"] = {
+ character = 10,
+ line = 3 } },
+ rangeLength = 1,
+ text = ''
+ },{
+ range = {
+ ['end'] = {
+ character = 10,
+ line = 3 },
+ ['start'] = {
+ character = 10,
+ line = 3 } },
+ rangeLength = 0,
+ text = '3' },
+ {
+ range = {
+ ['end'] = {
+ character = 0,
+ line = 3 },
+ ['start'] = {
+ character = 12,
+ line = 2 } },
+ rangeLength = 1,
+ text = '\n'
+ }
+ }
+ local original_lines = {
+ "\\begin{document}",
+ "\\section*{1}",
+ "\\section*{1}",
+ "\\section*{1}",
+ "\\end{document}"
+ }
+ test_edit(original_lines, {"3gg$h<C-V>jg<C-A>"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('join and undo', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 11,
+ line = 0
+ },
+ ['end'] = {
+ character = 11,
+ line = 0
+ }
+ },
+ rangeLength = 0,
+ text = ' test3'
+ },{
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
+ },
+ ['end'] = {
+ character = 0,
+ line = 2
+ }
+ },
+ rangeLength = 6,
+ text = ''
+ },{
+ range = {
+ ['start'] = {
+ character = 11,
+ line = 0
+ },
+ ['end'] = {
+ character = 17,
+ line = 0
+ }
+ },
+ rangeLength = 6,
+ text = '\ntest3'
+ },
+ }
+ test_edit({"test1 test2", "test3"}, {"J", "u"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ end)
+
describe('multi-byte edits', function()
it('deleting a multibyte character', function()
local expected_text_changes = {
@@ -231,7 +492,105 @@ describe('incremental synchronization', function()
}
test_edit({"🔥"}, {"x"}, expected_text_changes, 'utf-16', '\n')
end)
- it('deleting a multiple lines containing multibyte characters', function()
+ it('replacing a multibyte character with matching prefix', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
+ },
+ ['end'] = {
+ character = 1,
+ line = 1
+ }
+ },
+ rangeLength = 1,
+ text = '⟩'
+ }
+ }
+ -- ⟨ is e29fa8, ⟩ is e29fa9
+ local original_lines = {
+ "\\begin{document}",
+ "⟨",
+ "\\end{document}",
+ }
+ test_edit(original_lines, {"jr⟩"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('replacing a multibyte character with matching suffix', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
+ },
+ ['end'] = {
+ character = 1,
+ line = 1
+ }
+ },
+ rangeLength = 1,
+ text = 'ḟ'
+ }
+ }
+ -- ฟ is e0b89f, ḟ is e1b89f
+ local original_lines = {
+ "\\begin{document}",
+ "ฟ",
+ "\\end{document}",
+ }
+ test_edit(original_lines, {"jrḟ"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('inserting before a multibyte character', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 0,
+ line = 1
+ },
+ ['end'] = {
+ character = 0,
+ line = 1
+ }
+ },
+ rangeLength = 0,
+ text = ' '
+ }
+ }
+ local original_lines = {
+ "\\begin{document}",
+ "→",
+ "\\end{document}",
+ }
+ test_edit(original_lines, {"ji "}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('deleting a multibyte character from a long line', function()
+ local expected_text_changes = {
+ {
+ range = {
+ ['start'] = {
+ character = 85,
+ line = 1
+ },
+ ['end'] = {
+ character = 86,
+ line = 1
+ }
+ },
+ rangeLength = 1,
+ text = ''
+ }
+ }
+ local original_lines = {
+ "\\begin{document}",
+ "→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→→",
+ "\\end{document}",
+ }
+ test_edit(original_lines, {"jx"}, expected_text_changes, 'utf-16', '\n')
+ end)
+ it('deleting multiple lines containing multibyte characters', function()
local expected_text_changes = {
{
range = {
diff --git a/test/functional/plugin/lsp_spec.lua b/test/functional/plugin/lsp_spec.lua
index 228fc06e9b..b12d4227d5 100644
--- a/test/functional/plugin/lsp_spec.lua
+++ b/test/functional/plugin/lsp_spec.lua
@@ -66,7 +66,10 @@ local function fake_lsp_server_setup(test_name, timeout_ms, options)
end
end;
});
- root_dir = vim.loop.cwd();
+ workspace_folders = {{
+ uri = 'file://' .. vim.loop.cwd(),
+ name = 'test_folder',
+ }};
on_init = function(client, result)
TEST_RPC_CLIENT = client
vim.rpcrequest(1, "init", result)
@@ -153,7 +156,10 @@ describe('LSP', function()
"-c", string.format("lua TEST_NAME = %q", test_name),
"-c", "luafile "..fixture_filename;
};
- root_dir = vim.loop.cwd();
+ workspace_folders = {{
+ uri = 'file://' .. vim.loop.cwd(),
+ name = 'test_folder',
+ }};
}
end
TEST_CLIENT1 = test__start_client()
diff --git a/test/functional/terminal/buffer_spec.lua b/test/functional/terminal/buffer_spec.lua
index 7dcca231ee..f25cfa2039 100644
--- a/test/functional/terminal/buffer_spec.lua
+++ b/test/functional/terminal/buffer_spec.lua
@@ -6,9 +6,11 @@ local poke_eventloop = helpers.poke_eventloop
local eval, feed_command, source = helpers.eval, helpers.feed_command, helpers.source
local eq, neq = helpers.eq, helpers.neq
local write_file = helpers.write_file
-local command= helpers.command
+local command = helpers.command
local exc_exec = helpers.exc_exec
local matches = helpers.matches
+local exec_lua = helpers.exec_lua
+local sleep = helpers.sleep
describe(':terminal buffer', function()
local screen
@@ -328,3 +330,37 @@ describe('No heap-buffer-overflow when', function()
assert_alive()
end)
end)
+
+describe('on_lines does not emit out-of-bounds line indexes when', function()
+ before_each(function()
+ clear()
+ exec_lua([[
+ function _G.register_callback(bufnr)
+ _G.cb_error = ''
+ vim.api.nvim_buf_attach(bufnr, false, {
+ on_lines = function(_, bufnr, _, firstline, _, _)
+ local status, msg = pcall(vim.api.nvim_buf_get_offset, bufnr, firstline)
+ if not status then
+ _G.cb_error = msg
+ end
+ end
+ })
+ end
+ ]])
+ end)
+
+ it('creating a terminal buffer #16394', function()
+ feed_command([[autocmd TermOpen * ++once call v:lua.register_callback(expand("<abuf>"))]])
+ feed_command('terminal')
+ sleep(500)
+ eq('', exec_lua([[return _G.cb_error]]))
+ end)
+
+ it('deleting a terminal buffer #16394', function()
+ feed_command('terminal')
+ sleep(500)
+ feed_command('lua _G.register_callback(0)')
+ feed_command('bdelete!')
+ eq('', exec_lua([[return _G.cb_error]]))
+ end)
+end)
diff --git a/test/functional/terminal/cursor_spec.lua b/test/functional/terminal/cursor_spec.lua
index 8d70ebf679..e9495f45a2 100644
--- a/test/functional/terminal/cursor_spec.lua
+++ b/test/functional/terminal/cursor_spec.lua
@@ -3,6 +3,8 @@ local Screen = require('test.functional.ui.screen')
local thelpers = require('test.functional.terminal.helpers')
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
local nvim_dir, command = helpers.nvim_dir, helpers.command
+local nvim_prog = helpers.nvim_prog
+local eq, eval = helpers.eq, helpers.eval
local feed_command = helpers.feed_command
local hide_cursor = thelpers.hide_cursor
local show_cursor = thelpers.show_cursor
@@ -173,3 +175,705 @@ describe('cursor with customized highlighting', function()
end)
end)
+describe('buffer cursor position is correct in terminal without number column', function()
+ local screen
+
+ local function setup_ex_register(str)
+ screen = thelpers.screen_setup(0, '["'..nvim_prog
+ ..[[", "-u", "NONE", "-i", "NONE", "-E", "--cmd", "let @r = ']]..str..[['", ]]
+ -- <Left> and <Right> don't always work
+ ..[["--cmd", "cnoremap <C-X> <Left>", "--cmd", "cnoremap <C-O> <Right>"]]..']', 70)
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ end
+
+ before_each(clear)
+
+ describe('in a line with no multibyte characters or trailing spaces,', function()
+ before_each(function()
+ setup_ex_register('aaaaaaaa')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :aaaaaaaa{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 9}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :aaaaaaa^a{2: } |
+ |
+ ]])
+ eq({6, 8}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :aaaaaa{1:a}a |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 7}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :aaaaa^a{2:a}a |
+ |
+ ]])
+ eq({6, 6}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :a{1:a}aaaaaa |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 2}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :^a{2:a}aaaaaa |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+
+ describe('in a line with single-cell multibyte characters and no trailing spaces,', function()
+ before_each(function()
+ setup_ex_register('µµµµµµµµ')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µµµµµµµµ{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 17}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µµµµµµµ^µ{2: } |
+ |
+ ]])
+ eq({6, 15}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µµµµµµ{1:µ}µ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 13}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µµµµµ^µ{2:µ}µ |
+ |
+ ]])
+ eq({6, 11}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µ{1:µ}µµµµµµ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 3}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :^µ{2:µ}µµµµµµ |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+
+ describe('in a line with single-cell composed multibyte characters and no trailing spaces,', function()
+ if helpers.pending_win32(pending) then return end -- These tests fail on Windows. Encoding problem?
+
+ before_each(function()
+ setup_ex_register('µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 33}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µ̳µ̳µ̳µ̳µ̳µ̳µ̳^µ̳{2: } |
+ |
+ ]])
+ eq({6, 29}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µ̳µ̳µ̳µ̳µ̳µ̳{1:µ̳}µ̳ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 25}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µ̳µ̳µ̳µ̳µ̳^µ̳{2:µ̳}µ̳ |
+ |
+ ]])
+ eq({6, 21}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :µ̳{1:µ̳}µ̳µ̳µ̳µ̳µ̳µ̳ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 5}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :^µ̳{2:µ̳}µ̳µ̳µ̳µ̳µ̳µ̳ |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+
+ describe('in a line with double-cell multibyte characters and no trailing spaces,', function()
+ if helpers.pending_win32(pending) then return end -- These tests fail on Windows. Encoding problem?
+
+ before_each(function()
+ setup_ex_register('哦哦哦哦哦哦哦哦')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :哦哦哦哦哦哦哦哦{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 25}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :哦哦哦哦哦哦哦^哦{2: } |
+ |
+ ]])
+ eq({6, 22}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :哦哦哦哦哦哦{1:哦}哦 |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 19}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :哦哦哦哦哦^哦{2:哦}哦 |
+ |
+ ]])
+ eq({6, 16}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :哦{1:哦}哦哦哦哦哦哦 |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 4}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ |
+ |
+ |
+ |
+ Entering Ex mode. Type "visual" to go to Normal mode. |
+ :^哦{2:哦}哦哦哦哦哦哦 |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+end)
+
+describe('buffer cursor position is correct in terminal with number column', function()
+ local screen
+
+ local function setup_ex_register(str)
+ screen = thelpers.screen_setup(0, '["'..nvim_prog
+ ..[[", "-u", "NONE", "-i", "NONE", "-E", "--cmd", "let @r = ']]..str..[['", ]]
+ -- <Left> and <Right> don't always work
+ ..[["--cmd", "cnoremap <C-X> <Left>", "--cmd", "cnoremap <C-O> <Right>"]]..']', 70)
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ end
+
+ before_each(function()
+ clear()
+ command('set number')
+ end)
+
+ describe('in a line with no multibyte characters or trailing spaces,', function()
+ before_each(function()
+ setup_ex_register('aaaaaaaa')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:aaaaaaaa{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 9}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:aaaaaaa^a{2: } |
+ |
+ ]])
+ eq({6, 8}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:aaaaaa{1:a}a |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 7}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:aaaaa^a{2:a}a |
+ |
+ ]])
+ eq({6, 6}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:a{1:a}aaaaaa |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 2}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:^a{2:a}aaaaaa |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+
+ describe('in a line with single-cell multibyte characters and no trailing spaces,', function()
+ before_each(function()
+ setup_ex_register('µµµµµµµµ')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µµµµµµµµ{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 17}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µµµµµµµ^µ{2: } |
+ |
+ ]])
+ eq({6, 15}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µµµµµµ{1:µ}µ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 13}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µµµµµ^µ{2:µ}µ |
+ |
+ ]])
+ eq({6, 11}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µ{1:µ}µµµµµµ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 3}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:^µ{2:µ}µµµµµµ |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+
+ describe('in a line with single-cell composed multibyte characters and no trailing spaces,', function()
+ if helpers.pending_win32(pending) then return end -- These tests fail on Windows. Encoding problem?
+
+ before_each(function()
+ setup_ex_register('µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µ̳µ̳µ̳µ̳µ̳µ̳µ̳µ̳{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 33}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µ̳µ̳µ̳µ̳µ̳µ̳µ̳^µ̳{2: } |
+ |
+ ]])
+ eq({6, 29}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µ̳µ̳µ̳µ̳µ̳µ̳{1:µ̳}µ̳ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 25}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µ̳µ̳µ̳µ̳µ̳^µ̳{2:µ̳}µ̳ |
+ |
+ ]])
+ eq({6, 21}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:µ̳{1:µ̳}µ̳µ̳µ̳µ̳µ̳µ̳ |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 5}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:^µ̳{2:µ̳}µ̳µ̳µ̳µ̳µ̳µ̳ |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+
+ describe('in a line with double-cell multibyte characters and no trailing spaces,', function()
+ if helpers.pending_win32(pending) then return end -- These tests fail on Windows. Encoding problem?
+
+ before_each(function()
+ setup_ex_register('哦哦哦哦哦哦哦哦')
+ end)
+
+ it('at the end', function()
+ feed('<C-R>r')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:哦哦哦哦哦哦哦哦{1: } |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 25}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:哦哦哦哦哦哦哦^哦{2: } |
+ |
+ ]])
+ eq({6, 22}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the end', function()
+ feed('<C-R>r<C-X><C-X>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:哦哦哦哦哦哦{1:哦}哦 |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 19}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:哦哦哦哦哦^哦{2:哦}哦 |
+ |
+ ]])
+ eq({6, 16}, eval('nvim_win_get_cursor(0)'))
+ end)
+
+ it('near the start', function()
+ feed('<C-R>r<C-B><C-O>')
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:哦{1:哦}哦哦哦哦哦哦 |
+ {3:-- TERMINAL --} |
+ ]])
+ eq({6, 4}, eval('nvim_win_get_cursor(0)'))
+ feed([[<C-\><C-N>]])
+ screen:expect([[
+ {7: 1 } |
+ {7: 2 } |
+ {7: 3 } |
+ {7: 4 } |
+ {7: 5 }Entering Ex mode. Type "visual" to go to Normal mode. |
+ {7: 6 }:^哦{2:哦}哦哦哦哦哦哦 |
+ |
+ ]])
+ eq({6, 1}, eval('nvim_win_get_cursor(0)'))
+ end)
+ end)
+end)
diff --git a/test/functional/terminal/scrollback_spec.lua b/test/functional/terminal/scrollback_spec.lua
index b932c58430..11bdc73a47 100644
--- a/test/functional/terminal/scrollback_spec.lua
+++ b/test/functional/terminal/scrollback_spec.lua
@@ -12,6 +12,8 @@ local curbufmeths = helpers.curbufmeths
local nvim = helpers.nvim
local feed_data = thelpers.feed_data
local pcall_err = helpers.pcall_err
+local exec_lua = helpers.exec_lua
+local assert_alive = helpers.assert_alive
describe(':terminal scrollback', function()
local screen
@@ -527,3 +529,71 @@ describe("'scrollback' option", function()
end)
end)
+
+describe("pending scrollback line handling", function()
+ local screen
+
+ before_each(function()
+ clear()
+ screen = Screen.new(30, 7)
+ screen:attach()
+ screen:set_default_attr_ids {
+ [1] = {foreground = Screen.colors.Brown},
+ [2] = {reverse = true},
+ [3] = {bold = true},
+ }
+ end)
+
+ it("does not crash after setting 'number' #14891", function()
+ exec_lua [[
+ local a = vim.api
+ local buf = a.nvim_create_buf(true, true)
+ local chan = a.nvim_open_term(buf, {})
+ a.nvim_win_set_option(0, "number", true)
+ a.nvim_chan_send(chan, ("a\n"):rep(11) .. "a")
+ a.nvim_win_set_buf(0, buf)
+ ]]
+ screen:expect [[
+ {1: 1 }^a |
+ {1: 2 } a |
+ {1: 3 } a |
+ {1: 4 } a |
+ {1: 5 } a |
+ {1: 6 } a |
+ |
+ ]]
+ feed('G')
+ screen:expect [[
+ {1: 7 } a |
+ {1: 8 } a |
+ {1: 9 } a |
+ {1: 10 } a |
+ {1: 11 } a |
+ {1: 12 } ^a |
+ |
+ ]]
+ assert_alive()
+ end)
+
+ it("does not crash after nvim_buf_call #14891", function()
+ exec_lua [[
+ local a = vim.api
+ local bufnr = a.nvim_create_buf(false, true)
+ a.nvim_buf_call(bufnr, function()
+ vim.fn.termopen({"echo", ("hi\n"):rep(11)})
+ end)
+ a.nvim_win_set_buf(0, bufnr)
+ vim.cmd("startinsert")
+ ]]
+ screen:expect [[
+ hi |
+ hi |
+ hi |
+ |
+ |
+ [Process exited 0]{2: } |
+ {3:-- TERMINAL --} |
+ ]]
+ assert_alive()
+ end)
+end)
diff --git a/test/functional/terminal/tui_spec.lua b/test/functional/terminal/tui_spec.lua
index 6b9586b4de..bf57b135cb 100644
--- a/test/functional/terminal/tui_spec.lua
+++ b/test/functional/terminal/tui_spec.lua
@@ -20,6 +20,7 @@ local nvim_prog = helpers.nvim_prog
local nvim_set = helpers.nvim_set
local ok = helpers.ok
local read_file = helpers.read_file
+local exec_lua = helpers.exec_lua
if helpers.pending_win32(pending) then return end
@@ -580,21 +581,34 @@ describe('TUI', function()
end)
it("paste: 'nomodifiable' buffer", function()
+ local has_luajit = exec_lua('return jit ~= nil')
child_session:request('nvim_command', 'set nomodifiable')
child_session:request('nvim_exec_lua', [[
-- Stack traces for this test are non-deterministic, so disable them
_G.debug.traceback = function(msg) return msg end
]], {})
feed_data('\027[200~fail 1\nfail 2\n\027[201~')
- screen:expect{grid=[[
- |
- {4:~ }|
- {5: }|
- {8:paste: Error executing lua: vim.lua:243: Vim:E21: }|
- {8:Cannot make changes, 'modifiable' is off} |
- {10:Press ENTER or type command to continue}{1: } |
- {3:-- TERMINAL --} |
- ]]}
+ if has_luajit then
+ screen:expect{grid=[[
+ |
+ {4:~ }|
+ {5: }|
+ {8:paste: Error executing lua: vim.lua:0: Vim:E21: Ca}|
+ {8:nnot make changes, 'modifiable' is off} |
+ {10:Press ENTER or type command to continue}{1: } |
+ {3:-- TERMINAL --} |
+ ]]}
+ else
+ screen:expect{grid=[[
+ |
+ {4:~ }|
+ {5: }|
+ {8:paste: Error executing lua: Vim:E21: Cannot make c}|
+ {8:hanges, 'modifiable' is off} |
+ {10:Press ENTER or type command to continue}{1: } |
+ {3:-- TERMINAL --} |
+ ]]}
+ end
feed_data('\n') -- <Enter>
child_session:request('nvim_command', 'set modifiable')
feed_data('\027[200~success 1\nsuccess 2\n\027[201~')
@@ -677,8 +691,8 @@ describe('TUI', function()
item 2997 |
item 2998 |
item 2999 |
- item 3000 en{1:d} |
- {5:[No Name] [+] 3000,13 Bot}|
+ item 3000 en{1:d}d |
+ {5:[No Name] [+] 5999,13 Bot}|
|
{3:-- TERMINAL --} |
]])
@@ -765,6 +779,44 @@ describe('TUI', function()
]])
end)
+ it('paste: streamed paste with isolated "stop paste" code', function()
+ child_session:request('nvim_exec_lua', [[
+ _G.paste_phases = {}
+ vim.paste = (function(overridden)
+ return function(lines, phase)
+ table.insert(_G.paste_phases, phase)
+ overridden(lines, phase)
+ end
+ end)(vim.paste)
+ ]], {})
+ feed_data('i')
+ feed_data('\027[200~pasted') -- phase 1
+ screen:expect([[
+ pasted{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+ feed_data(' from terminal') -- phase 2
+ screen:expect([[
+ pasted from terminal{1: } |
+ {4:~ }|
+ {4:~ }|
+ {4:~ }|
+ {5:[No Name] [+] }|
+ {3:-- INSERT --} |
+ {3:-- TERMINAL --} |
+ ]])
+ -- Send isolated "stop paste" sequence.
+ feed_data('\027[201~') -- phase 3
+ screen:expect_unchanged()
+ local _, rv = child_session:request('nvim_exec_lua', [[return _G.paste_phases]], {})
+ eq({1, 2, 3}, rv)
+ end)
+
it('allows termguicolors to be set at runtime', function()
screen:set_option('rgb', true)
screen:set_default_attr_ids({
diff --git a/test/functional/treesitter/parser_spec.lua b/test/functional/treesitter/parser_spec.lua
index ffaa4141c4..911fa017ab 100644
--- a/test/functional/treesitter/parser_spec.lua
+++ b/test/functional/treesitter/parser_spec.lua
@@ -227,15 +227,52 @@ void ui_refresh(void)
}, res)
end)
+ it('supports getting text of multiline node', function()
+ if pending_c_parser(pending) then return end
+ insert(test_text)
+ local res = exec_lua([[
+ local parser = vim.treesitter.get_parser(0, "c")
+ local tree = parser:parse()[1]
+ return vim.treesitter.get_node_text(tree:root(), 0)
+ ]])
+ eq(test_text, res)
+
+ local res2 = exec_lua([[
+ local parser = vim.treesitter.get_parser(0, "c")
+ local root = parser:parse()[1]:root()
+ return vim.treesitter.get_node_text(root:child(0):child(0), 0)
+ ]])
+ eq('void', res2)
+ end)
+
+ it('support getting text where start of node is past EOF', function()
+ local text = [[
+def run
+ a = <<~E
+end]]
+ insert(text)
+ local result = exec_lua([[
+ local fake_node = {}
+ function fake_node:start()
+ return 3, 0, 23
+ end
+ function fake_node:end_()
+ return 3, 0, 23
+ end
+ return vim.treesitter.get_node_text(fake_node, 0) == nil
+ ]])
+ eq(true, result)
+ end)
+
it('can match special regex characters like \\ * + ( with `vim-match?`', function()
insert('char* astring = "\\n"; (1 + 1) * 2 != 2;')
local res = exec_lua([[
- cquery = vim.treesitter.parse_query("c", '((_) @plus (vim-match? @plus "^\\\\+$"))'..
- '((_) @times (vim-match? @times "^\\\\*$"))'..
- '((_) @paren (vim-match? @paren "^\\\\($"))'..
- '((_) @escape (vim-match? @escape "^\\\\\\\\n$"))'..
- '((_) @string (vim-match? @string "^\\"\\\\\\\\n\\"$"))')
+ cquery = vim.treesitter.parse_query("c", '([_] @plus (#vim-match? @plus "^\\\\+$"))'..
+ '([_] @times (#vim-match? @times "^\\\\*$"))'..
+ '([_] @paren (#vim-match? @paren "^\\\\($"))'..
+ '([_] @escape (#vim-match? @escape "^\\\\\\\\n$"))'..
+ '([_] @string (#vim-match? @string "^\\"\\\\\\\\n\\"$"))')
parser = vim.treesitter.get_parser(0, "c")
tree = parser:parse()[1]
res = {}
@@ -321,7 +358,7 @@ void ui_refresh(void)
insert('char* astring = "Hello World!";')
local res = exec_lua([[
- cquery = vim.treesitter.parse_query("c", '((_) @quote (vim-match? @quote "^\\"$")) ((_) @quote (lua-match? @quote "^\\"$"))')
+ cquery = vim.treesitter.parse_query("c", '([_] @quote (#vim-match? @quote "^\\"$")) ([_] @quote (#lua-match? @quote "^\\"$"))')
parser = vim.treesitter.get_parser(0, "c")
tree = parser:parse()[1]
res = {}
diff --git a/test/functional/ui/cursor_spec.lua b/test/functional/ui/cursor_spec.lua
index 9c035c728b..03cd4bfd06 100644
--- a/test/functional/ui/cursor_spec.lua
+++ b/test/functional/ui/cursor_spec.lua
@@ -212,10 +212,10 @@ describe('ui/cursor', function()
if m.blinkwait then m.blinkwait = 700 end
end
if m.hl_id then
- m.hl_id = 58
+ m.hl_id = 60
m.attr = {background = Screen.colors.DarkGray}
end
- if m.id_lm then m.id_lm = 59 end
+ if m.id_lm then m.id_lm = 61 end
end
-- Assert the new expectation.
diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua
index dce6384b9b..1575cab591 100644
--- a/test/functional/ui/decorations_spec.lua
+++ b/test/functional/ui/decorations_spec.lua
@@ -1031,6 +1031,69 @@ if (h->n_buckets < new_n_buckets) { // expand
|
]]}
+ screen:try_resize(50, 11)
+ feed('gg')
+ screen:expect{grid=[[
+ ^if (h->n_buckets < new_n_buckets) { // expand |
+ khkey_t *new_keys = (khkey_t *)krealloc((void *)|
+ h->keys, new_n_buckets * sizeof(khkey_t)); |
+ h->keys = new_keys; |
+ if (kh_is_map && val_size) { |
+ char *new_vals = krealloc( h->vals_buf, new_n_|
+ buckets * val_size); |
+ h->vals_buf = new_vals; |
+ } |
+ } |
+ |
+ ]]}
+
+ feed('G<C-E>')
+ screen:expect{grid=[[
+ khkey_t *new_keys = (khkey_t *)krealloc((void *)|
+ h->keys, new_n_buckets * sizeof(khkey_t)); |
+ h->keys = new_keys; |
+ if (kh_is_map && val_size) { |
+ char *new_vals = krealloc( h->vals_buf, new_n_|
+ buckets * val_size); |
+ h->vals_buf = new_vals; |
+ } |
+ ^} |
+ Grugg |
+ |
+ ]]}
+
+ feed('gg')
+ screen:expect{grid=[[
+ ^if (h->n_buckets < new_n_buckets) { // expand |
+ khkey_t *new_keys = (khkey_t *)krealloc((void *)|
+ h->keys, new_n_buckets * sizeof(khkey_t)); |
+ h->keys = new_keys; |
+ if (kh_is_map && val_size) { |
+ char *new_vals = krealloc( h->vals_buf, new_n_|
+ buckets * val_size); |
+ h->vals_buf = new_vals; |
+ } |
+ } |
+ |
+ ]]}
+
+ screen:try_resize(50, 12)
+ feed('G')
+ screen:expect{grid=[[
+ if (h->n_buckets < new_n_buckets) { // expand |
+ khkey_t *new_keys = (khkey_t *)krealloc((void *)|
+ h->keys, new_n_buckets * sizeof(khkey_t)); |
+ h->keys = new_keys; |
+ if (kh_is_map && val_size) { |
+ char *new_vals = krealloc( h->vals_buf, new_n_|
+ buckets * val_size); |
+ h->vals_buf = new_vals; |
+ } |
+ ^} |
+ Grugg |
+ |
+ ]]}
+
meths.buf_del_extmark(0, ns, id)
screen:expect{grid=[[
if (h->n_buckets < new_n_buckets) { // expand |
diff --git a/test/functional/ui/diff_spec.lua b/test/functional/ui/diff_spec.lua
index 13949b0756..bd2692d19a 100644
--- a/test/functional/ui/diff_spec.lua
+++ b/test/functional/ui/diff_spec.lua
@@ -186,6 +186,19 @@ describe('Diff mode screen', function()
{7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
:set diffopt+=internal |
]])
+
+ screen:try_resize(40, 9)
+ screen:expect([[
+ {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
+ {1: }5 {3:│}{1: }5 |
+ {1: }6 {3:│}{1: }6 |
+ {1: }7 {3:│}{1: }7 |
+ {1: }8 {3:│}{1: }8 |
+ {1: }9 {3:│}{1: }9 |
+ {1: }10 {3:│}{1: }10 |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
end)
it('Add a line at the end of file 1', function()
@@ -232,6 +245,19 @@ describe('Diff mode screen', function()
{7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
:set diffopt+=internal |
]])
+
+ screen:try_resize(40, 9)
+ screen:expect([[
+ {1:+ }{5:^+-- 4 lines: 1···}{3:│}{1:+ }{5:+-- 4 lines: 1··}|
+ {1: }5 {3:│}{1: }5 |
+ {1: }6 {3:│}{1: }6 |
+ {1: }7 {3:│}{1: }7 |
+ {1: }8 {3:│}{1: }8 |
+ {1: }9 {3:│}{1: }9 |
+ {1: }10 {3:│}{1: }10 |
+ {7:<onal-diff-screen-1 }{3:<l-diff-screen-1.2 }|
+ |
+ ]])
end)
it('Add a line in the middle of file 2, remove on at the end of file 1', function()
diff --git a/test/functional/ui/fold_spec.lua b/test/functional/ui/fold_spec.lua
index 249686234c..3e0e15c2b7 100644
--- a/test/functional/ui/fold_spec.lua
+++ b/test/functional/ui/fold_spec.lua
@@ -41,6 +41,7 @@ describe("folded lines", function()
[9] = {bold = true, foreground = Screen.colors.Brown},
[10] = {background = Screen.colors.LightGrey, underline = true},
[11] = {bold=true},
+ [12] = {background = Screen.colors.Grey90},
})
end)
@@ -84,6 +85,117 @@ describe("folded lines", function()
end
end)
+ it("highlights with CursorLineFold when 'cursorline' is set", function()
+ command("set cursorline foldcolumn=2 foldmethod=marker")
+ command("hi link CursorLineFold Search")
+ insert(content1)
+ feed("zf3j")
+ if multigrid then
+ screen:expect([[
+ ## grid 1
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [3:---------------------------------------------]|
+ ## grid 2
+ {7: }This is a |
+ {7: }valid English |
+ {7: }sentence composed by |
+ {7: }an exhausted developer |
+ {7: }in his cave. |
+ {6: }{12:^ }|
+ {1:~ }|
+ ## grid 3
+ |
+ ]])
+ else
+ screen:expect([[
+ {7: }This is a |
+ {7: }valid English |
+ {7: }sentence composed by |
+ {7: }an exhausted developer |
+ {7: }in his cave. |
+ {6: }{12:^ }|
+ {1:~ }|
+ |
+ ]])
+ end
+ feed("k")
+ if multigrid then
+ screen:expect([[
+ ## grid 1
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [3:---------------------------------------------]|
+ ## grid 2
+ {7: }This is a |
+ {7: }valid English |
+ {7: }sentence composed by |
+ {7: }an exhausted developer |
+ {6: }{12:^in his cave. }|
+ {7: } |
+ {1:~ }|
+ ## grid 3
+ |
+ ]])
+ else
+ screen:expect([[
+ {7: }This is a |
+ {7: }valid English |
+ {7: }sentence composed by |
+ {7: }an exhausted developer |
+ {6: }{12:^in his cave. }|
+ {7: } |
+ {1:~ }|
+ |
+ ]])
+ end
+ command("set cursorlineopt=line")
+ if multigrid then
+ screen:expect([[
+ ## grid 1
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [2:---------------------------------------------]|
+ [3:---------------------------------------------]|
+ ## grid 2
+ {7: }This is a |
+ {7: }valid English |
+ {7: }sentence composed by |
+ {7: }an exhausted developer |
+ {7: }{12:^in his cave. }|
+ {7: } |
+ {1:~ }|
+ ## grid 3
+ |
+ ]])
+ else
+ screen:expect([[
+ {7: }This is a |
+ {7: }valid English |
+ {7: }sentence composed by |
+ {7: }an exhausted developer |
+ {7: }{12:^in his cave. }|
+ {7: } |
+ {1:~ }|
+ |
+ ]])
+ end
+ end)
+
it("highlighting with relative line numbers", function()
command("set relativenumber cursorline cursorlineopt=number foldmethod=marker")
feed_command("set foldcolumn=2")
diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua
index c00d30fe32..0983d0d4ad 100644
--- a/test/functional/ui/highlight_spec.lua
+++ b/test/functional/ui/highlight_spec.lua
@@ -276,6 +276,24 @@ describe('highlight defaults', function()
]], {[0] = {bold=true, foreground=Screen.colors.Blue}})
end)
+ it('linking updates window highlight immediately #16552', function()
+ screen:try_resize(53, 4)
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ |
+ ]], {[0] = {bold=true, foreground=Screen.colors.Blue}})
+ feed_command("hi NonTextAlt guifg=Red")
+ feed_command("hi! link NonText NonTextAlt")
+ screen:expect([[
+ ^ |
+ {0:~ }|
+ {0:~ }|
+ :hi! link NonText NonTextAlt |
+ ]], {[0] = {foreground=Screen.colors.Red}})
+ end)
+
it('Cursor after `:hi clear|syntax reset` #6508', function()
command('highlight clear|syntax reset')
eq('guifg=bg guibg=fg', eval([[matchstr(execute('hi Cursor'), '\v(gui|cterm).*$')]]))
diff --git a/test/functional/ui/sign_spec.lua b/test/functional/ui/sign_spec.lua
index 741b93043d..dcd31cfdb7 100644
--- a/test/functional/ui/sign_spec.lua
+++ b/test/functional/ui/sign_spec.lua
@@ -157,6 +157,99 @@ describe('Signs', function()
]])
end)
+ it('higlights the cursorline sign with culhl', function()
+ feed('ia<cr>b<cr>c<esc>')
+ command('sign define piet text=>> texthl=Search culhl=ErrorMsg')
+ command('sign place 1 line=1 name=piet buffer=1')
+ command('sign place 2 line=2 name=piet buffer=1')
+ command('sign place 3 line=3 name=piet buffer=1')
+ command('set cursorline')
+ screen:expect([[
+ {1:>>}a |
+ {1:>>}b |
+ {8:>>}{3:^c }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ feed('k')
+ screen:expect([[
+ {1:>>}a |
+ {8:>>}{3:^b }|
+ {1:>>}c |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ command('set nocursorline')
+ screen:expect([[
+ {1:>>}a |
+ {1:>>}^b |
+ {1:>>}c |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ command('set cursorline cursorlineopt=line')
+ screen:expect([[
+ {1:>>}a |
+ {1:>>}{3:^b }|
+ {1:>>}c |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ command('set cursorlineopt=number')
+ screen:expect([[
+ {1:>>}a |
+ {8:>>}^b |
+ {1:>>}c |
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ {0:~ }|
+ |
+ ]])
+ end)
+
it('multiple signs #9295', function()
feed('ia<cr>b<cr>c<cr><esc>')
command('set number')
diff --git a/test/functional/vimscript/screenpos_spec.lua b/test/functional/vimscript/screenpos_spec.lua
new file mode 100644
index 0000000000..75e5c02298
--- /dev/null
+++ b/test/functional/vimscript/screenpos_spec.lua
@@ -0,0 +1,51 @@
+local helpers = require('test.functional.helpers')(after_each)
+local clear, eq, meths = helpers.clear, helpers.eq, helpers.meths
+local command, funcs = helpers.command, helpers.funcs
+
+before_each(clear)
+
+describe('screenpos() function', function()
+ it('works in floating window with border', function()
+ local bufnr = meths.create_buf(false, true)
+ local opts = {
+ relative='editor',
+ height=8,
+ width=12,
+ row=6,
+ col=8,
+ anchor='NW',
+ style='minimal',
+ border='none',
+ focusable=1
+ }
+ local float = meths.open_win(bufnr, false, opts)
+ command('redraw')
+ local pos = funcs.screenpos(bufnr, 1, 1)
+ eq(7, pos.row)
+ eq(9, pos.col)
+
+ -- only left border
+ opts.border = {'', '', '', '', '', '', '', '|'}
+ meths.win_set_config(float, opts)
+ command('redraw')
+ pos = funcs.screenpos(bufnr, 1, 1)
+ eq(7, pos.row)
+ eq(10, pos.col)
+
+ -- only top border
+ opts.border = {'', '_', '', '', '', '', '', ''}
+ meths.win_set_config(float, opts)
+ command('redraw')
+ pos = funcs.screenpos(bufnr, 1, 1)
+ eq(8, pos.row)
+ eq(9, pos.col)
+
+ -- both left and top border
+ opts.border = 'single'
+ meths.win_set_config(float, opts)
+ command('redraw')
+ pos = funcs.screenpos(bufnr, 1, 1)
+ eq(8, pos.row)
+ eq(10, pos.col)
+ end)
+end)
diff --git a/test/functional/vimscript/timer_spec.lua b/test/functional/vimscript/timer_spec.lua
index 9ee0735e40..e45b64422f 100644
--- a/test/functional/vimscript/timer_spec.lua
+++ b/test/functional/vimscript/timer_spec.lua
@@ -3,6 +3,7 @@ local Screen = require('test.functional.ui.screen')
local feed, eq, eval, ok = helpers.feed, helpers.eq, helpers.eval, helpers.ok
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
local clear, command, funcs = helpers.clear, helpers.command, helpers.funcs
+local exc_exec = helpers.exc_exec
local curbufmeths = helpers.curbufmeths
local load_adjust = helpers.load_adjust
local retry = helpers.retry
@@ -262,4 +263,13 @@ describe('timers', function()
eq(2, eval('g:val'))
end)
+
+ it("timer_start can't be used in the sandbox", function()
+ source [[
+ function! Scary(timer) abort
+ call execute('echo ''execute() should be disallowed''', '')
+ endfunction
+ ]]
+ eq("Vim(call):E48: Not allowed in sandbox", exc_exec("sandbox call timer_start(0, 'Scary')"))
+ end)
end)
diff --git a/test/helpers.lua b/test/helpers.lua
index 09b113c01d..87431e4342 100644
--- a/test/helpers.lua
+++ b/test/helpers.lua
@@ -741,9 +741,20 @@ function module.read_file_list(filename, start)
if not file then
return nil
end
+
+ -- There is no need to read more than the last 2MB of the log file, so seek
+ -- to that.
+ local file_size = file:seek("end")
+ local offset = file_size - 2000000
+ if offset < 0 then
+ offset = 0
+ end
+ file:seek("set", offset)
+
local lines = {}
local i = 1
- for line in file:lines() do
+ local line = file:read("*l")
+ while line ~= nil do
if i >= start then
table.insert(lines, line)
if #lines > maxlines then
@@ -751,6 +762,7 @@ function module.read_file_list(filename, start)
end
end
i = i + 1
+ line = file:read("*l")
end
file:close()
return lines
diff --git a/test/unit/os/shell_spec.lua b/test/unit/os/shell_spec.lua
index a73fc8e47e..29a2b78491 100644
--- a/test/unit/os/shell_spec.lua
+++ b/test/unit/os/shell_spec.lua
@@ -4,7 +4,6 @@ local cimported = helpers.cimport(
'./src/nvim/os/shell.h',
'./src/nvim/option_defs.h',
'./src/nvim/main.h',
- './src/nvim/misc1.h',
'./src/nvim/memory.h'
)
local ffi, eq = helpers.ffi, helpers.eq
diff --git a/test/unit/path_spec.lua b/test/unit/path_spec.lua
index 41954de9be..15ce59747e 100644
--- a/test/unit/path_spec.lua
+++ b/test/unit/path_spec.lua
@@ -54,15 +54,21 @@ describe('path.c', function()
eq(lfs.currentdir(), (ffi.string(buffer)))
end)
- itp('fails if the given directory does not exist', function()
- eq(FAIL, path_full_dir_name('does_not_exist', buffer, length))
- end)
-
itp('works with a normal relative dir', function()
local result = path_full_dir_name('unit-test-directory', buffer, length)
eq(lfs.currentdir() .. '/unit-test-directory', (ffi.string(buffer)))
eq(OK, result)
end)
+
+ itp('works with a non-existing relative dir', function()
+ local result = path_full_dir_name('does-not-exist', buffer, length)
+ eq(lfs.currentdir() .. '/does-not-exist', (ffi.string(buffer)))
+ eq(OK, result)
+ end)
+
+ itp('fails with a non-existing absolute dir', function()
+ eq(FAIL, path_full_dir_name('/does_not_exist', buffer, length))
+ end)
end)
describe('path_full_compare', function()