blob: 79eaca7c13d3e6276426c3684c7c11dec6bd6e0d [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)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200517endfunc
518
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200519func Test_popup_firstline_cursorline()
520 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
521 \ maxheight: 2,
522 \ firstline: 3,
523 \ cursorline: 1,
524 \ })
525 call assert_equal(3, popup_getoptions(winid).firstline)
526 call assert_equal(3, getwininfo(winid)[0].topline)
527 call assert_equal(3, getcurpos(winid)[1])
528
529 call popup_close(winid)
530endfunc
531
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200532func Test_popup_noscrolloff()
533 set scrolloff=5
534 let winid = popup_create(['xxx']->repeat(50), #{
535 \ maxheight: 5,
536 \ firstline: 11,
537 \ })
538 redraw
539 call assert_equal(11, popup_getoptions(winid).firstline)
540 call assert_equal(11, popup_getpos(winid).firstline)
541
542 call popup_setoptions(winid, #{firstline: 0})
543 call win_execute(winid, "normal! \<c-y>")
544 call assert_equal(0, popup_getoptions(winid).firstline)
545 call assert_equal(10, popup_getpos(winid).firstline)
546
547 call popup_close(winid)
548endfunc
549
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200550func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200551 CheckScreendump
552
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200553 " create a popup that covers the command line
554 let lines =<< trim END
555 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200556 split
557 vsplit
558 $wincmd w
559 vsplit
560 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200561 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200562 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200563 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200564 \ border: [],
565 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200566 \ })
567 func Dragit()
568 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
569 endfunc
570 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
Bram Moolenaar356375f2019-08-24 14:46:29 +0200571 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200572 func Resize()
573 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
574 endfunc
Bram Moolenaar356375f2019-08-24 14:46:29 +0200575 map <silent> <F5> :call test_setmouse(6, 21)<CR>
576 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200577 END
578 call writefile(lines, 'XtestPopupDrag')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200579 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200580 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
581
582 call term_sendkeys(buf, ":call Dragit()\<CR>")
583 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
584
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200585 call term_sendkeys(buf, ":call Resize()\<CR>")
586 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
587
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200588 " clean up
589 call StopVimInTerminal(buf)
590 call delete('XtestPopupDrag')
591endfunc
592
Bram Moolenaar35910f22020-07-12 19:24:10 +0200593func Test_popup_drag_termwin()
594 CheckUnix
595 CheckScreendump
596 CheckFeature terminal
597
598 " create a popup that covers the terminal window
599 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200600 set foldmethod=marker
601 call setline(1, range(100))
602 for nr in range(7)
603 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200604 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200605 endfor
606 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200607 set shell=/bin/sh noruler
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200608 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200609 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200610 $wincmd w
611 let winid = popup_create(['1111', '2222'], #{
612 \ drag: 1,
613 \ resize: 1,
614 \ border: [],
615 \ line: 3,
616 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200617 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200618 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
619 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200620 func DragitDown()
621 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
622 endfunc
623 func DragitDownLeft()
624 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
625 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200626 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
627 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200628 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
629 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200630 END
631 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200632 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200633 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
634
Bram Moolenaar452143c2020-07-15 17:38:21 +0200635 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200636 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
637
Bram Moolenaar452143c2020-07-15 17:38:21 +0200638 call term_sendkeys(buf, ":call DragitDown()\<CR>")
639 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
640
641 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
642 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
643
Bram Moolenaar35910f22020-07-12 19:24:10 +0200644 " clean up
645 call StopVimInTerminal(buf)
646 call delete('XtestPopupTerm')
647endfunc
648
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200649func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200650 CheckScreendump
651
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200652 let lines =<< trim END
653 call setline(1, range(1, 20))
654 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200655 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200656 \ close: 'button',
657 \ border: [],
658 \ line: 1,
659 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200660 \ })
661 func CloseMsg(id, result)
662 echomsg 'Popup closed with ' .. a:result
663 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200664 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200665 \ close: 'click',
666 \ line: 3,
667 \ col: 15,
668 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200669 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200670 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200671 \ close: 'button',
672 \ line: 5,
673 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200674 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200675 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200676 \ close: 'button',
677 \ padding: [],
678 \ line: 5,
679 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200680 \ })
681 func CloseWithX()
682 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
683 endfunc
684 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
685 func CloseWithClick()
686 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
687 endfunc
688 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200689 func CreateWithMenuFilter()
690 let winid = popup_create('barfoo', #{
691 \ close: 'button',
692 \ filter: 'popup_filter_menu',
693 \ border: [],
694 \ line: 1,
695 \ col: 40,
696 \ })
697 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200698 END
699 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200700 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200701 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
702
703 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
704 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
705
706 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
707 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
708
Bram Moolenaarf6396232019-08-24 19:36:00 +0200709 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
710 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
711
712 " We have to send the actual mouse code, feedkeys() would be caught the
713 " filter.
714 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
715 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
716
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200717 " clean up
718 call StopVimInTerminal(buf)
719 call delete('XtestPopupClose')
720endfunction
721
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200722func Test_popup_menu_wrap()
723 CheckScreendump
724
725 let lines =<< trim END
726 call setline(1, range(1, 20))
727 call popup_create([
728 \ 'one',
729 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
730 \ 'three',
731 \ 'four',
732 \ ], #{
733 \ pos: "botleft",
734 \ border: [],
735 \ padding: [0,1,0,1],
736 \ maxheight: 3,
737 \ cursorline: 1,
738 \ filter: 'popup_filter_menu',
739 \ })
740 END
741 call writefile(lines, 'XtestPopupWrap')
742 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
743 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
744
745 call term_sendkeys(buf, "jj")
746 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
747
748 " clean up
749 call term_sendkeys(buf, "\<Esc>")
750 call StopVimInTerminal(buf)
751 call delete('XtestPopupWrap')
752endfunction
753
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200754func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200755 CheckScreendump
756
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200757 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200758 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200759 hi PopupColor ctermbg=lightgrey
760 let winid = popup_create([
761 \ 'some text',
762 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200763 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200764 \ line: 1,
765 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100766 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200767 \ wrap: 0,
768 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200769 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200770 \ zindex: 90,
771 \ padding: [],
772 \ highlight: 'PopupColor',
773 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200774 call popup_create([
775 \ 'xxxxxxxxx',
776 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200777 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200778 \ line: 3,
779 \ col: 18,
780 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200781 let winidb = popup_create([
782 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200783 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200784 \ line: 7,
785 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100786 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200787 \ wrap: 0,
788 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200789 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200790 \ close: 'button',
791 \ zindex: 90,
792 \ padding: [],
793 \ border: [],
794 \ 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 +0200795 END
796 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200797 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200798 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
799
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200800 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
801 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200802 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200803 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
804
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200805 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
806 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200807 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200808 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
809
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200810 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
811 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200812 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200813 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
814
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200815 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
816 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200817 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200818 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
819
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200820 " clean up
821 call StopVimInTerminal(buf)
822 call delete('XtestPopupMask')
823endfunc
824
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200825func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200826 CheckScreendump
827 CheckFeature clipboard_working
828
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200829 " create a popup with some text to be selected
830 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200831 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200832 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200833 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200834 \ drag: 1,
835 \ border: [],
836 \ line: 3,
837 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200838 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200839 \ })
840 func Select1()
841 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
842 endfunc
843 map <silent> <F3> :call test_setmouse(4, 15)<CR>
844 map <silent> <F4> :call test_setmouse(6, 23)<CR>
845 END
846 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200847 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200848 call term_sendkeys(buf, ":call Select1()\<CR>")
849 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
850
851 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
852 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200853 " clean the command line, sometimes it still shows a command
854 call term_sendkeys(buf, ":\<esc>")
855
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200856 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
857
858 " clean up
859 call StopVimInTerminal(buf)
860 call delete('XtestPopupSelect')
861endfunc
862
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200863func Test_popup_in_tab()
864 " default popup is local to tab, not visible when in other tab
865 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200866 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200867 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200868 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200869 tabnew
870 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200871 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200872 quit
873 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200874
875 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200876 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200877 " buffer is gone now
878 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200879
880 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200881 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200882 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200883 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200884 tabnew
885 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200886 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200887 quit
888 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200889 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200890
891 " create popup in other tab
892 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200893 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200894 call assert_equal(0, popup_getpos(winid).visible)
895 call assert_equal(1, popup_getoptions(winid).tabpage)
896 quit
897 call assert_equal(1, popup_getpos(winid).visible)
898 call assert_equal(0, popup_getoptions(winid).tabpage)
899 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200900endfunc
901
902func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200903 call assert_equal(0, len(popup_list()))
904
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200905 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200906 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200907 let pos = popup_getpos(winid)
908 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200909 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200910 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200911
912 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200913 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200914 let pos = popup_getpos(winid)
915 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200916 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200917
918 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200919 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200920 let pos = popup_getpos(winid)
921 let around = (&columns - pos.width) / 2
922 call assert_inrange(around - 1, around + 1, pos.col)
923 let around = (&lines - pos.height) / 2
924 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200925 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200926endfunc
927
928func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +0200929 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200930 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200931 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200932 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200933 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
934 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
935 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200936
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200937 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200938 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200939 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200940 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200941 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200942 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200943 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200944 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200945
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200946 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200947 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200948 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200949 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200950 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200951 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200952 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200953 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200954
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200955 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200956 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200957 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200958 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200959 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200960 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200961 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200962 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +0200963 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
964 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200965 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200966 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200967
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200968 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200969 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200970 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200971 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200972 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200973 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100974 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
975 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200976 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
977 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100978 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
979 call popup_clear()
980 call popup_create("text", #{mask: [range(4)]})
981 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200982 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +0200983 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200984 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200985 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
986 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200987endfunc
988
Bram Moolenaareea16992019-05-31 17:34:48 +0200989func Test_win_execute_closing_curwin()
990 split
991 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200992 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200993 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +0100994
995 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200996 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 +0100997 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +0200998endfunc
999
1000func Test_win_execute_not_allowed()
1001 let winid = popup_create('some text', {})
1002 call assert_fails('call win_execute(winid, "split")', 'E994:')
1003 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1004 call assert_fails('call win_execute(winid, "close")', 'E994:')
1005 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001006 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001007 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1008 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1009 call assert_fails('call win_execute(winid, "next")', 'E994:')
1010 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001011 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001012 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001013 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1014 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1015 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1016 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001017 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1018 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001019 call assert_fails('call win_execute(winid, "help")', 'E994:')
1020 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001021 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1022 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1023 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1024 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001025 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001026endfunc
1027
Bram Moolenaar402502d2019-05-30 22:07:36 +02001028func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001029 CheckScreendump
1030
Bram Moolenaar402502d2019-05-30 22:07:36 +02001031 let lines =<< trim END
1032 call setline(1, range(1, 100))
1033 let winid = popup_create(
1034 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001035 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001036 END
1037 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001038 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001039 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1040
1041 " clean up
1042 call StopVimInTerminal(buf)
1043 call delete('XtestPopup')
1044endfunc
1045
1046func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001047 CheckScreendump
1048
Bram Moolenaar402502d2019-05-30 22:07:36 +02001049 let lines =<< trim END
1050 call setline(1, range(1, 100))
1051 let winid = popup_create(
1052 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001053 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001054 END
1055 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001056 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001057 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1058
1059 " clean up
1060 call StopVimInTerminal(buf)
1061 call delete('XtestPopup')
1062endfunc
1063
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001064func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001065 CheckScreendump
1066
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001067 let lines =<< trim END
1068 set showbreak=>>\
1069 call setline(1, range(1, 20))
1070 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001071 \ 'a long line here that wraps',
1072 \ #{filter: 'popup_filter_yesno',
1073 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001074 END
1075 call writefile(lines, 'XtestPopupShowbreak')
1076 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1077 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1078
1079 " clean up
1080 call term_sendkeys(buf, "y")
1081 call StopVimInTerminal(buf)
1082 call delete('XtestPopupShowbreak')
1083endfunc
1084
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001085func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001086 CheckFeature timers
1087
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001088 topleft vnew
1089 call setline(1, 'hello')
1090
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001091 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001092 \ line: 1,
1093 \ col: 1,
1094 \ minwidth: 20,
1095 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001096 \})
1097 redraw
1098 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1099 call assert_equal('world', line)
1100
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001101 call assert_equal(winid, popup_locate(1, 1))
1102 call assert_equal(winid, popup_locate(1, 20))
1103 call assert_equal(0, popup_locate(1, 21))
1104 call assert_equal(0, popup_locate(2, 1))
1105
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001106 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001107 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001108 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001109 call assert_equal('hello', line)
1110
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001111 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001112 \ line: &lines,
1113 \ col: 10,
1114 \ minwidth: 20,
1115 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001116 \})
1117 redraw
1118 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1119 call assert_match('.*on the command line.*', line)
1120
1121 sleep 700m
1122 redraw
1123 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1124 call assert_notmatch('.*on the command line.*', line)
1125
1126 bwipe!
1127endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001128
1129func Test_popup_hide()
1130 topleft vnew
1131 call setline(1, 'hello')
1132
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001133 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001134 \ line: 1,
1135 \ col: 1,
1136 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001137 \})
1138 redraw
1139 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1140 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001141 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001142 " buffer is still listed and active
1143 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001144
1145 call popup_hide(winid)
1146 redraw
1147 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1148 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001149 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001150 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001151 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001152
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001153 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001154 redraw
1155 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1156 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001157 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001158
1159
1160 call popup_close(winid)
1161 redraw
1162 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1163 call assert_equal('hello', line)
1164
1165 " error is given for existing non-popup window
1166 call assert_fails('call popup_hide(win_getid())', 'E993:')
1167
1168 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001169 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001170 call popup_show(41234234)
1171
1172 bwipe!
1173endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001174
1175func Test_popup_move()
1176 topleft vnew
1177 call setline(1, 'hello')
1178
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001179 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001180 \ line: 1,
1181 \ col: 1,
1182 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001183 \})
1184 redraw
1185 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1186 call assert_equal('world ', line)
1187
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001188 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001189 redraw
1190 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1191 call assert_equal('hello ', line)
1192 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1193 call assert_equal('~world', line)
1194
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001195 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001196 redraw
1197 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1198 call assert_equal('hworld', line)
1199
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001200 call assert_fails('call popup_move(winid, [])', 'E715:')
1201 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1202
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001203 call popup_close(winid)
1204
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001205 call assert_equal(0, popup_move(-1, {}))
1206
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001207 bwipe!
1208endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001209
Bram Moolenaar402502d2019-05-30 22:07:36 +02001210func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001211 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001212 \ line: 2,
1213 \ col: 3,
1214 \ minwidth: 10,
1215 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001216 \})
1217 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001218 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001219 call assert_equal(2, res.line)
1220 call assert_equal(3, res.col)
1221 call assert_equal(10, res.width)
1222 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001223 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001224
1225 call popup_close(winid)
1226endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001227
1228func Test_popup_width_longest()
1229 let tests = [
1230 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1231 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1232 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1233 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1234 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1235 \ ]
1236
1237 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001238 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001239 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001240 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001241 call assert_equal(test[1], position.width)
1242 call popup_close(winid)
1243 endfor
1244endfunc
1245
1246func Test_popup_wraps()
1247 let tests = [
1248 \ ['nowrap', 6, 1],
1249 \ ['a line that wraps once', 12, 2],
1250 \ ['a line that wraps two times', 12, 3],
1251 \ ]
1252 for test in tests
1253 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001254 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001255 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001256 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001257 call assert_equal(test[1], position.width)
1258 call assert_equal(test[2], position.height)
1259
1260 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001261 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001262 endfor
1263endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001264
1265func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001266 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001267 \ line: 2,
1268 \ col: 3,
1269 \ minwidth: 10,
1270 \ minheight: 11,
1271 \ maxwidth: 20,
1272 \ maxheight: 21,
1273 \ zindex: 100,
1274 \ time: 5000,
1275 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001276 \})
1277 redraw
1278 let res = popup_getoptions(winid)
1279 call assert_equal(2, res.line)
1280 call assert_equal(3, res.col)
1281 call assert_equal(10, res.minwidth)
1282 call assert_equal(11, res.minheight)
1283 call assert_equal(20, res.maxwidth)
1284 call assert_equal(21, res.maxheight)
1285 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001286 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001287 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001288 if has('timers')
1289 call assert_equal(5000, res.time)
1290 endif
1291 call popup_close(winid)
1292
1293 let winid = popup_create('hello', {})
1294 redraw
1295 let res = popup_getoptions(winid)
1296 call assert_equal(0, res.line)
1297 call assert_equal(0, res.col)
1298 call assert_equal(0, res.minwidth)
1299 call assert_equal(0, res.minheight)
1300 call assert_equal(0, res.maxwidth)
1301 call assert_equal(0, res.maxheight)
1302 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001303 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001304 if has('timers')
1305 call assert_equal(0, res.time)
1306 endif
1307 call popup_close(winid)
1308 call assert_equal({}, popup_getoptions(winid))
1309endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001310
1311func Test_popup_option_values()
1312 new
1313 " window-local
1314 setlocal number
1315 setlocal nowrap
1316 " buffer-local
1317 setlocal omnifunc=Something
1318 " global/buffer-local
1319 setlocal path=/there
1320 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001321 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001322
1323 let winid = popup_create('hello', {})
1324 call assert_equal(0, getwinvar(winid, '&number'))
1325 call assert_equal(1, getwinvar(winid, '&wrap'))
1326 call assert_equal('', getwinvar(winid, '&omnifunc'))
1327 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001328 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1329
1330 " 'scrolloff' is reset to zero
1331 call assert_equal(5, &scrolloff)
1332 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001333
1334 call popup_close(winid)
1335 bwipe
1336endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001337
1338func Test_popup_atcursor()
1339 topleft vnew
1340 call setline(1, [
1341 \ 'xxxxxxxxxxxxxxxxx',
1342 \ 'xxxxxxxxxxxxxxxxx',
1343 \ 'xxxxxxxxxxxxxxxxx',
1344 \])
1345
1346 call cursor(2, 2)
1347 redraw
1348 let winid = popup_atcursor('vim', {})
1349 redraw
1350 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1351 call assert_equal('xvimxxxxxxxxxxxxx', line)
1352 call popup_close(winid)
1353
1354 call cursor(3, 4)
1355 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001356 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001357 redraw
1358 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1359 call assert_equal('xxxvimxxxxxxxxxxx', line)
1360 call popup_close(winid)
1361
1362 call cursor(1, 1)
1363 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001364 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001365 \ line: 'cursor+2',
1366 \ col: 'cursor+1',
1367 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001368 redraw
1369 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1370 call assert_equal('xvimxxxxxxxxxxxxx', line)
1371 call popup_close(winid)
1372
1373 call cursor(3, 3)
1374 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001375 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001376 \ line: 'cursor-2',
1377 \ col: 'cursor-1',
1378 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001379 redraw
1380 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1381 call assert_equal('xvimxxxxxxxxxxxxx', line)
1382 call popup_close(winid)
1383
Bram Moolenaar402502d2019-05-30 22:07:36 +02001384 " just enough room above
1385 call cursor(3, 3)
1386 redraw
1387 let winid = popup_atcursor(['vim', 'is great'], {})
1388 redraw
1389 let pos = popup_getpos(winid)
1390 call assert_equal(1, pos.line)
1391 call popup_close(winid)
1392
1393 " not enough room above, popup goes below the cursor
1394 call cursor(3, 3)
1395 redraw
1396 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1397 redraw
1398 let pos = popup_getpos(winid)
1399 call assert_equal(4, pos.line)
1400 call popup_close(winid)
1401
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001402 " cursor in first line, popup in line 2
1403 call cursor(1, 1)
1404 redraw
1405 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1406 redraw
1407 let pos = popup_getpos(winid)
1408 call assert_equal(2, pos.line)
1409 call popup_close(winid)
1410
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001411 bwipe!
1412endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001413
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001414func Test_popup_atcursor_pos()
1415 CheckScreendump
1416
1417 let lines =<< trim END
1418 call setline(1, repeat([repeat('-', 60)], 15))
1419 set so=0
1420
1421 normal 9G3|r#
1422 let winid1 = popup_atcursor(['first', 'second'], #{
1423 \ moved: [0, 0, 0],
1424 \ })
1425 normal 9G21|r&
1426 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1427 \ pos: 'botright',
1428 \ moved: [0, 0, 0],
1429 \ })
1430 normal 3G27|r%
1431 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1432 \ pos: 'topleft',
1433 \ moved: [0, 0, 0],
1434 \ })
1435 normal 3G45|r@
1436 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1437 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001438 \ moved: range(3),
1439 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001440 \ })
1441 END
1442 call writefile(lines, 'XtestPopupAtcursorPos')
1443 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1444 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1445
1446 " clean up
1447 call StopVimInTerminal(buf)
1448 call delete('XtestPopupAtcursorPos')
1449endfunc
1450
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001451func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001452 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001453 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001454
1455 let lines =<< trim END
1456 call setline(1, range(1, 20))
1457 call setline(5, 'here is some text to hover over')
1458 set balloonevalterm
1459 set balloonexpr=BalloonExpr()
1460 set balloondelay=100
1461 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001462 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001463 return ''
1464 endfunc
1465 func Hover()
1466 call test_setmouse(5, 15)
1467 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1468 sleep 100m
1469 endfunc
1470 func MoveOntoPopup()
1471 call test_setmouse(4, 17)
1472 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1473 endfunc
1474 func MoveAway()
1475 call test_setmouse(5, 13)
1476 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1477 endfunc
1478 END
1479 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001480 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001481 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001482 call term_sendkeys(buf, 'j')
1483 call term_sendkeys(buf, ":call Hover()\<CR>")
1484 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1485
1486 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1487 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1488
1489 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1490 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1491
1492 " clean up
1493 call StopVimInTerminal(buf)
1494 call delete('XtestPopupBeval')
1495endfunc
1496
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001497func Test_popup_filter()
1498 new
1499 call setline(1, 'some text')
1500
1501 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001502 if a:c == 'e' || a:c == "\<F9>"
1503 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001504 return 1
1505 endif
1506 if a:c == '0'
1507 let g:ignored = '0'
1508 return 0
1509 endif
1510 if a:c == 'x'
1511 call popup_close(a:winid)
1512 return 1
1513 endif
1514 return 0
1515 endfunc
1516
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001517 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001518 redraw
1519
1520 " e is consumed by the filter
1521 call feedkeys('e', 'xt')
1522 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001523 call feedkeys("\<F9>", 'xt')
1524 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001525
1526 " 0 is ignored by the filter
1527 normal $
1528 call assert_equal(9, getcurpos()[2])
1529 call feedkeys('0', 'xt')
1530 call assert_equal('0', g:ignored)
1531 call assert_equal(1, getcurpos()[2])
1532
1533 " x closes the popup
1534 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001535 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001536 call assert_equal(-1, winbufnr(winid))
1537
1538 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001539 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001540endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001541
Bram Moolenaar189832b2020-09-23 12:29:11 +02001542" this tests that the "ex_normal_busy_done" flag works
1543func Test_popup_filter_normal_cmd()
1544 CheckScreendump
1545
1546 let lines =<< trim END
1547 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1548 call timer_start(0, {-> win_execute(g:winid, 'norm! zz')})
1549 END
1550 call writefile(lines, 'XtestPopupNormal')
1551 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1552 call TermWait(buf, 100)
1553 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1554
1555 call StopVimInTerminal(buf)
1556 call delete('XtestPopupNormal')
1557endfunc
1558
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001559" this tests that we don't get stuck with an error in "win_execute()"
1560func Test_popup_filter_win_execute()
1561 CheckScreendump
1562
1563 let lines =<< trim END
1564 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1565 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1566 END
1567 call writefile(lines, 'XtestPopupWinExecute')
1568 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 10, wait_for_ruler: 0})
1569
1570 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1571 call term_sendkeys(buf, "\<CR>")
1572 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1573 call term_sendkeys(buf, "\<CR>")
1574 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1575 call term_sendkeys(buf, "\<CR>")
1576 call term_sendkeys(buf, "\<CR>")
1577 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1578
1579 call StopVimInTerminal(buf)
1580 call delete('XtestPopupWinExecute')
1581endfunc
1582
Bram Moolenaara42d9452019-06-15 21:46:30 +02001583func ShowDialog(key, result)
1584 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001585 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001586 \ filter: 'popup_filter_yesno',
1587 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001588 \ })
1589 redraw
1590 call feedkeys(a:key, "xt")
1591 call assert_equal(winid, s:cb_winid)
1592 call assert_equal(a:result, s:cb_res)
1593endfunc
1594
1595func Test_popup_dialog()
1596 func QuitCallback(id, res)
1597 let s:cb_winid = a:id
1598 let s:cb_res = a:res
1599 endfunc
1600
1601 let winid = ShowDialog("y", 1)
1602 let winid = ShowDialog("Y", 1)
1603 let winid = ShowDialog("n", 0)
1604 let winid = ShowDialog("N", 0)
1605 let winid = ShowDialog("x", 0)
1606 let winid = ShowDialog("X", 0)
1607 let winid = ShowDialog("\<Esc>", 0)
1608 let winid = ShowDialog("\<C-C>", -1)
1609
1610 delfunc QuitCallback
1611endfunc
1612
Bram Moolenaara730e552019-06-16 19:05:31 +02001613func ShowMenu(key, result)
1614 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001615 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001616 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001617 \ })
1618 redraw
1619 call feedkeys(a:key, "xt")
1620 call assert_equal(winid, s:cb_winid)
1621 call assert_equal(a:result, s:cb_res)
1622endfunc
1623
1624func Test_popup_menu()
1625 func QuitCallback(id, res)
1626 let s:cb_winid = a:id
1627 let s:cb_res = a:res
1628 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001629 " mapping won't be used in popup
1630 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001631
1632 let winid = ShowMenu(" ", 1)
1633 let winid = ShowMenu("j \<CR>", 2)
1634 let winid = ShowMenu("JjK \<CR>", 2)
1635 let winid = ShowMenu("jjjjjj ", 3)
1636 let winid = ShowMenu("kkk ", 1)
1637 let winid = ShowMenu("x", -1)
1638 let winid = ShowMenu("X", -1)
1639 let winid = ShowMenu("\<Esc>", -1)
1640 let winid = ShowMenu("\<C-C>", -1)
1641
1642 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001643 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001644endfunc
1645
1646func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001647 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001648
1649 let lines =<< trim END
1650 call setline(1, range(1, 20))
1651 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001652 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001653 func MenuDone(id, res)
1654 echomsg "selected " .. a:res
1655 endfunc
1656 END
1657 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001658 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001659 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1660
1661 call term_sendkeys(buf, "jj")
1662 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1663
1664 call term_sendkeys(buf, " ")
1665 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1666
1667 " clean up
1668 call StopVimInTerminal(buf)
1669 call delete('XtestPopupMenu')
1670endfunc
1671
Bram Moolenaarf914a332019-07-20 15:09:56 +02001672func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001673 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001674
1675 let lines =<< trim END
1676 call setline(1, range(1, 20))
1677 hi PopupSelected ctermbg=green
1678 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1679 func MenuDone(id, res)
1680 echomsg "selected " .. a:res
1681 endfunc
1682 END
1683 call writefile(lines, 'XtestPopupNarrowMenu')
1684 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1685 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1686
1687 " clean up
1688 call term_sendkeys(buf, "x")
1689 call StopVimInTerminal(buf)
1690 call delete('XtestPopupNarrowMenu')
1691endfunc
1692
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001693func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001694 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001695
1696 " Create a popup without title or border, a line of padding will be added to
1697 " put the title on.
1698 let lines =<< trim END
1699 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001700 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001701 END
1702 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001703 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001704 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1705
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001706 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1707 call term_sendkeys(buf, ":\<CR>")
1708 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1709
1710 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1711 call term_sendkeys(buf, ":\<CR>")
1712 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1713
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001714 " clean up
1715 call StopVimInTerminal(buf)
1716 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001717
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001718 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001719 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001720 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001721 call assert_equal('Another Title', popup_getoptions(winid).title)
1722
1723 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001724endfunc
1725
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001726func Test_popup_close_callback()
1727 func PopupDone(id, result)
1728 let g:result = a:result
1729 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001730 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001731 redraw
1732 call popup_close(winid, 'done')
1733 call assert_equal('done', g:result)
1734endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001735
1736func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001737 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001738 redraw
1739 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001740 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001741 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001742 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001743
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001744 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001745 redraw
1746 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001747 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001748 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001749 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001750endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001751
1752func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001753 CheckScreendump
1754
Bram Moolenaar988c4332019-06-02 14:12:11 +02001755 " +-----------------------------+
1756 " | | |
1757 " | | |
1758 " | | |
1759 " | line1 |
1760 " |------------line2------------|
1761 " | line3 |
1762 " | line4 |
1763 " | |
1764 " | |
1765 " +-----------------------------+
1766 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001767 split
1768 vsplit
1769 let info_window1 = getwininfo()[0]
1770 let line = info_window1['height']
1771 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001772 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001773 \ line : line,
1774 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001775 \ })
1776 END
1777 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001778 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001779 call term_sendkeys(buf, "\<C-W>w")
1780 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1781
1782 " clean up
1783 call StopVimInTerminal(buf)
1784 call delete('XtestPopupBehind')
1785endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001786
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001787func s:VerifyPosition(p, msg, line, col, width, height)
1788 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1789 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1790 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1791 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001792endfunc
1793
1794func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001795 " Anything placed past the last cell on the right of the screen is moved to
1796 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001797 "
1798 " When wrapping is disabled, we also shift to the left to display on the
1799 " screen, unless fixed is set.
1800
1801 " Entries for cases which don't vary based on wrapping.
1802 " Format is per tests described below
1803 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001804 \ ['a', 5, &columns, 5, &columns, 1, 1],
1805 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1806 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001807 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001808 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001809
1810 " these test groups are dicts with:
1811 " - comment: something to identify the group of tests by
1812 " - options: dict of options to merge with the row/col in tests
1813 " - tests: list of cases. Each one is a list with elements:
1814 " - text
1815 " - row
1816 " - col
1817 " - expected row
1818 " - expected col
1819 " - expected width
1820 " - expected height
1821 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001822 \ #{
1823 \ comment: 'left-aligned with wrapping',
1824 \ options: #{
1825 \ wrap: 1,
1826 \ pos: 'botleft',
1827 \ },
1828 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001829 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1830 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1831 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1832 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1833 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1834 \
1835 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1836 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1837 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1838 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1839 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1840 \
1841 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1842 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1843 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001844 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1845 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001846 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001847 \ ],
1848 \ },
1849 \ #{
1850 \ comment: 'left aligned without wrapping',
1851 \ options: #{
1852 \ wrap: 0,
1853 \ pos: 'botleft',
1854 \ },
1855 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001856 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1857 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1858 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1859 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1860 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1861 \
1862 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1863 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1864 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1865 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1866 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1867 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001868 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1869 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1870 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1871 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1872 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1873 \ ],
1874 \ },
1875 \ #{
1876 \ comment: 'left aligned with fixed position',
1877 \ options: #{
1878 \ wrap: 0,
1879 \ fixed: 1,
1880 \ pos: 'botleft',
1881 \ },
1882 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001883 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1884 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1885 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1886 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1887 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1888 \
1889 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1890 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1891 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1892 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1893 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1894 \
1895 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1896 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1897 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001898 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1899 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1900 \ ],
1901 \ },
1902 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001903
1904 for test_group in tests
1905 for test in test_group.tests
1906 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001907 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001908 \ line: line,
1909 \ col: col,
1910 \ }
1911 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001912
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001913 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001914
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001915 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001916 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
1917 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001918 endfor
1919 endfor
1920
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001921 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001922 %bwipe!
1923endfunc
1924
Bram Moolenaar3397f742019-06-02 18:40:06 +02001925func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001926 " width of screen
1927 let X = join(map(range(&columns), {->'X'}), '')
1928
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001929 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1930 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001931
1932 redraw
1933 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1934 call assert_equal(X, line)
1935
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001936 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001937 redraw
1938
1939 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001940 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
1941 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001942
1943 redraw
1944 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1945 call assert_equal(X, line)
1946
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001947 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001948 redraw
1949
1950 " Extend so > window width
1951 let X .= 'x'
1952
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001953 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1954 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001955
1956 redraw
1957 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1958 call assert_equal(X[ : -2 ], line)
1959
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001960 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001961 redraw
1962
1963 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001964 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
1965 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001966
1967 redraw
1968 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1969 call assert_equal(X[ : -2 ], line)
1970
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001971 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001972 redraw
1973
1974 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001975 let p = popup_create(X,
1976 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
1977 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001978
1979 redraw
1980 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1981 let e_line = ' ' . X[ 1 : -2 ]
1982 call assert_equal(e_line, line)
1983
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001984 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001985 redraw
1986
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001987 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001988 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02001989endfunc
1990
1991func Test_popup_moved()
1992 new
1993 call test_override('char_avail', 1)
1994 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
1995
1996 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001997 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001998 redraw
1999 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002000 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002001 " trigger the check for last_cursormoved by going into insert mode
2002 call feedkeys("li\<Esc>", 'xt')
2003 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002004 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002005
2006 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002007 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002008 redraw
2009 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002010 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002011 call feedkeys("hi\<Esc>", 'xt')
2012 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002013 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002014
2015 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002016 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002017 redraw
2018 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002019 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002020 call feedkeys("li\<Esc>", 'xt')
2021 call assert_equal(1, popup_getpos(winid).visible)
2022 call feedkeys("ei\<Esc>", 'xt')
2023 call assert_equal(1, popup_getpos(winid).visible)
2024 call feedkeys("eli\<Esc>", 'xt')
2025 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002026 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002027
Bram Moolenaar17627312019-06-02 19:53:44 +02002028 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002029 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002030 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002031 redraw
2032 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002033 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002034 call feedkeys("eli\<Esc>", 'xt')
2035 call assert_equal(1, popup_getpos(winid).visible)
2036 call feedkeys("wi\<Esc>", 'xt')
2037 call assert_equal(1, popup_getpos(winid).visible)
2038 call feedkeys("Eli\<Esc>", 'xt')
2039 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002040 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002041
2042 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002043 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002044 redraw
2045 call assert_equal(1, popup_getpos(winid).visible)
2046 call feedkeys("eli\<Esc>", 'xt')
2047 call feedkeys("ei\<Esc>", 'xt')
2048 call assert_equal(1, popup_getpos(winid).visible)
2049 call feedkeys("eli\<Esc>", 'xt')
2050 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002051 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002052
2053 bwipe!
2054 call test_override('ALL', 0)
2055endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002056
2057func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002058 CheckFeature timers
2059 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002060
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002061 let lines =<< trim END
2062 call setline(1, range(1, 20))
2063 hi Notification ctermbg=lightblue
2064 call popup_notification('first notification', {})
2065 END
2066 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002067 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002068 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2069
2070 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002071 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2072 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002073 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2074
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002075 " clean up
2076 call StopVimInTerminal(buf)
2077 call delete('XtestNotifications')
2078endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002079
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002080func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002081 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002082
2083 let lines =<< trim END
2084 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002085 hi ScrollThumb ctermbg=blue
2086 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002087 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002088 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002089 \ minwidth: 8,
2090 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002091 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002092 func ScrollUp()
2093 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2094 endfunc
2095 func ScrollDown()
2096 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2097 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002098 func ClickTop()
2099 call feedkeys("\<F4>\<LeftMouse>", "xt")
2100 endfunc
2101 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002102 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002103 call feedkeys("\<F5>\<LeftMouse>", "xt")
2104 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002105 func Popup_filter(winid, key)
2106 if a:key == 'j'
2107 let line = popup_getoptions(a:winid).firstline
2108 let nlines = line('$', a:winid)
2109 let newline = line < nlines ? (line + 1) : nlines
2110 call popup_setoptions(a:winid, #{firstline: newline})
2111 return v:true
2112 elseif a:key == 'x'
2113 call popup_close(a:winid)
2114 return v:true
2115 endif
2116 endfunc
2117
2118 func PopupScroll()
2119 call popup_clear()
2120 let text =<< trim END
2121 1
2122 2
2123 3
2124 4
2125 long line long line long line long line long line long line
2126 long line long line long line long line long line long line
2127 long line long line long line long line long line long line
2128 END
2129 call popup_create(text, #{
2130 \ minwidth: 30,
2131 \ maxwidth: 30,
2132 \ minheight: 4,
2133 \ maxheight: 4,
2134 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +01002135 \ lastline: 4,
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002136 \ wrap: v:true,
2137 \ scrollbar: v:true,
2138 \ mapping: v:false,
2139 \ filter: funcref('Popup_filter')
2140 \ })
2141 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002142 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002143 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2144 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002145 END
2146 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002147 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002148 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2149
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002150 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002151 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002152 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2153
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002154 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002155 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002156 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2157
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002158 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002159 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002160 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2161
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002162 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002163 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002164 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2165 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2166
2167 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2168 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2169
2170 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002171 " wait a bit, otherwise it fails sometimes (double click recognized?)
2172 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002173 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2174 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2175
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002176 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2177 sleep 100m
2178 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2179 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2180
2181 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2182 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2183
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002184 " remove the minwidth and maxheight
2185 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002186 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002187 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2188
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002189 " check size with non-wrapping lines
2190 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2191 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2192
2193 " check size with wrapping lines
2194 call term_sendkeys(buf, "j")
2195 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002196
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002197 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002198 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002199 call StopVimInTerminal(buf)
2200 call delete('XtestPopupScroll')
2201endfunc
2202
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002203func Test_popup_too_high_scrollbar()
2204 CheckScreendump
2205
2206 let lines =<< trim END
2207 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2208 set scrolloff=0
2209 func ShowPopup()
2210 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2211 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2212 \ minwidth: 8,
2213 \ border: [],
2214 \ })
2215 endfunc
2216 normal 3G$
2217 call ShowPopup()
2218 END
2219 call writefile(lines, 'XtestPopupToohigh')
2220 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2221 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2222
2223 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2224 call term_sendkeys(buf, "8G$")
2225 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2226 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2227
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002228 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2229 call term_sendkeys(buf, "gg$")
2230 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2231 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2232
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002233 " clean up
2234 call StopVimInTerminal(buf)
2235 call delete('XtestPopupToohigh')
2236endfunc
2237
Bram Moolenaar437a7462019-07-05 20:17:22 +02002238func Test_popup_fitting_scrollbar()
2239 " this was causing a crash, divide by zero
2240 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002241 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002242 \ scrollbar: 1,
2243 \ maxwidth: 10,
2244 \ maxheight: 5,
2245 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002246 redraw
2247 call popup_clear()
2248endfunc
2249
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002250func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002251 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002252
2253 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002254 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002255 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002256 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002257 END
2258
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002259 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002260 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002261 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2262
2263 " Setting to empty string clears it
2264 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2265 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2266
2267 " Setting a list
2268 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2269 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2270
2271 " Shrinking with a list
2272 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2273 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2274
2275 " Growing with a list
2276 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2277 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2278
2279 " Empty list clears
2280 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2281 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2282
2283 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002284 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002285 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2286
Bram Moolenaarb0992022020-01-30 14:55:42 +01002287 " range() (doesn't work)
2288 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2289 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2290
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002291 " clean up
2292 call StopVimInTerminal(buf)
2293 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002294endfunc
2295
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002296func Test_popup_settext_getline()
2297 let id = popup_create('', #{ tabpage: 0 })
2298 call popup_settext(id, ['a','b'])
2299 call assert_equal(2, line('$', id)) " OK :)
2300 call popup_close(id)
2301
2302 let id = popup_create('', #{ tabpage: -1 })
2303 call popup_settext(id, ['a','b'])
2304 call assert_equal(2, line('$', id)) " Fails :(
2305 call popup_close(id)
2306endfunc
2307
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002308func Test_popup_hidden()
2309 new
2310
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002311 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002312 redraw
2313 call assert_equal(0, popup_getpos(winid).visible)
2314 call popup_close(winid)
2315
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002316 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002317 redraw
2318 call assert_equal(0, popup_getpos(winid).visible)
2319 call popup_close(winid)
2320
2321 func QuitCallback(id, res)
2322 let s:cb_winid = a:id
2323 let s:cb_res = a:res
2324 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002325 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002326 \ filter: 'popup_filter_yesno',
2327 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002328 \ })
2329 redraw
2330 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002331 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2332 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002333 exe "normal anot used by filter\<Esc>"
2334 call assert_equal('not used by filter', getline(1))
2335
2336 call popup_show(winid)
2337 call feedkeys('y', "xt")
2338 call assert_equal(1, s:cb_res)
2339
2340 bwipe!
2341 delfunc QuitCallback
2342endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002343
2344" Test options not checked elsewhere
2345func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002346 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002347 let options = popup_getoptions(winid)
2348 call assert_equal(1, options.wrap)
2349 call assert_equal(0, options.drag)
2350 call assert_equal('Beautiful', options.highlight)
2351
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002352 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002353 let options = popup_getoptions(winid)
2354 call assert_equal(0, options.wrap)
2355 call assert_equal(1, options.drag)
2356 call assert_equal('Another', options.highlight)
2357
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002358 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2359 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2360
Bram Moolenaarae943152019-06-16 22:54:14 +02002361 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002362 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002363endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002364
2365func Test_popupwin_garbage_collect()
2366 func MyPopupFilter(x, winid, c)
2367 " NOP
2368 endfunc
2369
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002370 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002371 call test_garbagecollect_now()
2372 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002373 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002374 call feedkeys('j', 'xt')
2375 call assert_true(v:true)
2376
2377 call popup_close(winid)
2378 delfunc MyPopupFilter
2379endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002380
Bram Moolenaar581ba392019-09-03 22:08:33 +02002381func Test_popupwin_filter_mode()
2382 func MyPopupFilter(winid, c)
2383 let s:typed = a:c
2384 if a:c == ':' || a:c == "\r" || a:c == 'v'
2385 " can start cmdline mode, get out, and start/stop Visual mode
2386 return 0
2387 endif
2388 return 1
2389 endfunc
2390
2391 " Normal, Visual and Insert mode
2392 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2393 redraw
2394 call feedkeys('x', 'xt')
2395 call assert_equal('x', s:typed)
2396
2397 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2398 call assert_equal(':', s:typed)
2399 call assert_equal('foo', g:foo)
2400
2401 let @x = 'something'
2402 call feedkeys('v$"xy', 'xt')
2403 call assert_equal('y', s:typed)
2404 call assert_equal('something', @x) " yank command is filtered out
2405 call feedkeys('v', 'xt') " end Visual mode
2406
2407 call popup_close(winid)
2408
2409 " only Normal mode
2410 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2411 redraw
2412 call feedkeys('x', 'xt')
2413 call assert_equal('x', s:typed)
2414
2415 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2416 call assert_equal(':', s:typed)
2417 call assert_equal('foo', g:foo)
2418
2419 let @x = 'something'
2420 call feedkeys('v$"xy', 'xt')
2421 call assert_equal('v', s:typed)
2422 call assert_notequal('something', @x)
2423
2424 call popup_close(winid)
2425
2426 " default: all modes
2427 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2428 redraw
2429 call feedkeys('x', 'xt')
2430 call assert_equal('x', s:typed)
2431
2432 let g:foo = 'bar'
2433 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2434 call assert_equal("\r", s:typed)
2435 call assert_equal('bar', g:foo)
2436
2437 let @x = 'something'
2438 call feedkeys('v$"xy', 'xt')
2439 call assert_equal('y', s:typed)
2440 call assert_equal('something', @x) " yank command is filtered out
2441 call feedkeys('v', 'xt') " end Visual mode
2442
2443 call popup_close(winid)
2444 delfunc MyPopupFilter
2445endfunc
2446
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002447func Test_popupwin_filter_mouse()
2448 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002449 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002450 return 0
2451 endfunc
2452
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002453 call setline(1, ['.'->repeat(25)]->repeat(10))
2454 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2455 \ line: 2,
2456 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002457 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002458 \ padding: [],
2459 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002460 \ filter: 'MyPopupFilter',
2461 \ })
2462 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002463 " 123456789012345678901
2464 " 1 .....................
2465 " 2 ...+--------------+..
2466 " 3 ...| |..
2467 " 4 ...| short |..
2468 " 5 ...| long line th |..
2469 " 6 ...| at will wrap |..
2470 " 7 ...| other |..
2471 " 8 ...| |..
2472 " 9 ...+--------------+..
2473 " 10 .....................
2474 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002475
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002476 func AddItemOutsidePopup(tests, row, col)
2477 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2478 \ screenrow: a:row, screencol: a:col,
2479 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2480 \ line: a:row, column: a:col,
2481 \ }})
2482 endfunc
2483 func AddItemInPopupBorder(tests, winid, row, col)
2484 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2485 \ screenrow: a:row, screencol: a:col,
2486 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2487 \ line: 0, column: 0,
2488 \ }})
2489 endfunc
2490 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2491 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2492 \ screenrow: a:row, screencol: a:col,
2493 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2494 \ line: a:textline, column: a:textcol,
2495 \ }})
2496 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002497
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002498 " above and below popup
2499 for c in range(1, 21)
2500 call AddItemOutsidePopup(tests, 1, c)
2501 call AddItemOutsidePopup(tests, 10, c)
2502 endfor
2503 " left and right of popup
2504 for r in range(1, 10)
2505 call AddItemOutsidePopup(tests, r, 3)
2506 call AddItemOutsidePopup(tests, r, 20)
2507 endfor
2508 " top and bottom in popup
2509 for c in range(4, 19)
2510 call AddItemInPopupBorder(tests, winid, 2, c)
2511 call AddItemInPopupBorder(tests, winid, 3, c)
2512 call AddItemInPopupBorder(tests, winid, 8, c)
2513 call AddItemInPopupBorder(tests, winid, 9, c)
2514 endfor
2515 " left and right margin in popup
2516 for r in range(2, 9)
2517 call AddItemInPopupBorder(tests, winid, r, 4)
2518 call AddItemInPopupBorder(tests, winid, r, 5)
2519 call AddItemInPopupBorder(tests, winid, r, 18)
2520 call AddItemInPopupBorder(tests, winid, r, 19)
2521 endfor
2522 " text "short"
2523 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2524 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2525 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2526 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2527 " text "long line th"
2528 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2529 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2530 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2531 " text "at will wrap"
2532 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2533 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2534 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2535 " text "other"
2536 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2537 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2538 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2539 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002540
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002541 for item in tests
2542 call test_setmouse(item.clickrow, item.clickcol)
2543 call feedkeys("\<LeftMouse>", 'xt')
2544 call assert_equal(item.result, g:got_mousepos)
2545 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002546
2547 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002548 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002549 delfunc MyPopupFilter
2550endfunc
2551
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002552func Test_popupwin_with_buffer()
2553 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2554 let buf = bufadd('XsomeFile')
2555 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002556
2557 setlocal number
2558 call setbufvar(buf, "&wrapmargin", 13)
2559
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002560 let winid = popup_create(buf, {})
2561 call assert_notequal(0, winid)
2562 let pos = popup_getpos(winid)
2563 call assert_equal(2, pos.height)
2564 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002565
2566 " window-local option is set to default, buffer-local is not
2567 call assert_equal(0, getwinvar(winid, '&number'))
2568 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2569
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002570 call popup_close(winid)
2571 call assert_equal({}, popup_getpos(winid))
2572 call assert_equal(1, bufloaded(buf))
2573 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002574 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002575
2576 edit test_popupwin.vim
2577 let winid = popup_create(bufnr(''), {})
2578 redraw
2579 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002580 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002581endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002582
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002583func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002584 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002585 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002586 " Starting a terminal to run a shell in is considered flaky.
2587 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002588
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002589 let origwin = win_getid()
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002590 let termbuf = term_start(&shell, #{hidden: 1})
2591 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10})
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002592 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002593 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002594 sleep 100m
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002595 " Check this doesn't crash
2596 call assert_equal(winnr(), winnr('j'))
2597 call assert_equal(winnr(), winnr('k'))
2598 call assert_equal(winnr(), winnr('h'))
2599 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002600
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002601 " Cannot quit while job is running
2602 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002603
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002604 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002605 call feedkeys("xxx\<C-W>N", 'xt')
2606 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2607 call feedkeys("a\<C-U>", 'xt')
2608
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002609 " Cannot escape from terminal window
2610 call assert_fails('tab drop xxx', 'E863:')
2611
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002612 " Cannot open a second one.
2613 let termbuf2 = term_start(&shell, #{hidden: 1})
2614 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2615 call term_sendkeys(termbuf2, "exit\<CR>")
2616
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002617 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002618 call feedkeys("exit\<CR>", 'xt')
2619 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002620 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002621
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002622 call feedkeys(":quit\<CR>", 'xt')
2623 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002624endfunc
2625
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002626func Test_popupwin_close_prevwin()
2627 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002628 call Popupwin_close_prevwin()
2629endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002630
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002631def Popupwin_close_prevwin()
2632 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002633 split
2634 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002635 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002636 let buf = term_start(&shell, #{hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002637 popup_create(buf, {})
2638 TermWait(buf, 100)
2639 popup_clear(true)
2640 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002641
2642 quit
2643 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002644enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002645
Bram Moolenaar934470e2019-09-01 23:27:05 +02002646func Test_popupwin_with_buffer_and_filter()
2647 new Xwithfilter
2648 call setline(1, range(100))
2649 let bufnr = bufnr()
2650 hide
2651
2652 func BufferFilter(win, key)
2653 if a:key == 'G'
2654 " recursive use of "G" does not cause problems.
2655 call win_execute(a:win, 'normal! G')
2656 return 1
2657 endif
2658 return 0
2659 endfunc
2660
2661 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2662 call assert_equal(1, popup_getpos(winid).firstline)
2663 redraw
2664 call feedkeys("G", 'xt')
2665 call assert_equal(99, popup_getpos(winid).firstline)
2666
2667 call popup_close(winid)
2668 exe 'bwipe! ' .. bufnr
2669endfunc
2670
Bram Moolenaare296e312019-07-03 23:20:18 +02002671func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002672 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002673 \ maxwidth: 40,
2674 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002675 \ })
2676 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002677 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002678 redraw
2679 call assert_equal(19, popup_getpos(winid).width)
2680 endfor
2681 call popup_clear()
2682endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002683
2684func Test_popupwin_buf_close()
2685 let buf = bufadd('Xtestbuf')
2686 call bufload(buf)
2687 call setbufline(buf, 1, ['just', 'some', 'lines'])
2688 let winid = popup_create(buf, {})
2689 redraw
2690 call assert_equal(3, popup_getpos(winid).height)
2691 let bufinfo = getbufinfo(buf)[0]
2692 call assert_equal(1, bufinfo.changed)
2693 call assert_equal(0, bufinfo.hidden)
2694 call assert_equal(0, bufinfo.listed)
2695 call assert_equal(1, bufinfo.loaded)
2696 call assert_equal([], bufinfo.windows)
2697 call assert_equal([winid], bufinfo.popups)
2698
2699 call popup_close(winid)
2700 call assert_equal({}, popup_getpos(winid))
2701 let bufinfo = getbufinfo(buf)[0]
2702 call assert_equal(1, bufinfo.changed)
2703 call assert_equal(1, bufinfo.hidden)
2704 call assert_equal(0, bufinfo.listed)
2705 call assert_equal(1, bufinfo.loaded)
2706 call assert_equal([], bufinfo.windows)
2707 call assert_equal([], bufinfo.popups)
2708 exe 'bwipe! ' .. buf
2709endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002710
2711func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002712 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002713
2714 let lines =<< trim END
2715 call setline(1, range(1, 10))
2716 hi ScrollThumb ctermbg=blue
2717 hi ScrollBar ctermbg=red
2718 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002719 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002720 \ maxwidth: 10,
2721 \ maxheight: 3,
2722 \ pos : 'topleft',
2723 \ col : a:col,
2724 \ line : a:line,
2725 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002726 \ })
2727 endfunc
2728 call PopupMenu(['x'], 1, 1)
2729 call PopupMenu(['123456789|'], 1, 16)
2730 call PopupMenu(['123456789|' .. ' '], 7, 1)
2731 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2732 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2733 END
2734 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002735 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002736 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2737
2738 " close the menu popupwin.
2739 call term_sendkeys(buf, " ")
2740 call term_sendkeys(buf, " ")
2741 call term_sendkeys(buf, " ")
2742 call term_sendkeys(buf, " ")
2743 call term_sendkeys(buf, " ")
2744
2745 " clean up
2746 call StopVimInTerminal(buf)
2747 call delete('XtestPopupMenuMaxWidth')
2748endfunc
2749
Bram Moolenaara901a372019-07-13 16:38:50 +02002750func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002751 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002752
2753 let lines =<< trim END
2754 call setline(1, range(1, 20))
2755 hi ScrollThumb ctermbg=blue
2756 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002757 eval ['one', 'two', 'three', 'four', 'five',
2758 \ 'six', 'seven', 'eight', 'nine']
2759 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002760 \ minwidth: 8,
2761 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002762 \ })
2763 END
2764 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002765 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002766
2767 call term_sendkeys(buf, "j")
2768 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2769
2770 call term_sendkeys(buf, "jjj")
2771 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2772
2773 " if the cursor is the bottom line, it stays at the bottom line.
2774 call term_sendkeys(buf, repeat("j", 20))
2775 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2776
2777 call term_sendkeys(buf, "kk")
2778 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2779
2780 call term_sendkeys(buf, "k")
2781 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2782
2783 " if the cursor is in the top line, it stays in the top line.
2784 call term_sendkeys(buf, repeat("k", 20))
2785 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2786
2787 " close the menu popupwin.
2788 call term_sendkeys(buf, " ")
2789
2790 " clean up
2791 call StopVimInTerminal(buf)
2792 call delete('XtestPopupMenuScroll')
2793endfunc
2794
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002795func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002796 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002797
2798 let lines =<< trim END
2799 function! MyFilter(winid, key) abort
2800 if a:key == "0"
2801 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2802 return 1
2803 endif
2804 if a:key == "G"
2805 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2806 return 1
2807 endif
2808 if a:key == "j"
2809 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2810 return 1
2811 endif
2812 if a:key == "k"
2813 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2814 return 1
2815 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002816 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002817 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002818 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002819 endif
2820 return 0
2821 endfunction
2822 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2823 \ maxheight : 3,
2824 \ filter : 'MyFilter'
2825 \ })
2826 END
2827 call writefile(lines, 'XtestPopupMenuFilter')
2828 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2829
2830 call term_sendkeys(buf, "j")
2831 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2832
2833 call term_sendkeys(buf, "k")
2834 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2835
2836 call term_sendkeys(buf, "G")
2837 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2838
2839 call term_sendkeys(buf, "0")
2840 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2841
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002842 " check that when the popup is closed in the filter the screen is redrawn
2843 call term_sendkeys(buf, ":")
2844 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2845 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002846
2847 " clean up
2848 call StopVimInTerminal(buf)
2849 call delete('XtestPopupMenuFilter')
2850endfunc
2851
2852func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002853 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002854
2855 let winid = popup_create('some text', {})
2856 call assert_equal(0, popup_getoptions(winid).cursorline)
2857 call popup_close(winid)
2858
2859 let winid = popup_create('some text', #{ cursorline: 1, })
2860 call assert_equal(1, popup_getoptions(winid).cursorline)
2861 call popup_close(winid)
2862
2863 let winid = popup_create('some text', #{ cursorline: 0, })
2864 call assert_equal(0, popup_getoptions(winid).cursorline)
2865 call popup_close(winid)
2866
2867 let winid = popup_menu('some text', {})
2868 call assert_equal(1, popup_getoptions(winid).cursorline)
2869 call popup_close(winid)
2870
2871 let winid = popup_menu('some text', #{ cursorline: 1, })
2872 call assert_equal(1, popup_getoptions(winid).cursorline)
2873 call popup_close(winid)
2874
2875 let winid = popup_menu('some text', #{ cursorline: 0, })
2876 call assert_equal(0, popup_getoptions(winid).cursorline)
2877 call popup_close(winid)
2878
2879 " ---------
2880 " Pattern 1
2881 " ---------
2882 let lines =<< trim END
2883 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
2884 END
2885 call writefile(lines, 'XtestPopupCursorLine')
2886 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2887 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
2888 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2889 call StopVimInTerminal(buf)
2890
2891 " ---------
2892 " Pattern 2
2893 " ---------
2894 let lines =<< trim END
2895 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
2896 END
2897 call writefile(lines, 'XtestPopupCursorLine')
2898 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2899 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
2900 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2901 call StopVimInTerminal(buf)
2902
2903 " ---------
2904 " Pattern 3
2905 " ---------
2906 let lines =<< trim END
2907 function! MyFilter(winid, key) abort
2908 if a:key == "j"
2909 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2910 return 1
2911 endif
2912 if a:key == 'x'
2913 call popup_close(a:winid)
2914 return 1
2915 endif
2916 return 0
2917 endfunction
2918 call popup_menu(['111', '222', '333'], #{
2919 \ cursorline : 0,
2920 \ maxheight : 2,
2921 \ filter : 'MyFilter',
2922 \ })
2923 END
2924 call writefile(lines, 'XtestPopupCursorLine')
2925 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2926 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
2927 call term_sendkeys(buf, "j")
2928 call term_sendkeys(buf, "j")
2929 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
2930 call term_sendkeys(buf, "x")
2931 call StopVimInTerminal(buf)
2932
2933 " ---------
2934 " Pattern 4
2935 " ---------
2936 let lines =<< trim END
2937 function! MyFilter(winid, key) abort
2938 if a:key == "j"
2939 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2940 return 1
2941 endif
2942 if a:key == 'x'
2943 call popup_close(a:winid)
2944 return 1
2945 endif
2946 return 0
2947 endfunction
2948 call popup_menu(['111', '222', '333'], #{
2949 \ cursorline : 1,
2950 \ maxheight : 2,
2951 \ filter : 'MyFilter',
2952 \ })
2953 END
2954 call writefile(lines, 'XtestPopupCursorLine')
2955 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2956 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
2957 call term_sendkeys(buf, "j")
2958 call term_sendkeys(buf, "j")
2959 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
2960 call term_sendkeys(buf, "x")
2961 call StopVimInTerminal(buf)
2962
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02002963 " ---------
2964 " Cursor in second line when creating the popup
2965 " ---------
2966 let lines =<< trim END
2967 let winid = popup_create(['111', '222', '333'], #{
2968 \ cursorline : 1,
2969 \ })
2970 call win_execute(winid, "2")
2971 END
2972 call writefile(lines, 'XtestPopupCursorLine')
2973 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2974 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
2975 call StopVimInTerminal(buf)
2976
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002977 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01002978
2979 " ---------
2980 " Use current buffer for popupmenu
2981 " ---------
2982 let lines =<< trim END
2983 call setline(1, ['one', 'two', 'three'])
2984 let winid = popup_create(bufnr('%'), #{
2985 \ cursorline : 1,
2986 \ })
2987 call win_execute(winid, "2")
2988 END
2989 call writefile(lines, 'XtestPopupCursorLine')
2990 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2991 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
2992 call StopVimInTerminal(buf)
2993
2994 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002995endfunc
2996
Bram Moolenaarf914a332019-07-20 15:09:56 +02002997func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002998 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01002999 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003000
Bram Moolenaarf914a332019-07-20 15:09:56 +02003001 call writefile([
3002 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3003 \ "another\tXtagfile\t/^this is another",
3004 \ "theword\tXtagfile\t/^theword"],
3005 \ 'Xtags')
3006 call writefile(range(1,20)
3007 \ + ['theword is here']
3008 \ + range(22, 27)
3009 \ + ['this is another place']
3010 \ + range(29, 40),
3011 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003012 call writefile(range(1,10)
3013 \ + ['searched word is here']
3014 \ + range(12, 20),
3015 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003016 let lines =<< trim END
3017 set tags=Xtags
3018 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003019 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003020 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003021 \ 'three',
3022 \ 'four',
3023 \ 'five',
3024 \ 'six',
3025 \ 'seven',
3026 \ 'find theword somewhere',
3027 \ 'nine',
3028 \ 'this is another word',
3029 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003030 set previewpopup=height:4,width:40
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003031 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003032 END
3033 call writefile(lines, 'XtestPreviewPopup')
3034 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3035
3036 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3037 call term_sendkeys(buf, ":\<CR>")
3038 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3039
3040 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3041 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3042
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003043 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003044 call term_sendkeys(buf, ":\<CR>")
3045 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3046
3047 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3048 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3049
Bram Moolenaar799439a2020-02-11 21:44:17 +01003050 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003051 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003052 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003053
3054 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003055 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003056 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3057
3058 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3059 call term_sendkeys(buf, ":\<CR>")
3060 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3061
3062 call term_sendkeys(buf, ":pclose\<CR>")
3063 call term_sendkeys(buf, ":psearch searched\<CR>")
3064 call term_sendkeys(buf, ":\<CR>")
3065 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003066
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003067 call term_sendkeys(buf, "\<C-W>p")
3068 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3069
3070 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3071 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3072
Bram Moolenaarf914a332019-07-20 15:09:56 +02003073 call StopVimInTerminal(buf)
3074 call delete('Xtags')
3075 call delete('Xtagfile')
3076 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003077 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003078endfunc
3079
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003080func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003081 let lines =<< trim END
3082 set completeopt+=preview,popup
3083 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003084 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003085
3086 func CompleteFuncDict(findstart, base)
3087 if a:findstart
3088 if col('.') > 10
3089 return col('.') - 10
3090 endif
3091 return 0
3092 endif
3093
3094 return {
3095 \ 'words': [
3096 \ {
3097 \ 'word': 'aword',
3098 \ 'abbr': 'wrd',
3099 \ 'menu': 'extra text',
3100 \ 'info': 'words are cool',
3101 \ 'kind': 'W',
3102 \ 'user_data': 'test'
3103 \ },
3104 \ {
3105 \ 'word': 'anotherword',
3106 \ 'abbr': 'anotwrd',
3107 \ 'menu': 'extra text',
3108 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3109 \ 'kind': 'W',
3110 \ 'user_data': 'notest'
3111 \ },
3112 \ {
3113 \ 'word': 'noinfo',
3114 \ 'abbr': 'noawrd',
3115 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003116 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003117 \ 'kind': 'W',
3118 \ 'user_data': 'notest'
3119 \ },
3120 \ {
3121 \ 'word': 'thatword',
3122 \ 'abbr': 'thatwrd',
3123 \ 'menu': 'extra text',
3124 \ 'info': 'that word is cool',
3125 \ 'kind': 'W',
3126 \ 'user_data': 'notest'
3127 \ },
3128 \ ]
3129 \ }
3130 endfunc
3131 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003132 func ChangeColor()
3133 let id = popup_findinfo()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003134 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003135 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003136
3137 func InfoHidden()
3138 set completepopup=height:4,border:off,align:menu
3139 set completeopt-=popup completeopt+=popuphidden
3140 au CompleteChanged * call HandleChange()
3141 endfunc
3142
3143 let s:counter = 0
3144 func HandleChange()
3145 let s:counter += 1
3146 let selected = complete_info(['selected']).selected
3147 if selected <= 0
3148 " First time: do nothing, info remains hidden
3149 return
3150 endif
3151 if selected == 1
3152 " Second time: show info right away
3153 let id = popup_findinfo()
3154 if id
3155 call popup_settext(id, 'immediate info ' .. s:counter)
3156 call popup_show(id)
3157 endif
3158 else
3159 " Third time: show info after a short delay
3160 call timer_start(100, 'ShowInfo')
3161 endif
3162 endfunc
3163
3164 func ShowInfo(...)
3165 let id = popup_findinfo()
3166 if id
3167 call popup_settext(id, 'async info ' .. s:counter)
3168 call popup_show(id)
3169 endif
3170 endfunc
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003171 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003172 return lines
3173endfunc
3174
3175func Test_popupmenu_info_border()
3176 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003177 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003178
3179 let lines = Get_popupmenu_lines()
3180 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003181 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003182
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003183 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003184 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003185
3186 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3187 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3188
3189 call term_sendkeys(buf, "\<C-N>")
3190 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3191
3192 call term_sendkeys(buf, "\<C-N>")
3193 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3194
3195 call term_sendkeys(buf, "\<C-N>\<C-N>")
3196 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3197
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003198 " info on the left with scrollbar
3199 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3200 call term_sendkeys(buf, "\<C-N>\<C-N>")
3201 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3202
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003203 " Test that the popupmenu's scrollbar and infopopup do not overlap
3204 call term_sendkeys(buf, "\<Esc>")
3205 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3206 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3207 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3208
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003209 " Hide the info popup, cycle trough buffers, make sure it didn't get
3210 " deleted.
3211 call term_sendkeys(buf, "\<Esc>")
3212 call term_sendkeys(buf, ":set hidden\<CR>")
3213 call term_sendkeys(buf, ":bn\<CR>")
3214 call term_sendkeys(buf, ":bn\<CR>")
3215 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3216 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3217
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003218 " Test that when the option is changed the popup changes.
3219 call term_sendkeys(buf, "\<Esc>")
3220 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3221 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3222 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3223
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003224 call term_sendkeys(buf, " \<Esc>")
3225 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3226 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3227 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3228
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003229 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003230 call StopVimInTerminal(buf)
3231 call delete('XtestInfoPopup')
3232endfunc
3233
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003234func Test_popupmenu_info_noborder()
3235 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003236 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003237
3238 let lines = Get_popupmenu_lines()
3239 call add(lines, 'set completepopup=height:4,border:off')
3240 call writefile(lines, 'XtestInfoPopupNb')
3241
3242 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003243 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003244
3245 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3246 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3247
3248 call StopVimInTerminal(buf)
3249 call delete('XtestInfoPopupNb')
3250endfunc
3251
Bram Moolenaar258cef52019-08-21 17:29:29 +02003252func Test_popupmenu_info_align_menu()
3253 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003254 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003255
3256 let lines = Get_popupmenu_lines()
3257 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3258 call writefile(lines, 'XtestInfoPopupNb')
3259
3260 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003261 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003262
3263 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3264 call term_sendkeys(buf, "\<C-N>")
3265 call term_sendkeys(buf, "\<C-N>")
3266 call term_sendkeys(buf, "\<C-N>")
3267 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3268
3269 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3270 call term_sendkeys(buf, "\<C-N>")
3271 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3272
3273 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003274 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003275 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3276 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3277 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3278
3279 call StopVimInTerminal(buf)
3280 call delete('XtestInfoPopupNb')
3281endfunc
3282
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003283func Test_popupmenu_info_hidden()
3284 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003285 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003286
3287 let lines = Get_popupmenu_lines()
3288 call add(lines, 'call InfoHidden()')
3289 call writefile(lines, 'XtestInfoPopupHidden')
3290
3291 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003292 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003293
3294 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3295 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3296
3297 call term_sendkeys(buf, "\<C-N>")
3298 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3299
3300 call term_sendkeys(buf, "\<C-N>")
3301 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3302
3303 call term_sendkeys(buf, "\<Esc>")
3304 call StopVimInTerminal(buf)
3305 call delete('XtestInfoPopupHidden')
3306endfunc
3307
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003308func Test_popupmenu_info_too_wide()
3309 CheckScreendump
3310 CheckFeature quickfix
3311
3312 let lines =<< trim END
3313 call setline(1, range(10))
3314
3315 set completeopt+=preview,popup
3316 set completepopup=align:menu
3317 set omnifunc=OmniFunc
3318 hi InfoPopup ctermbg=lightgrey
3319
3320 func OmniFunc(findstart, base)
3321 if a:findstart
3322 return 0
3323 endif
3324
3325 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3326 return #{
3327 \ words: [
3328 \ #{
3329 \ word: 'scrap',
3330 \ menu: menuText,
3331 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3332 \ },
3333 \ #{
3334 \ word: 'scappier',
3335 \ menu: menuText,
3336 \ info: 'words are cool',
3337 \ },
3338 \ #{
3339 \ word: 'scrappier2',
3340 \ menu: menuText,
3341 \ info: 'words are cool',
3342 \ },
3343 \ ]
3344 \ }
3345 endfunc
3346 END
3347
3348 call writefile(lines, 'XtestInfoPopupWide')
3349 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003350 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003351
3352 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3353 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3354
3355 call term_sendkeys(buf, "\<Esc>")
3356 call StopVimInTerminal(buf)
3357 call delete('XtestInfoPopupWide')
3358endfunc
3359
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003360func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003361 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003362 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003363 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003364 call assert_equal(bufnr, winbufnr(winid))
3365 call popup_clear()
3366endfunc
3367
Bram Moolenaar1824f452019-10-02 23:06:46 +02003368func Test_popupwin_getoptions_tablocal()
3369 topleft split
3370 let win1 = popup_create('nothing', #{maxheight: 8})
3371 let win2 = popup_create('something', #{maxheight: 10})
3372 let win3 = popup_create('something', #{maxheight: 15})
3373 call assert_equal(8, popup_getoptions(win1).maxheight)
3374 call assert_equal(10, popup_getoptions(win2).maxheight)
3375 call assert_equal(15, popup_getoptions(win3).maxheight)
3376 call popup_clear()
3377 quit
3378endfunc
3379
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003380func Test_popupwin_cancel()
3381 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3382 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3383 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3384 call assert_equal(5, popup_getpos(win1).line)
3385 call assert_equal(10, popup_getpos(win2).line)
3386 call assert_equal(15, popup_getpos(win3).line)
3387 " TODO: this also works without patch 8.1.2110
3388 call feedkeys("\<C-C>", 'xt')
3389 call assert_equal(5, popup_getpos(win1).line)
3390 call assert_equal(10, popup_getpos(win2).line)
3391 call assert_equal({}, popup_getpos(win3))
3392 call feedkeys("\<C-C>", 'xt')
3393 call assert_equal(5, popup_getpos(win1).line)
3394 call assert_equal({}, popup_getpos(win2))
3395 call assert_equal({}, popup_getpos(win3))
3396 call feedkeys("\<C-C>", 'xt')
3397 call assert_equal({}, popup_getpos(win1))
3398 call assert_equal({}, popup_getpos(win2))
3399 call assert_equal({}, popup_getpos(win3))
3400endfunc
3401
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003402func Test_popupwin_filter_redraw()
3403 " Create two popups with a filter that closes the popup when typing "0".
3404 " Both popups should close, even though the redraw also calls
3405 " popup_reset_handled()
3406
3407 func CloseFilter(winid, key)
3408 if a:key == '0'
3409 call popup_close(a:winid)
3410 redraw
3411 endif
3412 return 0 " pass the key
3413 endfunc
3414
3415 let id1 = popup_create('first one', #{
3416 \ line: 1,
3417 \ col: 1,
3418 \ filter: 'CloseFilter',
3419 \ })
3420 let id2 = popup_create('second one', #{
3421 \ line: 9,
3422 \ col: 1,
3423 \ filter: 'CloseFilter',
3424 \ })
3425 call assert_equal(1, popup_getpos(id1).line)
3426 call assert_equal(9, popup_getpos(id2).line)
3427
3428 call feedkeys('0', 'xt')
3429 call assert_equal({}, popup_getpos(id1))
3430 call assert_equal({}, popup_getpos(id2))
3431
3432 call popup_clear()
3433 delfunc CloseFilter
3434endfunc
3435
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003436func Test_popupwin_double_width()
3437 CheckScreendump
3438
3439 let lines =<< trim END
3440 call setline(1, 'x你好世界你好世你好世界你好')
3441 call setline(2, '你好世界你好世你好世界你好')
3442 call setline(3, 'x你好世界你好世你好世界你好')
3443 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3444 END
3445 call writefile(lines, 'XtestPopupWide')
3446
3447 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3448 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3449
3450 call StopVimInTerminal(buf)
3451 call delete('XtestPopupWide')
3452endfunc
3453
3454func Test_popupwin_sign()
3455 CheckScreendump
3456
3457 let lines =<< trim END
3458 call setline(1, range(10))
3459 call sign_define('Current', {
3460 \ 'text': '>>',
3461 \ 'texthl': 'WarningMsg',
3462 \ 'linehl': 'Error',
3463 \ })
3464 call sign_define('Other', {
3465 \ 'text': '#!',
3466 \ 'texthl': 'Error',
3467 \ 'linehl': 'Search',
3468 \ })
3469 let winid = popup_create(['hello', 'bright', 'world'], {
3470 \ 'minwidth': 20,
3471 \ })
3472 call setwinvar(winid, "&signcolumn", "yes")
3473 let winbufnr = winbufnr(winid)
3474
3475 " add sign to current buffer, shows
3476 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3477 " add sign to current buffer, does not show
3478 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3479
3480 " add sign to popup buffer, shows
3481 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3482 " add sign to popup buffer, does not show
3483 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003484
3485 func SetOptions()
3486 call setwinvar(g:winid, '&number', 1)
3487 call setwinvar(g:winid, '&foldcolumn', 2)
3488 call popup_settext(g:winid, 'a longer line to check the width')
3489 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003490 END
3491 call writefile(lines, 'XtestPopupSign')
3492
3493 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3494 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3495
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003496 " set more options to check the width is adjusted
3497 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3498 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3499
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003500 call StopVimInTerminal(buf)
3501 call delete('XtestPopupSign')
3502endfunc
3503
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003504func Test_popupwin_bufnr()
3505 let popwin = popup_create(['blah'], #{})
3506 let popbuf = winbufnr(popwin)
3507 split asdfasdf
3508 let newbuf = bufnr()
3509 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3510 call assert_equal(newbuf, bufnr('$'))
3511 call popup_clear()
3512 let popwin = popup_create(['blah'], #{})
3513 " reuses previous buffer number
3514 call assert_equal(popbuf, winbufnr(popwin))
3515 call assert_equal(newbuf, bufnr('$'))
3516
3517 call popup_clear()
3518 bwipe!
3519endfunc
3520
Bram Moolenaarec084d32020-02-28 22:44:47 +01003521func Test_popupwin_filter_input_multibyte()
3522 func MyPopupFilter(winid, c)
3523 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3524 return 0
3525 endfunc
3526 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3527
3528 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3529 call feedkeys("\u3000", 'xt')
3530 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3531
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003532 " UTF-8: E3 80 9B, including CSI(0x9B)
3533 call feedkeys("\u301b", 'xt')
3534 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003535
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003536 if has('unix')
3537 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003538 if has('gui_running')
3539 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3540 else
3541 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3542 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003543 call assert_equal([0xc3, 0x81], g:bytes)
3544 endif
3545
Bram Moolenaarec084d32020-02-28 22:44:47 +01003546 call popup_clear()
3547 delfunc MyPopupFilter
3548 unlet g:bytes
3549endfunc
3550
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003551func Test_popupwin_filter_close_ctrl_c()
3552 CheckScreendump
3553
3554 let lines =<< trim END
3555 vsplit
3556 set laststatus=2
3557 set statusline=%!Statusline()
3558
3559 function Statusline() abort
3560 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3561 endfunction
3562
3563 call popup_create('test test test test...', {'filter': {-> 0}})
3564 END
3565 call writefile(lines, 'XtestPopupCtrlC')
3566
3567 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3568
3569 call term_sendkeys(buf, "\<C-C>")
3570 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3571
3572 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003573 call delete('XtestPopupCtrlC')
3574endfunc
3575
3576func Test_popupwin_filter_close_wrong_name()
3577 CheckScreendump
3578
3579 let lines =<< trim END
3580 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3581 END
3582 call writefile(lines, 'XtestPopupWrongName')
3583
3584 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3585
3586 call term_sendkeys(buf, "j")
3587 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3588
3589 call StopVimInTerminal(buf)
3590 call delete('XtestPopupWrongName')
3591endfunc
3592
3593func Test_popupwin_filter_close_three_errors()
3594 CheckScreendump
3595
3596 let lines =<< trim END
3597 set cmdheight=2
3598 call popup_create('one two three...', {'filter': 'filter'})
3599 END
3600 call writefile(lines, 'XtestPopupThreeErrors')
3601
3602 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3603
3604 call term_sendkeys(buf, "jj")
3605 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3606 call term_sendkeys(buf, "j")
3607 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3608
3609 call StopVimInTerminal(buf)
3610 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003611endfunc
3612
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003613func Test_popupwin_atcursor_far_right()
3614 new
3615
3616 " this was getting stuck
3617 set signcolumn=yes
3618 call setline(1, repeat('=', &columns))
3619 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003620 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003621
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003622 " 'signcolumn' was getting reset
3623 call setwinvar(winid, '&signcolumn', 'yes')
3624 call popup_setoptions(winid, {'zindex': 1000})
3625 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3626
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003627 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003628 bwipe!
3629 set signcolumn&
3630endfunc
3631
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003632func Test_popupwin_splitmove()
3633 vsplit
3634 let win2 = win_getid()
3635 let popup_winid = popup_dialog('hello', {})
3636 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3637 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3638
3639 call popup_clear()
3640 bwipe
3641endfunc
3642
3643
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003644" vim: shiftwidth=2 sts=2