118aa13d1SBram Moolenaar" Tests for the terminal window.
218aa13d1SBram Moolenaar" This is split in two, because it can take a lot of time.
318aa13d1SBram Moolenaar" See test_terminal.vim and test_terminal2.vim for further tests.
418aa13d1SBram Moolenaar
518aa13d1SBram Moolenaarsource check.vim
618aa13d1SBram MoolenaarCheckFeature terminal
718aa13d1SBram Moolenaar
818aa13d1SBram Moolenaarsource shared.vim
918aa13d1SBram Moolenaarsource screendump.vim
1018aa13d1SBram Moolenaarsource mouse.vim
1118aa13d1SBram Moolenaarsource term_util.vim
1218aa13d1SBram Moolenaar
1318aa13d1SBram Moolenaarlet $PROMPT_COMMAND=''
1418aa13d1SBram Moolenaar
1518aa13d1SBram Moolenaarfunc Test_terminal_altscreen()
1618aa13d1SBram Moolenaar  " somehow doesn't work on MS-Windows
1718aa13d1SBram Moolenaar  CheckUnix
1818aa13d1SBram Moolenaar  let cmd = "cat Xtext\<CR>"
1918aa13d1SBram Moolenaar
2018aa13d1SBram Moolenaar  let buf = term_start(&shell, {})
2118aa13d1SBram Moolenaar  call writefile(["\<Esc>[?1047h"], 'Xtext')
2218aa13d1SBram Moolenaar  call term_sendkeys(buf, cmd)
2318aa13d1SBram Moolenaar  call WaitForAssert({-> assert_equal(1, term_getaltscreen(buf))})
2418aa13d1SBram Moolenaar
2518aa13d1SBram Moolenaar  call writefile(["\<Esc>[?1047l"], 'Xtext')
2618aa13d1SBram Moolenaar  call term_sendkeys(buf, cmd)
2718aa13d1SBram Moolenaar  call WaitForAssert({-> assert_equal(0, term_getaltscreen(buf))})
2818aa13d1SBram Moolenaar
2918aa13d1SBram Moolenaar  call term_sendkeys(buf, "exit\r")
3018aa13d1SBram Moolenaar  exe buf . "bwipe!"
3118aa13d1SBram Moolenaar  call delete('Xtext')
3218aa13d1SBram Moolenaarendfunc
3318aa13d1SBram Moolenaar
3418aa13d1SBram Moolenaarfunc Test_terminal_shell_option()
3518aa13d1SBram Moolenaar  if has('unix')
3618aa13d1SBram Moolenaar    " exec is a shell builtin command, should fail without a shell.
3718aa13d1SBram Moolenaar    term exec ls runtest.vim
3818aa13d1SBram Moolenaar    call WaitForAssert({-> assert_match('job failed', term_getline(bufnr(), 1))})
3918aa13d1SBram Moolenaar    bwipe!
4018aa13d1SBram Moolenaar
4118aa13d1SBram Moolenaar    term ++shell exec ls runtest.vim
4218aa13d1SBram Moolenaar    call WaitForAssert({-> assert_match('runtest.vim', term_getline(bufnr(), 1))})
4318aa13d1SBram Moolenaar    bwipe!
4418aa13d1SBram Moolenaar  elseif has('win32')
4518aa13d1SBram Moolenaar    " dir is a shell builtin command, should fail without a shell.
46066b12e3SBram Moolenaar    " However, if dir.exe (which might be provided by Cygwin/MSYS2) exists in
47066b12e3SBram Moolenaar    " the %PATH%, "term dir" succeeds unintentionally.  Use dir.com instead.
4818aa13d1SBram Moolenaar    try
49066b12e3SBram Moolenaar      term dir.com /b runtest.vim
50066b12e3SBram Moolenaar      call WaitForAssert({-> assert_match('job failed', term_getline(bufnr(), 1))})
5118aa13d1SBram Moolenaar    catch /CreateProcess/
5218aa13d1SBram Moolenaar      " ignore
5318aa13d1SBram Moolenaar    endtry
5418aa13d1SBram Moolenaar    bwipe!
5518aa13d1SBram Moolenaar
56066b12e3SBram Moolenaar    " This should execute the dir builtin command even with ".com".
57066b12e3SBram Moolenaar    term ++shell dir.com /b runtest.vim
5818aa13d1SBram Moolenaar    call WaitForAssert({-> assert_match('runtest.vim', term_getline(bufnr(), 1))})
5918aa13d1SBram Moolenaar    bwipe!
606d91bcb4SBram Moolenaar  else
616d91bcb4SBram Moolenaar    throw 'Skipped: does not work on this platform'
6218aa13d1SBram Moolenaar  endif
6318aa13d1SBram Moolenaarendfunc
6418aa13d1SBram Moolenaar
6518aa13d1SBram Moolenaarfunc Test_terminal_invalid_arg()
6618aa13d1SBram Moolenaar  call assert_fails('terminal ++xyz', 'E181:')
6718aa13d1SBram Moolenaarendfunc
6818aa13d1SBram Moolenaar
69*87fd0924SBram Moolenaar" Check a terminal with different colors
70*87fd0924SBram Moolenaarfunc Terminal_color(group_name, highlight_cmds, highlight_opt, open_cmds)
71*87fd0924SBram Moolenaar  CheckRunVimInTerminal
72*87fd0924SBram Moolenaar  CheckUnix
73*87fd0924SBram Moolenaar
74*87fd0924SBram Moolenaar  let lines = [
75*87fd0924SBram Moolenaar	\ 'call setline(1, range(20))',
76*87fd0924SBram Moolenaar	\ 'func OpenTerm()',
77*87fd0924SBram Moolenaar	\ '  set noruler',
78*87fd0924SBram Moolenaar	\ "  call term_start('cat', #{vertical: 1, " .. a:highlight_opt .. "})",
79*87fd0924SBram Moolenaar	\ ] + a:open_cmds + [
80*87fd0924SBram Moolenaar	\ 'endfunc',
81*87fd0924SBram Moolenaar	\ ] + a:highlight_cmds
82*87fd0924SBram Moolenaar  call writefile(lines, 'XtermStart')
83*87fd0924SBram Moolenaar  let buf = RunVimInTerminal('-S XtermStart', #{rows: 15})
84*87fd0924SBram Moolenaar  call TermWait(buf, 100)
85*87fd0924SBram Moolenaar  call term_sendkeys(buf, ":call OpenTerm()\<CR>")
86*87fd0924SBram Moolenaar  call TermWait(buf, 50)
87*87fd0924SBram Moolenaar  call term_sendkeys(buf, "hello\<CR>")
88*87fd0924SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_color_' .. a:group_name, {})
89*87fd0924SBram Moolenaar
90*87fd0924SBram Moolenaar  call term_sendkeys(buf, "\<C-D>")
91*87fd0924SBram Moolenaar  call TermWait(buf, 50)
92*87fd0924SBram Moolenaar  call StopVimInTerminal(buf)
93*87fd0924SBram Moolenaar  call delete('XtermStart')
94*87fd0924SBram Moolenaarendfunc
95*87fd0924SBram Moolenaar
96*87fd0924SBram Moolenaarfunc Test_terminal_color_Terminal()
97*87fd0924SBram Moolenaar  call Terminal_color("Terminal", [
98*87fd0924SBram Moolenaar  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
99*87fd0924SBram Moolenaar  \ ], "", [])
100*87fd0924SBram Moolenaarendfunc
101*87fd0924SBram Moolenaar
102*87fd0924SBram Moolenaarfunc Test_terminal_color_group()
103*87fd0924SBram Moolenaar  call Terminal_color("MyTermCol", [
104*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
105*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [])
106*87fd0924SBram Moolenaarendfunc
107*87fd0924SBram Moolenaar
108*87fd0924SBram Moolenaarfunc Test_terminal_color_wincolor()
109*87fd0924SBram Moolenaar  call Terminal_color("MyWinCol", [
110*87fd0924SBram Moolenaar  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
111*87fd0924SBram Moolenaar  \ ], "", [
112*87fd0924SBram Moolenaar  \ 'set wincolor=MyWinCol',
113*87fd0924SBram Moolenaar  \ ])
114*87fd0924SBram Moolenaarendfunc
115*87fd0924SBram Moolenaar
116*87fd0924SBram Moolenaarfunc Test_terminal_color_group_over_Terminal()
117*87fd0924SBram Moolenaar  call Terminal_color("MyTermCol_over_Terminal", [
118*87fd0924SBram Moolenaar  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
119*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
120*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [])
121*87fd0924SBram Moolenaarendfunc
122*87fd0924SBram Moolenaar
123*87fd0924SBram Moolenaarfunc Test_terminal_color_wincolor_over_group()
124*87fd0924SBram Moolenaar  call Terminal_color("MyWinCol_over_group", [
125*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
126*87fd0924SBram Moolenaar  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
127*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [
128*87fd0924SBram Moolenaar  \ 'set wincolor=MyWinCol',
129*87fd0924SBram Moolenaar  \ ])
130*87fd0924SBram Moolenaarendfunc
131*87fd0924SBram Moolenaar
132*87fd0924SBram Moolenaarfunc Test_terminal_color_wincolor_split()
133*87fd0924SBram Moolenaar  CheckRunVimInTerminal
134*87fd0924SBram Moolenaar  CheckUnix
135*87fd0924SBram Moolenaar
136*87fd0924SBram Moolenaar  let lines = [
137*87fd0924SBram Moolenaar	\ 'call setline(1, range(20))',
138*87fd0924SBram Moolenaar	\ 'func OpenTerm()',
139*87fd0924SBram Moolenaar	\ '  set noruler',
140*87fd0924SBram Moolenaar	\ "  call term_start('cat', #{vertical: 1, term_highlight: 'MyTermCol'})",
141*87fd0924SBram Moolenaar	\ 'endfunc',
142*87fd0924SBram Moolenaar  \ 'highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue',
143*87fd0924SBram Moolenaar  \ 'highlight MyWinCol ctermfg=red ctermbg=darkyellow',
144*87fd0924SBram Moolenaar  \ 'highlight MyWinCol2 ctermfg=black ctermbg=blue',
145*87fd0924SBram Moolenaar	\ ]
146*87fd0924SBram Moolenaar  call writefile(lines, 'XtermStart')
147*87fd0924SBram Moolenaar  let buf = RunVimInTerminal('-S XtermStart', #{rows: 15})
148*87fd0924SBram Moolenaar  call TermWait(buf, 100)
149*87fd0924SBram Moolenaar  call term_sendkeys(buf, ":call OpenTerm()\<CR>")
150*87fd0924SBram Moolenaar  call TermWait(buf, 50)
151*87fd0924SBram Moolenaar  call term_sendkeys(buf, "hello\<CR>")
152*87fd0924SBram Moolenaar  call TermWait(buf, 50)
153*87fd0924SBram Moolenaar
154*87fd0924SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:split\<CR>")
155*87fd0924SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:set wincolor=MyWinCol\<CR>")
156*87fd0924SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_wincolor_split_MyWinCol', {})
157*87fd0924SBram Moolenaar
158*87fd0924SBram Moolenaar  call term_sendkeys(buf, "\<C-W>b:2sb\<CR>")
159*87fd0924SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:set wincolor=MyWinCol2\<CR>")
160*87fd0924SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_wincolor_split_MyWinCol2', {})
161*87fd0924SBram Moolenaar
162*87fd0924SBram Moolenaar  call term_sendkeys(buf, "\<C-D>")
163*87fd0924SBram Moolenaar  call TermWait(buf, 50)
164*87fd0924SBram Moolenaar  call StopVimInTerminal(buf)
165*87fd0924SBram Moolenaar  call delete('XtermStart')
166*87fd0924SBram Moolenaarendfunc
167*87fd0924SBram Moolenaar
168*87fd0924SBram Moolenaarfunc Test_terminal_color_transp_Terminal()
169*87fd0924SBram Moolenaar  call Terminal_color("transp_Terminal", [
170*87fd0924SBram Moolenaar  \ "highlight Terminal ctermfg=blue",
171*87fd0924SBram Moolenaar  \ ], "", [])
172*87fd0924SBram Moolenaarendfunc
173*87fd0924SBram Moolenaar
174*87fd0924SBram Moolenaarfunc Test_terminal_color_transp_group()
175*87fd0924SBram Moolenaar  call Terminal_color("transp_MyTermCol", [
176*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen",
177*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [])
178*87fd0924SBram Moolenaarendfunc
179*87fd0924SBram Moolenaar
180*87fd0924SBram Moolenaarfunc Test_terminal_color_transp_wincolor()
181*87fd0924SBram Moolenaar  call Terminal_color("transp_MyWinCol", [
182*87fd0924SBram Moolenaar  \ "highlight MyWinCol ctermfg=red",
183*87fd0924SBram Moolenaar  \ ], "", [
184*87fd0924SBram Moolenaar  \ 'set wincolor=MyWinCol',
185*87fd0924SBram Moolenaar  \ ])
186*87fd0924SBram Moolenaarendfunc
187*87fd0924SBram Moolenaar
188*87fd0924SBram Moolenaarfunc Test_terminal_color_gui_Terminal()
189*87fd0924SBram Moolenaar  CheckFeature termguicolors
190*87fd0924SBram Moolenaar  call Terminal_color("gui_Terminal", [
191*87fd0924SBram Moolenaar  \ "set termguicolors",
192*87fd0924SBram Moolenaar  \ "highlight Terminal guifg=#3344ff guibg=#b0a700",
193*87fd0924SBram Moolenaar  \ ], "", [])
194*87fd0924SBram Moolenaarendfunc
195*87fd0924SBram Moolenaar
196*87fd0924SBram Moolenaarfunc Test_terminal_color_gui_group()
197*87fd0924SBram Moolenaar  CheckFeature termguicolors
198*87fd0924SBram Moolenaar  call Terminal_color("gui_MyTermCol", [
199*87fd0924SBram Moolenaar  \ "set termguicolors",
200*87fd0924SBram Moolenaar  \ "highlight MyTermCol guifg=#007800 guibg=#6789ff",
201*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [])
202*87fd0924SBram Moolenaarendfunc
203*87fd0924SBram Moolenaar
204*87fd0924SBram Moolenaarfunc Test_terminal_color_gui_wincolor()
205*87fd0924SBram Moolenaar  CheckFeature termguicolors
206*87fd0924SBram Moolenaar  call Terminal_color("gui_MyWinCol", [
207*87fd0924SBram Moolenaar  \ "set termguicolors",
208*87fd0924SBram Moolenaar  \ "highlight MyWinCol guifg=#fe1122 guibg=#818100",
209*87fd0924SBram Moolenaar  \ ], "", [
210*87fd0924SBram Moolenaar  \ 'set wincolor=MyWinCol',
211*87fd0924SBram Moolenaar  \ ])
212*87fd0924SBram Moolenaarendfunc
213*87fd0924SBram Moolenaar
214*87fd0924SBram Moolenaarfunc Test_terminal_color_gui_transp_Terminal()
215*87fd0924SBram Moolenaar  CheckFeature termguicolors
216*87fd0924SBram Moolenaar  call Terminal_color("gui_transp_Terminal", [
217*87fd0924SBram Moolenaar  \ "set termguicolors",
218*87fd0924SBram Moolenaar  \ "highlight Terminal guifg=#3344ff",
219*87fd0924SBram Moolenaar  \ ], "", [])
220*87fd0924SBram Moolenaarendfunc
221*87fd0924SBram Moolenaar
222*87fd0924SBram Moolenaarfunc Test_terminal_color_gui_transp_group()
223*87fd0924SBram Moolenaar  CheckFeature termguicolors
224*87fd0924SBram Moolenaar  call Terminal_color("gui_transp_MyTermCol", [
225*87fd0924SBram Moolenaar  \ "set termguicolors",
226*87fd0924SBram Moolenaar  \ "highlight MyTermCol guifg=#007800",
227*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [])
228*87fd0924SBram Moolenaarendfunc
229*87fd0924SBram Moolenaar
230*87fd0924SBram Moolenaarfunc Test_terminal_color_gui_transp_wincolor()
231*87fd0924SBram Moolenaar  CheckFeature termguicolors
232*87fd0924SBram Moolenaar  call Terminal_color("gui_transp_MyWinCol", [
233*87fd0924SBram Moolenaar  \ "set termguicolors",
234*87fd0924SBram Moolenaar  \ "highlight MyWinCol guifg=#fe1122",
235*87fd0924SBram Moolenaar  \ ], "", [
236*87fd0924SBram Moolenaar  \ 'set wincolor=MyWinCol',
237*87fd0924SBram Moolenaar  \ ])
238*87fd0924SBram Moolenaarendfunc
239*87fd0924SBram Moolenaar
24018aa13d1SBram Moolenaarfunc Test_terminal_in_popup()
24118aa13d1SBram Moolenaar  CheckRunVimInTerminal
24218aa13d1SBram Moolenaar
24318aa13d1SBram Moolenaar  let text =<< trim END
24418aa13d1SBram Moolenaar    some text
24518aa13d1SBram Moolenaar    to edit
24618aa13d1SBram Moolenaar    in a popup window
24718aa13d1SBram Moolenaar  END
24818aa13d1SBram Moolenaar  call writefile(text, 'Xtext')
24918aa13d1SBram Moolenaar  let cmd = GetVimCommandCleanTerm()
25018aa13d1SBram Moolenaar  let lines = [
25118aa13d1SBram Moolenaar	\ 'call setline(1, range(20))',
25218aa13d1SBram Moolenaar	\ 'hi PopTerm ctermbg=grey',
25318aa13d1SBram Moolenaar	\ 'func OpenTerm(setColor)',
25418aa13d1SBram Moolenaar	\ "  set noruler",
25518aa13d1SBram Moolenaar	\ "  let s:buf = term_start('" .. cmd .. " Xtext', #{hidden: 1, term_finish: 'close'})",
25618aa13d1SBram Moolenaar	\ '  let g:winid = popup_create(s:buf, #{minwidth: 45, minheight: 7, border: [], drag: 1, resize: 1})',
25718aa13d1SBram Moolenaar	\ '  if a:setColor',
25818aa13d1SBram Moolenaar	\ '    call win_execute(g:winid, "set wincolor=PopTerm")',
25918aa13d1SBram Moolenaar	\ '  endif',
26018aa13d1SBram Moolenaar	\ 'endfunc',
26118aa13d1SBram Moolenaar	\ 'func HidePopup()',
26218aa13d1SBram Moolenaar	\ '  call popup_hide(g:winid)',
26318aa13d1SBram Moolenaar	\ 'endfunc',
26418aa13d1SBram Moolenaar	\ 'func ClosePopup()',
26518aa13d1SBram Moolenaar	\ '  call popup_close(g:winid)',
26618aa13d1SBram Moolenaar	\ 'endfunc',
26718aa13d1SBram Moolenaar	\ 'func ReopenPopup()',
26818aa13d1SBram Moolenaar	\ '  call popup_create(s:buf, #{minwidth: 40, minheight: 6, border: []})',
26918aa13d1SBram Moolenaar	\ 'endfunc',
27018aa13d1SBram Moolenaar	\ ]
27118aa13d1SBram Moolenaar  call writefile(lines, 'XtermPopup')
27218aa13d1SBram Moolenaar  let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
27318aa13d1SBram Moolenaar  call TermWait(buf, 100)
27418aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call OpenTerm(0)\<CR>")
2754d8c96d4SBram Moolenaar  call TermWait(buf, 500)
27618aa13d1SBram Moolenaar  call term_sendkeys(buf, ":\<CR>")
27718aa13d1SBram Moolenaar  call TermWait(buf, 100)
27818aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:echo getwinvar(g:winid, \"&buftype\") win_gettype(g:winid)\<CR>")
27918aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_1', {})
28018aa13d1SBram Moolenaar
28118aa13d1SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
28218aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_2', {})
28318aa13d1SBram Moolenaar
28418aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call OpenTerm(1)\<CR>")
2854d8c96d4SBram Moolenaar  call TermWait(buf, 500)
28618aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set hlsearch\<CR>")
28718aa13d1SBram Moolenaar  call TermWait(buf, 100)
28818aa13d1SBram Moolenaar  call term_sendkeys(buf, "/edit\<CR>")
28918aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_3', {})
29018aa13d1SBram Moolenaar
29118aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:call HidePopup()\<CR>")
29218aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_4', {})
29318aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<CR>")
29418aa13d1SBram Moolenaar  call TermWait(buf, 50)
29518aa13d1SBram Moolenaar
29618aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:call ClosePopup()\<CR>")
29718aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_5', {})
29818aa13d1SBram Moolenaar
29918aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<C-W>:call ReopenPopup()\<CR>")
30018aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_6', {})
30118aa13d1SBram Moolenaar
30218aa13d1SBram Moolenaar  " Go to terminal-Normal mode and visually select text.
30318aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<C-W>Ngg/in\<CR>vww")
30418aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_7', {})
30518aa13d1SBram Moolenaar
30618aa13d1SBram Moolenaar  " Back to job mode, redraws
30718aa13d1SBram Moolenaar  call term_sendkeys(buf, "A")
30818aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_8', {})
30918aa13d1SBram Moolenaar
31018aa13d1SBram Moolenaar  call TermWait(buf, 50)
31118aa13d1SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
3124d8c96d4SBram Moolenaar  call TermWait(buf, 250)  " wait for terminal to vanish
31318aa13d1SBram Moolenaar
31418aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
31518aa13d1SBram Moolenaar  call delete('Xtext')
31618aa13d1SBram Moolenaar  call delete('XtermPopup')
31718aa13d1SBram Moolenaarendfunc
31818aa13d1SBram Moolenaar
3198e7d6223SBram Moolenaar" Check a terminal in popup window uses the default minimum size.
32018aa13d1SBram Moolenaarfunc Test_terminal_in_popup_min_size()
32118aa13d1SBram Moolenaar  CheckRunVimInTerminal
32218aa13d1SBram Moolenaar
32318aa13d1SBram Moolenaar  let text =<< trim END
32418aa13d1SBram Moolenaar    another text
32518aa13d1SBram Moolenaar    to show
32618aa13d1SBram Moolenaar    in a popup window
32718aa13d1SBram Moolenaar  END
32818aa13d1SBram Moolenaar  call writefile(text, 'Xtext')
32918aa13d1SBram Moolenaar  let lines = [
33018aa13d1SBram Moolenaar	\ 'call setline(1, range(20))',
33118aa13d1SBram Moolenaar	\ 'func OpenTerm()',
33218aa13d1SBram Moolenaar	\ "  let s:buf = term_start('cat Xtext', #{hidden: 1})",
33318aa13d1SBram Moolenaar	\ '  let g:winid = popup_create(s:buf, #{ border: []})',
33418aa13d1SBram Moolenaar	\ 'endfunc',
33518aa13d1SBram Moolenaar	\ ]
33618aa13d1SBram Moolenaar  call writefile(lines, 'XtermPopup')
33718aa13d1SBram Moolenaar  let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
33818aa13d1SBram Moolenaar  call TermWait(buf, 100)
33918aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set noruler\<CR>")
34018aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call OpenTerm()\<CR>")
34118aa13d1SBram Moolenaar  call TermWait(buf, 50)
34218aa13d1SBram Moolenaar  call term_sendkeys(buf, ":\<CR>")
34318aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_m1', {})
34418aa13d1SBram Moolenaar
34518aa13d1SBram Moolenaar  call TermWait(buf, 50)
34618aa13d1SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
34718aa13d1SBram Moolenaar  call TermWait(buf, 50)  " wait for terminal to vanish
34818aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
34918aa13d1SBram Moolenaar  call delete('Xtext')
35018aa13d1SBram Moolenaar  call delete('XtermPopup')
35118aa13d1SBram Moolenaarendfunc
35218aa13d1SBram Moolenaar
35318aa13d1SBram Moolenaar" Check a terminal in popup window with different colors
354*87fd0924SBram Moolenaarfunc Terminal_in_popup_color(group_name, highlight_cmds, highlight_opt, popup_cmds, popup_opt)
35518aa13d1SBram Moolenaar  CheckRunVimInTerminal
35618aa13d1SBram Moolenaar  CheckUnix
35718aa13d1SBram Moolenaar
35818aa13d1SBram Moolenaar  let lines = [
35918aa13d1SBram Moolenaar	\ 'call setline(1, range(20))',
36018aa13d1SBram Moolenaar	\ 'func OpenTerm()',
36118aa13d1SBram Moolenaar	\ "  let s:buf = term_start('cat', #{hidden: 1, "
36218aa13d1SBram Moolenaar	\ .. a:highlight_opt .. "})",
363*87fd0924SBram Moolenaar	\ '  let g:winid = popup_create(s:buf, #{border: [], '
364*87fd0924SBram Moolenaar  \ .. a:popup_opt .. '})',
365*87fd0924SBram Moolenaar  \ ] + a:popup_cmds + [
36618aa13d1SBram Moolenaar	\ 'endfunc',
367*87fd0924SBram Moolenaar	\ ] + a:highlight_cmds
36818aa13d1SBram Moolenaar  call writefile(lines, 'XtermPopup')
36918aa13d1SBram Moolenaar  let buf = RunVimInTerminal('-S XtermPopup', #{rows: 15})
37018aa13d1SBram Moolenaar  call TermWait(buf, 100)
37118aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set noruler\<CR>")
37218aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call OpenTerm()\<CR>")
37318aa13d1SBram Moolenaar  call TermWait(buf, 50)
37418aa13d1SBram Moolenaar  call term_sendkeys(buf, "hello\<CR>")
37518aa13d1SBram Moolenaar  call VerifyScreenDump(buf, 'Test_terminal_popup_' .. a:group_name, {})
37618aa13d1SBram Moolenaar
37718aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<C-D>")
37818aa13d1SBram Moolenaar  call TermWait(buf, 50)
37918aa13d1SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
38018aa13d1SBram Moolenaar  call TermWait(buf, 50)  " wait for terminal to vanish
38118aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
38218aa13d1SBram Moolenaar  call delete('XtermPopup')
38318aa13d1SBram Moolenaarendfunc
38418aa13d1SBram Moolenaar
385*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_Terminal()
386*87fd0924SBram Moolenaar  call Terminal_in_popup_color("Terminal", [
387*87fd0924SBram Moolenaar  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
388*87fd0924SBram Moolenaar  \ ], "", [], "")
38918aa13d1SBram Moolenaarendfunc
39018aa13d1SBram Moolenaar
391*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_group()
392*87fd0924SBram Moolenaar  call Terminal_in_popup_color("MyTermCol", [
393*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
394*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [], "")
395*87fd0924SBram Moolenaarendfunc
396*87fd0924SBram Moolenaar
397*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_wincolor()
398*87fd0924SBram Moolenaar  call Terminal_in_popup_color("MyWinCol", [
399*87fd0924SBram Moolenaar  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
400*87fd0924SBram Moolenaar  \ ], "", [
401*87fd0924SBram Moolenaar  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
402*87fd0924SBram Moolenaar  \ ], "")
403*87fd0924SBram Moolenaarendfunc
404*87fd0924SBram Moolenaar
405*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_popup_highlight()
406*87fd0924SBram Moolenaar  call Terminal_in_popup_color("MyPopupHlCol", [
407*87fd0924SBram Moolenaar  \ "highlight MyPopupHlCol ctermfg=cyan ctermbg=green",
408*87fd0924SBram Moolenaar  \ ], "", [], "highlight: 'MyPopupHlCol'")
409*87fd0924SBram Moolenaarendfunc
410*87fd0924SBram Moolenaar
411*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_group_over_Terminal()
412*87fd0924SBram Moolenaar  call Terminal_in_popup_color("MyTermCol_over_Terminal", [
413*87fd0924SBram Moolenaar  \ "highlight Terminal ctermfg=blue ctermbg=yellow",
414*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
415*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [], "")
416*87fd0924SBram Moolenaarendfunc
417*87fd0924SBram Moolenaar
418*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_wincolor_over_group()
419*87fd0924SBram Moolenaar  call Terminal_in_popup_color("MyWinCol_over_group", [
420*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen ctermbg=lightblue",
421*87fd0924SBram Moolenaar  \ "highlight MyWinCol ctermfg=red ctermbg=darkyellow",
422*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [
423*87fd0924SBram Moolenaar  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
424*87fd0924SBram Moolenaar  \ ], "")
425*87fd0924SBram Moolenaarendfunc
426*87fd0924SBram Moolenaar
427*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_transp_Terminal()
428*87fd0924SBram Moolenaar  call Terminal_in_popup_color("transp_Terminal", [
429*87fd0924SBram Moolenaar  \ "highlight Terminal ctermfg=blue",
430*87fd0924SBram Moolenaar  \ ], "", [], "")
431*87fd0924SBram Moolenaarendfunc
432*87fd0924SBram Moolenaar
433*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_transp_group()
434*87fd0924SBram Moolenaar  call Terminal_in_popup_color("transp_MyTermCol", [
435*87fd0924SBram Moolenaar  \ "highlight MyTermCol ctermfg=darkgreen",
436*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [], "")
437*87fd0924SBram Moolenaarendfunc
438*87fd0924SBram Moolenaar
439*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_transp_wincolor()
440*87fd0924SBram Moolenaar  call Terminal_in_popup_color("transp_MyWinCol", [
441*87fd0924SBram Moolenaar  \ "highlight MyWinCol ctermfg=red",
442*87fd0924SBram Moolenaar  \ ], "", [
443*87fd0924SBram Moolenaar  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
444*87fd0924SBram Moolenaar  \ ], "")
445*87fd0924SBram Moolenaarendfunc
446*87fd0924SBram Moolenaar
447*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_transp_popup_highlight()
448*87fd0924SBram Moolenaar  call Terminal_in_popup_color("transp_MyPopupHlCol", [
449*87fd0924SBram Moolenaar  \ "highlight MyPopupHlCol ctermfg=cyan",
450*87fd0924SBram Moolenaar  \ ], "", [], "highlight: 'MyPopupHlCol'")
451*87fd0924SBram Moolenaarendfunc
452*87fd0924SBram Moolenaar
453*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_Terminal()
454*87fd0924SBram Moolenaar  CheckFeature termguicolors
455*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_Terminal", [
456*87fd0924SBram Moolenaar  \ "set termguicolors",
457*87fd0924SBram Moolenaar  \ "highlight Terminal guifg=#3344ff guibg=#b0a700",
458*87fd0924SBram Moolenaar  \ ], "", [], "")
459*87fd0924SBram Moolenaarendfunc
460*87fd0924SBram Moolenaar
461*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_group()
462*87fd0924SBram Moolenaar  CheckFeature termguicolors
463*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_MyTermCol", [
464*87fd0924SBram Moolenaar  \ "set termguicolors",
465*87fd0924SBram Moolenaar  \ "highlight MyTermCol guifg=#007800 guibg=#6789ff",
466*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [], "")
467*87fd0924SBram Moolenaarendfunc
468*87fd0924SBram Moolenaar
469*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_wincolor()
470*87fd0924SBram Moolenaar  CheckFeature termguicolors
471*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_MyWinCol", [
472*87fd0924SBram Moolenaar  \ "set termguicolors",
473*87fd0924SBram Moolenaar  \ "highlight MyWinCol guifg=#fe1122 guibg=#818100",
474*87fd0924SBram Moolenaar  \ ], "", [
475*87fd0924SBram Moolenaar  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
476*87fd0924SBram Moolenaar  \ ], "")
477*87fd0924SBram Moolenaarendfunc
478*87fd0924SBram Moolenaar
479*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_popup_highlight()
480*87fd0924SBram Moolenaar  CheckFeature termguicolors
481*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_MyPopupHlCol", [
482*87fd0924SBram Moolenaar  \ "set termguicolors",
483*87fd0924SBram Moolenaar  \ "highlight MyPopupHlCol guifg=#00e8f0 guibg=#126521",
484*87fd0924SBram Moolenaar  \ ], "", [], "highlight: 'MyPopupHlCol'")
485*87fd0924SBram Moolenaarendfunc
486*87fd0924SBram Moolenaar
487*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_transp_Terminal()
488*87fd0924SBram Moolenaar  CheckFeature termguicolors
489*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_transp_Terminal", [
490*87fd0924SBram Moolenaar  \ "set termguicolors",
491*87fd0924SBram Moolenaar  \ "highlight Terminal guifg=#3344ff",
492*87fd0924SBram Moolenaar  \ ], "", [], "")
493*87fd0924SBram Moolenaarendfunc
494*87fd0924SBram Moolenaar
495*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_transp_group()
496*87fd0924SBram Moolenaar  CheckFeature termguicolors
497*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_transp_MyTermCol", [
498*87fd0924SBram Moolenaar  \ "set termguicolors",
499*87fd0924SBram Moolenaar  \ "highlight MyTermCol guifg=#007800",
500*87fd0924SBram Moolenaar  \ ], "term_highlight: 'MyTermCol',", [], "")
501*87fd0924SBram Moolenaarendfunc
502*87fd0924SBram Moolenaar
503*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_transp_wincolor()
504*87fd0924SBram Moolenaar  CheckFeature termguicolors
505*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_transp_MyWinCol", [
506*87fd0924SBram Moolenaar  \ "set termguicolors",
507*87fd0924SBram Moolenaar  \ "highlight MyWinCol guifg=#fe1122",
508*87fd0924SBram Moolenaar  \ ], "", [
509*87fd0924SBram Moolenaar  \ 'call setwinvar(g:winid, "&wincolor", "MyWinCol")',
510*87fd0924SBram Moolenaar  \ ], "")
511*87fd0924SBram Moolenaarendfunc
512*87fd0924SBram Moolenaar
513*87fd0924SBram Moolenaarfunc Test_terminal_in_popup_color_gui_transp_popup_highlight()
514*87fd0924SBram Moolenaar  CheckFeature termguicolors
515*87fd0924SBram Moolenaar  call Terminal_in_popup_color("gui_transp_MyPopupHlCol", [
516*87fd0924SBram Moolenaar  \ "set termguicolors",
517*87fd0924SBram Moolenaar  \ "highlight MyPopupHlCol guifg=#00e8f0",
518*87fd0924SBram Moolenaar  \ ], "", [], "highlight: 'MyPopupHlCol'")
51918aa13d1SBram Moolenaarendfunc
52018aa13d1SBram Moolenaar
52118aa13d1SBram Moolenaarfunc Test_double_popup_terminal()
52218aa13d1SBram Moolenaar  let buf1 = term_start(&shell, #{hidden: 1})
52318aa13d1SBram Moolenaar  let win1 = popup_create(buf1, {})
52418aa13d1SBram Moolenaar  let buf2 = term_start(&shell, #{hidden: 1})
52518aa13d1SBram Moolenaar  call assert_fails('call popup_create(buf2, {})', 'E861:')
52618aa13d1SBram Moolenaar  call popup_close(win1)
52718aa13d1SBram Moolenaar  exe buf1 .. 'bwipe!'
52818aa13d1SBram Moolenaar  exe buf2 .. 'bwipe!'
52918aa13d1SBram Moolenaarendfunc
53018aa13d1SBram Moolenaar
53118aa13d1SBram Moolenaarfunc Test_issue_5607()
53218aa13d1SBram Moolenaar  let wincount = winnr('$')
53318aa13d1SBram Moolenaar  exe 'terminal' &shell &shellcmdflag 'exit'
53418aa13d1SBram Moolenaar  let job = term_getjob(bufnr())
53518aa13d1SBram Moolenaar  call WaitForAssert({-> assert_equal("dead", job_status(job))})
53618aa13d1SBram Moolenaar
53718aa13d1SBram Moolenaar  let old_wincolor = &wincolor
53818aa13d1SBram Moolenaar  try
53918aa13d1SBram Moolenaar    set wincolor=
54018aa13d1SBram Moolenaar  finally
54118aa13d1SBram Moolenaar    let &wincolor = old_wincolor
54218aa13d1SBram Moolenaar    bw!
54318aa13d1SBram Moolenaar  endtry
54418aa13d1SBram Moolenaarendfunc
54518aa13d1SBram Moolenaar
54618aa13d1SBram Moolenaarfunc Test_hidden_terminal()
54718aa13d1SBram Moolenaar  let buf = term_start(&shell, #{hidden: 1})
54818aa13d1SBram Moolenaar  call assert_equal('', bufname('^$'))
54918aa13d1SBram Moolenaar  call StopShellInTerminal(buf)
55018aa13d1SBram Moolenaarendfunc
55118aa13d1SBram Moolenaar
55218aa13d1SBram Moolenaarfunc Test_term_nasty_callback()
55318aa13d1SBram Moolenaar  CheckExecutable sh
55418aa13d1SBram Moolenaar
55518aa13d1SBram Moolenaar  set hidden
55618aa13d1SBram Moolenaar  let g:buf0 = term_start('sh', #{hidden: 1, term_finish: 'close'})
55718aa13d1SBram Moolenaar  call popup_create(g:buf0, {})
55818aa13d1SBram Moolenaar  call assert_fails("call term_start(['sh', '-c'], #{curwin: 1})", 'E863:')
55918aa13d1SBram Moolenaar
56018aa13d1SBram Moolenaar  call popup_clear(1)
56118aa13d1SBram Moolenaar  set hidden&
56218aa13d1SBram Moolenaarendfunc
56318aa13d1SBram Moolenaar
56418aa13d1SBram Moolenaarfunc Test_term_and_startinsert()
56518aa13d1SBram Moolenaar  CheckRunVimInTerminal
56618aa13d1SBram Moolenaar  CheckUnix
56718aa13d1SBram Moolenaar
56818aa13d1SBram Moolenaar  let lines =<< trim EOL
56918aa13d1SBram Moolenaar     put='some text'
57018aa13d1SBram Moolenaar     term
57118aa13d1SBram Moolenaar     startinsert
57218aa13d1SBram Moolenaar  EOL
57318aa13d1SBram Moolenaar  call writefile(lines, 'XTest_startinsert')
57418aa13d1SBram Moolenaar  let buf = RunVimInTerminal('-S XTest_startinsert', {})
57518aa13d1SBram Moolenaar
57618aa13d1SBram Moolenaar  call term_sendkeys(buf, "exit\r")
57718aa13d1SBram Moolenaar  call WaitForAssert({-> assert_equal("some text", term_getline(buf, 1))})
57818aa13d1SBram Moolenaar  call term_sendkeys(buf, "0l")
57918aa13d1SBram Moolenaar  call term_sendkeys(buf, "A<\<Esc>")
58018aa13d1SBram Moolenaar  call WaitForAssert({-> assert_equal("some text<", term_getline(buf, 1))})
58118aa13d1SBram Moolenaar
58218aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
58318aa13d1SBram Moolenaar  call delete('XTest_startinsert')
58418aa13d1SBram Moolenaarendfunc
58518aa13d1SBram Moolenaar
58618aa13d1SBram Moolenaar" Test for passing invalid arguments to terminal functions
58718aa13d1SBram Moolenaarfunc Test_term_func_invalid_arg()
58818aa13d1SBram Moolenaar  call assert_fails('let b = term_getaltscreen([])', 'E745:')
58918aa13d1SBram Moolenaar  call assert_fails('let a = term_getattr(1, [])', 'E730:')
59018aa13d1SBram Moolenaar  call assert_fails('let c = term_getcursor([])', 'E745:')
59118aa13d1SBram Moolenaar  call assert_fails('let l = term_getline([], 1)', 'E745:')
59218aa13d1SBram Moolenaar  call assert_fails('let l = term_getscrolled([])', 'E745:')
59318aa13d1SBram Moolenaar  call assert_fails('let s = term_getsize([])', 'E745:')
59418aa13d1SBram Moolenaar  call assert_fails('let s = term_getstatus([])', 'E745:')
59518aa13d1SBram Moolenaar  call assert_fails('let s = term_scrape([], 1)', 'E745:')
59618aa13d1SBram Moolenaar  call assert_fails('call term_sendkeys([], "a")', 'E745:')
59718aa13d1SBram Moolenaar  call assert_fails('call term_setapi([], "")', 'E745:')
59818aa13d1SBram Moolenaar  call assert_fails('call term_setrestore([], "")', 'E745:')
59918aa13d1SBram Moolenaar  call assert_fails('call term_setkill([], "")', 'E745:')
60018aa13d1SBram Moolenaar  if has('gui') || has('termguicolors')
60118aa13d1SBram Moolenaar    call assert_fails('let p = term_getansicolors([])', 'E745:')
60218aa13d1SBram Moolenaar    call assert_fails('call term_setansicolors([], [])', 'E745:')
60318aa13d1SBram Moolenaar  endif
604a1070eaeSBram Moolenaar  let buf = term_start('echo')
605a1070eaeSBram Moolenaar  call assert_fails('call term_setapi(' .. buf .. ', {})', 'E731:')
606a1070eaeSBram Moolenaar  call assert_fails('call term_setkill(' .. buf .. ', {})', 'E731:')
607a1070eaeSBram Moolenaar  call assert_fails('call term_setrestore(' .. buf .. ', {})', 'E731:')
608a1070eaeSBram Moolenaar  exe buf . "bwipe!"
60918aa13d1SBram Moolenaarendfunc
61018aa13d1SBram Moolenaar
61118aa13d1SBram Moolenaar" Test for sending various special keycodes to a terminal
61218aa13d1SBram Moolenaarfunc Test_term_keycode_translation()
61318aa13d1SBram Moolenaar  CheckRunVimInTerminal
61418aa13d1SBram Moolenaar
61518aa13d1SBram Moolenaar  let buf = RunVimInTerminal('', {})
61618aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set nocompatible\<CR>")
6174d8c96d4SBram Moolenaar  call term_sendkeys(buf, ":set timeoutlen=20\<CR>")
61818aa13d1SBram Moolenaar
61918aa13d1SBram Moolenaar  let keys = ["\<F1>", "\<F2>", "\<F3>", "\<F4>", "\<F5>", "\<F6>", "\<F7>",
62018aa13d1SBram Moolenaar        \ "\<F8>", "\<F9>", "\<F10>", "\<F11>", "\<F12>", "\<Home>",
62118aa13d1SBram Moolenaar        \ "\<S-Home>", "\<C-Home>", "\<End>", "\<S-End>", "\<C-End>",
62218aa13d1SBram Moolenaar	\ "\<Ins>", "\<Del>", "\<Left>", "\<S-Left>", "\<C-Left>", "\<Right>",
62318aa13d1SBram Moolenaar        \ "\<S-Right>", "\<C-Right>", "\<Up>", "\<S-Up>", "\<Down>",
62418aa13d1SBram Moolenaar        \ "\<S-Down>"]
62518aa13d1SBram Moolenaar  let output = ['<F1>', '<F2>', '<F3>', '<F4>', '<F5>', '<F6>', '<F7>',
62618aa13d1SBram Moolenaar        \ '<F8>', '<F9>', '<F10>', '<F11>', '<F12>', '<Home>', '<S-Home>',
62718aa13d1SBram Moolenaar        \ '<C-Home>', '<End>', '<S-End>', '<C-End>', '<Insert>', '<Del>',
62818aa13d1SBram Moolenaar        \ '<Left>', '<S-Left>', '<C-Left>', '<Right>', '<S-Right>',
62918aa13d1SBram Moolenaar        \ '<C-Right>', '<Up>', '<S-Up>', '<Down>', '<S-Down>']
63018aa13d1SBram Moolenaar
63118aa13d1SBram Moolenaar  call term_sendkeys(buf, "i")
63218aa13d1SBram Moolenaar  for i in range(len(keys))
63318aa13d1SBram Moolenaar    call term_sendkeys(buf, "\<C-U>\<C-K>" .. keys[i])
6344d8c96d4SBram Moolenaar    call WaitForAssert({-> assert_equal(output[i], term_getline(buf, 1))}, 200)
63518aa13d1SBram Moolenaar  endfor
63618aa13d1SBram Moolenaar
63718aa13d1SBram Moolenaar  let keypad_keys = ["\<k0>", "\<k1>", "\<k2>", "\<k3>", "\<k4>", "\<k5>",
63818aa13d1SBram Moolenaar        \ "\<k6>", "\<k7>", "\<k8>", "\<k9>", "\<kPoint>", "\<kPlus>",
63918aa13d1SBram Moolenaar        \ "\<kMinus>", "\<kMultiply>", "\<kDivide>"]
64018aa13d1SBram Moolenaar  let keypad_output = ['0', '1', '2', '3', '4', '5',
64118aa13d1SBram Moolenaar        \ '6', '7', '8', '9', '.', '+',
64218aa13d1SBram Moolenaar        \ '-', '*', '/']
64318aa13d1SBram Moolenaar  for i in range(len(keypad_keys))
64418aa13d1SBram Moolenaar    " TODO: Mysteriously keypad 3 and 9 do not work on some systems.
64518aa13d1SBram Moolenaar    if keypad_output[i] == '3' || keypad_output[i] == '9'
64618aa13d1SBram Moolenaar      continue
64718aa13d1SBram Moolenaar    endif
64818aa13d1SBram Moolenaar    call term_sendkeys(buf, "\<C-U>" .. keypad_keys[i])
6494d8c96d4SBram Moolenaar    call WaitForAssert({-> assert_equal(keypad_output[i], term_getline(buf, 1))}, 100)
65018aa13d1SBram Moolenaar  endfor
65118aa13d1SBram Moolenaar
65218aa13d1SBram Moolenaar  call feedkeys("\<C-U>\<kEnter>\<BS>one\<C-W>.two", 'xt')
65318aa13d1SBram Moolenaar  call WaitForAssert({-> assert_equal('two', term_getline(buf, 1))})
65418aa13d1SBram Moolenaar
65518aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
65618aa13d1SBram Moolenaarendfunc
65718aa13d1SBram Moolenaar
65818aa13d1SBram Moolenaar" Test for using the mouse in a terminal
65918aa13d1SBram Moolenaarfunc Test_term_mouse()
66018aa13d1SBram Moolenaar  CheckNotGui
66118aa13d1SBram Moolenaar  CheckRunVimInTerminal
66218aa13d1SBram Moolenaar
66318aa13d1SBram Moolenaar  let save_mouse = &mouse
66418aa13d1SBram Moolenaar  let save_term = &term
66518aa13d1SBram Moolenaar  let save_ttymouse = &ttymouse
66618aa13d1SBram Moolenaar  let save_clipboard = &clipboard
66718aa13d1SBram Moolenaar  set mouse=a term=xterm ttymouse=sgr mousetime=200 clipboard=
66818aa13d1SBram Moolenaar
66918aa13d1SBram Moolenaar  let lines =<< trim END
67018aa13d1SBram Moolenaar    one two three four five
67118aa13d1SBram Moolenaar    red green yellow red blue
67218aa13d1SBram Moolenaar    vim emacs sublime nano
67318aa13d1SBram Moolenaar  END
67418aa13d1SBram Moolenaar  call writefile(lines, 'Xtest_mouse')
67518aa13d1SBram Moolenaar
67618aa13d1SBram Moolenaar  " Create a terminal window running Vim for the test with mouse enabled
67718aa13d1SBram Moolenaar  let prev_win = win_getid()
67818aa13d1SBram Moolenaar  let buf = RunVimInTerminal('Xtest_mouse -n', {})
67918aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set nocompatible\<CR>")
68018aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set mouse=a term=xterm ttymouse=sgr\<CR>")
68118aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set clipboard=\<CR>")
68218aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set mousemodel=extend\<CR>")
683733d259aSBram Moolenaar  call TermWait(buf)
68418aa13d1SBram Moolenaar  redraw!
68518aa13d1SBram Moolenaar
68618aa13d1SBram Moolenaar  " Use the mouse to enter the terminal window
68718aa13d1SBram Moolenaar  call win_gotoid(prev_win)
68818aa13d1SBram Moolenaar  call feedkeys(MouseLeftClickCode(1, 1), 'x')
68918aa13d1SBram Moolenaar  call feedkeys(MouseLeftReleaseCode(1, 1), 'x')
69018aa13d1SBram Moolenaar  call assert_equal(1, getwininfo(win_getid())[0].terminal)
69118aa13d1SBram Moolenaar
69218aa13d1SBram Moolenaar  " Test for <LeftMouse> click/release
69318aa13d1SBram Moolenaar  call test_setmouse(2, 5)
69418aa13d1SBram Moolenaar  call feedkeys("\<LeftMouse>\<LeftRelease>", 'xt')
69518aa13d1SBram Moolenaar  call test_setmouse(3, 8)
69618aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>")
697733d259aSBram Moolenaar  call TermWait(buf, 50)
69818aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([json_encode(getpos('.'))], 'Xbuf')\<CR>")
699733d259aSBram Moolenaar  call TermWait(buf, 50)
70018aa13d1SBram Moolenaar  let pos = json_decode(readfile('Xbuf')[0])
70118aa13d1SBram Moolenaar  call assert_equal([3, 8], pos[1:2])
70218aa13d1SBram Moolenaar
70318aa13d1SBram Moolenaar  " Test for selecting text using mouse
70418aa13d1SBram Moolenaar  call delete('Xbuf')
70518aa13d1SBram Moolenaar  call test_setmouse(2, 11)
70618aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftMouse>")
70718aa13d1SBram Moolenaar  call test_setmouse(2, 16)
70818aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftRelease>y")
709733d259aSBram Moolenaar  call TermWait(buf, 50)
71018aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([@\"], 'Xbuf')\<CR>")
711733d259aSBram Moolenaar  call TermWait(buf, 50)
71218aa13d1SBram Moolenaar  call assert_equal('yellow', readfile('Xbuf')[0])
71318aa13d1SBram Moolenaar
71418aa13d1SBram Moolenaar  " Test for selecting text using double click
71518aa13d1SBram Moolenaar  call delete('Xbuf')
71618aa13d1SBram Moolenaar  call test_setmouse(1, 11)
71718aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>\<LeftMouse>")
71818aa13d1SBram Moolenaar  call test_setmouse(1, 17)
71918aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftRelease>y")
720733d259aSBram Moolenaar  call TermWait(buf, 50)
72118aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([@\"], 'Xbuf')\<CR>")
722733d259aSBram Moolenaar  call TermWait(buf, 50)
72318aa13d1SBram Moolenaar  call assert_equal('three four', readfile('Xbuf')[0])
72418aa13d1SBram Moolenaar
72518aa13d1SBram Moolenaar  " Test for selecting a line using triple click
72618aa13d1SBram Moolenaar  call delete('Xbuf')
72718aa13d1SBram Moolenaar  call test_setmouse(3, 2)
72818aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>\<LeftMouse>\<LeftRelease>\<LeftMouse>\<LeftRelease>y")
729733d259aSBram Moolenaar  call TermWait(buf, 50)
73018aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([@\"], 'Xbuf')\<CR>")
731733d259aSBram Moolenaar  call TermWait(buf, 50)
73218aa13d1SBram Moolenaar  call assert_equal("vim emacs sublime nano\n", readfile('Xbuf')[0])
73318aa13d1SBram Moolenaar
734*87fd0924SBram Moolenaar  " Test for selecting a block using quadruple click
73518aa13d1SBram Moolenaar  call delete('Xbuf')
73618aa13d1SBram Moolenaar  call test_setmouse(1, 11)
73718aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>\<LeftMouse>\<LeftRelease>\<LeftMouse>\<LeftRelease>\<LeftMouse>")
73818aa13d1SBram Moolenaar  call test_setmouse(3, 13)
73918aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftRelease>y")
740733d259aSBram Moolenaar  call TermWait(buf, 50)
74118aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([@\"], 'Xbuf')\<CR>")
742733d259aSBram Moolenaar  call TermWait(buf, 50)
74318aa13d1SBram Moolenaar  call assert_equal("ree\nyel\nsub", readfile('Xbuf')[0])
74418aa13d1SBram Moolenaar
74518aa13d1SBram Moolenaar  " Test for extending a selection using right click
74618aa13d1SBram Moolenaar  call delete('Xbuf')
74718aa13d1SBram Moolenaar  call test_setmouse(2, 9)
74818aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<LeftMouse>\<LeftRelease>")
74918aa13d1SBram Moolenaar  call test_setmouse(2, 16)
75018aa13d1SBram Moolenaar  call term_sendkeys(buf, "\<RightMouse>\<RightRelease>y")
751733d259aSBram Moolenaar  call TermWait(buf, 50)
75218aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([@\"], 'Xbuf')\<CR>")
753733d259aSBram Moolenaar  call TermWait(buf, 50)
75418aa13d1SBram Moolenaar  call assert_equal("n yellow", readfile('Xbuf')[0])
75518aa13d1SBram Moolenaar
75618aa13d1SBram Moolenaar  " Test for pasting text using middle click
75718aa13d1SBram Moolenaar  call delete('Xbuf')
75818aa13d1SBram Moolenaar  call term_sendkeys(buf, ":let @r='bright '\<CR>")
75918aa13d1SBram Moolenaar  call test_setmouse(2, 22)
76018aa13d1SBram Moolenaar  call term_sendkeys(buf, "\"r\<MiddleMouse>\<MiddleRelease>")
761733d259aSBram Moolenaar  call TermWait(buf, 50)
76218aa13d1SBram Moolenaar  call term_sendkeys(buf, ":call writefile([getline(2)], 'Xbuf')\<CR>")
763733d259aSBram Moolenaar  call TermWait(buf, 50)
76418aa13d1SBram Moolenaar  call assert_equal("red bright blue", readfile('Xbuf')[0][-15:])
76518aa13d1SBram Moolenaar
76618aa13d1SBram Moolenaar  " cleanup
767733d259aSBram Moolenaar  call TermWait(buf)
76818aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
76918aa13d1SBram Moolenaar  let &mouse = save_mouse
77018aa13d1SBram Moolenaar  let &term = save_term
77118aa13d1SBram Moolenaar  let &ttymouse = save_ttymouse
77218aa13d1SBram Moolenaar  let &clipboard = save_clipboard
77318aa13d1SBram Moolenaar  set mousetime&
77418aa13d1SBram Moolenaar  call delete('Xtest_mouse')
77518aa13d1SBram Moolenaar  call delete('Xbuf')
77618aa13d1SBram Moolenaarendfunc
77718aa13d1SBram Moolenaar
7788b9abfd8SBram Moolenaar" Test for sync buffer cwd with shell's pwd
7798b9abfd8SBram Moolenaarfunc Test_terminal_sync_shell_dir()
7808b9abfd8SBram Moolenaar  CheckUnix
7818b9abfd8SBram Moolenaar  " The test always use sh (see src/testdir/unix.vim).
7828b9abfd8SBram Moolenaar  " However, BSD's sh doesn't seem to play well with OSC 7 escape sequence.
7838b9abfd8SBram Moolenaar  CheckNotBSD
7848b9abfd8SBram Moolenaar
7858b9abfd8SBram Moolenaar  set asd
7868b9abfd8SBram Moolenaar  " , is
7878b9abfd8SBram Moolenaar  "  1. a valid character for directory names
7888b9abfd8SBram Moolenaar  "  2. a reserved character in url-encoding
7898b9abfd8SBram Moolenaar  let chars = ",a"
7908b9abfd8SBram Moolenaar  " "," is url-encoded as '%2C'
7918b9abfd8SBram Moolenaar  let chars_url = "%2Ca"
7928b9abfd8SBram Moolenaar  let tmpfolder = fnamemodify(tempname(),':h').'/'.chars
7938b9abfd8SBram Moolenaar  let tmpfolder_url = fnamemodify(tempname(),':h').'/'.chars_url
7948b9abfd8SBram Moolenaar  call mkdir(tmpfolder, "p")
7958b9abfd8SBram Moolenaar  let buf = Run_shell_in_terminal({})
7968b9abfd8SBram Moolenaar  call term_sendkeys(buf, "echo -ne $'\\e\]7;file://".tmpfolder_url."\\a'\<CR>")
7978b9abfd8SBram Moolenaar  "call term_sendkeys(buf, "cd ".tmpfolder."\<CR>")
7988b9abfd8SBram Moolenaar  call TermWait(buf)
7998b9abfd8SBram Moolenaar  if has("mac")
8008b9abfd8SBram Moolenaar    let expected = "/private".tmpfolder
8018b9abfd8SBram Moolenaar  else
8028b9abfd8SBram Moolenaar    let expected = tmpfolder
8038b9abfd8SBram Moolenaar  endif
8048b9abfd8SBram Moolenaar  call assert_equal(expected, getcwd(winnr()))
80582820d9bSBram Moolenaar
80682820d9bSBram Moolenaar  set noasd
8078b9abfd8SBram Moolenaarendfunc
8088b9abfd8SBram Moolenaar
80918aa13d1SBram Moolenaar" Test for modeless selection in a terminal
81018aa13d1SBram Moolenaarfunc Test_term_modeless_selection()
81118aa13d1SBram Moolenaar  CheckUnix
81218aa13d1SBram Moolenaar  CheckNotGui
81318aa13d1SBram Moolenaar  CheckRunVimInTerminal
81418aa13d1SBram Moolenaar  CheckFeature clipboard_working
81518aa13d1SBram Moolenaar
81618aa13d1SBram Moolenaar  let save_mouse = &mouse
81718aa13d1SBram Moolenaar  let save_term = &term
81818aa13d1SBram Moolenaar  let save_ttymouse = &ttymouse
81918aa13d1SBram Moolenaar  set mouse=a term=xterm ttymouse=sgr mousetime=200
82018aa13d1SBram Moolenaar  set clipboard=autoselectml
82118aa13d1SBram Moolenaar
82218aa13d1SBram Moolenaar  let lines =<< trim END
82318aa13d1SBram Moolenaar    one two three four five
82418aa13d1SBram Moolenaar    red green yellow red blue
82518aa13d1SBram Moolenaar    vim emacs sublime nano
82618aa13d1SBram Moolenaar  END
82718aa13d1SBram Moolenaar  call writefile(lines, 'Xtest_modeless')
82818aa13d1SBram Moolenaar
82918aa13d1SBram Moolenaar  " Create a terminal window running Vim for the test with mouse disabled
83018aa13d1SBram Moolenaar  let prev_win = win_getid()
83118aa13d1SBram Moolenaar  let buf = RunVimInTerminal('Xtest_modeless -n', {})
83218aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set nocompatible\<CR>")
83318aa13d1SBram Moolenaar  call term_sendkeys(buf, ":set mouse=\<CR>")
834733d259aSBram Moolenaar  call TermWait(buf)
83518aa13d1SBram Moolenaar  redraw!
83618aa13d1SBram Moolenaar
83718aa13d1SBram Moolenaar  " Use the mouse to enter the terminal window
83818aa13d1SBram Moolenaar  call win_gotoid(prev_win)
83918aa13d1SBram Moolenaar  call feedkeys(MouseLeftClickCode(1, 1), 'x')
84018aa13d1SBram Moolenaar  call feedkeys(MouseLeftReleaseCode(1, 1), 'x')
841733d259aSBram Moolenaar  call TermWait(buf)
84218aa13d1SBram Moolenaar  call assert_equal(1, getwininfo(win_getid())[0].terminal)
84318aa13d1SBram Moolenaar
84418aa13d1SBram Moolenaar  " Test for copying a modeless selection to clipboard
84518aa13d1SBram Moolenaar  let @* = 'clean'
84618aa13d1SBram Moolenaar  " communicating with X server may take a little time
84718aa13d1SBram Moolenaar  sleep 100m
84818aa13d1SBram Moolenaar  call feedkeys(MouseLeftClickCode(2, 3), 'x')
84918aa13d1SBram Moolenaar  call feedkeys(MouseLeftDragCode(2, 11), 'x')
85018aa13d1SBram Moolenaar  call feedkeys(MouseLeftReleaseCode(2, 11), 'x')
85118aa13d1SBram Moolenaar  call assert_equal("d green y", @*)
85218aa13d1SBram Moolenaar
85318aa13d1SBram Moolenaar  " cleanup
854733d259aSBram Moolenaar  call TermWait(buf)
85518aa13d1SBram Moolenaar  call StopVimInTerminal(buf)
85618aa13d1SBram Moolenaar  let &mouse = save_mouse
85718aa13d1SBram Moolenaar  let &term = save_term
85818aa13d1SBram Moolenaar  let &ttymouse = save_ttymouse
85918aa13d1SBram Moolenaar  set mousetime& clipboard&
86018aa13d1SBram Moolenaar  call delete('Xtest_modeless')
86118aa13d1SBram Moolenaar  new | only!
86218aa13d1SBram Moolenaarendfunc
86318aa13d1SBram Moolenaar
864a4b44261SBram Moolenaarfunc Test_terminal_getwinpos()
865a4b44261SBram Moolenaar  CheckRunVimInTerminal
866a4b44261SBram Moolenaar
867a4b44261SBram Moolenaar  " split, go to the bottom-right window
868a4b44261SBram Moolenaar  split
869a4b44261SBram Moolenaar  wincmd j
870a4b44261SBram Moolenaar  set splitright
871a4b44261SBram Moolenaar
87242095217SBram Moolenaar  let buf = RunVimInTerminal('', {'cols': 60})
87342095217SBram Moolenaar  call TermWait(buf, 100)
87442095217SBram Moolenaar  call term_sendkeys(buf, ":echo getwinpos(500)\<CR>")
875a4b44261SBram Moolenaar
876a4b44261SBram Moolenaar  " Find the output of getwinpos() in the bottom line.
877a4b44261SBram Moolenaar  let rows = term_getsize(buf)[0]
878a4b44261SBram Moolenaar  call WaitForAssert({-> assert_match('\[\d\+, \d\+\]', term_getline(buf, rows))})
879a4b44261SBram Moolenaar  let line = term_getline(buf, rows)
880a4b44261SBram Moolenaar  let xpos = str2nr(substitute(line, '\[\(\d\+\), \d\+\]', '\1', ''))
881a4b44261SBram Moolenaar  let ypos = str2nr(substitute(line, '\[\d\+, \(\d\+\)\]', '\1', ''))
882a4b44261SBram Moolenaar
883a4b44261SBram Moolenaar  " Position must be bigger than the getwinpos() result of Vim itself.
884a4b44261SBram Moolenaar  " The calculation in the console assumes a 10 x 7 character cell.
885a4b44261SBram Moolenaar  " In the GUI it can be more, let's assume a 20 x 14 cell.
886a4b44261SBram Moolenaar  " And then add 100 / 200 tolerance.
887a4b44261SBram Moolenaar  let [xroot, yroot] = getwinpos()
888a4b44261SBram Moolenaar  let winpos = 50->getwinpos()
889a4b44261SBram Moolenaar  call assert_equal(xroot, winpos[0])
890a4b44261SBram Moolenaar  call assert_equal(yroot, winpos[1])
8917dfc5ce7SBram Moolenaar  let [winrow, wincol] = win_screenpos(0)
892a4b44261SBram Moolenaar  let xoff = wincol * (has('gui_running') ? 14 : 7) + 100
893a4b44261SBram Moolenaar  let yoff = winrow * (has('gui_running') ? 20 : 10) + 200
894a4b44261SBram Moolenaar  call assert_inrange(xroot + 2, xroot + xoff, xpos)
895a4b44261SBram Moolenaar  call assert_inrange(yroot + 2, yroot + yoff, ypos)
896a4b44261SBram Moolenaar
897a4b44261SBram Moolenaar  call TermWait(buf)
898a4b44261SBram Moolenaar  call term_sendkeys(buf, ":q\<CR>")
899a4b44261SBram Moolenaar  call StopVimInTerminal(buf)
900a4b44261SBram Moolenaar  set splitright&
901a4b44261SBram Moolenaar  only!
902a4b44261SBram Moolenaarendfunc
903a4b44261SBram Moolenaar
90418aa13d1SBram Moolenaar
90518aa13d1SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
906