blob: 2aebea495eea806769c9a58e7d4717aca54ef743 [file] [log] [blame]
Bram Moolenaar4d784b22019-05-25 19:51:39 +02001" Tests for popup windows
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
Bram Moolenaar05ad5ff2019-11-30 22:48:27 +01004CheckFeature popupwin
Bram Moolenaar4d784b22019-05-25 19:51:39 +02005
6source screendump.vim
Bram Moolenaar9f145572022-11-27 12:45:41 +00007source term_util.vim
Bram Moolenaar4d784b22019-05-25 19:51:39 +02008
9func Test_simple_popup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +020010 CheckScreendump
11
Bram Moolenaare7eb9272019-06-24 00:58:07 +020012 let lines =<< trim END
13 call setline(1, range(1, 100))
14 hi PopupColor1 ctermbg=lightblue
15 hi PopupColor2 ctermbg=lightcyan
Bram Moolenaar1666ac92019-11-10 17:22:31 +010016 hi EndOfBuffer ctermbg=lightgrey
Bram Moolenaare7eb9272019-06-24 00:58:07 +020017 hi Comment ctermfg=red
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020018 call prop_type_add('comment', #{highlight: 'Comment'})
19 let winid = popup_create('hello there', #{line: 3, col: 11, minwidth: 20, highlight: 'PopupColor1'})
20 let winid2 = popup_create(['another one', 'another two', 'another three'], #{line: 3, col: 25, minwidth: 20})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020021 call setwinvar(winid2, '&wincolor', 'PopupColor2')
22 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +010023 call writefile(lines, 'XtestPopup', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020024 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar4d784b22019-05-25 19:51:39 +020025 call VerifyScreenDump(buf, 'Test_popupwin_01', {})
26
Bram Moolenaarec583842019-05-26 14:11:23 +020027 " Add a tabpage
28 call term_sendkeys(buf, ":tabnew\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020029 call term_sendkeys(buf, ":let popupwin = popup_create(["
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020030 \ .. "#{text: 'other tab'},"
31 \ .. "#{text: 'a comment line', props: [#{"
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020032 \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
Bram Moolenaar7a8d0272019-05-26 23:32:06 +020033 \ .. "}]},"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020034 \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
Bram Moolenaarec583842019-05-26 14:11:23 +020035 call VerifyScreenDump(buf, 'Test_popupwin_02', {})
36
37 " switch back to first tabpage
38 call term_sendkeys(buf, "gt")
39 call VerifyScreenDump(buf, 'Test_popupwin_03', {})
40
41 " close that tabpage
42 call term_sendkeys(buf, ":quit!\<CR>")
43 call VerifyScreenDump(buf, 'Test_popupwin_04', {})
44
Bram Moolenaar202d9822019-06-11 21:56:30 +020045 " set 'columns' to a small value, size must be recomputed
46 call term_sendkeys(buf, ":let cols = &columns\<CR>")
47 call term_sendkeys(buf, ":set columns=12\<CR>")
48 call VerifyScreenDump(buf, 'Test_popupwin_04a', {})
49 call term_sendkeys(buf, ":let &columns = cols\<CR>")
50
Bram Moolenaar17146962019-05-30 00:12:11 +020051 " resize popup, show empty line at bottom
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020052 call term_sendkeys(buf, ":call popup_move(popupwin, #{minwidth: 15, maxwidth: 25, minheight: 3, maxheight: 5})\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020053 call term_sendkeys(buf, ":redraw\<CR>")
54 call VerifyScreenDump(buf, 'Test_popupwin_05', {})
55
Bram Moolenaar17146962019-05-30 00:12:11 +020056 " show not fitting line at bottom
57 call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\<CR>")
58 call term_sendkeys(buf, ":redraw\<CR>")
59 call VerifyScreenDump(buf, 'Test_popupwin_06', {})
60
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020061 " move popup over ruler
62 call term_sendkeys(buf, ":set cmdheight=2\<CR>")
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020063 call term_sendkeys(buf, ":call popup_move(popupwin, #{line: 7, col: 55})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +020064 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020065 call VerifyScreenDump(buf, 'Test_popupwin_07', {})
66
67 " clear all popups after moving the cursor a bit, so that ruler is updated
68 call term_sendkeys(buf, "axxx\<Esc>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020069 call TermWait(buf)
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020070 call term_sendkeys(buf, "0")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020071 call TermWait(buf)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +020072 call term_sendkeys(buf, ":call popup_clear()\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020073 call VerifyScreenDump(buf, 'Test_popupwin_08', {})
74
Bram Moolenaar4d784b22019-05-25 19:51:39 +020075 " clean up
76 call StopVimInTerminal(buf)
Bram Moolenaar4d784b22019-05-25 19:51:39 +020077endfunc
Bram Moolenaar51fe3b12019-05-26 20:10:06 +020078
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020079func Test_popup_with_border_and_padding()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +020080 CheckScreendump
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020081
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +020082 for iter in range(0, 1)
Bram Moolenaare7eb9272019-06-24 00:58:07 +020083 let lines =<< trim END
84 call setline(1, range(1, 100))
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020085 call popup_create('hello border', #{line: 2, col: 3, border: []})
86 call popup_create('hello padding', #{line: 2, col: 23, padding: []})
Bram Moolenaarc363fe12019-08-04 18:13:46 +020087 call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020088 call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
Bram Moolenaarb0992022020-01-30 14:55:42 +010089 call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020090 call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
91 call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
Bram Moolenaarfbcdf672020-01-06 23:07:48 +010092 call popup_create('X', #{line: 2, col: 73})
93 call popup_create('X', #{line: 3, col: 74})
94 call popup_create('X', #{line: 4, col: 75})
95 call popup_create('X', #{line: 5, col: 76})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020096 END
97 call insert(lines, iter == 1 ? '' : 'set enc=latin1')
Bram Moolenaar145d1fd2022-09-30 21:57:11 +010098 call writefile(lines, 'XtestPopupBorder', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020099 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 15})
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +0200100 call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
101
102 call StopVimInTerminal(buf)
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +0200103 endfor
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200104
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200105 let lines =<< trim END
106 call setline(1, range(1, 100))
107 hi BlueColor ctermbg=lightblue
108 hi TopColor ctermbg=253
109 hi RightColor ctermbg=245
110 hi BottomColor ctermbg=240
111 hi LeftColor ctermbg=248
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200112 call popup_create('hello border', #{line: 2, col: 3, border: [], borderhighlight: ['BlueColor']})
113 call popup_create(['hello border', 'and more'], #{line: 2, col: 23, border: [], borderhighlight: ['TopColor', 'RightColor', 'BottomColor', 'LeftColor']})
114 call popup_create(['hello border', 'lines only'], #{line: 2, col: 43, border: [], borderhighlight: ['BlueColor'], borderchars: ['x']})
115 call popup_create(['hello border', 'with corners'], #{line: 2, col: 60, border: [], borderhighlight: ['BlueColor'], borderchars: ['x', '#']})
116 let winid = popup_create(['hello border', 'with numbers'], #{line: 6, col: 3, border: [], borderhighlight: ['BlueColor'], borderchars: ['0', '1', '2', '3', '4', '5', '6', '7']})
117 call popup_create(['hello border', 'just blanks'], #{line: 7, col: 23, border: [], borderhighlight: ['BlueColor'], borderchars: [' ']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200118 func MultiByte()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200119 call popup_create(['hello'], #{line: 8, col: 43, border: [], borderchars: ['─', '│', '─', '│', '┌', '┐', '┘', '└']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200120 endfunc
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200121 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100122 call writefile(lines, 'XtestPopupBorder', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200123 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 12})
Bram Moolenaar790498b2019-06-01 22:15:29 +0200124 call VerifyScreenDump(buf, 'Test_popupwin_22', {})
125
Bram Moolenaarad24a712019-06-17 20:05:45 +0200126 " check that changing borderchars triggers a redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200127 call term_sendkeys(buf, ":call popup_setoptions(winid, #{borderchars: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']})\<CR>")
Bram Moolenaarad24a712019-06-17 20:05:45 +0200128 call VerifyScreenDump(buf, 'Test_popupwin_23', {})
129
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200130 " check multi-byte border only with 'ambiwidth' single
131 if &ambiwidth == 'single'
132 call term_sendkeys(buf, ":call MultiByte()\<CR>")
133 call VerifyScreenDump(buf, 'Test_popupwin_24', {})
134 endif
135
Bram Moolenaar790498b2019-06-01 22:15:29 +0200136 call StopVimInTerminal(buf)
Bram Moolenaar790498b2019-06-01 22:15:29 +0200137
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200138 let with_border_or_padding = #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200139 \ line: 2,
140 \ core_line: 3,
141 \ col: 3,
142 \ core_col: 4,
143 \ width: 14,
144 \ core_width: 12,
145 \ height: 3,
146 \ core_height: 1,
147 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100148 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200149 \ scrollbar: 0,
150 \ visible: 1}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200151 let winid = popup_create('hello border', #{line: 2, col: 3, border: []})",
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200152 call assert_equal(with_border_or_padding, winid->popup_getpos())
Bram Moolenaarae943152019-06-16 22:54:14 +0200153 let options = popup_getoptions(winid)
154 call assert_equal([], options.border)
155 call assert_false(has_key(options, "padding"))
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200156
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200157 let winid = popup_create('hello padding', #{line: 2, col: 3, padding: []})
Bram Moolenaarae943152019-06-16 22:54:14 +0200158 let with_border_or_padding.width = 15
159 let with_border_or_padding.core_width = 13
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200160 call assert_equal(with_border_or_padding, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200161 let options = popup_getoptions(winid)
162 call assert_false(has_key(options, "border"))
163 call assert_equal([], options.padding)
164
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200165 call popup_setoptions(winid, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200166 \ padding: [1, 2, 3, 4],
167 \ border: [4, 0, 7, 8],
168 \ borderhighlight: ['Top', 'Right', 'Bottom', 'Left'],
169 \ borderchars: ['1', '^', '2', '>', '3', 'v', '4', '<'],
Bram Moolenaarae943152019-06-16 22:54:14 +0200170 \ })
171 let options = popup_getoptions(winid)
172 call assert_equal([1, 0, 1, 1], options.border)
173 call assert_equal([1, 2, 3, 4], options.padding)
174 call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
175 call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200176
Bram Moolenaara1396152019-10-20 18:46:05 +0200177 " Check that popup_setoptions() takes the output of popup_getoptions()
178 call popup_setoptions(winid, options)
179 call assert_equal(options, popup_getoptions(winid))
180
Bram Moolenaarb0992022020-01-30 14:55:42 +0100181 " Check that range() doesn't crash
182 call popup_setoptions(winid, #{
183 \ padding: range(1, 4),
184 \ border: range(5, 8),
185 \ borderhighlight: range(4),
186 \ borderchars: range(8),
187 \ })
188
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200189 let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
190 call assert_equal(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200191 \ line: 3,
192 \ core_line: 5,
193 \ col: 8,
194 \ core_col: 10,
195 \ width: 14,
196 \ core_width: 10,
197 \ height: 5,
198 \ scrollbar: 0,
199 \ core_height: 1,
200 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100201 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200202 \ visible: 1}, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200203
204 call popup_clear()
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200205endfunc
206
Bram Moolenaarb4230122019-05-30 18:40:53 +0200207func Test_popup_with_syntax_win_execute()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200208 CheckScreendump
209
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200210 let lines =<< trim END
211 call setline(1, range(1, 100))
212 hi PopupColor ctermbg=lightblue
213 let winid = popup_create([
214 \ '#include <stdio.h>',
215 \ 'int main(void)',
216 \ '{',
217 \ ' printf(123);',
218 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200219 \], #{line: 3, col: 25, highlight: 'PopupColor'})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200220 call win_execute(winid, 'set syntax=cpp')
221 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100222 call writefile(lines, 'XtestPopup', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200223 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200224 call VerifyScreenDump(buf, 'Test_popupwin_10', {})
225
226 " clean up
227 call StopVimInTerminal(buf)
Bram Moolenaarb4230122019-05-30 18:40:53 +0200228endfunc
229
230func Test_popup_with_syntax_setbufvar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200231 CheckScreendump
232
Bram Moolenaar402502d2019-05-30 22:07:36 +0200233 let lines =<< trim END
234 call setline(1, range(1, 100))
235 hi PopupColor ctermbg=lightgrey
236 let winid = popup_create([
237 \ '#include <stdio.h>',
238 \ 'int main(void)',
239 \ '{',
Bram Moolenaare089c3f2019-07-09 20:25:25 +0200240 \ "\tprintf(567);",
Bram Moolenaar402502d2019-05-30 22:07:36 +0200241 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200242 \], #{line: 3, col: 21, highlight: 'PopupColor'})
Bram Moolenaar402502d2019-05-30 22:07:36 +0200243 call setbufvar(winbufnr(winid), '&syntax', 'cpp')
244 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100245 call writefile(lines, 'XtestPopup', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200246 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200247 call VerifyScreenDump(buf, 'Test_popupwin_11', {})
248
249 " clean up
250 call StopVimInTerminal(buf)
Bram Moolenaarb4230122019-05-30 18:40:53 +0200251endfunc
252
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200253func Test_popup_with_matches()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200254 CheckScreendump
255
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200256 let lines =<< trim END
257 call setline(1, ['111 222 333', '444 555 666'])
258 let winid = popup_create([
259 \ '111 222 333',
260 \ '444 555 666',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200261 \], #{line: 3, col: 10, border: []})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200262 set hlsearch
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100263 hi VeryBlue ctermfg=blue guifg=blue
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200264 /666
265 call matchadd('ErrorMsg', '111')
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100266 call matchadd('VeryBlue', '444')
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200267 call win_execute(winid, "call matchadd('ErrorMsg', '111')")
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100268 call win_execute(winid, "call matchadd('VeryBlue', '555')")
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200269 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100270 call writefile(lines, 'XtestPopupMatches', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200271 let buf = RunVimInTerminal('-S XtestPopupMatches', #{rows: 10})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200272 call VerifyScreenDump(buf, 'Test_popupwin_matches', {})
273
274 " clean up
275 call StopVimInTerminal(buf)
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200276endfunc
277
Bram Moolenaar399d8982019-06-02 15:34:29 +0200278func Test_popup_all_corners()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200279 CheckScreendump
280
Bram Moolenaar399d8982019-06-02 15:34:29 +0200281 let lines =<< trim END
282 call setline(1, repeat([repeat('-', 60)], 15))
283 set so=0
284 normal 2G3|r#
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200285 let winid1 = popup_create(['first', 'second'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200286 \ line: 'cursor+1',
287 \ col: 'cursor',
288 \ pos: 'topleft',
289 \ border: [],
290 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200291 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200292 normal 24|r@
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200293 let winid1 = popup_create(['First', 'SeconD'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200294 \ line: 'cursor+1',
295 \ col: 'cursor',
296 \ pos: 'topright',
297 \ border: [],
298 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200299 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200300 normal 9G27|r%
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200301 let winid1 = popup_create(['fiRSt', 'seCOnd'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200302 \ line: 'cursor-1',
303 \ col: 'cursor',
304 \ pos: 'botleft',
305 \ border: [],
306 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200307 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200308 normal 48|r&
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200309 let winid1 = popup_create(['FIrsT', 'SEcoND'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200310 \ line: 'cursor-1',
311 \ col: 'cursor',
312 \ pos: 'botright',
313 \ border: [],
314 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200315 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200316 normal 1G51|r*
317 let winid1 = popup_create(['one', 'two'], #{
318 \ line: 'cursor-1',
319 \ col: 'cursor',
320 \ pos: 'botleft',
321 \ border: [],
322 \ padding: [],
323 \ })
Bram Moolenaar399d8982019-06-02 15:34:29 +0200324 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100325 call writefile(lines, 'XtestPopupCorners', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200326 let buf = RunVimInTerminal('-S XtestPopupCorners', #{rows: 12})
Bram Moolenaar399d8982019-06-02 15:34:29 +0200327 call VerifyScreenDump(buf, 'Test_popupwin_corners', {})
328
329 " clean up
330 call StopVimInTerminal(buf)
Bram Moolenaar399d8982019-06-02 15:34:29 +0200331endfunc
332
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100333func Test_popup_nospace()
334 CheckScreendump
335
336 let lines =<< trim END
337 call setline(1, repeat([repeat('-', 60)], 15))
338 set so=0
339
340 " cursor in a line in top half, using "botleft" with popup that
341 " does fit
342 normal 5G2|r@
343 let winid1 = popup_create(['one', 'two'], #{
344 \ line: 'cursor-1',
345 \ col: 'cursor',
346 \ pos: 'botleft',
347 \ border: [],
348 \ })
349 " cursor in a line in top half, using "botleft" with popup that
350 " doesn't fit: gets truncated
351 normal 5G9|r#
352 let winid1 = popup_create(['one', 'two', 'tee'], #{
353 \ line: 'cursor-1',
354 \ col: 'cursor',
355 \ pos: 'botleft',
356 \ posinvert: 0,
357 \ border: [],
358 \ })
359 " cursor in a line in top half, using "botleft" with popup that
360 " doesn't fit and 'posinvert' set: flips to below.
361 normal 5G16|r%
362 let winid1 = popup_create(['one', 'two', 'tee'], #{
363 \ line: 'cursor-1',
364 \ col: 'cursor',
365 \ pos: 'botleft',
366 \ border: [],
367 \ })
368 " cursor in a line in bottom half, using "botleft" with popup that
369 " doesn't fit: does not flip.
370 normal 8G23|r*
371 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
372 \ line: 'cursor-1',
373 \ col: 'cursor',
374 \ pos: 'botleft',
375 \ border: [],
376 \ })
377
378 " cursor in a line in bottom half, using "topleft" with popup that
379 " does fit
380 normal 8G30|r@
381 let winid1 = popup_create(['one', 'two'], #{
382 \ line: 'cursor+1',
383 \ col: 'cursor',
384 \ pos: 'topleft',
385 \ border: [],
386 \ })
387 " cursor in a line in top half, using "topleft" with popup that
388 " doesn't fit: truncated
389 normal 8G37|r#
390 let winid1 = popup_create(['one', 'two', 'tee'], #{
391 \ line: 'cursor+1',
392 \ col: 'cursor',
393 \ pos: 'topleft',
394 \ posinvert: 0,
395 \ border: [],
396 \ })
397 " cursor in a line in top half, using "topleft" with popup that
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100398 " doesn't fit and "posinvert" set: flips to above.
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100399 normal 8G44|r%
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100400 let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100401 \ line: 'cursor+1',
402 \ col: 'cursor',
403 \ pos: 'topleft',
404 \ border: [],
405 \ })
406 " cursor in a line in top half, using "topleft" with popup that
407 " doesn't fit: does not flip.
408 normal 5G51|r*
409 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
410 \ line: 'cursor+1',
411 \ col: 'cursor',
412 \ pos: 'topleft',
413 \ border: [],
414 \ })
415 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100416 call writefile(lines, 'XtestPopupNospace', 'D')
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100417 let buf = RunVimInTerminal('-S XtestPopupNospace', #{rows: 12})
418 call VerifyScreenDump(buf, 'Test_popupwin_nospace', {})
419
420 " clean up
421 call StopVimInTerminal(buf)
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100422endfunc
423
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200424func Test_popup_firstline_dump()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200425 CheckScreendump
426
Bram Moolenaar8d241042019-06-12 23:40:01 +0200427 let lines =<< trim END
428 call setline(1, range(1, 20))
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200429 let winid = popup_create(['1111', '222222', '33333', '44', '5', '666666', '77777', '888', '9999999999999999'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200430 \ maxheight: 4,
431 \ firstline: 3,
Bram Moolenaar8d241042019-06-12 23:40:01 +0200432 \ })
433 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100434 call writefile(lines, 'XtestPopupFirstline', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200435 let buf = RunVimInTerminal('-S XtestPopupFirstline', #{rows: 10})
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200436 call VerifyScreenDump(buf, 'Test_popupwin_firstline_1', {})
437
438 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: -1})\<CR>")
439 call term_sendkeys(buf, ":\<CR>")
440 call VerifyScreenDump(buf, 'Test_popupwin_firstline_2', {})
Bram Moolenaar8d241042019-06-12 23:40:01 +0200441
442 " clean up
443 call StopVimInTerminal(buf)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200444endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +0200445
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200446func Test_popup_firstline()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200447 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200448 \ maxheight: 2,
449 \ firstline: 3,
Bram Moolenaarae943152019-06-16 22:54:14 +0200450 \ })
451 call assert_equal(3, popup_getoptions(winid).firstline)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200452 call popup_setoptions(winid, #{firstline: 1})
Bram Moolenaarae943152019-06-16 22:54:14 +0200453 call assert_equal(1, popup_getoptions(winid).firstline)
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200454 eval winid->popup_close()
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200455
456 let winid = popup_create(['xxx']->repeat(50), #{
457 \ maxheight: 3,
458 \ firstline: 11,
459 \ })
460 redraw
461 call assert_equal(11, popup_getoptions(winid).firstline)
462 call assert_equal(11, popup_getpos(winid).firstline)
Bram Moolenaar8e0a8e72019-09-02 22:56:24 +0200463 " check line() works with popup window
464 call assert_equal(11, line('.', winid))
465 call assert_equal(50, line('$', winid))
466 call assert_equal(0, line('$', 123456))
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200467
468 " Normal command changes what is displayed but not "firstline"
469 call win_execute(winid, "normal! \<c-y>")
470 call assert_equal(11, popup_getoptions(winid).firstline)
471 call assert_equal(10, popup_getpos(winid).firstline)
472
473 " Making some property change applies "firstline" again
474 call popup_setoptions(winid, #{line: 4})
475 call assert_equal(11, popup_getoptions(winid).firstline)
476 call assert_equal(11, popup_getpos(winid).firstline)
477
478 " Remove "firstline" property and scroll
479 call popup_setoptions(winid, #{firstline: 0})
480 call win_execute(winid, "normal! \<c-y>")
481 call assert_equal(0, popup_getoptions(winid).firstline)
482 call assert_equal(10, popup_getpos(winid).firstline)
483
484 " Making some property change has no side effect
485 call popup_setoptions(winid, #{line: 3})
486 call assert_equal(0, popup_getoptions(winid).firstline)
487 call assert_equal(10, popup_getpos(winid).firstline)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200488 call popup_close(winid)
Bram Moolenaarae943152019-06-16 22:54:14 +0200489
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100490 " CTRL-D scrolls down half a page
491 let winid = popup_create(['xxx']->repeat(50), #{
492 \ maxheight: 8,
493 \ })
494 redraw
495 call assert_equal(1, popup_getpos(winid).firstline)
496 call win_execute(winid, "normal! \<C-D>")
497 call assert_equal(5, popup_getpos(winid).firstline)
498 call win_execute(winid, "normal! \<C-D>")
499 call assert_equal(9, popup_getpos(winid).firstline)
500 call win_execute(winid, "normal! \<C-U>")
501 call assert_equal(5, popup_getpos(winid).firstline)
502
503 call win_execute(winid, "normal! \<C-F>")
504 call assert_equal(11, popup_getpos(winid).firstline)
505 call win_execute(winid, "normal! \<C-B>")
506 call assert_equal(5, popup_getpos(winid).firstline)
507
Bram Moolenaarae943152019-06-16 22:54:14 +0200508 call popup_close(winid)
LemonBoy0044e512022-04-20 19:47:37 +0100509
510 " Popup with less elements than the maximum height and negative firstline:
511 " check that the popup height is correctly computed.
512 let winid = popup_create(['xxx']->repeat(4), #{
513 \ firstline: -1,
514 \ maxheight: 6,
515 \ })
516
517 let pos = popup_getpos(winid)
518 call assert_equal(3, pos.width)
519 call assert_equal(4, pos.height)
520
521 call popup_close(winid)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200522endfunc
523
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200524func Test_popup_firstline_cursorline()
525 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
526 \ maxheight: 2,
527 \ firstline: 3,
528 \ cursorline: 1,
529 \ })
530 call assert_equal(3, popup_getoptions(winid).firstline)
531 call assert_equal(3, getwininfo(winid)[0].topline)
532 call assert_equal(3, getcurpos(winid)[1])
533
534 call popup_close(winid)
535endfunc
536
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200537func Test_popup_noscrolloff()
538 set scrolloff=5
539 let winid = popup_create(['xxx']->repeat(50), #{
540 \ maxheight: 5,
541 \ firstline: 11,
542 \ })
543 redraw
544 call assert_equal(11, popup_getoptions(winid).firstline)
545 call assert_equal(11, popup_getpos(winid).firstline)
546
547 call popup_setoptions(winid, #{firstline: 0})
548 call win_execute(winid, "normal! \<c-y>")
549 call assert_equal(0, popup_getoptions(winid).firstline)
550 call assert_equal(10, popup_getpos(winid).firstline)
551
552 call popup_close(winid)
553endfunc
554
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200555func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200556 CheckScreendump
557
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200558 " create a popup that covers the command line
559 let lines =<< trim END
560 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200561 split
562 vsplit
563 $wincmd w
564 vsplit
565 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200566 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200567 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200568 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200569 \ border: [],
570 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200571 \ })
572 func Dragit()
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000573 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
574 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200575 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
576 endfunc
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200577 func Resize()
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000578 map <silent> <F5> :call test_setmouse(6, 21)<CR>
579 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200580 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
581 endfunc
Bram Moolenaarbfc57862021-11-26 15:57:40 +0000582 func ClickAndDrag()
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000583 map <silent> <F3> :call test_setmouse(5, 2)<CR>
584 map <silent> <F4> :call test_setmouse(3, 14)<CR>
585 map <silent> <F5> :call test_setmouse(3, 18)<CR>
586 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
587 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
Bram Moolenaarbfc57862021-11-26 15:57:40 +0000588 endfunc
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000589 func DragAllStart()
590 call popup_clear()
591 call popup_create('hello', #{line: 3, col: 5, dragall: 1})
592 endfunc
593 func DragAllDrag()
594 map <silent> <F3> :call test_setmouse(3, 5)<CR>
595 map <silent> <F4> :call test_setmouse(5, 36)<CR>
596 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
597 endfunc
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200598 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100599 call writefile(lines, 'XtestPopupDrag', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200600 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200601 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
602
603 call term_sendkeys(buf, ":call Dragit()\<CR>")
604 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
605
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200606 call term_sendkeys(buf, ":call Resize()\<CR>")
607 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
608
Bram Moolenaarbfc57862021-11-26 15:57:40 +0000609 " dragging works after click on a status line
610 call term_sendkeys(buf, ":call ClickAndDrag()\<CR>")
611 call VerifyScreenDump(buf, 'Test_popupwin_drag_04', {})
612
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000613 " dragging without border
614 call term_sendkeys(buf, ":call DragAllStart()\<CR>")
615 call VerifyScreenDump(buf, 'Test_popupwin_drag_05', {})
616 call term_sendkeys(buf, ":call DragAllDrag()\<CR>")
617 call VerifyScreenDump(buf, 'Test_popupwin_drag_06', {})
618
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200619 " clean up
620 call StopVimInTerminal(buf)
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200621endfunc
622
Bram Moolenaareabddc42022-04-02 15:32:16 +0100623func Test_popup_drag_minwidth()
624 CheckScreendump
625
626 " create a popup that does not fit
627 let lines =<< trim END
628 call range(40)
629 \ ->map({_,i -> string(i)})
630 \ ->popup_create({
631 \ 'drag': 1,
632 \ 'wrap': 0,
633 \ 'border': [],
634 \ 'scrollbar': 1,
635 \ 'minwidth': 100,
636 \ 'filter': {w, k -> k ==# 'q' ? len([popup_close(w)]) : 0},
637 \ })
638 func DragitDown()
639 map <silent> <F3> :call test_setmouse(1, 10)<CR>
640 map <silent> <F4> :call test_setmouse(5, 40)<CR>
641 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
642 endfunc
643 func DragitUp()
644 map <silent> <F3> :call test_setmouse(5, 40)<CR>
645 map <silent> <F4> :call test_setmouse(4, 40)<CR>
646 map <silent> <F5> :call test_setmouse(3, 40)<CR>
647 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
648 endfunc
649 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100650 call writefile(lines, 'XtestPopupDrag', 'D')
Bram Moolenaareabddc42022-04-02 15:32:16 +0100651 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
652 call VerifyScreenDump(buf, 'Test_popupwin_drag_minwidth_1', {})
653
654 call term_sendkeys(buf, ":call DragitDown()\<CR>")
655 call VerifyScreenDump(buf, 'Test_popupwin_drag_minwidth_2', {})
656
657 call term_sendkeys(buf, ":call DragitUp()\<CR>")
658 call VerifyScreenDump(buf, 'Test_popupwin_drag_minwidth_3', {})
659
660 call term_sendkeys(buf, 'q')
661
662 " clean up
663 call StopVimInTerminal(buf)
Bram Moolenaareabddc42022-04-02 15:32:16 +0100664endfunc
665
Bram Moolenaar35910f22020-07-12 19:24:10 +0200666func Test_popup_drag_termwin()
667 CheckUnix
668 CheckScreendump
669 CheckFeature terminal
670
671 " create a popup that covers the terminal window
672 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200673 set foldmethod=marker
674 call setline(1, range(100))
675 for nr in range(7)
676 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200677 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200678 endfor
679 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200680 set shell=/bin/sh noruler
Bram Moolenaar4b2ce122020-11-21 21:41:41 +0100681 unlet $PROMPT_COMMAND
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200682 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200683 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200684 $wincmd w
685 let winid = popup_create(['1111', '2222'], #{
686 \ drag: 1,
687 \ resize: 1,
688 \ border: [],
689 \ line: 3,
690 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200691 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200692 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
693 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200694 func DragitDown()
695 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
696 endfunc
697 func DragitDownLeft()
698 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
699 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200700 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
701 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200702 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
703 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200704 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100705 call writefile(lines, 'XtestPopupTerm', 'D')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200706 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200707 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
708
Bram Moolenaar452143c2020-07-15 17:38:21 +0200709 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200710 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
711
Bram Moolenaar452143c2020-07-15 17:38:21 +0200712 call term_sendkeys(buf, ":call DragitDown()\<CR>")
713 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
714
715 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
716 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
717
Bram Moolenaar35910f22020-07-12 19:24:10 +0200718 " clean up
719 call StopVimInTerminal(buf)
Bram Moolenaar35910f22020-07-12 19:24:10 +0200720endfunc
721
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200722func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200723 CheckScreendump
724
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200725 let lines =<< trim END
726 call setline(1, range(1, 20))
727 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200728 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200729 \ close: 'button',
730 \ border: [],
731 \ line: 1,
732 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200733 \ })
734 func CloseMsg(id, result)
735 echomsg 'Popup closed with ' .. a:result
736 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200737 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200738 \ close: 'click',
739 \ line: 3,
740 \ col: 15,
741 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200742 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200743 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200744 \ close: 'button',
745 \ line: 5,
746 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200747 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200748 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200749 \ close: 'button',
750 \ padding: [],
751 \ line: 5,
752 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200753 \ })
754 func CloseWithX()
755 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
756 endfunc
757 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
758 func CloseWithClick()
759 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
760 endfunc
761 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200762 func CreateWithMenuFilter()
763 let winid = popup_create('barfoo', #{
764 \ close: 'button',
765 \ filter: 'popup_filter_menu',
766 \ border: [],
767 \ line: 1,
768 \ col: 40,
769 \ })
770 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200771 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100772 call writefile(lines, 'XtestPopupClose', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200773 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200774 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
775
776 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
777 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
778
779 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
780 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
781
Bram Moolenaarf6396232019-08-24 19:36:00 +0200782 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
783 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
784
785 " We have to send the actual mouse code, feedkeys() would be caught the
786 " filter.
787 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
788 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
789
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200790 " clean up
791 call StopVimInTerminal(buf)
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200792endfunction
793
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200794func Test_popup_menu_wrap()
795 CheckScreendump
796
797 let lines =<< trim END
798 call setline(1, range(1, 20))
799 call popup_create([
800 \ 'one',
801 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
802 \ 'three',
803 \ 'four',
804 \ ], #{
805 \ pos: "botleft",
806 \ border: [],
807 \ padding: [0,1,0,1],
808 \ maxheight: 3,
809 \ cursorline: 1,
810 \ filter: 'popup_filter_menu',
811 \ })
812 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100813 call writefile(lines, 'XtestPopupWrap', 'D')
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200814 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
815 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
816
817 call term_sendkeys(buf, "jj")
818 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
819
820 " clean up
821 call term_sendkeys(buf, "\<Esc>")
822 call StopVimInTerminal(buf)
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200823endfunction
824
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200825func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200826 CheckScreendump
827
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200828 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200829 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200830 hi PopupColor ctermbg=lightgrey
831 let winid = popup_create([
832 \ 'some text',
833 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200834 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200835 \ line: 1,
836 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100837 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200838 \ wrap: 0,
839 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200840 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200841 \ zindex: 90,
842 \ padding: [],
843 \ highlight: 'PopupColor',
844 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200845 call popup_create([
846 \ 'xxxxxxxxx',
847 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200848 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200849 \ line: 3,
850 \ col: 18,
851 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200852 let winidb = popup_create([
853 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200854 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200855 \ line: 7,
856 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100857 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200858 \ wrap: 0,
859 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200860 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200861 \ close: 'button',
862 \ zindex: 90,
863 \ padding: [],
864 \ border: [],
865 \ mask: [[1,2,1,1], [-5,-1,4,4], [7,9,2,3], [3,5,5,5],[-7,-4,5,5]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200866 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100867 call writefile(lines, 'XtestPopupMask', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200868 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200869 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
870
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200871 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
872 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200873 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200874 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
875
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200876 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
877 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200878 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200879 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
880
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200881 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
882 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200883 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200884 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
885
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200886 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
887 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200888 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200889 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
890
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200891 " clean up
892 call StopVimInTerminal(buf)
Bram Moolenaar4012d262020-12-29 11:57:46 +0100893
894 " this was causing a crash
895 call popup_create('test', #{mask: [[0, 0, 0, 0]]})
896 call popup_clear()
Bram Moolenaar10ccfb22021-02-13 21:31:18 +0100897
898 " this was causing an internal error
899 enew
900 set nowrap
901 call repeat('x', &columns)->setline(1)
902 call prop_type_add('textprop', {})
903 call prop_add(1, 1, #{length: &columns, type: 'textprop'})
904 vsplit
905 let opts = popup_create('', #{textprop: 'textprop'})
906 \ ->popup_getoptions()
907 \ ->extend(#{mask: [[1, 1, 1, 1]]})
908 call popup_create('', opts)
909 redraw
910
911 close!
912 bwipe!
913 call prop_type_delete('textprop')
914 call popup_clear()
915 set wrap&
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200916endfunc
917
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200918func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200919 CheckScreendump
920 CheckFeature clipboard_working
921
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200922 " create a popup with some text to be selected
923 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200924 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200925 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200926 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200927 \ drag: 1,
928 \ border: [],
929 \ line: 3,
930 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200931 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200932 \ })
933 func Select1()
934 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
935 endfunc
936 map <silent> <F3> :call test_setmouse(4, 15)<CR>
937 map <silent> <F4> :call test_setmouse(6, 23)<CR>
938 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +0100939 call writefile(lines, 'XtestPopupSelect', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200940 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200941 call term_sendkeys(buf, ":call Select1()\<CR>")
942 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
943
944 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
945 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200946 " clean the command line, sometimes it still shows a command
947 call term_sendkeys(buf, ":\<esc>")
948
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200949 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
950
951 " clean up
952 call StopVimInTerminal(buf)
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200953endfunc
954
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200955func Test_popup_in_tab()
956 " default popup is local to tab, not visible when in other tab
957 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200958 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200959 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200960 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200961 tabnew
962 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200963 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200964 quit
965 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200966
967 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200968 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200969 " buffer is gone now
970 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200971
972 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200973 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200974 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200975 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200976 tabnew
977 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200978 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200979 quit
980 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200981 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200982
983 " create popup in other tab
984 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200985 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200986 call assert_equal(0, popup_getpos(winid).visible)
987 call assert_equal(1, popup_getoptions(winid).tabpage)
988 quit
989 call assert_equal(1, popup_getpos(winid).visible)
990 call assert_equal(0, popup_getoptions(winid).tabpage)
991 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200992endfunc
993
994func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200995 call assert_equal(0, len(popup_list()))
996
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200997 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200998 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200999 let pos = popup_getpos(winid)
1000 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001001 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001002 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001003
1004 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001005 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001006 let pos = popup_getpos(winid)
1007 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001008 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001009
1010 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001011 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001012 let pos = popup_getpos(winid)
1013 let around = (&columns - pos.width) / 2
1014 call assert_inrange(around - 1, around + 1, pos.col)
1015 let around = (&lines - pos.height) / 2
1016 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001017 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001018endfunc
1019
1020func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02001021 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001022 call popup_clear()
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +01001023 call assert_fails('call popup_create("text", "none")', 'E1206:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001024 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001025 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
1026 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
1027 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001028
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001029 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001030 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001031 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001032 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001033 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001034 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001035 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001036 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001037
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001038 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001039 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001040 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001041 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001042 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001043 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001044 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001045 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001046
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001047 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001048 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001049 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001050 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001051 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001052 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001053 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001054 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +02001055 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
1056 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001057 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001058 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001059
Bram Moolenaar83bd7a92022-05-29 17:13:24 +01001060 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E1284: Argument 1, list item 2: Dictionary required')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001061 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001062 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001063 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001064 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001065 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +01001066 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
1067 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001068 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
1069 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +01001070 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
1071 call popup_clear()
1072 call popup_create("text", #{mask: [range(4)]})
1073 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001074 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001075 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001076 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001077 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
1078 call popup_clear()
Bram Moolenaar83bd7a92022-05-29 17:13:24 +01001079
1080 call assert_fails('call popup_create(range(10), {})', 'E1024:')
1081 call popup_clear()
1082 call assert_fails('call popup_create([1, 2], {})', 'E1284: Argument 1, list item 1: Dictionary required')
1083 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001084endfunc
1085
Bram Moolenaareea16992019-05-31 17:34:48 +02001086func Test_win_execute_closing_curwin()
1087 split
1088 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001089 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001090 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +01001091
1092 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001093 call assert_fails('call win_execute(winid, printf("normal! :\<C-u>call popup_close(%d)\<CR>", winid))', 'E994:')
Bram Moolenaar49540192019-12-11 19:34:54 +01001094 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001095endfunc
1096
1097func Test_win_execute_not_allowed()
1098 let winid = popup_create('some text', {})
1099 call assert_fails('call win_execute(winid, "split")', 'E994:')
1100 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1101 call assert_fails('call win_execute(winid, "close")', 'E994:')
1102 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001103 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001104 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1105 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1106 call assert_fails('call win_execute(winid, "next")', 'E994:')
1107 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001108 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001109 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001110 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1111 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1112 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1113 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001114 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1115 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001116 call assert_fails('call win_execute(winid, "help")', 'E994:')
1117 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001118 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1119 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1120 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1121 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001122 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001123endfunc
1124
Bram Moolenaar402502d2019-05-30 22:07:36 +02001125func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001126 CheckScreendump
1127
Bram Moolenaar402502d2019-05-30 22:07:36 +02001128 let lines =<< trim END
1129 call setline(1, range(1, 100))
1130 let winid = popup_create(
1131 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001132 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001133 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001134 call writefile(lines, 'XtestPopup', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001135 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001136 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1137
1138 " clean up
1139 call StopVimInTerminal(buf)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001140endfunc
1141
1142func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001143 CheckScreendump
1144
Bram Moolenaar402502d2019-05-30 22:07:36 +02001145 let lines =<< trim END
1146 call setline(1, range(1, 100))
1147 let winid = popup_create(
1148 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001149 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001150 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001151 call writefile(lines, 'XtestPopup', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001152 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001153 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1154
1155 " clean up
1156 call StopVimInTerminal(buf)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001157endfunc
1158
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001159func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001160 CheckScreendump
1161
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001162 let lines =<< trim END
1163 set showbreak=>>\
1164 call setline(1, range(1, 20))
1165 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001166 \ 'a long line here that wraps',
1167 \ #{filter: 'popup_filter_yesno',
1168 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001169 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001170 call writefile(lines, 'XtestPopupShowbreak', 'D')
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001171 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1172 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1173
1174 " clean up
1175 call term_sendkeys(buf, "y")
1176 call StopVimInTerminal(buf)
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001177endfunc
1178
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001179func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001180 CheckFeature timers
1181
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001182 topleft vnew
1183 call setline(1, 'hello')
1184
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001185 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001186 \ line: 1,
1187 \ col: 1,
1188 \ minwidth: 20,
1189 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001190 \})
1191 redraw
1192 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1193 call assert_equal('world', line)
1194
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001195 call assert_equal(winid, popup_locate(1, 1))
1196 call assert_equal(winid, popup_locate(1, 20))
1197 call assert_equal(0, popup_locate(1, 21))
1198 call assert_equal(0, popup_locate(2, 1))
1199
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001200 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001201 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001202 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001203 call assert_equal('hello', line)
1204
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001205 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001206 \ line: &lines,
1207 \ col: 10,
1208 \ minwidth: 20,
1209 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001210 \})
1211 redraw
1212 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1213 call assert_match('.*on the command line.*', line)
1214
1215 sleep 700m
1216 redraw
1217 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1218 call assert_notmatch('.*on the command line.*', line)
1219
1220 bwipe!
1221endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001222
1223func Test_popup_hide()
1224 topleft vnew
1225 call setline(1, 'hello')
1226
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001227 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001228 \ line: 1,
1229 \ col: 1,
1230 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001231 \})
1232 redraw
1233 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1234 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001235 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001236 " buffer is still listed and active
1237 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001238
1239 call popup_hide(winid)
1240 redraw
1241 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1242 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001243 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001244 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001245 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001246
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001247 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001248 redraw
1249 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1250 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001251 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001252
1253
1254 call popup_close(winid)
1255 redraw
1256 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1257 call assert_equal('hello', line)
1258
1259 " error is given for existing non-popup window
1260 call assert_fails('call popup_hide(win_getid())', 'E993:')
1261
1262 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001263 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001264 call popup_show(41234234)
1265
1266 bwipe!
1267endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001268
1269func Test_popup_move()
1270 topleft vnew
1271 call setline(1, 'hello')
1272
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001273 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001274 \ line: 1,
1275 \ col: 1,
1276 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001277 \})
1278 redraw
1279 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1280 call assert_equal('world ', line)
1281
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001282 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001283 redraw
1284 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1285 call assert_equal('hello ', line)
1286 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1287 call assert_equal('~world', line)
1288
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001289 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001290 redraw
1291 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1292 call assert_equal('hworld', line)
1293
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +01001294 call assert_fails('call popup_move(winid, [])', 'E1206:')
1295 call assert_fails('call popup_move(winid, test_null_dict())', 'E1297:')
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001296
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001297 call popup_close(winid)
1298
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001299 call assert_equal(0, popup_move(-1, {}))
1300
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001301 bwipe!
1302endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001303
Bram Moolenaar402502d2019-05-30 22:07:36 +02001304func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001305 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001306 \ line: 2,
1307 \ col: 3,
1308 \ minwidth: 10,
1309 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001310 \})
1311 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001312 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001313 call assert_equal(2, res.line)
1314 call assert_equal(3, res.col)
1315 call assert_equal(10, res.width)
1316 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001317 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001318
1319 call popup_close(winid)
1320endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001321
1322func Test_popup_width_longest()
1323 let tests = [
1324 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1325 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1326 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1327 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1328 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1329 \ ]
1330
1331 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001332 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001333 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001334 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001335 call assert_equal(test[1], position.width)
1336 call popup_close(winid)
1337 endfor
1338endfunc
1339
1340func Test_popup_wraps()
1341 let tests = [
1342 \ ['nowrap', 6, 1],
1343 \ ['a line that wraps once', 12, 2],
1344 \ ['a line that wraps two times', 12, 3],
1345 \ ]
1346 for test in tests
1347 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001348 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001349 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001350 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001351 call assert_equal(test[1], position.width)
1352 call assert_equal(test[2], position.height)
1353
1354 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001355 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001356 endfor
1357endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001358
1359func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001360 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001361 \ line: 2,
1362 \ col: 3,
1363 \ minwidth: 10,
1364 \ minheight: 11,
1365 \ maxwidth: 20,
1366 \ maxheight: 21,
1367 \ zindex: 100,
1368 \ time: 5000,
1369 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001370 \})
1371 redraw
1372 let res = popup_getoptions(winid)
1373 call assert_equal(2, res.line)
1374 call assert_equal(3, res.col)
1375 call assert_equal(10, res.minwidth)
1376 call assert_equal(11, res.minheight)
1377 call assert_equal(20, res.maxwidth)
1378 call assert_equal(21, res.maxheight)
1379 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001380 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001381 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001382 if has('timers')
1383 call assert_equal(5000, res.time)
1384 endif
1385 call popup_close(winid)
1386
1387 let winid = popup_create('hello', {})
1388 redraw
1389 let res = popup_getoptions(winid)
1390 call assert_equal(0, res.line)
1391 call assert_equal(0, res.col)
1392 call assert_equal(0, res.minwidth)
1393 call assert_equal(0, res.minheight)
1394 call assert_equal(0, res.maxwidth)
1395 call assert_equal(0, res.maxheight)
1396 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001397 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001398 if has('timers')
1399 call assert_equal(0, res.time)
1400 endif
1401 call popup_close(winid)
1402 call assert_equal({}, popup_getoptions(winid))
1403endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001404
1405func Test_popup_option_values()
1406 new
1407 " window-local
1408 setlocal number
1409 setlocal nowrap
1410 " buffer-local
1411 setlocal omnifunc=Something
1412 " global/buffer-local
1413 setlocal path=/there
1414 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001415 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001416
1417 let winid = popup_create('hello', {})
1418 call assert_equal(0, getwinvar(winid, '&number'))
1419 call assert_equal(1, getwinvar(winid, '&wrap'))
1420 call assert_equal('', getwinvar(winid, '&omnifunc'))
1421 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001422 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1423
1424 " 'scrolloff' is reset to zero
1425 call assert_equal(5, &scrolloff)
1426 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001427
1428 call popup_close(winid)
1429 bwipe
1430endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001431
1432func Test_popup_atcursor()
1433 topleft vnew
1434 call setline(1, [
1435 \ 'xxxxxxxxxxxxxxxxx',
1436 \ 'xxxxxxxxxxxxxxxxx',
1437 \ 'xxxxxxxxxxxxxxxxx',
1438 \])
1439
1440 call cursor(2, 2)
1441 redraw
1442 let winid = popup_atcursor('vim', {})
1443 redraw
1444 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1445 call assert_equal('xvimxxxxxxxxxxxxx', line)
1446 call popup_close(winid)
1447
1448 call cursor(3, 4)
1449 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001450 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001451 redraw
1452 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1453 call assert_equal('xxxvimxxxxxxxxxxx', line)
1454 call popup_close(winid)
1455
1456 call cursor(1, 1)
1457 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001458 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001459 \ line: 'cursor+2',
1460 \ col: 'cursor+1',
1461 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001462 redraw
1463 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1464 call assert_equal('xvimxxxxxxxxxxxxx', line)
1465 call popup_close(winid)
1466
1467 call cursor(3, 3)
1468 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001469 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001470 \ line: 'cursor-2',
1471 \ col: 'cursor-1',
1472 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001473 redraw
1474 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1475 call assert_equal('xvimxxxxxxxxxxxxx', line)
1476 call popup_close(winid)
1477
Bram Moolenaar402502d2019-05-30 22:07:36 +02001478 " just enough room above
1479 call cursor(3, 3)
1480 redraw
1481 let winid = popup_atcursor(['vim', 'is great'], {})
1482 redraw
1483 let pos = popup_getpos(winid)
1484 call assert_equal(1, pos.line)
1485 call popup_close(winid)
1486
1487 " not enough room above, popup goes below the cursor
1488 call cursor(3, 3)
1489 redraw
1490 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1491 redraw
1492 let pos = popup_getpos(winid)
1493 call assert_equal(4, pos.line)
1494 call popup_close(winid)
1495
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001496 " cursor in first line, popup in line 2
1497 call cursor(1, 1)
1498 redraw
1499 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1500 redraw
1501 let pos = popup_getpos(winid)
1502 call assert_equal(2, pos.line)
1503 call popup_close(winid)
1504
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001505 bwipe!
1506endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001507
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001508func Test_popup_atcursor_pos()
1509 CheckScreendump
Dominique Pellec60e9592021-07-03 21:41:38 +02001510 CheckFeature conceal
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001511
1512 let lines =<< trim END
1513 call setline(1, repeat([repeat('-', 60)], 15))
1514 set so=0
1515
1516 normal 9G3|r#
1517 let winid1 = popup_atcursor(['first', 'second'], #{
1518 \ moved: [0, 0, 0],
1519 \ })
1520 normal 9G21|r&
1521 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1522 \ pos: 'botright',
1523 \ moved: [0, 0, 0],
1524 \ })
1525 normal 3G27|r%
1526 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1527 \ pos: 'topleft',
1528 \ moved: [0, 0, 0],
1529 \ })
1530 normal 3G45|r@
1531 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1532 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001533 \ moved: range(3),
1534 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001535 \ })
Bram Moolenaarea042672021-06-29 20:22:32 +02001536
1537 normal 9G27|Rconcealed X
1538 syn match Hidden /concealed/ conceal
1539 set conceallevel=2 concealcursor=n
1540 redraw
1541 normal 0fX
1542 call popup_atcursor('mark', {})
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001543 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001544 call writefile(lines, 'XtestPopupAtcursorPos', 'D')
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001545 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1546 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1547
1548 " clean up
1549 call StopVimInTerminal(buf)
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001550endfunc
1551
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001552func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001553 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001554 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001555
1556 let lines =<< trim END
1557 call setline(1, range(1, 20))
1558 call setline(5, 'here is some text to hover over')
1559 set balloonevalterm
1560 set balloonexpr=BalloonExpr()
1561 set balloondelay=100
1562 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001563 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001564 return ''
1565 endfunc
1566 func Hover()
1567 call test_setmouse(5, 15)
1568 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1569 sleep 100m
1570 endfunc
1571 func MoveOntoPopup()
1572 call test_setmouse(4, 17)
1573 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1574 endfunc
1575 func MoveAway()
1576 call test_setmouse(5, 13)
1577 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1578 endfunc
1579 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001580 call writefile(lines, 'XtestPopupBeval', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001581 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001582 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001583 call term_sendkeys(buf, 'j')
1584 call term_sendkeys(buf, ":call Hover()\<CR>")
1585 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1586
1587 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1588 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1589
1590 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1591 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1592
1593 " clean up
1594 call StopVimInTerminal(buf)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001595endfunc
1596
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001597func Test_popup_filter()
1598 new
1599 call setline(1, 'some text')
1600
1601 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001602 if a:c == 'e' || a:c == "\<F9>"
1603 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001604 return 1
1605 endif
1606 if a:c == '0'
1607 let g:ignored = '0'
1608 return 0
1609 endif
1610 if a:c == 'x'
1611 call popup_close(a:winid)
1612 return 1
1613 endif
1614 return 0
1615 endfunc
1616
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001617 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001618 redraw
1619
1620 " e is consumed by the filter
Bram Moolenaar999db232021-07-04 14:00:55 +02001621 let g:eaten = ''
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001622 call feedkeys('e', 'xt')
1623 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001624 call feedkeys("\<F9>", 'xt')
1625 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001626
1627 " 0 is ignored by the filter
Bram Moolenaar999db232021-07-04 14:00:55 +02001628 let g:ignored = ''
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001629 normal $
1630 call assert_equal(9, getcurpos()[2])
1631 call feedkeys('0', 'xt')
1632 call assert_equal('0', g:ignored)
Bram Moolenaar999db232021-07-04 14:00:55 +02001633
1634 if has('win32') && has('gui_running')
1635 echo "FIXME: this check is very flaky on MS-Windows GUI, the cursor doesn't move"
1636 else
1637 call assert_equal(1, getcurpos()[2])
1638 endif
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001639
1640 " x closes the popup
1641 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001642 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001643 call assert_equal(-1, winbufnr(winid))
1644
Bram Moolenaar999db232021-07-04 14:00:55 +02001645 unlet g:eaten
1646 unlet g:ignored
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001647 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001648 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001649endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001650
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001651" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001652func Test_popup_filter_normal_cmd()
1653 CheckScreendump
1654
1655 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001656 let text = range(1, 20)->map({_, v -> string(v)})
1657 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1658 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001659 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001660 call writefile(lines, 'XtestPopupNormal', 'D')
Bram Moolenaar189832b2020-09-23 12:29:11 +02001661 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1662 call TermWait(buf, 100)
1663 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1664
1665 call StopVimInTerminal(buf)
Bram Moolenaar189832b2020-09-23 12:29:11 +02001666endfunc
1667
Bram Moolenaar10476522020-09-24 22:57:31 +02001668" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001669func Test_popup_filter_win_execute()
1670 CheckScreendump
1671
1672 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001673 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1674 let g:id = popup_create(lines, #{
1675 \ minheight: &lines - 5,
1676 \ maxheight: &lines - 5,
1677 \ cursorline: 1,
1678 \ })
1679 redraw
1680 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001681 call writefile(lines, 'XtestPopupWinExecute', 'D')
Bram Moolenaar10476522020-09-24 22:57:31 +02001682 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1683
1684 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1685 call term_sendkeys(buf, ":\<CR>")
1686
1687 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1688
1689 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001690endfunc
1691
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001692func Test_popup_set_firstline()
1693 CheckScreendump
1694
1695 let lines =<< trim END
1696 let lines = range(1, 50)->map({_, v -> string(v)})
1697 let g:id = popup_create(lines, #{
1698 \ minwidth: 20,
1699 \ maxwidth: 20,
1700 \ minheight: &lines - 5,
1701 \ maxheight: &lines - 5,
1702 \ cursorline: 1,
1703 \ })
1704 call popup_setoptions(g:id, #{firstline: 10})
1705 redraw
1706 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001707 call writefile(lines, 'XtestPopupWinSetFirstline', 'D')
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001708 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1709
1710 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1711
1712 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1713 call term_sendkeys(buf, ":\<CR>")
1714 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1715
1716 call StopVimInTerminal(buf)
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001717endfunc
1718
Bram Moolenaar10476522020-09-24 22:57:31 +02001719" this tests that we don't get stuck with an error in "win_execute()"
1720func Test_popup_filter_win_execute_error()
1721 CheckScreendump
1722
1723 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001724 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1725 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1726 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001727 call writefile(lines, 'XtestPopupWinExecuteError', 'D')
Bram Moolenaar10476522020-09-24 22:57:31 +02001728 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001729
1730 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1731 call term_sendkeys(buf, "\<CR>")
1732 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1733 call term_sendkeys(buf, "\<CR>")
1734 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1735 call term_sendkeys(buf, "\<CR>")
1736 call term_sendkeys(buf, "\<CR>")
1737 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1738
1739 call StopVimInTerminal(buf)
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001740endfunc
1741
Bram Moolenaara42d9452019-06-15 21:46:30 +02001742func ShowDialog(key, result)
1743 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001744 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001745 \ filter: 'popup_filter_yesno',
1746 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001747 \ })
1748 redraw
1749 call feedkeys(a:key, "xt")
1750 call assert_equal(winid, s:cb_winid)
1751 call assert_equal(a:result, s:cb_res)
1752endfunc
1753
1754func Test_popup_dialog()
1755 func QuitCallback(id, res)
1756 let s:cb_winid = a:id
1757 let s:cb_res = a:res
1758 endfunc
1759
1760 let winid = ShowDialog("y", 1)
1761 let winid = ShowDialog("Y", 1)
1762 let winid = ShowDialog("n", 0)
1763 let winid = ShowDialog("N", 0)
1764 let winid = ShowDialog("x", 0)
1765 let winid = ShowDialog("X", 0)
1766 let winid = ShowDialog("\<Esc>", 0)
1767 let winid = ShowDialog("\<C-C>", -1)
1768
1769 delfunc QuitCallback
1770endfunc
1771
Bram Moolenaara730e552019-06-16 19:05:31 +02001772func ShowMenu(key, result)
1773 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001774 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001775 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001776 \ })
1777 redraw
1778 call feedkeys(a:key, "xt")
1779 call assert_equal(winid, s:cb_winid)
1780 call assert_equal(a:result, s:cb_res)
1781endfunc
1782
1783func Test_popup_menu()
1784 func QuitCallback(id, res)
1785 let s:cb_winid = a:id
1786 let s:cb_res = a:res
1787 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001788 " mapping won't be used in popup
1789 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001790
1791 let winid = ShowMenu(" ", 1)
1792 let winid = ShowMenu("j \<CR>", 2)
1793 let winid = ShowMenu("JjK \<CR>", 2)
1794 let winid = ShowMenu("jjjjjj ", 3)
1795 let winid = ShowMenu("kkk ", 1)
1796 let winid = ShowMenu("x", -1)
1797 let winid = ShowMenu("X", -1)
1798 let winid = ShowMenu("\<Esc>", -1)
1799 let winid = ShowMenu("\<C-C>", -1)
1800
1801 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001802 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001803endfunc
1804
1805func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001806 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001807
1808 let lines =<< trim END
1809 call setline(1, range(1, 20))
1810 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001811 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001812 func MenuDone(id, res)
1813 echomsg "selected " .. a:res
1814 endfunc
1815 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001816 call writefile(lines, 'XtestPopupMenu', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001817 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001818 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1819
1820 call term_sendkeys(buf, "jj")
1821 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1822
1823 call term_sendkeys(buf, " ")
1824 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1825
1826 " clean up
1827 call StopVimInTerminal(buf)
Bram Moolenaara730e552019-06-16 19:05:31 +02001828endfunc
1829
Bram Moolenaarf914a332019-07-20 15:09:56 +02001830func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001831 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001832
1833 let lines =<< trim END
1834 call setline(1, range(1, 20))
1835 hi PopupSelected ctermbg=green
1836 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1837 func MenuDone(id, res)
1838 echomsg "selected " .. a:res
1839 endfunc
1840 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001841 call writefile(lines, 'XtestPopupNarrowMenu', 'D')
Bram Moolenaarf914a332019-07-20 15:09:56 +02001842 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1843 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1844
1845 " clean up
1846 call term_sendkeys(buf, "x")
1847 call StopVimInTerminal(buf)
Bram Moolenaarf914a332019-07-20 15:09:56 +02001848endfunc
1849
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001850func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001851 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001852
1853 " Create a popup without title or border, a line of padding will be added to
1854 " put the title on.
1855 let lines =<< trim END
1856 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001857 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001858 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001859 call writefile(lines, 'XtestPopupTitle', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001860 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001861 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1862
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001863 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1864 call term_sendkeys(buf, ":\<CR>")
1865 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1866
1867 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1868 call term_sendkeys(buf, ":\<CR>")
1869 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1870
Bram Moolenaar3ae50c72020-12-12 18:18:06 +01001871 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1872 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, padding: [2, 2, 2, 2]})\<CR>")
1873 call term_sendkeys(buf, ":\<CR>")
1874 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_3', {})
1875
1876 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1877 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, border: [], padding: [2, 2, 2, 2]})\<CR>")
1878 call term_sendkeys(buf, ":\<CR>")
1879 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_4', {})
1880
Ralf Schandlbc869872021-05-28 14:12:14 +02001881 call term_sendkeys(buf, ":call popup_clear()\<CR>")
rbtnnc6119412021-08-07 13:08:45 +02001882 call term_sendkeys(buf, ":call popup_menu(['This is a line', 'and another line'], #{title: '▶Äあいうえお◀', })\<CR>")
Ralf Schandlbc869872021-05-28 14:12:14 +02001883 call VerifyScreenDump(buf, 'Test_popupwin_multibytetitle', {})
1884 call term_sendkeys(buf, "x")
1885
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001886 " clean up
1887 call StopVimInTerminal(buf)
Bram Moolenaarae943152019-06-16 22:54:14 +02001888
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001889 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001890 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001891 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001892 call assert_equal('Another Title', popup_getoptions(winid).title)
1893
1894 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001895endfunc
1896
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001897func Test_popup_close_callback()
1898 func PopupDone(id, result)
1899 let g:result = a:result
1900 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001901 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001902 redraw
1903 call popup_close(winid, 'done')
1904 call assert_equal('done', g:result)
1905endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001906
1907func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001908 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001909 redraw
1910 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001911 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001912 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001913 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001914
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001915 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001916 redraw
1917 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001918 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001919 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001920 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001921endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001922
1923func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001924 CheckScreendump
1925
Bram Moolenaar988c4332019-06-02 14:12:11 +02001926 " +-----------------------------+
1927 " | | |
1928 " | | |
1929 " | | |
1930 " | line1 |
1931 " |------------line2------------|
1932 " | line3 |
1933 " | line4 |
1934 " | |
1935 " | |
1936 " +-----------------------------+
1937 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001938 split
1939 vsplit
1940 let info_window1 = getwininfo()[0]
1941 let line = info_window1['height']
1942 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001943 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001944 \ line : line,
1945 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001946 \ })
1947 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01001948 call writefile(lines, 'XtestPopupBehind', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001949 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001950 call term_sendkeys(buf, "\<C-W>w")
1951 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1952
1953 " clean up
1954 call StopVimInTerminal(buf)
Bram Moolenaar988c4332019-06-02 14:12:11 +02001955endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001956
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001957func s:VerifyPosition(p, msg, line, col, width, height)
1958 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1959 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1960 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1961 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001962endfunc
1963
1964func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001965 " Anything placed past the last cell on the right of the screen is moved to
1966 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001967 "
1968 " When wrapping is disabled, we also shift to the left to display on the
1969 " screen, unless fixed is set.
1970
1971 " Entries for cases which don't vary based on wrapping.
1972 " Format is per tests described below
1973 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001974 \ ['a', 5, &columns, 5, &columns, 1, 1],
1975 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1976 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001977 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001978 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001979
1980 " these test groups are dicts with:
1981 " - comment: something to identify the group of tests by
1982 " - options: dict of options to merge with the row/col in tests
1983 " - tests: list of cases. Each one is a list with elements:
1984 " - text
1985 " - row
1986 " - col
1987 " - expected row
1988 " - expected col
1989 " - expected width
1990 " - expected height
1991 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001992 \ #{
1993 \ comment: 'left-aligned with wrapping',
1994 \ options: #{
1995 \ wrap: 1,
1996 \ pos: 'botleft',
1997 \ },
1998 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001999 \ ['aa', 5, &columns, 4, &columns, 1, 2],
2000 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
2001 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2002 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
2003 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
2004 \
2005 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
2006 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
2007 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
2008 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2009 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2010 \
2011 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
2012 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
2013 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002014 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
2015 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002016 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002017 \ ],
2018 \ },
2019 \ #{
2020 \ comment: 'left aligned without wrapping',
2021 \ options: #{
2022 \ wrap: 0,
2023 \ pos: 'botleft',
2024 \ },
2025 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002026 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
2027 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
2028 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2029 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
2030 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
2031 \
2032 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
2033 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
2034 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
2035 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2036 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2037 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002038 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
2039 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
2040 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
2041 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
2042 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2043 \ ],
2044 \ },
2045 \ #{
2046 \ comment: 'left aligned with fixed position',
2047 \ options: #{
2048 \ wrap: 0,
2049 \ fixed: 1,
2050 \ pos: 'botleft',
2051 \ },
2052 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002053 \ ['aa', 5, &columns, 5, &columns, 1, 1],
2054 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
2055 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2056 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
2057 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
2058 \
2059 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
2060 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
2061 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2062 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2063 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2064 \
2065 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
2066 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
2067 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002068 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2069 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2070 \ ],
2071 \ },
2072 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002073
2074 for test_group in tests
2075 for test in test_group.tests
2076 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002077 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002078 \ line: line,
2079 \ col: col,
2080 \ }
2081 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002082
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002083 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002084
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002085 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002086 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
2087 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002088 endfor
2089 endfor
2090
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002091 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002092 %bwipe!
2093endfunc
2094
Bram Moolenaar3397f742019-06-02 18:40:06 +02002095func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002096 " width of screen
2097 let X = join(map(range(&columns), {->'X'}), '')
2098
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002099 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2100 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002101
2102 redraw
2103 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2104 call assert_equal(X, line)
2105
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002106 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002107 redraw
2108
2109 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002110 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
2111 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002112
2113 redraw
2114 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2115 call assert_equal(X, line)
2116
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002117 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002118 redraw
2119
2120 " Extend so > window width
2121 let X .= 'x'
2122
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002123 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2124 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002125
2126 redraw
2127 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2128 call assert_equal(X[ : -2 ], line)
2129
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002130 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002131 redraw
2132
2133 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002134 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2135 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002136
2137 redraw
2138 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2139 call assert_equal(X[ : -2 ], line)
2140
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002141 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002142 redraw
2143
2144 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002145 let p = popup_create(X,
2146 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2147 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002148
2149 redraw
2150 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2151 let e_line = ' ' . X[ 1 : -2 ]
2152 call assert_equal(e_line, line)
2153
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002154 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002155 redraw
2156
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002157 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002158 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002159endfunc
2160
2161func Test_popup_moved()
2162 new
2163 call test_override('char_avail', 1)
2164 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2165
2166 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002167 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002168 redraw
2169 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002170 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002171 " trigger the check for last_cursormoved by going into insert mode
2172 call feedkeys("li\<Esc>", 'xt')
2173 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002174 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002175
2176 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002177 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002178 redraw
2179 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002180 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002181 call feedkeys("hi\<Esc>", 'xt')
2182 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002183 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002184
2185 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002186 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002187 redraw
2188 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002189 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002190 call feedkeys("li\<Esc>", 'xt')
2191 call assert_equal(1, popup_getpos(winid).visible)
2192 call feedkeys("ei\<Esc>", 'xt')
2193 call assert_equal(1, popup_getpos(winid).visible)
2194 call feedkeys("eli\<Esc>", 'xt')
2195 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002196 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002197
Bram Moolenaar17627312019-06-02 19:53:44 +02002198 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002199 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002200 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002201 redraw
2202 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002203 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002204 call feedkeys("eli\<Esc>", 'xt')
2205 call assert_equal(1, popup_getpos(winid).visible)
2206 call feedkeys("wi\<Esc>", 'xt')
2207 call assert_equal(1, popup_getpos(winid).visible)
2208 call feedkeys("Eli\<Esc>", 'xt')
2209 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002210 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002211
2212 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002213 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002214 redraw
2215 call assert_equal(1, popup_getpos(winid).visible)
2216 call feedkeys("eli\<Esc>", 'xt')
2217 call feedkeys("ei\<Esc>", 'xt')
2218 call assert_equal(1, popup_getpos(winid).visible)
2219 call feedkeys("eli\<Esc>", 'xt')
2220 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002221 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002222
2223 bwipe!
2224 call test_override('ALL', 0)
2225endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002226
2227func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002228 CheckFeature timers
2229 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002230
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002231 let lines =<< trim END
2232 call setline(1, range(1, 20))
2233 hi Notification ctermbg=lightblue
2234 call popup_notification('first notification', {})
2235 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002236 call writefile(lines, 'XtestNotifications', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002237 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002238 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2239
2240 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002241 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2242 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002243 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2244
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002245 " clean up
2246 call StopVimInTerminal(buf)
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002247endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002248
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002249func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002250 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002251
2252 let lines =<< trim END
2253 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002254 hi ScrollThumb ctermbg=blue
2255 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002256 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002257 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002258 \ minwidth: 8,
2259 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002260 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002261 func ScrollUp()
2262 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2263 endfunc
2264 func ScrollDown()
2265 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2266 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002267 func ClickTop()
2268 call feedkeys("\<F4>\<LeftMouse>", "xt")
2269 endfunc
2270 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002271 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002272 call feedkeys("\<F5>\<LeftMouse>", "xt")
2273 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002274 func Popup_filter(winid, key)
2275 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002276 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002277 let line = popup_getoptions(a:winid).firstline
2278 let nlines = line('$', a:winid)
2279 let newline = line < nlines ? (line + 1) : nlines
2280 call popup_setoptions(a:winid, #{firstline: newline})
2281 return v:true
2282 elseif a:key == 'x'
2283 call popup_close(a:winid)
2284 return v:true
2285 endif
2286 endfunc
2287
Bram Moolenaarfc376e02022-05-29 18:18:18 +01002288 def CreatePopup(text: list<string>): number
2289 return popup_create(text, {
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002290 \ minwidth: 30,
2291 \ maxwidth: 30,
2292 \ minheight: 4,
2293 \ maxheight: 4,
2294 \ firstline: 1,
2295 \ lastline: 4,
2296 \ wrap: true,
2297 \ scrollbar: true,
2298 \ mapping: false,
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002299 \ filter: g:Popup_filter,
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002300 \ })
2301 enddef
2302
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002303 func PopupScroll()
2304 call popup_clear()
2305 let text =<< trim END
2306 1
2307 2
2308 3
2309 4
2310 long line long line long line long line long line long line
2311 long line long line long line long line long line long line
2312 long line long line long line long line long line long line
2313 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002314 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002315 endfunc
Bram Moolenaarfc376e02022-05-29 18:18:18 +01002316 func ScrollBottom()
2317 call popup_clear()
Bram Moolenaar89b25582022-05-30 13:20:56 +01002318 let id = CreatePopup(range(100)->map({k, v -> string(v)}))
2319 call popup_setoptions(id, #{firstline: 100, minheight: 9, maxheight: 9})
Bram Moolenaarfc376e02022-05-29 18:18:18 +01002320 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002321 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002322 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2323 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002324 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002325 call writefile(lines, 'XtestPopupScroll', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002326 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002327 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2328
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002329 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002330 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002331 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2332
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002333 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002334 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002335 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2336
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002337 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002338 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002339 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2340
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002341 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002342 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002343 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2344 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2345
2346 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2347 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2348
2349 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002350 " wait a bit, otherwise it fails sometimes (double click recognized?)
2351 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002352 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2353 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2354
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002355 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2356 sleep 100m
2357 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2358 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2359
2360 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2361 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2362
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002363 " remove the minwidth and maxheight
2364 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002365 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002366 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2367
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002368 " check size with non-wrapping lines
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002369 call term_sendkeys(buf, ":call g:PopupScroll()\<CR>")
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002370 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2371
2372 " check size with wrapping lines
2373 call term_sendkeys(buf, "j")
2374 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002375
Bram Moolenaarfc376e02022-05-29 18:18:18 +01002376 " check thumb when scrolled all the way down
2377 call term_sendkeys(buf, ":call ScrollBottom()\<CR>")
2378 call VerifyScreenDump(buf, 'Test_popupwin_scroll_13', {})
2379
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002380 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002381 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002382 call StopVimInTerminal(buf)
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002383endfunc
2384
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002385func Test_popup_too_high_scrollbar()
2386 CheckScreendump
2387
2388 let lines =<< trim END
2389 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2390 set scrolloff=0
2391 func ShowPopup()
2392 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2393 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2394 \ minwidth: 8,
2395 \ border: [],
2396 \ })
2397 endfunc
2398 normal 3G$
2399 call ShowPopup()
2400 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002401 call writefile(lines, 'XtestPopupToohigh', 'D')
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002402 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2403 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2404
2405 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2406 call term_sendkeys(buf, "8G$")
2407 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2408 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2409
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002410 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2411 call term_sendkeys(buf, "gg$")
2412 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2413 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2414
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002415 " clean up
2416 call StopVimInTerminal(buf)
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002417endfunc
2418
Bram Moolenaar437a7462019-07-05 20:17:22 +02002419func Test_popup_fitting_scrollbar()
2420 " this was causing a crash, divide by zero
2421 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002422 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002423 \ scrollbar: 1,
2424 \ maxwidth: 10,
2425 \ maxheight: 5,
2426 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002427 redraw
2428 call popup_clear()
2429endfunc
2430
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002431func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002432 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002433
2434 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002435 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002436 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002437 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002438 END
2439
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002440 call writefile(lines, 'XtestPopupSetText', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002441 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002442 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2443
2444 " Setting to empty string clears it
2445 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2446 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2447
2448 " Setting a list
2449 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2450 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2451
2452 " Shrinking with a list
2453 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2454 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2455
2456 " Growing with a list
2457 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2458 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2459
2460 " Empty list clears
2461 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2462 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2463
2464 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002465 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002466 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2467
Bram Moolenaarb0992022020-01-30 14:55:42 +01002468 " range() (doesn't work)
2469 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2470 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2471
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002472 " clean up
2473 call StopVimInTerminal(buf)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002474endfunc
2475
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002476func Test_popup_settext_getline()
2477 let id = popup_create('', #{ tabpage: 0 })
2478 call popup_settext(id, ['a','b'])
2479 call assert_equal(2, line('$', id)) " OK :)
2480 call popup_close(id)
2481
2482 let id = popup_create('', #{ tabpage: -1 })
2483 call popup_settext(id, ['a','b'])
2484 call assert_equal(2, line('$', id)) " Fails :(
2485 call popup_close(id)
2486endfunc
2487
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002488func Test_popup_settext_null()
2489 let id = popup_create('', #{ tabpage: 0 })
2490 call popup_settext(id, test_null_list())
2491 call popup_close(id)
2492
2493 let id = popup_create('', #{ tabpage: 0 })
2494 call popup_settext(id, test_null_string())
2495 call popup_close(id)
2496endfunc
2497
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002498func Test_popup_hidden()
2499 new
2500
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002501 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002502 redraw
2503 call assert_equal(0, popup_getpos(winid).visible)
2504 call popup_close(winid)
2505
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002506 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002507 redraw
2508 call assert_equal(0, popup_getpos(winid).visible)
2509 call popup_close(winid)
2510
2511 func QuitCallback(id, res)
2512 let s:cb_winid = a:id
2513 let s:cb_res = a:res
2514 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002515 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002516 \ filter: 'popup_filter_yesno',
2517 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002518 \ })
2519 redraw
2520 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002521 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2522 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002523 exe "normal anot used by filter\<Esc>"
2524 call assert_equal('not used by filter', getline(1))
2525
2526 call popup_show(winid)
2527 call feedkeys('y', "xt")
2528 call assert_equal(1, s:cb_res)
2529
2530 bwipe!
2531 delfunc QuitCallback
2532endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002533
2534" Test options not checked elsewhere
2535func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002536 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002537 let options = popup_getoptions(winid)
2538 call assert_equal(1, options.wrap)
2539 call assert_equal(0, options.drag)
2540 call assert_equal('Beautiful', options.highlight)
2541
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002542 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002543 let options = popup_getoptions(winid)
2544 call assert_equal(0, options.wrap)
2545 call assert_equal(1, options.drag)
2546 call assert_equal('Another', options.highlight)
2547
Yegappan Lakshmanan04c4c572022-08-30 19:48:24 +01002548 call assert_fails('call popup_setoptions(winid, [])', 'E1206:')
2549 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E1297:')
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002550
Bram Moolenaarae943152019-06-16 22:54:14 +02002551 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002552 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002553endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002554
2555func Test_popupwin_garbage_collect()
2556 func MyPopupFilter(x, winid, c)
2557 " NOP
2558 endfunc
2559
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002560 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002561 call test_garbagecollect_now()
2562 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002563 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002564 call feedkeys('j', 'xt')
2565 call assert_true(v:true)
2566
2567 call popup_close(winid)
2568 delfunc MyPopupFilter
2569endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002570
Bram Moolenaar581ba392019-09-03 22:08:33 +02002571func Test_popupwin_filter_mode()
2572 func MyPopupFilter(winid, c)
2573 let s:typed = a:c
2574 if a:c == ':' || a:c == "\r" || a:c == 'v'
2575 " can start cmdline mode, get out, and start/stop Visual mode
2576 return 0
2577 endif
2578 return 1
2579 endfunc
2580
2581 " Normal, Visual and Insert mode
2582 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2583 redraw
2584 call feedkeys('x', 'xt')
2585 call assert_equal('x', s:typed)
2586
2587 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2588 call assert_equal(':', s:typed)
2589 call assert_equal('foo', g:foo)
2590
2591 let @x = 'something'
2592 call feedkeys('v$"xy', 'xt')
2593 call assert_equal('y', s:typed)
2594 call assert_equal('something', @x) " yank command is filtered out
2595 call feedkeys('v', 'xt') " end Visual mode
2596
2597 call popup_close(winid)
2598
2599 " only Normal mode
2600 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2601 redraw
2602 call feedkeys('x', 'xt')
2603 call assert_equal('x', s:typed)
2604
2605 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2606 call assert_equal(':', s:typed)
2607 call assert_equal('foo', g:foo)
2608
2609 let @x = 'something'
2610 call feedkeys('v$"xy', 'xt')
2611 call assert_equal('v', s:typed)
2612 call assert_notequal('something', @x)
2613
2614 call popup_close(winid)
2615
2616 " default: all modes
2617 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2618 redraw
2619 call feedkeys('x', 'xt')
2620 call assert_equal('x', s:typed)
2621
2622 let g:foo = 'bar'
2623 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2624 call assert_equal("\r", s:typed)
2625 call assert_equal('bar', g:foo)
2626
2627 let @x = 'something'
2628 call feedkeys('v$"xy', 'xt')
2629 call assert_equal('y', s:typed)
2630 call assert_equal('something', @x) " yank command is filtered out
2631 call feedkeys('v', 'xt') " end Visual mode
2632
2633 call popup_close(winid)
2634 delfunc MyPopupFilter
2635endfunc
2636
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002637func Test_popupwin_filter_mouse()
2638 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002639 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002640 return 0
2641 endfunc
2642
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002643 call setline(1, ['.'->repeat(25)]->repeat(10))
2644 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2645 \ line: 2,
2646 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002647 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002648 \ padding: [],
2649 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002650 \ filter: 'MyPopupFilter',
2651 \ })
2652 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002653 " 123456789012345678901
2654 " 1 .....................
2655 " 2 ...+--------------+..
2656 " 3 ...| |..
2657 " 4 ...| short |..
2658 " 5 ...| long line th |..
2659 " 6 ...| at will wrap |..
2660 " 7 ...| other |..
2661 " 8 ...| |..
2662 " 9 ...+--------------+..
2663 " 10 .....................
2664 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002665
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002666 func AddItemOutsidePopup(tests, row, col)
2667 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2668 \ screenrow: a:row, screencol: a:col,
2669 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2670 \ line: a:row, column: a:col,
2671 \ }})
2672 endfunc
2673 func AddItemInPopupBorder(tests, winid, row, col)
2674 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2675 \ screenrow: a:row, screencol: a:col,
2676 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2677 \ line: 0, column: 0,
2678 \ }})
2679 endfunc
2680 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2681 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2682 \ screenrow: a:row, screencol: a:col,
2683 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2684 \ line: a:textline, column: a:textcol,
2685 \ }})
2686 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002687
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002688 " above and below popup
2689 for c in range(1, 21)
2690 call AddItemOutsidePopup(tests, 1, c)
2691 call AddItemOutsidePopup(tests, 10, c)
2692 endfor
2693 " left and right of popup
2694 for r in range(1, 10)
2695 call AddItemOutsidePopup(tests, r, 3)
2696 call AddItemOutsidePopup(tests, r, 20)
2697 endfor
2698 " top and bottom in popup
2699 for c in range(4, 19)
2700 call AddItemInPopupBorder(tests, winid, 2, c)
2701 call AddItemInPopupBorder(tests, winid, 3, c)
2702 call AddItemInPopupBorder(tests, winid, 8, c)
2703 call AddItemInPopupBorder(tests, winid, 9, c)
2704 endfor
2705 " left and right margin in popup
2706 for r in range(2, 9)
2707 call AddItemInPopupBorder(tests, winid, r, 4)
2708 call AddItemInPopupBorder(tests, winid, r, 5)
2709 call AddItemInPopupBorder(tests, winid, r, 18)
2710 call AddItemInPopupBorder(tests, winid, r, 19)
2711 endfor
2712 " text "short"
2713 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2714 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2715 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2716 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2717 " text "long line th"
2718 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2719 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2720 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2721 " text "at will wrap"
2722 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2723 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2724 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2725 " text "other"
2726 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2727 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2728 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2729 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002730
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002731 for item in tests
2732 call test_setmouse(item.clickrow, item.clickcol)
2733 call feedkeys("\<LeftMouse>", 'xt')
2734 call assert_equal(item.result, g:got_mousepos)
2735 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002736
2737 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002738 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002739 delfunc MyPopupFilter
2740endfunc
2741
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002742func Test_popupwin_with_buffer()
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002743 call writefile(['some text', 'in a buffer'], 'XsomeFile', 'D')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002744 let buf = bufadd('XsomeFile')
2745 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002746
2747 setlocal number
2748 call setbufvar(buf, "&wrapmargin", 13)
2749
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002750 let winid = popup_create(buf, {})
2751 call assert_notequal(0, winid)
2752 let pos = popup_getpos(winid)
2753 call assert_equal(2, pos.height)
2754 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002755
2756 " window-local option is set to default, buffer-local is not
2757 call assert_equal(0, getwinvar(winid, '&number'))
2758 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2759
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002760 call popup_close(winid)
2761 call assert_equal({}, popup_getpos(winid))
2762 call assert_equal(1, bufloaded(buf))
2763 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002764 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002765
2766 edit test_popupwin.vim
2767 let winid = popup_create(bufnr(''), {})
2768 redraw
2769 call popup_close(winid)
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002770endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002771
Bram Moolenaar188639d2022-04-04 16:57:21 +01002772func Test_popupwin_buffer_with_swapfile()
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002773 call writefile(['some text', 'in a buffer'], 'XopenFile', 'D')
2774 call writefile([''], '.XopenFile.swp', 'D')
Bram Moolenaar188639d2022-04-04 16:57:21 +01002775 let g:ignoreSwapExists = 1
2776
2777 let bufnr = bufadd('XopenFile')
2778 call assert_equal(0, bufloaded(bufnr))
2779 let winid = popup_create(bufnr, {'hidden': 1})
2780 call assert_equal(1, bufloaded(bufnr))
2781 call popup_close(winid)
2782
2783 exe 'buffer ' .. bufnr
2784 call assert_equal(1, &readonly)
2785 bwipe!
2786
Bram Moolenaar188639d2022-04-04 16:57:21 +01002787 unlet g:ignoreSwapExists
2788endfunc
2789
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002790func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002791 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002792 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002793 " Starting a terminal to run a shell in is considered flaky.
2794 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002795
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002796 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002797
2798 " open help window to test that :help below fails
2799 help
2800
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002801 let termbuf = term_start(&shell, #{hidden: 1})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002802 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002803 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002804 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002805 " Wait for a prompt (see border char first, then space after prompt)
2806 call WaitForAssert({ -> assert_equal(' ', screenstring(screenrow(), screencol() - 1))})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002807
2808 " When typing a character, the cursor is after it.
2809 call feedkeys("x", 'xt')
Bram Moolenaar0353f562020-12-17 22:27:38 +01002810 call term_wait(termbuf)
Bram Moolenaarf5452692020-11-28 21:56:06 +01002811 redraw
2812 call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))})
2813 call feedkeys("\<BS>", 'xt')
2814
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002815 " Check this doesn't crash
2816 call assert_equal(winnr(), winnr('j'))
2817 call assert_equal(winnr(), winnr('k'))
2818 call assert_equal(winnr(), winnr('h'))
2819 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002820
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002821 " Cannot quit while job is running
2822 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002823
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002824 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002825 call feedkeys("xxx\<C-W>N", 'xt')
2826 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2827 call feedkeys("a\<C-U>", 'xt')
2828
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002829 " Cannot escape from terminal window
2830 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002831 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002832
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002833 " Cannot open a second one.
2834 let termbuf2 = term_start(&shell, #{hidden: 1})
2835 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2836 call term_sendkeys(termbuf2, "exit\<CR>")
2837
Bram Moolenaard28950f2022-05-29 14:13:04 +01002838 " Exiting shell puts popup window in Terminal-Normal mode.
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002839 call feedkeys("exit\<CR>", 'xt')
2840 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002841 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002842
Bram Moolenaar349f6092020-10-06 20:46:49 +02002843 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002844 call feedkeys(":quit\<CR>", 'xt')
2845 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002846endfunc
2847
Bram Moolenaar9e636b92022-05-29 22:37:05 +01002848func Test_popupwin_terminal_buffer_none()
2849 CheckFeature terminal
2850 CheckUnix
2851
2852 " Starting a terminal to run a shell in is considered flaky.
2853 let g:test_is_flaky = 1
2854
2855 let origwin = win_getid()
2856 call term_start("NONE", {"hidden": 1})->popup_create({"border": []})
2857 sleep 50m
2858
2859 " since no actual job is running can close the window with :quit
2860 call feedkeys("\<C-W>:q\<CR>", 'xt')
2861 call assert_equal([], popup_list())
2862
2863 call assert_equal(origwin, win_getid())
2864endfunc
2865
Bram Moolenaard28950f2022-05-29 14:13:04 +01002866func Test_popupwin_terminal_scrollbar()
2867 CheckFeature terminal
2868 CheckScreendump
2869 CheckUnix
2870
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002871 call writefile(range(50), 'Xtestfile', 'D')
Bram Moolenaard28950f2022-05-29 14:13:04 +01002872 let lines =<< trim END
2873 vim9script
2874
Bram Moolenaar10db31f2022-05-30 17:58:03 +01002875 # testing CTRL-W CTRL-W requires two windows
2876 split
2877
Bram Moolenaard28950f2022-05-29 14:13:04 +01002878 term_start(['cat', 'Xtestfile'], {hidden: true})
2879 ->popup_create({
2880 minwidth: 40,
2881 maxwidth: 40,
2882 minheight: 8,
2883 maxheight: 8,
2884 scrollbar: true,
2885 border: []
2886 })
2887 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01002888 call writefile(lines, 'Xpterm', 'D')
Bram Moolenaard28950f2022-05-29 14:13:04 +01002889 let buf = RunVimInTerminal('-S Xpterm', #{rows: 15})
2890 call VerifyScreenDump(buf, 'Test_popupwin_poptermscroll_1', {})
2891
2892 " scroll to the middle
2893 call term_sendkeys(buf, "50%")
2894 call VerifyScreenDump(buf, 'Test_popupwin_poptermscroll_2', {})
2895
Bram Moolenaar10db31f2022-05-30 17:58:03 +01002896 " get error if trying to escape the window
2897 call term_sendkeys(buf, "\<C-W>\<C-W>")
2898 call VerifyScreenDump(buf, 'Test_popupwin_poptermscroll_3', {})
2899
Bram Moolenaard28950f2022-05-29 14:13:04 +01002900 " close the popupwin.
2901 call term_sendkeys(buf, ":q\<CR>")
Bram Moolenaar10db31f2022-05-30 17:58:03 +01002902 call VerifyScreenDump(buf, 'Test_popupwin_poptermscroll_4', {})
Bram Moolenaard28950f2022-05-29 14:13:04 +01002903
2904 call StopVimInTerminal(buf)
Bram Moolenaard28950f2022-05-29 14:13:04 +01002905endfunc
2906
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002907func Test_popupwin_close_prevwin()
2908 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002909 call Popupwin_close_prevwin()
2910endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002911
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002912def Popupwin_close_prevwin()
2913 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002914 split
2915 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002916 assert_equal(2, winnr())
Bram Moolenaare0de1712020-12-02 17:36:54 +01002917 var buf = term_start(&shell, {hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002918 popup_create(buf, {})
Bram Moolenaar62aec932022-01-29 21:45:34 +00002919 g:TermWait(buf, 100)
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002920 popup_clear(true)
2921 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002922
2923 quit
2924 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002925enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002926
Bram Moolenaar934470e2019-09-01 23:27:05 +02002927func Test_popupwin_with_buffer_and_filter()
2928 new Xwithfilter
2929 call setline(1, range(100))
2930 let bufnr = bufnr()
2931 hide
2932
2933 func BufferFilter(win, key)
2934 if a:key == 'G'
2935 " recursive use of "G" does not cause problems.
2936 call win_execute(a:win, 'normal! G')
2937 return 1
2938 endif
2939 return 0
2940 endfunc
2941
2942 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2943 call assert_equal(1, popup_getpos(winid).firstline)
2944 redraw
2945 call feedkeys("G", 'xt')
2946 call assert_equal(99, popup_getpos(winid).firstline)
2947
2948 call popup_close(winid)
2949 exe 'bwipe! ' .. bufnr
2950endfunc
2951
Bram Moolenaare296e312019-07-03 23:20:18 +02002952func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002953 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002954 \ maxwidth: 40,
2955 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002956 \ })
2957 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002958 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002959 redraw
2960 call assert_equal(19, popup_getpos(winid).width)
2961 endfor
2962 call popup_clear()
2963endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002964
2965func Test_popupwin_buf_close()
2966 let buf = bufadd('Xtestbuf')
2967 call bufload(buf)
2968 call setbufline(buf, 1, ['just', 'some', 'lines'])
2969 let winid = popup_create(buf, {})
2970 redraw
2971 call assert_equal(3, popup_getpos(winid).height)
2972 let bufinfo = getbufinfo(buf)[0]
2973 call assert_equal(1, bufinfo.changed)
2974 call assert_equal(0, bufinfo.hidden)
2975 call assert_equal(0, bufinfo.listed)
2976 call assert_equal(1, bufinfo.loaded)
2977 call assert_equal([], bufinfo.windows)
2978 call assert_equal([winid], bufinfo.popups)
2979
2980 call popup_close(winid)
2981 call assert_equal({}, popup_getpos(winid))
2982 let bufinfo = getbufinfo(buf)[0]
2983 call assert_equal(1, bufinfo.changed)
2984 call assert_equal(1, bufinfo.hidden)
2985 call assert_equal(0, bufinfo.listed)
2986 call assert_equal(1, bufinfo.loaded)
2987 call assert_equal([], bufinfo.windows)
2988 call assert_equal([], bufinfo.popups)
2989 exe 'bwipe! ' .. buf
2990endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002991
2992func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002993 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002994
2995 let lines =<< trim END
2996 call setline(1, range(1, 10))
2997 hi ScrollThumb ctermbg=blue
2998 hi ScrollBar ctermbg=red
2999 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02003000 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02003001 \ maxwidth: 10,
3002 \ maxheight: 3,
3003 \ pos : 'topleft',
3004 \ col : a:col,
3005 \ line : a:line,
3006 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02003007 \ })
3008 endfunc
3009 call PopupMenu(['x'], 1, 1)
3010 call PopupMenu(['123456789|'], 1, 16)
3011 call PopupMenu(['123456789|' .. ' '], 7, 1)
3012 call PopupMenu([repeat('123456789|', 100)], 7, 16)
3013 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
3014 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003015 call writefile(lines, 'XtestPopupMenuMaxWidth', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02003016 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02003017 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
3018
3019 " close the menu popupwin.
3020 call term_sendkeys(buf, " ")
3021 call term_sendkeys(buf, " ")
3022 call term_sendkeys(buf, " ")
3023 call term_sendkeys(buf, " ")
3024 call term_sendkeys(buf, " ")
3025
3026 " clean up
3027 call StopVimInTerminal(buf)
Bram Moolenaar017c2692019-07-13 14:17:51 +02003028endfunc
3029
Bram Moolenaara901a372019-07-13 16:38:50 +02003030func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003031 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02003032
3033 let lines =<< trim END
3034 call setline(1, range(1, 20))
3035 hi ScrollThumb ctermbg=blue
3036 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003037 eval ['one', 'two', 'three', 'four', 'five',
3038 \ 'six', 'seven', 'eight', 'nine']
3039 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02003040 \ minwidth: 8,
3041 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02003042 \ })
3043 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003044 call writefile(lines, 'XtestPopupMenuScroll', 'D')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02003045 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02003046
3047 call term_sendkeys(buf, "j")
3048 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
3049
3050 call term_sendkeys(buf, "jjj")
3051 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
3052
3053 " if the cursor is the bottom line, it stays at the bottom line.
3054 call term_sendkeys(buf, repeat("j", 20))
3055 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
3056
3057 call term_sendkeys(buf, "kk")
3058 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
3059
3060 call term_sendkeys(buf, "k")
3061 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
3062
3063 " if the cursor is in the top line, it stays in the top line.
3064 call term_sendkeys(buf, repeat("k", 20))
3065 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
3066
3067 " close the menu popupwin.
3068 call term_sendkeys(buf, " ")
3069
3070 " clean up
3071 call StopVimInTerminal(buf)
Bram Moolenaara901a372019-07-13 16:38:50 +02003072endfunc
3073
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003074func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003075 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003076
3077 let lines =<< trim END
3078 function! MyFilter(winid, key) abort
3079 if a:key == "0"
3080 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
3081 return 1
3082 endif
3083 if a:key == "G"
3084 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
3085 return 1
3086 endif
3087 if a:key == "j"
3088 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
3089 return 1
3090 endif
3091 if a:key == "k"
3092 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
3093 return 1
3094 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02003095 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003096 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02003097 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003098 endif
3099 return 0
3100 endfunction
3101 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
3102 \ maxheight : 3,
3103 \ filter : 'MyFilter'
3104 \ })
3105 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003106 call writefile(lines, 'XtestPopupMenuFilter', 'D')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003107 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
3108
3109 call term_sendkeys(buf, "j")
3110 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
3111
3112 call term_sendkeys(buf, "k")
3113 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
3114
3115 call term_sendkeys(buf, "G")
3116 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
3117
3118 call term_sendkeys(buf, "0")
3119 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
3120
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02003121 " check that when the popup is closed in the filter the screen is redrawn
3122 call term_sendkeys(buf, ":")
3123 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
3124 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003125
3126 " clean up
3127 call StopVimInTerminal(buf)
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003128endfunc
3129
3130func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003131 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003132
3133 let winid = popup_create('some text', {})
3134 call assert_equal(0, popup_getoptions(winid).cursorline)
3135 call popup_close(winid)
3136
3137 let winid = popup_create('some text', #{ cursorline: 1, })
3138 call assert_equal(1, popup_getoptions(winid).cursorline)
3139 call popup_close(winid)
3140
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003141 let winid = popup_create('some text', #{ cursorline: v:true, })
3142 call assert_equal(1, popup_getoptions(winid).cursorline)
3143 call popup_close(winid)
3144
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003145 let winid = popup_create('some text', #{ cursorline: 0, })
3146 call assert_equal(0, popup_getoptions(winid).cursorline)
3147 call popup_close(winid)
3148
3149 let winid = popup_menu('some text', {})
3150 call assert_equal(1, popup_getoptions(winid).cursorline)
3151 call popup_close(winid)
3152
3153 let winid = popup_menu('some text', #{ cursorline: 1, })
3154 call assert_equal(1, popup_getoptions(winid).cursorline)
3155 call popup_close(winid)
3156
3157 let winid = popup_menu('some text', #{ cursorline: 0, })
3158 call assert_equal(0, popup_getoptions(winid).cursorline)
3159 call popup_close(winid)
3160
3161 " ---------
3162 " Pattern 1
3163 " ---------
3164 let lines =<< trim END
3165 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
3166 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003167 call writefile(lines, 'XtestPopupCursorLine', 'D')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003168 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3169 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
3170 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3171 call StopVimInTerminal(buf)
3172
3173 " ---------
3174 " Pattern 2
3175 " ---------
3176 let lines =<< trim END
3177 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
3178 END
3179 call writefile(lines, 'XtestPopupCursorLine')
3180 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3181 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
3182 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3183 call StopVimInTerminal(buf)
3184
3185 " ---------
3186 " Pattern 3
3187 " ---------
3188 let lines =<< trim END
3189 function! MyFilter(winid, key) abort
3190 if a:key == "j"
3191 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3192 return 1
3193 endif
3194 if a:key == 'x'
3195 call popup_close(a:winid)
3196 return 1
3197 endif
3198 return 0
3199 endfunction
3200 call popup_menu(['111', '222', '333'], #{
3201 \ cursorline : 0,
3202 \ maxheight : 2,
3203 \ filter : 'MyFilter',
3204 \ })
3205 END
3206 call writefile(lines, 'XtestPopupCursorLine')
3207 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3208 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3209 call term_sendkeys(buf, "j")
3210 call term_sendkeys(buf, "j")
3211 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3212 call term_sendkeys(buf, "x")
3213 call StopVimInTerminal(buf)
3214
3215 " ---------
3216 " Pattern 4
3217 " ---------
3218 let lines =<< trim END
3219 function! MyFilter(winid, key) abort
3220 if a:key == "j"
3221 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3222 return 1
3223 endif
3224 if a:key == 'x'
3225 call popup_close(a:winid)
3226 return 1
3227 endif
3228 return 0
3229 endfunction
3230 call popup_menu(['111', '222', '333'], #{
3231 \ cursorline : 1,
3232 \ maxheight : 2,
3233 \ filter : 'MyFilter',
3234 \ })
3235 END
3236 call writefile(lines, 'XtestPopupCursorLine')
3237 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3238 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3239 call term_sendkeys(buf, "j")
3240 call term_sendkeys(buf, "j")
3241 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3242 call term_sendkeys(buf, "x")
3243 call StopVimInTerminal(buf)
3244
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003245 " ---------
3246 " Cursor in second line when creating the popup
3247 " ---------
3248 let lines =<< trim END
3249 let winid = popup_create(['111', '222', '333'], #{
3250 \ cursorline : 1,
3251 \ })
3252 call win_execute(winid, "2")
3253 END
3254 call writefile(lines, 'XtestPopupCursorLine')
3255 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3256 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3257 call StopVimInTerminal(buf)
3258
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003259 " ---------
3260 " Use current buffer for popupmenu
3261 " ---------
3262 let lines =<< trim END
3263 call setline(1, ['one', 'two', 'three'])
3264 let winid = popup_create(bufnr('%'), #{
3265 \ cursorline : 1,
3266 \ })
3267 call win_execute(winid, "2")
3268 END
3269 call writefile(lines, 'XtestPopupCursorLine')
3270 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3271 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3272 call StopVimInTerminal(buf)
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003273endfunc
3274
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003275def Test_popup_cursorline_vim9()
3276 var winid = popup_create('some text', { cursorline: true, })
3277 assert_equal(1, popup_getoptions(winid).cursorline)
3278 popup_close(winid)
3279
3280 assert_fails("popup_create('some text', { cursorline: 2, })", 'E1023:')
3281 popup_clear()
3282enddef
3283
Bram Moolenaarf914a332019-07-20 15:09:56 +02003284func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003285 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003286 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003287
Bram Moolenaarf914a332019-07-20 15:09:56 +02003288 call writefile([
3289 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3290 \ "another\tXtagfile\t/^this is another",
3291 \ "theword\tXtagfile\t/^theword"],
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003292 \ 'Xtags', 'D')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003293 call writefile(range(1,20)
3294 \ + ['theword is here']
3295 \ + range(22, 27)
3296 \ + ['this is another place']
3297 \ + range(29, 40),
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003298 \ "Xtagfile", 'D')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003299 call writefile(range(1,10)
3300 \ + ['searched word is here']
3301 \ + range(12, 20),
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003302 \ "Xheader.h", 'D')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003303 let lines =<< trim END
3304 set tags=Xtags
3305 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003306 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003307 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003308 \ 'three',
3309 \ 'four',
3310 \ 'five',
3311 \ 'six',
3312 \ 'seven',
3313 \ 'find theword somewhere',
3314 \ 'nine',
3315 \ 'this is another word',
3316 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003317 set previewpopup=height:4,width:40
Bram Moolenaar60577482021-03-04 21:35:07 +01003318 hi OtherColor ctermbg=lightcyan guibg=lightcyan
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003319 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003320 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003321 call writefile(lines, 'XtestPreviewPopup', 'D')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003322 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3323
3324 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3325 call term_sendkeys(buf, ":\<CR>")
3326 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3327
Bram Moolenaar60577482021-03-04 21:35:07 +01003328 call term_sendkeys(buf, ":set previewpopup+=highlight:OtherColor\<CR>")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003329 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3330 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3331
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003332 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003333 call term_sendkeys(buf, ":\<CR>")
3334 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3335
3336 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3337 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3338
Bram Moolenaar799439a2020-02-11 21:44:17 +01003339 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003340 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003341 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003342
Bram Moolenaar60577482021-03-04 21:35:07 +01003343 call term_sendkeys(buf, ":set previewpopup-=highlight:OtherColor\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003344 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003345 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003346 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3347
3348 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3349 call term_sendkeys(buf, ":\<CR>")
3350 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3351
3352 call term_sendkeys(buf, ":pclose\<CR>")
3353 call term_sendkeys(buf, ":psearch searched\<CR>")
3354 call term_sendkeys(buf, ":\<CR>")
3355 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003356
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003357 call term_sendkeys(buf, "\<C-W>p")
3358 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3359
3360 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3361 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3362
Bram Moolenaarf914a332019-07-20 15:09:56 +02003363 call StopVimInTerminal(buf)
Bram Moolenaarf914a332019-07-20 15:09:56 +02003364endfunc
3365
Bram Moolenaar393f8d62022-10-02 14:28:30 +01003366func Test_previewpopup_pum()
3367 CheckScreendump
3368 CheckFeature quickfix
3369
3370 let lines =<< trim END
3371 let a = 3
3372 let b = 1
3373 echo a
3374 echo b
3375 call system('echo hello')
3376 " the end
3377 END
3378 call writefile(lines, 'XpreviewText.vim', 'D')
3379
3380 let lines =<< trim END
3381 call setline(1, ['one', 'two', 'three', 'other', 'once', 'only', 'off'])
3382 set previewpopup=height:6,width:40
3383 pedit XpreviewText.vim
3384 END
3385 call writefile(lines, 'XtestPreviewPum', 'D')
3386 let buf = RunVimInTerminal('-S XtestPreviewPum', #{rows: 12})
3387
3388 call term_sendkeys(buf, "A o\<C-N>")
3389 call VerifyScreenDump(buf, 'Test_pum_preview_1', {})
3390
3391 call term_sendkeys(buf, "\<C-N>")
3392 call VerifyScreenDump(buf, 'Test_pum_preview_2', {})
3393
3394 call term_sendkeys(buf, "\<C-N>")
3395 call VerifyScreenDump(buf, 'Test_pum_preview_3', {})
3396
3397 call term_sendkeys(buf, "\<C-N>")
3398 call VerifyScreenDump(buf, 'Test_pum_preview_4', {})
3399
3400 call term_sendkeys(buf, "\<Esc>")
3401 call StopVimInTerminal(buf)
3402endfunc
3403
3404
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003405func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003406 let lines =<< trim END
3407 set completeopt+=preview,popup
3408 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003409 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003410
3411 func CompleteFuncDict(findstart, base)
3412 if a:findstart
3413 if col('.') > 10
3414 return col('.') - 10
3415 endif
3416 return 0
3417 endif
3418
3419 return {
3420 \ 'words': [
3421 \ {
3422 \ 'word': 'aword',
3423 \ 'abbr': 'wrd',
3424 \ 'menu': 'extra text',
3425 \ 'info': 'words are cool',
3426 \ 'kind': 'W',
3427 \ 'user_data': 'test'
3428 \ },
3429 \ {
3430 \ 'word': 'anotherword',
3431 \ 'abbr': 'anotwrd',
3432 \ 'menu': 'extra text',
3433 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3434 \ 'kind': 'W',
3435 \ 'user_data': 'notest'
3436 \ },
3437 \ {
3438 \ 'word': 'noinfo',
3439 \ 'abbr': 'noawrd',
3440 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003441 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003442 \ 'kind': 'W',
3443 \ 'user_data': 'notest'
3444 \ },
3445 \ {
3446 \ 'word': 'thatword',
3447 \ 'abbr': 'thatwrd',
3448 \ 'menu': 'extra text',
3449 \ 'info': 'that word is cool',
3450 \ 'kind': 'W',
3451 \ 'user_data': 'notest'
3452 \ },
3453 \ ]
3454 \ }
3455 endfunc
3456 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003457 func ChangeColor()
3458 let id = popup_findinfo()
Bram Moolenaard356fc62020-12-09 18:13:44 +01003459 if buflisted(winbufnr(id))
3460 call setline(1, 'buffer is listed')
3461 endif
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003462 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003463 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003464
3465 func InfoHidden()
3466 set completepopup=height:4,border:off,align:menu
3467 set completeopt-=popup completeopt+=popuphidden
3468 au CompleteChanged * call HandleChange()
3469 endfunc
3470
3471 let s:counter = 0
3472 func HandleChange()
3473 let s:counter += 1
3474 let selected = complete_info(['selected']).selected
3475 if selected <= 0
3476 " First time: do nothing, info remains hidden
3477 return
3478 endif
3479 if selected == 1
3480 " Second time: show info right away
3481 let id = popup_findinfo()
3482 if id
3483 call popup_settext(id, 'immediate info ' .. s:counter)
3484 call popup_show(id)
3485 endif
3486 else
3487 " Third time: show info after a short delay
3488 call timer_start(100, 'ShowInfo')
3489 endif
3490 endfunc
3491
3492 func ShowInfo(...)
3493 let id = popup_findinfo()
3494 if id
3495 call popup_settext(id, 'async info ' .. s:counter)
3496 call popup_show(id)
3497 endif
3498 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003499
Bakudankun65555002021-11-17 20:40:16 +00003500 func OpenOtherPopups()
3501 call popup_create([
3502 \ 'popup below',
3503 \ 'popup below',
3504 \ 'popup below',
3505 \ 'popup below',
3506 \ ], #{
3507 \ line: 'cursor',
3508 \ col: 'cursor+3',
3509 \ highlight: 'ErrorMsg',
3510 \ minwidth: 17,
3511 \ zindex: 50,
3512 \ })
3513 call popup_create([
3514 \ 'popup on top',
3515 \ 'popup on top',
3516 \ 'popup on top',
3517 \ ], #{
3518 \ line: 'cursor+3',
3519 \ col: 'cursor-10',
3520 \ highlight: 'Search',
3521 \ minwidth: 10,
3522 \ zindex: 200,
3523 \ })
3524 endfunc
3525
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003526 " Check that no autocommands are triggered for the info popup
3527 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3528 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003529 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003530 return lines
3531endfunc
3532
3533func Test_popupmenu_info_border()
3534 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003535 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003536
3537 let lines = Get_popupmenu_lines()
3538 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003539 call writefile(lines, 'XtestInfoPopup', 'D')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003540
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003541 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003542 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003543
3544 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3545 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3546
3547 call term_sendkeys(buf, "\<C-N>")
3548 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3549
3550 call term_sendkeys(buf, "\<C-N>")
3551 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3552
3553 call term_sendkeys(buf, "\<C-N>\<C-N>")
3554 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3555
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003556 " info on the left with scrollbar
3557 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3558 call term_sendkeys(buf, "\<C-N>\<C-N>")
3559 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3560
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003561 " Test that the popupmenu's scrollbar and infopopup do not overlap
3562 call term_sendkeys(buf, "\<Esc>")
3563 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3564 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3565 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3566
Bram Moolenaar8e7d6222020-12-18 19:49:56 +01003567 " Hide the info popup, cycle through buffers, make sure it didn't get
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003568 " deleted.
3569 call term_sendkeys(buf, "\<Esc>")
3570 call term_sendkeys(buf, ":set hidden\<CR>")
3571 call term_sendkeys(buf, ":bn\<CR>")
3572 call term_sendkeys(buf, ":bn\<CR>")
3573 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3574 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3575
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003576 " Test that when the option is changed the popup changes.
3577 call term_sendkeys(buf, "\<Esc>")
3578 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3579 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3580 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3581
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003582 call term_sendkeys(buf, " \<Esc>")
3583 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3584 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3585 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3586
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003587 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003588 call StopVimInTerminal(buf)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003589endfunc
3590
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003591func Test_popupmenu_info_noborder()
3592 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003593 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003594
3595 let lines = Get_popupmenu_lines()
3596 call add(lines, 'set completepopup=height:4,border:off')
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003597 call writefile(lines, 'XtestInfoPopupNb', 'D')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003598
3599 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003600 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003601
3602 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3603 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3604
3605 call StopVimInTerminal(buf)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003606endfunc
3607
Bram Moolenaar258cef52019-08-21 17:29:29 +02003608func Test_popupmenu_info_align_menu()
3609 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003610 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003611
3612 let lines = Get_popupmenu_lines()
3613 call add(lines, 'set completepopup=height:4,border:off,align:menu')
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003614 call writefile(lines, 'XtestInfoPopupNb', 'D')
Bram Moolenaar258cef52019-08-21 17:29:29 +02003615
3616 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003617 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003618
3619 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3620 call term_sendkeys(buf, "\<C-N>")
3621 call term_sendkeys(buf, "\<C-N>")
3622 call term_sendkeys(buf, "\<C-N>")
3623 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3624
3625 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3626 call term_sendkeys(buf, "\<C-N>")
3627 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3628
3629 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003630 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003631 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3632 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3633 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3634
3635 call StopVimInTerminal(buf)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003636endfunc
3637
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003638func Test_popupmenu_info_hidden()
3639 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003640 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003641
3642 let lines = Get_popupmenu_lines()
3643 call add(lines, 'call InfoHidden()')
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003644 call writefile(lines, 'XtestInfoPopupHidden', 'D')
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003645
3646 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003647 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003648
3649 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3650 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3651
3652 call term_sendkeys(buf, "\<C-N>")
3653 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3654
3655 call term_sendkeys(buf, "\<C-N>")
3656 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3657
3658 call term_sendkeys(buf, "\<Esc>")
3659 call StopVimInTerminal(buf)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003660endfunc
3661
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003662func Test_popupmenu_info_too_wide()
3663 CheckScreendump
3664 CheckFeature quickfix
3665
3666 let lines =<< trim END
3667 call setline(1, range(10))
3668
3669 set completeopt+=preview,popup
3670 set completepopup=align:menu
3671 set omnifunc=OmniFunc
3672 hi InfoPopup ctermbg=lightgrey
3673
3674 func OmniFunc(findstart, base)
3675 if a:findstart
3676 return 0
3677 endif
3678
3679 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3680 return #{
3681 \ words: [
3682 \ #{
3683 \ word: 'scrap',
3684 \ menu: menuText,
3685 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3686 \ },
3687 \ #{
3688 \ word: 'scappier',
3689 \ menu: menuText,
3690 \ info: 'words are cool',
3691 \ },
3692 \ #{
3693 \ word: 'scrappier2',
3694 \ menu: menuText,
3695 \ info: 'words are cool',
3696 \ },
3697 \ ]
3698 \ }
3699 endfunc
3700 END
3701
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003702 call writefile(lines, 'XtestInfoPopupWide', 'D')
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003703 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003704 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003705
3706 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3707 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3708
3709 call term_sendkeys(buf, "\<Esc>")
3710 call StopVimInTerminal(buf)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003711endfunc
3712
Bakudankun65555002021-11-17 20:40:16 +00003713func Test_popupmenu_masking()
3714 " Test that popup windows that are opened while popup menu is open are
3715 " properly displayed.
3716 CheckScreendump
3717 CheckFeature quickfix
3718
3719 let lines = Get_popupmenu_lines()
3720 call add(lines, 'inoremap <C-A> <Cmd>call OpenOtherPopups()<CR>')
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003721 call writefile(lines, 'XtestPopupmenuMasking', 'D')
Bakudankun65555002021-11-17 20:40:16 +00003722
3723 let buf = RunVimInTerminal('-S XtestPopupmenuMasking', #{rows: 14})
3724 call TermWait(buf, 25)
3725
Bram Moolenaar9f145572022-11-27 12:45:41 +00003726 call term_sendkeys(buf, "A" .. GetEscCodeWithModifier('C', 'X')
3727 \ .. GetEscCodeWithModifier('C', 'U')
3728 \ .. GetEscCodeWithModifier('C', 'A'))
Bakudankun65555002021-11-17 20:40:16 +00003729 call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_1', {})
3730
3731 call term_sendkeys(buf, "\<Esc>")
3732 call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_2', {})
3733
3734 call StopVimInTerminal(buf)
Bakudankun65555002021-11-17 20:40:16 +00003735endfunc
3736
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003737func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003738 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003739 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003740 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003741 call assert_equal(bufnr, winbufnr(winid))
3742 call popup_clear()
3743endfunc
3744
Bram Moolenaar1824f452019-10-02 23:06:46 +02003745func Test_popupwin_getoptions_tablocal()
3746 topleft split
3747 let win1 = popup_create('nothing', #{maxheight: 8})
3748 let win2 = popup_create('something', #{maxheight: 10})
3749 let win3 = popup_create('something', #{maxheight: 15})
3750 call assert_equal(8, popup_getoptions(win1).maxheight)
3751 call assert_equal(10, popup_getoptions(win2).maxheight)
3752 call assert_equal(15, popup_getoptions(win3).maxheight)
3753 call popup_clear()
3754 quit
3755endfunc
3756
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003757func Test_popupwin_cancel()
3758 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3759 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3760 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3761 call assert_equal(5, popup_getpos(win1).line)
3762 call assert_equal(10, popup_getpos(win2).line)
3763 call assert_equal(15, popup_getpos(win3).line)
3764 " TODO: this also works without patch 8.1.2110
3765 call feedkeys("\<C-C>", 'xt')
3766 call assert_equal(5, popup_getpos(win1).line)
3767 call assert_equal(10, popup_getpos(win2).line)
3768 call assert_equal({}, popup_getpos(win3))
3769 call feedkeys("\<C-C>", 'xt')
3770 call assert_equal(5, popup_getpos(win1).line)
3771 call assert_equal({}, popup_getpos(win2))
3772 call assert_equal({}, popup_getpos(win3))
3773 call feedkeys("\<C-C>", 'xt')
3774 call assert_equal({}, popup_getpos(win1))
3775 call assert_equal({}, popup_getpos(win2))
3776 call assert_equal({}, popup_getpos(win3))
3777endfunc
3778
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003779func Test_popupwin_filter_redraw()
3780 " Create two popups with a filter that closes the popup when typing "0".
3781 " Both popups should close, even though the redraw also calls
3782 " popup_reset_handled()
3783
3784 func CloseFilter(winid, key)
3785 if a:key == '0'
3786 call popup_close(a:winid)
3787 redraw
3788 endif
3789 return 0 " pass the key
3790 endfunc
3791
3792 let id1 = popup_create('first one', #{
3793 \ line: 1,
3794 \ col: 1,
3795 \ filter: 'CloseFilter',
3796 \ })
3797 let id2 = popup_create('second one', #{
3798 \ line: 9,
3799 \ col: 1,
3800 \ filter: 'CloseFilter',
3801 \ })
3802 call assert_equal(1, popup_getpos(id1).line)
3803 call assert_equal(9, popup_getpos(id2).line)
3804
3805 call feedkeys('0', 'xt')
3806 call assert_equal({}, popup_getpos(id1))
3807 call assert_equal({}, popup_getpos(id2))
3808
3809 call popup_clear()
3810 delfunc CloseFilter
3811endfunc
3812
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003813func Test_popupwin_double_width()
3814 CheckScreendump
3815
3816 let lines =<< trim END
3817 call setline(1, 'x你好世界你好世你好世界你好')
3818 call setline(2, '你好世界你好世你好世界你好')
3819 call setline(3, 'x你好世界你好世你好世界你好')
3820 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3821 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003822 call writefile(lines, 'XtestPopupWide', 'D')
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003823
3824 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3825 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3826
3827 call StopVimInTerminal(buf)
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003828endfunc
3829
3830func Test_popupwin_sign()
3831 CheckScreendump
3832
3833 let lines =<< trim END
3834 call setline(1, range(10))
3835 call sign_define('Current', {
3836 \ 'text': '>>',
3837 \ 'texthl': 'WarningMsg',
3838 \ 'linehl': 'Error',
3839 \ })
3840 call sign_define('Other', {
3841 \ 'text': '#!',
3842 \ 'texthl': 'Error',
3843 \ 'linehl': 'Search',
3844 \ })
3845 let winid = popup_create(['hello', 'bright', 'world'], {
3846 \ 'minwidth': 20,
3847 \ })
3848 call setwinvar(winid, "&signcolumn", "yes")
3849 let winbufnr = winbufnr(winid)
3850
3851 " add sign to current buffer, shows
3852 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3853 " add sign to current buffer, does not show
3854 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3855
3856 " add sign to popup buffer, shows
3857 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3858 " add sign to popup buffer, does not show
3859 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003860
3861 func SetOptions()
3862 call setwinvar(g:winid, '&number', 1)
3863 call setwinvar(g:winid, '&foldcolumn', 2)
3864 call popup_settext(g:winid, 'a longer line to check the width')
3865 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003866 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003867 call writefile(lines, 'XtestPopupSign', 'D')
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003868
3869 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3870 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3871
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003872 " set more options to check the width is adjusted
3873 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3874 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3875
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003876 call StopVimInTerminal(buf)
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003877endfunc
3878
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003879func Test_popupwin_bufnr()
3880 let popwin = popup_create(['blah'], #{})
3881 let popbuf = winbufnr(popwin)
3882 split asdfasdf
3883 let newbuf = bufnr()
3884 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3885 call assert_equal(newbuf, bufnr('$'))
3886 call popup_clear()
3887 let popwin = popup_create(['blah'], #{})
3888 " reuses previous buffer number
3889 call assert_equal(popbuf, winbufnr(popwin))
3890 call assert_equal(newbuf, bufnr('$'))
3891
3892 call popup_clear()
3893 bwipe!
3894endfunc
3895
Bram Moolenaarec084d32020-02-28 22:44:47 +01003896func Test_popupwin_filter_input_multibyte()
3897 func MyPopupFilter(winid, c)
3898 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3899 return 0
3900 endfunc
3901 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3902
3903 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3904 call feedkeys("\u3000", 'xt')
3905 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3906
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003907 " UTF-8: E3 80 9B, including CSI(0x9B)
3908 call feedkeys("\u301b", 'xt')
3909 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003910
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003911 if has('unix')
3912 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003913 if has('gui_running')
3914 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3915 else
3916 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3917 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003918 call assert_equal([0xc3, 0x81], g:bytes)
3919 endif
3920
Bram Moolenaarec084d32020-02-28 22:44:47 +01003921 call popup_clear()
3922 delfunc MyPopupFilter
3923 unlet g:bytes
3924endfunc
3925
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003926func Test_popupwin_filter_close_ctrl_c()
3927 CheckScreendump
3928
3929 let lines =<< trim END
3930 vsplit
3931 set laststatus=2
3932 set statusline=%!Statusline()
3933
3934 function Statusline() abort
3935 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3936 endfunction
3937
3938 call popup_create('test test test test...', {'filter': {-> 0}})
3939 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003940 call writefile(lines, 'XtestPopupCtrlC', 'D')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003941
3942 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3943
3944 call term_sendkeys(buf, "\<C-C>")
3945 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3946
3947 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003948endfunc
3949
3950func Test_popupwin_filter_close_wrong_name()
3951 CheckScreendump
3952
3953 let lines =<< trim END
3954 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3955 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003956 call writefile(lines, 'XtestPopupWrongName', 'D')
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003957
3958 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3959
3960 call term_sendkeys(buf, "j")
3961 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3962
3963 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003964endfunc
3965
3966func Test_popupwin_filter_close_three_errors()
3967 CheckScreendump
3968
3969 let lines =<< trim END
3970 set cmdheight=2
3971 call popup_create('one two three...', {'filter': 'filter'})
3972 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01003973 call writefile(lines, 'XtestPopupThreeErrors', 'D')
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003974
3975 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3976
3977 call term_sendkeys(buf, "jj")
3978 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3979 call term_sendkeys(buf, "j")
3980 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3981
3982 call StopVimInTerminal(buf)
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003983endfunc
3984
Bram Moolenaar927495b2020-11-06 17:58:35 +01003985func Test_popupwin_latin1_encoding()
3986 CheckScreendump
3987 CheckUnix
3988
3989 " When 'encoding' is a single-byte encoding a terminal window will mess up
3990 " the display. Check that showing a popup on top of that doesn't crash.
3991 let lines =<< trim END
3992 set encoding=latin1
3993 terminal cat Xmultibyte
3994 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003995 redraw
Bram Moolenaarb125b532020-12-17 21:56:09 +01003996 " wait for "cat" to finish
3997 while execute('ls!') !~ 'finished'
3998 sleep 10m
3999 endwhile
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01004000 echo "Done"
Bram Moolenaar927495b2020-11-06 17:58:35 +01004001 END
Bram Moolenaar145d1fd2022-09-30 21:57:11 +01004002 call writefile(lines, 'XtestPopupLatin', 'D')
4003 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte', 'D')
Bram Moolenaar927495b2020-11-06 17:58:35 +01004004
4005 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01004006 call WaitForAssert({-> assert_match('Done', term_getline(buf, 10))})
Bram Moolenaar927495b2020-11-06 17:58:35 +01004007
4008 call term_sendkeys(buf, ":q\<CR>")
4009 call StopVimInTerminal(buf)
Bram Moolenaar927495b2020-11-06 17:58:35 +01004010endfunc
4011
Bram Moolenaarba2920f2020-03-06 21:43:17 +01004012func Test_popupwin_atcursor_far_right()
4013 new
4014
4015 " this was getting stuck
4016 set signcolumn=yes
4017 call setline(1, repeat('=', &columns))
4018 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02004019 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01004020
Bram Moolenaar6d585f42020-07-26 22:20:54 +02004021 " 'signcolumn' was getting reset
4022 call setwinvar(winid, '&signcolumn', 'yes')
4023 call popup_setoptions(winid, {'zindex': 1000})
4024 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
4025
Bram Moolenaaref6b9792020-05-13 16:34:15 +02004026 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01004027 bwipe!
4028 set signcolumn&
4029endfunc
4030
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01004031func Test_popupwin_splitmove()
4032 vsplit
4033 let win2 = win_getid()
4034 let popup_winid = popup_dialog('hello', {})
4035 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
4036 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
4037
4038 call popup_clear()
4039 bwipe
4040endfunc
4041
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01004042func Test_popupwin_exiting_terminal()
4043 CheckFeature terminal
4044
4045 " Tests that when creating a popup right after closing a terminal window does
4046 " not make the popup the current window.
4047 let winid = win_getid()
4048 try
4049 augroup Test_popupwin_exiting_terminal
4050 autocmd!
4051 autocmd WinEnter * :call popup_create('test', {})
4052 augroup END
4053 let bnr = term_start(&shell, #{term_finish: 'close'})
4054 call term_sendkeys(bnr, "exit\r\n")
4055 call WaitForAssert({-> assert_equal(winid, win_getid())})
4056 finally
4057 call popup_clear(1)
4058 augroup Test_popupwin_exiting_terminal
4059 autocmd!
4060 augroup END
4061 endtry
4062endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01004063
Bram Moolenaar014f6982021-01-04 13:18:30 +01004064func Test_popup_filter_menu()
4065 let colors = ['red', 'green', 'blue']
4066 call popup_menu(colors, #{callback: {_, result -> assert_equal('green', colors[result - 1])}})
4067 call feedkeys("\<c-n>\<c-n>\<c-p>\<cr>", 'xt')
4068endfunc
4069
Bram Moolenaar65026432021-02-06 14:22:32 +01004070func Test_popup_getoptions_other_tab()
4071 new
4072 call setline(1, 'some text')
4073 call prop_type_add('textprop', {})
4074 call prop_add(1, 1, #{type: 'textprop', length: 1})
4075 let id = popup_create('TEST', #{textprop: 'textprop', highlight: 'ErrorMsg', tabpage: 1})
4076 tab sp
4077 call assert_equal(['textprop', 'textpropid', 'textpropwin'], popup_getoptions(id)->keys()->filter({_, v -> v =~ 'textprop'}))
4078
4079 tabclose
Bram Moolenaarefa19232021-02-06 14:59:27 +01004080 call popup_close(id)
Bram Moolenaar65026432021-02-06 14:22:32 +01004081 bwipe!
4082 call prop_type_delete('textprop')
4083endfunc
4084
Bram Moolenaarefa19232021-02-06 14:59:27 +01004085
4086func Test_popup_setoptions_other_tab()
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004087 new Xpotfile
Bram Moolenaarefa19232021-02-06 14:59:27 +01004088 let winid = win_getid()
4089 call setline(1, 'some text')
4090 call prop_type_add('textprop', {})
4091 call prop_add(1, 1, #{type: 'textprop', length: 1})
4092 let id = popup_create('TEST', #{textprop: 'textprop'})
4093 tab sp
4094 call popup_setoptions(id, #{textprop: 'textprop', textpropwin: winid})
4095 call assert_equal(winid, popup_getoptions(id).textpropwin)
4096
4097 tabclose
4098 call popup_close(id)
Bram Moolenaarb18b4962022-09-02 21:55:50 +01004099 bwipe! Xpotfile
Bram Moolenaarefa19232021-02-06 14:59:27 +01004100 call prop_type_delete('textprop')
4101endfunc
4102
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004103func Test_popup_prop_not_visible()
4104 CheckScreendump
4105
4106 let lines =<< trim END
4107 vim9script
4108 set nowrap stal=2
4109 rightbelow :31vnew
4110 setline(1, ['', 'some text', '', 'other text'])
4111 prop_type_add('someprop', {})
4112 prop_add(2, 9, {type: 'someprop', length: 5})
Bram Moolenaar27724252022-05-08 15:00:04 +01004113 g:some_id = popup_create('attached to "some"', {
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004114 textprop: 'someprop',
4115 highlight: 'ErrorMsg',
4116 line: -1,
4117 wrap: false,
4118 fixed: true,
4119 })
4120 prop_type_add('otherprop', {})
4121 prop_add(4, 10, {type: 'otherprop', length: 5})
4122 popup_create('attached to "other"', {
4123 textprop: 'otherprop',
4124 highlight: 'ErrorMsg',
4125 line: -1,
4126 wrap: false,
4127 fixed: false,
4128 })
4129 END
dundargocc57b5bc2022-11-02 13:30:51 +00004130 call writefile(lines, 'XtestPropNotVisible', 'D')
4131 let buf = RunVimInTerminal('-S XtestPropNotVisible', #{rows: 10})
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004132 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01', {})
4133
Bram Moolenaar27724252022-05-08 15:00:04 +01004134 " check that hiding and unhiding the popup works
4135 call term_sendkeys(buf, ":call popup_hide(g:some_id)\<CR>")
4136 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01a', {})
4137 call term_sendkeys(buf, ":call popup_show(g:some_id)\<CR>")
4138 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01b', {})
4139
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004140 call term_sendkeys(buf, ":vert resize -14\<CR>")
4141 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_02', {})
4142
4143 call term_sendkeys(buf, ":vert resize -8\<CR>")
4144 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_03', {})
4145
4146 " clean up
4147 call StopVimInTerminal(buf)
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004148endfunction
4149
Bram Moolenaar7b4f76c2021-06-10 21:07:48 +02004150func Test_bufdel_skips_popupwin_buffer()
4151 let id = popup_create("Some text", {})
4152 %bd
4153 call popup_close(id)
4154endfunc
4155
Bram Moolenaar58a3cae2022-09-08 13:43:10 +01004156func Test_term_popup_bufline()
4157 " very specific situation where a non-existing buffer line is used, leading
4158 " to an ml_get error
4159 CheckScreendump
4160
4161 let lines =<< trim END
4162 vim9script
4163 &scrolloff = 5
4164 term_start('seq 1 5', {term_finish: 'open'})
4165 timer_start(50, (_) => {
4166 set cpoptions&vim
4167 var buf = popup_create([], {})->winbufnr()
4168 appendbufline(buf, 0, range(5))
4169 })
4170 END
4171 call writefile(lines, 'XtestTermPopup', 'D')
4172 let buf = RunVimInTerminal('-S XtestTermPopup', #{rows: 15})
4173 call VerifyScreenDump(buf, 'Test_term_popup_bufline', {})
4174
4175 " clean up
4176 call StopVimInTerminal(buf)
4177endfunc
4178
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004179
Bram Moolenaar331bafd2019-07-20 17:46:05 +02004180" vim: shiftwidth=2 sts=2