blob: 178f2356849de7ba8a85a8f318ca47735cf7187a [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
7
8func Test_simple_popup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02009 CheckScreendump
10
Bram Moolenaare7eb9272019-06-24 00:58:07 +020011 let lines =<< trim END
12 call setline(1, range(1, 100))
13 hi PopupColor1 ctermbg=lightblue
14 hi PopupColor2 ctermbg=lightcyan
Bram Moolenaar1666ac92019-11-10 17:22:31 +010015 hi EndOfBuffer ctermbg=lightgrey
Bram Moolenaare7eb9272019-06-24 00:58:07 +020016 hi Comment ctermfg=red
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020017 call prop_type_add('comment', #{highlight: 'Comment'})
18 let winid = popup_create('hello there', #{line: 3, col: 11, minwidth: 20, highlight: 'PopupColor1'})
19 let winid2 = popup_create(['another one', 'another two', 'another three'], #{line: 3, col: 25, minwidth: 20})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020020 call setwinvar(winid2, '&wincolor', 'PopupColor2')
21 END
22 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020023 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar4d784b22019-05-25 19:51:39 +020024 call VerifyScreenDump(buf, 'Test_popupwin_01', {})
25
Bram Moolenaarec583842019-05-26 14:11:23 +020026 " Add a tabpage
27 call term_sendkeys(buf, ":tabnew\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020028 call term_sendkeys(buf, ":let popupwin = popup_create(["
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020029 \ .. "#{text: 'other tab'},"
30 \ .. "#{text: 'a comment line', props: [#{"
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020031 \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
Bram Moolenaar7a8d0272019-05-26 23:32:06 +020032 \ .. "}]},"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020033 \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
Bram Moolenaarec583842019-05-26 14:11:23 +020034 call VerifyScreenDump(buf, 'Test_popupwin_02', {})
35
36 " switch back to first tabpage
37 call term_sendkeys(buf, "gt")
38 call VerifyScreenDump(buf, 'Test_popupwin_03', {})
39
40 " close that tabpage
41 call term_sendkeys(buf, ":quit!\<CR>")
42 call VerifyScreenDump(buf, 'Test_popupwin_04', {})
43
Bram Moolenaar202d9822019-06-11 21:56:30 +020044 " set 'columns' to a small value, size must be recomputed
45 call term_sendkeys(buf, ":let cols = &columns\<CR>")
46 call term_sendkeys(buf, ":set columns=12\<CR>")
47 call VerifyScreenDump(buf, 'Test_popupwin_04a', {})
48 call term_sendkeys(buf, ":let &columns = cols\<CR>")
49
Bram Moolenaar17146962019-05-30 00:12:11 +020050 " resize popup, show empty line at bottom
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020051 call term_sendkeys(buf, ":call popup_move(popupwin, #{minwidth: 15, maxwidth: 25, minheight: 3, maxheight: 5})\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020052 call term_sendkeys(buf, ":redraw\<CR>")
53 call VerifyScreenDump(buf, 'Test_popupwin_05', {})
54
Bram Moolenaar17146962019-05-30 00:12:11 +020055 " show not fitting line at bottom
56 call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\<CR>")
57 call term_sendkeys(buf, ":redraw\<CR>")
58 call VerifyScreenDump(buf, 'Test_popupwin_06', {})
59
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020060 " move popup over ruler
61 call term_sendkeys(buf, ":set cmdheight=2\<CR>")
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020062 call term_sendkeys(buf, ":call popup_move(popupwin, #{line: 7, col: 55})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +020063 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020064 call VerifyScreenDump(buf, 'Test_popupwin_07', {})
65
66 " clear all popups after moving the cursor a bit, so that ruler is updated
67 call term_sendkeys(buf, "axxx\<Esc>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020068 call TermWait(buf)
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020069 call term_sendkeys(buf, "0")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020070 call TermWait(buf)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +020071 call term_sendkeys(buf, ":call popup_clear()\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020072 call VerifyScreenDump(buf, 'Test_popupwin_08', {})
73
Bram Moolenaar4d784b22019-05-25 19:51:39 +020074 " clean up
75 call StopVimInTerminal(buf)
76 call delete('XtestPopup')
77endfunc
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')
98 call writefile(lines, 'XtestPopupBorder')
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)
103 call delete('XtestPopupBorder')
104 endfor
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200105
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200106 let lines =<< trim END
107 call setline(1, range(1, 100))
108 hi BlueColor ctermbg=lightblue
109 hi TopColor ctermbg=253
110 hi RightColor ctermbg=245
111 hi BottomColor ctermbg=240
112 hi LeftColor ctermbg=248
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200113 call popup_create('hello border', #{line: 2, col: 3, border: [], borderhighlight: ['BlueColor']})
114 call popup_create(['hello border', 'and more'], #{line: 2, col: 23, border: [], borderhighlight: ['TopColor', 'RightColor', 'BottomColor', 'LeftColor']})
115 call popup_create(['hello border', 'lines only'], #{line: 2, col: 43, border: [], borderhighlight: ['BlueColor'], borderchars: ['x']})
116 call popup_create(['hello border', 'with corners'], #{line: 2, col: 60, border: [], borderhighlight: ['BlueColor'], borderchars: ['x', '#']})
117 let winid = popup_create(['hello border', 'with numbers'], #{line: 6, col: 3, border: [], borderhighlight: ['BlueColor'], borderchars: ['0', '1', '2', '3', '4', '5', '6', '7']})
118 call popup_create(['hello border', 'just blanks'], #{line: 7, col: 23, border: [], borderhighlight: ['BlueColor'], borderchars: [' ']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200119 func MultiByte()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200120 call popup_create(['hello'], #{line: 8, col: 43, border: [], borderchars: ['─', '│', '─', '│', '┌', '┐', '┘', '└']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200121 endfunc
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200122 END
123 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200124 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 12})
Bram Moolenaar790498b2019-06-01 22:15:29 +0200125 call VerifyScreenDump(buf, 'Test_popupwin_22', {})
126
Bram Moolenaarad24a712019-06-17 20:05:45 +0200127 " check that changing borderchars triggers a redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200128 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 +0200129 call VerifyScreenDump(buf, 'Test_popupwin_23', {})
130
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200131 " check multi-byte border only with 'ambiwidth' single
132 if &ambiwidth == 'single'
133 call term_sendkeys(buf, ":call MultiByte()\<CR>")
134 call VerifyScreenDump(buf, 'Test_popupwin_24', {})
135 endif
136
Bram Moolenaar790498b2019-06-01 22:15:29 +0200137 call StopVimInTerminal(buf)
138 call delete('XtestPopupBorder')
139
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200140 let with_border_or_padding = #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200141 \ line: 2,
142 \ core_line: 3,
143 \ col: 3,
144 \ core_col: 4,
145 \ width: 14,
146 \ core_width: 12,
147 \ height: 3,
148 \ core_height: 1,
149 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100150 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200151 \ scrollbar: 0,
152 \ visible: 1}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200153 let winid = popup_create('hello border', #{line: 2, col: 3, border: []})",
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200154 call assert_equal(with_border_or_padding, winid->popup_getpos())
Bram Moolenaarae943152019-06-16 22:54:14 +0200155 let options = popup_getoptions(winid)
156 call assert_equal([], options.border)
157 call assert_false(has_key(options, "padding"))
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200158
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200159 let winid = popup_create('hello padding', #{line: 2, col: 3, padding: []})
Bram Moolenaarae943152019-06-16 22:54:14 +0200160 let with_border_or_padding.width = 15
161 let with_border_or_padding.core_width = 13
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200162 call assert_equal(with_border_or_padding, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200163 let options = popup_getoptions(winid)
164 call assert_false(has_key(options, "border"))
165 call assert_equal([], options.padding)
166
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200167 call popup_setoptions(winid, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200168 \ padding: [1, 2, 3, 4],
169 \ border: [4, 0, 7, 8],
170 \ borderhighlight: ['Top', 'Right', 'Bottom', 'Left'],
171 \ borderchars: ['1', '^', '2', '>', '3', 'v', '4', '<'],
Bram Moolenaarae943152019-06-16 22:54:14 +0200172 \ })
173 let options = popup_getoptions(winid)
174 call assert_equal([1, 0, 1, 1], options.border)
175 call assert_equal([1, 2, 3, 4], options.padding)
176 call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
177 call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200178
Bram Moolenaara1396152019-10-20 18:46:05 +0200179 " Check that popup_setoptions() takes the output of popup_getoptions()
180 call popup_setoptions(winid, options)
181 call assert_equal(options, popup_getoptions(winid))
182
Bram Moolenaarb0992022020-01-30 14:55:42 +0100183 " Check that range() doesn't crash
184 call popup_setoptions(winid, #{
185 \ padding: range(1, 4),
186 \ border: range(5, 8),
187 \ borderhighlight: range(4),
188 \ borderchars: range(8),
189 \ })
190
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200191 let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
192 call assert_equal(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200193 \ line: 3,
194 \ core_line: 5,
195 \ col: 8,
196 \ core_col: 10,
197 \ width: 14,
198 \ core_width: 10,
199 \ height: 5,
200 \ scrollbar: 0,
201 \ core_height: 1,
202 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100203 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200204 \ visible: 1}, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200205
206 call popup_clear()
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200207endfunc
208
Bram Moolenaarb4230122019-05-30 18:40:53 +0200209func Test_popup_with_syntax_win_execute()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200210 CheckScreendump
211
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200212 let lines =<< trim END
213 call setline(1, range(1, 100))
214 hi PopupColor ctermbg=lightblue
215 let winid = popup_create([
216 \ '#include <stdio.h>',
217 \ 'int main(void)',
218 \ '{',
219 \ ' printf(123);',
220 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200221 \], #{line: 3, col: 25, highlight: 'PopupColor'})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200222 call win_execute(winid, 'set syntax=cpp')
223 END
224 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200225 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200226 call VerifyScreenDump(buf, 'Test_popupwin_10', {})
227
228 " clean up
229 call StopVimInTerminal(buf)
230 call delete('XtestPopup')
231endfunc
232
233func Test_popup_with_syntax_setbufvar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200234 CheckScreendump
235
Bram Moolenaar402502d2019-05-30 22:07:36 +0200236 let lines =<< trim END
237 call setline(1, range(1, 100))
238 hi PopupColor ctermbg=lightgrey
239 let winid = popup_create([
240 \ '#include <stdio.h>',
241 \ 'int main(void)',
242 \ '{',
Bram Moolenaare089c3f2019-07-09 20:25:25 +0200243 \ "\tprintf(567);",
Bram Moolenaar402502d2019-05-30 22:07:36 +0200244 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200245 \], #{line: 3, col: 21, highlight: 'PopupColor'})
Bram Moolenaar402502d2019-05-30 22:07:36 +0200246 call setbufvar(winbufnr(winid), '&syntax', 'cpp')
247 END
248 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200249 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200250 call VerifyScreenDump(buf, 'Test_popupwin_11', {})
251
252 " clean up
253 call StopVimInTerminal(buf)
254 call delete('XtestPopup')
255endfunc
256
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200257func Test_popup_with_matches()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200258 CheckScreendump
259
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200260 let lines =<< trim END
261 call setline(1, ['111 222 333', '444 555 666'])
262 let winid = popup_create([
263 \ '111 222 333',
264 \ '444 555 666',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200265 \], #{line: 3, col: 10, border: []})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200266 set hlsearch
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100267 hi VeryBlue ctermfg=blue guifg=blue
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200268 /666
269 call matchadd('ErrorMsg', '111')
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100270 call matchadd('VeryBlue', '444')
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200271 call win_execute(winid, "call matchadd('ErrorMsg', '111')")
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100272 call win_execute(winid, "call matchadd('VeryBlue', '555')")
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200273 END
274 call writefile(lines, 'XtestPopupMatches')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200275 let buf = RunVimInTerminal('-S XtestPopupMatches', #{rows: 10})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200276 call VerifyScreenDump(buf, 'Test_popupwin_matches', {})
277
278 " clean up
279 call StopVimInTerminal(buf)
280 call delete('XtestPopupMatches')
281endfunc
282
Bram Moolenaar399d8982019-06-02 15:34:29 +0200283func Test_popup_all_corners()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200284 CheckScreendump
285
Bram Moolenaar399d8982019-06-02 15:34:29 +0200286 let lines =<< trim END
287 call setline(1, repeat([repeat('-', 60)], 15))
288 set so=0
289 normal 2G3|r#
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200290 let winid1 = popup_create(['first', 'second'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200291 \ line: 'cursor+1',
292 \ col: 'cursor',
293 \ pos: 'topleft',
294 \ border: [],
295 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200296 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200297 normal 24|r@
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200298 let winid1 = popup_create(['First', 'SeconD'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200299 \ line: 'cursor+1',
300 \ col: 'cursor',
301 \ pos: 'topright',
302 \ border: [],
303 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200304 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200305 normal 9G27|r%
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200306 let winid1 = popup_create(['fiRSt', 'seCOnd'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200307 \ line: 'cursor-1',
308 \ col: 'cursor',
309 \ pos: 'botleft',
310 \ border: [],
311 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200312 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200313 normal 48|r&
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200314 let winid1 = popup_create(['FIrsT', 'SEcoND'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200315 \ line: 'cursor-1',
316 \ col: 'cursor',
317 \ pos: 'botright',
318 \ border: [],
319 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200320 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200321 normal 1G51|r*
322 let winid1 = popup_create(['one', 'two'], #{
323 \ line: 'cursor-1',
324 \ col: 'cursor',
325 \ pos: 'botleft',
326 \ border: [],
327 \ padding: [],
328 \ })
Bram Moolenaar399d8982019-06-02 15:34:29 +0200329 END
330 call writefile(lines, 'XtestPopupCorners')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200331 let buf = RunVimInTerminal('-S XtestPopupCorners', #{rows: 12})
Bram Moolenaar399d8982019-06-02 15:34:29 +0200332 call VerifyScreenDump(buf, 'Test_popupwin_corners', {})
333
334 " clean up
335 call StopVimInTerminal(buf)
336 call delete('XtestPopupCorners')
337endfunc
338
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100339func Test_popup_nospace()
340 CheckScreendump
341
342 let lines =<< trim END
343 call setline(1, repeat([repeat('-', 60)], 15))
344 set so=0
345
346 " cursor in a line in top half, using "botleft" with popup that
347 " does fit
348 normal 5G2|r@
349 let winid1 = popup_create(['one', 'two'], #{
350 \ line: 'cursor-1',
351 \ col: 'cursor',
352 \ pos: 'botleft',
353 \ border: [],
354 \ })
355 " cursor in a line in top half, using "botleft" with popup that
356 " doesn't fit: gets truncated
357 normal 5G9|r#
358 let winid1 = popup_create(['one', 'two', 'tee'], #{
359 \ line: 'cursor-1',
360 \ col: 'cursor',
361 \ pos: 'botleft',
362 \ posinvert: 0,
363 \ border: [],
364 \ })
365 " cursor in a line in top half, using "botleft" with popup that
366 " doesn't fit and 'posinvert' set: flips to below.
367 normal 5G16|r%
368 let winid1 = popup_create(['one', 'two', 'tee'], #{
369 \ line: 'cursor-1',
370 \ col: 'cursor',
371 \ pos: 'botleft',
372 \ border: [],
373 \ })
374 " cursor in a line in bottom half, using "botleft" with popup that
375 " doesn't fit: does not flip.
376 normal 8G23|r*
377 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
378 \ line: 'cursor-1',
379 \ col: 'cursor',
380 \ pos: 'botleft',
381 \ border: [],
382 \ })
383
384 " cursor in a line in bottom half, using "topleft" with popup that
385 " does fit
386 normal 8G30|r@
387 let winid1 = popup_create(['one', 'two'], #{
388 \ line: 'cursor+1',
389 \ col: 'cursor',
390 \ pos: 'topleft',
391 \ border: [],
392 \ })
393 " cursor in a line in top half, using "topleft" with popup that
394 " doesn't fit: truncated
395 normal 8G37|r#
396 let winid1 = popup_create(['one', 'two', 'tee'], #{
397 \ line: 'cursor+1',
398 \ col: 'cursor',
399 \ pos: 'topleft',
400 \ posinvert: 0,
401 \ border: [],
402 \ })
403 " cursor in a line in top half, using "topleft" with popup that
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100404 " doesn't fit and "posinvert" set: flips to above.
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100405 normal 8G44|r%
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100406 let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100407 \ line: 'cursor+1',
408 \ col: 'cursor',
409 \ pos: 'topleft',
410 \ border: [],
411 \ })
412 " cursor in a line in top half, using "topleft" with popup that
413 " doesn't fit: does not flip.
414 normal 5G51|r*
415 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
416 \ line: 'cursor+1',
417 \ col: 'cursor',
418 \ pos: 'topleft',
419 \ border: [],
420 \ })
421 END
422 call writefile(lines, 'XtestPopupNospace')
423 let buf = RunVimInTerminal('-S XtestPopupNospace', #{rows: 12})
424 call VerifyScreenDump(buf, 'Test_popupwin_nospace', {})
425
426 " clean up
427 call StopVimInTerminal(buf)
428 call delete('XtestPopupNospace')
429endfunc
430
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200431func Test_popup_firstline_dump()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200432 CheckScreendump
433
Bram Moolenaar8d241042019-06-12 23:40:01 +0200434 let lines =<< trim END
435 call setline(1, range(1, 20))
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200436 let winid = popup_create(['1111', '222222', '33333', '44', '5', '666666', '77777', '888', '9999999999999999'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200437 \ maxheight: 4,
438 \ firstline: 3,
Bram Moolenaar8d241042019-06-12 23:40:01 +0200439 \ })
440 END
441 call writefile(lines, 'XtestPopupFirstline')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200442 let buf = RunVimInTerminal('-S XtestPopupFirstline', #{rows: 10})
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200443 call VerifyScreenDump(buf, 'Test_popupwin_firstline_1', {})
444
445 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: -1})\<CR>")
446 call term_sendkeys(buf, ":\<CR>")
447 call VerifyScreenDump(buf, 'Test_popupwin_firstline_2', {})
Bram Moolenaar8d241042019-06-12 23:40:01 +0200448
449 " clean up
450 call StopVimInTerminal(buf)
451 call delete('XtestPopupFirstline')
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200452endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +0200453
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200454func Test_popup_firstline()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200455 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200456 \ maxheight: 2,
457 \ firstline: 3,
Bram Moolenaarae943152019-06-16 22:54:14 +0200458 \ })
459 call assert_equal(3, popup_getoptions(winid).firstline)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200460 call popup_setoptions(winid, #{firstline: 1})
Bram Moolenaarae943152019-06-16 22:54:14 +0200461 call assert_equal(1, popup_getoptions(winid).firstline)
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200462 eval winid->popup_close()
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200463
464 let winid = popup_create(['xxx']->repeat(50), #{
465 \ maxheight: 3,
466 \ firstline: 11,
467 \ })
468 redraw
469 call assert_equal(11, popup_getoptions(winid).firstline)
470 call assert_equal(11, popup_getpos(winid).firstline)
Bram Moolenaar8e0a8e72019-09-02 22:56:24 +0200471 " check line() works with popup window
472 call assert_equal(11, line('.', winid))
473 call assert_equal(50, line('$', winid))
474 call assert_equal(0, line('$', 123456))
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200475
476 " Normal command changes what is displayed but not "firstline"
477 call win_execute(winid, "normal! \<c-y>")
478 call assert_equal(11, popup_getoptions(winid).firstline)
479 call assert_equal(10, popup_getpos(winid).firstline)
480
481 " Making some property change applies "firstline" again
482 call popup_setoptions(winid, #{line: 4})
483 call assert_equal(11, popup_getoptions(winid).firstline)
484 call assert_equal(11, popup_getpos(winid).firstline)
485
486 " Remove "firstline" property and scroll
487 call popup_setoptions(winid, #{firstline: 0})
488 call win_execute(winid, "normal! \<c-y>")
489 call assert_equal(0, popup_getoptions(winid).firstline)
490 call assert_equal(10, popup_getpos(winid).firstline)
491
492 " Making some property change has no side effect
493 call popup_setoptions(winid, #{line: 3})
494 call assert_equal(0, popup_getoptions(winid).firstline)
495 call assert_equal(10, popup_getpos(winid).firstline)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200496 call popup_close(winid)
Bram Moolenaarae943152019-06-16 22:54:14 +0200497
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100498 " CTRL-D scrolls down half a page
499 let winid = popup_create(['xxx']->repeat(50), #{
500 \ maxheight: 8,
501 \ })
502 redraw
503 call assert_equal(1, popup_getpos(winid).firstline)
504 call win_execute(winid, "normal! \<C-D>")
505 call assert_equal(5, popup_getpos(winid).firstline)
506 call win_execute(winid, "normal! \<C-D>")
507 call assert_equal(9, popup_getpos(winid).firstline)
508 call win_execute(winid, "normal! \<C-U>")
509 call assert_equal(5, popup_getpos(winid).firstline)
510
511 call win_execute(winid, "normal! \<C-F>")
512 call assert_equal(11, popup_getpos(winid).firstline)
513 call win_execute(winid, "normal! \<C-B>")
514 call assert_equal(5, popup_getpos(winid).firstline)
515
Bram Moolenaarae943152019-06-16 22:54:14 +0200516 call popup_close(winid)
LemonBoy0044e512022-04-20 19:47:37 +0100517
518 " Popup with less elements than the maximum height and negative firstline:
519 " check that the popup height is correctly computed.
520 let winid = popup_create(['xxx']->repeat(4), #{
521 \ firstline: -1,
522 \ maxheight: 6,
523 \ })
524
525 let pos = popup_getpos(winid)
526 call assert_equal(3, pos.width)
527 call assert_equal(4, pos.height)
528
529 call popup_close(winid)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200530endfunc
531
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200532func Test_popup_firstline_cursorline()
533 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
534 \ maxheight: 2,
535 \ firstline: 3,
536 \ cursorline: 1,
537 \ })
538 call assert_equal(3, popup_getoptions(winid).firstline)
539 call assert_equal(3, getwininfo(winid)[0].topline)
540 call assert_equal(3, getcurpos(winid)[1])
541
542 call popup_close(winid)
543endfunc
544
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200545func Test_popup_noscrolloff()
546 set scrolloff=5
547 let winid = popup_create(['xxx']->repeat(50), #{
548 \ maxheight: 5,
549 \ firstline: 11,
550 \ })
551 redraw
552 call assert_equal(11, popup_getoptions(winid).firstline)
553 call assert_equal(11, popup_getpos(winid).firstline)
554
555 call popup_setoptions(winid, #{firstline: 0})
556 call win_execute(winid, "normal! \<c-y>")
557 call assert_equal(0, popup_getoptions(winid).firstline)
558 call assert_equal(10, popup_getpos(winid).firstline)
559
560 call popup_close(winid)
561endfunc
562
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200563func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200564 CheckScreendump
565
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200566 " create a popup that covers the command line
567 let lines =<< trim END
568 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200569 split
570 vsplit
571 $wincmd w
572 vsplit
573 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200574 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200575 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200576 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200577 \ border: [],
578 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200579 \ })
580 func Dragit()
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000581 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
582 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200583 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
584 endfunc
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200585 func Resize()
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000586 map <silent> <F5> :call test_setmouse(6, 21)<CR>
587 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200588 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
589 endfunc
Bram Moolenaarbfc57862021-11-26 15:57:40 +0000590 func ClickAndDrag()
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000591 map <silent> <F3> :call test_setmouse(5, 2)<CR>
592 map <silent> <F4> :call test_setmouse(3, 14)<CR>
593 map <silent> <F5> :call test_setmouse(3, 18)<CR>
594 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
595 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
Bram Moolenaarbfc57862021-11-26 15:57:40 +0000596 endfunc
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000597 func DragAllStart()
598 call popup_clear()
599 call popup_create('hello', #{line: 3, col: 5, dragall: 1})
600 endfunc
601 func DragAllDrag()
602 map <silent> <F3> :call test_setmouse(3, 5)<CR>
603 map <silent> <F4> :call test_setmouse(5, 36)<CR>
604 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
605 endfunc
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200606 END
607 call writefile(lines, 'XtestPopupDrag')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200608 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200609 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
610
611 call term_sendkeys(buf, ":call Dragit()\<CR>")
612 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
613
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200614 call term_sendkeys(buf, ":call Resize()\<CR>")
615 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
616
Bram Moolenaarbfc57862021-11-26 15:57:40 +0000617 " dragging works after click on a status line
618 call term_sendkeys(buf, ":call ClickAndDrag()\<CR>")
619 call VerifyScreenDump(buf, 'Test_popupwin_drag_04', {})
620
Bram Moolenaar0b74d002021-11-29 17:38:02 +0000621 " dragging without border
622 call term_sendkeys(buf, ":call DragAllStart()\<CR>")
623 call VerifyScreenDump(buf, 'Test_popupwin_drag_05', {})
624 call term_sendkeys(buf, ":call DragAllDrag()\<CR>")
625 call VerifyScreenDump(buf, 'Test_popupwin_drag_06', {})
626
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200627 " clean up
628 call StopVimInTerminal(buf)
629 call delete('XtestPopupDrag')
630endfunc
631
Bram Moolenaareabddc42022-04-02 15:32:16 +0100632func Test_popup_drag_minwidth()
633 CheckScreendump
634
635 " create a popup that does not fit
636 let lines =<< trim END
637 call range(40)
638 \ ->map({_,i -> string(i)})
639 \ ->popup_create({
640 \ 'drag': 1,
641 \ 'wrap': 0,
642 \ 'border': [],
643 \ 'scrollbar': 1,
644 \ 'minwidth': 100,
645 \ 'filter': {w, k -> k ==# 'q' ? len([popup_close(w)]) : 0},
646 \ })
647 func DragitDown()
648 map <silent> <F3> :call test_setmouse(1, 10)<CR>
649 map <silent> <F4> :call test_setmouse(5, 40)<CR>
650 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
651 endfunc
652 func DragitUp()
653 map <silent> <F3> :call test_setmouse(5, 40)<CR>
654 map <silent> <F4> :call test_setmouse(4, 40)<CR>
655 map <silent> <F5> :call test_setmouse(3, 40)<CR>
656 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
657 endfunc
658 END
659 call writefile(lines, 'XtestPopupDrag')
660 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
661 call VerifyScreenDump(buf, 'Test_popupwin_drag_minwidth_1', {})
662
663 call term_sendkeys(buf, ":call DragitDown()\<CR>")
664 call VerifyScreenDump(buf, 'Test_popupwin_drag_minwidth_2', {})
665
666 call term_sendkeys(buf, ":call DragitUp()\<CR>")
667 call VerifyScreenDump(buf, 'Test_popupwin_drag_minwidth_3', {})
668
669 call term_sendkeys(buf, 'q')
670
671 " clean up
672 call StopVimInTerminal(buf)
673 call delete('XtestPopupDrag')
674endfunc
675
Bram Moolenaar35910f22020-07-12 19:24:10 +0200676func Test_popup_drag_termwin()
677 CheckUnix
678 CheckScreendump
679 CheckFeature terminal
680
681 " create a popup that covers the terminal window
682 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200683 set foldmethod=marker
684 call setline(1, range(100))
685 for nr in range(7)
686 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200687 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200688 endfor
689 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200690 set shell=/bin/sh noruler
Bram Moolenaar4b2ce122020-11-21 21:41:41 +0100691 unlet $PROMPT_COMMAND
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200692 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200693 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200694 $wincmd w
695 let winid = popup_create(['1111', '2222'], #{
696 \ drag: 1,
697 \ resize: 1,
698 \ border: [],
699 \ line: 3,
700 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200701 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200702 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
703 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200704 func DragitDown()
705 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
706 endfunc
707 func DragitDownLeft()
708 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
709 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200710 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
711 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200712 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
713 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200714 END
715 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200716 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200717 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
718
Bram Moolenaar452143c2020-07-15 17:38:21 +0200719 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200720 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
721
Bram Moolenaar452143c2020-07-15 17:38:21 +0200722 call term_sendkeys(buf, ":call DragitDown()\<CR>")
723 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
724
725 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
726 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
727
Bram Moolenaar35910f22020-07-12 19:24:10 +0200728 " clean up
729 call StopVimInTerminal(buf)
730 call delete('XtestPopupTerm')
731endfunc
732
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200733func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200734 CheckScreendump
735
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200736 let lines =<< trim END
737 call setline(1, range(1, 20))
738 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200739 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200740 \ close: 'button',
741 \ border: [],
742 \ line: 1,
743 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200744 \ })
745 func CloseMsg(id, result)
746 echomsg 'Popup closed with ' .. a:result
747 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200748 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200749 \ close: 'click',
750 \ line: 3,
751 \ col: 15,
752 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200753 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200754 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200755 \ close: 'button',
756 \ line: 5,
757 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200758 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200759 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200760 \ close: 'button',
761 \ padding: [],
762 \ line: 5,
763 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200764 \ })
765 func CloseWithX()
766 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
767 endfunc
768 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
769 func CloseWithClick()
770 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
771 endfunc
772 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200773 func CreateWithMenuFilter()
774 let winid = popup_create('barfoo', #{
775 \ close: 'button',
776 \ filter: 'popup_filter_menu',
777 \ border: [],
778 \ line: 1,
779 \ col: 40,
780 \ })
781 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200782 END
783 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200784 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200785 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
786
787 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
788 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
789
790 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
791 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
792
Bram Moolenaarf6396232019-08-24 19:36:00 +0200793 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
794 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
795
796 " We have to send the actual mouse code, feedkeys() would be caught the
797 " filter.
798 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
799 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
800
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200801 " clean up
802 call StopVimInTerminal(buf)
803 call delete('XtestPopupClose')
804endfunction
805
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200806func Test_popup_menu_wrap()
807 CheckScreendump
808
809 let lines =<< trim END
810 call setline(1, range(1, 20))
811 call popup_create([
812 \ 'one',
813 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
814 \ 'three',
815 \ 'four',
816 \ ], #{
817 \ pos: "botleft",
818 \ border: [],
819 \ padding: [0,1,0,1],
820 \ maxheight: 3,
821 \ cursorline: 1,
822 \ filter: 'popup_filter_menu',
823 \ })
824 END
825 call writefile(lines, 'XtestPopupWrap')
826 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
827 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
828
829 call term_sendkeys(buf, "jj")
830 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
831
832 " clean up
833 call term_sendkeys(buf, "\<Esc>")
834 call StopVimInTerminal(buf)
835 call delete('XtestPopupWrap')
836endfunction
837
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200838func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200839 CheckScreendump
840
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200841 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200842 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200843 hi PopupColor ctermbg=lightgrey
844 let winid = popup_create([
845 \ 'some text',
846 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200847 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200848 \ line: 1,
849 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100850 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200851 \ wrap: 0,
852 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200853 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200854 \ zindex: 90,
855 \ padding: [],
856 \ highlight: 'PopupColor',
857 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200858 call popup_create([
859 \ 'xxxxxxxxx',
860 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200861 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200862 \ line: 3,
863 \ col: 18,
864 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200865 let winidb = popup_create([
866 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200867 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200868 \ line: 7,
869 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100870 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200871 \ wrap: 0,
872 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200873 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200874 \ close: 'button',
875 \ zindex: 90,
876 \ padding: [],
877 \ border: [],
878 \ 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 +0200879 END
880 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200881 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200882 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
883
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200884 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
885 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200886 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200887 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
888
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200889 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
890 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200891 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200892 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
893
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200894 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
895 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200896 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200897 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
898
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200899 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
900 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200901 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200902 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
903
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200904 " clean up
905 call StopVimInTerminal(buf)
906 call delete('XtestPopupMask')
Bram Moolenaar4012d262020-12-29 11:57:46 +0100907
908 " this was causing a crash
909 call popup_create('test', #{mask: [[0, 0, 0, 0]]})
910 call popup_clear()
Bram Moolenaar10ccfb22021-02-13 21:31:18 +0100911
912 " this was causing an internal error
913 enew
914 set nowrap
915 call repeat('x', &columns)->setline(1)
916 call prop_type_add('textprop', {})
917 call prop_add(1, 1, #{length: &columns, type: 'textprop'})
918 vsplit
919 let opts = popup_create('', #{textprop: 'textprop'})
920 \ ->popup_getoptions()
921 \ ->extend(#{mask: [[1, 1, 1, 1]]})
922 call popup_create('', opts)
923 redraw
924
925 close!
926 bwipe!
927 call prop_type_delete('textprop')
928 call popup_clear()
929 set wrap&
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200930endfunc
931
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200932func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200933 CheckScreendump
934 CheckFeature clipboard_working
935
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200936 " create a popup with some text to be selected
937 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200938 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200939 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200940 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200941 \ drag: 1,
942 \ border: [],
943 \ line: 3,
944 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200945 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200946 \ })
947 func Select1()
948 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
949 endfunc
950 map <silent> <F3> :call test_setmouse(4, 15)<CR>
951 map <silent> <F4> :call test_setmouse(6, 23)<CR>
952 END
953 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200954 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200955 call term_sendkeys(buf, ":call Select1()\<CR>")
956 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
957
958 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
959 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200960 " clean the command line, sometimes it still shows a command
961 call term_sendkeys(buf, ":\<esc>")
962
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200963 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
964
965 " clean up
966 call StopVimInTerminal(buf)
967 call delete('XtestPopupSelect')
968endfunc
969
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200970func Test_popup_in_tab()
971 " default popup is local to tab, not visible when in other tab
972 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200973 let bufnr = winbufnr(winid)
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(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200976 tabnew
977 call assert_equal(0, 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 Moolenaar7c7f01e2019-06-12 21:06:32 +0200981
982 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200983 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200984 " buffer is gone now
985 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200986
987 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200988 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200989 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200990 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200991 tabnew
992 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200993 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200994 quit
995 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200996 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200997
998 " create popup in other tab
999 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001000 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +02001001 call assert_equal(0, popup_getpos(winid).visible)
1002 call assert_equal(1, popup_getoptions(winid).tabpage)
1003 quit
1004 call assert_equal(1, popup_getpos(winid).visible)
1005 call assert_equal(0, popup_getoptions(winid).tabpage)
1006 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001007endfunc
1008
1009func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001010 call assert_equal(0, len(popup_list()))
1011
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001012 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001013 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001014 let pos = popup_getpos(winid)
1015 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001016 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001017 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001018
1019 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001020 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001021 let pos = popup_getpos(winid)
1022 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001023 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001024
1025 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001026 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001027 let pos = popup_getpos(winid)
1028 let around = (&columns - pos.width) / 2
1029 call assert_inrange(around - 1, around + 1, pos.col)
1030 let around = (&lines - pos.height) / 2
1031 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001032 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001033endfunc
1034
1035func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02001036 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001037 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001038 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001039 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001040 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
1041 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
1042 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001043
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001044 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001045 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001046 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001047 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001048 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001049 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001050 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001051 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001052
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001053 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001054 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001055 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001056 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001057 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001058 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001059 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001060 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001061
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001062 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
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", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001065 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001066 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001067 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001068 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001069 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +02001070 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
1071 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001072 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001073 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001074
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001075 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001076 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001077 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001078 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001079 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001080 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +01001081 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
1082 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001083 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
1084 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +01001085 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
1086 call popup_clear()
1087 call popup_create("text", #{mask: [range(4)]})
1088 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001089 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001090 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001091 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001092 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
1093 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001094endfunc
1095
Bram Moolenaareea16992019-05-31 17:34:48 +02001096func Test_win_execute_closing_curwin()
1097 split
1098 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001099 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001100 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +01001101
1102 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001103 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 +01001104 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001105endfunc
1106
1107func Test_win_execute_not_allowed()
1108 let winid = popup_create('some text', {})
1109 call assert_fails('call win_execute(winid, "split")', 'E994:')
1110 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1111 call assert_fails('call win_execute(winid, "close")', 'E994:')
1112 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001113 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001114 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1115 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1116 call assert_fails('call win_execute(winid, "next")', 'E994:')
1117 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001118 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001119 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001120 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1121 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1122 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1123 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001124 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1125 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001126 call assert_fails('call win_execute(winid, "help")', 'E994:')
1127 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001128 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1129 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1130 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1131 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001132 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001133endfunc
1134
Bram Moolenaar402502d2019-05-30 22:07:36 +02001135func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001136 CheckScreendump
1137
Bram Moolenaar402502d2019-05-30 22:07:36 +02001138 let lines =<< trim END
1139 call setline(1, range(1, 100))
1140 let winid = popup_create(
1141 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001142 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001143 END
1144 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001145 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001146 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1147
1148 " clean up
1149 call StopVimInTerminal(buf)
1150 call delete('XtestPopup')
1151endfunc
1152
1153func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001154 CheckScreendump
1155
Bram Moolenaar402502d2019-05-30 22:07:36 +02001156 let lines =<< trim END
1157 call setline(1, range(1, 100))
1158 let winid = popup_create(
1159 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001160 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001161 END
1162 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001163 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001164 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1165
1166 " clean up
1167 call StopVimInTerminal(buf)
1168 call delete('XtestPopup')
1169endfunc
1170
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001171func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001172 CheckScreendump
1173
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001174 let lines =<< trim END
1175 set showbreak=>>\
1176 call setline(1, range(1, 20))
1177 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001178 \ 'a long line here that wraps',
1179 \ #{filter: 'popup_filter_yesno',
1180 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001181 END
1182 call writefile(lines, 'XtestPopupShowbreak')
1183 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1184 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1185
1186 " clean up
1187 call term_sendkeys(buf, "y")
1188 call StopVimInTerminal(buf)
1189 call delete('XtestPopupShowbreak')
1190endfunc
1191
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001192func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001193 CheckFeature timers
1194
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001195 topleft vnew
1196 call setline(1, 'hello')
1197
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001198 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001199 \ line: 1,
1200 \ col: 1,
1201 \ minwidth: 20,
1202 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001203 \})
1204 redraw
1205 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1206 call assert_equal('world', line)
1207
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001208 call assert_equal(winid, popup_locate(1, 1))
1209 call assert_equal(winid, popup_locate(1, 20))
1210 call assert_equal(0, popup_locate(1, 21))
1211 call assert_equal(0, popup_locate(2, 1))
1212
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001213 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001214 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001215 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001216 call assert_equal('hello', line)
1217
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001218 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001219 \ line: &lines,
1220 \ col: 10,
1221 \ minwidth: 20,
1222 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001223 \})
1224 redraw
1225 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1226 call assert_match('.*on the command line.*', line)
1227
1228 sleep 700m
1229 redraw
1230 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1231 call assert_notmatch('.*on the command line.*', line)
1232
1233 bwipe!
1234endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001235
1236func Test_popup_hide()
1237 topleft vnew
1238 call setline(1, 'hello')
1239
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001240 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001241 \ line: 1,
1242 \ col: 1,
1243 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001244 \})
1245 redraw
1246 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1247 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001248 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001249 " buffer is still listed and active
1250 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001251
1252 call popup_hide(winid)
1253 redraw
1254 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1255 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001256 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001257 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001258 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001259
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001260 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001261 redraw
1262 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1263 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001264 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001265
1266
1267 call popup_close(winid)
1268 redraw
1269 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1270 call assert_equal('hello', line)
1271
1272 " error is given for existing non-popup window
1273 call assert_fails('call popup_hide(win_getid())', 'E993:')
1274
1275 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001276 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001277 call popup_show(41234234)
1278
1279 bwipe!
1280endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001281
1282func Test_popup_move()
1283 topleft vnew
1284 call setline(1, 'hello')
1285
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001286 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001287 \ line: 1,
1288 \ col: 1,
1289 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001290 \})
1291 redraw
1292 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1293 call assert_equal('world ', line)
1294
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001295 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001296 redraw
1297 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1298 call assert_equal('hello ', line)
1299 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1300 call assert_equal('~world', line)
1301
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001302 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001303 redraw
1304 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1305 call assert_equal('hworld', line)
1306
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001307 call assert_fails('call popup_move(winid, [])', 'E715:')
1308 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1309
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001310 call popup_close(winid)
1311
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001312 call assert_equal(0, popup_move(-1, {}))
1313
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001314 bwipe!
1315endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001316
Bram Moolenaar402502d2019-05-30 22:07:36 +02001317func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001318 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001319 \ line: 2,
1320 \ col: 3,
1321 \ minwidth: 10,
1322 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001323 \})
1324 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001325 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001326 call assert_equal(2, res.line)
1327 call assert_equal(3, res.col)
1328 call assert_equal(10, res.width)
1329 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001330 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001331
1332 call popup_close(winid)
1333endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001334
1335func Test_popup_width_longest()
1336 let tests = [
1337 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1338 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1339 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1340 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1341 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1342 \ ]
1343
1344 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001345 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001346 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001347 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001348 call assert_equal(test[1], position.width)
1349 call popup_close(winid)
1350 endfor
1351endfunc
1352
1353func Test_popup_wraps()
1354 let tests = [
1355 \ ['nowrap', 6, 1],
1356 \ ['a line that wraps once', 12, 2],
1357 \ ['a line that wraps two times', 12, 3],
1358 \ ]
1359 for test in tests
1360 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001361 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001362 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001363 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001364 call assert_equal(test[1], position.width)
1365 call assert_equal(test[2], position.height)
1366
1367 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001368 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001369 endfor
1370endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001371
1372func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001373 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001374 \ line: 2,
1375 \ col: 3,
1376 \ minwidth: 10,
1377 \ minheight: 11,
1378 \ maxwidth: 20,
1379 \ maxheight: 21,
1380 \ zindex: 100,
1381 \ time: 5000,
1382 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001383 \})
1384 redraw
1385 let res = popup_getoptions(winid)
1386 call assert_equal(2, res.line)
1387 call assert_equal(3, res.col)
1388 call assert_equal(10, res.minwidth)
1389 call assert_equal(11, res.minheight)
1390 call assert_equal(20, res.maxwidth)
1391 call assert_equal(21, res.maxheight)
1392 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001393 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001394 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001395 if has('timers')
1396 call assert_equal(5000, res.time)
1397 endif
1398 call popup_close(winid)
1399
1400 let winid = popup_create('hello', {})
1401 redraw
1402 let res = popup_getoptions(winid)
1403 call assert_equal(0, res.line)
1404 call assert_equal(0, res.col)
1405 call assert_equal(0, res.minwidth)
1406 call assert_equal(0, res.minheight)
1407 call assert_equal(0, res.maxwidth)
1408 call assert_equal(0, res.maxheight)
1409 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001410 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001411 if has('timers')
1412 call assert_equal(0, res.time)
1413 endif
1414 call popup_close(winid)
1415 call assert_equal({}, popup_getoptions(winid))
1416endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001417
1418func Test_popup_option_values()
1419 new
1420 " window-local
1421 setlocal number
1422 setlocal nowrap
1423 " buffer-local
1424 setlocal omnifunc=Something
1425 " global/buffer-local
1426 setlocal path=/there
1427 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001428 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001429
1430 let winid = popup_create('hello', {})
1431 call assert_equal(0, getwinvar(winid, '&number'))
1432 call assert_equal(1, getwinvar(winid, '&wrap'))
1433 call assert_equal('', getwinvar(winid, '&omnifunc'))
1434 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001435 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1436
1437 " 'scrolloff' is reset to zero
1438 call assert_equal(5, &scrolloff)
1439 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001440
1441 call popup_close(winid)
1442 bwipe
1443endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001444
1445func Test_popup_atcursor()
1446 topleft vnew
1447 call setline(1, [
1448 \ 'xxxxxxxxxxxxxxxxx',
1449 \ 'xxxxxxxxxxxxxxxxx',
1450 \ 'xxxxxxxxxxxxxxxxx',
1451 \])
1452
1453 call cursor(2, 2)
1454 redraw
1455 let winid = popup_atcursor('vim', {})
1456 redraw
1457 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1458 call assert_equal('xvimxxxxxxxxxxxxx', line)
1459 call popup_close(winid)
1460
1461 call cursor(3, 4)
1462 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001463 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001464 redraw
1465 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1466 call assert_equal('xxxvimxxxxxxxxxxx', line)
1467 call popup_close(winid)
1468
1469 call cursor(1, 1)
1470 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001471 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001472 \ line: 'cursor+2',
1473 \ col: 'cursor+1',
1474 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001475 redraw
1476 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1477 call assert_equal('xvimxxxxxxxxxxxxx', line)
1478 call popup_close(winid)
1479
1480 call cursor(3, 3)
1481 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001482 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001483 \ line: 'cursor-2',
1484 \ col: 'cursor-1',
1485 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001486 redraw
1487 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1488 call assert_equal('xvimxxxxxxxxxxxxx', line)
1489 call popup_close(winid)
1490
Bram Moolenaar402502d2019-05-30 22:07:36 +02001491 " just enough room above
1492 call cursor(3, 3)
1493 redraw
1494 let winid = popup_atcursor(['vim', 'is great'], {})
1495 redraw
1496 let pos = popup_getpos(winid)
1497 call assert_equal(1, pos.line)
1498 call popup_close(winid)
1499
1500 " not enough room above, popup goes below the cursor
1501 call cursor(3, 3)
1502 redraw
1503 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1504 redraw
1505 let pos = popup_getpos(winid)
1506 call assert_equal(4, pos.line)
1507 call popup_close(winid)
1508
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001509 " cursor in first line, popup in line 2
1510 call cursor(1, 1)
1511 redraw
1512 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1513 redraw
1514 let pos = popup_getpos(winid)
1515 call assert_equal(2, pos.line)
1516 call popup_close(winid)
1517
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001518 bwipe!
1519endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001520
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001521func Test_popup_atcursor_pos()
1522 CheckScreendump
Dominique Pellec60e9592021-07-03 21:41:38 +02001523 CheckFeature conceal
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001524
1525 let lines =<< trim END
1526 call setline(1, repeat([repeat('-', 60)], 15))
1527 set so=0
1528
1529 normal 9G3|r#
1530 let winid1 = popup_atcursor(['first', 'second'], #{
1531 \ moved: [0, 0, 0],
1532 \ })
1533 normal 9G21|r&
1534 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1535 \ pos: 'botright',
1536 \ moved: [0, 0, 0],
1537 \ })
1538 normal 3G27|r%
1539 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1540 \ pos: 'topleft',
1541 \ moved: [0, 0, 0],
1542 \ })
1543 normal 3G45|r@
1544 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1545 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001546 \ moved: range(3),
1547 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001548 \ })
Bram Moolenaarea042672021-06-29 20:22:32 +02001549
1550 normal 9G27|Rconcealed X
1551 syn match Hidden /concealed/ conceal
1552 set conceallevel=2 concealcursor=n
1553 redraw
1554 normal 0fX
1555 call popup_atcursor('mark', {})
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001556 END
1557 call writefile(lines, 'XtestPopupAtcursorPos')
1558 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1559 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1560
1561 " clean up
1562 call StopVimInTerminal(buf)
1563 call delete('XtestPopupAtcursorPos')
1564endfunc
1565
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001566func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001567 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001568 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001569
1570 let lines =<< trim END
1571 call setline(1, range(1, 20))
1572 call setline(5, 'here is some text to hover over')
1573 set balloonevalterm
1574 set balloonexpr=BalloonExpr()
1575 set balloondelay=100
1576 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001577 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001578 return ''
1579 endfunc
1580 func Hover()
1581 call test_setmouse(5, 15)
1582 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1583 sleep 100m
1584 endfunc
1585 func MoveOntoPopup()
1586 call test_setmouse(4, 17)
1587 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1588 endfunc
1589 func MoveAway()
1590 call test_setmouse(5, 13)
1591 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1592 endfunc
1593 END
1594 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001595 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001596 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001597 call term_sendkeys(buf, 'j')
1598 call term_sendkeys(buf, ":call Hover()\<CR>")
1599 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1600
1601 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1602 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1603
1604 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1605 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1606
1607 " clean up
1608 call StopVimInTerminal(buf)
1609 call delete('XtestPopupBeval')
1610endfunc
1611
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001612func Test_popup_filter()
1613 new
1614 call setline(1, 'some text')
1615
1616 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001617 if a:c == 'e' || a:c == "\<F9>"
1618 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001619 return 1
1620 endif
1621 if a:c == '0'
1622 let g:ignored = '0'
1623 return 0
1624 endif
1625 if a:c == 'x'
1626 call popup_close(a:winid)
1627 return 1
1628 endif
1629 return 0
1630 endfunc
1631
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001632 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001633 redraw
1634
1635 " e is consumed by the filter
Bram Moolenaar999db232021-07-04 14:00:55 +02001636 let g:eaten = ''
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001637 call feedkeys('e', 'xt')
1638 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001639 call feedkeys("\<F9>", 'xt')
1640 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001641
1642 " 0 is ignored by the filter
Bram Moolenaar999db232021-07-04 14:00:55 +02001643 let g:ignored = ''
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001644 normal $
1645 call assert_equal(9, getcurpos()[2])
1646 call feedkeys('0', 'xt')
1647 call assert_equal('0', g:ignored)
Bram Moolenaar999db232021-07-04 14:00:55 +02001648
1649 if has('win32') && has('gui_running')
1650 echo "FIXME: this check is very flaky on MS-Windows GUI, the cursor doesn't move"
1651 else
1652 call assert_equal(1, getcurpos()[2])
1653 endif
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001654
1655 " x closes the popup
1656 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001657 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001658 call assert_equal(-1, winbufnr(winid))
1659
Bram Moolenaar999db232021-07-04 14:00:55 +02001660 unlet g:eaten
1661 unlet g:ignored
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001662 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001663 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001664endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001665
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001666" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001667func Test_popup_filter_normal_cmd()
1668 CheckScreendump
1669
1670 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001671 let text = range(1, 20)->map({_, v -> string(v)})
1672 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1673 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001674 END
1675 call writefile(lines, 'XtestPopupNormal')
1676 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1677 call TermWait(buf, 100)
1678 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1679
1680 call StopVimInTerminal(buf)
1681 call delete('XtestPopupNormal')
1682endfunc
1683
Bram Moolenaar10476522020-09-24 22:57:31 +02001684" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001685func Test_popup_filter_win_execute()
1686 CheckScreendump
1687
1688 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001689 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1690 let g:id = popup_create(lines, #{
1691 \ minheight: &lines - 5,
1692 \ maxheight: &lines - 5,
1693 \ cursorline: 1,
1694 \ })
1695 redraw
1696 END
1697 call writefile(lines, 'XtestPopupWinExecute')
1698 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1699
1700 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1701 call term_sendkeys(buf, ":\<CR>")
1702
1703 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1704
1705 call StopVimInTerminal(buf)
1706 call delete('XtestPopupWinExecute')
1707endfunc
1708
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001709func Test_popup_set_firstline()
1710 CheckScreendump
1711
1712 let lines =<< trim END
1713 let lines = range(1, 50)->map({_, v -> string(v)})
1714 let g:id = popup_create(lines, #{
1715 \ minwidth: 20,
1716 \ maxwidth: 20,
1717 \ minheight: &lines - 5,
1718 \ maxheight: &lines - 5,
1719 \ cursorline: 1,
1720 \ })
1721 call popup_setoptions(g:id, #{firstline: 10})
1722 redraw
1723 END
1724 call writefile(lines, 'XtestPopupWinSetFirstline')
1725 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1726
1727 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1728
1729 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1730 call term_sendkeys(buf, ":\<CR>")
1731 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1732
1733 call StopVimInTerminal(buf)
1734 call delete('XtestPopupWinSetFirstline')
1735endfunc
1736
Bram Moolenaar10476522020-09-24 22:57:31 +02001737" this tests that we don't get stuck with an error in "win_execute()"
1738func Test_popup_filter_win_execute_error()
1739 CheckScreendump
1740
1741 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001742 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1743 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1744 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001745 call writefile(lines, 'XtestPopupWinExecuteError')
1746 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001747
1748 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1749 call term_sendkeys(buf, "\<CR>")
1750 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1751 call term_sendkeys(buf, "\<CR>")
1752 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1753 call term_sendkeys(buf, "\<CR>")
1754 call term_sendkeys(buf, "\<CR>")
1755 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1756
1757 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001758 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001759endfunc
1760
Bram Moolenaara42d9452019-06-15 21:46:30 +02001761func ShowDialog(key, result)
1762 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001763 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001764 \ filter: 'popup_filter_yesno',
1765 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001766 \ })
1767 redraw
1768 call feedkeys(a:key, "xt")
1769 call assert_equal(winid, s:cb_winid)
1770 call assert_equal(a:result, s:cb_res)
1771endfunc
1772
1773func Test_popup_dialog()
1774 func QuitCallback(id, res)
1775 let s:cb_winid = a:id
1776 let s:cb_res = a:res
1777 endfunc
1778
1779 let winid = ShowDialog("y", 1)
1780 let winid = ShowDialog("Y", 1)
1781 let winid = ShowDialog("n", 0)
1782 let winid = ShowDialog("N", 0)
1783 let winid = ShowDialog("x", 0)
1784 let winid = ShowDialog("X", 0)
1785 let winid = ShowDialog("\<Esc>", 0)
1786 let winid = ShowDialog("\<C-C>", -1)
1787
1788 delfunc QuitCallback
1789endfunc
1790
Bram Moolenaara730e552019-06-16 19:05:31 +02001791func ShowMenu(key, result)
1792 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001793 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001794 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001795 \ })
1796 redraw
1797 call feedkeys(a:key, "xt")
1798 call assert_equal(winid, s:cb_winid)
1799 call assert_equal(a:result, s:cb_res)
1800endfunc
1801
1802func Test_popup_menu()
1803 func QuitCallback(id, res)
1804 let s:cb_winid = a:id
1805 let s:cb_res = a:res
1806 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001807 " mapping won't be used in popup
1808 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001809
1810 let winid = ShowMenu(" ", 1)
1811 let winid = ShowMenu("j \<CR>", 2)
1812 let winid = ShowMenu("JjK \<CR>", 2)
1813 let winid = ShowMenu("jjjjjj ", 3)
1814 let winid = ShowMenu("kkk ", 1)
1815 let winid = ShowMenu("x", -1)
1816 let winid = ShowMenu("X", -1)
1817 let winid = ShowMenu("\<Esc>", -1)
1818 let winid = ShowMenu("\<C-C>", -1)
1819
1820 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001821 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001822endfunc
1823
1824func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001825 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001826
1827 let lines =<< trim END
1828 call setline(1, range(1, 20))
1829 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001830 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001831 func MenuDone(id, res)
1832 echomsg "selected " .. a:res
1833 endfunc
1834 END
1835 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001836 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001837 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1838
1839 call term_sendkeys(buf, "jj")
1840 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1841
1842 call term_sendkeys(buf, " ")
1843 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1844
1845 " clean up
1846 call StopVimInTerminal(buf)
1847 call delete('XtestPopupMenu')
1848endfunc
1849
Bram Moolenaarf914a332019-07-20 15:09:56 +02001850func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001851 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001852
1853 let lines =<< trim END
1854 call setline(1, range(1, 20))
1855 hi PopupSelected ctermbg=green
1856 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1857 func MenuDone(id, res)
1858 echomsg "selected " .. a:res
1859 endfunc
1860 END
1861 call writefile(lines, 'XtestPopupNarrowMenu')
1862 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1863 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1864
1865 " clean up
1866 call term_sendkeys(buf, "x")
1867 call StopVimInTerminal(buf)
1868 call delete('XtestPopupNarrowMenu')
1869endfunc
1870
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001871func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001872 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001873
1874 " Create a popup without title or border, a line of padding will be added to
1875 " put the title on.
1876 let lines =<< trim END
1877 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001878 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001879 END
1880 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001881 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001882 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1883
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001884 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1885 call term_sendkeys(buf, ":\<CR>")
1886 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1887
1888 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1889 call term_sendkeys(buf, ":\<CR>")
1890 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1891
Bram Moolenaar3ae50c72020-12-12 18:18:06 +01001892 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1893 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, padding: [2, 2, 2, 2]})\<CR>")
1894 call term_sendkeys(buf, ":\<CR>")
1895 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_3', {})
1896
1897 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1898 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, border: [], padding: [2, 2, 2, 2]})\<CR>")
1899 call term_sendkeys(buf, ":\<CR>")
1900 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_4', {})
1901
Ralf Schandlbc869872021-05-28 14:12:14 +02001902 call term_sendkeys(buf, ":call popup_clear()\<CR>")
rbtnnc6119412021-08-07 13:08:45 +02001903 call term_sendkeys(buf, ":call popup_menu(['This is a line', 'and another line'], #{title: '▶Äあいうえお◀', })\<CR>")
Ralf Schandlbc869872021-05-28 14:12:14 +02001904 call VerifyScreenDump(buf, 'Test_popupwin_multibytetitle', {})
1905 call term_sendkeys(buf, "x")
1906
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001907 " clean up
1908 call StopVimInTerminal(buf)
1909 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001910
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001911 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001912 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001913 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001914 call assert_equal('Another Title', popup_getoptions(winid).title)
1915
1916 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001917endfunc
1918
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001919func Test_popup_close_callback()
1920 func PopupDone(id, result)
1921 let g:result = a:result
1922 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001923 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001924 redraw
1925 call popup_close(winid, 'done')
1926 call assert_equal('done', g:result)
1927endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001928
1929func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001930 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001931 redraw
1932 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001933 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001934 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001935 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001936
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001937 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001938 redraw
1939 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001940 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001941 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001942 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001943endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001944
1945func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001946 CheckScreendump
1947
Bram Moolenaar988c4332019-06-02 14:12:11 +02001948 " +-----------------------------+
1949 " | | |
1950 " | | |
1951 " | | |
1952 " | line1 |
1953 " |------------line2------------|
1954 " | line3 |
1955 " | line4 |
1956 " | |
1957 " | |
1958 " +-----------------------------+
1959 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001960 split
1961 vsplit
1962 let info_window1 = getwininfo()[0]
1963 let line = info_window1['height']
1964 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001965 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001966 \ line : line,
1967 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001968 \ })
1969 END
1970 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001971 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001972 call term_sendkeys(buf, "\<C-W>w")
1973 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1974
1975 " clean up
1976 call StopVimInTerminal(buf)
1977 call delete('XtestPopupBehind')
1978endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001979
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001980func s:VerifyPosition(p, msg, line, col, width, height)
1981 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1982 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1983 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1984 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001985endfunc
1986
1987func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001988 " Anything placed past the last cell on the right of the screen is moved to
1989 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001990 "
1991 " When wrapping is disabled, we also shift to the left to display on the
1992 " screen, unless fixed is set.
1993
1994 " Entries for cases which don't vary based on wrapping.
1995 " Format is per tests described below
1996 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001997 \ ['a', 5, &columns, 5, &columns, 1, 1],
1998 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1999 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002000 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002001 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002002
2003 " these test groups are dicts with:
2004 " - comment: something to identify the group of tests by
2005 " - options: dict of options to merge with the row/col in tests
2006 " - tests: list of cases. Each one is a list with elements:
2007 " - text
2008 " - row
2009 " - col
2010 " - expected row
2011 " - expected col
2012 " - expected width
2013 " - expected height
2014 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002015 \ #{
2016 \ comment: 'left-aligned with wrapping',
2017 \ options: #{
2018 \ wrap: 1,
2019 \ pos: 'botleft',
2020 \ },
2021 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002022 \ ['aa', 5, &columns, 4, &columns, 1, 2],
2023 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
2024 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2025 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
2026 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
2027 \
2028 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
2029 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
2030 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
2031 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2032 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2033 \
2034 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
2035 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
2036 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002037 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
2038 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002039 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002040 \ ],
2041 \ },
2042 \ #{
2043 \ comment: 'left aligned without wrapping',
2044 \ options: #{
2045 \ wrap: 0,
2046 \ pos: 'botleft',
2047 \ },
2048 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002049 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
2050 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
2051 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2052 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
2053 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
2054 \
2055 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
2056 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
2057 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
2058 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2059 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2060 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002061 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
2062 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
2063 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
2064 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
2065 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2066 \ ],
2067 \ },
2068 \ #{
2069 \ comment: 'left aligned with fixed position',
2070 \ options: #{
2071 \ wrap: 0,
2072 \ fixed: 1,
2073 \ pos: 'botleft',
2074 \ },
2075 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01002076 \ ['aa', 5, &columns, 5, &columns, 1, 1],
2077 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
2078 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2079 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
2080 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
2081 \
2082 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
2083 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
2084 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2085 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2086 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2087 \
2088 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
2089 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
2090 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002091 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2092 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2093 \ ],
2094 \ },
2095 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002096
2097 for test_group in tests
2098 for test in test_group.tests
2099 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002100 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002101 \ line: line,
2102 \ col: col,
2103 \ }
2104 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002105
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002106 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002107
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002108 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002109 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
2110 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002111 endfor
2112 endfor
2113
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002114 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002115 %bwipe!
2116endfunc
2117
Bram Moolenaar3397f742019-06-02 18:40:06 +02002118func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002119 " width of screen
2120 let X = join(map(range(&columns), {->'X'}), '')
2121
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002122 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2123 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002124
2125 redraw
2126 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2127 call assert_equal(X, line)
2128
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002129 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002130 redraw
2131
2132 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002133 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
2134 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002135
2136 redraw
2137 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2138 call assert_equal(X, line)
2139
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002140 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002141 redraw
2142
2143 " Extend so > window width
2144 let X .= 'x'
2145
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002146 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2147 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 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 call assert_equal(X[ : -2 ], line)
2152
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002153 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002154 redraw
2155
2156 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002157 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2158 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002159
2160 redraw
2161 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2162 call assert_equal(X[ : -2 ], line)
2163
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002164 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002165 redraw
2166
2167 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002168 let p = popup_create(X,
2169 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2170 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002171
2172 redraw
2173 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2174 let e_line = ' ' . X[ 1 : -2 ]
2175 call assert_equal(e_line, line)
2176
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002177 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002178 redraw
2179
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002180 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002181 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002182endfunc
2183
2184func Test_popup_moved()
2185 new
2186 call test_override('char_avail', 1)
2187 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2188
2189 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002190 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002191 redraw
2192 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002193 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002194 " trigger the check for last_cursormoved by going into insert mode
2195 call feedkeys("li\<Esc>", 'xt')
2196 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002197 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002198
2199 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002200 let winid = popup_atcursor('text', #{moved: 'word'})
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([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002204 call feedkeys("hi\<Esc>", 'xt')
2205 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002206 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002207
2208 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002209 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002210 redraw
2211 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002212 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002213 call feedkeys("li\<Esc>", 'xt')
2214 call assert_equal(1, popup_getpos(winid).visible)
2215 call feedkeys("ei\<Esc>", 'xt')
2216 call assert_equal(1, popup_getpos(winid).visible)
2217 call feedkeys("eli\<Esc>", 'xt')
2218 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002219 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002220
Bram Moolenaar17627312019-06-02 19:53:44 +02002221 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002222 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002223 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002224 redraw
2225 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002226 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002227 call feedkeys("eli\<Esc>", 'xt')
2228 call assert_equal(1, popup_getpos(winid).visible)
2229 call feedkeys("wi\<Esc>", 'xt')
2230 call assert_equal(1, popup_getpos(winid).visible)
2231 call feedkeys("Eli\<Esc>", 'xt')
2232 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002233 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002234
2235 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002236 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002237 redraw
2238 call assert_equal(1, popup_getpos(winid).visible)
2239 call feedkeys("eli\<Esc>", 'xt')
2240 call feedkeys("ei\<Esc>", 'xt')
2241 call assert_equal(1, popup_getpos(winid).visible)
2242 call feedkeys("eli\<Esc>", 'xt')
2243 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002244 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002245
2246 bwipe!
2247 call test_override('ALL', 0)
2248endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002249
2250func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002251 CheckFeature timers
2252 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002253
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002254 let lines =<< trim END
2255 call setline(1, range(1, 20))
2256 hi Notification ctermbg=lightblue
2257 call popup_notification('first notification', {})
2258 END
2259 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002260 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002261 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2262
2263 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002264 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2265 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002266 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2267
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002268 " clean up
2269 call StopVimInTerminal(buf)
2270 call delete('XtestNotifications')
2271endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002272
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002273func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002274 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002275
2276 let lines =<< trim END
2277 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002278 hi ScrollThumb ctermbg=blue
2279 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002280 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002281 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002282 \ minwidth: 8,
2283 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002284 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002285 func ScrollUp()
2286 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2287 endfunc
2288 func ScrollDown()
2289 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2290 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002291 func ClickTop()
2292 call feedkeys("\<F4>\<LeftMouse>", "xt")
2293 endfunc
2294 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002295 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002296 call feedkeys("\<F5>\<LeftMouse>", "xt")
2297 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002298 func Popup_filter(winid, key)
2299 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002300 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002301 let line = popup_getoptions(a:winid).firstline
2302 let nlines = line('$', a:winid)
2303 let newline = line < nlines ? (line + 1) : nlines
2304 call popup_setoptions(a:winid, #{firstline: newline})
2305 return v:true
2306 elseif a:key == 'x'
2307 call popup_close(a:winid)
2308 return v:true
2309 endif
2310 endfunc
2311
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002312 def CreatePopup(text: list<string>)
Bram Moolenaare0de1712020-12-02 17:36:54 +01002313 popup_create(text, {
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002314 \ minwidth: 30,
2315 \ maxwidth: 30,
2316 \ minheight: 4,
2317 \ maxheight: 4,
2318 \ firstline: 1,
2319 \ lastline: 4,
2320 \ wrap: true,
2321 \ scrollbar: true,
2322 \ mapping: false,
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002323 \ filter: g:Popup_filter,
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002324 \ })
2325 enddef
2326
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002327 func PopupScroll()
2328 call popup_clear()
2329 let text =<< trim END
2330 1
2331 2
2332 3
2333 4
2334 long line long line long line long line long line long line
2335 long line long line long line long line long line long line
2336 long line long line long line long line long line long line
2337 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002338 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002339 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002340 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002341 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2342 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002343 END
2344 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002345 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002346 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2347
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002348 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002349 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002350 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2351
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002352 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002353 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002354 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2355
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002356 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002357 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002358 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2359
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002360 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002361 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002362 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2363 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2364
2365 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2366 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2367
2368 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002369 " wait a bit, otherwise it fails sometimes (double click recognized?)
2370 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002371 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2372 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2373
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002374 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2375 sleep 100m
2376 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2377 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2378
2379 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2380 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2381
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002382 " remove the minwidth and maxheight
2383 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002384 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002385 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2386
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002387 " check size with non-wrapping lines
Bram Moolenaar848fadd2022-01-30 15:28:30 +00002388 call term_sendkeys(buf, ":call g:PopupScroll()\<CR>")
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002389 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2390
2391 " check size with wrapping lines
2392 call term_sendkeys(buf, "j")
2393 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002394
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002395 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002396 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002397 call StopVimInTerminal(buf)
2398 call delete('XtestPopupScroll')
2399endfunc
2400
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002401func Test_popup_too_high_scrollbar()
2402 CheckScreendump
2403
2404 let lines =<< trim END
2405 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2406 set scrolloff=0
2407 func ShowPopup()
2408 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2409 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2410 \ minwidth: 8,
2411 \ border: [],
2412 \ })
2413 endfunc
2414 normal 3G$
2415 call ShowPopup()
2416 END
2417 call writefile(lines, 'XtestPopupToohigh')
2418 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2419 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2420
2421 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2422 call term_sendkeys(buf, "8G$")
2423 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2424 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2425
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002426 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2427 call term_sendkeys(buf, "gg$")
2428 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2429 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2430
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002431 " clean up
2432 call StopVimInTerminal(buf)
2433 call delete('XtestPopupToohigh')
2434endfunc
2435
Bram Moolenaar437a7462019-07-05 20:17:22 +02002436func Test_popup_fitting_scrollbar()
2437 " this was causing a crash, divide by zero
2438 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002439 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002440 \ scrollbar: 1,
2441 \ maxwidth: 10,
2442 \ maxheight: 5,
2443 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002444 redraw
2445 call popup_clear()
2446endfunc
2447
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002448func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002449 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002450
2451 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002452 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002453 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002454 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002455 END
2456
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002457 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002458 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002459 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2460
2461 " Setting to empty string clears it
2462 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2463 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2464
2465 " Setting a list
2466 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2467 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2468
2469 " Shrinking with a list
2470 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2471 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2472
2473 " Growing with a list
2474 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2475 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2476
2477 " Empty list clears
2478 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2479 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2480
2481 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002482 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002483 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2484
Bram Moolenaarb0992022020-01-30 14:55:42 +01002485 " range() (doesn't work)
2486 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2487 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2488
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002489 " clean up
2490 call StopVimInTerminal(buf)
2491 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002492endfunc
2493
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002494func Test_popup_settext_getline()
2495 let id = popup_create('', #{ tabpage: 0 })
2496 call popup_settext(id, ['a','b'])
2497 call assert_equal(2, line('$', id)) " OK :)
2498 call popup_close(id)
2499
2500 let id = popup_create('', #{ tabpage: -1 })
2501 call popup_settext(id, ['a','b'])
2502 call assert_equal(2, line('$', id)) " Fails :(
2503 call popup_close(id)
2504endfunc
2505
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002506func Test_popup_settext_null()
2507 let id = popup_create('', #{ tabpage: 0 })
2508 call popup_settext(id, test_null_list())
2509 call popup_close(id)
2510
2511 let id = popup_create('', #{ tabpage: 0 })
2512 call popup_settext(id, test_null_string())
2513 call popup_close(id)
2514endfunc
2515
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002516func Test_popup_hidden()
2517 new
2518
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002519 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002520 redraw
2521 call assert_equal(0, popup_getpos(winid).visible)
2522 call popup_close(winid)
2523
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002524 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002525 redraw
2526 call assert_equal(0, popup_getpos(winid).visible)
2527 call popup_close(winid)
2528
2529 func QuitCallback(id, res)
2530 let s:cb_winid = a:id
2531 let s:cb_res = a:res
2532 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002533 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002534 \ filter: 'popup_filter_yesno',
2535 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002536 \ })
2537 redraw
2538 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002539 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2540 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002541 exe "normal anot used by filter\<Esc>"
2542 call assert_equal('not used by filter', getline(1))
2543
2544 call popup_show(winid)
2545 call feedkeys('y', "xt")
2546 call assert_equal(1, s:cb_res)
2547
2548 bwipe!
2549 delfunc QuitCallback
2550endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002551
2552" Test options not checked elsewhere
2553func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002554 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002555 let options = popup_getoptions(winid)
2556 call assert_equal(1, options.wrap)
2557 call assert_equal(0, options.drag)
2558 call assert_equal('Beautiful', options.highlight)
2559
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002560 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002561 let options = popup_getoptions(winid)
2562 call assert_equal(0, options.wrap)
2563 call assert_equal(1, options.drag)
2564 call assert_equal('Another', options.highlight)
2565
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002566 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2567 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2568
Bram Moolenaarae943152019-06-16 22:54:14 +02002569 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002570 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002571endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002572
2573func Test_popupwin_garbage_collect()
2574 func MyPopupFilter(x, winid, c)
2575 " NOP
2576 endfunc
2577
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002578 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002579 call test_garbagecollect_now()
2580 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002581 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002582 call feedkeys('j', 'xt')
2583 call assert_true(v:true)
2584
2585 call popup_close(winid)
2586 delfunc MyPopupFilter
2587endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002588
Bram Moolenaar581ba392019-09-03 22:08:33 +02002589func Test_popupwin_filter_mode()
2590 func MyPopupFilter(winid, c)
2591 let s:typed = a:c
2592 if a:c == ':' || a:c == "\r" || a:c == 'v'
2593 " can start cmdline mode, get out, and start/stop Visual mode
2594 return 0
2595 endif
2596 return 1
2597 endfunc
2598
2599 " Normal, Visual and Insert mode
2600 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
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('y', s:typed)
2612 call assert_equal('something', @x) " yank command is filtered out
2613 call feedkeys('v', 'xt') " end Visual mode
2614
2615 call popup_close(winid)
2616
2617 " only Normal mode
2618 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2619 redraw
2620 call feedkeys('x', 'xt')
2621 call assert_equal('x', s:typed)
2622
2623 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2624 call assert_equal(':', s:typed)
2625 call assert_equal('foo', g:foo)
2626
2627 let @x = 'something'
2628 call feedkeys('v$"xy', 'xt')
2629 call assert_equal('v', s:typed)
2630 call assert_notequal('something', @x)
2631
2632 call popup_close(winid)
2633
2634 " default: all modes
2635 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2636 redraw
2637 call feedkeys('x', 'xt')
2638 call assert_equal('x', s:typed)
2639
2640 let g:foo = 'bar'
2641 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2642 call assert_equal("\r", s:typed)
2643 call assert_equal('bar', g:foo)
2644
2645 let @x = 'something'
2646 call feedkeys('v$"xy', 'xt')
2647 call assert_equal('y', s:typed)
2648 call assert_equal('something', @x) " yank command is filtered out
2649 call feedkeys('v', 'xt') " end Visual mode
2650
2651 call popup_close(winid)
2652 delfunc MyPopupFilter
2653endfunc
2654
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002655func Test_popupwin_filter_mouse()
2656 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002657 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002658 return 0
2659 endfunc
2660
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002661 call setline(1, ['.'->repeat(25)]->repeat(10))
2662 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2663 \ line: 2,
2664 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002665 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002666 \ padding: [],
2667 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002668 \ filter: 'MyPopupFilter',
2669 \ })
2670 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002671 " 123456789012345678901
2672 " 1 .....................
2673 " 2 ...+--------------+..
2674 " 3 ...| |..
2675 " 4 ...| short |..
2676 " 5 ...| long line th |..
2677 " 6 ...| at will wrap |..
2678 " 7 ...| other |..
2679 " 8 ...| |..
2680 " 9 ...+--------------+..
2681 " 10 .....................
2682 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002683
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002684 func AddItemOutsidePopup(tests, row, col)
2685 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2686 \ screenrow: a:row, screencol: a:col,
2687 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2688 \ line: a:row, column: a:col,
2689 \ }})
2690 endfunc
2691 func AddItemInPopupBorder(tests, winid, row, col)
2692 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2693 \ screenrow: a:row, screencol: a:col,
2694 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2695 \ line: 0, column: 0,
2696 \ }})
2697 endfunc
2698 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2699 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2700 \ screenrow: a:row, screencol: a:col,
2701 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2702 \ line: a:textline, column: a:textcol,
2703 \ }})
2704 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002705
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002706 " above and below popup
2707 for c in range(1, 21)
2708 call AddItemOutsidePopup(tests, 1, c)
2709 call AddItemOutsidePopup(tests, 10, c)
2710 endfor
2711 " left and right of popup
2712 for r in range(1, 10)
2713 call AddItemOutsidePopup(tests, r, 3)
2714 call AddItemOutsidePopup(tests, r, 20)
2715 endfor
2716 " top and bottom in popup
2717 for c in range(4, 19)
2718 call AddItemInPopupBorder(tests, winid, 2, c)
2719 call AddItemInPopupBorder(tests, winid, 3, c)
2720 call AddItemInPopupBorder(tests, winid, 8, c)
2721 call AddItemInPopupBorder(tests, winid, 9, c)
2722 endfor
2723 " left and right margin in popup
2724 for r in range(2, 9)
2725 call AddItemInPopupBorder(tests, winid, r, 4)
2726 call AddItemInPopupBorder(tests, winid, r, 5)
2727 call AddItemInPopupBorder(tests, winid, r, 18)
2728 call AddItemInPopupBorder(tests, winid, r, 19)
2729 endfor
2730 " text "short"
2731 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2732 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2733 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2734 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2735 " text "long line th"
2736 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2737 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2738 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2739 " text "at will wrap"
2740 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2741 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2742 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2743 " text "other"
2744 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2745 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2746 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2747 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002748
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002749 for item in tests
2750 call test_setmouse(item.clickrow, item.clickcol)
2751 call feedkeys("\<LeftMouse>", 'xt')
2752 call assert_equal(item.result, g:got_mousepos)
2753 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002754
2755 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002756 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002757 delfunc MyPopupFilter
2758endfunc
2759
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002760func Test_popupwin_with_buffer()
2761 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2762 let buf = bufadd('XsomeFile')
2763 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002764
2765 setlocal number
2766 call setbufvar(buf, "&wrapmargin", 13)
2767
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002768 let winid = popup_create(buf, {})
2769 call assert_notequal(0, winid)
2770 let pos = popup_getpos(winid)
2771 call assert_equal(2, pos.height)
2772 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002773
2774 " window-local option is set to default, buffer-local is not
2775 call assert_equal(0, getwinvar(winid, '&number'))
2776 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2777
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002778 call popup_close(winid)
2779 call assert_equal({}, popup_getpos(winid))
2780 call assert_equal(1, bufloaded(buf))
2781 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002782 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002783
2784 edit test_popupwin.vim
2785 let winid = popup_create(bufnr(''), {})
2786 redraw
2787 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002788 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002789endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002790
Bram Moolenaar188639d2022-04-04 16:57:21 +01002791func Test_popupwin_buffer_with_swapfile()
2792 call writefile(['some text', 'in a buffer'], 'XopenFile')
2793 call writefile([''], '.XopenFile.swp')
2794 let g:ignoreSwapExists = 1
2795
2796 let bufnr = bufadd('XopenFile')
2797 call assert_equal(0, bufloaded(bufnr))
2798 let winid = popup_create(bufnr, {'hidden': 1})
2799 call assert_equal(1, bufloaded(bufnr))
2800 call popup_close(winid)
2801
2802 exe 'buffer ' .. bufnr
2803 call assert_equal(1, &readonly)
2804 bwipe!
2805
2806 call delete('XopenFile')
2807 call delete('.XopenFile.swp')
2808 unlet g:ignoreSwapExists
2809endfunc
2810
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002811func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002812 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002813 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002814 " Starting a terminal to run a shell in is considered flaky.
2815 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002816
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002817 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002818
2819 " open help window to test that :help below fails
2820 help
2821
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002822 let termbuf = term_start(&shell, #{hidden: 1})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002823 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002824 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002825 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002826 " Wait for a prompt (see border char first, then space after prompt)
2827 call WaitForAssert({ -> assert_equal(' ', screenstring(screenrow(), screencol() - 1))})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002828
2829 " When typing a character, the cursor is after it.
2830 call feedkeys("x", 'xt')
Bram Moolenaar0353f562020-12-17 22:27:38 +01002831 call term_wait(termbuf)
Bram Moolenaarf5452692020-11-28 21:56:06 +01002832 redraw
2833 call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))})
2834 call feedkeys("\<BS>", 'xt')
2835
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002836 " Check this doesn't crash
2837 call assert_equal(winnr(), winnr('j'))
2838 call assert_equal(winnr(), winnr('k'))
2839 call assert_equal(winnr(), winnr('h'))
2840 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002841
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002842 " Cannot quit while job is running
2843 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002844
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002845 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002846 call feedkeys("xxx\<C-W>N", 'xt')
2847 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2848 call feedkeys("a\<C-U>", 'xt')
2849
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002850 " Cannot escape from terminal window
2851 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002852 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002853
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002854 " Cannot open a second one.
2855 let termbuf2 = term_start(&shell, #{hidden: 1})
2856 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2857 call term_sendkeys(termbuf2, "exit\<CR>")
2858
Bram Moolenaard28950f2022-05-29 14:13:04 +01002859 " Exiting shell puts popup window in Terminal-Normal mode.
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002860 call feedkeys("exit\<CR>", 'xt')
2861 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002862 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002863
Bram Moolenaar349f6092020-10-06 20:46:49 +02002864 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002865 call feedkeys(":quit\<CR>", 'xt')
2866 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002867endfunc
2868
Bram Moolenaard28950f2022-05-29 14:13:04 +01002869func Test_popupwin_terminal_scrollbar()
2870 CheckFeature terminal
2871 CheckScreendump
2872 CheckUnix
2873
2874 call writefile(range(50), 'Xtestfile')
2875 let lines =<< trim END
2876 vim9script
2877
2878 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
2888 call writefile(lines, 'Xpterm')
2889 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
2896 " close the popupwin.
2897 call term_sendkeys(buf, ":q\<CR>")
2898 call VerifyScreenDump(buf, 'Test_popupwin_poptermscroll_3', {})
2899
2900 call StopVimInTerminal(buf)
2901 call delete('Xtestfile')
2902 call delete('Xpterm')
2903endfunc
2904
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002905func Test_popupwin_close_prevwin()
2906 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002907 call Popupwin_close_prevwin()
2908endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002909
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002910def Popupwin_close_prevwin()
2911 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002912 split
2913 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002914 assert_equal(2, winnr())
Bram Moolenaare0de1712020-12-02 17:36:54 +01002915 var buf = term_start(&shell, {hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002916 popup_create(buf, {})
Bram Moolenaar62aec932022-01-29 21:45:34 +00002917 g:TermWait(buf, 100)
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002918 popup_clear(true)
2919 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002920
2921 quit
2922 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002923enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002924
Bram Moolenaar934470e2019-09-01 23:27:05 +02002925func Test_popupwin_with_buffer_and_filter()
2926 new Xwithfilter
2927 call setline(1, range(100))
2928 let bufnr = bufnr()
2929 hide
2930
2931 func BufferFilter(win, key)
2932 if a:key == 'G'
2933 " recursive use of "G" does not cause problems.
2934 call win_execute(a:win, 'normal! G')
2935 return 1
2936 endif
2937 return 0
2938 endfunc
2939
2940 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2941 call assert_equal(1, popup_getpos(winid).firstline)
2942 redraw
2943 call feedkeys("G", 'xt')
2944 call assert_equal(99, popup_getpos(winid).firstline)
2945
2946 call popup_close(winid)
2947 exe 'bwipe! ' .. bufnr
2948endfunc
2949
Bram Moolenaare296e312019-07-03 23:20:18 +02002950func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002951 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002952 \ maxwidth: 40,
2953 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002954 \ })
2955 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002956 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002957 redraw
2958 call assert_equal(19, popup_getpos(winid).width)
2959 endfor
2960 call popup_clear()
2961endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002962
2963func Test_popupwin_buf_close()
2964 let buf = bufadd('Xtestbuf')
2965 call bufload(buf)
2966 call setbufline(buf, 1, ['just', 'some', 'lines'])
2967 let winid = popup_create(buf, {})
2968 redraw
2969 call assert_equal(3, popup_getpos(winid).height)
2970 let bufinfo = getbufinfo(buf)[0]
2971 call assert_equal(1, bufinfo.changed)
2972 call assert_equal(0, bufinfo.hidden)
2973 call assert_equal(0, bufinfo.listed)
2974 call assert_equal(1, bufinfo.loaded)
2975 call assert_equal([], bufinfo.windows)
2976 call assert_equal([winid], bufinfo.popups)
2977
2978 call popup_close(winid)
2979 call assert_equal({}, popup_getpos(winid))
2980 let bufinfo = getbufinfo(buf)[0]
2981 call assert_equal(1, bufinfo.changed)
2982 call assert_equal(1, bufinfo.hidden)
2983 call assert_equal(0, bufinfo.listed)
2984 call assert_equal(1, bufinfo.loaded)
2985 call assert_equal([], bufinfo.windows)
2986 call assert_equal([], bufinfo.popups)
2987 exe 'bwipe! ' .. buf
2988endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002989
2990func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002991 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002992
2993 let lines =<< trim END
2994 call setline(1, range(1, 10))
2995 hi ScrollThumb ctermbg=blue
2996 hi ScrollBar ctermbg=red
2997 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002998 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002999 \ maxwidth: 10,
3000 \ maxheight: 3,
3001 \ pos : 'topleft',
3002 \ col : a:col,
3003 \ line : a:line,
3004 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02003005 \ })
3006 endfunc
3007 call PopupMenu(['x'], 1, 1)
3008 call PopupMenu(['123456789|'], 1, 16)
3009 call PopupMenu(['123456789|' .. ' '], 7, 1)
3010 call PopupMenu([repeat('123456789|', 100)], 7, 16)
3011 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
3012 END
3013 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02003014 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02003015 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
3016
3017 " close the menu popupwin.
3018 call term_sendkeys(buf, " ")
3019 call term_sendkeys(buf, " ")
3020 call term_sendkeys(buf, " ")
3021 call term_sendkeys(buf, " ")
3022 call term_sendkeys(buf, " ")
3023
3024 " clean up
3025 call StopVimInTerminal(buf)
3026 call delete('XtestPopupMenuMaxWidth')
3027endfunc
3028
Bram Moolenaara901a372019-07-13 16:38:50 +02003029func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003030 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02003031
3032 let lines =<< trim END
3033 call setline(1, range(1, 20))
3034 hi ScrollThumb ctermbg=blue
3035 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003036 eval ['one', 'two', 'three', 'four', 'five',
3037 \ 'six', 'seven', 'eight', 'nine']
3038 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02003039 \ minwidth: 8,
3040 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02003041 \ })
3042 END
3043 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02003044 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02003045
3046 call term_sendkeys(buf, "j")
3047 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
3048
3049 call term_sendkeys(buf, "jjj")
3050 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
3051
3052 " if the cursor is the bottom line, it stays at the bottom line.
3053 call term_sendkeys(buf, repeat("j", 20))
3054 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
3055
3056 call term_sendkeys(buf, "kk")
3057 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
3058
3059 call term_sendkeys(buf, "k")
3060 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
3061
3062 " if the cursor is in the top line, it stays in the top line.
3063 call term_sendkeys(buf, repeat("k", 20))
3064 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
3065
3066 " close the menu popupwin.
3067 call term_sendkeys(buf, " ")
3068
3069 " clean up
3070 call StopVimInTerminal(buf)
3071 call delete('XtestPopupMenuScroll')
3072endfunc
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
3106 call writefile(lines, 'XtestPopupMenuFilter')
3107 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)
3128 call delete('XtestPopupMenuFilter')
3129endfunc
3130
3131func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003132 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003133
3134 let winid = popup_create('some text', {})
3135 call assert_equal(0, popup_getoptions(winid).cursorline)
3136 call popup_close(winid)
3137
3138 let winid = popup_create('some text', #{ cursorline: 1, })
3139 call assert_equal(1, popup_getoptions(winid).cursorline)
3140 call popup_close(winid)
3141
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003142 let winid = popup_create('some text', #{ cursorline: v:true, })
3143 call assert_equal(1, popup_getoptions(winid).cursorline)
3144 call popup_close(winid)
3145
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003146 let winid = popup_create('some text', #{ cursorline: 0, })
3147 call assert_equal(0, popup_getoptions(winid).cursorline)
3148 call popup_close(winid)
3149
3150 let winid = popup_menu('some text', {})
3151 call assert_equal(1, popup_getoptions(winid).cursorline)
3152 call popup_close(winid)
3153
3154 let winid = popup_menu('some text', #{ cursorline: 1, })
3155 call assert_equal(1, popup_getoptions(winid).cursorline)
3156 call popup_close(winid)
3157
3158 let winid = popup_menu('some text', #{ cursorline: 0, })
3159 call assert_equal(0, popup_getoptions(winid).cursorline)
3160 call popup_close(winid)
3161
3162 " ---------
3163 " Pattern 1
3164 " ---------
3165 let lines =<< trim END
3166 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
3167 END
3168 call writefile(lines, 'XtestPopupCursorLine')
3169 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3170 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
3171 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3172 call StopVimInTerminal(buf)
3173
3174 " ---------
3175 " Pattern 2
3176 " ---------
3177 let lines =<< trim END
3178 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
3179 END
3180 call writefile(lines, 'XtestPopupCursorLine')
3181 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3182 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
3183 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3184 call StopVimInTerminal(buf)
3185
3186 " ---------
3187 " Pattern 3
3188 " ---------
3189 let lines =<< trim END
3190 function! MyFilter(winid, key) abort
3191 if a:key == "j"
3192 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3193 return 1
3194 endif
3195 if a:key == 'x'
3196 call popup_close(a:winid)
3197 return 1
3198 endif
3199 return 0
3200 endfunction
3201 call popup_menu(['111', '222', '333'], #{
3202 \ cursorline : 0,
3203 \ maxheight : 2,
3204 \ filter : 'MyFilter',
3205 \ })
3206 END
3207 call writefile(lines, 'XtestPopupCursorLine')
3208 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3209 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3210 call term_sendkeys(buf, "j")
3211 call term_sendkeys(buf, "j")
3212 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3213 call term_sendkeys(buf, "x")
3214 call StopVimInTerminal(buf)
3215
3216 " ---------
3217 " Pattern 4
3218 " ---------
3219 let lines =<< trim END
3220 function! MyFilter(winid, key) abort
3221 if a:key == "j"
3222 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3223 return 1
3224 endif
3225 if a:key == 'x'
3226 call popup_close(a:winid)
3227 return 1
3228 endif
3229 return 0
3230 endfunction
3231 call popup_menu(['111', '222', '333'], #{
3232 \ cursorline : 1,
3233 \ maxheight : 2,
3234 \ filter : 'MyFilter',
3235 \ })
3236 END
3237 call writefile(lines, 'XtestPopupCursorLine')
3238 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3239 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3240 call term_sendkeys(buf, "j")
3241 call term_sendkeys(buf, "j")
3242 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3243 call term_sendkeys(buf, "x")
3244 call StopVimInTerminal(buf)
3245
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003246 " ---------
3247 " Cursor in second line when creating the popup
3248 " ---------
3249 let lines =<< trim END
3250 let winid = popup_create(['111', '222', '333'], #{
3251 \ cursorline : 1,
3252 \ })
3253 call win_execute(winid, "2")
3254 END
3255 call writefile(lines, 'XtestPopupCursorLine')
3256 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3257 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3258 call StopVimInTerminal(buf)
3259
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003260 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003261
3262 " ---------
3263 " Use current buffer for popupmenu
3264 " ---------
3265 let lines =<< trim END
3266 call setline(1, ['one', 'two', 'three'])
3267 let winid = popup_create(bufnr('%'), #{
3268 \ cursorline : 1,
3269 \ })
3270 call win_execute(winid, "2")
3271 END
3272 call writefile(lines, 'XtestPopupCursorLine')
3273 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3274 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3275 call StopVimInTerminal(buf)
3276
3277 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003278endfunc
3279
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003280def Test_popup_cursorline_vim9()
3281 var winid = popup_create('some text', { cursorline: true, })
3282 assert_equal(1, popup_getoptions(winid).cursorline)
3283 popup_close(winid)
3284
3285 assert_fails("popup_create('some text', { cursorline: 2, })", 'E1023:')
3286 popup_clear()
3287enddef
3288
Bram Moolenaarf914a332019-07-20 15:09:56 +02003289func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003290 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003291 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003292
Bram Moolenaarf914a332019-07-20 15:09:56 +02003293 call writefile([
3294 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3295 \ "another\tXtagfile\t/^this is another",
3296 \ "theword\tXtagfile\t/^theword"],
3297 \ 'Xtags')
3298 call writefile(range(1,20)
3299 \ + ['theword is here']
3300 \ + range(22, 27)
3301 \ + ['this is another place']
3302 \ + range(29, 40),
3303 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003304 call writefile(range(1,10)
3305 \ + ['searched word is here']
3306 \ + range(12, 20),
3307 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003308 let lines =<< trim END
3309 set tags=Xtags
3310 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003311 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003312 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003313 \ 'three',
3314 \ 'four',
3315 \ 'five',
3316 \ 'six',
3317 \ 'seven',
3318 \ 'find theword somewhere',
3319 \ 'nine',
3320 \ 'this is another word',
3321 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003322 set previewpopup=height:4,width:40
Bram Moolenaar60577482021-03-04 21:35:07 +01003323 hi OtherColor ctermbg=lightcyan guibg=lightcyan
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003324 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003325 END
3326 call writefile(lines, 'XtestPreviewPopup')
3327 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3328
3329 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3330 call term_sendkeys(buf, ":\<CR>")
3331 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3332
Bram Moolenaar60577482021-03-04 21:35:07 +01003333 call term_sendkeys(buf, ":set previewpopup+=highlight:OtherColor\<CR>")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003334 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3335 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3336
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003337 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003338 call term_sendkeys(buf, ":\<CR>")
3339 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3340
3341 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3342 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3343
Bram Moolenaar799439a2020-02-11 21:44:17 +01003344 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003345 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003346 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003347
Bram Moolenaar60577482021-03-04 21:35:07 +01003348 call term_sendkeys(buf, ":set previewpopup-=highlight:OtherColor\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003349 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003350 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003351 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3352
3353 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3354 call term_sendkeys(buf, ":\<CR>")
3355 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3356
3357 call term_sendkeys(buf, ":pclose\<CR>")
3358 call term_sendkeys(buf, ":psearch searched\<CR>")
3359 call term_sendkeys(buf, ":\<CR>")
3360 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003361
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003362 call term_sendkeys(buf, "\<C-W>p")
3363 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3364
3365 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3366 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3367
Bram Moolenaarf914a332019-07-20 15:09:56 +02003368 call StopVimInTerminal(buf)
3369 call delete('Xtags')
3370 call delete('Xtagfile')
3371 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003372 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003373endfunc
3374
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003375func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003376 let lines =<< trim END
3377 set completeopt+=preview,popup
3378 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003379 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003380
3381 func CompleteFuncDict(findstart, base)
3382 if a:findstart
3383 if col('.') > 10
3384 return col('.') - 10
3385 endif
3386 return 0
3387 endif
3388
3389 return {
3390 \ 'words': [
3391 \ {
3392 \ 'word': 'aword',
3393 \ 'abbr': 'wrd',
3394 \ 'menu': 'extra text',
3395 \ 'info': 'words are cool',
3396 \ 'kind': 'W',
3397 \ 'user_data': 'test'
3398 \ },
3399 \ {
3400 \ 'word': 'anotherword',
3401 \ 'abbr': 'anotwrd',
3402 \ 'menu': 'extra text',
3403 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3404 \ 'kind': 'W',
3405 \ 'user_data': 'notest'
3406 \ },
3407 \ {
3408 \ 'word': 'noinfo',
3409 \ 'abbr': 'noawrd',
3410 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003411 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003412 \ 'kind': 'W',
3413 \ 'user_data': 'notest'
3414 \ },
3415 \ {
3416 \ 'word': 'thatword',
3417 \ 'abbr': 'thatwrd',
3418 \ 'menu': 'extra text',
3419 \ 'info': 'that word is cool',
3420 \ 'kind': 'W',
3421 \ 'user_data': 'notest'
3422 \ },
3423 \ ]
3424 \ }
3425 endfunc
3426 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003427 func ChangeColor()
3428 let id = popup_findinfo()
Bram Moolenaard356fc62020-12-09 18:13:44 +01003429 if buflisted(winbufnr(id))
3430 call setline(1, 'buffer is listed')
3431 endif
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003432 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003433 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003434
3435 func InfoHidden()
3436 set completepopup=height:4,border:off,align:menu
3437 set completeopt-=popup completeopt+=popuphidden
3438 au CompleteChanged * call HandleChange()
3439 endfunc
3440
3441 let s:counter = 0
3442 func HandleChange()
3443 let s:counter += 1
3444 let selected = complete_info(['selected']).selected
3445 if selected <= 0
3446 " First time: do nothing, info remains hidden
3447 return
3448 endif
3449 if selected == 1
3450 " Second time: show info right away
3451 let id = popup_findinfo()
3452 if id
3453 call popup_settext(id, 'immediate info ' .. s:counter)
3454 call popup_show(id)
3455 endif
3456 else
3457 " Third time: show info after a short delay
3458 call timer_start(100, 'ShowInfo')
3459 endif
3460 endfunc
3461
3462 func ShowInfo(...)
3463 let id = popup_findinfo()
3464 if id
3465 call popup_settext(id, 'async info ' .. s:counter)
3466 call popup_show(id)
3467 endif
3468 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003469
Bakudankun65555002021-11-17 20:40:16 +00003470 func OpenOtherPopups()
3471 call popup_create([
3472 \ 'popup below',
3473 \ 'popup below',
3474 \ 'popup below',
3475 \ 'popup below',
3476 \ ], #{
3477 \ line: 'cursor',
3478 \ col: 'cursor+3',
3479 \ highlight: 'ErrorMsg',
3480 \ minwidth: 17,
3481 \ zindex: 50,
3482 \ })
3483 call popup_create([
3484 \ 'popup on top',
3485 \ 'popup on top',
3486 \ 'popup on top',
3487 \ ], #{
3488 \ line: 'cursor+3',
3489 \ col: 'cursor-10',
3490 \ highlight: 'Search',
3491 \ minwidth: 10,
3492 \ zindex: 200,
3493 \ })
3494 endfunc
3495
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003496 " Check that no autocommands are triggered for the info popup
3497 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3498 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003499 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003500 return lines
3501endfunc
3502
3503func Test_popupmenu_info_border()
3504 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003505 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003506
3507 let lines = Get_popupmenu_lines()
3508 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003509 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003510
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003511 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003512 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003513
3514 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3515 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3516
3517 call term_sendkeys(buf, "\<C-N>")
3518 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3519
3520 call term_sendkeys(buf, "\<C-N>")
3521 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3522
3523 call term_sendkeys(buf, "\<C-N>\<C-N>")
3524 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3525
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003526 " info on the left with scrollbar
3527 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3528 call term_sendkeys(buf, "\<C-N>\<C-N>")
3529 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3530
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003531 " Test that the popupmenu's scrollbar and infopopup do not overlap
3532 call term_sendkeys(buf, "\<Esc>")
3533 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3534 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3535 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3536
Bram Moolenaar8e7d6222020-12-18 19:49:56 +01003537 " Hide the info popup, cycle through buffers, make sure it didn't get
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003538 " deleted.
3539 call term_sendkeys(buf, "\<Esc>")
3540 call term_sendkeys(buf, ":set hidden\<CR>")
3541 call term_sendkeys(buf, ":bn\<CR>")
3542 call term_sendkeys(buf, ":bn\<CR>")
3543 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3544 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3545
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003546 " Test that when the option is changed the popup changes.
3547 call term_sendkeys(buf, "\<Esc>")
3548 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3549 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3550 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3551
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003552 call term_sendkeys(buf, " \<Esc>")
3553 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3554 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3555 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3556
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003557 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003558 call StopVimInTerminal(buf)
3559 call delete('XtestInfoPopup')
3560endfunc
3561
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003562func Test_popupmenu_info_noborder()
3563 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003564 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003565
3566 let lines = Get_popupmenu_lines()
3567 call add(lines, 'set completepopup=height:4,border:off')
3568 call writefile(lines, 'XtestInfoPopupNb')
3569
3570 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003571 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003572
3573 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3574 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3575
3576 call StopVimInTerminal(buf)
3577 call delete('XtestInfoPopupNb')
3578endfunc
3579
Bram Moolenaar258cef52019-08-21 17:29:29 +02003580func Test_popupmenu_info_align_menu()
3581 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003582 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003583
3584 let lines = Get_popupmenu_lines()
3585 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3586 call writefile(lines, 'XtestInfoPopupNb')
3587
3588 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003589 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003590
3591 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3592 call term_sendkeys(buf, "\<C-N>")
3593 call term_sendkeys(buf, "\<C-N>")
3594 call term_sendkeys(buf, "\<C-N>")
3595 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3596
3597 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3598 call term_sendkeys(buf, "\<C-N>")
3599 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3600
3601 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003602 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003603 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3604 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3605 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3606
3607 call StopVimInTerminal(buf)
3608 call delete('XtestInfoPopupNb')
3609endfunc
3610
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003611func Test_popupmenu_info_hidden()
3612 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003613 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003614
3615 let lines = Get_popupmenu_lines()
3616 call add(lines, 'call InfoHidden()')
3617 call writefile(lines, 'XtestInfoPopupHidden')
3618
3619 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003620 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003621
3622 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3623 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3624
3625 call term_sendkeys(buf, "\<C-N>")
3626 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3627
3628 call term_sendkeys(buf, "\<C-N>")
3629 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3630
3631 call term_sendkeys(buf, "\<Esc>")
3632 call StopVimInTerminal(buf)
3633 call delete('XtestInfoPopupHidden')
3634endfunc
3635
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003636func Test_popupmenu_info_too_wide()
3637 CheckScreendump
3638 CheckFeature quickfix
3639
3640 let lines =<< trim END
3641 call setline(1, range(10))
3642
3643 set completeopt+=preview,popup
3644 set completepopup=align:menu
3645 set omnifunc=OmniFunc
3646 hi InfoPopup ctermbg=lightgrey
3647
3648 func OmniFunc(findstart, base)
3649 if a:findstart
3650 return 0
3651 endif
3652
3653 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3654 return #{
3655 \ words: [
3656 \ #{
3657 \ word: 'scrap',
3658 \ menu: menuText,
3659 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3660 \ },
3661 \ #{
3662 \ word: 'scappier',
3663 \ menu: menuText,
3664 \ info: 'words are cool',
3665 \ },
3666 \ #{
3667 \ word: 'scrappier2',
3668 \ menu: menuText,
3669 \ info: 'words are cool',
3670 \ },
3671 \ ]
3672 \ }
3673 endfunc
3674 END
3675
3676 call writefile(lines, 'XtestInfoPopupWide')
3677 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003678 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003679
3680 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3681 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3682
3683 call term_sendkeys(buf, "\<Esc>")
3684 call StopVimInTerminal(buf)
3685 call delete('XtestInfoPopupWide')
3686endfunc
3687
Bakudankun65555002021-11-17 20:40:16 +00003688func Test_popupmenu_masking()
3689 " Test that popup windows that are opened while popup menu is open are
3690 " properly displayed.
3691 CheckScreendump
3692 CheckFeature quickfix
3693
3694 let lines = Get_popupmenu_lines()
3695 call add(lines, 'inoremap <C-A> <Cmd>call OpenOtherPopups()<CR>')
3696 call writefile(lines, 'XtestPopupmenuMasking')
3697
3698 let buf = RunVimInTerminal('-S XtestPopupmenuMasking', #{rows: 14})
3699 call TermWait(buf, 25)
3700
3701 call term_sendkeys(buf, "A\<C-X>\<C-U>\<C-A>")
3702 call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_1', {})
3703
3704 call term_sendkeys(buf, "\<Esc>")
3705 call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_2', {})
3706
3707 call StopVimInTerminal(buf)
3708 call delete('XtestPopupmenuMasking')
3709endfunc
3710
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003711func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003712 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003713 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003714 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003715 call assert_equal(bufnr, winbufnr(winid))
3716 call popup_clear()
3717endfunc
3718
Bram Moolenaar1824f452019-10-02 23:06:46 +02003719func Test_popupwin_getoptions_tablocal()
3720 topleft split
3721 let win1 = popup_create('nothing', #{maxheight: 8})
3722 let win2 = popup_create('something', #{maxheight: 10})
3723 let win3 = popup_create('something', #{maxheight: 15})
3724 call assert_equal(8, popup_getoptions(win1).maxheight)
3725 call assert_equal(10, popup_getoptions(win2).maxheight)
3726 call assert_equal(15, popup_getoptions(win3).maxheight)
3727 call popup_clear()
3728 quit
3729endfunc
3730
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003731func Test_popupwin_cancel()
3732 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3733 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3734 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3735 call assert_equal(5, popup_getpos(win1).line)
3736 call assert_equal(10, popup_getpos(win2).line)
3737 call assert_equal(15, popup_getpos(win3).line)
3738 " TODO: this also works without patch 8.1.2110
3739 call feedkeys("\<C-C>", 'xt')
3740 call assert_equal(5, popup_getpos(win1).line)
3741 call assert_equal(10, popup_getpos(win2).line)
3742 call assert_equal({}, popup_getpos(win3))
3743 call feedkeys("\<C-C>", 'xt')
3744 call assert_equal(5, popup_getpos(win1).line)
3745 call assert_equal({}, popup_getpos(win2))
3746 call assert_equal({}, popup_getpos(win3))
3747 call feedkeys("\<C-C>", 'xt')
3748 call assert_equal({}, popup_getpos(win1))
3749 call assert_equal({}, popup_getpos(win2))
3750 call assert_equal({}, popup_getpos(win3))
3751endfunc
3752
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003753func Test_popupwin_filter_redraw()
3754 " Create two popups with a filter that closes the popup when typing "0".
3755 " Both popups should close, even though the redraw also calls
3756 " popup_reset_handled()
3757
3758 func CloseFilter(winid, key)
3759 if a:key == '0'
3760 call popup_close(a:winid)
3761 redraw
3762 endif
3763 return 0 " pass the key
3764 endfunc
3765
3766 let id1 = popup_create('first one', #{
3767 \ line: 1,
3768 \ col: 1,
3769 \ filter: 'CloseFilter',
3770 \ })
3771 let id2 = popup_create('second one', #{
3772 \ line: 9,
3773 \ col: 1,
3774 \ filter: 'CloseFilter',
3775 \ })
3776 call assert_equal(1, popup_getpos(id1).line)
3777 call assert_equal(9, popup_getpos(id2).line)
3778
3779 call feedkeys('0', 'xt')
3780 call assert_equal({}, popup_getpos(id1))
3781 call assert_equal({}, popup_getpos(id2))
3782
3783 call popup_clear()
3784 delfunc CloseFilter
3785endfunc
3786
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003787func Test_popupwin_double_width()
3788 CheckScreendump
3789
3790 let lines =<< trim END
3791 call setline(1, 'x你好世界你好世你好世界你好')
3792 call setline(2, '你好世界你好世你好世界你好')
3793 call setline(3, 'x你好世界你好世你好世界你好')
3794 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3795 END
3796 call writefile(lines, 'XtestPopupWide')
3797
3798 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3799 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3800
3801 call StopVimInTerminal(buf)
3802 call delete('XtestPopupWide')
3803endfunc
3804
3805func Test_popupwin_sign()
3806 CheckScreendump
3807
3808 let lines =<< trim END
3809 call setline(1, range(10))
3810 call sign_define('Current', {
3811 \ 'text': '>>',
3812 \ 'texthl': 'WarningMsg',
3813 \ 'linehl': 'Error',
3814 \ })
3815 call sign_define('Other', {
3816 \ 'text': '#!',
3817 \ 'texthl': 'Error',
3818 \ 'linehl': 'Search',
3819 \ })
3820 let winid = popup_create(['hello', 'bright', 'world'], {
3821 \ 'minwidth': 20,
3822 \ })
3823 call setwinvar(winid, "&signcolumn", "yes")
3824 let winbufnr = winbufnr(winid)
3825
3826 " add sign to current buffer, shows
3827 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3828 " add sign to current buffer, does not show
3829 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3830
3831 " add sign to popup buffer, shows
3832 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3833 " add sign to popup buffer, does not show
3834 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003835
3836 func SetOptions()
3837 call setwinvar(g:winid, '&number', 1)
3838 call setwinvar(g:winid, '&foldcolumn', 2)
3839 call popup_settext(g:winid, 'a longer line to check the width')
3840 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003841 END
3842 call writefile(lines, 'XtestPopupSign')
3843
3844 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3845 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3846
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003847 " set more options to check the width is adjusted
3848 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3849 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3850
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003851 call StopVimInTerminal(buf)
3852 call delete('XtestPopupSign')
3853endfunc
3854
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003855func Test_popupwin_bufnr()
3856 let popwin = popup_create(['blah'], #{})
3857 let popbuf = winbufnr(popwin)
3858 split asdfasdf
3859 let newbuf = bufnr()
3860 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3861 call assert_equal(newbuf, bufnr('$'))
3862 call popup_clear()
3863 let popwin = popup_create(['blah'], #{})
3864 " reuses previous buffer number
3865 call assert_equal(popbuf, winbufnr(popwin))
3866 call assert_equal(newbuf, bufnr('$'))
3867
3868 call popup_clear()
3869 bwipe!
3870endfunc
3871
Bram Moolenaarec084d32020-02-28 22:44:47 +01003872func Test_popupwin_filter_input_multibyte()
3873 func MyPopupFilter(winid, c)
3874 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3875 return 0
3876 endfunc
3877 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3878
3879 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3880 call feedkeys("\u3000", 'xt')
3881 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3882
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003883 " UTF-8: E3 80 9B, including CSI(0x9B)
3884 call feedkeys("\u301b", 'xt')
3885 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003886
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003887 if has('unix')
3888 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003889 if has('gui_running')
3890 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3891 else
3892 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3893 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003894 call assert_equal([0xc3, 0x81], g:bytes)
3895 endif
3896
Bram Moolenaarec084d32020-02-28 22:44:47 +01003897 call popup_clear()
3898 delfunc MyPopupFilter
3899 unlet g:bytes
3900endfunc
3901
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003902func Test_popupwin_filter_close_ctrl_c()
3903 CheckScreendump
3904
3905 let lines =<< trim END
3906 vsplit
3907 set laststatus=2
3908 set statusline=%!Statusline()
3909
3910 function Statusline() abort
3911 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3912 endfunction
3913
3914 call popup_create('test test test test...', {'filter': {-> 0}})
3915 END
3916 call writefile(lines, 'XtestPopupCtrlC')
3917
3918 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3919
3920 call term_sendkeys(buf, "\<C-C>")
3921 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3922
3923 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003924 call delete('XtestPopupCtrlC')
3925endfunc
3926
3927func Test_popupwin_filter_close_wrong_name()
3928 CheckScreendump
3929
3930 let lines =<< trim END
3931 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3932 END
3933 call writefile(lines, 'XtestPopupWrongName')
3934
3935 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3936
3937 call term_sendkeys(buf, "j")
3938 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3939
3940 call StopVimInTerminal(buf)
3941 call delete('XtestPopupWrongName')
3942endfunc
3943
3944func Test_popupwin_filter_close_three_errors()
3945 CheckScreendump
3946
3947 let lines =<< trim END
3948 set cmdheight=2
3949 call popup_create('one two three...', {'filter': 'filter'})
3950 END
3951 call writefile(lines, 'XtestPopupThreeErrors')
3952
3953 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3954
3955 call term_sendkeys(buf, "jj")
3956 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3957 call term_sendkeys(buf, "j")
3958 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3959
3960 call StopVimInTerminal(buf)
3961 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003962endfunc
3963
Bram Moolenaar927495b2020-11-06 17:58:35 +01003964func Test_popupwin_latin1_encoding()
3965 CheckScreendump
3966 CheckUnix
3967
3968 " When 'encoding' is a single-byte encoding a terminal window will mess up
3969 " the display. Check that showing a popup on top of that doesn't crash.
3970 let lines =<< trim END
3971 set encoding=latin1
3972 terminal cat Xmultibyte
3973 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003974 redraw
Bram Moolenaarb125b532020-12-17 21:56:09 +01003975 " wait for "cat" to finish
3976 while execute('ls!') !~ 'finished'
3977 sleep 10m
3978 endwhile
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003979 echo "Done"
Bram Moolenaar927495b2020-11-06 17:58:35 +01003980 END
3981 call writefile(lines, 'XtestPopupLatin')
3982 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte')
3983
3984 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003985 call WaitForAssert({-> assert_match('Done', term_getline(buf, 10))})
Bram Moolenaar927495b2020-11-06 17:58:35 +01003986
3987 call term_sendkeys(buf, ":q\<CR>")
3988 call StopVimInTerminal(buf)
3989 call delete('XtestPopupLatin')
3990 call delete('Xmultibyte')
3991endfunc
3992
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003993func Test_popupwin_atcursor_far_right()
3994 new
3995
3996 " this was getting stuck
3997 set signcolumn=yes
3998 call setline(1, repeat('=', &columns))
3999 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02004000 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01004001
Bram Moolenaar6d585f42020-07-26 22:20:54 +02004002 " 'signcolumn' was getting reset
4003 call setwinvar(winid, '&signcolumn', 'yes')
4004 call popup_setoptions(winid, {'zindex': 1000})
4005 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
4006
Bram Moolenaaref6b9792020-05-13 16:34:15 +02004007 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01004008 bwipe!
4009 set signcolumn&
4010endfunc
4011
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01004012func Test_popupwin_splitmove()
4013 vsplit
4014 let win2 = win_getid()
4015 let popup_winid = popup_dialog('hello', {})
4016 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
4017 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
4018
4019 call popup_clear()
4020 bwipe
4021endfunc
4022
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01004023func Test_popupwin_exiting_terminal()
4024 CheckFeature terminal
4025
4026 " Tests that when creating a popup right after closing a terminal window does
4027 " not make the popup the current window.
4028 let winid = win_getid()
4029 try
4030 augroup Test_popupwin_exiting_terminal
4031 autocmd!
4032 autocmd WinEnter * :call popup_create('test', {})
4033 augroup END
4034 let bnr = term_start(&shell, #{term_finish: 'close'})
4035 call term_sendkeys(bnr, "exit\r\n")
4036 call WaitForAssert({-> assert_equal(winid, win_getid())})
4037 finally
4038 call popup_clear(1)
4039 augroup Test_popupwin_exiting_terminal
4040 autocmd!
4041 augroup END
4042 endtry
4043endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01004044
Bram Moolenaar014f6982021-01-04 13:18:30 +01004045func Test_popup_filter_menu()
4046 let colors = ['red', 'green', 'blue']
4047 call popup_menu(colors, #{callback: {_, result -> assert_equal('green', colors[result - 1])}})
4048 call feedkeys("\<c-n>\<c-n>\<c-p>\<cr>", 'xt')
4049endfunc
4050
Bram Moolenaar65026432021-02-06 14:22:32 +01004051func Test_popup_getoptions_other_tab()
4052 new
4053 call setline(1, 'some text')
4054 call prop_type_add('textprop', {})
4055 call prop_add(1, 1, #{type: 'textprop', length: 1})
4056 let id = popup_create('TEST', #{textprop: 'textprop', highlight: 'ErrorMsg', tabpage: 1})
4057 tab sp
4058 call assert_equal(['textprop', 'textpropid', 'textpropwin'], popup_getoptions(id)->keys()->filter({_, v -> v =~ 'textprop'}))
4059
4060 tabclose
Bram Moolenaarefa19232021-02-06 14:59:27 +01004061 call popup_close(id)
Bram Moolenaar65026432021-02-06 14:22:32 +01004062 bwipe!
4063 call prop_type_delete('textprop')
4064endfunc
4065
Bram Moolenaarefa19232021-02-06 14:59:27 +01004066
4067func Test_popup_setoptions_other_tab()
4068 new Xfile
4069 let winid = win_getid()
4070 call setline(1, 'some text')
4071 call prop_type_add('textprop', {})
4072 call prop_add(1, 1, #{type: 'textprop', length: 1})
4073 let id = popup_create('TEST', #{textprop: 'textprop'})
4074 tab sp
4075 call popup_setoptions(id, #{textprop: 'textprop', textpropwin: winid})
4076 call assert_equal(winid, popup_getoptions(id).textpropwin)
4077
4078 tabclose
4079 call popup_close(id)
4080 bwipe! Xfile
4081 call prop_type_delete('textprop')
4082endfunc
4083
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004084func Test_popup_prop_not_visible()
4085 CheckScreendump
4086
4087 let lines =<< trim END
4088 vim9script
4089 set nowrap stal=2
4090 rightbelow :31vnew
4091 setline(1, ['', 'some text', '', 'other text'])
4092 prop_type_add('someprop', {})
4093 prop_add(2, 9, {type: 'someprop', length: 5})
Bram Moolenaar27724252022-05-08 15:00:04 +01004094 g:some_id = popup_create('attached to "some"', {
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004095 textprop: 'someprop',
4096 highlight: 'ErrorMsg',
4097 line: -1,
4098 wrap: false,
4099 fixed: true,
4100 })
4101 prop_type_add('otherprop', {})
4102 prop_add(4, 10, {type: 'otherprop', length: 5})
4103 popup_create('attached to "other"', {
4104 textprop: 'otherprop',
4105 highlight: 'ErrorMsg',
4106 line: -1,
4107 wrap: false,
4108 fixed: false,
4109 })
4110 END
4111 call writefile(lines, 'XtestPropNotVisble')
4112 let buf = RunVimInTerminal('-S XtestPropNotVisble', #{rows: 10})
4113 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01', {})
4114
Bram Moolenaar27724252022-05-08 15:00:04 +01004115 " check that hiding and unhiding the popup works
4116 call term_sendkeys(buf, ":call popup_hide(g:some_id)\<CR>")
4117 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01a', {})
4118 call term_sendkeys(buf, ":call popup_show(g:some_id)\<CR>")
4119 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01b', {})
4120
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004121 call term_sendkeys(buf, ":vert resize -14\<CR>")
4122 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_02', {})
4123
4124 call term_sendkeys(buf, ":vert resize -8\<CR>")
4125 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_03', {})
4126
4127 " clean up
4128 call StopVimInTerminal(buf)
4129 call delete('XtestPropNotVisble')
4130endfunction
4131
Bram Moolenaar7b4f76c2021-06-10 21:07:48 +02004132func Test_bufdel_skips_popupwin_buffer()
4133 let id = popup_create("Some text", {})
4134 %bd
4135 call popup_close(id)
4136endfunc
4137
Bram Moolenaar82db31c2021-02-10 14:56:11 +01004138
Bram Moolenaar331bafd2019-07-20 17:46:05 +02004139" vim: shiftwidth=2 sts=2