1f273245fSBram Moolenaar" Tests for setting 'buftype' to "prompt"
2f273245fSBram Moolenaar
3b46fecd3SBram Moolenaarsource check.vim
4b46fecd3SBram MoolenaarCheckFeature channel
5f273245fSBram Moolenaar
6f273245fSBram Moolenaarsource shared.vim
7f273245fSBram Moolenaarsource screendump.vim
8f273245fSBram Moolenaar
96b810d92SBram Moolenaarfunc CanTestPromptBuffer()
10f273245fSBram Moolenaar  " We need to use a terminal window to be able to feed keys without leaving
11f273245fSBram Moolenaar  " Insert mode.
126d91bcb4SBram Moolenaar  CheckFeature terminal
136d91bcb4SBram Moolenaar
146b810d92SBram Moolenaar  " TODO: make the tests work on MS-Windows
156d91bcb4SBram Moolenaar  CheckNotMSWindows
166b810d92SBram Moolenaarendfunc
176b810d92SBram Moolenaar
186b810d92SBram Moolenaarfunc WriteScript(name)
19f273245fSBram Moolenaar  call writefile([
20f273245fSBram Moolenaar	\ 'func TextEntered(text)',
21f273245fSBram Moolenaar	\ '  if a:text == "exit"',
2271ef1ba5SBram Moolenaar	\ '    " Reset &modified to allow the buffer to be closed.',
2371ef1ba5SBram Moolenaar	\ '    set nomodified',
24f273245fSBram Moolenaar	\ '    stopinsert',
25f273245fSBram Moolenaar	\ '    close',
26f273245fSBram Moolenaar	\ '  else',
27f273245fSBram Moolenaar	\ '    " Add the output above the current prompt.',
28f273245fSBram Moolenaar	\ '    call append(line("$") - 1, "Command: \"" . a:text . "\"")',
29f273245fSBram Moolenaar	\ '    " Reset &modified to allow the buffer to be closed.',
30f273245fSBram Moolenaar	\ '    set nomodified',
31f273245fSBram Moolenaar	\ '    call timer_start(20, {id -> TimerFunc(a:text)})',
32f273245fSBram Moolenaar	\ '  endif',
33f273245fSBram Moolenaar	\ 'endfunc',
34f273245fSBram Moolenaar	\ '',
35f273245fSBram Moolenaar	\ 'func TimerFunc(text)',
36f273245fSBram Moolenaar	\ '  " Add the output above the current prompt.',
37f273245fSBram Moolenaar	\ '  call append(line("$") - 1, "Result: \"" . a:text . "\"")',
383339d3daSBram Moolenaar	\ '  " Reset &modified to allow the buffer to be closed.',
393339d3daSBram Moolenaar	\ '  set nomodified',
40f273245fSBram Moolenaar	\ 'endfunc',
41f273245fSBram Moolenaar	\ '',
42f273245fSBram Moolenaar	\ 'call setline(1, "other buffer")',
433339d3daSBram Moolenaar	\ 'set nomodified',
44f273245fSBram Moolenaar	\ 'new',
45f273245fSBram Moolenaar	\ 'set buftype=prompt',
46f273245fSBram Moolenaar	\ 'call prompt_setcallback(bufnr(""), function("TextEntered"))',
473f4f3d8eSBram Moolenaar	\ 'eval bufnr("")->prompt_setprompt("cmd: ")',
48f273245fSBram Moolenaar	\ 'startinsert',
496b810d92SBram Moolenaar	\ ], a:name)
506b810d92SBram Moolenaarendfunc
516b810d92SBram Moolenaar
526b810d92SBram Moolenaarfunc Test_prompt_basic()
536d91bcb4SBram Moolenaar  call CanTestPromptBuffer()
546b810d92SBram Moolenaar  let scriptName = 'XpromptscriptBasic'
556b810d92SBram Moolenaar  call WriteScript(scriptName)
566b810d92SBram Moolenaar
576b810d92SBram Moolenaar  let buf = RunVimInTerminal('-S ' . scriptName, {})
583f4f3d8eSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))})
59f273245fSBram Moolenaar
60f273245fSBram Moolenaar  call term_sendkeys(buf, "hello\<CR>")
613f4f3d8eSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd: hello', term_getline(buf, 1))})
62f273245fSBram Moolenaar  call WaitForAssert({-> assert_equal('Command: "hello"', term_getline(buf, 2))})
63f273245fSBram Moolenaar  call WaitForAssert({-> assert_equal('Result: "hello"', term_getline(buf, 3))})
64f273245fSBram Moolenaar
65f273245fSBram Moolenaar  call term_sendkeys(buf, "exit\<CR>")
66f273245fSBram Moolenaar  call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
67f273245fSBram Moolenaar
68f273245fSBram Moolenaar  call StopVimInTerminal(buf)
696b810d92SBram Moolenaar  call delete(scriptName)
706b810d92SBram Moolenaarendfunc
716b810d92SBram Moolenaar
726b810d92SBram Moolenaarfunc Test_prompt_editing()
736d91bcb4SBram Moolenaar  call CanTestPromptBuffer()
746b810d92SBram Moolenaar  let scriptName = 'XpromptscriptEditing'
756b810d92SBram Moolenaar  call WriteScript(scriptName)
766b810d92SBram Moolenaar
776b810d92SBram Moolenaar  let buf = RunVimInTerminal('-S ' . scriptName, {})
783f4f3d8eSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))})
796b810d92SBram Moolenaar
806b810d92SBram Moolenaar  let bs = "\<BS>"
816b810d92SBram Moolenaar  call term_sendkeys(buf, "hello" . bs . bs)
823f4f3d8eSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd: hel', term_getline(buf, 1))})
836b810d92SBram Moolenaar
846b810d92SBram Moolenaar  let left = "\<Left>"
856b810d92SBram Moolenaar  call term_sendkeys(buf, left . left . left . bs . '-')
863f4f3d8eSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd: -hel', term_getline(buf, 1))})
876b810d92SBram Moolenaar
88ee8b787bSBram Moolenaar  call term_sendkeys(buf, "\<C-O>lz")
89ee8b787bSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd: -hzel', term_getline(buf, 1))})
90ee8b787bSBram Moolenaar
916b810d92SBram Moolenaar  let end = "\<End>"
926b810d92SBram Moolenaar  call term_sendkeys(buf, end . "x")
93ee8b787bSBram Moolenaar  call WaitForAssert({-> assert_equal('cmd: -hzelx', term_getline(buf, 1))})
946b810d92SBram Moolenaar
956b810d92SBram Moolenaar  call term_sendkeys(buf, "\<C-U>exit\<CR>")
966b810d92SBram Moolenaar  call WaitForAssert({-> assert_equal('other buffer', term_getline(buf, 1))})
976b810d92SBram Moolenaar
986b810d92SBram Moolenaar  call StopVimInTerminal(buf)
996b810d92SBram Moolenaar  call delete(scriptName)
100f273245fSBram Moolenaarendfunc
10175a1a941SBram Moolenaar
10275a1a941SBram Moolenaarfunc Test_prompt_garbage_collect()
10375a1a941SBram Moolenaar  func MyPromptCallback(x, text)
10475a1a941SBram Moolenaar    " NOP
10575a1a941SBram Moolenaar  endfunc
10675a1a941SBram Moolenaar  func MyPromptInterrupt(x)
10775a1a941SBram Moolenaar    " NOP
10875a1a941SBram Moolenaar  endfunc
10975a1a941SBram Moolenaar
11075a1a941SBram Moolenaar  new
11175a1a941SBram Moolenaar  set buftype=prompt
1123f4f3d8eSBram Moolenaar  eval bufnr('')->prompt_setcallback(function('MyPromptCallback', [{}]))
1133f4f3d8eSBram Moolenaar  eval bufnr('')->prompt_setinterrupt(function('MyPromptInterrupt', [{}]))
11475a1a941SBram Moolenaar  call test_garbagecollect_now()
11575a1a941SBram Moolenaar  " Must not crash
11675a1a941SBram Moolenaar  call feedkeys("\<CR>\<C-C>", 'xt')
11775a1a941SBram Moolenaar  call assert_true(v:true)
11875a1a941SBram Moolenaar
119ca68ae13SBram Moolenaar  call assert_fails("call prompt_setcallback(bufnr(), [])", 'E921:')
120ca68ae13SBram Moolenaar  call assert_equal(0, prompt_setcallback({}, ''))
121ca68ae13SBram Moolenaar  call assert_fails("call prompt_setinterrupt(bufnr(), [])", 'E921:')
122ca68ae13SBram Moolenaar  call assert_equal(0, prompt_setinterrupt({}, ''))
123ca68ae13SBram Moolenaar
12475a1a941SBram Moolenaar  delfunc MyPromptCallback
12575a1a941SBram Moolenaar  bwipe!
12675a1a941SBram Moolenaarendfunc
127f5f1e10dSBram Moolenaar
1286f624485SBram Moolenaarfunc Test_prompt_backspace()
1296f624485SBram Moolenaar  new
1306f624485SBram Moolenaar  set buftype=prompt
1316f624485SBram Moolenaar  call feedkeys("A123456\<Left>\<BS>\<Esc>", 'xt')
1326f624485SBram Moolenaar  call assert_equal('% 12346', getline(1))
1336f624485SBram Moolenaar  bwipe!
1346f624485SBram Moolenaarendfunc
1356f624485SBram Moolenaar
136f5f1e10dSBram Moolenaar" Test for editing the prompt buffer
137f5f1e10dSBram Moolenaarfunc Test_prompt_buffer_edit()
138f5f1e10dSBram Moolenaar  new
139f5f1e10dSBram Moolenaar  set buftype=prompt
140f5f1e10dSBram Moolenaar  normal! i
141f5f1e10dSBram Moolenaar  call assert_beeps('normal! dd')
142f5f1e10dSBram Moolenaar  call assert_beeps('normal! ~')
1431671f448SBram Moolenaar  call assert_beeps('normal! o')
1441671f448SBram Moolenaar  call assert_beeps('normal! O')
1451671f448SBram Moolenaar  call assert_beeps('normal! p')
1461671f448SBram Moolenaar  call assert_beeps('normal! P')
1471671f448SBram Moolenaar  call assert_beeps('normal! u')
1481671f448SBram Moolenaar  call assert_beeps('normal! ra')
1491671f448SBram Moolenaar  call assert_beeps('normal! s')
1501671f448SBram Moolenaar  call assert_beeps('normal! S')
1511671f448SBram Moolenaar  call assert_beeps("normal! \<C-A>")
1521671f448SBram Moolenaar  call assert_beeps("normal! \<C-X>")
153*3044324eSYegappan Lakshmanan  call assert_beeps("normal! dp")
154*3044324eSYegappan Lakshmanan  call assert_beeps("normal! do")
155845e0ee5SBram Moolenaar  " pressing CTRL-W in the prompt buffer should trigger the window commands
156845e0ee5SBram Moolenaar  call assert_equal(1, winnr())
157845e0ee5SBram Moolenaar  exe "normal A\<C-W>\<C-W>"
158845e0ee5SBram Moolenaar  call assert_equal(2, winnr())
159845e0ee5SBram Moolenaar  wincmd w
160f5f1e10dSBram Moolenaar  close!
161ad48e6c1SBram Moolenaar  call assert_equal(0, prompt_setprompt([], ''))
162f5f1e10dSBram Moolenaarendfunc
163f5f1e10dSBram Moolenaar
164077cc7aaSBram Moolenaarfunc Test_prompt_buffer_getbufinfo()
165077cc7aaSBram Moolenaar  new
166077cc7aaSBram Moolenaar  call assert_equal('', prompt_getprompt('%'))
167077cc7aaSBram Moolenaar  call assert_equal('', prompt_getprompt(bufnr('%')))
168077cc7aaSBram Moolenaar  let another_buffer = bufnr('%')
169077cc7aaSBram Moolenaar
170077cc7aaSBram Moolenaar  set buftype=prompt
171077cc7aaSBram Moolenaar  call assert_equal('% ', prompt_getprompt('%'))
172077cc7aaSBram Moolenaar  call prompt_setprompt( bufnr( '%' ), 'This is a test: ' )
173077cc7aaSBram Moolenaar  call assert_equal('This is a test: ', prompt_getprompt('%'))
174077cc7aaSBram Moolenaar
175077cc7aaSBram Moolenaar  call prompt_setprompt( bufnr( '%' ), '' )
176077cc7aaSBram Moolenaar  call assert_equal('', '%'->prompt_getprompt())
177077cc7aaSBram Moolenaar
178077cc7aaSBram Moolenaar  call prompt_setprompt( bufnr( '%' ), 'Another: ' )
179077cc7aaSBram Moolenaar  call assert_equal('Another: ', prompt_getprompt('%'))
180077cc7aaSBram Moolenaar  let another = bufnr('%')
181077cc7aaSBram Moolenaar
182077cc7aaSBram Moolenaar  new
183077cc7aaSBram Moolenaar
184077cc7aaSBram Moolenaar  call assert_equal('', prompt_getprompt('%'))
185077cc7aaSBram Moolenaar  call assert_equal('Another: ', prompt_getprompt(another))
186077cc7aaSBram Moolenaar
187077cc7aaSBram Moolenaar  " Doesn't exist
188077cc7aaSBram Moolenaar  let buffers_before = len( getbufinfo() )
189077cc7aaSBram Moolenaar  call assert_equal('', prompt_getprompt( bufnr('$') + 1))
190077cc7aaSBram Moolenaar  call assert_equal(buffers_before, len( getbufinfo()))
191077cc7aaSBram Moolenaar
192077cc7aaSBram Moolenaar  " invalid type
193077cc7aaSBram Moolenaar  call assert_fails('call prompt_getprompt({})', 'E728:')
194077cc7aaSBram Moolenaar
195077cc7aaSBram Moolenaar  %bwipe!
196077cc7aaSBram Moolenaarendfunc
197077cc7aaSBram Moolenaar
1984537bcc8SBram Moolenaarfunction! Test_prompt_while_writing_to_hidden_buffer()
1994537bcc8SBram Moolenaar  call CanTestPromptBuffer()
2004537bcc8SBram Moolenaar  CheckUnix
2014537bcc8SBram Moolenaar
2024537bcc8SBram Moolenaar  " Make a job continuously write to a hidden buffer, check that the prompt
2034537bcc8SBram Moolenaar  " buffer is not affected.
2044537bcc8SBram Moolenaar  let scriptName = 'XpromptscriptHiddenBuf'
2054537bcc8SBram Moolenaar  let script =<< trim END
2064537bcc8SBram Moolenaar    set buftype=prompt
2074537bcc8SBram Moolenaar    call prompt_setprompt( bufnr(), 'cmd:' )
2084537bcc8SBram Moolenaar    let job = job_start(['/bin/sh', '-c',
2094537bcc8SBram Moolenaar        \ 'while true;
2104537bcc8SBram Moolenaar        \   do echo line;
2114537bcc8SBram Moolenaar        \   sleep 0.1;
2124537bcc8SBram Moolenaar        \ done'], #{out_io: 'buffer', out_name: ''})
2134537bcc8SBram Moolenaar    startinsert
2144537bcc8SBram Moolenaar  END
2154537bcc8SBram Moolenaar  eval script->writefile(scriptName)
2164537bcc8SBram Moolenaar
2174537bcc8SBram Moolenaar  let buf = RunVimInTerminal('-S ' .. scriptName, {})
2184537bcc8SBram Moolenaar  call WaitForAssert({-> assert_equal('cmd:', term_getline(buf, 1))})
2194537bcc8SBram Moolenaar
2204537bcc8SBram Moolenaar  call term_sendkeys(buf, 'test')
2214537bcc8SBram Moolenaar  call WaitForAssert({-> assert_equal('cmd:test', term_getline(buf, 1))})
2224537bcc8SBram Moolenaar  call term_sendkeys(buf, 'test')
2234537bcc8SBram Moolenaar  call WaitForAssert({-> assert_equal('cmd:testtest', term_getline(buf, 1))})
2244537bcc8SBram Moolenaar  call term_sendkeys(buf, 'test')
2254537bcc8SBram Moolenaar  call WaitForAssert({-> assert_equal('cmd:testtesttest', term_getline(buf, 1))})
2264537bcc8SBram Moolenaar
2274537bcc8SBram Moolenaar  call StopVimInTerminal(buf)
2284537bcc8SBram Moolenaar  call delete(scriptName)
2294537bcc8SBram Moolenaarendfunc
2304537bcc8SBram Moolenaar
231f5f1e10dSBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
232