16d91bcb4SBram Moolenaar" Test for insert completion
26d91bcb4SBram Moolenaar
309dd2bb3SBram Moolenaarsource screendump.vim
450f91d22SBram Moolenaarsource check.vim
515993ce9SBram Moolenaar
615993ce9SBram Moolenaar" Test for insert expansion
715993ce9SBram Moolenaarfunc Test_ins_complete()
8cf1ba35fSBram Moolenaar  edit test_ins_complete.vim
9fb094e14SBram Moolenaar  " The files in the current directory interferes with the files
10fb094e14SBram Moolenaar  " used by this test. So use a separate directory for the test.
11fb094e14SBram Moolenaar  call mkdir('Xdir')
12fb094e14SBram Moolenaar  cd Xdir
13fb094e14SBram Moolenaar
1415993ce9SBram Moolenaar  set ff=unix
1515993ce9SBram Moolenaar  call writefile(["test11\t36Gepeto\t/Tag/",
1615993ce9SBram Moolenaar	      \ "asd\ttest11file\t36G",
1715993ce9SBram Moolenaar	      \ "Makefile\tto\trun"], 'Xtestfile')
1815993ce9SBram Moolenaar  call writefile(['', 'start of testfile',
1915993ce9SBram Moolenaar	      \ 'ru',
2015993ce9SBram Moolenaar	      \ 'run1',
2115993ce9SBram Moolenaar	      \ 'run2',
2215993ce9SBram Moolenaar	      \ 'STARTTEST',
2315993ce9SBram Moolenaar	      \ 'ENDTEST',
2415993ce9SBram Moolenaar	      \ 'end of testfile'], 'Xtestdata')
2515993ce9SBram Moolenaar  set ff&
2615993ce9SBram Moolenaar
2715993ce9SBram Moolenaar  enew!
2815993ce9SBram Moolenaar  edit Xtestdata
2915993ce9SBram Moolenaar  new
3015993ce9SBram Moolenaar  call append(0, ['#include "Xtestfile"', ''])
3115993ce9SBram Moolenaar  call cursor(2, 1)
3215993ce9SBram Moolenaar
3315993ce9SBram Moolenaar  set cot=
3415993ce9SBram Moolenaar  set cpt=.,w
3515993ce9SBram Moolenaar  " add-expands (word from next line) from other window
3615993ce9SBram Moolenaar  exe "normal iru\<C-N>\<C-N>\<C-X>\<C-N>\<Esc>\<C-A>"
3715993ce9SBram Moolenaar  call assert_equal('run1 run3', getline('.'))
3815993ce9SBram Moolenaar  " add-expands (current buffer first)
3915993ce9SBram Moolenaar  exe "normal o\<C-P>\<C-X>\<C-N>"
4015993ce9SBram Moolenaar  call assert_equal('run3 run3', getline('.'))
4115993ce9SBram Moolenaar  " Local expansion, ends in an empty line (unless it becomes a global
4215993ce9SBram Moolenaar  " expansion)
4315993ce9SBram Moolenaar  exe "normal o\<C-X>\<C-P>\<C-P>\<C-P>\<C-P>\<C-P>"
4415993ce9SBram Moolenaar  call assert_equal('', getline('.'))
4515993ce9SBram Moolenaar  " starts Local and switches to global add-expansion
4615993ce9SBram Moolenaar  exe "normal o\<C-X>\<C-P>\<C-P>\<C-X>\<C-X>\<C-N>\<C-X>\<C-N>\<C-N>"
4715993ce9SBram Moolenaar  call assert_equal('run1 run2', getline('.'))
4815993ce9SBram Moolenaar
4915993ce9SBram Moolenaar  set cpt=.,w,i
5015993ce9SBram Moolenaar  " i-add-expands and switches to local
5115993ce9SBram Moolenaar  exe "normal OM\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>\<C-X>\<C-X>\<C-X>\<C-P>"
5215993ce9SBram Moolenaar  call assert_equal("Makefile\tto\trun3", getline('.'))
5315993ce9SBram Moolenaar  " add-expands lines (it would end in an empty line if it didn't ignored
5415993ce9SBram Moolenaar  " itself)
5515993ce9SBram Moolenaar  exe "normal o\<C-X>\<C-L>\<C-X>\<C-L>\<C-P>\<C-P>"
5615993ce9SBram Moolenaar  call assert_equal("Makefile\tto\trun3", getline('.'))
5715993ce9SBram Moolenaar  call assert_equal("Makefile\tto\trun3", getline(line('.') - 1))
5815993ce9SBram Moolenaar
5915993ce9SBram Moolenaar  set cpt=kXtestfile
6015993ce9SBram Moolenaar  " checks k-expansion, and file expansion (use Xtest11 instead of test11,
6115993ce9SBram Moolenaar  " because TEST11.OUT may match first on DOS)
6215993ce9SBram Moolenaar  write Xtest11.one
6315993ce9SBram Moolenaar  write Xtest11.two
6415993ce9SBram Moolenaar  exe "normal o\<C-N>\<Esc>IX\<Esc>A\<C-X>\<C-F>\<C-N>"
6515993ce9SBram Moolenaar  call assert_equal('Xtest11.two', getline('.'))
6615993ce9SBram Moolenaar
6715993ce9SBram Moolenaar  " use CTRL-X CTRL-F to complete Xtest11.one, remove it and then use CTRL-X
6815993ce9SBram Moolenaar  " CTRL-F again to verify this doesn't cause trouble.
6915993ce9SBram Moolenaar  exe "normal oXt\<C-X>\<C-F>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<C-X>\<C-F>"
7015993ce9SBram Moolenaar  call assert_equal('Xtest11.one', getline('.'))
7115993ce9SBram Moolenaar  normal ddk
7215993ce9SBram Moolenaar
7315993ce9SBram Moolenaar  set cpt=w
7415993ce9SBram Moolenaar  " checks make_cyclic in other window
7515993ce9SBram Moolenaar  exe "normal oST\<C-N>\<C-P>\<C-P>\<C-P>\<C-P>"
7615993ce9SBram Moolenaar  call assert_equal('STARTTEST', getline('.'))
7715993ce9SBram Moolenaar
7815993ce9SBram Moolenaar  set cpt=u nohid
7915993ce9SBram Moolenaar  " checks unloaded buffer expansion
8015993ce9SBram Moolenaar  only
8115993ce9SBram Moolenaar  exe "normal oEN\<C-N>"
8215993ce9SBram Moolenaar  call assert_equal('ENDTEST', getline('.'))
8315993ce9SBram Moolenaar  " checks adding mode abortion
8415993ce9SBram Moolenaar  exe "normal ounl\<C-N>\<C-X>\<C-X>\<C-P>"
8515993ce9SBram Moolenaar  call assert_equal('unless', getline('.'))
8615993ce9SBram Moolenaar
8715993ce9SBram Moolenaar  set cpt=t,d def=^\\k* tags=Xtestfile notagbsearch
8815993ce9SBram Moolenaar  " tag expansion, define add-expansion interrupted
8915993ce9SBram Moolenaar  exe "normal o\<C-X>\<C-]>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-D>"
9015993ce9SBram Moolenaar  call assert_equal('test11file	36Gepeto	/Tag/ asd', getline('.'))
9115993ce9SBram Moolenaar  " t-expansion
9215993ce9SBram Moolenaar  exe "normal oa\<C-N>\<Esc>"
9315993ce9SBram Moolenaar  call assert_equal('asd', getline('.'))
9415993ce9SBram Moolenaar
9515993ce9SBram Moolenaar  %bw!
9615993ce9SBram Moolenaar  call delete('Xtestfile')
9715993ce9SBram Moolenaar  call delete('Xtest11.one')
9815993ce9SBram Moolenaar  call delete('Xtest11.two')
9915993ce9SBram Moolenaar  call delete('Xtestdata')
10015993ce9SBram Moolenaar  set cpt& cot& def& tags& tagbsearch& hidden&
101fb094e14SBram Moolenaar  cd ..
102fb094e14SBram Moolenaar  call delete('Xdir', 'rf')
10315993ce9SBram Moolenaarendfunc
104ffd99f72SBram Moolenaar
105ffd99f72SBram Moolenaarfunc Test_omni_dash()
106ffd99f72SBram Moolenaar  func Omni(findstart, base)
107ffd99f72SBram Moolenaar    if a:findstart
108ffd99f72SBram Moolenaar        return 5
109ffd99f72SBram Moolenaar    else
110ffd99f72SBram Moolenaar        echom a:base
111ffd99f72SBram Moolenaar	return ['-help', '-v']
112ffd99f72SBram Moolenaar    endif
113ffd99f72SBram Moolenaar  endfunc
114ffd99f72SBram Moolenaar  set omnifunc=Omni
115ffd99f72SBram Moolenaar  new
116ffd99f72SBram Moolenaar  exe "normal Gofind -\<C-x>\<C-o>"
117cc233589SBram Moolenaar  call assert_equal("find -help", getline('$'))
118ffd99f72SBram Moolenaar
119ffd99f72SBram Moolenaar  bwipe!
120ffd99f72SBram Moolenaar  delfunc Omni
121ffd99f72SBram Moolenaar  set omnifunc=
122ffd99f72SBram Moolenaarendfunc
12302ae9b4aSBram Moolenaar
124ff34bee3SBram Moolenaarfunc Test_omni_autoload()
125ff34bee3SBram Moolenaar  let save_rtp = &rtp
126ff34bee3SBram Moolenaar  set rtp=Xruntime/some
127ff34bee3SBram Moolenaar  let dir = 'Xruntime/some/autoload'
128ff34bee3SBram Moolenaar  call mkdir(dir, 'p')
129ff34bee3SBram Moolenaar
130ff34bee3SBram Moolenaar  let lines =<< trim END
131ff34bee3SBram Moolenaar      vim9script
132ff34bee3SBram Moolenaar      def omni#func(findstart: bool, base: string): any
133ff34bee3SBram Moolenaar          if findstart
134ff34bee3SBram Moolenaar              return 1
135ff34bee3SBram Moolenaar          else
136ff34bee3SBram Moolenaar              return ['match']
137ff34bee3SBram Moolenaar          endif
138ff34bee3SBram Moolenaar      enddef
139ff34bee3SBram Moolenaar      {
140ff34bee3SBram Moolenaar          eval 1 + 2
141ff34bee3SBram Moolenaar      }
142ff34bee3SBram Moolenaar  END
143ff34bee3SBram Moolenaar  call writefile(lines, dir .. '/omni.vim')
144ff34bee3SBram Moolenaar
145ff34bee3SBram Moolenaar  new
146ff34bee3SBram Moolenaar  setlocal omnifunc=omni#func
147ff34bee3SBram Moolenaar  call feedkeys("i\<C-X>\<C-O>\<Esc>", 'xt')
148ff34bee3SBram Moolenaar
149ff34bee3SBram Moolenaar  bwipe!
150ff34bee3SBram Moolenaar  call delete('Xruntime', 'rf')
151ff34bee3SBram Moolenaar  set omnifunc=
152ff34bee3SBram Moolenaar  let &rtp = save_rtp
153ff34bee3SBram Moolenaarendfunc
154ff34bee3SBram Moolenaar
155ffa96841SBram Moolenaarfunc Test_completefunc_args()
156ffa96841SBram Moolenaar  let s:args = []
157ffa96841SBram Moolenaar  func! CompleteFunc(findstart, base)
158ffa96841SBram Moolenaar    let s:args += [[a:findstart, empty(a:base)]]
159ffa96841SBram Moolenaar  endfunc
160ffa96841SBram Moolenaar  new
161ffa96841SBram Moolenaar
162ffa96841SBram Moolenaar  set completefunc=CompleteFunc
163ffa96841SBram Moolenaar  call feedkeys("i\<C-X>\<C-U>\<Esc>", 'x')
16452d3aaeeSBram Moolenaar  call assert_equal([1, 1], s:args[0])
16552d3aaeeSBram Moolenaar  call assert_equal(0, s:args[1][0])
166ffa96841SBram Moolenaar  set completefunc=
167ffa96841SBram Moolenaar
168ffa96841SBram Moolenaar  let s:args = []
169ffa96841SBram Moolenaar  set omnifunc=CompleteFunc
170ffa96841SBram Moolenaar  call feedkeys("i\<C-X>\<C-O>\<Esc>", 'x')
17152d3aaeeSBram Moolenaar  call assert_equal([1, 1], s:args[0])
17252d3aaeeSBram Moolenaar  call assert_equal(0, s:args[1][0])
173ffa96841SBram Moolenaar  set omnifunc=
174ffa96841SBram Moolenaar
175ffa96841SBram Moolenaar  bwipe!
176ffa96841SBram Moolenaar  unlet s:args
177ffa96841SBram Moolenaar  delfunc CompleteFunc
178ffa96841SBram Moolenaarendfunc
179ffa96841SBram Moolenaar
180cee9bc2eSBram Moolenaarfunc s:CompleteDone_CompleteFuncNone( findstart, base )
181cee9bc2eSBram Moolenaar  if a:findstart
182cee9bc2eSBram Moolenaar    return 0
183cee9bc2eSBram Moolenaar  endif
184cee9bc2eSBram Moolenaar
185cee9bc2eSBram Moolenaar  return v:none
186cee9bc2eSBram Moolenaarendfunc
187cee9bc2eSBram Moolenaar
1881e115360SBram Moolenaarfunc s:CompleteDone_CompleteFuncDict( findstart, base )
1899b56a57cSBram Moolenaar  if a:findstart
1909b56a57cSBram Moolenaar    return 0
1919b56a57cSBram Moolenaar  endif
1929b56a57cSBram Moolenaar
1939b56a57cSBram Moolenaar  return {
1949b56a57cSBram Moolenaar	  \ 'words': [
1959b56a57cSBram Moolenaar	    \ {
1969b56a57cSBram Moolenaar	      \ 'word': 'aword',
1979b56a57cSBram Moolenaar	      \ 'abbr': 'wrd',
1989b56a57cSBram Moolenaar	      \ 'menu': 'extra text',
1999b56a57cSBram Moolenaar	      \ 'info': 'words are cool',
2009b56a57cSBram Moolenaar	      \ 'kind': 'W',
2019b56a57cSBram Moolenaar	      \ 'user_data': 'test'
2029b56a57cSBram Moolenaar	    \ }
2039b56a57cSBram Moolenaar	  \ ]
2049b56a57cSBram Moolenaar	\ }
2051e115360SBram Moolenaarendfunc
2069b56a57cSBram Moolenaar
207cee9bc2eSBram Moolenaarfunc s:CompleteDone_CheckCompletedItemNone()
208cee9bc2eSBram Moolenaar  let s:called_completedone = 1
209cee9bc2eSBram Moolenaarendfunc
210cee9bc2eSBram Moolenaar
2113f169ce1SBram Moolenaarfunc s:CompleteDone_CheckCompletedItemDict(pre)
2129b56a57cSBram Moolenaar  call assert_equal( 'aword',          v:completed_item[ 'word' ] )
2139b56a57cSBram Moolenaar  call assert_equal( 'wrd',            v:completed_item[ 'abbr' ] )
2149b56a57cSBram Moolenaar  call assert_equal( 'extra text',     v:completed_item[ 'menu' ] )
2159b56a57cSBram Moolenaar  call assert_equal( 'words are cool', v:completed_item[ 'info' ] )
2169b56a57cSBram Moolenaar  call assert_equal( 'W',              v:completed_item[ 'kind' ] )
2179b56a57cSBram Moolenaar  call assert_equal( 'test',           v:completed_item[ 'user_data' ] )
2189b56a57cSBram Moolenaar
2193f169ce1SBram Moolenaar  if a:pre
22017e04781SBram Moolenaar    call assert_equal('function', complete_info().mode)
2213f169ce1SBram Moolenaar  endif
22217e04781SBram Moolenaar
2239b56a57cSBram Moolenaar  let s:called_completedone = 1
2241e115360SBram Moolenaarendfunc
2259b56a57cSBram Moolenaar
226cee9bc2eSBram Moolenaarfunc Test_CompleteDoneNone()
227cee9bc2eSBram Moolenaar  au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemNone()
2289845f36aSBram Moolenaar  let oldline = join(map(range(&columns), 'nr2char(screenchar(&lines-1, v:val+1))'), '')
229cee9bc2eSBram Moolenaar
230cee9bc2eSBram Moolenaar  set completefunc=<SID>CompleteDone_CompleteFuncNone
231cee9bc2eSBram Moolenaar  execute "normal a\<C-X>\<C-U>\<C-Y>"
232cee9bc2eSBram Moolenaar  set completefunc&
2339845f36aSBram Moolenaar  let newline = join(map(range(&columns), 'nr2char(screenchar(&lines-1, v:val+1))'), '')
234cee9bc2eSBram Moolenaar
235cee9bc2eSBram Moolenaar  call assert_true(s:called_completedone)
2369845f36aSBram Moolenaar  call assert_equal(oldline, newline)
237cee9bc2eSBram Moolenaar
238cee9bc2eSBram Moolenaar  let s:called_completedone = 0
239cee9bc2eSBram Moolenaar  au! CompleteDone
240cee9bc2eSBram Moolenaarendfunc
241cee9bc2eSBram Moolenaar
242cee9bc2eSBram Moolenaarfunc Test_CompleteDoneDict()
2433f169ce1SBram Moolenaar  au CompleteDonePre * :call <SID>CompleteDone_CheckCompletedItemDict(1)
2443f169ce1SBram Moolenaar  au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDict(0)
2459b56a57cSBram Moolenaar
2469b56a57cSBram Moolenaar  set completefunc=<SID>CompleteDone_CompleteFuncDict
2479b56a57cSBram Moolenaar  execute "normal a\<C-X>\<C-U>\<C-Y>"
2489b56a57cSBram Moolenaar  set completefunc&
2499b56a57cSBram Moolenaar
2509b56a57cSBram Moolenaar  call assert_equal('test', v:completed_item[ 'user_data' ])
2519b56a57cSBram Moolenaar  call assert_true(s:called_completedone)
2529b56a57cSBram Moolenaar
2539b56a57cSBram Moolenaar  let s:called_completedone = 0
2549b56a57cSBram Moolenaar  au! CompleteDone
2559b56a57cSBram Moolenaarendfunc
2569b56a57cSBram Moolenaar
2571e115360SBram Moolenaarfunc s:CompleteDone_CompleteFuncDictNoUserData(findstart, base)
2589b56a57cSBram Moolenaar  if a:findstart
2599b56a57cSBram Moolenaar    return 0
2609b56a57cSBram Moolenaar  endif
2619b56a57cSBram Moolenaar
2629b56a57cSBram Moolenaar  return {
2639b56a57cSBram Moolenaar	  \ 'words': [
2649b56a57cSBram Moolenaar	    \ {
2659b56a57cSBram Moolenaar	      \ 'word': 'aword',
2669b56a57cSBram Moolenaar	      \ 'abbr': 'wrd',
2679b56a57cSBram Moolenaar	      \ 'menu': 'extra text',
2689b56a57cSBram Moolenaar	      \ 'info': 'words are cool',
2690892832bSBram Moolenaar	      \ 'kind': 'W',
2700892832bSBram Moolenaar	      \ 'user_data': ['one', 'two'],
2719b56a57cSBram Moolenaar	    \ }
2729b56a57cSBram Moolenaar	  \ ]
2739b56a57cSBram Moolenaar	\ }
2741e115360SBram Moolenaarendfunc
2759b56a57cSBram Moolenaar
2761e115360SBram Moolenaarfunc s:CompleteDone_CheckCompletedItemDictNoUserData()
2779b56a57cSBram Moolenaar  call assert_equal( 'aword',          v:completed_item[ 'word' ] )
2789b56a57cSBram Moolenaar  call assert_equal( 'wrd',            v:completed_item[ 'abbr' ] )
2799b56a57cSBram Moolenaar  call assert_equal( 'extra text',     v:completed_item[ 'menu' ] )
2809b56a57cSBram Moolenaar  call assert_equal( 'words are cool', v:completed_item[ 'info' ] )
2819b56a57cSBram Moolenaar  call assert_equal( 'W',              v:completed_item[ 'kind' ] )
2820892832bSBram Moolenaar  call assert_equal( ['one', 'two'],   v:completed_item[ 'user_data' ] )
2839b56a57cSBram Moolenaar
2849b56a57cSBram Moolenaar  let s:called_completedone = 1
2851e115360SBram Moolenaarendfunc
2869b56a57cSBram Moolenaar
287cee9bc2eSBram Moolenaarfunc Test_CompleteDoneDictNoUserData()
2889b56a57cSBram Moolenaar  au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemDictNoUserData()
2899b56a57cSBram Moolenaar
2909b56a57cSBram Moolenaar  set completefunc=<SID>CompleteDone_CompleteFuncDictNoUserData
2919b56a57cSBram Moolenaar  execute "normal a\<C-X>\<C-U>\<C-Y>"
2929b56a57cSBram Moolenaar  set completefunc&
2939b56a57cSBram Moolenaar
2940892832bSBram Moolenaar  call assert_equal(['one', 'two'], v:completed_item[ 'user_data' ])
2959b56a57cSBram Moolenaar  call assert_true(s:called_completedone)
2969b56a57cSBram Moolenaar
2979b56a57cSBram Moolenaar  let s:called_completedone = 0
2989b56a57cSBram Moolenaar  au! CompleteDone
2999b56a57cSBram Moolenaarendfunc
3009b56a57cSBram Moolenaar
3011e115360SBram Moolenaarfunc s:CompleteDone_CompleteFuncList(findstart, base)
3029b56a57cSBram Moolenaar  if a:findstart
3039b56a57cSBram Moolenaar    return 0
3049b56a57cSBram Moolenaar  endif
3059b56a57cSBram Moolenaar
3069b56a57cSBram Moolenaar  return [ 'aword' ]
3071e115360SBram Moolenaarendfunc
3089b56a57cSBram Moolenaar
3091e115360SBram Moolenaarfunc s:CompleteDone_CheckCompletedItemList()
3109b56a57cSBram Moolenaar  call assert_equal( 'aword', v:completed_item[ 'word' ] )
3119b56a57cSBram Moolenaar  call assert_equal( '',      v:completed_item[ 'abbr' ] )
3129b56a57cSBram Moolenaar  call assert_equal( '',      v:completed_item[ 'menu' ] )
3139b56a57cSBram Moolenaar  call assert_equal( '',      v:completed_item[ 'info' ] )
3149b56a57cSBram Moolenaar  call assert_equal( '',      v:completed_item[ 'kind' ] )
3159b56a57cSBram Moolenaar  call assert_equal( '',      v:completed_item[ 'user_data' ] )
3169b56a57cSBram Moolenaar
3179b56a57cSBram Moolenaar  let s:called_completedone = 1
3181e115360SBram Moolenaarendfunc
3199b56a57cSBram Moolenaar
320cee9bc2eSBram Moolenaarfunc Test_CompleteDoneList()
3219b56a57cSBram Moolenaar  au CompleteDone * :call <SID>CompleteDone_CheckCompletedItemList()
3229b56a57cSBram Moolenaar
3239b56a57cSBram Moolenaar  set completefunc=<SID>CompleteDone_CompleteFuncList
3249b56a57cSBram Moolenaar  execute "normal a\<C-X>\<C-U>\<C-Y>"
3259b56a57cSBram Moolenaar  set completefunc&
3269b56a57cSBram Moolenaar
3279b56a57cSBram Moolenaar  call assert_equal('', v:completed_item[ 'user_data' ])
3289b56a57cSBram Moolenaar  call assert_true(s:called_completedone)
3299b56a57cSBram Moolenaar
3309b56a57cSBram Moolenaar  let s:called_completedone = 0
3319b56a57cSBram Moolenaar  au! CompleteDone
3329b56a57cSBram Moolenaarendfunc
3339b56a57cSBram Moolenaar
334af559d2cSBram Moolenaarfunc Test_CompleteDone_undo()
335af559d2cSBram Moolenaar  au CompleteDone * call append(0, "prepend1")
336af559d2cSBram Moolenaar  new
337af559d2cSBram Moolenaar  call setline(1, ["line1", "line2"])
338af559d2cSBram Moolenaar  call feedkeys("Go\<C-X>\<C-N>\<CR>\<ESC>", "tx")
339af559d2cSBram Moolenaar  call assert_equal(["prepend1", "line1", "line2", "line1", ""],
340af559d2cSBram Moolenaar              \     getline(1, '$'))
341af559d2cSBram Moolenaar  undo
342af559d2cSBram Moolenaar  call assert_equal(["line1", "line2"], getline(1, '$'))
343af559d2cSBram Moolenaar  bwipe!
344af559d2cSBram Moolenaar  au! CompleteDone
345af559d2cSBram Moolenaarendfunc
346af559d2cSBram Moolenaar
347b806aa5bSBram Moolenaarfunc CompleteTest(findstart, query)
348b806aa5bSBram Moolenaar  if a:findstart
349b806aa5bSBram Moolenaar    return col('.')
350b806aa5bSBram Moolenaar  endif
351b806aa5bSBram Moolenaar  return ['matched']
352b806aa5bSBram Moolenaarendfunc
353b806aa5bSBram Moolenaar
354b806aa5bSBram Moolenaarfunc Test_completefunc_info()
355b806aa5bSBram Moolenaar  new
356b806aa5bSBram Moolenaar  set completeopt=menuone
357b806aa5bSBram Moolenaar  set completefunc=CompleteTest
358b806aa5bSBram Moolenaar  call feedkeys("i\<C-X>\<C-U>\<C-R>\<C-R>=string(complete_info())\<CR>\<ESC>", "tx")
359f9d51354SBram Moolenaar  call assert_equal("matched{'pum_visible': 1, 'mode': 'function', 'selected': 0, 'items': [{'word': 'matched', 'menu': '', 'user_data': '', 'info': '', 'kind': '', 'abbr': ''}]}", getline(1))
360b806aa5bSBram Moolenaar  bwipe!
361b806aa5bSBram Moolenaar  set completeopt&
362b806aa5bSBram Moolenaar  set completefunc&
363b806aa5bSBram Moolenaarendfunc
364b806aa5bSBram Moolenaar
36502ae9b4aSBram Moolenaar" Check that when using feedkeys() typeahead does not interrupt searching for
36602ae9b4aSBram Moolenaar" completions.
36702ae9b4aSBram Moolenaarfunc Test_compl_feedkeys()
36802ae9b4aSBram Moolenaar  new
36902ae9b4aSBram Moolenaar  set completeopt=menuone,noselect
37002ae9b4aSBram Moolenaar  call feedkeys("ajump ju\<C-X>\<C-N>\<C-P>\<ESC>", "tx")
37102ae9b4aSBram Moolenaar  call assert_equal("jump jump", getline(1))
37202ae9b4aSBram Moolenaar  bwipe!
37302ae9b4aSBram Moolenaar  set completeopt&
37402ae9b4aSBram Moolenaarendfunc
375f03e3283SBram Moolenaar
376*a1198124Smityufunc s:ComplInCmdwin_GlobalCompletion(a, l, p)
377*a1198124Smityu  return 'global'
378*a1198124Smityuendfunc
379*a1198124Smityu
380*a1198124Smityufunc s:ComplInCmdwin_LocalCompletion(a, l, p)
381*a1198124Smityu  return 'local'
382*a1198124Smityuendfunc
383*a1198124Smityu
384f03e3283SBram Moolenaarfunc Test_compl_in_cmdwin()
38521829c5fSBram Moolenaar  CheckFeature cmdwin
38621829c5fSBram Moolenaar
387f03e3283SBram Moolenaar  set wildmenu wildchar=<Tab>
388f03e3283SBram Moolenaar  com! -nargs=1 -complete=command GetInput let input = <q-args>
389f03e3283SBram Moolenaar  com! -buffer TestCommand echo 'TestCommand'
3904ff2f2fbSBram Moolenaar  let w:test_winvar = 'winvar'
3914ff2f2fbSBram Moolenaar  let b:test_bufvar = 'bufvar'
392f03e3283SBram Moolenaar
3934ff2f2fbSBram Moolenaar  " User-defined commands
394f03e3283SBram Moolenaar  let input = ''
395f03e3283SBram Moolenaar  call feedkeys("q:iGetInput T\<C-x>\<C-v>\<CR>", 'tx!')
396f03e3283SBram Moolenaar  call assert_equal('TestCommand', input)
397f03e3283SBram Moolenaar
398f03e3283SBram Moolenaar  let input = ''
399f03e3283SBram Moolenaar  call feedkeys("q::GetInput T\<Tab>\<CR>:q\<CR>", 'tx!')
400f03e3283SBram Moolenaar  call assert_equal('T', input)
401f03e3283SBram Moolenaar
4024ff2f2fbSBram Moolenaar
4034ff2f2fbSBram Moolenaar  com! -nargs=1 -complete=var GetInput let input = <q-args>
4044ff2f2fbSBram Moolenaar  " Window-local variables
4054ff2f2fbSBram Moolenaar  let input = ''
4064ff2f2fbSBram Moolenaar  call feedkeys("q:iGetInput w:test_\<C-x>\<C-v>\<CR>", 'tx!')
4074ff2f2fbSBram Moolenaar  call assert_equal('w:test_winvar', input)
4084ff2f2fbSBram Moolenaar
4094ff2f2fbSBram Moolenaar  let input = ''
4104ff2f2fbSBram Moolenaar  call feedkeys("q::GetInput w:test_\<Tab>\<CR>:q\<CR>", 'tx!')
4114ff2f2fbSBram Moolenaar  call assert_equal('w:test_', input)
4124ff2f2fbSBram Moolenaar
4134ff2f2fbSBram Moolenaar  " Buffer-local variables
4144ff2f2fbSBram Moolenaar  let input = ''
4154ff2f2fbSBram Moolenaar  call feedkeys("q:iGetInput b:test_\<C-x>\<C-v>\<CR>", 'tx!')
4164ff2f2fbSBram Moolenaar  call assert_equal('b:test_bufvar', input)
4174ff2f2fbSBram Moolenaar
4184ff2f2fbSBram Moolenaar  let input = ''
4194ff2f2fbSBram Moolenaar  call feedkeys("q::GetInput b:test_\<Tab>\<CR>:q\<CR>", 'tx!')
4204ff2f2fbSBram Moolenaar  call assert_equal('b:test_', input)
4214ff2f2fbSBram Moolenaar
422*a1198124Smityu
423*a1198124Smityu  " Argument completion of buffer-local command
424*a1198124Smityu  func s:ComplInCmdwin_GlobalCompletionList(a, l, p)
425*a1198124Smityu    return ['global']
426*a1198124Smityu  endfunc
427*a1198124Smityu
428*a1198124Smityu  func s:ComplInCmdwin_LocalCompletionList(a, l, p)
429*a1198124Smityu    return ['local']
430*a1198124Smityu  endfunc
431*a1198124Smityu
432*a1198124Smityu  func s:ComplInCmdwin_CheckCompletion(arg)
433*a1198124Smityu    call assert_equal('local', a:arg)
434*a1198124Smityu  endfunc
435*a1198124Smityu
436*a1198124Smityu  com! -nargs=1 -complete=custom,<SID>ComplInCmdwin_GlobalCompletion
437*a1198124Smityu       \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>)
438*a1198124Smityu  com! -buffer -nargs=1 -complete=custom,<SID>ComplInCmdwin_LocalCompletion
439*a1198124Smityu       \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>)
440*a1198124Smityu  call feedkeys("q:iTestCommand \<Tab>\<CR>", 'tx!')
441*a1198124Smityu
442*a1198124Smityu  com! -nargs=1 -complete=customlist,<SID>ComplInCmdwin_GlobalCompletionList
443*a1198124Smityu       \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>)
444*a1198124Smityu  com! -buffer -nargs=1 -complete=customlist,<SID>ComplInCmdwin_LocalCompletionList
445*a1198124Smityu       \ TestCommand call s:ComplInCmdwin_CheckCompletion(<q-args>)
446*a1198124Smityu
447*a1198124Smityu  call feedkeys("q:iTestCommand \<Tab>\<CR>", 'tx!')
448*a1198124Smityu
449*a1198124Smityu  func! s:ComplInCmdwin_CheckCompletion(arg)
450*a1198124Smityu    call assert_equal('global', a:arg)
451*a1198124Smityu  endfunc
452*a1198124Smityu  new
453*a1198124Smityu  call feedkeys("q:iTestCommand \<Tab>\<CR>", 'tx!')
454*a1198124Smityu  quit
455*a1198124Smityu
456*a1198124Smityu  delfunc s:ComplInCmdwin_GlobalCompletion
457*a1198124Smityu  delfunc s:ComplInCmdwin_LocalCompletion
458*a1198124Smityu  delfunc s:ComplInCmdwin_GlobalCompletionList
459*a1198124Smityu  delfunc s:ComplInCmdwin_LocalCompletionList
460*a1198124Smityu  delfunc s:ComplInCmdwin_CheckCompletion
461*a1198124Smityu
462*a1198124Smityu  delcom -buffer TestCommand
463f03e3283SBram Moolenaar  delcom TestCommand
464f03e3283SBram Moolenaar  delcom GetInput
4654ff2f2fbSBram Moolenaar  unlet w:test_winvar
4664ff2f2fbSBram Moolenaar  unlet b:test_bufvar
467f03e3283SBram Moolenaar  set wildmenu& wildchar&
468f03e3283SBram Moolenaarendfunc
469ac3150d3SBram Moolenaar
470ac3150d3SBram Moolenaar" Test for insert path completion with completeslash option
471ac3150d3SBram Moolenaarfunc Test_ins_completeslash()
47250f91d22SBram Moolenaar  CheckMSWindows
473ac3150d3SBram Moolenaar
474ac3150d3SBram Moolenaar  call mkdir('Xdir')
475ac3150d3SBram Moolenaar  let orig_shellslash = &shellslash
476ac3150d3SBram Moolenaar  set cpt&
477ac3150d3SBram Moolenaar  new
478ac3150d3SBram Moolenaar
479ac3150d3SBram Moolenaar  set noshellslash
480ac3150d3SBram Moolenaar
481ac3150d3SBram Moolenaar  set completeslash=
482ac3150d3SBram Moolenaar  exe "normal oXd\<C-X>\<C-F>"
483ac3150d3SBram Moolenaar  call assert_equal('Xdir\', getline('.'))
484ac3150d3SBram Moolenaar
485ac3150d3SBram Moolenaar  set completeslash=backslash
486ac3150d3SBram Moolenaar  exe "normal oXd\<C-X>\<C-F>"
487ac3150d3SBram Moolenaar  call assert_equal('Xdir\', getline('.'))
488ac3150d3SBram Moolenaar
489ac3150d3SBram Moolenaar  set completeslash=slash
490ac3150d3SBram Moolenaar  exe "normal oXd\<C-X>\<C-F>"
491ac3150d3SBram Moolenaar  call assert_equal('Xdir/', getline('.'))
492ac3150d3SBram Moolenaar
493ac3150d3SBram Moolenaar  set shellslash
494ac3150d3SBram Moolenaar
495ac3150d3SBram Moolenaar  set completeslash=
496ac3150d3SBram Moolenaar  exe "normal oXd\<C-X>\<C-F>"
497ac3150d3SBram Moolenaar  call assert_equal('Xdir/', getline('.'))
498ac3150d3SBram Moolenaar
499ac3150d3SBram Moolenaar  set completeslash=backslash
500ac3150d3SBram Moolenaar  exe "normal oXd\<C-X>\<C-F>"
501ac3150d3SBram Moolenaar  call assert_equal('Xdir\', getline('.'))
502ac3150d3SBram Moolenaar
503ac3150d3SBram Moolenaar  set completeslash=slash
504ac3150d3SBram Moolenaar  exe "normal oXd\<C-X>\<C-F>"
505ac3150d3SBram Moolenaar  call assert_equal('Xdir/', getline('.'))
506ac3150d3SBram Moolenaar  %bw!
507ac3150d3SBram Moolenaar  call delete('Xdir', 'rf')
508ac3150d3SBram Moolenaar
50950f91d22SBram Moolenaar  set noshellslash
51050f91d22SBram Moolenaar  set completeslash=slash
51150f91d22SBram Moolenaar  call assert_true(stridx(globpath(&rtp, 'syntax/*.vim', 1, 1)[0], '\') != -1)
51250f91d22SBram Moolenaar
513ac3150d3SBram Moolenaar  let &shellslash = orig_shellslash
51450f91d22SBram Moolenaar  set completeslash=
515ac3150d3SBram Moolenaarendfunc
516ac3150d3SBram Moolenaar
517d0e1b710SBram Moolenaarfunc Test_pum_stopped_by_timer()
518d0e1b710SBram Moolenaar  CheckScreendump
519d0e1b710SBram Moolenaar
520d0e1b710SBram Moolenaar  let lines =<< trim END
521d0e1b710SBram Moolenaar    call setline(1, ['hello', 'hullo', 'heeee', ''])
522d0e1b710SBram Moolenaar    func StartCompl()
523d0e1b710SBram Moolenaar      call timer_start(100, { -> execute('stopinsert') })
524d0e1b710SBram Moolenaar      call feedkeys("Gah\<C-N>")
525d0e1b710SBram Moolenaar    endfunc
526d0e1b710SBram Moolenaar  END
527d0e1b710SBram Moolenaar
528d0e1b710SBram Moolenaar  call writefile(lines, 'Xpumscript')
529d0e1b710SBram Moolenaar  let buf = RunVimInTerminal('-S Xpumscript', #{rows: 12})
530d0e1b710SBram Moolenaar  call term_sendkeys(buf, ":call StartCompl()\<CR>")
531d0e1b710SBram Moolenaar  call TermWait(buf, 200)
532d0e1b710SBram Moolenaar  call term_sendkeys(buf, "k")
533d0e1b710SBram Moolenaar  call VerifyScreenDump(buf, 'Test_pum_stopped_by_timer', {})
534d0e1b710SBram Moolenaar
535d0e1b710SBram Moolenaar  call StopVimInTerminal(buf)
536d0e1b710SBram Moolenaar  call delete('Xpumscript')
537d0e1b710SBram Moolenaarendfunc
538d0e1b710SBram Moolenaar
53909dd2bb3SBram Moolenaarfunc Test_pum_with_folds_two_tabs()
54009dd2bb3SBram Moolenaar  CheckScreendump
54109dd2bb3SBram Moolenaar
54209dd2bb3SBram Moolenaar  let lines =<< trim END
54309dd2bb3SBram Moolenaar    set fdm=marker
54409dd2bb3SBram Moolenaar    call setline(1, ['" x {{{1', '" a some text'])
54509dd2bb3SBram Moolenaar    call setline(3, range(&lines)->map({_, val -> '" a' .. val}))
54609dd2bb3SBram Moolenaar    norm! zm
54709dd2bb3SBram Moolenaar    tab sp
54809dd2bb3SBram Moolenaar    call feedkeys('2Gzv', 'xt')
54909dd2bb3SBram Moolenaar    call feedkeys("0fa", 'xt')
55009dd2bb3SBram Moolenaar  END
55109dd2bb3SBram Moolenaar
55209dd2bb3SBram Moolenaar  call writefile(lines, 'Xpumscript')
55309dd2bb3SBram Moolenaar  let buf = RunVimInTerminal('-S Xpumscript', #{rows: 10})
5546a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
55509dd2bb3SBram Moolenaar  call term_sendkeys(buf, "a\<C-N>")
55609dd2bb3SBram Moolenaar  call VerifyScreenDump(buf, 'Test_pum_with_folds_two_tabs', {})
55709dd2bb3SBram Moolenaar
55809dd2bb3SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
55909dd2bb3SBram Moolenaar  call StopVimInTerminal(buf)
56009dd2bb3SBram Moolenaar  call delete('Xpumscript')
56109dd2bb3SBram Moolenaarendfunc
5625e5a98d7SBram Moolenaar
5635e5a98d7SBram Moolenaarfunc Test_pum_with_preview_win()
5645e5a98d7SBram Moolenaar  CheckScreendump
5655e5a98d7SBram Moolenaar
5665e5a98d7SBram Moolenaar  let lines =<< trim END
5675e5a98d7SBram Moolenaar      funct Omni_test(findstart, base)
5685e5a98d7SBram Moolenaar	if a:findstart
5695e5a98d7SBram Moolenaar	  return col(".") - 1
5705e5a98d7SBram Moolenaar	endif
5715e5a98d7SBram Moolenaar	return [#{word: "one", info: "1info"}, #{word: "two", info: "2info"}, #{word: "three", info: "3info"}]
5725e5a98d7SBram Moolenaar      endfunc
5735e5a98d7SBram Moolenaar      set omnifunc=Omni_test
5745e5a98d7SBram Moolenaar      set completeopt+=longest
5755e5a98d7SBram Moolenaar  END
5765e5a98d7SBram Moolenaar
5775e5a98d7SBram Moolenaar  call writefile(lines, 'Xpreviewscript')
5785e5a98d7SBram Moolenaar  let buf = RunVimInTerminal('-S Xpreviewscript', #{rows: 12})
5796a2c5a7dSBram Moolenaar  call TermWait(buf, 50)
5805e5a98d7SBram Moolenaar  call term_sendkeys(buf, "Gi\<C-X>\<C-O>")
5816a2c5a7dSBram Moolenaar  call TermWait(buf, 100)
5825e5a98d7SBram Moolenaar  call term_sendkeys(buf, "\<C-N>")
5835e5a98d7SBram Moolenaar  call VerifyScreenDump(buf, 'Test_pum_with_preview_win', {})
5845e5a98d7SBram Moolenaar
5855e5a98d7SBram Moolenaar  call term_sendkeys(buf, "\<Esc>")
5865e5a98d7SBram Moolenaar  call StopVimInTerminal(buf)
5875e5a98d7SBram Moolenaar  call delete('Xpreviewscript')
5885e5a98d7SBram Moolenaarendfunc
589830c1afcSBram Moolenaar
590830c1afcSBram Moolenaar" Test for inserting the tag search pattern in insert mode
591830c1afcSBram Moolenaarfunc Test_ins_compl_tag_sft()
592830c1afcSBram Moolenaar  call writefile([
593830c1afcSBram Moolenaar        \ "!_TAG_FILE_ENCODING\tutf-8\t//",
594830c1afcSBram Moolenaar        \ "first\tXfoo\t/^int first() {}$/",
595830c1afcSBram Moolenaar        \ "second\tXfoo\t/^int second() {}$/",
596830c1afcSBram Moolenaar        \ "third\tXfoo\t/^int third() {}$/"],
597830c1afcSBram Moolenaar        \ 'Xtags')
598830c1afcSBram Moolenaar  set tags=Xtags
599830c1afcSBram Moolenaar  let code =<< trim [CODE]
600830c1afcSBram Moolenaar    int first() {}
601830c1afcSBram Moolenaar    int second() {}
602830c1afcSBram Moolenaar    int third() {}
603830c1afcSBram Moolenaar  [CODE]
604830c1afcSBram Moolenaar  call writefile(code, 'Xfoo')
605830c1afcSBram Moolenaar
606830c1afcSBram Moolenaar  enew
607830c1afcSBram Moolenaar  set showfulltag
608830c1afcSBram Moolenaar  exe "normal isec\<C-X>\<C-]>\<C-N>\<CR>"
609830c1afcSBram Moolenaar  call assert_equal('int second() {}', getline(1))
610830c1afcSBram Moolenaar  set noshowfulltag
611830c1afcSBram Moolenaar
612830c1afcSBram Moolenaar  call delete('Xtags')
613830c1afcSBram Moolenaar  call delete('Xfoo')
614830c1afcSBram Moolenaar  set tags&
615830c1afcSBram Moolenaar  %bwipe!
616830c1afcSBram Moolenaarendfunc
617ee4e0c1eSBram Moolenaar
618ee4e0c1eSBram Moolenaar" Test for 'completefunc' deleting text
619ee4e0c1eSBram Moolenaarfunc Test_completefunc_error()
620ee4e0c1eSBram Moolenaar  new
621ad48e6c1SBram Moolenaar  " delete text when called for the first time
622ee4e0c1eSBram Moolenaar  func CompleteFunc(findstart, base)
623ee4e0c1eSBram Moolenaar    if a:findstart == 1
624ee4e0c1eSBram Moolenaar      normal dd
625ee4e0c1eSBram Moolenaar      return col('.') - 1
626ee4e0c1eSBram Moolenaar    endif
627ee4e0c1eSBram Moolenaar    return ['a', 'b']
628ee4e0c1eSBram Moolenaar  endfunc
629ee4e0c1eSBram Moolenaar  set completefunc=CompleteFunc
630ee4e0c1eSBram Moolenaar  call setline(1, ['', 'abcd', ''])
6313eb6bd9cSBram Moolenaar  call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E578:')
632ad48e6c1SBram Moolenaar
633ad48e6c1SBram Moolenaar  " delete text when called for the second time
634ad48e6c1SBram Moolenaar  func CompleteFunc2(findstart, base)
635ad48e6c1SBram Moolenaar    if a:findstart == 1
636ad48e6c1SBram Moolenaar      return col('.') - 1
637ad48e6c1SBram Moolenaar    endif
638ad48e6c1SBram Moolenaar    normal dd
639ad48e6c1SBram Moolenaar    return ['a', 'b']
640ad48e6c1SBram Moolenaar  endfunc
641ad48e6c1SBram Moolenaar  set completefunc=CompleteFunc2
642ad48e6c1SBram Moolenaar  call setline(1, ['', 'abcd', ''])
6436adb9ea0SBram Moolenaar  call assert_fails('exe "normal 2G$a\<C-X>\<C-U>"', 'E578:')
644ad48e6c1SBram Moolenaar
64597202d95SBram Moolenaar  " Jump to a different window from the complete function
64628976e2aSBram Moolenaar  func CompleteFunc3(findstart, base)
64797202d95SBram Moolenaar    if a:findstart == 1
64897202d95SBram Moolenaar      return col('.') - 1
64997202d95SBram Moolenaar    endif
65097202d95SBram Moolenaar    wincmd p
65197202d95SBram Moolenaar    return ['a', 'b']
65297202d95SBram Moolenaar  endfunc
65328976e2aSBram Moolenaar  set completefunc=CompleteFunc3
65497202d95SBram Moolenaar  new
65528976e2aSBram Moolenaar  call assert_fails('exe "normal a\<C-X>\<C-U>"', 'E565:')
65697202d95SBram Moolenaar  close!
65797202d95SBram Moolenaar
65897202d95SBram Moolenaar  set completefunc&
65997202d95SBram Moolenaar  delfunc CompleteFunc
66028976e2aSBram Moolenaar  delfunc CompleteFunc2
66128976e2aSBram Moolenaar  delfunc CompleteFunc3
66228976e2aSBram Moolenaar  close!
66397202d95SBram Moolenaarendfunc
66497202d95SBram Moolenaar
665f9ab52e1SBram Moolenaar" Test for returning non-string values from 'completefunc'
666f9ab52e1SBram Moolenaarfunc Test_completefunc_invalid_data()
667f9ab52e1SBram Moolenaar  new
668f9ab52e1SBram Moolenaar  func! CompleteFunc(findstart, base)
669f9ab52e1SBram Moolenaar    if a:findstart == 1
670f9ab52e1SBram Moolenaar      return col('.') - 1
671f9ab52e1SBram Moolenaar    endif
672f9ab52e1SBram Moolenaar    return [{}, '', 'moon']
673f9ab52e1SBram Moolenaar  endfunc
674f9ab52e1SBram Moolenaar  set completefunc=CompleteFunc
675f9ab52e1SBram Moolenaar  exe "normal i\<C-X>\<C-U>"
676f9ab52e1SBram Moolenaar  call assert_equal('moon', getline(1))
677f9ab52e1SBram Moolenaar  set completefunc&
678f9ab52e1SBram Moolenaar  close!
679f9ab52e1SBram Moolenaarendfunc
680f9ab52e1SBram Moolenaar
681ad48e6c1SBram Moolenaar" Test for errors in using complete() function
682ad48e6c1SBram Moolenaarfunc Test_complete_func_error()
683ad48e6c1SBram Moolenaar  call assert_fails('call complete(1, ["a"])', 'E785:')
684ad48e6c1SBram Moolenaar  func ListColors()
685ad48e6c1SBram Moolenaar    call complete(col('.'), "blue")
686ad48e6c1SBram Moolenaar  endfunc
687ad48e6c1SBram Moolenaar  call assert_fails('exe "normal i\<C-R>=ListColors()\<CR>"', 'E474:')
688ad48e6c1SBram Moolenaar  func ListMonths()
689ad48e6c1SBram Moolenaar    call complete(col('.'), test_null_list())
690ad48e6c1SBram Moolenaar  endfunc
691ad48e6c1SBram Moolenaar  call assert_fails('exe "normal i\<C-R>=ListMonths()\<CR>"', 'E474:')
692ad48e6c1SBram Moolenaar  delfunc ListColors
693ad48e6c1SBram Moolenaar  delfunc ListMonths
694ad48e6c1SBram Moolenaar  call assert_fails('call complete_info({})', 'E714:')
695f9ab52e1SBram Moolenaar  call assert_equal([], complete_info(['items']).items)
696ad48e6c1SBram Moolenaarendfunc
697ad48e6c1SBram Moolenaar
698224a5f17SBram Moolenaar" Test for completing words following a completed word in a line
699224a5f17SBram Moolenaarfunc Test_complete_wrapscan()
700224a5f17SBram Moolenaar  " complete words from another buffer
701224a5f17SBram Moolenaar  new
702224a5f17SBram Moolenaar  call setline(1, ['one two', 'three four'])
703224a5f17SBram Moolenaar  new
704224a5f17SBram Moolenaar  setlocal complete=w
705224a5f17SBram Moolenaar  call feedkeys("itw\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>", 'xt')
706224a5f17SBram Moolenaar  call assert_equal('two three four', getline(1))
707224a5f17SBram Moolenaar  close!
708224a5f17SBram Moolenaar  " complete words from the current buffer
709224a5f17SBram Moolenaar  setlocal complete=.
710224a5f17SBram Moolenaar  %d
711224a5f17SBram Moolenaar  call setline(1, ['one two', ''])
712224a5f17SBram Moolenaar  call cursor(2, 1)
713224a5f17SBram Moolenaar  call feedkeys("ion\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>", 'xt')
714224a5f17SBram Moolenaar  call assert_equal('one two one two', getline(2))
715224a5f17SBram Moolenaar  close!
716224a5f17SBram Moolenaarendfunc
717224a5f17SBram Moolenaar
718f9ab52e1SBram Moolenaar" Test for completing special characters
719f9ab52e1SBram Moolenaarfunc Test_complete_special_chars()
720f9ab52e1SBram Moolenaar  new
721f9ab52e1SBram Moolenaar  call setline(1, 'int .*[-\^$ func float')
722f9ab52e1SBram Moolenaar  call feedkeys("oin\<C-X>\<C-P>\<C-X>\<C-P>\<C-X>\<C-P>", 'xt')
723f9ab52e1SBram Moolenaar  call assert_equal('int .*[-\^$ func float', getline(2))
724f9ab52e1SBram Moolenaar  close!
725f9ab52e1SBram Moolenaarendfunc
726f9ab52e1SBram Moolenaar
727f9ab52e1SBram Moolenaar" Test for completion when text is wrapped across lines.
728f9ab52e1SBram Moolenaarfunc Test_complete_across_line()
729f9ab52e1SBram Moolenaar  new
730f9ab52e1SBram Moolenaar  call setline(1, ['red green blue', 'one two three'])
731f9ab52e1SBram Moolenaar  setlocal textwidth=20
732f9ab52e1SBram Moolenaar  exe "normal 2G$a re\<C-X>\<C-P>\<C-X>\<C-P>\<C-X>\<C-P>\<C-X>\<C-P>"
733f9ab52e1SBram Moolenaar  call assert_equal(['one two three red', 'green blue one'], getline(2, '$'))
734f9ab52e1SBram Moolenaar  close!
735f9ab52e1SBram Moolenaarendfunc
736f9ab52e1SBram Moolenaar
737f9ab52e1SBram Moolenaar" Test for using CTRL-L to add one character when completing matching
738f9ab52e1SBram Moolenaarfunc Test_complete_add_onechar()
739f9ab52e1SBram Moolenaar  new
740f9ab52e1SBram Moolenaar  call setline(1, ['wool', 'woodwork'])
741f9ab52e1SBram Moolenaar  call feedkeys("Gowoo\<C-P>\<C-P>\<C-P>\<C-L>f", 'xt')
742f9ab52e1SBram Moolenaar  call assert_equal('woof', getline(3))
743f9ab52e1SBram Moolenaar
744f9ab52e1SBram Moolenaar  " use 'ignorecase' and backspace to erase characters from the prefix string
745f9ab52e1SBram Moolenaar  " and then add letters using CTRL-L
746f9ab52e1SBram Moolenaar  %d
747f9ab52e1SBram Moolenaar  set ignorecase backspace=2
748f9ab52e1SBram Moolenaar  setlocal complete=.
749f9ab52e1SBram Moolenaar  call setline(1, ['workhorse', 'workload'])
750f9ab52e1SBram Moolenaar  normal Go
751f9ab52e1SBram Moolenaar  exe "normal aWOR\<C-P>\<bs>\<bs>\<bs>\<bs>\<bs>\<bs>\<C-L>r\<C-L>\<C-L>"
752f9ab52e1SBram Moolenaar  call assert_equal('workh', getline(3))
753f9ab52e1SBram Moolenaar  set ignorecase& backspace&
754f9ab52e1SBram Moolenaar  close!
755f9ab52e1SBram Moolenaarendfunc
756f9ab52e1SBram Moolenaar
757f9ab52e1SBram Moolenaar" Test insert completion with 'cindent' (adjust the indent)
758f9ab52e1SBram Moolenaarfunc Test_complete_with_cindent()
759f9ab52e1SBram Moolenaar  new
760f9ab52e1SBram Moolenaar  setlocal cindent
761f9ab52e1SBram Moolenaar  call setline(1, ['if (i == 1)', "    j = 2;"])
762f9ab52e1SBram Moolenaar  exe "normal Go{\<CR>i\<C-X>\<C-L>\<C-X>\<C-L>\<CR>}"
763f9ab52e1SBram Moolenaar  call assert_equal(['{', "\tif (i == 1)", "\t\tj = 2;", '}'], getline(3, '$'))
764f9ab52e1SBram Moolenaar
765f9ab52e1SBram Moolenaar  %d
766f9ab52e1SBram Moolenaar  call setline(1, ['when while', '{', ''])
767f9ab52e1SBram Moolenaar  setlocal cinkeys+==while
768f9ab52e1SBram Moolenaar  exe "normal Giwh\<C-P> "
769f9ab52e1SBram Moolenaar  call assert_equal("\twhile ", getline('$'))
770f9ab52e1SBram Moolenaar  close!
771f9ab52e1SBram Moolenaarendfunc
772f9ab52e1SBram Moolenaar
773f9ab52e1SBram Moolenaar" Test for <CTRL-X> <CTRL-V> completion. Complete commands and functions
774f9ab52e1SBram Moolenaarfunc Test_complete_cmdline()
775f9ab52e1SBram Moolenaar  new
776f9ab52e1SBram Moolenaar  exe "normal icaddb\<C-X>\<C-V>"
777f9ab52e1SBram Moolenaar  call assert_equal('caddbuffer', getline(1))
778f9ab52e1SBram Moolenaar  exe "normal ocall getqf\<C-X>\<C-V>"
779f9ab52e1SBram Moolenaar  call assert_equal('call getqflist(', getline(2))
780f9ab52e1SBram Moolenaar  exe "normal oabcxyz(\<C-X>\<C-V>"
781f9ab52e1SBram Moolenaar  call assert_equal('abcxyz(', getline(3))
782dca29d9cSzeertzjq  com! -buffer TestCommand1 echo 'TestCommand1'
783dca29d9cSzeertzjq  com! -buffer TestCommand2 echo 'TestCommand2'
784dca29d9cSzeertzjq  write TestCommand1Test
785dca29d9cSzeertzjq  write TestCommand2Test
786dca29d9cSzeertzjq  " Test repeating <CTRL-X> <CTRL-V> and switching to another CTRL-X mode
787dca29d9cSzeertzjq  exe "normal oT\<C-X>\<C-V>\<C-X>\<C-V>\<C-X>\<C-F>\<Esc>"
788dca29d9cSzeertzjq  call assert_equal('TestCommand2Test', getline(4))
789dca29d9cSzeertzjq  call delete('TestCommand1Test')
790dca29d9cSzeertzjq  call delete('TestCommand2Test')
791dca29d9cSzeertzjq  delcom TestCommand1
792dca29d9cSzeertzjq  delcom TestCommand2
793dca29d9cSzeertzjq  close!
794dca29d9cSzeertzjqendfunc
795dca29d9cSzeertzjq
796dca29d9cSzeertzjq" Test for <CTRL-X> <CTRL-Z> stopping completion without changing the match
797dca29d9cSzeertzjqfunc Test_complete_stop()
798dca29d9cSzeertzjq  new
799dca29d9cSzeertzjq  func Save_mode1()
800dca29d9cSzeertzjq    let g:mode1 = mode(1)
801dca29d9cSzeertzjq    return ''
802dca29d9cSzeertzjq  endfunc
803dca29d9cSzeertzjq  func Save_mode2()
804dca29d9cSzeertzjq    let g:mode2 = mode(1)
805dca29d9cSzeertzjq    return ''
806dca29d9cSzeertzjq  endfunc
807dca29d9cSzeertzjq  inoremap <F1> <C-R>=Save_mode1()<CR>
808dca29d9cSzeertzjq  inoremap <F2> <C-R>=Save_mode2()<CR>
809dca29d9cSzeertzjq  call setline(1, ['aaa bbb ccc '])
810dca29d9cSzeertzjq  exe "normal A\<C-N>\<C-P>\<F1>\<C-X>\<C-Z>\<F2>\<Esc>"
811dca29d9cSzeertzjq  call assert_equal('ic', g:mode1)
812dca29d9cSzeertzjq  call assert_equal('i', g:mode2)
813dca29d9cSzeertzjq  call assert_equal('aaa bbb ccc ', getline(1))
814dca29d9cSzeertzjq  exe "normal A\<C-N>\<Down>\<F1>\<C-X>\<C-Z>\<F2>\<Esc>"
815dca29d9cSzeertzjq  call assert_equal('ic', g:mode1)
816dca29d9cSzeertzjq  call assert_equal('i', g:mode2)
817dca29d9cSzeertzjq  call assert_equal('aaa bbb ccc aaa', getline(1))
818dca29d9cSzeertzjq  set completeopt+=noselect
819dca29d9cSzeertzjq  exe "normal A \<C-N>\<Down>\<Down>\<C-L>\<C-L>\<F1>\<C-X>\<C-Z>\<F2>\<Esc>"
820dca29d9cSzeertzjq  call assert_equal('ic', g:mode1)
821dca29d9cSzeertzjq  call assert_equal('i', g:mode2)
822dca29d9cSzeertzjq  call assert_equal('aaa bbb ccc aaa bb', getline(1))
823dca29d9cSzeertzjq  set completeopt&
824dca29d9cSzeertzjq  exe "normal A d\<C-N>\<F1>\<C-X>\<C-Z>\<F2>\<Esc>"
825dca29d9cSzeertzjq  call assert_equal('ic', g:mode1)
826dca29d9cSzeertzjq  call assert_equal('i', g:mode2)
827dca29d9cSzeertzjq  call assert_equal('aaa bbb ccc aaa bb d', getline(1))
828dca29d9cSzeertzjq  com! -buffer TestCommand1 echo 'TestCommand1'
829dca29d9cSzeertzjq  com! -buffer TestCommand2 echo 'TestCommand2'
830dca29d9cSzeertzjq  exe "normal oT\<C-X>\<C-V>\<C-X>\<C-V>\<F1>\<C-X>\<C-Z>\<F2>\<Esc>"
831dca29d9cSzeertzjq  call assert_equal('ic', g:mode1)
832dca29d9cSzeertzjq  call assert_equal('i', g:mode2)
833dca29d9cSzeertzjq  call assert_equal('TestCommand2', getline(2))
834dca29d9cSzeertzjq  delcom TestCommand1
835dca29d9cSzeertzjq  delcom TestCommand2
836dca29d9cSzeertzjq  unlet g:mode1
837dca29d9cSzeertzjq  unlet g:mode2
838dca29d9cSzeertzjq  iunmap <F1>
839dca29d9cSzeertzjq  iunmap <F2>
840dca29d9cSzeertzjq  delfunc Save_mode1
841dca29d9cSzeertzjq  delfunc Save_mode2
842f9ab52e1SBram Moolenaar  close!
8438f187fc6SBram Moolenaarendfunc
8448f187fc6SBram Moolenaar
8458f187fc6SBram Moolenaarfunc Test_issue_7021()
8468f187fc6SBram Moolenaar  CheckMSWindows
8478f187fc6SBram Moolenaar
8488f187fc6SBram Moolenaar  let orig_shellslash = &shellslash
8498f187fc6SBram Moolenaar  set noshellslash
8508f187fc6SBram Moolenaar
8518f187fc6SBram Moolenaar  set completeslash=slash
8528f187fc6SBram Moolenaar  call assert_false(expand('~') =~ '/')
8538f187fc6SBram Moolenaar
8548f187fc6SBram Moolenaar  let &shellslash = orig_shellslash
8558f187fc6SBram Moolenaar  set completeslash=
856f9ab52e1SBram Moolenaarendfunc
857f9ab52e1SBram Moolenaar
858cc233589SBram Moolenaar" Test to ensure 'Scanning...' messages are not recorded in messages history
859cc233589SBram Moolenaarfunc Test_z1_complete_no_history()
860cc233589SBram Moolenaar  new
861cc233589SBram Moolenaar  messages clear
862cc233589SBram Moolenaar  let currmess = execute('messages')
863cc233589SBram Moolenaar  setlocal dictionary=README.txt
864cc233589SBram Moolenaar  exe "normal owh\<C-X>\<C-K>"
865cc233589SBram Moolenaar  exe "normal owh\<C-N>"
866cc233589SBram Moolenaar  call assert_equal(currmess, execute('messages'))
867cc233589SBram Moolenaar  close!
868cc233589SBram Moolenaarendfunc
869cc233589SBram Moolenaar
870ee4e0c1eSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
871