diff options
Diffstat (limited to 'test/functional')
-rw-r--r-- | test/functional/autocmd/autocmd_spec.lua | 29 | ||||
-rw-r--r-- | test/functional/legacy/ex_mode_spec.lua | 6 | ||||
-rw-r--r-- | test/functional/lua/vim_spec.lua | 33 | ||||
-rw-r--r-- | test/functional/options/cursorbind_spec.lua | 91 | ||||
-rw-r--r-- | test/functional/treesitter/language_spec.lua | 11 | ||||
-rw-r--r-- | test/functional/ui/searchhl_spec.lua | 186 |
6 files changed, 296 insertions, 60 deletions
diff --git a/test/functional/autocmd/autocmd_spec.lua b/test/functional/autocmd/autocmd_spec.lua index 6111654b5e..90254b7415 100644 --- a/test/functional/autocmd/autocmd_spec.lua +++ b/test/functional/autocmd/autocmd_spec.lua @@ -60,6 +60,23 @@ describe('autocmd', function() eq(expected, eval('g:evs')) end) + it('first edit causes BufUnload on NoName', function() + local expected = { + {'BufUnload', ''}, + {'BufDelete', ''}, + {'BufWipeout', ''}, + {'BufEnter', 'testfile1'}, + } + command('let g:evs = []') + command('autocmd BufEnter * :call add(g:evs, ["BufEnter", expand("<afile>")])') + command('autocmd BufDelete * :call add(g:evs, ["BufDelete", expand("<afile>")])') + command('autocmd BufLeave * :call add(g:evs, ["BufLeave", expand("<afile>")])') + command('autocmd BufUnload * :call add(g:evs, ["BufUnload", expand("<afile>")])') + command('autocmd BufWipeout * :call add(g:evs, ["BufWipeout", expand("<afile>")])') + command('edit testfile1') + eq(expected, eval('g:evs')) + end) + it('WinClosed is non-recursive', function() command('let g:triggered = 0') command('autocmd WinClosed * :let g:triggered+=1 | :bdelete 2') @@ -548,18 +565,6 @@ describe('autocmd', function() neq({}, meths.get_autocmds { group = "filetypedetect" }) end) - it('should not access freed mem', function() - source [[ - au BufEnter,BufLeave,WinEnter,WinLeave 0 vs xxx - arg 0 - argadd - all - all - au! - bwipe xxx - ]] - end) - it('should allow comma-separated patterns', function() source [[ augroup TestingPatterns diff --git a/test/functional/legacy/ex_mode_spec.lua b/test/functional/legacy/ex_mode_spec.lua index 44719027a6..244b6bf00f 100644 --- a/test/functional/legacy/ex_mode_spec.lua +++ b/test/functional/legacy/ex_mode_spec.lua @@ -32,5 +32,11 @@ describe('Ex mode', function() test_ex_edit(' foo', ' foo<C-d>') test_ex_edit(' foo0', ' foo0<C-d>') test_ex_edit(' foo^', ' foo^<C-d>') + test_ex_edit('foo', '<BS><C-H><Del><kDel>foo') + -- default wildchar <Tab> interferes with this test + command('set wildchar=<c-e>') + test_ex_edit('a\tb', 'a\t\t<C-H>b') + test_ex_edit('\tm<C-T>n', '\tm<C-T>n') + command('set wildchar&') end) end) diff --git a/test/functional/lua/vim_spec.lua b/test/functional/lua/vim_spec.lua index 1547f3244e..ae6a1d5765 100644 --- a/test/functional/lua/vim_spec.lua +++ b/test/functional/lua/vim_spec.lua @@ -2755,6 +2755,39 @@ describe('vim.keymap', function() eq('\nNo mapping found', helpers.exec_capture('nmap asdf')) end) + it('works with buffer-local mappings', function() + eq(0, exec_lua [[ + GlobalCount = 0 + vim.keymap.set('n', 'asdf', function() GlobalCount = GlobalCount + 1 end, {buffer=true}) + return GlobalCount + ]]) + + feed('asdf\n') + + eq(1, exec_lua[[return GlobalCount]]) + + exec_lua [[ + vim.keymap.del('n', 'asdf', {buffer=true}) + ]] + + feed('asdf\n') + + eq(1, exec_lua[[return GlobalCount]]) + eq('\nNo mapping found', helpers.exec_capture('nmap asdf')) + end) + + it('does not mutate the opts parameter', function() + eq(true, exec_lua [[ + opts = {buffer=true} + vim.keymap.set('n', 'asdf', function() end, opts) + return opts.buffer + ]]) + eq(true, exec_lua [[ + vim.keymap.del('n', 'asdf', opts) + return opts.buffer + ]]) + end) + it('can do <Plug> mappings', function() eq(0, exec_lua [[ GlobalCount = 0 diff --git a/test/functional/options/cursorbind_spec.lua b/test/functional/options/cursorbind_spec.lua new file mode 100644 index 0000000000..f762808dd6 --- /dev/null +++ b/test/functional/options/cursorbind_spec.lua @@ -0,0 +1,91 @@ +local helpers = require('test.functional.helpers')(after_each) +local Screen = require('test.functional.ui.screen') +local clear = helpers.clear +local command = helpers.command +local exec = helpers.exec +local feed = helpers.feed + +before_each(clear) + +describe("'cursorbind'", function() + it("behaves consistently whether 'cursorline' is set or not vim-patch:8.2.4795", function() + local screen = Screen.new(60, 8) + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue}, -- NonText + [2] = {bold = true, reverse = true}, -- StatusLine + [3] = {reverse = true}, -- StatusLineNC, VertSplit + [4] = {background = Screen.colors.Grey90}, -- CursorLine, CursorColumn + }) + screen:attach() + exec([[ + call setline(1, 'aa bb cc dd ee ff gg hh ii jj kk ll mm' .. + \ ' nn oo pp qq rr ss tt uu vv ww xx yy zz') + set nowrap + " The following makes the cursor apparent on the screen dump + set sidescroll=1 cursorcolumn + " add empty lines, required for cursorcolumn + call append(1, ['','','','']) + 20vsp + windo :set cursorbind + ]]) + feed('20l') + screen:expect([[ + a bb cc dd ee ff gg {3:│}aa bb cc dd ee ff gg^ hh ii jj kk ll mm | + {4: }{3:│} {4: } | + {4: }{3:│} {4: } | + {4: }{3:│} {4: } | + {4: }{3:│} {4: } | + {1:~ }{3:│}{1:~ }| + {3:[No Name] [+] }{2:[No Name] [+] }| + | + ]]) + feed('10l') + screen:expect([[ + hh ii jj kk ll mm n{3:│}aa bb cc dd ee ff gg hh ii jj ^kk ll mm | + {4: } {3:│} {4: } | + {4: } {3:│} {4: } | + {4: } {3:│} {4: } | + {4: } {3:│} {4: } | + {1:~ }{3:│}{1:~ }| + {3:[No Name] [+] }{2:[No Name] [+] }| + | + ]]) + command('windo :set cursorline') + feed('0') + feed('20l') + screen:expect([[ + {4:a bb cc dd ee ff gg }{3:│}{4:aa bb cc dd ee ff gg^ hh ii jj kk ll mm }| + {4: }{3:│} {4: } | + {4: }{3:│} {4: } | + {4: }{3:│} {4: } | + {4: }{3:│} {4: } | + {1:~ }{3:│}{1:~ }| + {3:[No Name] [+] }{2:[No Name] [+] }| + | + ]]) + feed('10l') + screen:expect([[ + {4: hh ii jj kk ll mm n}{3:│}{4:aa bb cc dd ee ff gg hh ii jj ^kk ll mm }| + {4: } {3:│} {4: } | + {4: } {3:│} {4: } | + {4: } {3:│} {4: } | + {4: } {3:│} {4: } | + {1:~ }{3:│}{1:~ }| + {3:[No Name] [+] }{2:[No Name] [+] }| + | + ]]) + command('windo :set nocursorline nocursorcolumn') + feed('0') + feed('40l') + screen:expect([[ + kk ll mm nn oo pp qq{3:│} bb cc dd ee ff gg hh ii jj kk ll mm n^n| + {3:│} | + {3:│} | + {3:│} | + {3:│} | + {1:~ }{3:│}{1:~ }| + {3:[No Name] [+] }{2:[No Name] [+] }| + | + ]]) + end) +end) diff --git a/test/functional/treesitter/language_spec.lua b/test/functional/treesitter/language_spec.lua index afb17dd2cf..84e4fa5c49 100644 --- a/test/functional/treesitter/language_spec.lua +++ b/test/functional/treesitter/language_spec.lua @@ -2,6 +2,7 @@ local helpers = require('test.functional.helpers')(after_each) local clear = helpers.clear local eq = helpers.eq +local command = helpers.command local exec_lua = helpers.exec_lua local pcall_err = helpers.pcall_err local matches = helpers.matches @@ -67,5 +68,15 @@ describe('treesitter API', function() end eq({true,true}, {has_named,has_anonymous}) end) + + it('checks if vim.treesitter.get_parser tries to create a new parser on filetype change', function () + command("set filetype=c") + -- Should not throw an error when filetype is c + eq('c', exec_lua("return vim.treesitter.get_parser(0):lang()")) + command("set filetype=borklang") + -- Should throw an error when filetype changes to borklang + eq("Error executing lua: .../language.lua:0: no parser for 'borklang' language, see :help treesitter-parsers", + pcall_err(exec_lua, "new_parser = vim.treesitter.get_parser(0)")) + end) end) diff --git a/test/functional/ui/searchhl_spec.lua b/test/functional/ui/searchhl_spec.lua index 068a77a2e4..56ff8a4101 100644 --- a/test/functional/ui/searchhl_spec.lua +++ b/test/functional/ui/searchhl_spec.lua @@ -109,54 +109,144 @@ describe('search highlighting', function() ]]) end) - it('works for match under cursor', function() - screen:set_default_attr_ids({ - [1] = {background = Screen.colors.Yellow}, - [2] = {foreground = Screen.colors.Gray100, background = Screen.colors.Gray0}, - [3] = {foreground = Screen.colors.Red}, - }) - - command('highlight CurSearch guibg=Black guifg=White') - insert([[ - There is no way that a bee should be - able to fly. Its wings are too small - to get its fat little body off the - ground. The bee, of course, flies - anyway because bees don't care what - humans think is impossible.]]) - - feed('/bee<CR>') - screen:expect{grid=[[ - There is no way that a {2:^bee} should be | - able to fly. Its wings are too small | - to get its fat little body off the | - ground. The {1:bee}, of course, flies | - anyway because {1:bee}s don't care what | - humans think is impossible. | - {3:search hit BOTTOM, continuing at TOP} | - ]]} - - feed('nn') - screen:expect{grid=[[ - There is no way that a {1:bee} should be | - able to fly. Its wings are too small | - to get its fat little body off the | - ground. The {1:bee}, of course, flies | - anyway because {2:^bee}s don't care what | - humans think is impossible. | - /bee | - ]]} - - feed('N') - screen:expect{grid=[[ - There is no way that a {1:bee} should be | - able to fly. Its wings are too small | - to get its fat little body off the | - ground. The {2:^bee}, of course, flies | - anyway because {1:bee}s don't care what | - humans think is impossible. | - ?bee | - ]]} + describe('CurSearch highlight', function() + before_each(function() + screen:set_default_attr_ids({ + [1] = {background = Screen.colors.Yellow}, -- Search + [2] = {foreground = Screen.colors.White, background = Screen.colors.Black}, -- CurSearch + [3] = {foreground = Screen.colors.Red}, -- WarningMsg + }) + command('highlight CurSearch guibg=Black guifg=White') + end) + + it('works for match under cursor', function() + insert([[ + There is no way that a bee should be + able to fly. Its wings are too small + to get its fat little body off the + ground. The bee, of course, flies + anyway because bees don't care what + humans think is impossible.]]) + + feed('/bee<CR>') + screen:expect{grid=[[ + There is no way that a {2:^bee} should be | + able to fly. Its wings are too small | + to get its fat little body off the | + ground. The {1:bee}, of course, flies | + anyway because {1:bee}s don't care what | + humans think is impossible. | + {3:search hit BOTTOM, continuing at TOP} | + ]]} + + feed('nn') + screen:expect{grid=[[ + There is no way that a {1:bee} should be | + able to fly. Its wings are too small | + to get its fat little body off the | + ground. The {1:bee}, of course, flies | + anyway because {2:^bee}s don't care what | + humans think is impossible. | + /bee | + ]]} + + feed('N') + screen:expect{grid=[[ + There is no way that a {1:bee} should be | + able to fly. Its wings are too small | + to get its fat little body off the | + ground. The {2:^bee}, of course, flies | + anyway because {1:bee}s don't care what | + humans think is impossible. | + ?bee | + ]]} + end) + + it('works for multiline match', function() + command([[call setline(1, ['one', 'foo', 'bar', 'baz', 'foo the foo and foo', 'bar'])]]) + feed('gg/foo<CR>') + screen:expect([[ + one | + {2:^foo} | + bar | + baz | + {1:foo} the {1:foo} and {1:foo} | + bar | + /foo | + ]]) + feed('n') + screen:expect([[ + one | + {1:foo} | + bar | + baz | + {2:^foo} the {1:foo} and {1:foo} | + bar | + /foo | + ]]) + feed('n') + screen:expect([[ + one | + {1:foo} | + bar | + baz | + {1:foo} the {2:^foo} and {1:foo} | + bar | + /foo | + ]]) + feed('n') + screen:expect([[ + one | + {1:foo} | + bar | + baz | + {1:foo} the {1:foo} and {2:^foo} | + bar | + /foo | + ]]) + command([[call setline(5, 'foo')]]) + feed('0?<CR>') + screen:expect([[ + one | + {2:^foo} | + bar | + baz | + {1:foo} | + bar | + ?foo | + ]]) + feed('gg/foo\\nbar<CR>') + screen:expect([[ + one | + {2:^foo} | + {2:bar} | + baz | + {1:foo} | + {1:bar} | + /foo\nbar | + ]]) + command([[call setline(1, ['---', 'abcdefg', 'hijkl', '---', 'abcdefg', 'hijkl'])]]) + feed('gg/efg\\nhij<CR>') + screen:expect([[ + --- | + abcd{2:^efg} | + {2:hij}kl | + --- | + abcd{1:efg} | + {1:hij}kl | + /efg\nhij | + ]]) + feed('n') + screen:expect([[ + --- | + abcd{1:efg} | + {1:hij}kl | + --- | + abcd{2:^efg} | + {2:hij}kl | + /efg\nhij | + ]]) + end) end) it('highlights after EOL', function() |