blob: 333e9a2843faf3b52b4c7903b607673b3bb18ea9 [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 Moolenaara42d9452019-06-15 21:46:30 +02001542func ShowDialog(key, result)
1543 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001544 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001545 \ filter: 'popup_filter_yesno',
1546 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001547 \ })
1548 redraw
1549 call feedkeys(a:key, "xt")
1550 call assert_equal(winid, s:cb_winid)
1551 call assert_equal(a:result, s:cb_res)
1552endfunc
1553
1554func Test_popup_dialog()
1555 func QuitCallback(id, res)
1556 let s:cb_winid = a:id
1557 let s:cb_res = a:res
1558 endfunc
1559
1560 let winid = ShowDialog("y", 1)
1561 let winid = ShowDialog("Y", 1)
1562 let winid = ShowDialog("n", 0)
1563 let winid = ShowDialog("N", 0)
1564 let winid = ShowDialog("x", 0)
1565 let winid = ShowDialog("X", 0)
1566 let winid = ShowDialog("\<Esc>", 0)
1567 let winid = ShowDialog("\<C-C>", -1)
1568
1569 delfunc QuitCallback
1570endfunc
1571
Bram Moolenaara730e552019-06-16 19:05:31 +02001572func ShowMenu(key, result)
1573 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001574 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001575 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001576 \ })
1577 redraw
1578 call feedkeys(a:key, "xt")
1579 call assert_equal(winid, s:cb_winid)
1580 call assert_equal(a:result, s:cb_res)
1581endfunc
1582
1583func Test_popup_menu()
1584 func QuitCallback(id, res)
1585 let s:cb_winid = a:id
1586 let s:cb_res = a:res
1587 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001588 " mapping won't be used in popup
1589 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001590
1591 let winid = ShowMenu(" ", 1)
1592 let winid = ShowMenu("j \<CR>", 2)
1593 let winid = ShowMenu("JjK \<CR>", 2)
1594 let winid = ShowMenu("jjjjjj ", 3)
1595 let winid = ShowMenu("kkk ", 1)
1596 let winid = ShowMenu("x", -1)
1597 let winid = ShowMenu("X", -1)
1598 let winid = ShowMenu("\<Esc>", -1)
1599 let winid = ShowMenu("\<C-C>", -1)
1600
1601 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001602 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001603endfunc
1604
1605func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001606 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001607
1608 let lines =<< trim END
1609 call setline(1, range(1, 20))
1610 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001611 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001612 func MenuDone(id, res)
1613 echomsg "selected " .. a:res
1614 endfunc
1615 END
1616 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001617 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001618 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1619
1620 call term_sendkeys(buf, "jj")
1621 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1622
1623 call term_sendkeys(buf, " ")
1624 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1625
1626 " clean up
1627 call StopVimInTerminal(buf)
1628 call delete('XtestPopupMenu')
1629endfunc
1630
Bram Moolenaarf914a332019-07-20 15:09:56 +02001631func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001632 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001633
1634 let lines =<< trim END
1635 call setline(1, range(1, 20))
1636 hi PopupSelected ctermbg=green
1637 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1638 func MenuDone(id, res)
1639 echomsg "selected " .. a:res
1640 endfunc
1641 END
1642 call writefile(lines, 'XtestPopupNarrowMenu')
1643 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1644 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1645
1646 " clean up
1647 call term_sendkeys(buf, "x")
1648 call StopVimInTerminal(buf)
1649 call delete('XtestPopupNarrowMenu')
1650endfunc
1651
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001652func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001653 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001654
1655 " Create a popup without title or border, a line of padding will be added to
1656 " put the title on.
1657 let lines =<< trim END
1658 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001659 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001660 END
1661 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001662 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001663 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1664
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001665 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1666 call term_sendkeys(buf, ":\<CR>")
1667 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1668
1669 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1670 call term_sendkeys(buf, ":\<CR>")
1671 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1672
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001673 " clean up
1674 call StopVimInTerminal(buf)
1675 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001676
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001677 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001678 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001679 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001680 call assert_equal('Another Title', popup_getoptions(winid).title)
1681
1682 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001683endfunc
1684
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001685func Test_popup_close_callback()
1686 func PopupDone(id, result)
1687 let g:result = a:result
1688 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001689 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001690 redraw
1691 call popup_close(winid, 'done')
1692 call assert_equal('done', g:result)
1693endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001694
1695func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001696 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001697 redraw
1698 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001699 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001700 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001701 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001702
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001703 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001704 redraw
1705 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001706 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001707 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001708 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001709endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001710
1711func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001712 CheckScreendump
1713
Bram Moolenaar988c4332019-06-02 14:12:11 +02001714 " +-----------------------------+
1715 " | | |
1716 " | | |
1717 " | | |
1718 " | line1 |
1719 " |------------line2------------|
1720 " | line3 |
1721 " | line4 |
1722 " | |
1723 " | |
1724 " +-----------------------------+
1725 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001726 split
1727 vsplit
1728 let info_window1 = getwininfo()[0]
1729 let line = info_window1['height']
1730 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001731 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001732 \ line : line,
1733 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001734 \ })
1735 END
1736 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001737 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001738 call term_sendkeys(buf, "\<C-W>w")
1739 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1740
1741 " clean up
1742 call StopVimInTerminal(buf)
1743 call delete('XtestPopupBehind')
1744endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001745
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001746func s:VerifyPosition(p, msg, line, col, width, height)
1747 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1748 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1749 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1750 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001751endfunc
1752
1753func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001754 " Anything placed past the last cell on the right of the screen is moved to
1755 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001756 "
1757 " When wrapping is disabled, we also shift to the left to display on the
1758 " screen, unless fixed is set.
1759
1760 " Entries for cases which don't vary based on wrapping.
1761 " Format is per tests described below
1762 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001763 \ ['a', 5, &columns, 5, &columns, 1, 1],
1764 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1765 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001766 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001767 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001768
1769 " these test groups are dicts with:
1770 " - comment: something to identify the group of tests by
1771 " - options: dict of options to merge with the row/col in tests
1772 " - tests: list of cases. Each one is a list with elements:
1773 " - text
1774 " - row
1775 " - col
1776 " - expected row
1777 " - expected col
1778 " - expected width
1779 " - expected height
1780 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001781 \ #{
1782 \ comment: 'left-aligned with wrapping',
1783 \ options: #{
1784 \ wrap: 1,
1785 \ pos: 'botleft',
1786 \ },
1787 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001788 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1789 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1790 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1791 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1792 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1793 \
1794 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1795 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1796 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1797 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1798 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1799 \
1800 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1801 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1802 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001803 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1804 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001805 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001806 \ ],
1807 \ },
1808 \ #{
1809 \ comment: 'left aligned without wrapping',
1810 \ options: #{
1811 \ wrap: 0,
1812 \ pos: 'botleft',
1813 \ },
1814 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001815 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1816 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1817 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1818 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1819 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1820 \
1821 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1822 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1823 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1824 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1825 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1826 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001827 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1828 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1829 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1830 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1831 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1832 \ ],
1833 \ },
1834 \ #{
1835 \ comment: 'left aligned with fixed position',
1836 \ options: #{
1837 \ wrap: 0,
1838 \ fixed: 1,
1839 \ pos: 'botleft',
1840 \ },
1841 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001842 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1843 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1844 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1845 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1846 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1847 \
1848 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1849 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1850 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1851 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1852 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1853 \
1854 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1855 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1856 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001857 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1858 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1859 \ ],
1860 \ },
1861 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001862
1863 for test_group in tests
1864 for test in test_group.tests
1865 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001866 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001867 \ line: line,
1868 \ col: col,
1869 \ }
1870 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001871
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001872 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001873
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001874 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001875 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
1876 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001877 endfor
1878 endfor
1879
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001880 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001881 %bwipe!
1882endfunc
1883
Bram Moolenaar3397f742019-06-02 18:40:06 +02001884func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001885 " width of screen
1886 let X = join(map(range(&columns), {->'X'}), '')
1887
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001888 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1889 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001890
1891 redraw
1892 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1893 call assert_equal(X, line)
1894
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001895 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001896 redraw
1897
1898 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001899 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
1900 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001901
1902 redraw
1903 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1904 call assert_equal(X, line)
1905
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001906 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001907 redraw
1908
1909 " Extend so > window width
1910 let X .= 'x'
1911
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001912 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1913 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001914
1915 redraw
1916 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1917 call assert_equal(X[ : -2 ], line)
1918
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001919 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001920 redraw
1921
1922 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001923 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
1924 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001925
1926 redraw
1927 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1928 call assert_equal(X[ : -2 ], line)
1929
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001930 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001931 redraw
1932
1933 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001934 let p = popup_create(X,
1935 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
1936 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001937
1938 redraw
1939 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1940 let e_line = ' ' . X[ 1 : -2 ]
1941 call assert_equal(e_line, line)
1942
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001943 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001944 redraw
1945
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001946 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001947 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02001948endfunc
1949
1950func Test_popup_moved()
1951 new
1952 call test_override('char_avail', 1)
1953 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
1954
1955 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001956 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001957 redraw
1958 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001959 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001960 " trigger the check for last_cursormoved by going into insert mode
1961 call feedkeys("li\<Esc>", 'xt')
1962 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001963 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02001964
1965 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001966 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001967 redraw
1968 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001969 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001970 call feedkeys("hi\<Esc>", 'xt')
1971 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001972 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02001973
1974 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001975 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001976 redraw
1977 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001978 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001979 call feedkeys("li\<Esc>", 'xt')
1980 call assert_equal(1, popup_getpos(winid).visible)
1981 call feedkeys("ei\<Esc>", 'xt')
1982 call assert_equal(1, popup_getpos(winid).visible)
1983 call feedkeys("eli\<Esc>", 'xt')
1984 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001985 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02001986
Bram Moolenaar17627312019-06-02 19:53:44 +02001987 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02001988 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02001989 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001990 redraw
1991 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001992 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001993 call feedkeys("eli\<Esc>", 'xt')
1994 call assert_equal(1, popup_getpos(winid).visible)
1995 call feedkeys("wi\<Esc>", 'xt')
1996 call assert_equal(1, popup_getpos(winid).visible)
1997 call feedkeys("Eli\<Esc>", 'xt')
1998 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001999 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002000
2001 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002002 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002003 redraw
2004 call assert_equal(1, popup_getpos(winid).visible)
2005 call feedkeys("eli\<Esc>", 'xt')
2006 call feedkeys("ei\<Esc>", 'xt')
2007 call assert_equal(1, popup_getpos(winid).visible)
2008 call feedkeys("eli\<Esc>", 'xt')
2009 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002010 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002011
2012 bwipe!
2013 call test_override('ALL', 0)
2014endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002015
2016func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002017 CheckFeature timers
2018 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002019
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002020 let lines =<< trim END
2021 call setline(1, range(1, 20))
2022 hi Notification ctermbg=lightblue
2023 call popup_notification('first notification', {})
2024 END
2025 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002026 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002027 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2028
2029 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002030 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2031 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002032 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2033
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002034 " clean up
2035 call StopVimInTerminal(buf)
2036 call delete('XtestNotifications')
2037endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002038
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002039func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002040 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002041
2042 let lines =<< trim END
2043 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002044 hi ScrollThumb ctermbg=blue
2045 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002046 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002047 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002048 \ minwidth: 8,
2049 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002050 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002051 func ScrollUp()
2052 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2053 endfunc
2054 func ScrollDown()
2055 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2056 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002057 func ClickTop()
2058 call feedkeys("\<F4>\<LeftMouse>", "xt")
2059 endfunc
2060 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002061 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002062 call feedkeys("\<F5>\<LeftMouse>", "xt")
2063 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002064 func Popup_filter(winid, key)
2065 if a:key == 'j'
2066 let line = popup_getoptions(a:winid).firstline
2067 let nlines = line('$', a:winid)
2068 let newline = line < nlines ? (line + 1) : nlines
2069 call popup_setoptions(a:winid, #{firstline: newline})
2070 return v:true
2071 elseif a:key == 'x'
2072 call popup_close(a:winid)
2073 return v:true
2074 endif
2075 endfunc
2076
2077 func PopupScroll()
2078 call popup_clear()
2079 let text =<< trim END
2080 1
2081 2
2082 3
2083 4
2084 long line long line long line long line long line long line
2085 long line long line long line long line long line long line
2086 long line long line long line long line long line long line
2087 END
2088 call popup_create(text, #{
2089 \ minwidth: 30,
2090 \ maxwidth: 30,
2091 \ minheight: 4,
2092 \ maxheight: 4,
2093 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +01002094 \ lastline: 4,
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002095 \ wrap: v:true,
2096 \ scrollbar: v:true,
2097 \ mapping: v:false,
2098 \ filter: funcref('Popup_filter')
2099 \ })
2100 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002101 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002102 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2103 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002104 END
2105 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002106 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002107 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2108
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002109 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002110 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002111 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2112
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002113 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002114 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002115 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2116
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002117 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002118 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002119 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2120
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002121 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002122 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002123 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2124 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2125
2126 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2127 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2128
2129 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002130 " wait a bit, otherwise it fails sometimes (double click recognized?)
2131 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002132 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2133 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2134
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002135 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2136 sleep 100m
2137 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2138 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2139
2140 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2141 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2142
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002143 " remove the minwidth and maxheight
2144 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002145 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002146 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2147
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002148 " check size with non-wrapping lines
2149 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2150 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2151
2152 " check size with wrapping lines
2153 call term_sendkeys(buf, "j")
2154 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002155
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002156 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002157 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002158 call StopVimInTerminal(buf)
2159 call delete('XtestPopupScroll')
2160endfunc
2161
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002162func Test_popup_too_high_scrollbar()
2163 CheckScreendump
2164
2165 let lines =<< trim END
2166 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2167 set scrolloff=0
2168 func ShowPopup()
2169 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2170 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2171 \ minwidth: 8,
2172 \ border: [],
2173 \ })
2174 endfunc
2175 normal 3G$
2176 call ShowPopup()
2177 END
2178 call writefile(lines, 'XtestPopupToohigh')
2179 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2180 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2181
2182 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2183 call term_sendkeys(buf, "8G$")
2184 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2185 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2186
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002187 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2188 call term_sendkeys(buf, "gg$")
2189 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2190 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2191
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002192 " clean up
2193 call StopVimInTerminal(buf)
2194 call delete('XtestPopupToohigh')
2195endfunc
2196
Bram Moolenaar437a7462019-07-05 20:17:22 +02002197func Test_popup_fitting_scrollbar()
2198 " this was causing a crash, divide by zero
2199 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002200 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002201 \ scrollbar: 1,
2202 \ maxwidth: 10,
2203 \ maxheight: 5,
2204 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002205 redraw
2206 call popup_clear()
2207endfunc
2208
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002209func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002210 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002211
2212 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002213 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002214 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002215 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002216 END
2217
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002218 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002219 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002220 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2221
2222 " Setting to empty string clears it
2223 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2224 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2225
2226 " Setting a list
2227 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2228 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2229
2230 " Shrinking with a list
2231 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2232 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2233
2234 " Growing with a list
2235 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2236 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2237
2238 " Empty list clears
2239 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2240 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2241
2242 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002243 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002244 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2245
Bram Moolenaarb0992022020-01-30 14:55:42 +01002246 " range() (doesn't work)
2247 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2248 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2249
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002250 " clean up
2251 call StopVimInTerminal(buf)
2252 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002253endfunc
2254
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002255func Test_popup_settext_getline()
2256 let id = popup_create('', #{ tabpage: 0 })
2257 call popup_settext(id, ['a','b'])
2258 call assert_equal(2, line('$', id)) " OK :)
2259 call popup_close(id)
2260
2261 let id = popup_create('', #{ tabpage: -1 })
2262 call popup_settext(id, ['a','b'])
2263 call assert_equal(2, line('$', id)) " Fails :(
2264 call popup_close(id)
2265endfunc
2266
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002267func Test_popup_hidden()
2268 new
2269
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002270 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002271 redraw
2272 call assert_equal(0, popup_getpos(winid).visible)
2273 call popup_close(winid)
2274
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002275 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002276 redraw
2277 call assert_equal(0, popup_getpos(winid).visible)
2278 call popup_close(winid)
2279
2280 func QuitCallback(id, res)
2281 let s:cb_winid = a:id
2282 let s:cb_res = a:res
2283 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002284 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002285 \ filter: 'popup_filter_yesno',
2286 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002287 \ })
2288 redraw
2289 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002290 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2291 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002292 exe "normal anot used by filter\<Esc>"
2293 call assert_equal('not used by filter', getline(1))
2294
2295 call popup_show(winid)
2296 call feedkeys('y', "xt")
2297 call assert_equal(1, s:cb_res)
2298
2299 bwipe!
2300 delfunc QuitCallback
2301endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002302
2303" Test options not checked elsewhere
2304func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002305 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002306 let options = popup_getoptions(winid)
2307 call assert_equal(1, options.wrap)
2308 call assert_equal(0, options.drag)
2309 call assert_equal('Beautiful', options.highlight)
2310
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002311 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002312 let options = popup_getoptions(winid)
2313 call assert_equal(0, options.wrap)
2314 call assert_equal(1, options.drag)
2315 call assert_equal('Another', options.highlight)
2316
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002317 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2318 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2319
Bram Moolenaarae943152019-06-16 22:54:14 +02002320 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002321 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002322endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002323
2324func Test_popupwin_garbage_collect()
2325 func MyPopupFilter(x, winid, c)
2326 " NOP
2327 endfunc
2328
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002329 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002330 call test_garbagecollect_now()
2331 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002332 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002333 call feedkeys('j', 'xt')
2334 call assert_true(v:true)
2335
2336 call popup_close(winid)
2337 delfunc MyPopupFilter
2338endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002339
Bram Moolenaar581ba392019-09-03 22:08:33 +02002340func Test_popupwin_filter_mode()
2341 func MyPopupFilter(winid, c)
2342 let s:typed = a:c
2343 if a:c == ':' || a:c == "\r" || a:c == 'v'
2344 " can start cmdline mode, get out, and start/stop Visual mode
2345 return 0
2346 endif
2347 return 1
2348 endfunc
2349
2350 " Normal, Visual and Insert mode
2351 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2352 redraw
2353 call feedkeys('x', 'xt')
2354 call assert_equal('x', s:typed)
2355
2356 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2357 call assert_equal(':', s:typed)
2358 call assert_equal('foo', g:foo)
2359
2360 let @x = 'something'
2361 call feedkeys('v$"xy', 'xt')
2362 call assert_equal('y', s:typed)
2363 call assert_equal('something', @x) " yank command is filtered out
2364 call feedkeys('v', 'xt') " end Visual mode
2365
2366 call popup_close(winid)
2367
2368 " only Normal mode
2369 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2370 redraw
2371 call feedkeys('x', 'xt')
2372 call assert_equal('x', s:typed)
2373
2374 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2375 call assert_equal(':', s:typed)
2376 call assert_equal('foo', g:foo)
2377
2378 let @x = 'something'
2379 call feedkeys('v$"xy', 'xt')
2380 call assert_equal('v', s:typed)
2381 call assert_notequal('something', @x)
2382
2383 call popup_close(winid)
2384
2385 " default: all modes
2386 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2387 redraw
2388 call feedkeys('x', 'xt')
2389 call assert_equal('x', s:typed)
2390
2391 let g:foo = 'bar'
2392 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2393 call assert_equal("\r", s:typed)
2394 call assert_equal('bar', g:foo)
2395
2396 let @x = 'something'
2397 call feedkeys('v$"xy', 'xt')
2398 call assert_equal('y', s:typed)
2399 call assert_equal('something', @x) " yank command is filtered out
2400 call feedkeys('v', 'xt') " end Visual mode
2401
2402 call popup_close(winid)
2403 delfunc MyPopupFilter
2404endfunc
2405
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002406func Test_popupwin_filter_mouse()
2407 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002408 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002409 return 0
2410 endfunc
2411
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002412 call setline(1, ['.'->repeat(25)]->repeat(10))
2413 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2414 \ line: 2,
2415 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002416 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002417 \ padding: [],
2418 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002419 \ filter: 'MyPopupFilter',
2420 \ })
2421 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002422 " 123456789012345678901
2423 " 1 .....................
2424 " 2 ...+--------------+..
2425 " 3 ...| |..
2426 " 4 ...| short |..
2427 " 5 ...| long line th |..
2428 " 6 ...| at will wrap |..
2429 " 7 ...| other |..
2430 " 8 ...| |..
2431 " 9 ...+--------------+..
2432 " 10 .....................
2433 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002434
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002435 func AddItemOutsidePopup(tests, row, col)
2436 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2437 \ screenrow: a:row, screencol: a:col,
2438 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2439 \ line: a:row, column: a:col,
2440 \ }})
2441 endfunc
2442 func AddItemInPopupBorder(tests, winid, row, col)
2443 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2444 \ screenrow: a:row, screencol: a:col,
2445 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2446 \ line: 0, column: 0,
2447 \ }})
2448 endfunc
2449 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2450 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2451 \ screenrow: a:row, screencol: a:col,
2452 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2453 \ line: a:textline, column: a:textcol,
2454 \ }})
2455 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002456
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002457 " above and below popup
2458 for c in range(1, 21)
2459 call AddItemOutsidePopup(tests, 1, c)
2460 call AddItemOutsidePopup(tests, 10, c)
2461 endfor
2462 " left and right of popup
2463 for r in range(1, 10)
2464 call AddItemOutsidePopup(tests, r, 3)
2465 call AddItemOutsidePopup(tests, r, 20)
2466 endfor
2467 " top and bottom in popup
2468 for c in range(4, 19)
2469 call AddItemInPopupBorder(tests, winid, 2, c)
2470 call AddItemInPopupBorder(tests, winid, 3, c)
2471 call AddItemInPopupBorder(tests, winid, 8, c)
2472 call AddItemInPopupBorder(tests, winid, 9, c)
2473 endfor
2474 " left and right margin in popup
2475 for r in range(2, 9)
2476 call AddItemInPopupBorder(tests, winid, r, 4)
2477 call AddItemInPopupBorder(tests, winid, r, 5)
2478 call AddItemInPopupBorder(tests, winid, r, 18)
2479 call AddItemInPopupBorder(tests, winid, r, 19)
2480 endfor
2481 " text "short"
2482 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2483 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2484 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2485 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2486 " text "long line th"
2487 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2488 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2489 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2490 " text "at will wrap"
2491 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2492 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2493 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2494 " text "other"
2495 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2496 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2497 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2498 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002499
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002500 for item in tests
2501 call test_setmouse(item.clickrow, item.clickcol)
2502 call feedkeys("\<LeftMouse>", 'xt')
2503 call assert_equal(item.result, g:got_mousepos)
2504 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002505
2506 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002507 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002508 delfunc MyPopupFilter
2509endfunc
2510
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002511func Test_popupwin_with_buffer()
2512 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2513 let buf = bufadd('XsomeFile')
2514 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002515
2516 setlocal number
2517 call setbufvar(buf, "&wrapmargin", 13)
2518
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002519 let winid = popup_create(buf, {})
2520 call assert_notequal(0, winid)
2521 let pos = popup_getpos(winid)
2522 call assert_equal(2, pos.height)
2523 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002524
2525 " window-local option is set to default, buffer-local is not
2526 call assert_equal(0, getwinvar(winid, '&number'))
2527 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2528
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002529 call popup_close(winid)
2530 call assert_equal({}, popup_getpos(winid))
2531 call assert_equal(1, bufloaded(buf))
2532 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002533 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002534
2535 edit test_popupwin.vim
2536 let winid = popup_create(bufnr(''), {})
2537 redraw
2538 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002539 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002540endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002541
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002542func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002543 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002544 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002545 " Starting a terminal to run a shell in is considered flaky.
2546 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002547
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002548 let origwin = win_getid()
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002549 let termbuf = term_start(&shell, #{hidden: 1})
2550 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10})
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002551 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002552 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002553 sleep 100m
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002554 " Check this doesn't crash
2555 call assert_equal(winnr(), winnr('j'))
2556 call assert_equal(winnr(), winnr('k'))
2557 call assert_equal(winnr(), winnr('h'))
2558 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002559
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002560 " Cannot quit while job is running
2561 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002562
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002563 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002564 call feedkeys("xxx\<C-W>N", 'xt')
2565 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2566 call feedkeys("a\<C-U>", 'xt')
2567
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002568 " Cannot escape from terminal window
2569 call assert_fails('tab drop xxx', 'E863:')
2570
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002571 " Cannot open a second one.
2572 let termbuf2 = term_start(&shell, #{hidden: 1})
2573 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2574 call term_sendkeys(termbuf2, "exit\<CR>")
2575
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002576 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002577 call feedkeys("exit\<CR>", 'xt')
2578 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002579 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002580
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002581 call feedkeys(":quit\<CR>", 'xt')
2582 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002583endfunc
2584
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002585func Test_popupwin_close_prevwin()
2586 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002587 call Popupwin_close_prevwin()
2588endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002589
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002590def Popupwin_close_prevwin()
2591 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002592 split
2593 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002594 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002595 let buf = term_start(&shell, #{hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002596 popup_create(buf, {})
2597 TermWait(buf, 100)
2598 popup_clear(true)
2599 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002600
2601 quit
2602 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002603enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002604
Bram Moolenaar934470e2019-09-01 23:27:05 +02002605func Test_popupwin_with_buffer_and_filter()
2606 new Xwithfilter
2607 call setline(1, range(100))
2608 let bufnr = bufnr()
2609 hide
2610
2611 func BufferFilter(win, key)
2612 if a:key == 'G'
2613 " recursive use of "G" does not cause problems.
2614 call win_execute(a:win, 'normal! G')
2615 return 1
2616 endif
2617 return 0
2618 endfunc
2619
2620 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2621 call assert_equal(1, popup_getpos(winid).firstline)
2622 redraw
2623 call feedkeys("G", 'xt')
2624 call assert_equal(99, popup_getpos(winid).firstline)
2625
2626 call popup_close(winid)
2627 exe 'bwipe! ' .. bufnr
2628endfunc
2629
Bram Moolenaare296e312019-07-03 23:20:18 +02002630func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002631 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002632 \ maxwidth: 40,
2633 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002634 \ })
2635 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002636 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002637 redraw
2638 call assert_equal(19, popup_getpos(winid).width)
2639 endfor
2640 call popup_clear()
2641endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002642
2643func Test_popupwin_buf_close()
2644 let buf = bufadd('Xtestbuf')
2645 call bufload(buf)
2646 call setbufline(buf, 1, ['just', 'some', 'lines'])
2647 let winid = popup_create(buf, {})
2648 redraw
2649 call assert_equal(3, popup_getpos(winid).height)
2650 let bufinfo = getbufinfo(buf)[0]
2651 call assert_equal(1, bufinfo.changed)
2652 call assert_equal(0, bufinfo.hidden)
2653 call assert_equal(0, bufinfo.listed)
2654 call assert_equal(1, bufinfo.loaded)
2655 call assert_equal([], bufinfo.windows)
2656 call assert_equal([winid], bufinfo.popups)
2657
2658 call popup_close(winid)
2659 call assert_equal({}, popup_getpos(winid))
2660 let bufinfo = getbufinfo(buf)[0]
2661 call assert_equal(1, bufinfo.changed)
2662 call assert_equal(1, bufinfo.hidden)
2663 call assert_equal(0, bufinfo.listed)
2664 call assert_equal(1, bufinfo.loaded)
2665 call assert_equal([], bufinfo.windows)
2666 call assert_equal([], bufinfo.popups)
2667 exe 'bwipe! ' .. buf
2668endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002669
2670func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002671 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002672
2673 let lines =<< trim END
2674 call setline(1, range(1, 10))
2675 hi ScrollThumb ctermbg=blue
2676 hi ScrollBar ctermbg=red
2677 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002678 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002679 \ maxwidth: 10,
2680 \ maxheight: 3,
2681 \ pos : 'topleft',
2682 \ col : a:col,
2683 \ line : a:line,
2684 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002685 \ })
2686 endfunc
2687 call PopupMenu(['x'], 1, 1)
2688 call PopupMenu(['123456789|'], 1, 16)
2689 call PopupMenu(['123456789|' .. ' '], 7, 1)
2690 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2691 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2692 END
2693 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002694 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002695 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2696
2697 " close the menu popupwin.
2698 call term_sendkeys(buf, " ")
2699 call term_sendkeys(buf, " ")
2700 call term_sendkeys(buf, " ")
2701 call term_sendkeys(buf, " ")
2702 call term_sendkeys(buf, " ")
2703
2704 " clean up
2705 call StopVimInTerminal(buf)
2706 call delete('XtestPopupMenuMaxWidth')
2707endfunc
2708
Bram Moolenaara901a372019-07-13 16:38:50 +02002709func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002710 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002711
2712 let lines =<< trim END
2713 call setline(1, range(1, 20))
2714 hi ScrollThumb ctermbg=blue
2715 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002716 eval ['one', 'two', 'three', 'four', 'five',
2717 \ 'six', 'seven', 'eight', 'nine']
2718 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002719 \ minwidth: 8,
2720 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002721 \ })
2722 END
2723 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002724 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002725
2726 call term_sendkeys(buf, "j")
2727 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2728
2729 call term_sendkeys(buf, "jjj")
2730 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2731
2732 " if the cursor is the bottom line, it stays at the bottom line.
2733 call term_sendkeys(buf, repeat("j", 20))
2734 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2735
2736 call term_sendkeys(buf, "kk")
2737 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2738
2739 call term_sendkeys(buf, "k")
2740 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2741
2742 " if the cursor is in the top line, it stays in the top line.
2743 call term_sendkeys(buf, repeat("k", 20))
2744 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2745
2746 " close the menu popupwin.
2747 call term_sendkeys(buf, " ")
2748
2749 " clean up
2750 call StopVimInTerminal(buf)
2751 call delete('XtestPopupMenuScroll')
2752endfunc
2753
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002754func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002755 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002756
2757 let lines =<< trim END
2758 function! MyFilter(winid, key) abort
2759 if a:key == "0"
2760 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2761 return 1
2762 endif
2763 if a:key == "G"
2764 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2765 return 1
2766 endif
2767 if a:key == "j"
2768 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2769 return 1
2770 endif
2771 if a:key == "k"
2772 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2773 return 1
2774 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002775 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002776 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002777 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002778 endif
2779 return 0
2780 endfunction
2781 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2782 \ maxheight : 3,
2783 \ filter : 'MyFilter'
2784 \ })
2785 END
2786 call writefile(lines, 'XtestPopupMenuFilter')
2787 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2788
2789 call term_sendkeys(buf, "j")
2790 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2791
2792 call term_sendkeys(buf, "k")
2793 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2794
2795 call term_sendkeys(buf, "G")
2796 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2797
2798 call term_sendkeys(buf, "0")
2799 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2800
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002801 " check that when the popup is closed in the filter the screen is redrawn
2802 call term_sendkeys(buf, ":")
2803 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2804 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002805
2806 " clean up
2807 call StopVimInTerminal(buf)
2808 call delete('XtestPopupMenuFilter')
2809endfunc
2810
2811func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002812 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002813
2814 let winid = popup_create('some text', {})
2815 call assert_equal(0, popup_getoptions(winid).cursorline)
2816 call popup_close(winid)
2817
2818 let winid = popup_create('some text', #{ cursorline: 1, })
2819 call assert_equal(1, popup_getoptions(winid).cursorline)
2820 call popup_close(winid)
2821
2822 let winid = popup_create('some text', #{ cursorline: 0, })
2823 call assert_equal(0, popup_getoptions(winid).cursorline)
2824 call popup_close(winid)
2825
2826 let winid = popup_menu('some text', {})
2827 call assert_equal(1, popup_getoptions(winid).cursorline)
2828 call popup_close(winid)
2829
2830 let winid = popup_menu('some text', #{ cursorline: 1, })
2831 call assert_equal(1, popup_getoptions(winid).cursorline)
2832 call popup_close(winid)
2833
2834 let winid = popup_menu('some text', #{ cursorline: 0, })
2835 call assert_equal(0, popup_getoptions(winid).cursorline)
2836 call popup_close(winid)
2837
2838 " ---------
2839 " Pattern 1
2840 " ---------
2841 let lines =<< trim END
2842 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
2843 END
2844 call writefile(lines, 'XtestPopupCursorLine')
2845 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2846 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
2847 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2848 call StopVimInTerminal(buf)
2849
2850 " ---------
2851 " Pattern 2
2852 " ---------
2853 let lines =<< trim END
2854 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
2855 END
2856 call writefile(lines, 'XtestPopupCursorLine')
2857 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2858 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
2859 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2860 call StopVimInTerminal(buf)
2861
2862 " ---------
2863 " Pattern 3
2864 " ---------
2865 let lines =<< trim END
2866 function! MyFilter(winid, key) abort
2867 if a:key == "j"
2868 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2869 return 1
2870 endif
2871 if a:key == 'x'
2872 call popup_close(a:winid)
2873 return 1
2874 endif
2875 return 0
2876 endfunction
2877 call popup_menu(['111', '222', '333'], #{
2878 \ cursorline : 0,
2879 \ maxheight : 2,
2880 \ filter : 'MyFilter',
2881 \ })
2882 END
2883 call writefile(lines, 'XtestPopupCursorLine')
2884 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2885 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
2886 call term_sendkeys(buf, "j")
2887 call term_sendkeys(buf, "j")
2888 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
2889 call term_sendkeys(buf, "x")
2890 call StopVimInTerminal(buf)
2891
2892 " ---------
2893 " Pattern 4
2894 " ---------
2895 let lines =<< trim END
2896 function! MyFilter(winid, key) abort
2897 if a:key == "j"
2898 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2899 return 1
2900 endif
2901 if a:key == 'x'
2902 call popup_close(a:winid)
2903 return 1
2904 endif
2905 return 0
2906 endfunction
2907 call popup_menu(['111', '222', '333'], #{
2908 \ cursorline : 1,
2909 \ maxheight : 2,
2910 \ filter : 'MyFilter',
2911 \ })
2912 END
2913 call writefile(lines, 'XtestPopupCursorLine')
2914 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2915 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
2916 call term_sendkeys(buf, "j")
2917 call term_sendkeys(buf, "j")
2918 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
2919 call term_sendkeys(buf, "x")
2920 call StopVimInTerminal(buf)
2921
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02002922 " ---------
2923 " Cursor in second line when creating the popup
2924 " ---------
2925 let lines =<< trim END
2926 let winid = popup_create(['111', '222', '333'], #{
2927 \ cursorline : 1,
2928 \ })
2929 call win_execute(winid, "2")
2930 END
2931 call writefile(lines, 'XtestPopupCursorLine')
2932 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2933 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
2934 call StopVimInTerminal(buf)
2935
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002936 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01002937
2938 " ---------
2939 " Use current buffer for popupmenu
2940 " ---------
2941 let lines =<< trim END
2942 call setline(1, ['one', 'two', 'three'])
2943 let winid = popup_create(bufnr('%'), #{
2944 \ cursorline : 1,
2945 \ })
2946 call win_execute(winid, "2")
2947 END
2948 call writefile(lines, 'XtestPopupCursorLine')
2949 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2950 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
2951 call StopVimInTerminal(buf)
2952
2953 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002954endfunc
2955
Bram Moolenaarf914a332019-07-20 15:09:56 +02002956func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002957 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01002958 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002959
Bram Moolenaarf914a332019-07-20 15:09:56 +02002960 call writefile([
2961 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
2962 \ "another\tXtagfile\t/^this is another",
2963 \ "theword\tXtagfile\t/^theword"],
2964 \ 'Xtags')
2965 call writefile(range(1,20)
2966 \ + ['theword is here']
2967 \ + range(22, 27)
2968 \ + ['this is another place']
2969 \ + range(29, 40),
2970 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02002971 call writefile(range(1,10)
2972 \ + ['searched word is here']
2973 \ + range(12, 20),
2974 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02002975 let lines =<< trim END
2976 set tags=Xtags
2977 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002978 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02002979 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002980 \ 'three',
2981 \ 'four',
2982 \ 'five',
2983 \ 'six',
2984 \ 'seven',
2985 \ 'find theword somewhere',
2986 \ 'nine',
2987 \ 'this is another word',
2988 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02002989 set previewpopup=height:4,width:40
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02002990 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02002991 END
2992 call writefile(lines, 'XtestPreviewPopup')
2993 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
2994
2995 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
2996 call term_sendkeys(buf, ":\<CR>")
2997 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
2998
2999 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3000 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3001
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003002 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003003 call term_sendkeys(buf, ":\<CR>")
3004 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3005
3006 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3007 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3008
Bram Moolenaar799439a2020-02-11 21:44:17 +01003009 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003010 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003011 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003012
3013 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003014 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003015 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3016
3017 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3018 call term_sendkeys(buf, ":\<CR>")
3019 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3020
3021 call term_sendkeys(buf, ":pclose\<CR>")
3022 call term_sendkeys(buf, ":psearch searched\<CR>")
3023 call term_sendkeys(buf, ":\<CR>")
3024 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003025
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003026 call term_sendkeys(buf, "\<C-W>p")
3027 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3028
3029 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3030 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3031
Bram Moolenaarf914a332019-07-20 15:09:56 +02003032 call StopVimInTerminal(buf)
3033 call delete('Xtags')
3034 call delete('Xtagfile')
3035 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003036 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003037endfunc
3038
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003039func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003040 let lines =<< trim END
3041 set completeopt+=preview,popup
3042 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003043 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003044
3045 func CompleteFuncDict(findstart, base)
3046 if a:findstart
3047 if col('.') > 10
3048 return col('.') - 10
3049 endif
3050 return 0
3051 endif
3052
3053 return {
3054 \ 'words': [
3055 \ {
3056 \ 'word': 'aword',
3057 \ 'abbr': 'wrd',
3058 \ 'menu': 'extra text',
3059 \ 'info': 'words are cool',
3060 \ 'kind': 'W',
3061 \ 'user_data': 'test'
3062 \ },
3063 \ {
3064 \ 'word': 'anotherword',
3065 \ 'abbr': 'anotwrd',
3066 \ 'menu': 'extra text',
3067 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3068 \ 'kind': 'W',
3069 \ 'user_data': 'notest'
3070 \ },
3071 \ {
3072 \ 'word': 'noinfo',
3073 \ 'abbr': 'noawrd',
3074 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003075 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003076 \ 'kind': 'W',
3077 \ 'user_data': 'notest'
3078 \ },
3079 \ {
3080 \ 'word': 'thatword',
3081 \ 'abbr': 'thatwrd',
3082 \ 'menu': 'extra text',
3083 \ 'info': 'that word is cool',
3084 \ 'kind': 'W',
3085 \ 'user_data': 'notest'
3086 \ },
3087 \ ]
3088 \ }
3089 endfunc
3090 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003091 func ChangeColor()
3092 let id = popup_findinfo()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003093 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003094 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003095
3096 func InfoHidden()
3097 set completepopup=height:4,border:off,align:menu
3098 set completeopt-=popup completeopt+=popuphidden
3099 au CompleteChanged * call HandleChange()
3100 endfunc
3101
3102 let s:counter = 0
3103 func HandleChange()
3104 let s:counter += 1
3105 let selected = complete_info(['selected']).selected
3106 if selected <= 0
3107 " First time: do nothing, info remains hidden
3108 return
3109 endif
3110 if selected == 1
3111 " Second time: show info right away
3112 let id = popup_findinfo()
3113 if id
3114 call popup_settext(id, 'immediate info ' .. s:counter)
3115 call popup_show(id)
3116 endif
3117 else
3118 " Third time: show info after a short delay
3119 call timer_start(100, 'ShowInfo')
3120 endif
3121 endfunc
3122
3123 func ShowInfo(...)
3124 let id = popup_findinfo()
3125 if id
3126 call popup_settext(id, 'async info ' .. s:counter)
3127 call popup_show(id)
3128 endif
3129 endfunc
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003130 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003131 return lines
3132endfunc
3133
3134func Test_popupmenu_info_border()
3135 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003136 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003137
3138 let lines = Get_popupmenu_lines()
3139 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003140 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003141
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003142 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003143 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003144
3145 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3146 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3147
3148 call term_sendkeys(buf, "\<C-N>")
3149 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3150
3151 call term_sendkeys(buf, "\<C-N>")
3152 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3153
3154 call term_sendkeys(buf, "\<C-N>\<C-N>")
3155 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3156
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003157 " info on the left with scrollbar
3158 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3159 call term_sendkeys(buf, "\<C-N>\<C-N>")
3160 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3161
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003162 " Test that the popupmenu's scrollbar and infopopup do not overlap
3163 call term_sendkeys(buf, "\<Esc>")
3164 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3165 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3166 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3167
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003168 " Hide the info popup, cycle trough buffers, make sure it didn't get
3169 " deleted.
3170 call term_sendkeys(buf, "\<Esc>")
3171 call term_sendkeys(buf, ":set hidden\<CR>")
3172 call term_sendkeys(buf, ":bn\<CR>")
3173 call term_sendkeys(buf, ":bn\<CR>")
3174 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3175 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3176
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003177 " Test that when the option is changed the popup changes.
3178 call term_sendkeys(buf, "\<Esc>")
3179 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3180 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3181 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3182
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003183 call term_sendkeys(buf, " \<Esc>")
3184 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3185 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3186 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3187
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003188 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003189 call StopVimInTerminal(buf)
3190 call delete('XtestInfoPopup')
3191endfunc
3192
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003193func Test_popupmenu_info_noborder()
3194 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003195 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003196
3197 let lines = Get_popupmenu_lines()
3198 call add(lines, 'set completepopup=height:4,border:off')
3199 call writefile(lines, 'XtestInfoPopupNb')
3200
3201 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003202 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003203
3204 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3205 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3206
3207 call StopVimInTerminal(buf)
3208 call delete('XtestInfoPopupNb')
3209endfunc
3210
Bram Moolenaar258cef52019-08-21 17:29:29 +02003211func Test_popupmenu_info_align_menu()
3212 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003213 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003214
3215 let lines = Get_popupmenu_lines()
3216 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3217 call writefile(lines, 'XtestInfoPopupNb')
3218
3219 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003220 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003221
3222 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3223 call term_sendkeys(buf, "\<C-N>")
3224 call term_sendkeys(buf, "\<C-N>")
3225 call term_sendkeys(buf, "\<C-N>")
3226 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3227
3228 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3229 call term_sendkeys(buf, "\<C-N>")
3230 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3231
3232 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003233 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003234 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3235 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3236 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3237
3238 call StopVimInTerminal(buf)
3239 call delete('XtestInfoPopupNb')
3240endfunc
3241
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003242func Test_popupmenu_info_hidden()
3243 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003244 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003245
3246 let lines = Get_popupmenu_lines()
3247 call add(lines, 'call InfoHidden()')
3248 call writefile(lines, 'XtestInfoPopupHidden')
3249
3250 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003251 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003252
3253 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3254 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3255
3256 call term_sendkeys(buf, "\<C-N>")
3257 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3258
3259 call term_sendkeys(buf, "\<C-N>")
3260 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3261
3262 call term_sendkeys(buf, "\<Esc>")
3263 call StopVimInTerminal(buf)
3264 call delete('XtestInfoPopupHidden')
3265endfunc
3266
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003267func Test_popupmenu_info_too_wide()
3268 CheckScreendump
3269 CheckFeature quickfix
3270
3271 let lines =<< trim END
3272 call setline(1, range(10))
3273
3274 set completeopt+=preview,popup
3275 set completepopup=align:menu
3276 set omnifunc=OmniFunc
3277 hi InfoPopup ctermbg=lightgrey
3278
3279 func OmniFunc(findstart, base)
3280 if a:findstart
3281 return 0
3282 endif
3283
3284 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3285 return #{
3286 \ words: [
3287 \ #{
3288 \ word: 'scrap',
3289 \ menu: menuText,
3290 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3291 \ },
3292 \ #{
3293 \ word: 'scappier',
3294 \ menu: menuText,
3295 \ info: 'words are cool',
3296 \ },
3297 \ #{
3298 \ word: 'scrappier2',
3299 \ menu: menuText,
3300 \ info: 'words are cool',
3301 \ },
3302 \ ]
3303 \ }
3304 endfunc
3305 END
3306
3307 call writefile(lines, 'XtestInfoPopupWide')
3308 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003309 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003310
3311 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3312 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3313
3314 call term_sendkeys(buf, "\<Esc>")
3315 call StopVimInTerminal(buf)
3316 call delete('XtestInfoPopupWide')
3317endfunc
3318
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003319func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003320 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003321 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003322 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003323 call assert_equal(bufnr, winbufnr(winid))
3324 call popup_clear()
3325endfunc
3326
Bram Moolenaar1824f452019-10-02 23:06:46 +02003327func Test_popupwin_getoptions_tablocal()
3328 topleft split
3329 let win1 = popup_create('nothing', #{maxheight: 8})
3330 let win2 = popup_create('something', #{maxheight: 10})
3331 let win3 = popup_create('something', #{maxheight: 15})
3332 call assert_equal(8, popup_getoptions(win1).maxheight)
3333 call assert_equal(10, popup_getoptions(win2).maxheight)
3334 call assert_equal(15, popup_getoptions(win3).maxheight)
3335 call popup_clear()
3336 quit
3337endfunc
3338
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003339func Test_popupwin_cancel()
3340 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3341 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3342 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3343 call assert_equal(5, popup_getpos(win1).line)
3344 call assert_equal(10, popup_getpos(win2).line)
3345 call assert_equal(15, popup_getpos(win3).line)
3346 " TODO: this also works without patch 8.1.2110
3347 call feedkeys("\<C-C>", 'xt')
3348 call assert_equal(5, popup_getpos(win1).line)
3349 call assert_equal(10, popup_getpos(win2).line)
3350 call assert_equal({}, popup_getpos(win3))
3351 call feedkeys("\<C-C>", 'xt')
3352 call assert_equal(5, popup_getpos(win1).line)
3353 call assert_equal({}, popup_getpos(win2))
3354 call assert_equal({}, popup_getpos(win3))
3355 call feedkeys("\<C-C>", 'xt')
3356 call assert_equal({}, popup_getpos(win1))
3357 call assert_equal({}, popup_getpos(win2))
3358 call assert_equal({}, popup_getpos(win3))
3359endfunc
3360
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003361func Test_popupwin_filter_redraw()
3362 " Create two popups with a filter that closes the popup when typing "0".
3363 " Both popups should close, even though the redraw also calls
3364 " popup_reset_handled()
3365
3366 func CloseFilter(winid, key)
3367 if a:key == '0'
3368 call popup_close(a:winid)
3369 redraw
3370 endif
3371 return 0 " pass the key
3372 endfunc
3373
3374 let id1 = popup_create('first one', #{
3375 \ line: 1,
3376 \ col: 1,
3377 \ filter: 'CloseFilter',
3378 \ })
3379 let id2 = popup_create('second one', #{
3380 \ line: 9,
3381 \ col: 1,
3382 \ filter: 'CloseFilter',
3383 \ })
3384 call assert_equal(1, popup_getpos(id1).line)
3385 call assert_equal(9, popup_getpos(id2).line)
3386
3387 call feedkeys('0', 'xt')
3388 call assert_equal({}, popup_getpos(id1))
3389 call assert_equal({}, popup_getpos(id2))
3390
3391 call popup_clear()
3392 delfunc CloseFilter
3393endfunc
3394
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003395func Test_popupwin_double_width()
3396 CheckScreendump
3397
3398 let lines =<< trim END
3399 call setline(1, 'x你好世界你好世你好世界你好')
3400 call setline(2, '你好世界你好世你好世界你好')
3401 call setline(3, 'x你好世界你好世你好世界你好')
3402 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3403 END
3404 call writefile(lines, 'XtestPopupWide')
3405
3406 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3407 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3408
3409 call StopVimInTerminal(buf)
3410 call delete('XtestPopupWide')
3411endfunc
3412
3413func Test_popupwin_sign()
3414 CheckScreendump
3415
3416 let lines =<< trim END
3417 call setline(1, range(10))
3418 call sign_define('Current', {
3419 \ 'text': '>>',
3420 \ 'texthl': 'WarningMsg',
3421 \ 'linehl': 'Error',
3422 \ })
3423 call sign_define('Other', {
3424 \ 'text': '#!',
3425 \ 'texthl': 'Error',
3426 \ 'linehl': 'Search',
3427 \ })
3428 let winid = popup_create(['hello', 'bright', 'world'], {
3429 \ 'minwidth': 20,
3430 \ })
3431 call setwinvar(winid, "&signcolumn", "yes")
3432 let winbufnr = winbufnr(winid)
3433
3434 " add sign to current buffer, shows
3435 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3436 " add sign to current buffer, does not show
3437 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3438
3439 " add sign to popup buffer, shows
3440 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3441 " add sign to popup buffer, does not show
3442 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003443
3444 func SetOptions()
3445 call setwinvar(g:winid, '&number', 1)
3446 call setwinvar(g:winid, '&foldcolumn', 2)
3447 call popup_settext(g:winid, 'a longer line to check the width')
3448 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003449 END
3450 call writefile(lines, 'XtestPopupSign')
3451
3452 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3453 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3454
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003455 " set more options to check the width is adjusted
3456 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3457 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3458
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003459 call StopVimInTerminal(buf)
3460 call delete('XtestPopupSign')
3461endfunc
3462
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003463func Test_popupwin_bufnr()
3464 let popwin = popup_create(['blah'], #{})
3465 let popbuf = winbufnr(popwin)
3466 split asdfasdf
3467 let newbuf = bufnr()
3468 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3469 call assert_equal(newbuf, bufnr('$'))
3470 call popup_clear()
3471 let popwin = popup_create(['blah'], #{})
3472 " reuses previous buffer number
3473 call assert_equal(popbuf, winbufnr(popwin))
3474 call assert_equal(newbuf, bufnr('$'))
3475
3476 call popup_clear()
3477 bwipe!
3478endfunc
3479
Bram Moolenaarec084d32020-02-28 22:44:47 +01003480func Test_popupwin_filter_input_multibyte()
3481 func MyPopupFilter(winid, c)
3482 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3483 return 0
3484 endfunc
3485 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3486
3487 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3488 call feedkeys("\u3000", 'xt')
3489 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3490
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003491 " UTF-8: E3 80 9B, including CSI(0x9B)
3492 call feedkeys("\u301b", 'xt')
3493 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003494
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003495 if has('unix')
3496 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003497 if has('gui_running')
3498 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3499 else
3500 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3501 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003502 call assert_equal([0xc3, 0x81], g:bytes)
3503 endif
3504
Bram Moolenaarec084d32020-02-28 22:44:47 +01003505 call popup_clear()
3506 delfunc MyPopupFilter
3507 unlet g:bytes
3508endfunc
3509
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003510func Test_popupwin_filter_close_ctrl_c()
3511 CheckScreendump
3512
3513 let lines =<< trim END
3514 vsplit
3515 set laststatus=2
3516 set statusline=%!Statusline()
3517
3518 function Statusline() abort
3519 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3520 endfunction
3521
3522 call popup_create('test test test test...', {'filter': {-> 0}})
3523 END
3524 call writefile(lines, 'XtestPopupCtrlC')
3525
3526 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3527
3528 call term_sendkeys(buf, "\<C-C>")
3529 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3530
3531 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003532 call delete('XtestPopupCtrlC')
3533endfunc
3534
3535func Test_popupwin_filter_close_wrong_name()
3536 CheckScreendump
3537
3538 let lines =<< trim END
3539 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3540 END
3541 call writefile(lines, 'XtestPopupWrongName')
3542
3543 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3544
3545 call term_sendkeys(buf, "j")
3546 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3547
3548 call StopVimInTerminal(buf)
3549 call delete('XtestPopupWrongName')
3550endfunc
3551
3552func Test_popupwin_filter_close_three_errors()
3553 CheckScreendump
3554
3555 let lines =<< trim END
3556 set cmdheight=2
3557 call popup_create('one two three...', {'filter': 'filter'})
3558 END
3559 call writefile(lines, 'XtestPopupThreeErrors')
3560
3561 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3562
3563 call term_sendkeys(buf, "jj")
3564 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3565 call term_sendkeys(buf, "j")
3566 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3567
3568 call StopVimInTerminal(buf)
3569 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003570endfunc
3571
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003572func Test_popupwin_atcursor_far_right()
3573 new
3574
3575 " this was getting stuck
3576 set signcolumn=yes
3577 call setline(1, repeat('=', &columns))
3578 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003579 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003580
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003581 " 'signcolumn' was getting reset
3582 call setwinvar(winid, '&signcolumn', 'yes')
3583 call popup_setoptions(winid, {'zindex': 1000})
3584 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3585
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003586 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003587 bwipe!
3588 set signcolumn&
3589endfunc
3590
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003591func Test_popupwin_splitmove()
3592 vsplit
3593 let win2 = win_getid()
3594 let popup_winid = popup_dialog('hello', {})
3595 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3596 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3597
3598 call popup_clear()
3599 bwipe
3600endfunc
3601
3602
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003603" vim: shiftwidth=2 sts=2