blob: 45e35030d48b98df5a9b04f69104e2c7ccfdd73c [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 Moolenaar4b2ce122020-11-21 21:41:41 +0100608 unlet $PROMPT_COMMAND
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200609 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200610 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200611 $wincmd w
612 let winid = popup_create(['1111', '2222'], #{
613 \ drag: 1,
614 \ resize: 1,
615 \ border: [],
616 \ line: 3,
617 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200618 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200619 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
620 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200621 func DragitDown()
622 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
623 endfunc
624 func DragitDownLeft()
625 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
626 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200627 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
628 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200629 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
630 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200631 END
632 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200633 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200634 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
635
Bram Moolenaar452143c2020-07-15 17:38:21 +0200636 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200637 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
638
Bram Moolenaar452143c2020-07-15 17:38:21 +0200639 call term_sendkeys(buf, ":call DragitDown()\<CR>")
640 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
641
642 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
643 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
644
Bram Moolenaar35910f22020-07-12 19:24:10 +0200645 " clean up
646 call StopVimInTerminal(buf)
647 call delete('XtestPopupTerm')
648endfunc
649
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200650func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200651 CheckScreendump
652
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200653 let lines =<< trim END
654 call setline(1, range(1, 20))
655 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200656 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200657 \ close: 'button',
658 \ border: [],
659 \ line: 1,
660 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200661 \ })
662 func CloseMsg(id, result)
663 echomsg 'Popup closed with ' .. a:result
664 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200665 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200666 \ close: 'click',
667 \ line: 3,
668 \ col: 15,
669 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200670 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200671 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200672 \ close: 'button',
673 \ line: 5,
674 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200675 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200676 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200677 \ close: 'button',
678 \ padding: [],
679 \ line: 5,
680 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200681 \ })
682 func CloseWithX()
683 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
684 endfunc
685 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
686 func CloseWithClick()
687 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
688 endfunc
689 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200690 func CreateWithMenuFilter()
691 let winid = popup_create('barfoo', #{
692 \ close: 'button',
693 \ filter: 'popup_filter_menu',
694 \ border: [],
695 \ line: 1,
696 \ col: 40,
697 \ })
698 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200699 END
700 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200701 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200702 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
703
704 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
705 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
706
707 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
708 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
709
Bram Moolenaarf6396232019-08-24 19:36:00 +0200710 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
711 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
712
713 " We have to send the actual mouse code, feedkeys() would be caught the
714 " filter.
715 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
716 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
717
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200718 " clean up
719 call StopVimInTerminal(buf)
720 call delete('XtestPopupClose')
721endfunction
722
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200723func Test_popup_menu_wrap()
724 CheckScreendump
725
726 let lines =<< trim END
727 call setline(1, range(1, 20))
728 call popup_create([
729 \ 'one',
730 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
731 \ 'three',
732 \ 'four',
733 \ ], #{
734 \ pos: "botleft",
735 \ border: [],
736 \ padding: [0,1,0,1],
737 \ maxheight: 3,
738 \ cursorline: 1,
739 \ filter: 'popup_filter_menu',
740 \ })
741 END
742 call writefile(lines, 'XtestPopupWrap')
743 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
744 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
745
746 call term_sendkeys(buf, "jj")
747 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
748
749 " clean up
750 call term_sendkeys(buf, "\<Esc>")
751 call StopVimInTerminal(buf)
752 call delete('XtestPopupWrap')
753endfunction
754
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200755func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200756 CheckScreendump
757
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200758 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200759 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200760 hi PopupColor ctermbg=lightgrey
761 let winid = popup_create([
762 \ 'some text',
763 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200764 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200765 \ line: 1,
766 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100767 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200768 \ wrap: 0,
769 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200770 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200771 \ zindex: 90,
772 \ padding: [],
773 \ highlight: 'PopupColor',
774 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200775 call popup_create([
776 \ 'xxxxxxxxx',
777 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200778 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200779 \ line: 3,
780 \ col: 18,
781 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200782 let winidb = popup_create([
783 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200784 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200785 \ line: 7,
786 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100787 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200788 \ wrap: 0,
789 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200790 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200791 \ close: 'button',
792 \ zindex: 90,
793 \ padding: [],
794 \ border: [],
795 \ 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 +0200796 END
797 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200798 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200799 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
800
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200801 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
802 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200803 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200804 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
805
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200806 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
807 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200808 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200809 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
810
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200811 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
812 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200813 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200814 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
815
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200816 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
817 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200818 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200819 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
820
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200821 " clean up
822 call StopVimInTerminal(buf)
823 call delete('XtestPopupMask')
824endfunc
825
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200826func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200827 CheckScreendump
828 CheckFeature clipboard_working
829
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200830 " create a popup with some text to be selected
831 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200832 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200833 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200834 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200835 \ drag: 1,
836 \ border: [],
837 \ line: 3,
838 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200839 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200840 \ })
841 func Select1()
842 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
843 endfunc
844 map <silent> <F3> :call test_setmouse(4, 15)<CR>
845 map <silent> <F4> :call test_setmouse(6, 23)<CR>
846 END
847 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200848 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200849 call term_sendkeys(buf, ":call Select1()\<CR>")
850 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
851
852 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
853 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200854 " clean the command line, sometimes it still shows a command
855 call term_sendkeys(buf, ":\<esc>")
856
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200857 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
858
859 " clean up
860 call StopVimInTerminal(buf)
861 call delete('XtestPopupSelect')
862endfunc
863
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200864func Test_popup_in_tab()
865 " default popup is local to tab, not visible when in other tab
866 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200867 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200868 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200869 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200870 tabnew
871 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200872 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200873 quit
874 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200875
876 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200877 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200878 " buffer is gone now
879 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200880
881 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200882 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200883 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200884 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200885 tabnew
886 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200887 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200888 quit
889 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200890 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200891
892 " create popup in other tab
893 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200894 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200895 call assert_equal(0, popup_getpos(winid).visible)
896 call assert_equal(1, popup_getoptions(winid).tabpage)
897 quit
898 call assert_equal(1, popup_getpos(winid).visible)
899 call assert_equal(0, popup_getoptions(winid).tabpage)
900 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200901endfunc
902
903func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200904 call assert_equal(0, len(popup_list()))
905
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200906 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200907 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200908 let pos = popup_getpos(winid)
909 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200910 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200911 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200912
913 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200914 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200915 let pos = popup_getpos(winid)
916 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200917 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200918
919 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200920 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200921 let pos = popup_getpos(winid)
922 let around = (&columns - pos.width) / 2
923 call assert_inrange(around - 1, around + 1, pos.col)
924 let around = (&lines - pos.height) / 2
925 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200926 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200927endfunc
928
929func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +0200930 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200931 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200932 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200933 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200934 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
935 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
936 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200937
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200938 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200939 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200940 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200941 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200942 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200943 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200944 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200945 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200946
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200947 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200948 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200949 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200950 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200951 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200952 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200953 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200954 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200955
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200956 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200957 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200958 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200959 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200960 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200961 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200962 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200963 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +0200964 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
965 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200966 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200967 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200968
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200969 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200970 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200971 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200972 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200973 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200974 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100975 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
976 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200977 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
978 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100979 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
980 call popup_clear()
981 call popup_create("text", #{mask: [range(4)]})
982 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200983 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +0200984 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200985 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200986 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
987 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200988endfunc
989
Bram Moolenaareea16992019-05-31 17:34:48 +0200990func Test_win_execute_closing_curwin()
991 split
992 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200993 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200994 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +0100995
996 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200997 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 +0100998 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +0200999endfunc
1000
1001func Test_win_execute_not_allowed()
1002 let winid = popup_create('some text', {})
1003 call assert_fails('call win_execute(winid, "split")', 'E994:')
1004 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1005 call assert_fails('call win_execute(winid, "close")', 'E994:')
1006 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001007 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001008 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1009 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1010 call assert_fails('call win_execute(winid, "next")', 'E994:')
1011 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001012 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001013 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001014 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1015 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1016 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1017 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001018 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1019 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001020 call assert_fails('call win_execute(winid, "help")', 'E994:')
1021 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001022 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1023 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1024 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1025 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001026 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001027endfunc
1028
Bram Moolenaar402502d2019-05-30 22:07:36 +02001029func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001030 CheckScreendump
1031
Bram Moolenaar402502d2019-05-30 22:07:36 +02001032 let lines =<< trim END
1033 call setline(1, range(1, 100))
1034 let winid = popup_create(
1035 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001036 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001037 END
1038 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001039 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001040 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1041
1042 " clean up
1043 call StopVimInTerminal(buf)
1044 call delete('XtestPopup')
1045endfunc
1046
1047func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001048 CheckScreendump
1049
Bram Moolenaar402502d2019-05-30 22:07:36 +02001050 let lines =<< trim END
1051 call setline(1, range(1, 100))
1052 let winid = popup_create(
1053 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001054 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001055 END
1056 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001057 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001058 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1059
1060 " clean up
1061 call StopVimInTerminal(buf)
1062 call delete('XtestPopup')
1063endfunc
1064
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001065func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001066 CheckScreendump
1067
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001068 let lines =<< trim END
1069 set showbreak=>>\
1070 call setline(1, range(1, 20))
1071 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001072 \ 'a long line here that wraps',
1073 \ #{filter: 'popup_filter_yesno',
1074 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001075 END
1076 call writefile(lines, 'XtestPopupShowbreak')
1077 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1078 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1079
1080 " clean up
1081 call term_sendkeys(buf, "y")
1082 call StopVimInTerminal(buf)
1083 call delete('XtestPopupShowbreak')
1084endfunc
1085
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001086func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001087 CheckFeature timers
1088
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001089 topleft vnew
1090 call setline(1, 'hello')
1091
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001092 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001093 \ line: 1,
1094 \ col: 1,
1095 \ minwidth: 20,
1096 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001097 \})
1098 redraw
1099 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1100 call assert_equal('world', line)
1101
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001102 call assert_equal(winid, popup_locate(1, 1))
1103 call assert_equal(winid, popup_locate(1, 20))
1104 call assert_equal(0, popup_locate(1, 21))
1105 call assert_equal(0, popup_locate(2, 1))
1106
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001107 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001108 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001109 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001110 call assert_equal('hello', line)
1111
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001112 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001113 \ line: &lines,
1114 \ col: 10,
1115 \ minwidth: 20,
1116 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001117 \})
1118 redraw
1119 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1120 call assert_match('.*on the command line.*', line)
1121
1122 sleep 700m
1123 redraw
1124 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1125 call assert_notmatch('.*on the command line.*', line)
1126
1127 bwipe!
1128endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001129
1130func Test_popup_hide()
1131 topleft vnew
1132 call setline(1, 'hello')
1133
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001134 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001135 \ line: 1,
1136 \ col: 1,
1137 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001138 \})
1139 redraw
1140 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1141 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001142 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001143 " buffer is still listed and active
1144 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001145
1146 call popup_hide(winid)
1147 redraw
1148 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1149 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001150 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001151 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001152 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001153
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001154 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001155 redraw
1156 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1157 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001158 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001159
1160
1161 call popup_close(winid)
1162 redraw
1163 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1164 call assert_equal('hello', line)
1165
1166 " error is given for existing non-popup window
1167 call assert_fails('call popup_hide(win_getid())', 'E993:')
1168
1169 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001170 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001171 call popup_show(41234234)
1172
1173 bwipe!
1174endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001175
1176func Test_popup_move()
1177 topleft vnew
1178 call setline(1, 'hello')
1179
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001180 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001181 \ line: 1,
1182 \ col: 1,
1183 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001184 \})
1185 redraw
1186 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1187 call assert_equal('world ', line)
1188
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001189 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001190 redraw
1191 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1192 call assert_equal('hello ', line)
1193 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1194 call assert_equal('~world', line)
1195
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001196 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001197 redraw
1198 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1199 call assert_equal('hworld', line)
1200
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001201 call assert_fails('call popup_move(winid, [])', 'E715:')
1202 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1203
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001204 call popup_close(winid)
1205
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001206 call assert_equal(0, popup_move(-1, {}))
1207
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001208 bwipe!
1209endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001210
Bram Moolenaar402502d2019-05-30 22:07:36 +02001211func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001212 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001213 \ line: 2,
1214 \ col: 3,
1215 \ minwidth: 10,
1216 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001217 \})
1218 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001219 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001220 call assert_equal(2, res.line)
1221 call assert_equal(3, res.col)
1222 call assert_equal(10, res.width)
1223 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001224 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001225
1226 call popup_close(winid)
1227endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001228
1229func Test_popup_width_longest()
1230 let tests = [
1231 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1232 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1233 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1234 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1235 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1236 \ ]
1237
1238 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001239 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001240 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001241 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001242 call assert_equal(test[1], position.width)
1243 call popup_close(winid)
1244 endfor
1245endfunc
1246
1247func Test_popup_wraps()
1248 let tests = [
1249 \ ['nowrap', 6, 1],
1250 \ ['a line that wraps once', 12, 2],
1251 \ ['a line that wraps two times', 12, 3],
1252 \ ]
1253 for test in tests
1254 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001255 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001256 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001257 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001258 call assert_equal(test[1], position.width)
1259 call assert_equal(test[2], position.height)
1260
1261 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001262 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001263 endfor
1264endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001265
1266func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001267 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001268 \ line: 2,
1269 \ col: 3,
1270 \ minwidth: 10,
1271 \ minheight: 11,
1272 \ maxwidth: 20,
1273 \ maxheight: 21,
1274 \ zindex: 100,
1275 \ time: 5000,
1276 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001277 \})
1278 redraw
1279 let res = popup_getoptions(winid)
1280 call assert_equal(2, res.line)
1281 call assert_equal(3, res.col)
1282 call assert_equal(10, res.minwidth)
1283 call assert_equal(11, res.minheight)
1284 call assert_equal(20, res.maxwidth)
1285 call assert_equal(21, res.maxheight)
1286 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001287 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001288 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001289 if has('timers')
1290 call assert_equal(5000, res.time)
1291 endif
1292 call popup_close(winid)
1293
1294 let winid = popup_create('hello', {})
1295 redraw
1296 let res = popup_getoptions(winid)
1297 call assert_equal(0, res.line)
1298 call assert_equal(0, res.col)
1299 call assert_equal(0, res.minwidth)
1300 call assert_equal(0, res.minheight)
1301 call assert_equal(0, res.maxwidth)
1302 call assert_equal(0, res.maxheight)
1303 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001304 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001305 if has('timers')
1306 call assert_equal(0, res.time)
1307 endif
1308 call popup_close(winid)
1309 call assert_equal({}, popup_getoptions(winid))
1310endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001311
1312func Test_popup_option_values()
1313 new
1314 " window-local
1315 setlocal number
1316 setlocal nowrap
1317 " buffer-local
1318 setlocal omnifunc=Something
1319 " global/buffer-local
1320 setlocal path=/there
1321 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001322 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001323
1324 let winid = popup_create('hello', {})
1325 call assert_equal(0, getwinvar(winid, '&number'))
1326 call assert_equal(1, getwinvar(winid, '&wrap'))
1327 call assert_equal('', getwinvar(winid, '&omnifunc'))
1328 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001329 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1330
1331 " 'scrolloff' is reset to zero
1332 call assert_equal(5, &scrolloff)
1333 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001334
1335 call popup_close(winid)
1336 bwipe
1337endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001338
1339func Test_popup_atcursor()
1340 topleft vnew
1341 call setline(1, [
1342 \ 'xxxxxxxxxxxxxxxxx',
1343 \ 'xxxxxxxxxxxxxxxxx',
1344 \ 'xxxxxxxxxxxxxxxxx',
1345 \])
1346
1347 call cursor(2, 2)
1348 redraw
1349 let winid = popup_atcursor('vim', {})
1350 redraw
1351 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1352 call assert_equal('xvimxxxxxxxxxxxxx', line)
1353 call popup_close(winid)
1354
1355 call cursor(3, 4)
1356 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001357 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001358 redraw
1359 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1360 call assert_equal('xxxvimxxxxxxxxxxx', line)
1361 call popup_close(winid)
1362
1363 call cursor(1, 1)
1364 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001365 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001366 \ line: 'cursor+2',
1367 \ col: 'cursor+1',
1368 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001369 redraw
1370 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1371 call assert_equal('xvimxxxxxxxxxxxxx', line)
1372 call popup_close(winid)
1373
1374 call cursor(3, 3)
1375 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001376 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001377 \ line: 'cursor-2',
1378 \ col: 'cursor-1',
1379 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001380 redraw
1381 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1382 call assert_equal('xvimxxxxxxxxxxxxx', line)
1383 call popup_close(winid)
1384
Bram Moolenaar402502d2019-05-30 22:07:36 +02001385 " just enough room above
1386 call cursor(3, 3)
1387 redraw
1388 let winid = popup_atcursor(['vim', 'is great'], {})
1389 redraw
1390 let pos = popup_getpos(winid)
1391 call assert_equal(1, pos.line)
1392 call popup_close(winid)
1393
1394 " not enough room above, popup goes below the cursor
1395 call cursor(3, 3)
1396 redraw
1397 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1398 redraw
1399 let pos = popup_getpos(winid)
1400 call assert_equal(4, pos.line)
1401 call popup_close(winid)
1402
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001403 " cursor in first line, popup in line 2
1404 call cursor(1, 1)
1405 redraw
1406 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1407 redraw
1408 let pos = popup_getpos(winid)
1409 call assert_equal(2, pos.line)
1410 call popup_close(winid)
1411
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001412 bwipe!
1413endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001414
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001415func Test_popup_atcursor_pos()
1416 CheckScreendump
1417
1418 let lines =<< trim END
1419 call setline(1, repeat([repeat('-', 60)], 15))
1420 set so=0
1421
1422 normal 9G3|r#
1423 let winid1 = popup_atcursor(['first', 'second'], #{
1424 \ moved: [0, 0, 0],
1425 \ })
1426 normal 9G21|r&
1427 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1428 \ pos: 'botright',
1429 \ moved: [0, 0, 0],
1430 \ })
1431 normal 3G27|r%
1432 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1433 \ pos: 'topleft',
1434 \ moved: [0, 0, 0],
1435 \ })
1436 normal 3G45|r@
1437 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1438 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001439 \ moved: range(3),
1440 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001441 \ })
1442 END
1443 call writefile(lines, 'XtestPopupAtcursorPos')
1444 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1445 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1446
1447 " clean up
1448 call StopVimInTerminal(buf)
1449 call delete('XtestPopupAtcursorPos')
1450endfunc
1451
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001452func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001453 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001454 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001455
1456 let lines =<< trim END
1457 call setline(1, range(1, 20))
1458 call setline(5, 'here is some text to hover over')
1459 set balloonevalterm
1460 set balloonexpr=BalloonExpr()
1461 set balloondelay=100
1462 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001463 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001464 return ''
1465 endfunc
1466 func Hover()
1467 call test_setmouse(5, 15)
1468 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1469 sleep 100m
1470 endfunc
1471 func MoveOntoPopup()
1472 call test_setmouse(4, 17)
1473 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1474 endfunc
1475 func MoveAway()
1476 call test_setmouse(5, 13)
1477 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1478 endfunc
1479 END
1480 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001481 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001482 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001483 call term_sendkeys(buf, 'j')
1484 call term_sendkeys(buf, ":call Hover()\<CR>")
1485 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1486
1487 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1488 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1489
1490 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1491 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1492
1493 " clean up
1494 call StopVimInTerminal(buf)
1495 call delete('XtestPopupBeval')
1496endfunc
1497
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001498func Test_popup_filter()
1499 new
1500 call setline(1, 'some text')
1501
1502 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001503 if a:c == 'e' || a:c == "\<F9>"
1504 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001505 return 1
1506 endif
1507 if a:c == '0'
1508 let g:ignored = '0'
1509 return 0
1510 endif
1511 if a:c == 'x'
1512 call popup_close(a:winid)
1513 return 1
1514 endif
1515 return 0
1516 endfunc
1517
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001518 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001519 redraw
1520
1521 " e is consumed by the filter
1522 call feedkeys('e', 'xt')
1523 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001524 call feedkeys("\<F9>", 'xt')
1525 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001526
1527 " 0 is ignored by the filter
1528 normal $
1529 call assert_equal(9, getcurpos()[2])
1530 call feedkeys('0', 'xt')
1531 call assert_equal('0', g:ignored)
1532 call assert_equal(1, getcurpos()[2])
1533
1534 " x closes the popup
1535 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001536 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001537 call assert_equal(-1, winbufnr(winid))
1538
1539 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001540 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001541endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001542
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001543" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001544func Test_popup_filter_normal_cmd()
1545 CheckScreendump
1546
1547 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001548 let text = range(1, 20)->map({_, v -> string(v)})
1549 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1550 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001551 END
1552 call writefile(lines, 'XtestPopupNormal')
1553 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1554 call TermWait(buf, 100)
1555 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1556
1557 call StopVimInTerminal(buf)
1558 call delete('XtestPopupNormal')
1559endfunc
1560
Bram Moolenaar10476522020-09-24 22:57:31 +02001561" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001562func Test_popup_filter_win_execute()
1563 CheckScreendump
1564
1565 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001566 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1567 let g:id = popup_create(lines, #{
1568 \ minheight: &lines - 5,
1569 \ maxheight: &lines - 5,
1570 \ cursorline: 1,
1571 \ })
1572 redraw
1573 END
1574 call writefile(lines, 'XtestPopupWinExecute')
1575 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1576
1577 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1578 call term_sendkeys(buf, ":\<CR>")
1579
1580 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1581
1582 call StopVimInTerminal(buf)
1583 call delete('XtestPopupWinExecute')
1584endfunc
1585
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001586func Test_popup_set_firstline()
1587 CheckScreendump
1588
1589 let lines =<< trim END
1590 let lines = range(1, 50)->map({_, v -> string(v)})
1591 let g:id = popup_create(lines, #{
1592 \ minwidth: 20,
1593 \ maxwidth: 20,
1594 \ minheight: &lines - 5,
1595 \ maxheight: &lines - 5,
1596 \ cursorline: 1,
1597 \ })
1598 call popup_setoptions(g:id, #{firstline: 10})
1599 redraw
1600 END
1601 call writefile(lines, 'XtestPopupWinSetFirstline')
1602 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1603
1604 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1605
1606 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1607 call term_sendkeys(buf, ":\<CR>")
1608 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1609
1610 call StopVimInTerminal(buf)
1611 call delete('XtestPopupWinSetFirstline')
1612endfunc
1613
Bram Moolenaar10476522020-09-24 22:57:31 +02001614" this tests that we don't get stuck with an error in "win_execute()"
1615func Test_popup_filter_win_execute_error()
1616 CheckScreendump
1617
1618 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001619 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1620 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1621 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001622 call writefile(lines, 'XtestPopupWinExecuteError')
1623 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001624
1625 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1626 call term_sendkeys(buf, "\<CR>")
1627 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1628 call term_sendkeys(buf, "\<CR>")
1629 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1630 call term_sendkeys(buf, "\<CR>")
1631 call term_sendkeys(buf, "\<CR>")
1632 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1633
1634 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001635 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001636endfunc
1637
Bram Moolenaara42d9452019-06-15 21:46:30 +02001638func ShowDialog(key, result)
1639 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001640 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001641 \ filter: 'popup_filter_yesno',
1642 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001643 \ })
1644 redraw
1645 call feedkeys(a:key, "xt")
1646 call assert_equal(winid, s:cb_winid)
1647 call assert_equal(a:result, s:cb_res)
1648endfunc
1649
1650func Test_popup_dialog()
1651 func QuitCallback(id, res)
1652 let s:cb_winid = a:id
1653 let s:cb_res = a:res
1654 endfunc
1655
1656 let winid = ShowDialog("y", 1)
1657 let winid = ShowDialog("Y", 1)
1658 let winid = ShowDialog("n", 0)
1659 let winid = ShowDialog("N", 0)
1660 let winid = ShowDialog("x", 0)
1661 let winid = ShowDialog("X", 0)
1662 let winid = ShowDialog("\<Esc>", 0)
1663 let winid = ShowDialog("\<C-C>", -1)
1664
1665 delfunc QuitCallback
1666endfunc
1667
Bram Moolenaara730e552019-06-16 19:05:31 +02001668func ShowMenu(key, result)
1669 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001670 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001671 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001672 \ })
1673 redraw
1674 call feedkeys(a:key, "xt")
1675 call assert_equal(winid, s:cb_winid)
1676 call assert_equal(a:result, s:cb_res)
1677endfunc
1678
1679func Test_popup_menu()
1680 func QuitCallback(id, res)
1681 let s:cb_winid = a:id
1682 let s:cb_res = a:res
1683 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001684 " mapping won't be used in popup
1685 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001686
1687 let winid = ShowMenu(" ", 1)
1688 let winid = ShowMenu("j \<CR>", 2)
1689 let winid = ShowMenu("JjK \<CR>", 2)
1690 let winid = ShowMenu("jjjjjj ", 3)
1691 let winid = ShowMenu("kkk ", 1)
1692 let winid = ShowMenu("x", -1)
1693 let winid = ShowMenu("X", -1)
1694 let winid = ShowMenu("\<Esc>", -1)
1695 let winid = ShowMenu("\<C-C>", -1)
1696
1697 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001698 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001699endfunc
1700
1701func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001702 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001703
1704 let lines =<< trim END
1705 call setline(1, range(1, 20))
1706 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001707 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001708 func MenuDone(id, res)
1709 echomsg "selected " .. a:res
1710 endfunc
1711 END
1712 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001713 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001714 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1715
1716 call term_sendkeys(buf, "jj")
1717 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1718
1719 call term_sendkeys(buf, " ")
1720 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1721
1722 " clean up
1723 call StopVimInTerminal(buf)
1724 call delete('XtestPopupMenu')
1725endfunc
1726
Bram Moolenaarf914a332019-07-20 15:09:56 +02001727func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001728 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001729
1730 let lines =<< trim END
1731 call setline(1, range(1, 20))
1732 hi PopupSelected ctermbg=green
1733 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1734 func MenuDone(id, res)
1735 echomsg "selected " .. a:res
1736 endfunc
1737 END
1738 call writefile(lines, 'XtestPopupNarrowMenu')
1739 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1740 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1741
1742 " clean up
1743 call term_sendkeys(buf, "x")
1744 call StopVimInTerminal(buf)
1745 call delete('XtestPopupNarrowMenu')
1746endfunc
1747
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001748func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001749 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001750
1751 " Create a popup without title or border, a line of padding will be added to
1752 " put the title on.
1753 let lines =<< trim END
1754 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001755 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001756 END
1757 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001758 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001759 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1760
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001761 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1762 call term_sendkeys(buf, ":\<CR>")
1763 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1764
1765 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1766 call term_sendkeys(buf, ":\<CR>")
1767 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1768
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001769 " clean up
1770 call StopVimInTerminal(buf)
1771 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001772
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001773 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001774 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001775 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001776 call assert_equal('Another Title', popup_getoptions(winid).title)
1777
1778 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001779endfunc
1780
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001781func Test_popup_close_callback()
1782 func PopupDone(id, result)
1783 let g:result = a:result
1784 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001785 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001786 redraw
1787 call popup_close(winid, 'done')
1788 call assert_equal('done', g:result)
1789endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001790
1791func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001792 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001793 redraw
1794 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001795 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001796 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001797 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001798
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001799 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001800 redraw
1801 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001802 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001803 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001804 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001805endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001806
1807func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001808 CheckScreendump
1809
Bram Moolenaar988c4332019-06-02 14:12:11 +02001810 " +-----------------------------+
1811 " | | |
1812 " | | |
1813 " | | |
1814 " | line1 |
1815 " |------------line2------------|
1816 " | line3 |
1817 " | line4 |
1818 " | |
1819 " | |
1820 " +-----------------------------+
1821 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001822 split
1823 vsplit
1824 let info_window1 = getwininfo()[0]
1825 let line = info_window1['height']
1826 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001827 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001828 \ line : line,
1829 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001830 \ })
1831 END
1832 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001833 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001834 call term_sendkeys(buf, "\<C-W>w")
1835 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1836
1837 " clean up
1838 call StopVimInTerminal(buf)
1839 call delete('XtestPopupBehind')
1840endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001841
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001842func s:VerifyPosition(p, msg, line, col, width, height)
1843 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1844 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1845 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1846 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001847endfunc
1848
1849func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001850 " Anything placed past the last cell on the right of the screen is moved to
1851 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001852 "
1853 " When wrapping is disabled, we also shift to the left to display on the
1854 " screen, unless fixed is set.
1855
1856 " Entries for cases which don't vary based on wrapping.
1857 " Format is per tests described below
1858 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001859 \ ['a', 5, &columns, 5, &columns, 1, 1],
1860 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1861 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001862 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001863 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001864
1865 " these test groups are dicts with:
1866 " - comment: something to identify the group of tests by
1867 " - options: dict of options to merge with the row/col in tests
1868 " - tests: list of cases. Each one is a list with elements:
1869 " - text
1870 " - row
1871 " - col
1872 " - expected row
1873 " - expected col
1874 " - expected width
1875 " - expected height
1876 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001877 \ #{
1878 \ comment: 'left-aligned with wrapping',
1879 \ options: #{
1880 \ wrap: 1,
1881 \ pos: 'botleft',
1882 \ },
1883 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001884 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1885 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1886 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1887 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1888 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1889 \
1890 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1891 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1892 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1893 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1894 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1895 \
1896 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1897 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1898 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001899 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1900 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001901 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001902 \ ],
1903 \ },
1904 \ #{
1905 \ comment: 'left aligned without wrapping',
1906 \ options: #{
1907 \ wrap: 0,
1908 \ pos: 'botleft',
1909 \ },
1910 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001911 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1912 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1913 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1914 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1915 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1916 \
1917 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1918 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1919 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1920 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1921 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1922 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001923 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1924 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1925 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1926 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1927 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1928 \ ],
1929 \ },
1930 \ #{
1931 \ comment: 'left aligned with fixed position',
1932 \ options: #{
1933 \ wrap: 0,
1934 \ fixed: 1,
1935 \ pos: 'botleft',
1936 \ },
1937 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001938 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1939 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1940 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1941 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1942 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1943 \
1944 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1945 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1946 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1947 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1948 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1949 \
1950 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1951 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1952 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001953 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1954 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1955 \ ],
1956 \ },
1957 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001958
1959 for test_group in tests
1960 for test in test_group.tests
1961 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001962 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001963 \ line: line,
1964 \ col: col,
1965 \ }
1966 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001967
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001968 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001969
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001970 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001971 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
1972 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001973 endfor
1974 endfor
1975
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001976 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001977 %bwipe!
1978endfunc
1979
Bram Moolenaar3397f742019-06-02 18:40:06 +02001980func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001981 " width of screen
1982 let X = join(map(range(&columns), {->'X'}), '')
1983
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001984 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1985 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001986
1987 redraw
1988 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1989 call assert_equal(X, line)
1990
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001991 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001992 redraw
1993
1994 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001995 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
1996 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001997
1998 redraw
1999 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2000 call assert_equal(X, line)
2001
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002002 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002003 redraw
2004
2005 " Extend so > window width
2006 let X .= 'x'
2007
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002008 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2009 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002010
2011 redraw
2012 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2013 call assert_equal(X[ : -2 ], line)
2014
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002015 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002016 redraw
2017
2018 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002019 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2020 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002021
2022 redraw
2023 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2024 call assert_equal(X[ : -2 ], line)
2025
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002026 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002027 redraw
2028
2029 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002030 let p = popup_create(X,
2031 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2032 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002033
2034 redraw
2035 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2036 let e_line = ' ' . X[ 1 : -2 ]
2037 call assert_equal(e_line, line)
2038
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002039 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002040 redraw
2041
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002042 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002043 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002044endfunc
2045
2046func Test_popup_moved()
2047 new
2048 call test_override('char_avail', 1)
2049 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2050
2051 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002052 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002053 redraw
2054 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002055 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002056 " trigger the check for last_cursormoved by going into insert mode
2057 call feedkeys("li\<Esc>", 'xt')
2058 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002059 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002060
2061 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002062 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002063 redraw
2064 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002065 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002066 call feedkeys("hi\<Esc>", 'xt')
2067 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002068 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002069
2070 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002071 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002072 redraw
2073 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002074 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002075 call feedkeys("li\<Esc>", 'xt')
2076 call assert_equal(1, popup_getpos(winid).visible)
2077 call feedkeys("ei\<Esc>", 'xt')
2078 call assert_equal(1, popup_getpos(winid).visible)
2079 call feedkeys("eli\<Esc>", 'xt')
2080 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002081 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002082
Bram Moolenaar17627312019-06-02 19:53:44 +02002083 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002084 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002085 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002086 redraw
2087 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002088 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002089 call feedkeys("eli\<Esc>", 'xt')
2090 call assert_equal(1, popup_getpos(winid).visible)
2091 call feedkeys("wi\<Esc>", 'xt')
2092 call assert_equal(1, popup_getpos(winid).visible)
2093 call feedkeys("Eli\<Esc>", 'xt')
2094 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002095 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002096
2097 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002098 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002099 redraw
2100 call assert_equal(1, popup_getpos(winid).visible)
2101 call feedkeys("eli\<Esc>", 'xt')
2102 call feedkeys("ei\<Esc>", 'xt')
2103 call assert_equal(1, popup_getpos(winid).visible)
2104 call feedkeys("eli\<Esc>", 'xt')
2105 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002106 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002107
2108 bwipe!
2109 call test_override('ALL', 0)
2110endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002111
2112func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002113 CheckFeature timers
2114 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002115
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002116 let lines =<< trim END
2117 call setline(1, range(1, 20))
2118 hi Notification ctermbg=lightblue
2119 call popup_notification('first notification', {})
2120 END
2121 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002122 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002123 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2124
2125 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002126 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2127 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002128 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2129
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002130 " clean up
2131 call StopVimInTerminal(buf)
2132 call delete('XtestNotifications')
2133endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002134
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002135func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002136 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002137
2138 let lines =<< trim END
2139 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002140 hi ScrollThumb ctermbg=blue
2141 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002142 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002143 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002144 \ minwidth: 8,
2145 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002146 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002147 func ScrollUp()
2148 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2149 endfunc
2150 func ScrollDown()
2151 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2152 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002153 func ClickTop()
2154 call feedkeys("\<F4>\<LeftMouse>", "xt")
2155 endfunc
2156 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002157 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002158 call feedkeys("\<F5>\<LeftMouse>", "xt")
2159 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002160 func Popup_filter(winid, key)
2161 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002162 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002163 let line = popup_getoptions(a:winid).firstline
2164 let nlines = line('$', a:winid)
2165 let newline = line < nlines ? (line + 1) : nlines
2166 call popup_setoptions(a:winid, #{firstline: newline})
2167 return v:true
2168 elseif a:key == 'x'
2169 call popup_close(a:winid)
2170 return v:true
2171 endif
2172 endfunc
2173
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002174 def CreatePopup(text: list<string>)
2175 popup_create(text, #{
2176 \ minwidth: 30,
2177 \ maxwidth: 30,
2178 \ minheight: 4,
2179 \ maxheight: 4,
2180 \ firstline: 1,
2181 \ lastline: 4,
2182 \ wrap: true,
2183 \ scrollbar: true,
2184 \ mapping: false,
2185 \ filter: Popup_filter,
2186 \ })
2187 enddef
2188
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002189 func PopupScroll()
2190 call popup_clear()
2191 let text =<< trim END
2192 1
2193 2
2194 3
2195 4
2196 long line long line long line long line long line long line
2197 long line long line long line long line long line long line
2198 long line long line long line long line long line long line
2199 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002200 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002201 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002202 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002203 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2204 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002205 END
2206 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002207 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002208 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2209
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002210 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002211 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002212 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2213
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002214 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002215 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002216 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2217
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002218 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002219 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002220 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2221
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002222 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002223 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002224 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2225 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2226
2227 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2228 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2229
2230 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002231 " wait a bit, otherwise it fails sometimes (double click recognized?)
2232 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002233 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2234 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2235
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002236 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2237 sleep 100m
2238 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2239 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2240
2241 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2242 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2243
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002244 " remove the minwidth and maxheight
2245 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002246 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002247 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2248
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002249 " check size with non-wrapping lines
2250 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2251 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2252
2253 " check size with wrapping lines
2254 call term_sendkeys(buf, "j")
2255 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002256
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002257 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002258 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002259 call StopVimInTerminal(buf)
2260 call delete('XtestPopupScroll')
2261endfunc
2262
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002263func Test_popup_too_high_scrollbar()
2264 CheckScreendump
2265
2266 let lines =<< trim END
2267 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2268 set scrolloff=0
2269 func ShowPopup()
2270 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2271 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2272 \ minwidth: 8,
2273 \ border: [],
2274 \ })
2275 endfunc
2276 normal 3G$
2277 call ShowPopup()
2278 END
2279 call writefile(lines, 'XtestPopupToohigh')
2280 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2281 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2282
2283 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2284 call term_sendkeys(buf, "8G$")
2285 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2286 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2287
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002288 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2289 call term_sendkeys(buf, "gg$")
2290 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2291 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2292
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002293 " clean up
2294 call StopVimInTerminal(buf)
2295 call delete('XtestPopupToohigh')
2296endfunc
2297
Bram Moolenaar437a7462019-07-05 20:17:22 +02002298func Test_popup_fitting_scrollbar()
2299 " this was causing a crash, divide by zero
2300 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002301 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002302 \ scrollbar: 1,
2303 \ maxwidth: 10,
2304 \ maxheight: 5,
2305 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002306 redraw
2307 call popup_clear()
2308endfunc
2309
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002310func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002311 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002312
2313 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002314 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002315 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002316 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002317 END
2318
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002319 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002320 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002321 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2322
2323 " Setting to empty string clears it
2324 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2325 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2326
2327 " Setting a list
2328 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2329 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2330
2331 " Shrinking with a list
2332 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2333 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2334
2335 " Growing with a list
2336 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2337 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2338
2339 " Empty list clears
2340 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2341 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2342
2343 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002344 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002345 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2346
Bram Moolenaarb0992022020-01-30 14:55:42 +01002347 " range() (doesn't work)
2348 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2349 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2350
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002351 " clean up
2352 call StopVimInTerminal(buf)
2353 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002354endfunc
2355
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002356func Test_popup_settext_getline()
2357 let id = popup_create('', #{ tabpage: 0 })
2358 call popup_settext(id, ['a','b'])
2359 call assert_equal(2, line('$', id)) " OK :)
2360 call popup_close(id)
2361
2362 let id = popup_create('', #{ tabpage: -1 })
2363 call popup_settext(id, ['a','b'])
2364 call assert_equal(2, line('$', id)) " Fails :(
2365 call popup_close(id)
2366endfunc
2367
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002368func Test_popup_settext_null()
2369 let id = popup_create('', #{ tabpage: 0 })
2370 call popup_settext(id, test_null_list())
2371 call popup_close(id)
2372
2373 let id = popup_create('', #{ tabpage: 0 })
2374 call popup_settext(id, test_null_string())
2375 call popup_close(id)
2376endfunc
2377
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002378func Test_popup_hidden()
2379 new
2380
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002381 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002382 redraw
2383 call assert_equal(0, popup_getpos(winid).visible)
2384 call popup_close(winid)
2385
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002386 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002387 redraw
2388 call assert_equal(0, popup_getpos(winid).visible)
2389 call popup_close(winid)
2390
2391 func QuitCallback(id, res)
2392 let s:cb_winid = a:id
2393 let s:cb_res = a:res
2394 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002395 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002396 \ filter: 'popup_filter_yesno',
2397 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002398 \ })
2399 redraw
2400 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002401 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2402 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002403 exe "normal anot used by filter\<Esc>"
2404 call assert_equal('not used by filter', getline(1))
2405
2406 call popup_show(winid)
2407 call feedkeys('y', "xt")
2408 call assert_equal(1, s:cb_res)
2409
2410 bwipe!
2411 delfunc QuitCallback
2412endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002413
2414" Test options not checked elsewhere
2415func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002416 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002417 let options = popup_getoptions(winid)
2418 call assert_equal(1, options.wrap)
2419 call assert_equal(0, options.drag)
2420 call assert_equal('Beautiful', options.highlight)
2421
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002422 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002423 let options = popup_getoptions(winid)
2424 call assert_equal(0, options.wrap)
2425 call assert_equal(1, options.drag)
2426 call assert_equal('Another', options.highlight)
2427
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002428 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2429 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2430
Bram Moolenaarae943152019-06-16 22:54:14 +02002431 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002432 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002433endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002434
2435func Test_popupwin_garbage_collect()
2436 func MyPopupFilter(x, winid, c)
2437 " NOP
2438 endfunc
2439
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002440 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002441 call test_garbagecollect_now()
2442 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002443 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002444 call feedkeys('j', 'xt')
2445 call assert_true(v:true)
2446
2447 call popup_close(winid)
2448 delfunc MyPopupFilter
2449endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002450
Bram Moolenaar581ba392019-09-03 22:08:33 +02002451func Test_popupwin_filter_mode()
2452 func MyPopupFilter(winid, c)
2453 let s:typed = a:c
2454 if a:c == ':' || a:c == "\r" || a:c == 'v'
2455 " can start cmdline mode, get out, and start/stop Visual mode
2456 return 0
2457 endif
2458 return 1
2459 endfunc
2460
2461 " Normal, Visual and Insert mode
2462 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2463 redraw
2464 call feedkeys('x', 'xt')
2465 call assert_equal('x', s:typed)
2466
2467 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2468 call assert_equal(':', s:typed)
2469 call assert_equal('foo', g:foo)
2470
2471 let @x = 'something'
2472 call feedkeys('v$"xy', 'xt')
2473 call assert_equal('y', s:typed)
2474 call assert_equal('something', @x) " yank command is filtered out
2475 call feedkeys('v', 'xt') " end Visual mode
2476
2477 call popup_close(winid)
2478
2479 " only Normal mode
2480 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2481 redraw
2482 call feedkeys('x', 'xt')
2483 call assert_equal('x', s:typed)
2484
2485 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2486 call assert_equal(':', s:typed)
2487 call assert_equal('foo', g:foo)
2488
2489 let @x = 'something'
2490 call feedkeys('v$"xy', 'xt')
2491 call assert_equal('v', s:typed)
2492 call assert_notequal('something', @x)
2493
2494 call popup_close(winid)
2495
2496 " default: all modes
2497 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2498 redraw
2499 call feedkeys('x', 'xt')
2500 call assert_equal('x', s:typed)
2501
2502 let g:foo = 'bar'
2503 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2504 call assert_equal("\r", s:typed)
2505 call assert_equal('bar', g:foo)
2506
2507 let @x = 'something'
2508 call feedkeys('v$"xy', 'xt')
2509 call assert_equal('y', s:typed)
2510 call assert_equal('something', @x) " yank command is filtered out
2511 call feedkeys('v', 'xt') " end Visual mode
2512
2513 call popup_close(winid)
2514 delfunc MyPopupFilter
2515endfunc
2516
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002517func Test_popupwin_filter_mouse()
2518 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002519 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002520 return 0
2521 endfunc
2522
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002523 call setline(1, ['.'->repeat(25)]->repeat(10))
2524 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2525 \ line: 2,
2526 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002527 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002528 \ padding: [],
2529 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002530 \ filter: 'MyPopupFilter',
2531 \ })
2532 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002533 " 123456789012345678901
2534 " 1 .....................
2535 " 2 ...+--------------+..
2536 " 3 ...| |..
2537 " 4 ...| short |..
2538 " 5 ...| long line th |..
2539 " 6 ...| at will wrap |..
2540 " 7 ...| other |..
2541 " 8 ...| |..
2542 " 9 ...+--------------+..
2543 " 10 .....................
2544 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002545
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002546 func AddItemOutsidePopup(tests, row, col)
2547 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2548 \ screenrow: a:row, screencol: a:col,
2549 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2550 \ line: a:row, column: a:col,
2551 \ }})
2552 endfunc
2553 func AddItemInPopupBorder(tests, winid, row, col)
2554 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2555 \ screenrow: a:row, screencol: a:col,
2556 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2557 \ line: 0, column: 0,
2558 \ }})
2559 endfunc
2560 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2561 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2562 \ screenrow: a:row, screencol: a:col,
2563 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2564 \ line: a:textline, column: a:textcol,
2565 \ }})
2566 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002567
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002568 " above and below popup
2569 for c in range(1, 21)
2570 call AddItemOutsidePopup(tests, 1, c)
2571 call AddItemOutsidePopup(tests, 10, c)
2572 endfor
2573 " left and right of popup
2574 for r in range(1, 10)
2575 call AddItemOutsidePopup(tests, r, 3)
2576 call AddItemOutsidePopup(tests, r, 20)
2577 endfor
2578 " top and bottom in popup
2579 for c in range(4, 19)
2580 call AddItemInPopupBorder(tests, winid, 2, c)
2581 call AddItemInPopupBorder(tests, winid, 3, c)
2582 call AddItemInPopupBorder(tests, winid, 8, c)
2583 call AddItemInPopupBorder(tests, winid, 9, c)
2584 endfor
2585 " left and right margin in popup
2586 for r in range(2, 9)
2587 call AddItemInPopupBorder(tests, winid, r, 4)
2588 call AddItemInPopupBorder(tests, winid, r, 5)
2589 call AddItemInPopupBorder(tests, winid, r, 18)
2590 call AddItemInPopupBorder(tests, winid, r, 19)
2591 endfor
2592 " text "short"
2593 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2594 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2595 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2596 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2597 " text "long line th"
2598 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2599 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2600 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2601 " text "at will wrap"
2602 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2603 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2604 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2605 " text "other"
2606 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2607 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2608 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2609 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002610
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002611 for item in tests
2612 call test_setmouse(item.clickrow, item.clickcol)
2613 call feedkeys("\<LeftMouse>", 'xt')
2614 call assert_equal(item.result, g:got_mousepos)
2615 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002616
2617 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002618 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002619 delfunc MyPopupFilter
2620endfunc
2621
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002622func Test_popupwin_with_buffer()
2623 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2624 let buf = bufadd('XsomeFile')
2625 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002626
2627 setlocal number
2628 call setbufvar(buf, "&wrapmargin", 13)
2629
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002630 let winid = popup_create(buf, {})
2631 call assert_notequal(0, winid)
2632 let pos = popup_getpos(winid)
2633 call assert_equal(2, pos.height)
2634 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002635
2636 " window-local option is set to default, buffer-local is not
2637 call assert_equal(0, getwinvar(winid, '&number'))
2638 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2639
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002640 call popup_close(winid)
2641 call assert_equal({}, popup_getpos(winid))
2642 call assert_equal(1, bufloaded(buf))
2643 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002644 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002645
2646 edit test_popupwin.vim
2647 let winid = popup_create(bufnr(''), {})
2648 redraw
2649 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002650 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002651endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002652
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002653func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002654 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002655 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002656 " Starting a terminal to run a shell in is considered flaky.
2657 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002658
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002659 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002660
2661 " open help window to test that :help below fails
2662 help
2663
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002664 let termbuf = term_start(&shell, #{hidden: 1})
2665 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10})
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002666 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002667 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002668 sleep 100m
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002669 " Check this doesn't crash
2670 call assert_equal(winnr(), winnr('j'))
2671 call assert_equal(winnr(), winnr('k'))
2672 call assert_equal(winnr(), winnr('h'))
2673 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002674
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002675 " Cannot quit while job is running
2676 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002677
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002678 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002679 call feedkeys("xxx\<C-W>N", 'xt')
2680 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2681 call feedkeys("a\<C-U>", 'xt')
2682
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002683 " Cannot escape from terminal window
2684 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002685 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002686
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002687 " Cannot open a second one.
2688 let termbuf2 = term_start(&shell, #{hidden: 1})
2689 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2690 call term_sendkeys(termbuf2, "exit\<CR>")
2691
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002692 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002693 call feedkeys("exit\<CR>", 'xt')
2694 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002695 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002696
Bram Moolenaar349f6092020-10-06 20:46:49 +02002697 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002698 call feedkeys(":quit\<CR>", 'xt')
2699 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002700endfunc
2701
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002702func Test_popupwin_close_prevwin()
2703 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002704 call Popupwin_close_prevwin()
2705endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002706
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002707def Popupwin_close_prevwin()
2708 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002709 split
2710 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002711 assert_equal(2, winnr())
Bram Moolenaar7a9cbca2020-09-27 22:47:05 +02002712 var buf = term_start(&shell, #{hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002713 popup_create(buf, {})
2714 TermWait(buf, 100)
2715 popup_clear(true)
2716 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002717
2718 quit
2719 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002720enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002721
Bram Moolenaar934470e2019-09-01 23:27:05 +02002722func Test_popupwin_with_buffer_and_filter()
2723 new Xwithfilter
2724 call setline(1, range(100))
2725 let bufnr = bufnr()
2726 hide
2727
2728 func BufferFilter(win, key)
2729 if a:key == 'G'
2730 " recursive use of "G" does not cause problems.
2731 call win_execute(a:win, 'normal! G')
2732 return 1
2733 endif
2734 return 0
2735 endfunc
2736
2737 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2738 call assert_equal(1, popup_getpos(winid).firstline)
2739 redraw
2740 call feedkeys("G", 'xt')
2741 call assert_equal(99, popup_getpos(winid).firstline)
2742
2743 call popup_close(winid)
2744 exe 'bwipe! ' .. bufnr
2745endfunc
2746
Bram Moolenaare296e312019-07-03 23:20:18 +02002747func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002748 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002749 \ maxwidth: 40,
2750 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002751 \ })
2752 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002753 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002754 redraw
2755 call assert_equal(19, popup_getpos(winid).width)
2756 endfor
2757 call popup_clear()
2758endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002759
2760func Test_popupwin_buf_close()
2761 let buf = bufadd('Xtestbuf')
2762 call bufload(buf)
2763 call setbufline(buf, 1, ['just', 'some', 'lines'])
2764 let winid = popup_create(buf, {})
2765 redraw
2766 call assert_equal(3, popup_getpos(winid).height)
2767 let bufinfo = getbufinfo(buf)[0]
2768 call assert_equal(1, bufinfo.changed)
2769 call assert_equal(0, bufinfo.hidden)
2770 call assert_equal(0, bufinfo.listed)
2771 call assert_equal(1, bufinfo.loaded)
2772 call assert_equal([], bufinfo.windows)
2773 call assert_equal([winid], bufinfo.popups)
2774
2775 call popup_close(winid)
2776 call assert_equal({}, popup_getpos(winid))
2777 let bufinfo = getbufinfo(buf)[0]
2778 call assert_equal(1, bufinfo.changed)
2779 call assert_equal(1, bufinfo.hidden)
2780 call assert_equal(0, bufinfo.listed)
2781 call assert_equal(1, bufinfo.loaded)
2782 call assert_equal([], bufinfo.windows)
2783 call assert_equal([], bufinfo.popups)
2784 exe 'bwipe! ' .. buf
2785endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002786
2787func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002788 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002789
2790 let lines =<< trim END
2791 call setline(1, range(1, 10))
2792 hi ScrollThumb ctermbg=blue
2793 hi ScrollBar ctermbg=red
2794 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002795 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002796 \ maxwidth: 10,
2797 \ maxheight: 3,
2798 \ pos : 'topleft',
2799 \ col : a:col,
2800 \ line : a:line,
2801 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002802 \ })
2803 endfunc
2804 call PopupMenu(['x'], 1, 1)
2805 call PopupMenu(['123456789|'], 1, 16)
2806 call PopupMenu(['123456789|' .. ' '], 7, 1)
2807 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2808 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2809 END
2810 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002811 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002812 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2813
2814 " close the menu popupwin.
2815 call term_sendkeys(buf, " ")
2816 call term_sendkeys(buf, " ")
2817 call term_sendkeys(buf, " ")
2818 call term_sendkeys(buf, " ")
2819 call term_sendkeys(buf, " ")
2820
2821 " clean up
2822 call StopVimInTerminal(buf)
2823 call delete('XtestPopupMenuMaxWidth')
2824endfunc
2825
Bram Moolenaara901a372019-07-13 16:38:50 +02002826func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002827 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002828
2829 let lines =<< trim END
2830 call setline(1, range(1, 20))
2831 hi ScrollThumb ctermbg=blue
2832 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002833 eval ['one', 'two', 'three', 'four', 'five',
2834 \ 'six', 'seven', 'eight', 'nine']
2835 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002836 \ minwidth: 8,
2837 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002838 \ })
2839 END
2840 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002841 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002842
2843 call term_sendkeys(buf, "j")
2844 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2845
2846 call term_sendkeys(buf, "jjj")
2847 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2848
2849 " if the cursor is the bottom line, it stays at the bottom line.
2850 call term_sendkeys(buf, repeat("j", 20))
2851 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2852
2853 call term_sendkeys(buf, "kk")
2854 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2855
2856 call term_sendkeys(buf, "k")
2857 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2858
2859 " if the cursor is in the top line, it stays in the top line.
2860 call term_sendkeys(buf, repeat("k", 20))
2861 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2862
2863 " close the menu popupwin.
2864 call term_sendkeys(buf, " ")
2865
2866 " clean up
2867 call StopVimInTerminal(buf)
2868 call delete('XtestPopupMenuScroll')
2869endfunc
2870
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002871func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002872 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002873
2874 let lines =<< trim END
2875 function! MyFilter(winid, key) abort
2876 if a:key == "0"
2877 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2878 return 1
2879 endif
2880 if a:key == "G"
2881 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2882 return 1
2883 endif
2884 if a:key == "j"
2885 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2886 return 1
2887 endif
2888 if a:key == "k"
2889 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2890 return 1
2891 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002892 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002893 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002894 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002895 endif
2896 return 0
2897 endfunction
2898 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2899 \ maxheight : 3,
2900 \ filter : 'MyFilter'
2901 \ })
2902 END
2903 call writefile(lines, 'XtestPopupMenuFilter')
2904 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2905
2906 call term_sendkeys(buf, "j")
2907 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2908
2909 call term_sendkeys(buf, "k")
2910 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2911
2912 call term_sendkeys(buf, "G")
2913 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2914
2915 call term_sendkeys(buf, "0")
2916 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2917
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002918 " check that when the popup is closed in the filter the screen is redrawn
2919 call term_sendkeys(buf, ":")
2920 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2921 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002922
2923 " clean up
2924 call StopVimInTerminal(buf)
2925 call delete('XtestPopupMenuFilter')
2926endfunc
2927
2928func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002929 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002930
2931 let winid = popup_create('some text', {})
2932 call assert_equal(0, popup_getoptions(winid).cursorline)
2933 call popup_close(winid)
2934
2935 let winid = popup_create('some text', #{ cursorline: 1, })
2936 call assert_equal(1, popup_getoptions(winid).cursorline)
2937 call popup_close(winid)
2938
2939 let winid = popup_create('some text', #{ cursorline: 0, })
2940 call assert_equal(0, popup_getoptions(winid).cursorline)
2941 call popup_close(winid)
2942
2943 let winid = popup_menu('some text', {})
2944 call assert_equal(1, popup_getoptions(winid).cursorline)
2945 call popup_close(winid)
2946
2947 let winid = popup_menu('some text', #{ cursorline: 1, })
2948 call assert_equal(1, popup_getoptions(winid).cursorline)
2949 call popup_close(winid)
2950
2951 let winid = popup_menu('some text', #{ cursorline: 0, })
2952 call assert_equal(0, popup_getoptions(winid).cursorline)
2953 call popup_close(winid)
2954
2955 " ---------
2956 " Pattern 1
2957 " ---------
2958 let lines =<< trim END
2959 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
2960 END
2961 call writefile(lines, 'XtestPopupCursorLine')
2962 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2963 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
2964 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2965 call StopVimInTerminal(buf)
2966
2967 " ---------
2968 " Pattern 2
2969 " ---------
2970 let lines =<< trim END
2971 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
2972 END
2973 call writefile(lines, 'XtestPopupCursorLine')
2974 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2975 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
2976 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2977 call StopVimInTerminal(buf)
2978
2979 " ---------
2980 " Pattern 3
2981 " ---------
2982 let lines =<< trim END
2983 function! MyFilter(winid, key) abort
2984 if a:key == "j"
2985 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2986 return 1
2987 endif
2988 if a:key == 'x'
2989 call popup_close(a:winid)
2990 return 1
2991 endif
2992 return 0
2993 endfunction
2994 call popup_menu(['111', '222', '333'], #{
2995 \ cursorline : 0,
2996 \ maxheight : 2,
2997 \ filter : 'MyFilter',
2998 \ })
2999 END
3000 call writefile(lines, 'XtestPopupCursorLine')
3001 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3002 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3003 call term_sendkeys(buf, "j")
3004 call term_sendkeys(buf, "j")
3005 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3006 call term_sendkeys(buf, "x")
3007 call StopVimInTerminal(buf)
3008
3009 " ---------
3010 " Pattern 4
3011 " ---------
3012 let lines =<< trim END
3013 function! MyFilter(winid, key) abort
3014 if a:key == "j"
3015 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3016 return 1
3017 endif
3018 if a:key == 'x'
3019 call popup_close(a:winid)
3020 return 1
3021 endif
3022 return 0
3023 endfunction
3024 call popup_menu(['111', '222', '333'], #{
3025 \ cursorline : 1,
3026 \ maxheight : 2,
3027 \ filter : 'MyFilter',
3028 \ })
3029 END
3030 call writefile(lines, 'XtestPopupCursorLine')
3031 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3032 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3033 call term_sendkeys(buf, "j")
3034 call term_sendkeys(buf, "j")
3035 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3036 call term_sendkeys(buf, "x")
3037 call StopVimInTerminal(buf)
3038
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003039 " ---------
3040 " Cursor in second line when creating the popup
3041 " ---------
3042 let lines =<< trim END
3043 let winid = popup_create(['111', '222', '333'], #{
3044 \ cursorline : 1,
3045 \ })
3046 call win_execute(winid, "2")
3047 END
3048 call writefile(lines, 'XtestPopupCursorLine')
3049 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3050 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3051 call StopVimInTerminal(buf)
3052
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003053 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003054
3055 " ---------
3056 " Use current buffer for popupmenu
3057 " ---------
3058 let lines =<< trim END
3059 call setline(1, ['one', 'two', 'three'])
3060 let winid = popup_create(bufnr('%'), #{
3061 \ cursorline : 1,
3062 \ })
3063 call win_execute(winid, "2")
3064 END
3065 call writefile(lines, 'XtestPopupCursorLine')
3066 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3067 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3068 call StopVimInTerminal(buf)
3069
3070 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003071endfunc
3072
Bram Moolenaarf914a332019-07-20 15:09:56 +02003073func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003074 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003075 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003076
Bram Moolenaarf914a332019-07-20 15:09:56 +02003077 call writefile([
3078 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3079 \ "another\tXtagfile\t/^this is another",
3080 \ "theword\tXtagfile\t/^theword"],
3081 \ 'Xtags')
3082 call writefile(range(1,20)
3083 \ + ['theword is here']
3084 \ + range(22, 27)
3085 \ + ['this is another place']
3086 \ + range(29, 40),
3087 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003088 call writefile(range(1,10)
3089 \ + ['searched word is here']
3090 \ + range(12, 20),
3091 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003092 let lines =<< trim END
3093 set tags=Xtags
3094 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003095 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003096 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003097 \ 'three',
3098 \ 'four',
3099 \ 'five',
3100 \ 'six',
3101 \ 'seven',
3102 \ 'find theword somewhere',
3103 \ 'nine',
3104 \ 'this is another word',
3105 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003106 set previewpopup=height:4,width:40
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003107 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003108 END
3109 call writefile(lines, 'XtestPreviewPopup')
3110 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3111
3112 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3113 call term_sendkeys(buf, ":\<CR>")
3114 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3115
3116 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3117 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3118
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003119 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003120 call term_sendkeys(buf, ":\<CR>")
3121 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3122
3123 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3124 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3125
Bram Moolenaar799439a2020-02-11 21:44:17 +01003126 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003127 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003128 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003129
3130 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003131 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003132 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3133
3134 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3135 call term_sendkeys(buf, ":\<CR>")
3136 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3137
3138 call term_sendkeys(buf, ":pclose\<CR>")
3139 call term_sendkeys(buf, ":psearch searched\<CR>")
3140 call term_sendkeys(buf, ":\<CR>")
3141 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003142
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003143 call term_sendkeys(buf, "\<C-W>p")
3144 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3145
3146 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3147 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3148
Bram Moolenaarf914a332019-07-20 15:09:56 +02003149 call StopVimInTerminal(buf)
3150 call delete('Xtags')
3151 call delete('Xtagfile')
3152 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003153 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003154endfunc
3155
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003156func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003157 let lines =<< trim END
3158 set completeopt+=preview,popup
3159 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003160 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003161
3162 func CompleteFuncDict(findstart, base)
3163 if a:findstart
3164 if col('.') > 10
3165 return col('.') - 10
3166 endif
3167 return 0
3168 endif
3169
3170 return {
3171 \ 'words': [
3172 \ {
3173 \ 'word': 'aword',
3174 \ 'abbr': 'wrd',
3175 \ 'menu': 'extra text',
3176 \ 'info': 'words are cool',
3177 \ 'kind': 'W',
3178 \ 'user_data': 'test'
3179 \ },
3180 \ {
3181 \ 'word': 'anotherword',
3182 \ 'abbr': 'anotwrd',
3183 \ 'menu': 'extra text',
3184 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3185 \ 'kind': 'W',
3186 \ 'user_data': 'notest'
3187 \ },
3188 \ {
3189 \ 'word': 'noinfo',
3190 \ 'abbr': 'noawrd',
3191 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003192 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003193 \ 'kind': 'W',
3194 \ 'user_data': 'notest'
3195 \ },
3196 \ {
3197 \ 'word': 'thatword',
3198 \ 'abbr': 'thatwrd',
3199 \ 'menu': 'extra text',
3200 \ 'info': 'that word is cool',
3201 \ 'kind': 'W',
3202 \ 'user_data': 'notest'
3203 \ },
3204 \ ]
3205 \ }
3206 endfunc
3207 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003208 func ChangeColor()
3209 let id = popup_findinfo()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003210 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003211 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003212
3213 func InfoHidden()
3214 set completepopup=height:4,border:off,align:menu
3215 set completeopt-=popup completeopt+=popuphidden
3216 au CompleteChanged * call HandleChange()
3217 endfunc
3218
3219 let s:counter = 0
3220 func HandleChange()
3221 let s:counter += 1
3222 let selected = complete_info(['selected']).selected
3223 if selected <= 0
3224 " First time: do nothing, info remains hidden
3225 return
3226 endif
3227 if selected == 1
3228 " Second time: show info right away
3229 let id = popup_findinfo()
3230 if id
3231 call popup_settext(id, 'immediate info ' .. s:counter)
3232 call popup_show(id)
3233 endif
3234 else
3235 " Third time: show info after a short delay
3236 call timer_start(100, 'ShowInfo')
3237 endif
3238 endfunc
3239
3240 func ShowInfo(...)
3241 let id = popup_findinfo()
3242 if id
3243 call popup_settext(id, 'async info ' .. s:counter)
3244 call popup_show(id)
3245 endif
3246 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003247
3248 " Check that no autocommands are triggered for the info popup
3249 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3250 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003251 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003252 return lines
3253endfunc
3254
3255func Test_popupmenu_info_border()
3256 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003257 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003258
3259 let lines = Get_popupmenu_lines()
3260 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003261 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003262
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003263 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003264 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003265
3266 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3267 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3268
3269 call term_sendkeys(buf, "\<C-N>")
3270 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3271
3272 call term_sendkeys(buf, "\<C-N>")
3273 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3274
3275 call term_sendkeys(buf, "\<C-N>\<C-N>")
3276 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3277
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003278 " info on the left with scrollbar
3279 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3280 call term_sendkeys(buf, "\<C-N>\<C-N>")
3281 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3282
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003283 " Test that the popupmenu's scrollbar and infopopup do not overlap
3284 call term_sendkeys(buf, "\<Esc>")
3285 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3286 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3287 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3288
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003289 " Hide the info popup, cycle trough buffers, make sure it didn't get
3290 " deleted.
3291 call term_sendkeys(buf, "\<Esc>")
3292 call term_sendkeys(buf, ":set hidden\<CR>")
3293 call term_sendkeys(buf, ":bn\<CR>")
3294 call term_sendkeys(buf, ":bn\<CR>")
3295 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3296 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3297
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003298 " Test that when the option is changed the popup changes.
3299 call term_sendkeys(buf, "\<Esc>")
3300 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3301 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3302 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3303
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003304 call term_sendkeys(buf, " \<Esc>")
3305 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3306 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3307 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3308
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003309 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003310 call StopVimInTerminal(buf)
3311 call delete('XtestInfoPopup')
3312endfunc
3313
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003314func Test_popupmenu_info_noborder()
3315 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003316 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003317
3318 let lines = Get_popupmenu_lines()
3319 call add(lines, 'set completepopup=height:4,border:off')
3320 call writefile(lines, 'XtestInfoPopupNb')
3321
3322 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003323 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003324
3325 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3326 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3327
3328 call StopVimInTerminal(buf)
3329 call delete('XtestInfoPopupNb')
3330endfunc
3331
Bram Moolenaar258cef52019-08-21 17:29:29 +02003332func Test_popupmenu_info_align_menu()
3333 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003334 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003335
3336 let lines = Get_popupmenu_lines()
3337 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3338 call writefile(lines, 'XtestInfoPopupNb')
3339
3340 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003341 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003342
3343 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3344 call term_sendkeys(buf, "\<C-N>")
3345 call term_sendkeys(buf, "\<C-N>")
3346 call term_sendkeys(buf, "\<C-N>")
3347 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3348
3349 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3350 call term_sendkeys(buf, "\<C-N>")
3351 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3352
3353 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003354 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003355 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3356 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3357 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3358
3359 call StopVimInTerminal(buf)
3360 call delete('XtestInfoPopupNb')
3361endfunc
3362
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003363func Test_popupmenu_info_hidden()
3364 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003365 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003366
3367 let lines = Get_popupmenu_lines()
3368 call add(lines, 'call InfoHidden()')
3369 call writefile(lines, 'XtestInfoPopupHidden')
3370
3371 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003372 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003373
3374 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3375 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3376
3377 call term_sendkeys(buf, "\<C-N>")
3378 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3379
3380 call term_sendkeys(buf, "\<C-N>")
3381 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3382
3383 call term_sendkeys(buf, "\<Esc>")
3384 call StopVimInTerminal(buf)
3385 call delete('XtestInfoPopupHidden')
3386endfunc
3387
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003388func Test_popupmenu_info_too_wide()
3389 CheckScreendump
3390 CheckFeature quickfix
3391
3392 let lines =<< trim END
3393 call setline(1, range(10))
3394
3395 set completeopt+=preview,popup
3396 set completepopup=align:menu
3397 set omnifunc=OmniFunc
3398 hi InfoPopup ctermbg=lightgrey
3399
3400 func OmniFunc(findstart, base)
3401 if a:findstart
3402 return 0
3403 endif
3404
3405 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3406 return #{
3407 \ words: [
3408 \ #{
3409 \ word: 'scrap',
3410 \ menu: menuText,
3411 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3412 \ },
3413 \ #{
3414 \ word: 'scappier',
3415 \ menu: menuText,
3416 \ info: 'words are cool',
3417 \ },
3418 \ #{
3419 \ word: 'scrappier2',
3420 \ menu: menuText,
3421 \ info: 'words are cool',
3422 \ },
3423 \ ]
3424 \ }
3425 endfunc
3426 END
3427
3428 call writefile(lines, 'XtestInfoPopupWide')
3429 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003430 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003431
3432 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3433 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3434
3435 call term_sendkeys(buf, "\<Esc>")
3436 call StopVimInTerminal(buf)
3437 call delete('XtestInfoPopupWide')
3438endfunc
3439
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003440func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003441 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003442 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003443 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003444 call assert_equal(bufnr, winbufnr(winid))
3445 call popup_clear()
3446endfunc
3447
Bram Moolenaar1824f452019-10-02 23:06:46 +02003448func Test_popupwin_getoptions_tablocal()
3449 topleft split
3450 let win1 = popup_create('nothing', #{maxheight: 8})
3451 let win2 = popup_create('something', #{maxheight: 10})
3452 let win3 = popup_create('something', #{maxheight: 15})
3453 call assert_equal(8, popup_getoptions(win1).maxheight)
3454 call assert_equal(10, popup_getoptions(win2).maxheight)
3455 call assert_equal(15, popup_getoptions(win3).maxheight)
3456 call popup_clear()
3457 quit
3458endfunc
3459
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003460func Test_popupwin_cancel()
3461 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3462 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3463 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3464 call assert_equal(5, popup_getpos(win1).line)
3465 call assert_equal(10, popup_getpos(win2).line)
3466 call assert_equal(15, popup_getpos(win3).line)
3467 " TODO: this also works without patch 8.1.2110
3468 call feedkeys("\<C-C>", 'xt')
3469 call assert_equal(5, popup_getpos(win1).line)
3470 call assert_equal(10, popup_getpos(win2).line)
3471 call assert_equal({}, popup_getpos(win3))
3472 call feedkeys("\<C-C>", 'xt')
3473 call assert_equal(5, popup_getpos(win1).line)
3474 call assert_equal({}, popup_getpos(win2))
3475 call assert_equal({}, popup_getpos(win3))
3476 call feedkeys("\<C-C>", 'xt')
3477 call assert_equal({}, popup_getpos(win1))
3478 call assert_equal({}, popup_getpos(win2))
3479 call assert_equal({}, popup_getpos(win3))
3480endfunc
3481
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003482func Test_popupwin_filter_redraw()
3483 " Create two popups with a filter that closes the popup when typing "0".
3484 " Both popups should close, even though the redraw also calls
3485 " popup_reset_handled()
3486
3487 func CloseFilter(winid, key)
3488 if a:key == '0'
3489 call popup_close(a:winid)
3490 redraw
3491 endif
3492 return 0 " pass the key
3493 endfunc
3494
3495 let id1 = popup_create('first one', #{
3496 \ line: 1,
3497 \ col: 1,
3498 \ filter: 'CloseFilter',
3499 \ })
3500 let id2 = popup_create('second one', #{
3501 \ line: 9,
3502 \ col: 1,
3503 \ filter: 'CloseFilter',
3504 \ })
3505 call assert_equal(1, popup_getpos(id1).line)
3506 call assert_equal(9, popup_getpos(id2).line)
3507
3508 call feedkeys('0', 'xt')
3509 call assert_equal({}, popup_getpos(id1))
3510 call assert_equal({}, popup_getpos(id2))
3511
3512 call popup_clear()
3513 delfunc CloseFilter
3514endfunc
3515
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003516func Test_popupwin_double_width()
3517 CheckScreendump
3518
3519 let lines =<< trim END
3520 call setline(1, 'x你好世界你好世你好世界你好')
3521 call setline(2, '你好世界你好世你好世界你好')
3522 call setline(3, 'x你好世界你好世你好世界你好')
3523 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3524 END
3525 call writefile(lines, 'XtestPopupWide')
3526
3527 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3528 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3529
3530 call StopVimInTerminal(buf)
3531 call delete('XtestPopupWide')
3532endfunc
3533
3534func Test_popupwin_sign()
3535 CheckScreendump
3536
3537 let lines =<< trim END
3538 call setline(1, range(10))
3539 call sign_define('Current', {
3540 \ 'text': '>>',
3541 \ 'texthl': 'WarningMsg',
3542 \ 'linehl': 'Error',
3543 \ })
3544 call sign_define('Other', {
3545 \ 'text': '#!',
3546 \ 'texthl': 'Error',
3547 \ 'linehl': 'Search',
3548 \ })
3549 let winid = popup_create(['hello', 'bright', 'world'], {
3550 \ 'minwidth': 20,
3551 \ })
3552 call setwinvar(winid, "&signcolumn", "yes")
3553 let winbufnr = winbufnr(winid)
3554
3555 " add sign to current buffer, shows
3556 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3557 " add sign to current buffer, does not show
3558 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3559
3560 " add sign to popup buffer, shows
3561 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3562 " add sign to popup buffer, does not show
3563 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003564
3565 func SetOptions()
3566 call setwinvar(g:winid, '&number', 1)
3567 call setwinvar(g:winid, '&foldcolumn', 2)
3568 call popup_settext(g:winid, 'a longer line to check the width')
3569 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003570 END
3571 call writefile(lines, 'XtestPopupSign')
3572
3573 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3574 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3575
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003576 " set more options to check the width is adjusted
3577 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3578 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3579
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003580 call StopVimInTerminal(buf)
3581 call delete('XtestPopupSign')
3582endfunc
3583
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003584func Test_popupwin_bufnr()
3585 let popwin = popup_create(['blah'], #{})
3586 let popbuf = winbufnr(popwin)
3587 split asdfasdf
3588 let newbuf = bufnr()
3589 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3590 call assert_equal(newbuf, bufnr('$'))
3591 call popup_clear()
3592 let popwin = popup_create(['blah'], #{})
3593 " reuses previous buffer number
3594 call assert_equal(popbuf, winbufnr(popwin))
3595 call assert_equal(newbuf, bufnr('$'))
3596
3597 call popup_clear()
3598 bwipe!
3599endfunc
3600
Bram Moolenaarec084d32020-02-28 22:44:47 +01003601func Test_popupwin_filter_input_multibyte()
3602 func MyPopupFilter(winid, c)
3603 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3604 return 0
3605 endfunc
3606 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3607
3608 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3609 call feedkeys("\u3000", 'xt')
3610 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3611
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003612 " UTF-8: E3 80 9B, including CSI(0x9B)
3613 call feedkeys("\u301b", 'xt')
3614 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003615
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003616 if has('unix')
3617 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003618 if has('gui_running')
3619 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3620 else
3621 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3622 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003623 call assert_equal([0xc3, 0x81], g:bytes)
3624 endif
3625
Bram Moolenaarec084d32020-02-28 22:44:47 +01003626 call popup_clear()
3627 delfunc MyPopupFilter
3628 unlet g:bytes
3629endfunc
3630
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003631func Test_popupwin_filter_close_ctrl_c()
3632 CheckScreendump
3633
3634 let lines =<< trim END
3635 vsplit
3636 set laststatus=2
3637 set statusline=%!Statusline()
3638
3639 function Statusline() abort
3640 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3641 endfunction
3642
3643 call popup_create('test test test test...', {'filter': {-> 0}})
3644 END
3645 call writefile(lines, 'XtestPopupCtrlC')
3646
3647 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3648
3649 call term_sendkeys(buf, "\<C-C>")
3650 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3651
3652 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003653 call delete('XtestPopupCtrlC')
3654endfunc
3655
3656func Test_popupwin_filter_close_wrong_name()
3657 CheckScreendump
3658
3659 let lines =<< trim END
3660 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3661 END
3662 call writefile(lines, 'XtestPopupWrongName')
3663
3664 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3665
3666 call term_sendkeys(buf, "j")
3667 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3668
3669 call StopVimInTerminal(buf)
3670 call delete('XtestPopupWrongName')
3671endfunc
3672
3673func Test_popupwin_filter_close_three_errors()
3674 CheckScreendump
3675
3676 let lines =<< trim END
3677 set cmdheight=2
3678 call popup_create('one two three...', {'filter': 'filter'})
3679 END
3680 call writefile(lines, 'XtestPopupThreeErrors')
3681
3682 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3683
3684 call term_sendkeys(buf, "jj")
3685 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3686 call term_sendkeys(buf, "j")
3687 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3688
3689 call StopVimInTerminal(buf)
3690 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003691endfunc
3692
Bram Moolenaar927495b2020-11-06 17:58:35 +01003693func Test_popupwin_latin1_encoding()
3694 CheckScreendump
3695 CheckUnix
3696
3697 " When 'encoding' is a single-byte encoding a terminal window will mess up
3698 " the display. Check that showing a popup on top of that doesn't crash.
3699 let lines =<< trim END
3700 set encoding=latin1
3701 terminal cat Xmultibyte
3702 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
3703 END
3704 call writefile(lines, 'XtestPopupLatin')
3705 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte')
3706
3707 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
3708
3709 call term_sendkeys(buf, ":q\<CR>")
3710 call StopVimInTerminal(buf)
3711 call delete('XtestPopupLatin')
3712 call delete('Xmultibyte')
3713endfunc
3714
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003715func Test_popupwin_atcursor_far_right()
3716 new
3717
3718 " this was getting stuck
3719 set signcolumn=yes
3720 call setline(1, repeat('=', &columns))
3721 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003722 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003723
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003724 " 'signcolumn' was getting reset
3725 call setwinvar(winid, '&signcolumn', 'yes')
3726 call popup_setoptions(winid, {'zindex': 1000})
3727 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3728
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003729 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003730 bwipe!
3731 set signcolumn&
3732endfunc
3733
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003734func Test_popupwin_splitmove()
3735 vsplit
3736 let win2 = win_getid()
3737 let popup_winid = popup_dialog('hello', {})
3738 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3739 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3740
3741 call popup_clear()
3742 bwipe
3743endfunc
3744
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01003745func Test_popupwin_exiting_terminal()
3746 CheckFeature terminal
3747
3748 " Tests that when creating a popup right after closing a terminal window does
3749 " not make the popup the current window.
3750 let winid = win_getid()
3751 try
3752 augroup Test_popupwin_exiting_terminal
3753 autocmd!
3754 autocmd WinEnter * :call popup_create('test', {})
3755 augroup END
3756 let bnr = term_start(&shell, #{term_finish: 'close'})
3757 call term_sendkeys(bnr, "exit\r\n")
3758 call WaitForAssert({-> assert_equal(winid, win_getid())})
3759 finally
3760 call popup_clear(1)
3761 augroup Test_popupwin_exiting_terminal
3762 autocmd!
3763 augroup END
3764 endtry
3765endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003766
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003767" vim: shiftwidth=2 sts=2