blob: 84362a25a351f8946d837efe5754754c85503c5f [file] [log] [blame]
Bram Moolenaar4d784b22019-05-25 19:51:39 +02001" Tests for popup windows
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
Bram Moolenaar05ad5ff2019-11-30 22:48:27 +01004CheckFeature popupwin
Bram Moolenaar4d784b22019-05-25 19:51:39 +02005
6source screendump.vim
7
8func Test_simple_popup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02009 CheckScreendump
10
Bram Moolenaare7eb9272019-06-24 00:58:07 +020011 let lines =<< trim END
12 call setline(1, range(1, 100))
13 hi PopupColor1 ctermbg=lightblue
14 hi PopupColor2 ctermbg=lightcyan
Bram Moolenaar1666ac92019-11-10 17:22:31 +010015 hi EndOfBuffer ctermbg=lightgrey
Bram Moolenaare7eb9272019-06-24 00:58:07 +020016 hi Comment ctermfg=red
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020017 call prop_type_add('comment', #{highlight: 'Comment'})
18 let winid = popup_create('hello there', #{line: 3, col: 11, minwidth: 20, highlight: 'PopupColor1'})
19 let winid2 = popup_create(['another one', 'another two', 'another three'], #{line: 3, col: 25, minwidth: 20})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020020 call setwinvar(winid2, '&wincolor', 'PopupColor2')
21 END
22 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020023 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar4d784b22019-05-25 19:51:39 +020024 call VerifyScreenDump(buf, 'Test_popupwin_01', {})
25
Bram Moolenaarec583842019-05-26 14:11:23 +020026 " Add a tabpage
27 call term_sendkeys(buf, ":tabnew\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020028 call term_sendkeys(buf, ":let popupwin = popup_create(["
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020029 \ .. "#{text: 'other tab'},"
30 \ .. "#{text: 'a comment line', props: [#{"
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020031 \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
Bram Moolenaar7a8d0272019-05-26 23:32:06 +020032 \ .. "}]},"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020033 \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
Bram Moolenaarec583842019-05-26 14:11:23 +020034 call VerifyScreenDump(buf, 'Test_popupwin_02', {})
35
36 " switch back to first tabpage
37 call term_sendkeys(buf, "gt")
38 call VerifyScreenDump(buf, 'Test_popupwin_03', {})
39
40 " close that tabpage
41 call term_sendkeys(buf, ":quit!\<CR>")
42 call VerifyScreenDump(buf, 'Test_popupwin_04', {})
43
Bram Moolenaar202d9822019-06-11 21:56:30 +020044 " set 'columns' to a small value, size must be recomputed
45 call term_sendkeys(buf, ":let cols = &columns\<CR>")
46 call term_sendkeys(buf, ":set columns=12\<CR>")
47 call VerifyScreenDump(buf, 'Test_popupwin_04a', {})
48 call term_sendkeys(buf, ":let &columns = cols\<CR>")
49
Bram Moolenaar17146962019-05-30 00:12:11 +020050 " resize popup, show empty line at bottom
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020051 call term_sendkeys(buf, ":call popup_move(popupwin, #{minwidth: 15, maxwidth: 25, minheight: 3, maxheight: 5})\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020052 call term_sendkeys(buf, ":redraw\<CR>")
53 call VerifyScreenDump(buf, 'Test_popupwin_05', {})
54
Bram Moolenaar17146962019-05-30 00:12:11 +020055 " show not fitting line at bottom
56 call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\<CR>")
57 call term_sendkeys(buf, ":redraw\<CR>")
58 call VerifyScreenDump(buf, 'Test_popupwin_06', {})
59
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020060 " move popup over ruler
61 call term_sendkeys(buf, ":set cmdheight=2\<CR>")
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020062 call term_sendkeys(buf, ":call popup_move(popupwin, #{line: 7, col: 55})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +020063 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020064 call VerifyScreenDump(buf, 'Test_popupwin_07', {})
65
66 " clear all popups after moving the cursor a bit, so that ruler is updated
67 call term_sendkeys(buf, "axxx\<Esc>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020068 call TermWait(buf)
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020069 call term_sendkeys(buf, "0")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020070 call TermWait(buf)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +020071 call term_sendkeys(buf, ":call popup_clear()\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020072 call VerifyScreenDump(buf, 'Test_popupwin_08', {})
73
Bram Moolenaar4d784b22019-05-25 19:51:39 +020074 " clean up
75 call StopVimInTerminal(buf)
76 call delete('XtestPopup')
77endfunc
Bram Moolenaar51fe3b12019-05-26 20:10:06 +020078
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020079func Test_popup_with_border_and_padding()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +020080 CheckScreendump
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020081
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +020082 for iter in range(0, 1)
Bram Moolenaare7eb9272019-06-24 00:58:07 +020083 let lines =<< trim END
84 call setline(1, range(1, 100))
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020085 call popup_create('hello border', #{line: 2, col: 3, border: []})
86 call popup_create('hello padding', #{line: 2, col: 23, padding: []})
Bram Moolenaarc363fe12019-08-04 18:13:46 +020087 call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020088 call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
Bram Moolenaarb0992022020-01-30 14:55:42 +010089 call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020090 call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
91 call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
Bram Moolenaarfbcdf672020-01-06 23:07:48 +010092 call popup_create('X', #{line: 2, col: 73})
93 call popup_create('X', #{line: 3, col: 74})
94 call popup_create('X', #{line: 4, col: 75})
95 call popup_create('X', #{line: 5, col: 76})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020096 END
97 call insert(lines, iter == 1 ? '' : 'set enc=latin1')
98 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020099 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 15})
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +0200100 call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
101
102 call StopVimInTerminal(buf)
103 call delete('XtestPopupBorder')
104 endfor
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200105
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200106 let lines =<< trim END
107 call setline(1, range(1, 100))
108 hi BlueColor ctermbg=lightblue
109 hi TopColor ctermbg=253
110 hi RightColor ctermbg=245
111 hi BottomColor ctermbg=240
112 hi LeftColor ctermbg=248
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200113 call popup_create('hello border', #{line: 2, col: 3, border: [], borderhighlight: ['BlueColor']})
114 call popup_create(['hello border', 'and more'], #{line: 2, col: 23, border: [], borderhighlight: ['TopColor', 'RightColor', 'BottomColor', 'LeftColor']})
115 call popup_create(['hello border', 'lines only'], #{line: 2, col: 43, border: [], borderhighlight: ['BlueColor'], borderchars: ['x']})
116 call popup_create(['hello border', 'with corners'], #{line: 2, col: 60, border: [], borderhighlight: ['BlueColor'], borderchars: ['x', '#']})
117 let winid = popup_create(['hello border', 'with numbers'], #{line: 6, col: 3, border: [], borderhighlight: ['BlueColor'], borderchars: ['0', '1', '2', '3', '4', '5', '6', '7']})
118 call popup_create(['hello border', 'just blanks'], #{line: 7, col: 23, border: [], borderhighlight: ['BlueColor'], borderchars: [' ']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200119 func MultiByte()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200120 call popup_create(['hello'], #{line: 8, col: 43, border: [], borderchars: ['─', '│', '─', '│', '┌', '┐', '┘', '└']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200121 endfunc
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200122 END
123 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200124 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 12})
Bram Moolenaar790498b2019-06-01 22:15:29 +0200125 call VerifyScreenDump(buf, 'Test_popupwin_22', {})
126
Bram Moolenaarad24a712019-06-17 20:05:45 +0200127 " check that changing borderchars triggers a redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200128 call term_sendkeys(buf, ":call popup_setoptions(winid, #{borderchars: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']})\<CR>")
Bram Moolenaarad24a712019-06-17 20:05:45 +0200129 call VerifyScreenDump(buf, 'Test_popupwin_23', {})
130
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200131 " check multi-byte border only with 'ambiwidth' single
132 if &ambiwidth == 'single'
133 call term_sendkeys(buf, ":call MultiByte()\<CR>")
134 call VerifyScreenDump(buf, 'Test_popupwin_24', {})
135 endif
136
Bram Moolenaar790498b2019-06-01 22:15:29 +0200137 call StopVimInTerminal(buf)
138 call delete('XtestPopupBorder')
139
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200140 let with_border_or_padding = #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200141 \ line: 2,
142 \ core_line: 3,
143 \ col: 3,
144 \ core_col: 4,
145 \ width: 14,
146 \ core_width: 12,
147 \ height: 3,
148 \ core_height: 1,
149 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100150 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200151 \ scrollbar: 0,
152 \ visible: 1}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200153 let winid = popup_create('hello border', #{line: 2, col: 3, border: []})",
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200154 call assert_equal(with_border_or_padding, winid->popup_getpos())
Bram Moolenaarae943152019-06-16 22:54:14 +0200155 let options = popup_getoptions(winid)
156 call assert_equal([], options.border)
157 call assert_false(has_key(options, "padding"))
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200158
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200159 let winid = popup_create('hello padding', #{line: 2, col: 3, padding: []})
Bram Moolenaarae943152019-06-16 22:54:14 +0200160 let with_border_or_padding.width = 15
161 let with_border_or_padding.core_width = 13
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200162 call assert_equal(with_border_or_padding, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200163 let options = popup_getoptions(winid)
164 call assert_false(has_key(options, "border"))
165 call assert_equal([], options.padding)
166
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200167 call popup_setoptions(winid, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200168 \ padding: [1, 2, 3, 4],
169 \ border: [4, 0, 7, 8],
170 \ borderhighlight: ['Top', 'Right', 'Bottom', 'Left'],
171 \ borderchars: ['1', '^', '2', '>', '3', 'v', '4', '<'],
Bram Moolenaarae943152019-06-16 22:54:14 +0200172 \ })
173 let options = popup_getoptions(winid)
174 call assert_equal([1, 0, 1, 1], options.border)
175 call assert_equal([1, 2, 3, 4], options.padding)
176 call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
177 call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200178
Bram Moolenaara1396152019-10-20 18:46:05 +0200179 " Check that popup_setoptions() takes the output of popup_getoptions()
180 call popup_setoptions(winid, options)
181 call assert_equal(options, popup_getoptions(winid))
182
Bram Moolenaarb0992022020-01-30 14:55:42 +0100183 " Check that range() doesn't crash
184 call popup_setoptions(winid, #{
185 \ padding: range(1, 4),
186 \ border: range(5, 8),
187 \ borderhighlight: range(4),
188 \ borderchars: range(8),
189 \ })
190
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200191 let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
192 call assert_equal(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200193 \ line: 3,
194 \ core_line: 5,
195 \ col: 8,
196 \ core_col: 10,
197 \ width: 14,
198 \ core_width: 10,
199 \ height: 5,
200 \ scrollbar: 0,
201 \ core_height: 1,
202 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100203 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200204 \ visible: 1}, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200205
206 call popup_clear()
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200207endfunc
208
Bram Moolenaarb4230122019-05-30 18:40:53 +0200209func Test_popup_with_syntax_win_execute()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200210 CheckScreendump
211
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200212 let lines =<< trim END
213 call setline(1, range(1, 100))
214 hi PopupColor ctermbg=lightblue
215 let winid = popup_create([
216 \ '#include <stdio.h>',
217 \ 'int main(void)',
218 \ '{',
219 \ ' printf(123);',
220 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200221 \], #{line: 3, col: 25, highlight: 'PopupColor'})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200222 call win_execute(winid, 'set syntax=cpp')
223 END
224 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200225 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200226 call VerifyScreenDump(buf, 'Test_popupwin_10', {})
227
228 " clean up
229 call StopVimInTerminal(buf)
230 call delete('XtestPopup')
231endfunc
232
233func Test_popup_with_syntax_setbufvar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200234 CheckScreendump
235
Bram Moolenaar402502d2019-05-30 22:07:36 +0200236 let lines =<< trim END
237 call setline(1, range(1, 100))
238 hi PopupColor ctermbg=lightgrey
239 let winid = popup_create([
240 \ '#include <stdio.h>',
241 \ 'int main(void)',
242 \ '{',
Bram Moolenaare089c3f2019-07-09 20:25:25 +0200243 \ "\tprintf(567);",
Bram Moolenaar402502d2019-05-30 22:07:36 +0200244 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200245 \], #{line: 3, col: 21, highlight: 'PopupColor'})
Bram Moolenaar402502d2019-05-30 22:07:36 +0200246 call setbufvar(winbufnr(winid), '&syntax', 'cpp')
247 END
248 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200249 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200250 call VerifyScreenDump(buf, 'Test_popupwin_11', {})
251
252 " clean up
253 call StopVimInTerminal(buf)
254 call delete('XtestPopup')
255endfunc
256
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200257func Test_popup_with_matches()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200258 CheckScreendump
259
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200260 let lines =<< trim END
261 call setline(1, ['111 222 333', '444 555 666'])
262 let winid = popup_create([
263 \ '111 222 333',
264 \ '444 555 666',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200265 \], #{line: 3, col: 10, border: []})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200266 set hlsearch
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100267 hi VeryBlue ctermfg=blue guifg=blue
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200268 /666
269 call matchadd('ErrorMsg', '111')
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100270 call matchadd('VeryBlue', '444')
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200271 call win_execute(winid, "call matchadd('ErrorMsg', '111')")
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100272 call win_execute(winid, "call matchadd('VeryBlue', '555')")
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200273 END
274 call writefile(lines, 'XtestPopupMatches')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200275 let buf = RunVimInTerminal('-S XtestPopupMatches', #{rows: 10})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200276 call VerifyScreenDump(buf, 'Test_popupwin_matches', {})
277
278 " clean up
279 call StopVimInTerminal(buf)
280 call delete('XtestPopupMatches')
281endfunc
282
Bram Moolenaar399d8982019-06-02 15:34:29 +0200283func Test_popup_all_corners()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200284 CheckScreendump
285
Bram Moolenaar399d8982019-06-02 15:34:29 +0200286 let lines =<< trim END
287 call setline(1, repeat([repeat('-', 60)], 15))
288 set so=0
289 normal 2G3|r#
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200290 let winid1 = popup_create(['first', 'second'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200291 \ line: 'cursor+1',
292 \ col: 'cursor',
293 \ pos: 'topleft',
294 \ border: [],
295 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200296 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200297 normal 24|r@
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200298 let winid1 = popup_create(['First', 'SeconD'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200299 \ line: 'cursor+1',
300 \ col: 'cursor',
301 \ pos: 'topright',
302 \ border: [],
303 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200304 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200305 normal 9G27|r%
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200306 let winid1 = popup_create(['fiRSt', 'seCOnd'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200307 \ line: 'cursor-1',
308 \ col: 'cursor',
309 \ pos: 'botleft',
310 \ border: [],
311 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200312 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200313 normal 48|r&
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200314 let winid1 = popup_create(['FIrsT', 'SEcoND'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200315 \ line: 'cursor-1',
316 \ col: 'cursor',
317 \ pos: 'botright',
318 \ border: [],
319 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200320 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200321 normal 1G51|r*
322 let winid1 = popup_create(['one', 'two'], #{
323 \ line: 'cursor-1',
324 \ col: 'cursor',
325 \ pos: 'botleft',
326 \ border: [],
327 \ padding: [],
328 \ })
Bram Moolenaar399d8982019-06-02 15:34:29 +0200329 END
330 call writefile(lines, 'XtestPopupCorners')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200331 let buf = RunVimInTerminal('-S XtestPopupCorners', #{rows: 12})
Bram Moolenaar399d8982019-06-02 15:34:29 +0200332 call VerifyScreenDump(buf, 'Test_popupwin_corners', {})
333
334 " clean up
335 call StopVimInTerminal(buf)
336 call delete('XtestPopupCorners')
337endfunc
338
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100339func Test_popup_nospace()
340 CheckScreendump
341
342 let lines =<< trim END
343 call setline(1, repeat([repeat('-', 60)], 15))
344 set so=0
345
346 " cursor in a line in top half, using "botleft" with popup that
347 " does fit
348 normal 5G2|r@
349 let winid1 = popup_create(['one', 'two'], #{
350 \ line: 'cursor-1',
351 \ col: 'cursor',
352 \ pos: 'botleft',
353 \ border: [],
354 \ })
355 " cursor in a line in top half, using "botleft" with popup that
356 " doesn't fit: gets truncated
357 normal 5G9|r#
358 let winid1 = popup_create(['one', 'two', 'tee'], #{
359 \ line: 'cursor-1',
360 \ col: 'cursor',
361 \ pos: 'botleft',
362 \ posinvert: 0,
363 \ border: [],
364 \ })
365 " cursor in a line in top half, using "botleft" with popup that
366 " doesn't fit and 'posinvert' set: flips to below.
367 normal 5G16|r%
368 let winid1 = popup_create(['one', 'two', 'tee'], #{
369 \ line: 'cursor-1',
370 \ col: 'cursor',
371 \ pos: 'botleft',
372 \ border: [],
373 \ })
374 " cursor in a line in bottom half, using "botleft" with popup that
375 " doesn't fit: does not flip.
376 normal 8G23|r*
377 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
378 \ line: 'cursor-1',
379 \ col: 'cursor',
380 \ pos: 'botleft',
381 \ border: [],
382 \ })
383
384 " cursor in a line in bottom half, using "topleft" with popup that
385 " does fit
386 normal 8G30|r@
387 let winid1 = popup_create(['one', 'two'], #{
388 \ line: 'cursor+1',
389 \ col: 'cursor',
390 \ pos: 'topleft',
391 \ border: [],
392 \ })
393 " cursor in a line in top half, using "topleft" with popup that
394 " doesn't fit: truncated
395 normal 8G37|r#
396 let winid1 = popup_create(['one', 'two', 'tee'], #{
397 \ line: 'cursor+1',
398 \ col: 'cursor',
399 \ pos: 'topleft',
400 \ posinvert: 0,
401 \ border: [],
402 \ })
403 " cursor in a line in top half, using "topleft" with popup that
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100404 " doesn't fit and "posinvert" set: flips to above.
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100405 normal 8G44|r%
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100406 let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100407 \ line: 'cursor+1',
408 \ col: 'cursor',
409 \ pos: 'topleft',
410 \ border: [],
411 \ })
412 " cursor in a line in top half, using "topleft" with popup that
413 " doesn't fit: does not flip.
414 normal 5G51|r*
415 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
416 \ line: 'cursor+1',
417 \ col: 'cursor',
418 \ pos: 'topleft',
419 \ border: [],
420 \ })
421 END
422 call writefile(lines, 'XtestPopupNospace')
423 let buf = RunVimInTerminal('-S XtestPopupNospace', #{rows: 12})
424 call VerifyScreenDump(buf, 'Test_popupwin_nospace', {})
425
426 " clean up
427 call StopVimInTerminal(buf)
428 call delete('XtestPopupNospace')
429endfunc
430
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200431func Test_popup_firstline_dump()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200432 CheckScreendump
433
Bram Moolenaar8d241042019-06-12 23:40:01 +0200434 let lines =<< trim END
435 call setline(1, range(1, 20))
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200436 let winid = popup_create(['1111', '222222', '33333', '44', '5', '666666', '77777', '888', '9999999999999999'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200437 \ maxheight: 4,
438 \ firstline: 3,
Bram Moolenaar8d241042019-06-12 23:40:01 +0200439 \ })
440 END
441 call writefile(lines, 'XtestPopupFirstline')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200442 let buf = RunVimInTerminal('-S XtestPopupFirstline', #{rows: 10})
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200443 call VerifyScreenDump(buf, 'Test_popupwin_firstline_1', {})
444
445 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: -1})\<CR>")
446 call term_sendkeys(buf, ":\<CR>")
447 call VerifyScreenDump(buf, 'Test_popupwin_firstline_2', {})
Bram Moolenaar8d241042019-06-12 23:40:01 +0200448
449 " clean up
450 call StopVimInTerminal(buf)
451 call delete('XtestPopupFirstline')
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200452endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +0200453
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200454func Test_popup_firstline()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200455 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200456 \ maxheight: 2,
457 \ firstline: 3,
Bram Moolenaarae943152019-06-16 22:54:14 +0200458 \ })
459 call assert_equal(3, popup_getoptions(winid).firstline)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200460 call popup_setoptions(winid, #{firstline: 1})
Bram Moolenaarae943152019-06-16 22:54:14 +0200461 call assert_equal(1, popup_getoptions(winid).firstline)
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200462 eval winid->popup_close()
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200463
464 let winid = popup_create(['xxx']->repeat(50), #{
465 \ maxheight: 3,
466 \ firstline: 11,
467 \ })
468 redraw
469 call assert_equal(11, popup_getoptions(winid).firstline)
470 call assert_equal(11, popup_getpos(winid).firstline)
Bram Moolenaar8e0a8e72019-09-02 22:56:24 +0200471 " check line() works with popup window
472 call assert_equal(11, line('.', winid))
473 call assert_equal(50, line('$', winid))
474 call assert_equal(0, line('$', 123456))
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200475
476 " Normal command changes what is displayed but not "firstline"
477 call win_execute(winid, "normal! \<c-y>")
478 call assert_equal(11, popup_getoptions(winid).firstline)
479 call assert_equal(10, popup_getpos(winid).firstline)
480
481 " Making some property change applies "firstline" again
482 call popup_setoptions(winid, #{line: 4})
483 call assert_equal(11, popup_getoptions(winid).firstline)
484 call assert_equal(11, popup_getpos(winid).firstline)
485
486 " Remove "firstline" property and scroll
487 call popup_setoptions(winid, #{firstline: 0})
488 call win_execute(winid, "normal! \<c-y>")
489 call assert_equal(0, popup_getoptions(winid).firstline)
490 call assert_equal(10, popup_getpos(winid).firstline)
491
492 " Making some property change has no side effect
493 call popup_setoptions(winid, #{line: 3})
494 call assert_equal(0, popup_getoptions(winid).firstline)
495 call assert_equal(10, popup_getpos(winid).firstline)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200496 call popup_close(winid)
Bram Moolenaarae943152019-06-16 22:54:14 +0200497
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100498 " CTRL-D scrolls down half a page
499 let winid = popup_create(['xxx']->repeat(50), #{
500 \ maxheight: 8,
501 \ })
502 redraw
503 call assert_equal(1, popup_getpos(winid).firstline)
504 call win_execute(winid, "normal! \<C-D>")
505 call assert_equal(5, popup_getpos(winid).firstline)
506 call win_execute(winid, "normal! \<C-D>")
507 call assert_equal(9, popup_getpos(winid).firstline)
508 call win_execute(winid, "normal! \<C-U>")
509 call assert_equal(5, popup_getpos(winid).firstline)
510
511 call win_execute(winid, "normal! \<C-F>")
512 call assert_equal(11, popup_getpos(winid).firstline)
513 call win_execute(winid, "normal! \<C-B>")
514 call assert_equal(5, popup_getpos(winid).firstline)
515
Bram Moolenaarae943152019-06-16 22:54:14 +0200516 call popup_close(winid)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200517endfunc
518
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200519func Test_popup_firstline_cursorline()
520 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
521 \ maxheight: 2,
522 \ firstline: 3,
523 \ cursorline: 1,
524 \ })
525 call assert_equal(3, popup_getoptions(winid).firstline)
526 call assert_equal(3, getwininfo(winid)[0].topline)
527 call assert_equal(3, getcurpos(winid)[1])
528
529 call popup_close(winid)
530endfunc
531
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200532func Test_popup_noscrolloff()
533 set scrolloff=5
534 let winid = popup_create(['xxx']->repeat(50), #{
535 \ maxheight: 5,
536 \ firstline: 11,
537 \ })
538 redraw
539 call assert_equal(11, popup_getoptions(winid).firstline)
540 call assert_equal(11, popup_getpos(winid).firstline)
541
542 call popup_setoptions(winid, #{firstline: 0})
543 call win_execute(winid, "normal! \<c-y>")
544 call assert_equal(0, popup_getoptions(winid).firstline)
545 call assert_equal(10, popup_getpos(winid).firstline)
546
547 call popup_close(winid)
548endfunc
549
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200550func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200551 CheckScreendump
552
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200553 " create a popup that covers the command line
554 let lines =<< trim END
555 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200556 split
557 vsplit
558 $wincmd w
559 vsplit
560 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200561 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200562 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200563 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200564 \ border: [],
565 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200566 \ })
567 func Dragit()
568 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
569 endfunc
570 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
Bram Moolenaar356375f2019-08-24 14:46:29 +0200571 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200572 func Resize()
573 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
574 endfunc
Bram Moolenaar356375f2019-08-24 14:46:29 +0200575 map <silent> <F5> :call test_setmouse(6, 21)<CR>
576 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200577 END
578 call writefile(lines, 'XtestPopupDrag')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200579 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200580 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
581
582 call term_sendkeys(buf, ":call Dragit()\<CR>")
583 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
584
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200585 call term_sendkeys(buf, ":call Resize()\<CR>")
586 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
587
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200588 " clean up
589 call StopVimInTerminal(buf)
590 call delete('XtestPopupDrag')
591endfunc
592
Bram Moolenaar35910f22020-07-12 19:24:10 +0200593func Test_popup_drag_termwin()
594 CheckUnix
595 CheckScreendump
596 CheckFeature terminal
597
598 " create a popup that covers the terminal window
599 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200600 set foldmethod=marker
601 call setline(1, range(100))
602 for nr in range(7)
603 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200604 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200605 endfor
606 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200607 set shell=/bin/sh noruler
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200608 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200609 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200610 $wincmd w
611 let winid = popup_create(['1111', '2222'], #{
612 \ drag: 1,
613 \ resize: 1,
614 \ border: [],
615 \ line: 3,
616 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200617 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200618 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
619 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200620 func DragitDown()
621 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
622 endfunc
623 func DragitDownLeft()
624 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
625 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200626 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
627 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200628 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
629 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200630 END
631 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200632 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200633 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
634
Bram Moolenaar452143c2020-07-15 17:38:21 +0200635 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200636 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
637
Bram Moolenaar452143c2020-07-15 17:38:21 +0200638 call term_sendkeys(buf, ":call DragitDown()\<CR>")
639 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
640
641 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
642 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
643
Bram Moolenaar35910f22020-07-12 19:24:10 +0200644 " clean up
645 call StopVimInTerminal(buf)
646 call delete('XtestPopupTerm')
647endfunc
648
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200649func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200650 CheckScreendump
651
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200652 let lines =<< trim END
653 call setline(1, range(1, 20))
654 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200655 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200656 \ close: 'button',
657 \ border: [],
658 \ line: 1,
659 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200660 \ })
661 func CloseMsg(id, result)
662 echomsg 'Popup closed with ' .. a:result
663 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200664 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200665 \ close: 'click',
666 \ line: 3,
667 \ col: 15,
668 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200669 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200670 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200671 \ close: 'button',
672 \ line: 5,
673 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200674 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200675 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200676 \ close: 'button',
677 \ padding: [],
678 \ line: 5,
679 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200680 \ })
681 func CloseWithX()
682 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
683 endfunc
684 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
685 func CloseWithClick()
686 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
687 endfunc
688 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200689 func CreateWithMenuFilter()
690 let winid = popup_create('barfoo', #{
691 \ close: 'button',
692 \ filter: 'popup_filter_menu',
693 \ border: [],
694 \ line: 1,
695 \ col: 40,
696 \ })
697 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200698 END
699 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200700 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200701 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
702
703 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
704 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
705
706 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
707 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
708
Bram Moolenaarf6396232019-08-24 19:36:00 +0200709 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
710 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
711
712 " We have to send the actual mouse code, feedkeys() would be caught the
713 " filter.
714 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
715 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
716
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200717 " clean up
718 call StopVimInTerminal(buf)
719 call delete('XtestPopupClose')
720endfunction
721
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200722func Test_popup_menu_wrap()
723 CheckScreendump
724
725 let lines =<< trim END
726 call setline(1, range(1, 20))
727 call popup_create([
728 \ 'one',
729 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
730 \ 'three',
731 \ 'four',
732 \ ], #{
733 \ pos: "botleft",
734 \ border: [],
735 \ padding: [0,1,0,1],
736 \ maxheight: 3,
737 \ cursorline: 1,
738 \ filter: 'popup_filter_menu',
739 \ })
740 END
741 call writefile(lines, 'XtestPopupWrap')
742 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
743 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
744
745 call term_sendkeys(buf, "jj")
746 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
747
748 " clean up
749 call term_sendkeys(buf, "\<Esc>")
750 call StopVimInTerminal(buf)
751 call delete('XtestPopupWrap')
752endfunction
753
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200754func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200755 CheckScreendump
756
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200757 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200758 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200759 hi PopupColor ctermbg=lightgrey
760 let winid = popup_create([
761 \ 'some text',
762 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200763 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200764 \ line: 1,
765 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100766 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200767 \ wrap: 0,
768 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200769 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200770 \ zindex: 90,
771 \ padding: [],
772 \ highlight: 'PopupColor',
773 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200774 call popup_create([
775 \ 'xxxxxxxxx',
776 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200777 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200778 \ line: 3,
779 \ col: 18,
780 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200781 let winidb = popup_create([
782 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200783 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200784 \ line: 7,
785 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100786 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200787 \ wrap: 0,
788 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200789 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200790 \ close: 'button',
791 \ zindex: 90,
792 \ padding: [],
793 \ border: [],
794 \ mask: [[1,2,1,1], [-5,-1,4,4], [7,9,2,3], [3,5,5,5],[-7,-4,5,5]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200795 END
796 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200797 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200798 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
799
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200800 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
801 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200802 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200803 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
804
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200805 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
806 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200807 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200808 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
809
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200810 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
811 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200812 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200813 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
814
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200815 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
816 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200817 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200818 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
819
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200820 " clean up
821 call StopVimInTerminal(buf)
822 call delete('XtestPopupMask')
823endfunc
824
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200825func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200826 CheckScreendump
827 CheckFeature clipboard_working
828
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200829 " create a popup with some text to be selected
830 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200831 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200832 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200833 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200834 \ drag: 1,
835 \ border: [],
836 \ line: 3,
837 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200838 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200839 \ })
840 func Select1()
841 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
842 endfunc
843 map <silent> <F3> :call test_setmouse(4, 15)<CR>
844 map <silent> <F4> :call test_setmouse(6, 23)<CR>
845 END
846 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200847 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200848 call term_sendkeys(buf, ":call Select1()\<CR>")
849 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
850
851 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
852 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200853 " clean the command line, sometimes it still shows a command
854 call term_sendkeys(buf, ":\<esc>")
855
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200856 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
857
858 " clean up
859 call StopVimInTerminal(buf)
860 call delete('XtestPopupSelect')
861endfunc
862
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200863func Test_popup_in_tab()
864 " default popup is local to tab, not visible when in other tab
865 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200866 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200867 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200868 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200869 tabnew
870 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200871 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200872 quit
873 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200874
875 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200876 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200877 " buffer is gone now
878 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200879
880 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200881 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200882 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200883 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200884 tabnew
885 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200886 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200887 quit
888 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200889 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200890
891 " create popup in other tab
892 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200893 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200894 call assert_equal(0, popup_getpos(winid).visible)
895 call assert_equal(1, popup_getoptions(winid).tabpage)
896 quit
897 call assert_equal(1, popup_getpos(winid).visible)
898 call assert_equal(0, popup_getoptions(winid).tabpage)
899 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200900endfunc
901
902func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200903 call assert_equal(0, len(popup_list()))
904
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200905 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200906 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200907 let pos = popup_getpos(winid)
908 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200909 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200910 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200911
912 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200913 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200914 let pos = popup_getpos(winid)
915 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200916 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200917
918 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200919 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200920 let pos = popup_getpos(winid)
921 let around = (&columns - pos.width) / 2
922 call assert_inrange(around - 1, around + 1, pos.col)
923 let around = (&lines - pos.height) / 2
924 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200925 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200926endfunc
927
928func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +0200929 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200930 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200931 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200932 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200933 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
934 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
935 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200936
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200937 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200938 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200939 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200940 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200941 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200942 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200943 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200944 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200945
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200946 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200947 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200948 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200949 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200950 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200951 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200952 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200953 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200954
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200955 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200956 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200957 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200958 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200959 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200960 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200961 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200962 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +0200963 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
964 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200965 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200966 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200967
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200968 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200969 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200970 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200971 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200972 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200973 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100974 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
975 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200976 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
977 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100978 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
979 call popup_clear()
980 call popup_create("text", #{mask: [range(4)]})
981 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200982 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +0200983 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200984 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200985 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
986 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200987endfunc
988
Bram Moolenaareea16992019-05-31 17:34:48 +0200989func Test_win_execute_closing_curwin()
990 split
991 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200992 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200993 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +0100994
995 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200996 call assert_fails('call win_execute(winid, printf("normal! :\<C-u>call popup_close(%d)\<CR>", winid))', 'E994:')
Bram Moolenaar49540192019-12-11 19:34:54 +0100997 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +0200998endfunc
999
1000func Test_win_execute_not_allowed()
1001 let winid = popup_create('some text', {})
1002 call assert_fails('call win_execute(winid, "split")', 'E994:')
1003 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1004 call assert_fails('call win_execute(winid, "close")', 'E994:')
1005 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001006 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001007 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1008 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1009 call assert_fails('call win_execute(winid, "next")', 'E994:')
1010 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001011 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001012 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001013 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1014 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1015 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1016 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001017 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1018 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001019 call assert_fails('call win_execute(winid, "help")', 'E994:')
1020 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001021 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1022 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1023 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1024 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001025 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001026endfunc
1027
Bram Moolenaar402502d2019-05-30 22:07:36 +02001028func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001029 CheckScreendump
1030
Bram Moolenaar402502d2019-05-30 22:07:36 +02001031 let lines =<< trim END
1032 call setline(1, range(1, 100))
1033 let winid = popup_create(
1034 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001035 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001036 END
1037 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001038 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001039 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1040
1041 " clean up
1042 call StopVimInTerminal(buf)
1043 call delete('XtestPopup')
1044endfunc
1045
1046func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001047 CheckScreendump
1048
Bram Moolenaar402502d2019-05-30 22:07:36 +02001049 let lines =<< trim END
1050 call setline(1, range(1, 100))
1051 let winid = popup_create(
1052 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001053 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001054 END
1055 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001056 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001057 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1058
1059 " clean up
1060 call StopVimInTerminal(buf)
1061 call delete('XtestPopup')
1062endfunc
1063
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001064func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001065 CheckScreendump
1066
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001067 let lines =<< trim END
1068 set showbreak=>>\
1069 call setline(1, range(1, 20))
1070 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001071 \ 'a long line here that wraps',
1072 \ #{filter: 'popup_filter_yesno',
1073 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001074 END
1075 call writefile(lines, 'XtestPopupShowbreak')
1076 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1077 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1078
1079 " clean up
1080 call term_sendkeys(buf, "y")
1081 call StopVimInTerminal(buf)
1082 call delete('XtestPopupShowbreak')
1083endfunc
1084
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001085func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001086 CheckFeature timers
1087
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001088 topleft vnew
1089 call setline(1, 'hello')
1090
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001091 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001092 \ line: 1,
1093 \ col: 1,
1094 \ minwidth: 20,
1095 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001096 \})
1097 redraw
1098 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1099 call assert_equal('world', line)
1100
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001101 call assert_equal(winid, popup_locate(1, 1))
1102 call assert_equal(winid, popup_locate(1, 20))
1103 call assert_equal(0, popup_locate(1, 21))
1104 call assert_equal(0, popup_locate(2, 1))
1105
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001106 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001107 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001108 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001109 call assert_equal('hello', line)
1110
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001111 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001112 \ line: &lines,
1113 \ col: 10,
1114 \ minwidth: 20,
1115 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001116 \})
1117 redraw
1118 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1119 call assert_match('.*on the command line.*', line)
1120
1121 sleep 700m
1122 redraw
1123 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1124 call assert_notmatch('.*on the command line.*', line)
1125
1126 bwipe!
1127endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001128
1129func Test_popup_hide()
1130 topleft vnew
1131 call setline(1, 'hello')
1132
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001133 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001134 \ line: 1,
1135 \ col: 1,
1136 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001137 \})
1138 redraw
1139 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1140 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001141 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001142 " buffer is still listed and active
1143 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001144
1145 call popup_hide(winid)
1146 redraw
1147 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1148 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001149 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001150 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001151 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001152
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001153 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001154 redraw
1155 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1156 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001157 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001158
1159
1160 call popup_close(winid)
1161 redraw
1162 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1163 call assert_equal('hello', line)
1164
1165 " error is given for existing non-popup window
1166 call assert_fails('call popup_hide(win_getid())', 'E993:')
1167
1168 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001169 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001170 call popup_show(41234234)
1171
1172 bwipe!
1173endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001174
1175func Test_popup_move()
1176 topleft vnew
1177 call setline(1, 'hello')
1178
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001179 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001180 \ line: 1,
1181 \ col: 1,
1182 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001183 \})
1184 redraw
1185 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1186 call assert_equal('world ', line)
1187
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001188 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001189 redraw
1190 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1191 call assert_equal('hello ', line)
1192 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1193 call assert_equal('~world', line)
1194
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001195 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001196 redraw
1197 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1198 call assert_equal('hworld', line)
1199
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001200 call assert_fails('call popup_move(winid, [])', 'E715:')
1201 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1202
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001203 call popup_close(winid)
1204
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001205 call assert_equal(0, popup_move(-1, {}))
1206
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001207 bwipe!
1208endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001209
Bram Moolenaar402502d2019-05-30 22:07:36 +02001210func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001211 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001212 \ line: 2,
1213 \ col: 3,
1214 \ minwidth: 10,
1215 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001216 \})
1217 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001218 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001219 call assert_equal(2, res.line)
1220 call assert_equal(3, res.col)
1221 call assert_equal(10, res.width)
1222 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001223 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001224
1225 call popup_close(winid)
1226endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001227
1228func Test_popup_width_longest()
1229 let tests = [
1230 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1231 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1232 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1233 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1234 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1235 \ ]
1236
1237 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001238 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001239 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001240 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001241 call assert_equal(test[1], position.width)
1242 call popup_close(winid)
1243 endfor
1244endfunc
1245
1246func Test_popup_wraps()
1247 let tests = [
1248 \ ['nowrap', 6, 1],
1249 \ ['a line that wraps once', 12, 2],
1250 \ ['a line that wraps two times', 12, 3],
1251 \ ]
1252 for test in tests
1253 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001254 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001255 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001256 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001257 call assert_equal(test[1], position.width)
1258 call assert_equal(test[2], position.height)
1259
1260 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001261 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001262 endfor
1263endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001264
1265func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001266 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001267 \ line: 2,
1268 \ col: 3,
1269 \ minwidth: 10,
1270 \ minheight: 11,
1271 \ maxwidth: 20,
1272 \ maxheight: 21,
1273 \ zindex: 100,
1274 \ time: 5000,
1275 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001276 \})
1277 redraw
1278 let res = popup_getoptions(winid)
1279 call assert_equal(2, res.line)
1280 call assert_equal(3, res.col)
1281 call assert_equal(10, res.minwidth)
1282 call assert_equal(11, res.minheight)
1283 call assert_equal(20, res.maxwidth)
1284 call assert_equal(21, res.maxheight)
1285 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001286 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001287 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001288 if has('timers')
1289 call assert_equal(5000, res.time)
1290 endif
1291 call popup_close(winid)
1292
1293 let winid = popup_create('hello', {})
1294 redraw
1295 let res = popup_getoptions(winid)
1296 call assert_equal(0, res.line)
1297 call assert_equal(0, res.col)
1298 call assert_equal(0, res.minwidth)
1299 call assert_equal(0, res.minheight)
1300 call assert_equal(0, res.maxwidth)
1301 call assert_equal(0, res.maxheight)
1302 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001303 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001304 if has('timers')
1305 call assert_equal(0, res.time)
1306 endif
1307 call popup_close(winid)
1308 call assert_equal({}, popup_getoptions(winid))
1309endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001310
1311func Test_popup_option_values()
1312 new
1313 " window-local
1314 setlocal number
1315 setlocal nowrap
1316 " buffer-local
1317 setlocal omnifunc=Something
1318 " global/buffer-local
1319 setlocal path=/there
1320 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001321 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001322
1323 let winid = popup_create('hello', {})
1324 call assert_equal(0, getwinvar(winid, '&number'))
1325 call assert_equal(1, getwinvar(winid, '&wrap'))
1326 call assert_equal('', getwinvar(winid, '&omnifunc'))
1327 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001328 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1329
1330 " 'scrolloff' is reset to zero
1331 call assert_equal(5, &scrolloff)
1332 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001333
1334 call popup_close(winid)
1335 bwipe
1336endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001337
1338func Test_popup_atcursor()
1339 topleft vnew
1340 call setline(1, [
1341 \ 'xxxxxxxxxxxxxxxxx',
1342 \ 'xxxxxxxxxxxxxxxxx',
1343 \ 'xxxxxxxxxxxxxxxxx',
1344 \])
1345
1346 call cursor(2, 2)
1347 redraw
1348 let winid = popup_atcursor('vim', {})
1349 redraw
1350 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1351 call assert_equal('xvimxxxxxxxxxxxxx', line)
1352 call popup_close(winid)
1353
1354 call cursor(3, 4)
1355 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001356 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001357 redraw
1358 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1359 call assert_equal('xxxvimxxxxxxxxxxx', line)
1360 call popup_close(winid)
1361
1362 call cursor(1, 1)
1363 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001364 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001365 \ line: 'cursor+2',
1366 \ col: 'cursor+1',
1367 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001368 redraw
1369 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1370 call assert_equal('xvimxxxxxxxxxxxxx', line)
1371 call popup_close(winid)
1372
1373 call cursor(3, 3)
1374 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001375 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001376 \ line: 'cursor-2',
1377 \ col: 'cursor-1',
1378 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001379 redraw
1380 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1381 call assert_equal('xvimxxxxxxxxxxxxx', line)
1382 call popup_close(winid)
1383
Bram Moolenaar402502d2019-05-30 22:07:36 +02001384 " just enough room above
1385 call cursor(3, 3)
1386 redraw
1387 let winid = popup_atcursor(['vim', 'is great'], {})
1388 redraw
1389 let pos = popup_getpos(winid)
1390 call assert_equal(1, pos.line)
1391 call popup_close(winid)
1392
1393 " not enough room above, popup goes below the cursor
1394 call cursor(3, 3)
1395 redraw
1396 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1397 redraw
1398 let pos = popup_getpos(winid)
1399 call assert_equal(4, pos.line)
1400 call popup_close(winid)
1401
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001402 " cursor in first line, popup in line 2
1403 call cursor(1, 1)
1404 redraw
1405 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1406 redraw
1407 let pos = popup_getpos(winid)
1408 call assert_equal(2, pos.line)
1409 call popup_close(winid)
1410
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001411 bwipe!
1412endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001413
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001414func Test_popup_atcursor_pos()
1415 CheckScreendump
1416
1417 let lines =<< trim END
1418 call setline(1, repeat([repeat('-', 60)], 15))
1419 set so=0
1420
1421 normal 9G3|r#
1422 let winid1 = popup_atcursor(['first', 'second'], #{
1423 \ moved: [0, 0, 0],
1424 \ })
1425 normal 9G21|r&
1426 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1427 \ pos: 'botright',
1428 \ moved: [0, 0, 0],
1429 \ })
1430 normal 3G27|r%
1431 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1432 \ pos: 'topleft',
1433 \ moved: [0, 0, 0],
1434 \ })
1435 normal 3G45|r@
1436 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1437 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001438 \ moved: range(3),
1439 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001440 \ })
1441 END
1442 call writefile(lines, 'XtestPopupAtcursorPos')
1443 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1444 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1445
1446 " clean up
1447 call StopVimInTerminal(buf)
1448 call delete('XtestPopupAtcursorPos')
1449endfunc
1450
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001451func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001452 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001453 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001454
1455 let lines =<< trim END
1456 call setline(1, range(1, 20))
1457 call setline(5, 'here is some text to hover over')
1458 set balloonevalterm
1459 set balloonexpr=BalloonExpr()
1460 set balloondelay=100
1461 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001462 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001463 return ''
1464 endfunc
1465 func Hover()
1466 call test_setmouse(5, 15)
1467 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1468 sleep 100m
1469 endfunc
1470 func MoveOntoPopup()
1471 call test_setmouse(4, 17)
1472 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1473 endfunc
1474 func MoveAway()
1475 call test_setmouse(5, 13)
1476 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1477 endfunc
1478 END
1479 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001480 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001481 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001482 call term_sendkeys(buf, 'j')
1483 call term_sendkeys(buf, ":call Hover()\<CR>")
1484 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1485
1486 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1487 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1488
1489 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1490 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1491
1492 " clean up
1493 call StopVimInTerminal(buf)
1494 call delete('XtestPopupBeval')
1495endfunc
1496
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001497func Test_popup_filter()
1498 new
1499 call setline(1, 'some text')
1500
1501 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001502 if a:c == 'e' || a:c == "\<F9>"
1503 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001504 return 1
1505 endif
1506 if a:c == '0'
1507 let g:ignored = '0'
1508 return 0
1509 endif
1510 if a:c == 'x'
1511 call popup_close(a:winid)
1512 return 1
1513 endif
1514 return 0
1515 endfunc
1516
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001517 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001518 redraw
1519
1520 " e is consumed by the filter
1521 call feedkeys('e', 'xt')
1522 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001523 call feedkeys("\<F9>", 'xt')
1524 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001525
1526 " 0 is ignored by the filter
1527 normal $
1528 call assert_equal(9, getcurpos()[2])
1529 call feedkeys('0', 'xt')
1530 call assert_equal('0', g:ignored)
1531 call assert_equal(1, getcurpos()[2])
1532
1533 " x closes the popup
1534 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001535 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001536 call assert_equal(-1, winbufnr(winid))
1537
1538 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001539 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001540endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001541
Bram Moolenaar189832b2020-09-23 12:29:11 +02001542" this tests that the "ex_normal_busy_done" flag works
1543func Test_popup_filter_normal_cmd()
1544 CheckScreendump
1545
1546 let lines =<< trim END
1547 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1548 call timer_start(0, {-> win_execute(g:winid, 'norm! zz')})
1549 END
1550 call writefile(lines, 'XtestPopupNormal')
1551 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1552 call TermWait(buf, 100)
1553 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1554
1555 call StopVimInTerminal(buf)
1556 call delete('XtestPopupNormal')
1557endfunc
1558
Bram Moolenaar10476522020-09-24 22:57:31 +02001559" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001560func Test_popup_filter_win_execute()
1561 CheckScreendump
1562
1563 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001564 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1565 let g:id = popup_create(lines, #{
1566 \ minheight: &lines - 5,
1567 \ maxheight: &lines - 5,
1568 \ cursorline: 1,
1569 \ })
1570 redraw
1571 END
1572 call writefile(lines, 'XtestPopupWinExecute')
1573 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1574
1575 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1576 call term_sendkeys(buf, ":\<CR>")
1577
1578 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1579
1580 call StopVimInTerminal(buf)
1581 call delete('XtestPopupWinExecute')
1582endfunc
1583
1584" this tests that we don't get stuck with an error in "win_execute()"
1585func Test_popup_filter_win_execute_error()
1586 CheckScreendump
1587
1588 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001589 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1590 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1591 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001592 call writefile(lines, 'XtestPopupWinExecuteError')
1593 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001594
1595 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1596 call term_sendkeys(buf, "\<CR>")
1597 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1598 call term_sendkeys(buf, "\<CR>")
1599 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1600 call term_sendkeys(buf, "\<CR>")
1601 call term_sendkeys(buf, "\<CR>")
1602 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1603
1604 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001605 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001606endfunc
1607
Bram Moolenaara42d9452019-06-15 21:46:30 +02001608func ShowDialog(key, result)
1609 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001610 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001611 \ filter: 'popup_filter_yesno',
1612 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001613 \ })
1614 redraw
1615 call feedkeys(a:key, "xt")
1616 call assert_equal(winid, s:cb_winid)
1617 call assert_equal(a:result, s:cb_res)
1618endfunc
1619
1620func Test_popup_dialog()
1621 func QuitCallback(id, res)
1622 let s:cb_winid = a:id
1623 let s:cb_res = a:res
1624 endfunc
1625
1626 let winid = ShowDialog("y", 1)
1627 let winid = ShowDialog("Y", 1)
1628 let winid = ShowDialog("n", 0)
1629 let winid = ShowDialog("N", 0)
1630 let winid = ShowDialog("x", 0)
1631 let winid = ShowDialog("X", 0)
1632 let winid = ShowDialog("\<Esc>", 0)
1633 let winid = ShowDialog("\<C-C>", -1)
1634
1635 delfunc QuitCallback
1636endfunc
1637
Bram Moolenaara730e552019-06-16 19:05:31 +02001638func ShowMenu(key, result)
1639 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001640 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001641 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001642 \ })
1643 redraw
1644 call feedkeys(a:key, "xt")
1645 call assert_equal(winid, s:cb_winid)
1646 call assert_equal(a:result, s:cb_res)
1647endfunc
1648
1649func Test_popup_menu()
1650 func QuitCallback(id, res)
1651 let s:cb_winid = a:id
1652 let s:cb_res = a:res
1653 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001654 " mapping won't be used in popup
1655 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001656
1657 let winid = ShowMenu(" ", 1)
1658 let winid = ShowMenu("j \<CR>", 2)
1659 let winid = ShowMenu("JjK \<CR>", 2)
1660 let winid = ShowMenu("jjjjjj ", 3)
1661 let winid = ShowMenu("kkk ", 1)
1662 let winid = ShowMenu("x", -1)
1663 let winid = ShowMenu("X", -1)
1664 let winid = ShowMenu("\<Esc>", -1)
1665 let winid = ShowMenu("\<C-C>", -1)
1666
1667 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001668 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001669endfunc
1670
1671func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001672 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001673
1674 let lines =<< trim END
1675 call setline(1, range(1, 20))
1676 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001677 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001678 func MenuDone(id, res)
1679 echomsg "selected " .. a:res
1680 endfunc
1681 END
1682 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001683 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001684 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1685
1686 call term_sendkeys(buf, "jj")
1687 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1688
1689 call term_sendkeys(buf, " ")
1690 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1691
1692 " clean up
1693 call StopVimInTerminal(buf)
1694 call delete('XtestPopupMenu')
1695endfunc
1696
Bram Moolenaarf914a332019-07-20 15:09:56 +02001697func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001698 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001699
1700 let lines =<< trim END
1701 call setline(1, range(1, 20))
1702 hi PopupSelected ctermbg=green
1703 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1704 func MenuDone(id, res)
1705 echomsg "selected " .. a:res
1706 endfunc
1707 END
1708 call writefile(lines, 'XtestPopupNarrowMenu')
1709 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1710 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1711
1712 " clean up
1713 call term_sendkeys(buf, "x")
1714 call StopVimInTerminal(buf)
1715 call delete('XtestPopupNarrowMenu')
1716endfunc
1717
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001718func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001719 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001720
1721 " Create a popup without title or border, a line of padding will be added to
1722 " put the title on.
1723 let lines =<< trim END
1724 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001725 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001726 END
1727 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001728 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001729 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1730
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001731 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1732 call term_sendkeys(buf, ":\<CR>")
1733 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1734
1735 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1736 call term_sendkeys(buf, ":\<CR>")
1737 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1738
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001739 " clean up
1740 call StopVimInTerminal(buf)
1741 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001742
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001743 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001744 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001745 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001746 call assert_equal('Another Title', popup_getoptions(winid).title)
1747
1748 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001749endfunc
1750
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001751func Test_popup_close_callback()
1752 func PopupDone(id, result)
1753 let g:result = a:result
1754 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001755 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001756 redraw
1757 call popup_close(winid, 'done')
1758 call assert_equal('done', g:result)
1759endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001760
1761func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001762 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001763 redraw
1764 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001765 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001766 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001767 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001768
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001769 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001770 redraw
1771 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001772 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001773 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001774 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001775endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001776
1777func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001778 CheckScreendump
1779
Bram Moolenaar988c4332019-06-02 14:12:11 +02001780 " +-----------------------------+
1781 " | | |
1782 " | | |
1783 " | | |
1784 " | line1 |
1785 " |------------line2------------|
1786 " | line3 |
1787 " | line4 |
1788 " | |
1789 " | |
1790 " +-----------------------------+
1791 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001792 split
1793 vsplit
1794 let info_window1 = getwininfo()[0]
1795 let line = info_window1['height']
1796 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001797 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001798 \ line : line,
1799 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001800 \ })
1801 END
1802 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001803 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001804 call term_sendkeys(buf, "\<C-W>w")
1805 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1806
1807 " clean up
1808 call StopVimInTerminal(buf)
1809 call delete('XtestPopupBehind')
1810endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001811
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001812func s:VerifyPosition(p, msg, line, col, width, height)
1813 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1814 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1815 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1816 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001817endfunc
1818
1819func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001820 " Anything placed past the last cell on the right of the screen is moved to
1821 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001822 "
1823 " When wrapping is disabled, we also shift to the left to display on the
1824 " screen, unless fixed is set.
1825
1826 " Entries for cases which don't vary based on wrapping.
1827 " Format is per tests described below
1828 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001829 \ ['a', 5, &columns, 5, &columns, 1, 1],
1830 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1831 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001832 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001833 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001834
1835 " these test groups are dicts with:
1836 " - comment: something to identify the group of tests by
1837 " - options: dict of options to merge with the row/col in tests
1838 " - tests: list of cases. Each one is a list with elements:
1839 " - text
1840 " - row
1841 " - col
1842 " - expected row
1843 " - expected col
1844 " - expected width
1845 " - expected height
1846 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001847 \ #{
1848 \ comment: 'left-aligned with wrapping',
1849 \ options: #{
1850 \ wrap: 1,
1851 \ pos: 'botleft',
1852 \ },
1853 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001854 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1855 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1856 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1857 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1858 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1859 \
1860 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1861 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1862 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1863 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1864 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1865 \
1866 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1867 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1868 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001869 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1870 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001871 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001872 \ ],
1873 \ },
1874 \ #{
1875 \ comment: 'left aligned without wrapping',
1876 \ options: #{
1877 \ wrap: 0,
1878 \ pos: 'botleft',
1879 \ },
1880 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001881 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1882 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1883 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1884 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1885 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1886 \
1887 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1888 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1889 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1890 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1891 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1892 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001893 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1894 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1895 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1896 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1897 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1898 \ ],
1899 \ },
1900 \ #{
1901 \ comment: 'left aligned with fixed position',
1902 \ options: #{
1903 \ wrap: 0,
1904 \ fixed: 1,
1905 \ pos: 'botleft',
1906 \ },
1907 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001908 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1909 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1910 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1911 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1912 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1913 \
1914 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1915 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1916 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1917 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1918 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1919 \
1920 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1921 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1922 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001923 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1924 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1925 \ ],
1926 \ },
1927 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001928
1929 for test_group in tests
1930 for test in test_group.tests
1931 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001932 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001933 \ line: line,
1934 \ col: col,
1935 \ }
1936 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001937
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001938 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001939
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001940 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001941 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
1942 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001943 endfor
1944 endfor
1945
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001946 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001947 %bwipe!
1948endfunc
1949
Bram Moolenaar3397f742019-06-02 18:40:06 +02001950func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001951 " width of screen
1952 let X = join(map(range(&columns), {->'X'}), '')
1953
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001954 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1955 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001956
1957 redraw
1958 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1959 call assert_equal(X, line)
1960
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001961 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001962 redraw
1963
1964 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001965 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
1966 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001967
1968 redraw
1969 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1970 call assert_equal(X, line)
1971
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001972 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001973 redraw
1974
1975 " Extend so > window width
1976 let X .= 'x'
1977
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001978 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1979 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001980
1981 redraw
1982 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1983 call assert_equal(X[ : -2 ], line)
1984
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001985 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001986 redraw
1987
1988 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001989 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
1990 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001991
1992 redraw
1993 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1994 call assert_equal(X[ : -2 ], line)
1995
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001996 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001997 redraw
1998
1999 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002000 let p = popup_create(X,
2001 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2002 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002003
2004 redraw
2005 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2006 let e_line = ' ' . X[ 1 : -2 ]
2007 call assert_equal(e_line, line)
2008
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002009 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002010 redraw
2011
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002012 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002013 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002014endfunc
2015
2016func Test_popup_moved()
2017 new
2018 call test_override('char_avail', 1)
2019 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2020
2021 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002022 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002023 redraw
2024 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002025 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002026 " trigger the check for last_cursormoved by going into insert mode
2027 call feedkeys("li\<Esc>", 'xt')
2028 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002029 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002030
2031 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002032 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002033 redraw
2034 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002035 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002036 call feedkeys("hi\<Esc>", 'xt')
2037 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002038 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002039
2040 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002041 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002042 redraw
2043 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002044 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002045 call feedkeys("li\<Esc>", 'xt')
2046 call assert_equal(1, popup_getpos(winid).visible)
2047 call feedkeys("ei\<Esc>", 'xt')
2048 call assert_equal(1, popup_getpos(winid).visible)
2049 call feedkeys("eli\<Esc>", 'xt')
2050 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002051 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002052
Bram Moolenaar17627312019-06-02 19:53:44 +02002053 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002054 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002055 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002056 redraw
2057 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002058 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002059 call feedkeys("eli\<Esc>", 'xt')
2060 call assert_equal(1, popup_getpos(winid).visible)
2061 call feedkeys("wi\<Esc>", 'xt')
2062 call assert_equal(1, popup_getpos(winid).visible)
2063 call feedkeys("Eli\<Esc>", 'xt')
2064 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002065 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002066
2067 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002068 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002069 redraw
2070 call assert_equal(1, popup_getpos(winid).visible)
2071 call feedkeys("eli\<Esc>", 'xt')
2072 call feedkeys("ei\<Esc>", 'xt')
2073 call assert_equal(1, popup_getpos(winid).visible)
2074 call feedkeys("eli\<Esc>", 'xt')
2075 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002076 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002077
2078 bwipe!
2079 call test_override('ALL', 0)
2080endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002081
2082func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002083 CheckFeature timers
2084 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002085
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002086 let lines =<< trim END
2087 call setline(1, range(1, 20))
2088 hi Notification ctermbg=lightblue
2089 call popup_notification('first notification', {})
2090 END
2091 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002092 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002093 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2094
2095 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002096 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2097 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002098 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2099
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002100 " clean up
2101 call StopVimInTerminal(buf)
2102 call delete('XtestNotifications')
2103endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002104
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002105func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002106 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002107
2108 let lines =<< trim END
2109 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002110 hi ScrollThumb ctermbg=blue
2111 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002112 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002113 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002114 \ minwidth: 8,
2115 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002116 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002117 func ScrollUp()
2118 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2119 endfunc
2120 func ScrollDown()
2121 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2122 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002123 func ClickTop()
2124 call feedkeys("\<F4>\<LeftMouse>", "xt")
2125 endfunc
2126 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002127 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002128 call feedkeys("\<F5>\<LeftMouse>", "xt")
2129 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002130 func Popup_filter(winid, key)
2131 if a:key == 'j'
2132 let line = popup_getoptions(a:winid).firstline
2133 let nlines = line('$', a:winid)
2134 let newline = line < nlines ? (line + 1) : nlines
2135 call popup_setoptions(a:winid, #{firstline: newline})
2136 return v:true
2137 elseif a:key == 'x'
2138 call popup_close(a:winid)
2139 return v:true
2140 endif
2141 endfunc
2142
2143 func PopupScroll()
2144 call popup_clear()
2145 let text =<< trim END
2146 1
2147 2
2148 3
2149 4
2150 long line long line long line long line long line long line
2151 long line long line long line long line long line long line
2152 long line long line long line long line long line long line
2153 END
2154 call popup_create(text, #{
2155 \ minwidth: 30,
2156 \ maxwidth: 30,
2157 \ minheight: 4,
2158 \ maxheight: 4,
2159 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +01002160 \ lastline: 4,
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002161 \ wrap: v:true,
2162 \ scrollbar: v:true,
2163 \ mapping: v:false,
2164 \ filter: funcref('Popup_filter')
2165 \ })
2166 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002167 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002168 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2169 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002170 END
2171 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002172 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002173 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2174
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002175 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002176 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002177 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2178
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002179 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002180 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002181 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2182
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002183 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002184 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002185 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2186
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002187 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002188 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002189 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2190 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2191
2192 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2193 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2194
2195 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002196 " wait a bit, otherwise it fails sometimes (double click recognized?)
2197 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002198 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2199 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2200
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002201 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2202 sleep 100m
2203 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2204 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2205
2206 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2207 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2208
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002209 " remove the minwidth and maxheight
2210 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002211 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002212 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2213
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002214 " check size with non-wrapping lines
2215 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2216 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2217
2218 " check size with wrapping lines
2219 call term_sendkeys(buf, "j")
2220 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002221
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002222 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002223 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002224 call StopVimInTerminal(buf)
2225 call delete('XtestPopupScroll')
2226endfunc
2227
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002228func Test_popup_too_high_scrollbar()
2229 CheckScreendump
2230
2231 let lines =<< trim END
2232 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2233 set scrolloff=0
2234 func ShowPopup()
2235 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2236 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2237 \ minwidth: 8,
2238 \ border: [],
2239 \ })
2240 endfunc
2241 normal 3G$
2242 call ShowPopup()
2243 END
2244 call writefile(lines, 'XtestPopupToohigh')
2245 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2246 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2247
2248 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2249 call term_sendkeys(buf, "8G$")
2250 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2251 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2252
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002253 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2254 call term_sendkeys(buf, "gg$")
2255 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2256 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2257
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002258 " clean up
2259 call StopVimInTerminal(buf)
2260 call delete('XtestPopupToohigh')
2261endfunc
2262
Bram Moolenaar437a7462019-07-05 20:17:22 +02002263func Test_popup_fitting_scrollbar()
2264 " this was causing a crash, divide by zero
2265 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002266 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002267 \ scrollbar: 1,
2268 \ maxwidth: 10,
2269 \ maxheight: 5,
2270 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002271 redraw
2272 call popup_clear()
2273endfunc
2274
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002275func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002276 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002277
2278 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002279 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002280 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002281 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002282 END
2283
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002284 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002285 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002286 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2287
2288 " Setting to empty string clears it
2289 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2290 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2291
2292 " Setting a list
2293 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2294 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2295
2296 " Shrinking with a list
2297 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2298 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2299
2300 " Growing with a list
2301 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2302 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2303
2304 " Empty list clears
2305 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2306 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2307
2308 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002309 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002310 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2311
Bram Moolenaarb0992022020-01-30 14:55:42 +01002312 " range() (doesn't work)
2313 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2314 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2315
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002316 " clean up
2317 call StopVimInTerminal(buf)
2318 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002319endfunc
2320
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002321func Test_popup_settext_getline()
2322 let id = popup_create('', #{ tabpage: 0 })
2323 call popup_settext(id, ['a','b'])
2324 call assert_equal(2, line('$', id)) " OK :)
2325 call popup_close(id)
2326
2327 let id = popup_create('', #{ tabpage: -1 })
2328 call popup_settext(id, ['a','b'])
2329 call assert_equal(2, line('$', id)) " Fails :(
2330 call popup_close(id)
2331endfunc
2332
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002333func Test_popup_hidden()
2334 new
2335
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002336 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002337 redraw
2338 call assert_equal(0, popup_getpos(winid).visible)
2339 call popup_close(winid)
2340
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002341 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002342 redraw
2343 call assert_equal(0, popup_getpos(winid).visible)
2344 call popup_close(winid)
2345
2346 func QuitCallback(id, res)
2347 let s:cb_winid = a:id
2348 let s:cb_res = a:res
2349 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002350 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002351 \ filter: 'popup_filter_yesno',
2352 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002353 \ })
2354 redraw
2355 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002356 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2357 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002358 exe "normal anot used by filter\<Esc>"
2359 call assert_equal('not used by filter', getline(1))
2360
2361 call popup_show(winid)
2362 call feedkeys('y', "xt")
2363 call assert_equal(1, s:cb_res)
2364
2365 bwipe!
2366 delfunc QuitCallback
2367endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002368
2369" Test options not checked elsewhere
2370func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002371 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002372 let options = popup_getoptions(winid)
2373 call assert_equal(1, options.wrap)
2374 call assert_equal(0, options.drag)
2375 call assert_equal('Beautiful', options.highlight)
2376
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002377 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002378 let options = popup_getoptions(winid)
2379 call assert_equal(0, options.wrap)
2380 call assert_equal(1, options.drag)
2381 call assert_equal('Another', options.highlight)
2382
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002383 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2384 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2385
Bram Moolenaarae943152019-06-16 22:54:14 +02002386 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002387 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002388endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002389
2390func Test_popupwin_garbage_collect()
2391 func MyPopupFilter(x, winid, c)
2392 " NOP
2393 endfunc
2394
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002395 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002396 call test_garbagecollect_now()
2397 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002398 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002399 call feedkeys('j', 'xt')
2400 call assert_true(v:true)
2401
2402 call popup_close(winid)
2403 delfunc MyPopupFilter
2404endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002405
Bram Moolenaar581ba392019-09-03 22:08:33 +02002406func Test_popupwin_filter_mode()
2407 func MyPopupFilter(winid, c)
2408 let s:typed = a:c
2409 if a:c == ':' || a:c == "\r" || a:c == 'v'
2410 " can start cmdline mode, get out, and start/stop Visual mode
2411 return 0
2412 endif
2413 return 1
2414 endfunc
2415
2416 " Normal, Visual and Insert mode
2417 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2418 redraw
2419 call feedkeys('x', 'xt')
2420 call assert_equal('x', s:typed)
2421
2422 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2423 call assert_equal(':', s:typed)
2424 call assert_equal('foo', g:foo)
2425
2426 let @x = 'something'
2427 call feedkeys('v$"xy', 'xt')
2428 call assert_equal('y', s:typed)
2429 call assert_equal('something', @x) " yank command is filtered out
2430 call feedkeys('v', 'xt') " end Visual mode
2431
2432 call popup_close(winid)
2433
2434 " only Normal mode
2435 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2436 redraw
2437 call feedkeys('x', 'xt')
2438 call assert_equal('x', s:typed)
2439
2440 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2441 call assert_equal(':', s:typed)
2442 call assert_equal('foo', g:foo)
2443
2444 let @x = 'something'
2445 call feedkeys('v$"xy', 'xt')
2446 call assert_equal('v', s:typed)
2447 call assert_notequal('something', @x)
2448
2449 call popup_close(winid)
2450
2451 " default: all modes
2452 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2453 redraw
2454 call feedkeys('x', 'xt')
2455 call assert_equal('x', s:typed)
2456
2457 let g:foo = 'bar'
2458 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2459 call assert_equal("\r", s:typed)
2460 call assert_equal('bar', g:foo)
2461
2462 let @x = 'something'
2463 call feedkeys('v$"xy', 'xt')
2464 call assert_equal('y', s:typed)
2465 call assert_equal('something', @x) " yank command is filtered out
2466 call feedkeys('v', 'xt') " end Visual mode
2467
2468 call popup_close(winid)
2469 delfunc MyPopupFilter
2470endfunc
2471
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002472func Test_popupwin_filter_mouse()
2473 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002474 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002475 return 0
2476 endfunc
2477
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002478 call setline(1, ['.'->repeat(25)]->repeat(10))
2479 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2480 \ line: 2,
2481 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002482 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002483 \ padding: [],
2484 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002485 \ filter: 'MyPopupFilter',
2486 \ })
2487 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002488 " 123456789012345678901
2489 " 1 .....................
2490 " 2 ...+--------------+..
2491 " 3 ...| |..
2492 " 4 ...| short |..
2493 " 5 ...| long line th |..
2494 " 6 ...| at will wrap |..
2495 " 7 ...| other |..
2496 " 8 ...| |..
2497 " 9 ...+--------------+..
2498 " 10 .....................
2499 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002500
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002501 func AddItemOutsidePopup(tests, row, col)
2502 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2503 \ screenrow: a:row, screencol: a:col,
2504 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2505 \ line: a:row, column: a:col,
2506 \ }})
2507 endfunc
2508 func AddItemInPopupBorder(tests, winid, row, col)
2509 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2510 \ screenrow: a:row, screencol: a:col,
2511 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2512 \ line: 0, column: 0,
2513 \ }})
2514 endfunc
2515 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2516 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2517 \ screenrow: a:row, screencol: a:col,
2518 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2519 \ line: a:textline, column: a:textcol,
2520 \ }})
2521 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002522
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002523 " above and below popup
2524 for c in range(1, 21)
2525 call AddItemOutsidePopup(tests, 1, c)
2526 call AddItemOutsidePopup(tests, 10, c)
2527 endfor
2528 " left and right of popup
2529 for r in range(1, 10)
2530 call AddItemOutsidePopup(tests, r, 3)
2531 call AddItemOutsidePopup(tests, r, 20)
2532 endfor
2533 " top and bottom in popup
2534 for c in range(4, 19)
2535 call AddItemInPopupBorder(tests, winid, 2, c)
2536 call AddItemInPopupBorder(tests, winid, 3, c)
2537 call AddItemInPopupBorder(tests, winid, 8, c)
2538 call AddItemInPopupBorder(tests, winid, 9, c)
2539 endfor
2540 " left and right margin in popup
2541 for r in range(2, 9)
2542 call AddItemInPopupBorder(tests, winid, r, 4)
2543 call AddItemInPopupBorder(tests, winid, r, 5)
2544 call AddItemInPopupBorder(tests, winid, r, 18)
2545 call AddItemInPopupBorder(tests, winid, r, 19)
2546 endfor
2547 " text "short"
2548 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2549 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2550 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2551 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2552 " text "long line th"
2553 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2554 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2555 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2556 " text "at will wrap"
2557 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2558 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2559 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2560 " text "other"
2561 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2562 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2563 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2564 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002565
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002566 for item in tests
2567 call test_setmouse(item.clickrow, item.clickcol)
2568 call feedkeys("\<LeftMouse>", 'xt')
2569 call assert_equal(item.result, g:got_mousepos)
2570 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002571
2572 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002573 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002574 delfunc MyPopupFilter
2575endfunc
2576
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002577func Test_popupwin_with_buffer()
2578 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2579 let buf = bufadd('XsomeFile')
2580 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002581
2582 setlocal number
2583 call setbufvar(buf, "&wrapmargin", 13)
2584
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002585 let winid = popup_create(buf, {})
2586 call assert_notequal(0, winid)
2587 let pos = popup_getpos(winid)
2588 call assert_equal(2, pos.height)
2589 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002590
2591 " window-local option is set to default, buffer-local is not
2592 call assert_equal(0, getwinvar(winid, '&number'))
2593 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2594
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002595 call popup_close(winid)
2596 call assert_equal({}, popup_getpos(winid))
2597 call assert_equal(1, bufloaded(buf))
2598 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002599 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002600
2601 edit test_popupwin.vim
2602 let winid = popup_create(bufnr(''), {})
2603 redraw
2604 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002605 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002606endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002607
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002608func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002609 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002610 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002611 " Starting a terminal to run a shell in is considered flaky.
2612 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002613
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002614 let origwin = win_getid()
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002615 let termbuf = term_start(&shell, #{hidden: 1})
2616 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10})
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002617 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002618 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002619 sleep 100m
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002620 " Check this doesn't crash
2621 call assert_equal(winnr(), winnr('j'))
2622 call assert_equal(winnr(), winnr('k'))
2623 call assert_equal(winnr(), winnr('h'))
2624 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002625
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002626 " Cannot quit while job is running
2627 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002628
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002629 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002630 call feedkeys("xxx\<C-W>N", 'xt')
2631 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2632 call feedkeys("a\<C-U>", 'xt')
2633
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002634 " Cannot escape from terminal window
2635 call assert_fails('tab drop xxx', 'E863:')
2636
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002637 " Cannot open a second one.
2638 let termbuf2 = term_start(&shell, #{hidden: 1})
2639 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2640 call term_sendkeys(termbuf2, "exit\<CR>")
2641
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002642 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002643 call feedkeys("exit\<CR>", 'xt')
2644 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002645 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002646
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002647 call feedkeys(":quit\<CR>", 'xt')
2648 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002649endfunc
2650
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002651func Test_popupwin_close_prevwin()
2652 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002653 call Popupwin_close_prevwin()
2654endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002655
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002656def Popupwin_close_prevwin()
2657 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002658 split
2659 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002660 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002661 let buf = term_start(&shell, #{hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002662 popup_create(buf, {})
2663 TermWait(buf, 100)
2664 popup_clear(true)
2665 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002666
2667 quit
2668 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002669enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002670
Bram Moolenaar934470e2019-09-01 23:27:05 +02002671func Test_popupwin_with_buffer_and_filter()
2672 new Xwithfilter
2673 call setline(1, range(100))
2674 let bufnr = bufnr()
2675 hide
2676
2677 func BufferFilter(win, key)
2678 if a:key == 'G'
2679 " recursive use of "G" does not cause problems.
2680 call win_execute(a:win, 'normal! G')
2681 return 1
2682 endif
2683 return 0
2684 endfunc
2685
2686 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2687 call assert_equal(1, popup_getpos(winid).firstline)
2688 redraw
2689 call feedkeys("G", 'xt')
2690 call assert_equal(99, popup_getpos(winid).firstline)
2691
2692 call popup_close(winid)
2693 exe 'bwipe! ' .. bufnr
2694endfunc
2695
Bram Moolenaare296e312019-07-03 23:20:18 +02002696func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002697 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002698 \ maxwidth: 40,
2699 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002700 \ })
2701 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002702 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002703 redraw
2704 call assert_equal(19, popup_getpos(winid).width)
2705 endfor
2706 call popup_clear()
2707endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002708
2709func Test_popupwin_buf_close()
2710 let buf = bufadd('Xtestbuf')
2711 call bufload(buf)
2712 call setbufline(buf, 1, ['just', 'some', 'lines'])
2713 let winid = popup_create(buf, {})
2714 redraw
2715 call assert_equal(3, popup_getpos(winid).height)
2716 let bufinfo = getbufinfo(buf)[0]
2717 call assert_equal(1, bufinfo.changed)
2718 call assert_equal(0, bufinfo.hidden)
2719 call assert_equal(0, bufinfo.listed)
2720 call assert_equal(1, bufinfo.loaded)
2721 call assert_equal([], bufinfo.windows)
2722 call assert_equal([winid], bufinfo.popups)
2723
2724 call popup_close(winid)
2725 call assert_equal({}, popup_getpos(winid))
2726 let bufinfo = getbufinfo(buf)[0]
2727 call assert_equal(1, bufinfo.changed)
2728 call assert_equal(1, bufinfo.hidden)
2729 call assert_equal(0, bufinfo.listed)
2730 call assert_equal(1, bufinfo.loaded)
2731 call assert_equal([], bufinfo.windows)
2732 call assert_equal([], bufinfo.popups)
2733 exe 'bwipe! ' .. buf
2734endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002735
2736func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002737 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002738
2739 let lines =<< trim END
2740 call setline(1, range(1, 10))
2741 hi ScrollThumb ctermbg=blue
2742 hi ScrollBar ctermbg=red
2743 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002744 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002745 \ maxwidth: 10,
2746 \ maxheight: 3,
2747 \ pos : 'topleft',
2748 \ col : a:col,
2749 \ line : a:line,
2750 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002751 \ })
2752 endfunc
2753 call PopupMenu(['x'], 1, 1)
2754 call PopupMenu(['123456789|'], 1, 16)
2755 call PopupMenu(['123456789|' .. ' '], 7, 1)
2756 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2757 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2758 END
2759 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002760 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002761 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2762
2763 " close the menu popupwin.
2764 call term_sendkeys(buf, " ")
2765 call term_sendkeys(buf, " ")
2766 call term_sendkeys(buf, " ")
2767 call term_sendkeys(buf, " ")
2768 call term_sendkeys(buf, " ")
2769
2770 " clean up
2771 call StopVimInTerminal(buf)
2772 call delete('XtestPopupMenuMaxWidth')
2773endfunc
2774
Bram Moolenaara901a372019-07-13 16:38:50 +02002775func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002776 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002777
2778 let lines =<< trim END
2779 call setline(1, range(1, 20))
2780 hi ScrollThumb ctermbg=blue
2781 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002782 eval ['one', 'two', 'three', 'four', 'five',
2783 \ 'six', 'seven', 'eight', 'nine']
2784 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002785 \ minwidth: 8,
2786 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002787 \ })
2788 END
2789 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002790 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002791
2792 call term_sendkeys(buf, "j")
2793 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2794
2795 call term_sendkeys(buf, "jjj")
2796 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2797
2798 " if the cursor is the bottom line, it stays at the bottom line.
2799 call term_sendkeys(buf, repeat("j", 20))
2800 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2801
2802 call term_sendkeys(buf, "kk")
2803 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2804
2805 call term_sendkeys(buf, "k")
2806 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2807
2808 " if the cursor is in the top line, it stays in the top line.
2809 call term_sendkeys(buf, repeat("k", 20))
2810 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2811
2812 " close the menu popupwin.
2813 call term_sendkeys(buf, " ")
2814
2815 " clean up
2816 call StopVimInTerminal(buf)
2817 call delete('XtestPopupMenuScroll')
2818endfunc
2819
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002820func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002821 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002822
2823 let lines =<< trim END
2824 function! MyFilter(winid, key) abort
2825 if a:key == "0"
2826 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2827 return 1
2828 endif
2829 if a:key == "G"
2830 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2831 return 1
2832 endif
2833 if a:key == "j"
2834 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2835 return 1
2836 endif
2837 if a:key == "k"
2838 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2839 return 1
2840 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002841 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002842 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002843 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002844 endif
2845 return 0
2846 endfunction
2847 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2848 \ maxheight : 3,
2849 \ filter : 'MyFilter'
2850 \ })
2851 END
2852 call writefile(lines, 'XtestPopupMenuFilter')
2853 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2854
2855 call term_sendkeys(buf, "j")
2856 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2857
2858 call term_sendkeys(buf, "k")
2859 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2860
2861 call term_sendkeys(buf, "G")
2862 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2863
2864 call term_sendkeys(buf, "0")
2865 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2866
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002867 " check that when the popup is closed in the filter the screen is redrawn
2868 call term_sendkeys(buf, ":")
2869 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2870 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002871
2872 " clean up
2873 call StopVimInTerminal(buf)
2874 call delete('XtestPopupMenuFilter')
2875endfunc
2876
2877func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002878 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002879
2880 let winid = popup_create('some text', {})
2881 call assert_equal(0, popup_getoptions(winid).cursorline)
2882 call popup_close(winid)
2883
2884 let winid = popup_create('some text', #{ cursorline: 1, })
2885 call assert_equal(1, popup_getoptions(winid).cursorline)
2886 call popup_close(winid)
2887
2888 let winid = popup_create('some text', #{ cursorline: 0, })
2889 call assert_equal(0, popup_getoptions(winid).cursorline)
2890 call popup_close(winid)
2891
2892 let winid = popup_menu('some text', {})
2893 call assert_equal(1, popup_getoptions(winid).cursorline)
2894 call popup_close(winid)
2895
2896 let winid = popup_menu('some text', #{ cursorline: 1, })
2897 call assert_equal(1, popup_getoptions(winid).cursorline)
2898 call popup_close(winid)
2899
2900 let winid = popup_menu('some text', #{ cursorline: 0, })
2901 call assert_equal(0, popup_getoptions(winid).cursorline)
2902 call popup_close(winid)
2903
2904 " ---------
2905 " Pattern 1
2906 " ---------
2907 let lines =<< trim END
2908 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
2909 END
2910 call writefile(lines, 'XtestPopupCursorLine')
2911 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2912 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
2913 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2914 call StopVimInTerminal(buf)
2915
2916 " ---------
2917 " Pattern 2
2918 " ---------
2919 let lines =<< trim END
2920 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
2921 END
2922 call writefile(lines, 'XtestPopupCursorLine')
2923 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2924 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
2925 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2926 call StopVimInTerminal(buf)
2927
2928 " ---------
2929 " Pattern 3
2930 " ---------
2931 let lines =<< trim END
2932 function! MyFilter(winid, key) abort
2933 if a:key == "j"
2934 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2935 return 1
2936 endif
2937 if a:key == 'x'
2938 call popup_close(a:winid)
2939 return 1
2940 endif
2941 return 0
2942 endfunction
2943 call popup_menu(['111', '222', '333'], #{
2944 \ cursorline : 0,
2945 \ maxheight : 2,
2946 \ filter : 'MyFilter',
2947 \ })
2948 END
2949 call writefile(lines, 'XtestPopupCursorLine')
2950 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2951 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
2952 call term_sendkeys(buf, "j")
2953 call term_sendkeys(buf, "j")
2954 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
2955 call term_sendkeys(buf, "x")
2956 call StopVimInTerminal(buf)
2957
2958 " ---------
2959 " Pattern 4
2960 " ---------
2961 let lines =<< trim END
2962 function! MyFilter(winid, key) abort
2963 if a:key == "j"
2964 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2965 return 1
2966 endif
2967 if a:key == 'x'
2968 call popup_close(a:winid)
2969 return 1
2970 endif
2971 return 0
2972 endfunction
2973 call popup_menu(['111', '222', '333'], #{
2974 \ cursorline : 1,
2975 \ maxheight : 2,
2976 \ filter : 'MyFilter',
2977 \ })
2978 END
2979 call writefile(lines, 'XtestPopupCursorLine')
2980 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2981 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
2982 call term_sendkeys(buf, "j")
2983 call term_sendkeys(buf, "j")
2984 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
2985 call term_sendkeys(buf, "x")
2986 call StopVimInTerminal(buf)
2987
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02002988 " ---------
2989 " Cursor in second line when creating the popup
2990 " ---------
2991 let lines =<< trim END
2992 let winid = popup_create(['111', '222', '333'], #{
2993 \ cursorline : 1,
2994 \ })
2995 call win_execute(winid, "2")
2996 END
2997 call writefile(lines, 'XtestPopupCursorLine')
2998 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2999 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3000 call StopVimInTerminal(buf)
3001
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003002 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003003
3004 " ---------
3005 " Use current buffer for popupmenu
3006 " ---------
3007 let lines =<< trim END
3008 call setline(1, ['one', 'two', 'three'])
3009 let winid = popup_create(bufnr('%'), #{
3010 \ cursorline : 1,
3011 \ })
3012 call win_execute(winid, "2")
3013 END
3014 call writefile(lines, 'XtestPopupCursorLine')
3015 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3016 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3017 call StopVimInTerminal(buf)
3018
3019 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003020endfunc
3021
Bram Moolenaarf914a332019-07-20 15:09:56 +02003022func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003023 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003024 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003025
Bram Moolenaarf914a332019-07-20 15:09:56 +02003026 call writefile([
3027 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3028 \ "another\tXtagfile\t/^this is another",
3029 \ "theword\tXtagfile\t/^theword"],
3030 \ 'Xtags')
3031 call writefile(range(1,20)
3032 \ + ['theword is here']
3033 \ + range(22, 27)
3034 \ + ['this is another place']
3035 \ + range(29, 40),
3036 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003037 call writefile(range(1,10)
3038 \ + ['searched word is here']
3039 \ + range(12, 20),
3040 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003041 let lines =<< trim END
3042 set tags=Xtags
3043 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003044 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003045 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003046 \ 'three',
3047 \ 'four',
3048 \ 'five',
3049 \ 'six',
3050 \ 'seven',
3051 \ 'find theword somewhere',
3052 \ 'nine',
3053 \ 'this is another word',
3054 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003055 set previewpopup=height:4,width:40
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003056 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003057 END
3058 call writefile(lines, 'XtestPreviewPopup')
3059 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3060
3061 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3062 call term_sendkeys(buf, ":\<CR>")
3063 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3064
3065 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3066 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3067
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003068 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003069 call term_sendkeys(buf, ":\<CR>")
3070 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3071
3072 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3073 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3074
Bram Moolenaar799439a2020-02-11 21:44:17 +01003075 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003076 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003077 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003078
3079 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003080 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003081 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3082
3083 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3084 call term_sendkeys(buf, ":\<CR>")
3085 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3086
3087 call term_sendkeys(buf, ":pclose\<CR>")
3088 call term_sendkeys(buf, ":psearch searched\<CR>")
3089 call term_sendkeys(buf, ":\<CR>")
3090 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003091
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003092 call term_sendkeys(buf, "\<C-W>p")
3093 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3094
3095 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3096 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3097
Bram Moolenaarf914a332019-07-20 15:09:56 +02003098 call StopVimInTerminal(buf)
3099 call delete('Xtags')
3100 call delete('Xtagfile')
3101 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003102 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003103endfunc
3104
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003105func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003106 let lines =<< trim END
3107 set completeopt+=preview,popup
3108 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003109 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003110
3111 func CompleteFuncDict(findstart, base)
3112 if a:findstart
3113 if col('.') > 10
3114 return col('.') - 10
3115 endif
3116 return 0
3117 endif
3118
3119 return {
3120 \ 'words': [
3121 \ {
3122 \ 'word': 'aword',
3123 \ 'abbr': 'wrd',
3124 \ 'menu': 'extra text',
3125 \ 'info': 'words are cool',
3126 \ 'kind': 'W',
3127 \ 'user_data': 'test'
3128 \ },
3129 \ {
3130 \ 'word': 'anotherword',
3131 \ 'abbr': 'anotwrd',
3132 \ 'menu': 'extra text',
3133 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3134 \ 'kind': 'W',
3135 \ 'user_data': 'notest'
3136 \ },
3137 \ {
3138 \ 'word': 'noinfo',
3139 \ 'abbr': 'noawrd',
3140 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003141 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003142 \ 'kind': 'W',
3143 \ 'user_data': 'notest'
3144 \ },
3145 \ {
3146 \ 'word': 'thatword',
3147 \ 'abbr': 'thatwrd',
3148 \ 'menu': 'extra text',
3149 \ 'info': 'that word is cool',
3150 \ 'kind': 'W',
3151 \ 'user_data': 'notest'
3152 \ },
3153 \ ]
3154 \ }
3155 endfunc
3156 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003157 func ChangeColor()
3158 let id = popup_findinfo()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003159 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003160 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003161
3162 func InfoHidden()
3163 set completepopup=height:4,border:off,align:menu
3164 set completeopt-=popup completeopt+=popuphidden
3165 au CompleteChanged * call HandleChange()
3166 endfunc
3167
3168 let s:counter = 0
3169 func HandleChange()
3170 let s:counter += 1
3171 let selected = complete_info(['selected']).selected
3172 if selected <= 0
3173 " First time: do nothing, info remains hidden
3174 return
3175 endif
3176 if selected == 1
3177 " Second time: show info right away
3178 let id = popup_findinfo()
3179 if id
3180 call popup_settext(id, 'immediate info ' .. s:counter)
3181 call popup_show(id)
3182 endif
3183 else
3184 " Third time: show info after a short delay
3185 call timer_start(100, 'ShowInfo')
3186 endif
3187 endfunc
3188
3189 func ShowInfo(...)
3190 let id = popup_findinfo()
3191 if id
3192 call popup_settext(id, 'async info ' .. s:counter)
3193 call popup_show(id)
3194 endif
3195 endfunc
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003196 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003197 return lines
3198endfunc
3199
3200func Test_popupmenu_info_border()
3201 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003202 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003203
3204 let lines = Get_popupmenu_lines()
3205 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003206 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003207
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003208 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003209 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003210
3211 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3212 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3213
3214 call term_sendkeys(buf, "\<C-N>")
3215 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3216
3217 call term_sendkeys(buf, "\<C-N>")
3218 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3219
3220 call term_sendkeys(buf, "\<C-N>\<C-N>")
3221 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3222
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003223 " info on the left with scrollbar
3224 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3225 call term_sendkeys(buf, "\<C-N>\<C-N>")
3226 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3227
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003228 " Test that the popupmenu's scrollbar and infopopup do not overlap
3229 call term_sendkeys(buf, "\<Esc>")
3230 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3231 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3232 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3233
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003234 " Hide the info popup, cycle trough buffers, make sure it didn't get
3235 " deleted.
3236 call term_sendkeys(buf, "\<Esc>")
3237 call term_sendkeys(buf, ":set hidden\<CR>")
3238 call term_sendkeys(buf, ":bn\<CR>")
3239 call term_sendkeys(buf, ":bn\<CR>")
3240 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3241 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3242
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003243 " Test that when the option is changed the popup changes.
3244 call term_sendkeys(buf, "\<Esc>")
3245 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3246 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3247 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3248
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003249 call term_sendkeys(buf, " \<Esc>")
3250 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3251 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3252 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3253
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003254 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003255 call StopVimInTerminal(buf)
3256 call delete('XtestInfoPopup')
3257endfunc
3258
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003259func Test_popupmenu_info_noborder()
3260 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003261 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003262
3263 let lines = Get_popupmenu_lines()
3264 call add(lines, 'set completepopup=height:4,border:off')
3265 call writefile(lines, 'XtestInfoPopupNb')
3266
3267 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003268 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003269
3270 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3271 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3272
3273 call StopVimInTerminal(buf)
3274 call delete('XtestInfoPopupNb')
3275endfunc
3276
Bram Moolenaar258cef52019-08-21 17:29:29 +02003277func Test_popupmenu_info_align_menu()
3278 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003279 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003280
3281 let lines = Get_popupmenu_lines()
3282 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3283 call writefile(lines, 'XtestInfoPopupNb')
3284
3285 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003286 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003287
3288 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3289 call term_sendkeys(buf, "\<C-N>")
3290 call term_sendkeys(buf, "\<C-N>")
3291 call term_sendkeys(buf, "\<C-N>")
3292 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3293
3294 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3295 call term_sendkeys(buf, "\<C-N>")
3296 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3297
3298 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003299 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003300 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3301 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3302 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3303
3304 call StopVimInTerminal(buf)
3305 call delete('XtestInfoPopupNb')
3306endfunc
3307
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003308func Test_popupmenu_info_hidden()
3309 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003310 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003311
3312 let lines = Get_popupmenu_lines()
3313 call add(lines, 'call InfoHidden()')
3314 call writefile(lines, 'XtestInfoPopupHidden')
3315
3316 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003317 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003318
3319 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3320 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3321
3322 call term_sendkeys(buf, "\<C-N>")
3323 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3324
3325 call term_sendkeys(buf, "\<C-N>")
3326 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3327
3328 call term_sendkeys(buf, "\<Esc>")
3329 call StopVimInTerminal(buf)
3330 call delete('XtestInfoPopupHidden')
3331endfunc
3332
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003333func Test_popupmenu_info_too_wide()
3334 CheckScreendump
3335 CheckFeature quickfix
3336
3337 let lines =<< trim END
3338 call setline(1, range(10))
3339
3340 set completeopt+=preview,popup
3341 set completepopup=align:menu
3342 set omnifunc=OmniFunc
3343 hi InfoPopup ctermbg=lightgrey
3344
3345 func OmniFunc(findstart, base)
3346 if a:findstart
3347 return 0
3348 endif
3349
3350 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3351 return #{
3352 \ words: [
3353 \ #{
3354 \ word: 'scrap',
3355 \ menu: menuText,
3356 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3357 \ },
3358 \ #{
3359 \ word: 'scappier',
3360 \ menu: menuText,
3361 \ info: 'words are cool',
3362 \ },
3363 \ #{
3364 \ word: 'scrappier2',
3365 \ menu: menuText,
3366 \ info: 'words are cool',
3367 \ },
3368 \ ]
3369 \ }
3370 endfunc
3371 END
3372
3373 call writefile(lines, 'XtestInfoPopupWide')
3374 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003375 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003376
3377 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3378 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3379
3380 call term_sendkeys(buf, "\<Esc>")
3381 call StopVimInTerminal(buf)
3382 call delete('XtestInfoPopupWide')
3383endfunc
3384
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003385func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003386 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003387 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003388 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003389 call assert_equal(bufnr, winbufnr(winid))
3390 call popup_clear()
3391endfunc
3392
Bram Moolenaar1824f452019-10-02 23:06:46 +02003393func Test_popupwin_getoptions_tablocal()
3394 topleft split
3395 let win1 = popup_create('nothing', #{maxheight: 8})
3396 let win2 = popup_create('something', #{maxheight: 10})
3397 let win3 = popup_create('something', #{maxheight: 15})
3398 call assert_equal(8, popup_getoptions(win1).maxheight)
3399 call assert_equal(10, popup_getoptions(win2).maxheight)
3400 call assert_equal(15, popup_getoptions(win3).maxheight)
3401 call popup_clear()
3402 quit
3403endfunc
3404
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003405func Test_popupwin_cancel()
3406 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3407 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3408 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3409 call assert_equal(5, popup_getpos(win1).line)
3410 call assert_equal(10, popup_getpos(win2).line)
3411 call assert_equal(15, popup_getpos(win3).line)
3412 " TODO: this also works without patch 8.1.2110
3413 call feedkeys("\<C-C>", 'xt')
3414 call assert_equal(5, popup_getpos(win1).line)
3415 call assert_equal(10, popup_getpos(win2).line)
3416 call assert_equal({}, popup_getpos(win3))
3417 call feedkeys("\<C-C>", 'xt')
3418 call assert_equal(5, popup_getpos(win1).line)
3419 call assert_equal({}, popup_getpos(win2))
3420 call assert_equal({}, popup_getpos(win3))
3421 call feedkeys("\<C-C>", 'xt')
3422 call assert_equal({}, popup_getpos(win1))
3423 call assert_equal({}, popup_getpos(win2))
3424 call assert_equal({}, popup_getpos(win3))
3425endfunc
3426
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003427func Test_popupwin_filter_redraw()
3428 " Create two popups with a filter that closes the popup when typing "0".
3429 " Both popups should close, even though the redraw also calls
3430 " popup_reset_handled()
3431
3432 func CloseFilter(winid, key)
3433 if a:key == '0'
3434 call popup_close(a:winid)
3435 redraw
3436 endif
3437 return 0 " pass the key
3438 endfunc
3439
3440 let id1 = popup_create('first one', #{
3441 \ line: 1,
3442 \ col: 1,
3443 \ filter: 'CloseFilter',
3444 \ })
3445 let id2 = popup_create('second one', #{
3446 \ line: 9,
3447 \ col: 1,
3448 \ filter: 'CloseFilter',
3449 \ })
3450 call assert_equal(1, popup_getpos(id1).line)
3451 call assert_equal(9, popup_getpos(id2).line)
3452
3453 call feedkeys('0', 'xt')
3454 call assert_equal({}, popup_getpos(id1))
3455 call assert_equal({}, popup_getpos(id2))
3456
3457 call popup_clear()
3458 delfunc CloseFilter
3459endfunc
3460
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003461func Test_popupwin_double_width()
3462 CheckScreendump
3463
3464 let lines =<< trim END
3465 call setline(1, 'x你好世界你好世你好世界你好')
3466 call setline(2, '你好世界你好世你好世界你好')
3467 call setline(3, 'x你好世界你好世你好世界你好')
3468 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3469 END
3470 call writefile(lines, 'XtestPopupWide')
3471
3472 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3473 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3474
3475 call StopVimInTerminal(buf)
3476 call delete('XtestPopupWide')
3477endfunc
3478
3479func Test_popupwin_sign()
3480 CheckScreendump
3481
3482 let lines =<< trim END
3483 call setline(1, range(10))
3484 call sign_define('Current', {
3485 \ 'text': '>>',
3486 \ 'texthl': 'WarningMsg',
3487 \ 'linehl': 'Error',
3488 \ })
3489 call sign_define('Other', {
3490 \ 'text': '#!',
3491 \ 'texthl': 'Error',
3492 \ 'linehl': 'Search',
3493 \ })
3494 let winid = popup_create(['hello', 'bright', 'world'], {
3495 \ 'minwidth': 20,
3496 \ })
3497 call setwinvar(winid, "&signcolumn", "yes")
3498 let winbufnr = winbufnr(winid)
3499
3500 " add sign to current buffer, shows
3501 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3502 " add sign to current buffer, does not show
3503 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3504
3505 " add sign to popup buffer, shows
3506 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3507 " add sign to popup buffer, does not show
3508 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003509
3510 func SetOptions()
3511 call setwinvar(g:winid, '&number', 1)
3512 call setwinvar(g:winid, '&foldcolumn', 2)
3513 call popup_settext(g:winid, 'a longer line to check the width')
3514 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003515 END
3516 call writefile(lines, 'XtestPopupSign')
3517
3518 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3519 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3520
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003521 " set more options to check the width is adjusted
3522 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3523 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3524
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003525 call StopVimInTerminal(buf)
3526 call delete('XtestPopupSign')
3527endfunc
3528
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003529func Test_popupwin_bufnr()
3530 let popwin = popup_create(['blah'], #{})
3531 let popbuf = winbufnr(popwin)
3532 split asdfasdf
3533 let newbuf = bufnr()
3534 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3535 call assert_equal(newbuf, bufnr('$'))
3536 call popup_clear()
3537 let popwin = popup_create(['blah'], #{})
3538 " reuses previous buffer number
3539 call assert_equal(popbuf, winbufnr(popwin))
3540 call assert_equal(newbuf, bufnr('$'))
3541
3542 call popup_clear()
3543 bwipe!
3544endfunc
3545
Bram Moolenaarec084d32020-02-28 22:44:47 +01003546func Test_popupwin_filter_input_multibyte()
3547 func MyPopupFilter(winid, c)
3548 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3549 return 0
3550 endfunc
3551 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3552
3553 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3554 call feedkeys("\u3000", 'xt')
3555 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3556
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003557 " UTF-8: E3 80 9B, including CSI(0x9B)
3558 call feedkeys("\u301b", 'xt')
3559 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003560
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003561 if has('unix')
3562 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003563 if has('gui_running')
3564 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3565 else
3566 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3567 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003568 call assert_equal([0xc3, 0x81], g:bytes)
3569 endif
3570
Bram Moolenaarec084d32020-02-28 22:44:47 +01003571 call popup_clear()
3572 delfunc MyPopupFilter
3573 unlet g:bytes
3574endfunc
3575
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003576func Test_popupwin_filter_close_ctrl_c()
3577 CheckScreendump
3578
3579 let lines =<< trim END
3580 vsplit
3581 set laststatus=2
3582 set statusline=%!Statusline()
3583
3584 function Statusline() abort
3585 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3586 endfunction
3587
3588 call popup_create('test test test test...', {'filter': {-> 0}})
3589 END
3590 call writefile(lines, 'XtestPopupCtrlC')
3591
3592 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3593
3594 call term_sendkeys(buf, "\<C-C>")
3595 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3596
3597 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003598 call delete('XtestPopupCtrlC')
3599endfunc
3600
3601func Test_popupwin_filter_close_wrong_name()
3602 CheckScreendump
3603
3604 let lines =<< trim END
3605 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3606 END
3607 call writefile(lines, 'XtestPopupWrongName')
3608
3609 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3610
3611 call term_sendkeys(buf, "j")
3612 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3613
3614 call StopVimInTerminal(buf)
3615 call delete('XtestPopupWrongName')
3616endfunc
3617
3618func Test_popupwin_filter_close_three_errors()
3619 CheckScreendump
3620
3621 let lines =<< trim END
3622 set cmdheight=2
3623 call popup_create('one two three...', {'filter': 'filter'})
3624 END
3625 call writefile(lines, 'XtestPopupThreeErrors')
3626
3627 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3628
3629 call term_sendkeys(buf, "jj")
3630 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3631 call term_sendkeys(buf, "j")
3632 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3633
3634 call StopVimInTerminal(buf)
3635 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003636endfunc
3637
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003638func Test_popupwin_atcursor_far_right()
3639 new
3640
3641 " this was getting stuck
3642 set signcolumn=yes
3643 call setline(1, repeat('=', &columns))
3644 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003645 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003646
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003647 " 'signcolumn' was getting reset
3648 call setwinvar(winid, '&signcolumn', 'yes')
3649 call popup_setoptions(winid, {'zindex': 1000})
3650 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3651
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003652 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003653 bwipe!
3654 set signcolumn&
3655endfunc
3656
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003657func Test_popupwin_splitmove()
3658 vsplit
3659 let win2 = win_getid()
3660 let popup_winid = popup_dialog('hello', {})
3661 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3662 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3663
3664 call popup_clear()
3665 bwipe
3666endfunc
3667
3668
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003669" vim: shiftwidth=2 sts=2