aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--test/functional/legacy/autocmd_option_spec.lua323
1 files changed, 240 insertions, 83 deletions
diff --git a/test/functional/legacy/autocmd_option_spec.lua b/test/functional/legacy/autocmd_option_spec.lua
index 257a4ac5d4..855e9c6271 100644
--- a/test/functional/legacy/autocmd_option_spec.lua
+++ b/test/functional/legacy/autocmd_option_spec.lua
@@ -1,119 +1,276 @@
local helpers = require('test.functional.helpers')
-local clear, nvim, eq = helpers.clear, helpers.nvim, helpers.eq
+local nvim = helpers.meths
+local clear, eq, neq = helpers.clear, helpers.eq, helpers.neq
+local curbuf, buf = helpers.curbuf, helpers.bufmeths
local source, execute = helpers.source, helpers.execute
-describe('au OptionSet', function()
- describe('with * as <amatch>', function()
- describe('matches when being set any option', function()
- local function expected_str(option, oldval, newval, scope)
- return ''
- .. string.format('Autocmd Option: <%s>,', option)
- .. string.format(' OldVal: <%s>,', oldval)
- .. string.format(' NewVal: <%s>,', newval)
- .. string.format(' Scope: <%s>', scope)
- end
+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' : {
+ \ 'bufnr' : a:bufnr,
+ \ 'winnr' : a:winnr,
+ \ }
+ \ }
+ call add(g:ret, l:acc)
+ endfu
+ ]])
+end
+
+local function set_hook(pattern)
+ execute(
+ 'au OptionSet '
+ .. pattern ..
+ ' :call AutoCommand(expand("<amatch>"), bufnr("%"), winnr())'
+ )
+end
- local function get_result()
- return nvim('get_var', 'ret')
- end
+local function init_var()
+ execute('let g:ret = []')
+end
- local function expected_combination(option, oldval, newval, scope)
- eq(expected_str(option, oldval, newval, scope), get_result())
- execute([[let g:ret = '']])
- end
+local function get_result()
+ local ret = nvim.get_var('ret')
+ init_var()
+ return ret
+end
+
+local function expected_table(option, oldval, newval, scope, attr)
+ return {
+ option = option,
+ oldval = tostring(oldval),
+ newval = tostring(newval),
+ scope = scope,
+ attr = attr,
+ }
+end
+
+local function expected_combination(...)
+ local args = {...}
+ local ret = get_result()
+
+ if not (#args == #ret) then
+ local expecteds = {}
+ for _, v in pairs(args) do
+ table.insert(expecteds, expected_table(unpack(v)))
+ end
+ eq(expecteds, ret)
+ return
+ end
- local function expected_empty()
- eq('', get_result())
+ for i, v in ipairs(args) do
+ local attr = v[5]
+ if not attr then
+ -- remove attr entries
+ ret[i].attr = nil
+ else
+ -- remove attr entries which are not required
+ for k in pairs(ret[i].attr) do
+ if not attr[k] then
+ ret[i].attr[k] = nil
+ end
end
+ end
+ eq(expected_table(unpack(v)), ret[i])
+ end
+end
- before_each(function()
- clear()
-
- source([[
- fu! AutoCommand(match)
- let g:ret.=printf('Autocmd Option: <%s>,', a:match)
- let g:ret.=printf(' OldVal: <%s>,', v:option_old)
- let g:ret.=printf(' NewVal: <%s>,', v:option_new)
- let g:ret.=printf(' Scope: <%s>', v:option_type)
- endfu
-
- au OptionSet * :call AutoCommand(expand("<amatch>"))
- ]])
-
- execute([[let g:ret = '']])
- end)
+local function expected_empty()
+ eq({}, get_result())
+end
- it('should set number option', function()
- execute('set nu')
- expected_combination('number', 0, 1, 'global')
+local function make_buffer()
+ local old_buf = curbuf()
+ execute('new')
+ local new_buf = curbuf()
+ execute('wincmd p') -- move previous window
- execute('setlocal nonu')
- expected_combination('number', 1, 0, 'local')
+ neq(old_buf, new_buf)
+ eq(old_buf, curbuf())
- execute('setglobal nonu')
- expected_combination('number', 1, 0, 'global')
- end)
+ return new_buf
+end
+
+describe('au OptionSet', function()
+ describe('with any opton (*)', function()
+
+ before_each(function()
+ clear()
+ declare_hook_function()
+ init_var()
+ set_hook('*')
+ end)
+
+ it('should be called in setting number option', function()
+ execute('set nu')
+ expected_combination({'number', 0, 1, 'global'})
+
+ execute('setlocal nonu')
+ expected_combination({'number', 1, 0, 'local'})
+
+ execute('setglobal nonu')
+ expected_combination({'number', 1, 0, 'global'})
+ end)
+
+ it('should be called in setting autoindent option',function()
+ execute('setlocal ai')
+ expected_combination({'autoindent', 0, 1, 'local'})
+
+ execute('setglobal ai')
+ expected_combination({'autoindent', 0, 1, 'global'})
+
+ execute('set noai')
+ expected_combination({'autoindent', 1, 0, 'global'})
+ end)
+
+ it('should be called in inverting global autoindent option',function()
+ execute('set ai!')
+ expected_combination({'autoindent', 0, 1, 'global'})
+ end)
+
+ it('should be called in being unset local autoindent option',function()
+ execute('setlocal ai')
+ expected_combination({'autoindent', 0, 1, 'local'})
+
+ execute('setlocal ai<')
+ expected_combination({'autoindent', 1, 0, 'local'})
+ end)
+
+ it('should be called in setting global list and number option at the same time',function()
+ execute('set list nu')
+ expected_combination(
+ {'list', 0, 1, 'global'},
+ {'number', 0, 1, 'global'}
+ )
+ end)
- it('should set autoindent option',function()
- execute('setlocal ai')
- expected_combination('autoindent', 0, 1, 'local')
+ it('should not print anything, use :noa', function()
+ execute('noa set nolist nonu')
+ expected_empty()
+ end)
+
+ it('should be called in setting local acd', function()
+ execute('setlocal acd')
+ expected_combination({'autochdir', 0, 1, 'local'})
+ end)
+
+ it('should be called in setting autoread', function()
+ execute('set noar')
+ expected_combination({'autoread', 1, 0, 'global'})
+
+ execute('setlocal ar')
+ expected_combination({'autoread', 0, 1, 'local'})
+ end)
+
+ it('should be called in inverting global autoread', function()
+ execute('setglobal invar')
+ expected_combination({'autoread', 1, 0, 'global'})
+ end)
- execute('setglobal ai')
- expected_combination('autoindent', 0, 1, 'global')
+ it('should be called in setting backspace option through :let', function()
+ execute('let &bs=""')
+ expected_combination({'backspace', 'indent,eol,start', '', 'global'})
+ end)
- execute('set noai')
- expected_combination('autoindent', 1, 0, 'global')
+ describe('being set by setbufvar()', function()
+ it('should not trigger because option name is invalid', function()
+ execute('call setbufvar(1, "&l:bk", 1)')
+ expected_empty()
end)
- it('should invert global autoindent option',function()
- execute('set ai!')
- expected_combination('autoindent', 0, 1, 'global')
+ it('should trigger using correct option name', function()
+ execute('call setbufvar(1, "&backup", 1)')
+ expected_combination({'backup', 0, 1, 'local'})
end)
- it('should set several global list and number option',function()
- execute('set list nu')
- eq(expected_str('list', 0, 1, 'global') .. expected_str('number', 0, 1, 'global'),
- get_result())
+ it('should trigger if the current buffer is different from the targetted buffer', function()
+ local new_buffer = make_buffer()
+ local new_bufnr = buf.get_number(new_buffer)
+
+ execute('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
+ expected_combination({'buftype', '', 'nofile', 'local', {bufnr = new_bufnr}})
end)
+ end)
+ end)
+
+ describe('with specific option', function()
- it('should not print anything, use :noa.', function()
- execute('noa set nolist nonu')
+ before_each(function()
+ clear()
+ declare_hook_function()
+ init_var()
+ end)
+
+ it('should be called iff setting readonly', function()
+ set_hook('readonly')
+
+ execute('set nu')
+ expected_empty()
+
+ execute('setlocal ro')
+ expected_combination({'readonly', 0, 1, 'local'})
+
+ execute('setglobal ro')
+ expected_combination({'readonly', 0, 1, 'global'})
+
+ execute('set noro')
+ expected_combination({'readonly', 1, 0, 'global'})
+ end)
+
+ describe('being set by setbufvar()', function()
+ it('should not trigger because option name does not match with backup', function()
+ set_hook('backup')
+
+ execute('call setbufvar(1, "&l:bk", 1)')
expected_empty()
end)
- it('should set global acd', function()
- execute('setlocal acd')
- expected_combination('autochdir', 0, 1, 'local')
+ it('should trigger, use correct option name backup', function()
+ set_hook('backup')
+
+ execute('call setbufvar(1, "&backup", 1)')
+ expected_combination({'backup', 0, 1, 'local'})
end)
- it('should set autoread', function()
- execute('set noar')
- expected_combination('autoread', 1, 0, 'global')
+ it('should trigger if the current buffer is different from the targetted buffer', function()
+ set_hook('buftype')
+
+ local new_buffer = make_buffer()
+ local new_bufnr = buf.get_number(new_buffer)
- execute('setlocal ar')
- expected_combination('autoread', 0, 1, 'local')
+ execute('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
+ expected_combination({'buftype', '', 'nofile', 'local', {bufnr = new_bufnr}})
end)
+ end)
+
+ describe('being set by neovim api', function()
+ it('should trigger if a boolean option be set globally', function()
+ set_hook('autochdir')
- it('should invert global autoread', function()
- execute('setglobal invar')
- expected_combination('autoread', 1, 0, 'global')
+ nvim.set_option('autochdir', true)
+ eq(true, nvim.get_option('autochdir'))
+ expected_combination({'autochdir', '0', '1', 'global'})
end)
- it('should set option backspace through :let', function()
- execute('let &bs=""')
- expected_combination('backspace', 'indent,eol,start', '', 'global')
+ it('should trigger if a number option be set globally', function()
+ set_hook('cmdheight')
+
+ nvim.set_option('cmdheight', 5)
+ eq(5, nvim.get_option('cmdheight'))
+ expected_combination({'cmdheight', 1, 5, 'global'})
end)
- describe('setting option through setbufvar()', function()
- it('shouldn\'t trigger because option name is invalid', function()
- execute('call setbufvar(1, "&l:bk", 1)')
- expected_empty()
- end)
+ it('should trigger if a string option be set globally', function()
+ set_hook('ambiwidth')
- it('should trigger, use correct option name.', function()
- execute('call setbufvar(1, "&backup", 1)')
- expected_combination('backup', 0, 1, 'local')
- end)
+ nvim.set_option('ambiwidth', 'double')
+ eq('double', nvim.get_option('ambiwidth'))
+ expected_combination({'ambiwidth', 'single', 'double', 'global'})
end)
end)
end)