diff options
| author | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-04-04 12:41:27 +0300 |
|---|---|---|
| committer | Mehmet Samet Duman <yongdohyun@projecttick.org> | 2026-04-04 12:41:27 +0300 |
| commit | 4f2d36194b4f299aa7509d815c07121039ea833b (patch) | |
| tree | f3ded014bad3a4c76ff6a22b8726ebaab68c3d13 /mnv/src/testdir/test_iminsert.mnv | |
| parent | 5b578e70c314723a3cde5c9bfc2be0bf1dadc93b (diff) | |
| download | Project-Tick-4f2d36194b4f299aa7509d815c07121039ea833b.tar.gz Project-Tick-4f2d36194b4f299aa7509d815c07121039ea833b.zip | |
NOISSUE change uvim folder name to mnv
Signed-off-by: Mehmet Samet Duman <yongdohyun@projecttick.org>
Diffstat (limited to 'mnv/src/testdir/test_iminsert.mnv')
| -rw-r--r-- | mnv/src/testdir/test_iminsert.mnv | 324 |
1 files changed, 324 insertions, 0 deletions
diff --git a/mnv/src/testdir/test_iminsert.mnv b/mnv/src/testdir/test_iminsert.mnv new file mode 100644 index 0000000000..f3542c3ace --- /dev/null +++ b/mnv/src/testdir/test_iminsert.mnv @@ -0,0 +1,324 @@ +" Test for 'iminsert' + +import './util/mnv9.mnv' 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 = RunMNVInTerminal('-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 StopMNVInTerminal(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, 'mnv 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.CheckLegacyAndMNV9Success(lines) + + " Using MNV9 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 + + " MNV9 tests + let lines =<< trim END + mnv9script + + # 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 + +" mnv: shiftwidth=2 sts=2 expandtab |
