diff options
Diffstat (limited to 'src/testdir/test_iminsert.vim')
-rw-r--r-- | src/testdir/test_iminsert.vim | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/src/testdir/test_iminsert.vim b/src/testdir/test_iminsert.vim new file mode 100644 index 0000000..11fe24e --- /dev/null +++ b/src/testdir/test_iminsert.vim @@ -0,0 +1,326 @@ +" Test for 'iminsert' + +source view_util.vim +source check.vim +import './vim9.vim' as v9 + +let s:imactivatefunc_called = 0 +let s:imstatusfunc_called = 0 +let s:imstatus_active = 0 + +func IM_activatefunc(active) + let s:imactivatefunc_called = 1 + let s:imstatus_active = a:active +endfunc + +func IM_statusfunc() + let s:imstatusfunc_called = 1 + return s:imstatus_active +endfunc + +func Test_iminsert2() + let s:imactivatefunc_called = 0 + let s:imstatusfunc_called = 0 + + set imactivatefunc=IM_activatefunc + set imstatusfunc=IM_statusfunc + set iminsert=2 + normal! i + set iminsert=0 + set imactivatefunc= + set imstatusfunc= + + let expected = (has('win32') && has('gui_running')) ? 0 : 1 + call assert_equal(expected, s:imactivatefunc_called) + call assert_equal(expected, s:imstatusfunc_called) +endfunc + +func Test_getimstatus() + if has('win32') + CheckFeature multi_byte_ime + else + CheckFeature xim + endif + if has('win32') && has('gui_running') + set imactivatefunc= + set imstatusfunc= + else + set imactivatefunc=IM_activatefunc + set imstatusfunc=IM_statusfunc + let s:imstatus_active = 0 + endif + + new + set iminsert=2 + call feedkeys("i\<C-R>=getimstatus()\<CR>\<ESC>", 'nx') + call assert_equal('1', getline(1)) + set iminsert=0 + call feedkeys("o\<C-R>=getimstatus()\<CR>\<ESC>", 'nx') + call assert_equal('0', getline(2)) + bw! + + set imactivatefunc= + set imstatusfunc= +endfunc + +func Test_imactivatefunc_imstatusfunc_callback_no_breaks_foldopen() + CheckScreendump + + let lines =<< trim END + func IM_activatefunc(active) + endfunc + func IM_statusfunc() + return 0 + endfunc + set imactivatefunc=IM_activatefunc + set imstatusfunc=IM_statusfunc + set foldmethod=marker + set foldopen=search + call setline(1, ['{{{', 'abc', '}}}']) + %foldclose + END + call writefile(lines, 'Xscript', 'D') + let buf = RunVimInTerminal('-S Xscript', {}) + call assert_notequal('abc', term_getline(buf, 2)) + call term_sendkeys(buf, "/abc\n") + call WaitForAssert({-> assert_equal('abc', term_getline(buf, 2))}) + + " clean up + call StopVimInTerminal(buf) +endfunc + +" Test for using an lmap in insert mode +func Test_lmap_in_insert_mode() + new + call setline(1, 'abc') + lmap { w + set iminsert=1 + call feedkeys('r{', 'xt') + call assert_equal('wbc', getline(1)) + set iminsert=2 + call feedkeys('$r{', 'xt') + call assert_equal('wb{', getline(1)) + call setline(1, 'vim web') + set iminsert=1 + call feedkeys('0f{', 'xt') + call assert_equal(5, col('.')) + set iminsert& + lunmap { + close! +endfunc + +" Test for using CTRL-^ to toggle iminsert in insert mode +func Test_iminsert_toggle() + CheckGui + if has('win32') + CheckFeature multi_byte_ime + else + CheckFeature xim + endif + if has('gui_running') && !has('win32') + throw 'Skipped: works only in Win32 GUI version (for some reason)' + endif + new + let save_imdisable = &imdisable + let save_iminsert = &iminsert + set noimdisable + set iminsert=0 + exe "normal i\<C-^>" + call assert_equal(2, &iminsert) + exe "normal i\<C-^>" + call assert_equal(0, &iminsert) + let &iminsert = save_iminsert + let &imdisable = save_imdisable + close! +endfunc + +" Test for different ways of setting the 'imactivatefunc' and 'imstatusfunc' +" options +func Test_imactivatefunc_imstatusfunc_callback() + CheckNotMSWindows + func IMactivatefunc1(active) + let g:IMactivatefunc_called += 1 + endfunc + func IMstatusfunc1() + let g:IMstatusfunc_called += 1 + return 1 + endfunc + set iminsert=2 + + let lines =<< trim END + LET g:IMactivatefunc_called = 0 + LET g:IMstatusfunc_called = 0 + + #" Test for using a function name + LET &imactivatefunc = 'g:IMactivatefunc1' + LET &imstatusfunc = 'g:IMstatusfunc1' + normal! i + + #" Test for using a function() + set imactivatefunc=function('g:IMactivatefunc1') + set imstatusfunc=function('g:IMstatusfunc1') + normal! i + + #" Using a funcref variable to set 'completefunc' + VAR Fn1 = function('g:IMactivatefunc1') + LET &imactivatefunc = Fn1 + VAR Fn2 = function('g:IMstatusfunc1') + LET &imstatusfunc = Fn2 + normal! i + + #" Using a string(funcref variable) to set 'completefunc' + LET &imactivatefunc = string(Fn1) + LET &imstatusfunc = string(Fn2) + normal! i + + #" Test for using a funcref() + set imactivatefunc=funcref('g:IMactivatefunc1') + set imstatusfunc=funcref('g:IMstatusfunc1') + normal! i + + #" Using a funcref variable to set 'imactivatefunc' + LET Fn1 = funcref('g:IMactivatefunc1') + LET &imactivatefunc = Fn1 + LET Fn2 = funcref('g:IMstatusfunc1') + LET &imstatusfunc = Fn2 + normal! i + + #" Using a string(funcref variable) to set 'imactivatefunc' + LET &imactivatefunc = string(Fn1) + LET &imstatusfunc = string(Fn2) + normal! i + + #" Test for using a lambda function + VAR optval = "LSTART a LMIDDLE g:IMactivatefunc1(a) LEND" + LET optval = substitute(optval, ' ', '\\ ', 'g') + exe "set imactivatefunc=" .. optval + LET optval = "LSTART LMIDDLE g:IMstatusfunc1() LEND" + LET optval = substitute(optval, ' ', '\\ ', 'g') + exe "set imstatusfunc=" .. optval + normal! i + + #" Set 'imactivatefunc' and 'imstatusfunc' to a lambda expression + LET &imactivatefunc = LSTART a LMIDDLE g:IMactivatefunc1(a) LEND + LET &imstatusfunc = LSTART LMIDDLE g:IMstatusfunc1() LEND + normal! i + + #" Set 'imactivatefunc' and 'imstatusfunc' to a string(lambda expression) + LET &imactivatefunc = 'LSTART a LMIDDLE g:IMactivatefunc1(a) LEND' + LET &imstatusfunc = 'LSTART LMIDDLE g:IMstatusfunc1() LEND' + normal! i + + #" Set 'imactivatefunc' 'imstatusfunc' to a variable with a lambda + #" expression + VAR Lambda1 = LSTART a LMIDDLE g:IMactivatefunc1(a) LEND + VAR Lambda2 = LSTART LMIDDLE g:IMstatusfunc1() LEND + LET &imactivatefunc = Lambda1 + LET &imstatusfunc = Lambda2 + normal! i + + #" Set 'imactivatefunc' 'imstatusfunc' to a string(variable with a lambda + #" expression) + LET &imactivatefunc = string(Lambda1) + LET &imstatusfunc = string(Lambda2) + normal! i + + #" Test for clearing the 'completefunc' option + set imactivatefunc='' imstatusfunc='' + set imactivatefunc& imstatusfunc& + + set imactivatefunc=g:IMactivatefunc1 + set imstatusfunc=g:IMstatusfunc1 + call assert_fails("set imactivatefunc=function('abc')", "E700:") + call assert_fails("set imstatusfunc=function('abc')", "E700:") + call assert_fails("set imactivatefunc=funcref('abc')", "E700:") + call assert_fails("set imstatusfunc=funcref('abc')", "E700:") + call assert_fails("LET &imstatusfunc = function('abc')", "E700:") + call assert_fails("LET &imactivatefunc = function('abc')", "E700:") + normal! i + + #" set 'imactivatefunc' and 'imstatusfunc' to a non-existing function + set imactivatefunc=IMactivatefunc1 + set imstatusfunc=IMstatusfunc1 + call assert_fails("set imactivatefunc=function('NonExistingFunc')", 'E700:') + call assert_fails("set imstatusfunc=function('NonExistingFunc')", 'E700:') + call assert_fails("LET &imactivatefunc = function('NonExistingFunc')", 'E700:') + call assert_fails("LET &imstatusfunc = function('NonExistingFunc')", 'E700:') + normal! i + + call assert_equal(14, g:IMactivatefunc_called) + call assert_equal(28, g:IMstatusfunc_called) + END + call v9.CheckLegacyAndVim9Success(lines) + + " Using Vim9 lambda expression in legacy context should fail + set imactivatefunc=(a)\ =>\ IMactivatefunc1(a) + set imstatusfunc=IMstatusfunc1 + call assert_fails('normal! i', 'E117:') + set imactivatefunc=IMactivatefunc1 + set imstatusfunc=()\ =>\ IMstatusfunc1(a) + call assert_fails('normal! i', 'E117:') + + " set 'imactivatefunc' and 'imstatusfunc' to a partial with dict. This used + " to cause a crash. + func SetIMFunc() + let params1 = {'activate': function('g:DictActivateFunc')} + let params2 = {'status': function('g:DictStatusFunc')} + let &imactivatefunc = params1.activate + let &imstatusfunc = params2.status + endfunc + func g:DictActivateFunc(_) dict + endfunc + func g:DictStatusFunc(_) dict + endfunc + call SetIMFunc() + new + call SetIMFunc() + bw + call test_garbagecollect_now() + new + set imactivatefunc= + set imstatusfunc= + wincmd w + set imactivatefunc= + set imstatusfunc= + :%bw! + delfunc g:DictActivateFunc + delfunc g:DictStatusFunc + delfunc SetIMFunc + + " Vim9 tests + let lines =<< trim END + vim9script + + # Test for using function() + def IMactivatefunc1(active: number): any + g:IMactivatefunc_called += 1 + return 1 + enddef + def IMstatusfunc1(): number + g:IMstatusfunc_called += 1 + return 1 + enddef + g:IMactivatefunc_called = 0 + g:IMstatusfunc_called = 0 + set iminsert=2 + set imactivatefunc=function('IMactivatefunc1') + set imstatusfunc=function('IMstatusfunc1') + normal! i + + set iminsert=0 + set imactivatefunc= + set imstatusfunc= + END + call v9.CheckScriptSuccess(lines) + + " cleanup + set iminsert=0 + set imactivatefunc& + set imstatusfunc& + delfunc IMactivatefunc1 + delfunc IMstatusfunc1 + unlet g:IMactivatefunc_called g:IMstatusfunc_called + %bw! +endfunc + +" vim: shiftwidth=2 sts=2 expandtab |