blob: 6607ea231ced8c517d288ae645e9bc606559dc27 [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 Moolenaara42d9452019-06-15 21:46:30 +02001559func ShowDialog(key, result)
1560 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001561 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001562 \ filter: 'popup_filter_yesno',
1563 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001564 \ })
1565 redraw
1566 call feedkeys(a:key, "xt")
1567 call assert_equal(winid, s:cb_winid)
1568 call assert_equal(a:result, s:cb_res)
1569endfunc
1570
1571func Test_popup_dialog()
1572 func QuitCallback(id, res)
1573 let s:cb_winid = a:id
1574 let s:cb_res = a:res
1575 endfunc
1576
1577 let winid = ShowDialog("y", 1)
1578 let winid = ShowDialog("Y", 1)
1579 let winid = ShowDialog("n", 0)
1580 let winid = ShowDialog("N", 0)
1581 let winid = ShowDialog("x", 0)
1582 let winid = ShowDialog("X", 0)
1583 let winid = ShowDialog("\<Esc>", 0)
1584 let winid = ShowDialog("\<C-C>", -1)
1585
1586 delfunc QuitCallback
1587endfunc
1588
Bram Moolenaara730e552019-06-16 19:05:31 +02001589func ShowMenu(key, result)
1590 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001591 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001592 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001593 \ })
1594 redraw
1595 call feedkeys(a:key, "xt")
1596 call assert_equal(winid, s:cb_winid)
1597 call assert_equal(a:result, s:cb_res)
1598endfunc
1599
1600func Test_popup_menu()
1601 func QuitCallback(id, res)
1602 let s:cb_winid = a:id
1603 let s:cb_res = a:res
1604 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001605 " mapping won't be used in popup
1606 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001607
1608 let winid = ShowMenu(" ", 1)
1609 let winid = ShowMenu("j \<CR>", 2)
1610 let winid = ShowMenu("JjK \<CR>", 2)
1611 let winid = ShowMenu("jjjjjj ", 3)
1612 let winid = ShowMenu("kkk ", 1)
1613 let winid = ShowMenu("x", -1)
1614 let winid = ShowMenu("X", -1)
1615 let winid = ShowMenu("\<Esc>", -1)
1616 let winid = ShowMenu("\<C-C>", -1)
1617
1618 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001619 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001620endfunc
1621
1622func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001623 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001624
1625 let lines =<< trim END
1626 call setline(1, range(1, 20))
1627 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001628 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001629 func MenuDone(id, res)
1630 echomsg "selected " .. a:res
1631 endfunc
1632 END
1633 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001634 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001635 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1636
1637 call term_sendkeys(buf, "jj")
1638 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1639
1640 call term_sendkeys(buf, " ")
1641 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1642
1643 " clean up
1644 call StopVimInTerminal(buf)
1645 call delete('XtestPopupMenu')
1646endfunc
1647
Bram Moolenaarf914a332019-07-20 15:09:56 +02001648func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001649 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001650
1651 let lines =<< trim END
1652 call setline(1, range(1, 20))
1653 hi PopupSelected ctermbg=green
1654 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1655 func MenuDone(id, res)
1656 echomsg "selected " .. a:res
1657 endfunc
1658 END
1659 call writefile(lines, 'XtestPopupNarrowMenu')
1660 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1661 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1662
1663 " clean up
1664 call term_sendkeys(buf, "x")
1665 call StopVimInTerminal(buf)
1666 call delete('XtestPopupNarrowMenu')
1667endfunc
1668
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001669func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001670 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001671
1672 " Create a popup without title or border, a line of padding will be added to
1673 " put the title on.
1674 let lines =<< trim END
1675 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001676 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001677 END
1678 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001679 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001680 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1681
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001682 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1683 call term_sendkeys(buf, ":\<CR>")
1684 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1685
1686 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1687 call term_sendkeys(buf, ":\<CR>")
1688 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1689
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001690 " clean up
1691 call StopVimInTerminal(buf)
1692 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001693
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001694 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001695 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001696 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001697 call assert_equal('Another Title', popup_getoptions(winid).title)
1698
1699 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001700endfunc
1701
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001702func Test_popup_close_callback()
1703 func PopupDone(id, result)
1704 let g:result = a:result
1705 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001706 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001707 redraw
1708 call popup_close(winid, 'done')
1709 call assert_equal('done', g:result)
1710endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001711
1712func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001713 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001714 redraw
1715 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001716 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001717 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001718 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001719
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001720 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001721 redraw
1722 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001723 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001724 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001725 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001726endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001727
1728func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001729 CheckScreendump
1730
Bram Moolenaar988c4332019-06-02 14:12:11 +02001731 " +-----------------------------+
1732 " | | |
1733 " | | |
1734 " | | |
1735 " | line1 |
1736 " |------------line2------------|
1737 " | line3 |
1738 " | line4 |
1739 " | |
1740 " | |
1741 " +-----------------------------+
1742 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001743 split
1744 vsplit
1745 let info_window1 = getwininfo()[0]
1746 let line = info_window1['height']
1747 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001748 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001749 \ line : line,
1750 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001751 \ })
1752 END
1753 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001754 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001755 call term_sendkeys(buf, "\<C-W>w")
1756 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1757
1758 " clean up
1759 call StopVimInTerminal(buf)
1760 call delete('XtestPopupBehind')
1761endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001762
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001763func s:VerifyPosition(p, msg, line, col, width, height)
1764 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1765 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1766 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1767 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001768endfunc
1769
1770func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001771 " Anything placed past the last cell on the right of the screen is moved to
1772 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001773 "
1774 " When wrapping is disabled, we also shift to the left to display on the
1775 " screen, unless fixed is set.
1776
1777 " Entries for cases which don't vary based on wrapping.
1778 " Format is per tests described below
1779 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001780 \ ['a', 5, &columns, 5, &columns, 1, 1],
1781 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1782 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001783 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001784 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001785
1786 " these test groups are dicts with:
1787 " - comment: something to identify the group of tests by
1788 " - options: dict of options to merge with the row/col in tests
1789 " - tests: list of cases. Each one is a list with elements:
1790 " - text
1791 " - row
1792 " - col
1793 " - expected row
1794 " - expected col
1795 " - expected width
1796 " - expected height
1797 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001798 \ #{
1799 \ comment: 'left-aligned with wrapping',
1800 \ options: #{
1801 \ wrap: 1,
1802 \ pos: 'botleft',
1803 \ },
1804 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001805 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1806 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1807 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1808 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1809 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1810 \
1811 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1812 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1813 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1814 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1815 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1816 \
1817 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1818 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1819 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001820 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1821 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001822 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001823 \ ],
1824 \ },
1825 \ #{
1826 \ comment: 'left aligned without wrapping',
1827 \ options: #{
1828 \ wrap: 0,
1829 \ pos: 'botleft',
1830 \ },
1831 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001832 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1833 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1834 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1835 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1836 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1837 \
1838 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1839 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1840 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1841 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1842 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1843 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001844 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1845 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1846 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1847 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1848 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1849 \ ],
1850 \ },
1851 \ #{
1852 \ comment: 'left aligned with fixed position',
1853 \ options: #{
1854 \ wrap: 0,
1855 \ fixed: 1,
1856 \ pos: 'botleft',
1857 \ },
1858 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001859 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1860 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1861 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1862 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1863 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1864 \
1865 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1866 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1867 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1868 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1869 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1870 \
1871 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1872 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1873 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001874 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1875 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1876 \ ],
1877 \ },
1878 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001879
1880 for test_group in tests
1881 for test in test_group.tests
1882 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001883 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001884 \ line: line,
1885 \ col: col,
1886 \ }
1887 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001888
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001889 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001890
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001891 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001892 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
1893 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001894 endfor
1895 endfor
1896
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001897 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001898 %bwipe!
1899endfunc
1900
Bram Moolenaar3397f742019-06-02 18:40:06 +02001901func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001902 " width of screen
1903 let X = join(map(range(&columns), {->'X'}), '')
1904
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001905 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1906 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001907
1908 redraw
1909 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1910 call assert_equal(X, line)
1911
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001912 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001913 redraw
1914
1915 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001916 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
1917 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001918
1919 redraw
1920 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1921 call assert_equal(X, line)
1922
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001923 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001924 redraw
1925
1926 " Extend so > window width
1927 let X .= 'x'
1928
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001929 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1930 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001931
1932 redraw
1933 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1934 call assert_equal(X[ : -2 ], line)
1935
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001936 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001937 redraw
1938
1939 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001940 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
1941 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001942
1943 redraw
1944 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1945 call assert_equal(X[ : -2 ], line)
1946
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001947 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001948 redraw
1949
1950 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001951 let p = popup_create(X,
1952 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
1953 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001954
1955 redraw
1956 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1957 let e_line = ' ' . X[ 1 : -2 ]
1958 call assert_equal(e_line, line)
1959
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001960 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001961 redraw
1962
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001963 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001964 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02001965endfunc
1966
1967func Test_popup_moved()
1968 new
1969 call test_override('char_avail', 1)
1970 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
1971
1972 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001973 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001974 redraw
1975 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001976 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001977 " trigger the check for last_cursormoved by going into insert mode
1978 call feedkeys("li\<Esc>", 'xt')
1979 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001980 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02001981
1982 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001983 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001984 redraw
1985 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001986 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001987 call feedkeys("hi\<Esc>", 'xt')
1988 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001989 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02001990
1991 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001992 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02001993 redraw
1994 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001995 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02001996 call feedkeys("li\<Esc>", 'xt')
1997 call assert_equal(1, popup_getpos(winid).visible)
1998 call feedkeys("ei\<Esc>", 'xt')
1999 call assert_equal(1, popup_getpos(winid).visible)
2000 call feedkeys("eli\<Esc>", 'xt')
2001 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002002 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002003
Bram Moolenaar17627312019-06-02 19:53:44 +02002004 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002005 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002006 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002007 redraw
2008 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002009 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002010 call feedkeys("eli\<Esc>", 'xt')
2011 call assert_equal(1, popup_getpos(winid).visible)
2012 call feedkeys("wi\<Esc>", 'xt')
2013 call assert_equal(1, popup_getpos(winid).visible)
2014 call feedkeys("Eli\<Esc>", 'xt')
2015 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002016 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002017
2018 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002019 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002020 redraw
2021 call assert_equal(1, popup_getpos(winid).visible)
2022 call feedkeys("eli\<Esc>", 'xt')
2023 call feedkeys("ei\<Esc>", 'xt')
2024 call assert_equal(1, popup_getpos(winid).visible)
2025 call feedkeys("eli\<Esc>", 'xt')
2026 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002027 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002028
2029 bwipe!
2030 call test_override('ALL', 0)
2031endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002032
2033func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002034 CheckFeature timers
2035 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002036
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002037 let lines =<< trim END
2038 call setline(1, range(1, 20))
2039 hi Notification ctermbg=lightblue
2040 call popup_notification('first notification', {})
2041 END
2042 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002043 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002044 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2045
2046 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002047 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2048 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002049 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2050
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002051 " clean up
2052 call StopVimInTerminal(buf)
2053 call delete('XtestNotifications')
2054endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002055
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002056func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002057 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002058
2059 let lines =<< trim END
2060 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002061 hi ScrollThumb ctermbg=blue
2062 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002063 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002064 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002065 \ minwidth: 8,
2066 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002067 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002068 func ScrollUp()
2069 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2070 endfunc
2071 func ScrollDown()
2072 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2073 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002074 func ClickTop()
2075 call feedkeys("\<F4>\<LeftMouse>", "xt")
2076 endfunc
2077 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002078 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002079 call feedkeys("\<F5>\<LeftMouse>", "xt")
2080 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002081 func Popup_filter(winid, key)
2082 if a:key == 'j'
2083 let line = popup_getoptions(a:winid).firstline
2084 let nlines = line('$', a:winid)
2085 let newline = line < nlines ? (line + 1) : nlines
2086 call popup_setoptions(a:winid, #{firstline: newline})
2087 return v:true
2088 elseif a:key == 'x'
2089 call popup_close(a:winid)
2090 return v:true
2091 endif
2092 endfunc
2093
2094 func PopupScroll()
2095 call popup_clear()
2096 let text =<< trim END
2097 1
2098 2
2099 3
2100 4
2101 long line long line long line long line long line long line
2102 long line long line long line long line long line long line
2103 long line long line long line long line long line long line
2104 END
2105 call popup_create(text, #{
2106 \ minwidth: 30,
2107 \ maxwidth: 30,
2108 \ minheight: 4,
2109 \ maxheight: 4,
2110 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +01002111 \ lastline: 4,
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002112 \ wrap: v:true,
2113 \ scrollbar: v:true,
2114 \ mapping: v:false,
2115 \ filter: funcref('Popup_filter')
2116 \ })
2117 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002118 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002119 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2120 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002121 END
2122 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002123 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002124 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2125
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002126 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002127 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002128 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2129
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002130 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002131 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002132 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2133
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002134 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002135 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002136 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2137
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002138 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002139 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002140 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2141 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2142
2143 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2144 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2145
2146 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002147 " wait a bit, otherwise it fails sometimes (double click recognized?)
2148 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002149 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2150 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2151
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002152 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2153 sleep 100m
2154 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2155 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2156
2157 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2158 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2159
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002160 " remove the minwidth and maxheight
2161 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002162 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002163 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2164
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002165 " check size with non-wrapping lines
2166 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2167 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2168
2169 " check size with wrapping lines
2170 call term_sendkeys(buf, "j")
2171 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002172
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002173 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002174 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002175 call StopVimInTerminal(buf)
2176 call delete('XtestPopupScroll')
2177endfunc
2178
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002179func Test_popup_too_high_scrollbar()
2180 CheckScreendump
2181
2182 let lines =<< trim END
2183 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2184 set scrolloff=0
2185 func ShowPopup()
2186 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2187 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2188 \ minwidth: 8,
2189 \ border: [],
2190 \ })
2191 endfunc
2192 normal 3G$
2193 call ShowPopup()
2194 END
2195 call writefile(lines, 'XtestPopupToohigh')
2196 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2197 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2198
2199 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2200 call term_sendkeys(buf, "8G$")
2201 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2202 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2203
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002204 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2205 call term_sendkeys(buf, "gg$")
2206 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2207 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2208
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002209 " clean up
2210 call StopVimInTerminal(buf)
2211 call delete('XtestPopupToohigh')
2212endfunc
2213
Bram Moolenaar437a7462019-07-05 20:17:22 +02002214func Test_popup_fitting_scrollbar()
2215 " this was causing a crash, divide by zero
2216 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002217 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002218 \ scrollbar: 1,
2219 \ maxwidth: 10,
2220 \ maxheight: 5,
2221 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002222 redraw
2223 call popup_clear()
2224endfunc
2225
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002226func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002227 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002228
2229 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002230 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002231 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002232 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002233 END
2234
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002235 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002236 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002237 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2238
2239 " Setting to empty string clears it
2240 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2241 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2242
2243 " Setting a list
2244 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2245 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2246
2247 " Shrinking with a list
2248 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2249 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2250
2251 " Growing with a list
2252 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2253 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2254
2255 " Empty list clears
2256 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2257 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2258
2259 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002260 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002261 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2262
Bram Moolenaarb0992022020-01-30 14:55:42 +01002263 " range() (doesn't work)
2264 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2265 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2266
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002267 " clean up
2268 call StopVimInTerminal(buf)
2269 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002270endfunc
2271
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002272func Test_popup_settext_getline()
2273 let id = popup_create('', #{ tabpage: 0 })
2274 call popup_settext(id, ['a','b'])
2275 call assert_equal(2, line('$', id)) " OK :)
2276 call popup_close(id)
2277
2278 let id = popup_create('', #{ tabpage: -1 })
2279 call popup_settext(id, ['a','b'])
2280 call assert_equal(2, line('$', id)) " Fails :(
2281 call popup_close(id)
2282endfunc
2283
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002284func Test_popup_hidden()
2285 new
2286
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002287 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002288 redraw
2289 call assert_equal(0, popup_getpos(winid).visible)
2290 call popup_close(winid)
2291
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002292 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002293 redraw
2294 call assert_equal(0, popup_getpos(winid).visible)
2295 call popup_close(winid)
2296
2297 func QuitCallback(id, res)
2298 let s:cb_winid = a:id
2299 let s:cb_res = a:res
2300 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002301 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002302 \ filter: 'popup_filter_yesno',
2303 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002304 \ })
2305 redraw
2306 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002307 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2308 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002309 exe "normal anot used by filter\<Esc>"
2310 call assert_equal('not used by filter', getline(1))
2311
2312 call popup_show(winid)
2313 call feedkeys('y', "xt")
2314 call assert_equal(1, s:cb_res)
2315
2316 bwipe!
2317 delfunc QuitCallback
2318endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002319
2320" Test options not checked elsewhere
2321func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002322 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002323 let options = popup_getoptions(winid)
2324 call assert_equal(1, options.wrap)
2325 call assert_equal(0, options.drag)
2326 call assert_equal('Beautiful', options.highlight)
2327
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002328 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002329 let options = popup_getoptions(winid)
2330 call assert_equal(0, options.wrap)
2331 call assert_equal(1, options.drag)
2332 call assert_equal('Another', options.highlight)
2333
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002334 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2335 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2336
Bram Moolenaarae943152019-06-16 22:54:14 +02002337 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002338 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002339endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002340
2341func Test_popupwin_garbage_collect()
2342 func MyPopupFilter(x, winid, c)
2343 " NOP
2344 endfunc
2345
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002346 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002347 call test_garbagecollect_now()
2348 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002349 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002350 call feedkeys('j', 'xt')
2351 call assert_true(v:true)
2352
2353 call popup_close(winid)
2354 delfunc MyPopupFilter
2355endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002356
Bram Moolenaar581ba392019-09-03 22:08:33 +02002357func Test_popupwin_filter_mode()
2358 func MyPopupFilter(winid, c)
2359 let s:typed = a:c
2360 if a:c == ':' || a:c == "\r" || a:c == 'v'
2361 " can start cmdline mode, get out, and start/stop Visual mode
2362 return 0
2363 endif
2364 return 1
2365 endfunc
2366
2367 " Normal, Visual and Insert mode
2368 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2369 redraw
2370 call feedkeys('x', 'xt')
2371 call assert_equal('x', s:typed)
2372
2373 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2374 call assert_equal(':', s:typed)
2375 call assert_equal('foo', g:foo)
2376
2377 let @x = 'something'
2378 call feedkeys('v$"xy', 'xt')
2379 call assert_equal('y', s:typed)
2380 call assert_equal('something', @x) " yank command is filtered out
2381 call feedkeys('v', 'xt') " end Visual mode
2382
2383 call popup_close(winid)
2384
2385 " only Normal mode
2386 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2387 redraw
2388 call feedkeys('x', 'xt')
2389 call assert_equal('x', s:typed)
2390
2391 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2392 call assert_equal(':', s:typed)
2393 call assert_equal('foo', g:foo)
2394
2395 let @x = 'something'
2396 call feedkeys('v$"xy', 'xt')
2397 call assert_equal('v', s:typed)
2398 call assert_notequal('something', @x)
2399
2400 call popup_close(winid)
2401
2402 " default: all modes
2403 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2404 redraw
2405 call feedkeys('x', 'xt')
2406 call assert_equal('x', s:typed)
2407
2408 let g:foo = 'bar'
2409 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2410 call assert_equal("\r", s:typed)
2411 call assert_equal('bar', g:foo)
2412
2413 let @x = 'something'
2414 call feedkeys('v$"xy', 'xt')
2415 call assert_equal('y', s:typed)
2416 call assert_equal('something', @x) " yank command is filtered out
2417 call feedkeys('v', 'xt') " end Visual mode
2418
2419 call popup_close(winid)
2420 delfunc MyPopupFilter
2421endfunc
2422
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002423func Test_popupwin_filter_mouse()
2424 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002425 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002426 return 0
2427 endfunc
2428
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002429 call setline(1, ['.'->repeat(25)]->repeat(10))
2430 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2431 \ line: 2,
2432 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002433 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002434 \ padding: [],
2435 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002436 \ filter: 'MyPopupFilter',
2437 \ })
2438 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002439 " 123456789012345678901
2440 " 1 .....................
2441 " 2 ...+--------------+..
2442 " 3 ...| |..
2443 " 4 ...| short |..
2444 " 5 ...| long line th |..
2445 " 6 ...| at will wrap |..
2446 " 7 ...| other |..
2447 " 8 ...| |..
2448 " 9 ...+--------------+..
2449 " 10 .....................
2450 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002451
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002452 func AddItemOutsidePopup(tests, row, col)
2453 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2454 \ screenrow: a:row, screencol: a:col,
2455 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2456 \ line: a:row, column: a:col,
2457 \ }})
2458 endfunc
2459 func AddItemInPopupBorder(tests, winid, row, col)
2460 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2461 \ screenrow: a:row, screencol: a:col,
2462 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2463 \ line: 0, column: 0,
2464 \ }})
2465 endfunc
2466 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2467 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2468 \ screenrow: a:row, screencol: a:col,
2469 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2470 \ line: a:textline, column: a:textcol,
2471 \ }})
2472 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002473
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002474 " above and below popup
2475 for c in range(1, 21)
2476 call AddItemOutsidePopup(tests, 1, c)
2477 call AddItemOutsidePopup(tests, 10, c)
2478 endfor
2479 " left and right of popup
2480 for r in range(1, 10)
2481 call AddItemOutsidePopup(tests, r, 3)
2482 call AddItemOutsidePopup(tests, r, 20)
2483 endfor
2484 " top and bottom in popup
2485 for c in range(4, 19)
2486 call AddItemInPopupBorder(tests, winid, 2, c)
2487 call AddItemInPopupBorder(tests, winid, 3, c)
2488 call AddItemInPopupBorder(tests, winid, 8, c)
2489 call AddItemInPopupBorder(tests, winid, 9, c)
2490 endfor
2491 " left and right margin in popup
2492 for r in range(2, 9)
2493 call AddItemInPopupBorder(tests, winid, r, 4)
2494 call AddItemInPopupBorder(tests, winid, r, 5)
2495 call AddItemInPopupBorder(tests, winid, r, 18)
2496 call AddItemInPopupBorder(tests, winid, r, 19)
2497 endfor
2498 " text "short"
2499 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2500 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2501 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2502 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2503 " text "long line th"
2504 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2505 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2506 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2507 " text "at will wrap"
2508 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2509 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2510 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2511 " text "other"
2512 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2513 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2514 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2515 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002516
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002517 for item in tests
2518 call test_setmouse(item.clickrow, item.clickcol)
2519 call feedkeys("\<LeftMouse>", 'xt')
2520 call assert_equal(item.result, g:got_mousepos)
2521 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002522
2523 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002524 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002525 delfunc MyPopupFilter
2526endfunc
2527
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002528func Test_popupwin_with_buffer()
2529 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2530 let buf = bufadd('XsomeFile')
2531 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002532
2533 setlocal number
2534 call setbufvar(buf, "&wrapmargin", 13)
2535
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002536 let winid = popup_create(buf, {})
2537 call assert_notequal(0, winid)
2538 let pos = popup_getpos(winid)
2539 call assert_equal(2, pos.height)
2540 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002541
2542 " window-local option is set to default, buffer-local is not
2543 call assert_equal(0, getwinvar(winid, '&number'))
2544 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2545
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002546 call popup_close(winid)
2547 call assert_equal({}, popup_getpos(winid))
2548 call assert_equal(1, bufloaded(buf))
2549 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002550 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002551
2552 edit test_popupwin.vim
2553 let winid = popup_create(bufnr(''), {})
2554 redraw
2555 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002556 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002557endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002558
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002559func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002560 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002561 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002562 " Starting a terminal to run a shell in is considered flaky.
2563 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002564
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002565 let origwin = win_getid()
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002566 let termbuf = term_start(&shell, #{hidden: 1})
2567 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10})
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002568 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002569 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002570 sleep 100m
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002571 " Check this doesn't crash
2572 call assert_equal(winnr(), winnr('j'))
2573 call assert_equal(winnr(), winnr('k'))
2574 call assert_equal(winnr(), winnr('h'))
2575 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002576
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002577 " Cannot quit while job is running
2578 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002579
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002580 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002581 call feedkeys("xxx\<C-W>N", 'xt')
2582 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2583 call feedkeys("a\<C-U>", 'xt')
2584
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002585 " Cannot escape from terminal window
2586 call assert_fails('tab drop xxx', 'E863:')
2587
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002588 " Cannot open a second one.
2589 let termbuf2 = term_start(&shell, #{hidden: 1})
2590 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2591 call term_sendkeys(termbuf2, "exit\<CR>")
2592
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002593 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002594 call feedkeys("exit\<CR>", 'xt')
2595 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002596 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002597
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002598 call feedkeys(":quit\<CR>", 'xt')
2599 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002600endfunc
2601
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002602func Test_popupwin_close_prevwin()
2603 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002604 call Popupwin_close_prevwin()
2605endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002606
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002607def Popupwin_close_prevwin()
2608 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002609 split
2610 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002611 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002612 let buf = term_start(&shell, #{hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002613 popup_create(buf, {})
2614 TermWait(buf, 100)
2615 popup_clear(true)
2616 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002617
2618 quit
2619 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002620enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002621
Bram Moolenaar934470e2019-09-01 23:27:05 +02002622func Test_popupwin_with_buffer_and_filter()
2623 new Xwithfilter
2624 call setline(1, range(100))
2625 let bufnr = bufnr()
2626 hide
2627
2628 func BufferFilter(win, key)
2629 if a:key == 'G'
2630 " recursive use of "G" does not cause problems.
2631 call win_execute(a:win, 'normal! G')
2632 return 1
2633 endif
2634 return 0
2635 endfunc
2636
2637 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2638 call assert_equal(1, popup_getpos(winid).firstline)
2639 redraw
2640 call feedkeys("G", 'xt')
2641 call assert_equal(99, popup_getpos(winid).firstline)
2642
2643 call popup_close(winid)
2644 exe 'bwipe! ' .. bufnr
2645endfunc
2646
Bram Moolenaare296e312019-07-03 23:20:18 +02002647func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002648 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002649 \ maxwidth: 40,
2650 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002651 \ })
2652 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002653 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002654 redraw
2655 call assert_equal(19, popup_getpos(winid).width)
2656 endfor
2657 call popup_clear()
2658endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002659
2660func Test_popupwin_buf_close()
2661 let buf = bufadd('Xtestbuf')
2662 call bufload(buf)
2663 call setbufline(buf, 1, ['just', 'some', 'lines'])
2664 let winid = popup_create(buf, {})
2665 redraw
2666 call assert_equal(3, popup_getpos(winid).height)
2667 let bufinfo = getbufinfo(buf)[0]
2668 call assert_equal(1, bufinfo.changed)
2669 call assert_equal(0, bufinfo.hidden)
2670 call assert_equal(0, bufinfo.listed)
2671 call assert_equal(1, bufinfo.loaded)
2672 call assert_equal([], bufinfo.windows)
2673 call assert_equal([winid], bufinfo.popups)
2674
2675 call popup_close(winid)
2676 call assert_equal({}, popup_getpos(winid))
2677 let bufinfo = getbufinfo(buf)[0]
2678 call assert_equal(1, bufinfo.changed)
2679 call assert_equal(1, bufinfo.hidden)
2680 call assert_equal(0, bufinfo.listed)
2681 call assert_equal(1, bufinfo.loaded)
2682 call assert_equal([], bufinfo.windows)
2683 call assert_equal([], bufinfo.popups)
2684 exe 'bwipe! ' .. buf
2685endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002686
2687func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002688 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002689
2690 let lines =<< trim END
2691 call setline(1, range(1, 10))
2692 hi ScrollThumb ctermbg=blue
2693 hi ScrollBar ctermbg=red
2694 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002695 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002696 \ maxwidth: 10,
2697 \ maxheight: 3,
2698 \ pos : 'topleft',
2699 \ col : a:col,
2700 \ line : a:line,
2701 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002702 \ })
2703 endfunc
2704 call PopupMenu(['x'], 1, 1)
2705 call PopupMenu(['123456789|'], 1, 16)
2706 call PopupMenu(['123456789|' .. ' '], 7, 1)
2707 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2708 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2709 END
2710 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002711 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002712 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2713
2714 " close the menu popupwin.
2715 call term_sendkeys(buf, " ")
2716 call term_sendkeys(buf, " ")
2717 call term_sendkeys(buf, " ")
2718 call term_sendkeys(buf, " ")
2719 call term_sendkeys(buf, " ")
2720
2721 " clean up
2722 call StopVimInTerminal(buf)
2723 call delete('XtestPopupMenuMaxWidth')
2724endfunc
2725
Bram Moolenaara901a372019-07-13 16:38:50 +02002726func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002727 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002728
2729 let lines =<< trim END
2730 call setline(1, range(1, 20))
2731 hi ScrollThumb ctermbg=blue
2732 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002733 eval ['one', 'two', 'three', 'four', 'five',
2734 \ 'six', 'seven', 'eight', 'nine']
2735 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002736 \ minwidth: 8,
2737 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002738 \ })
2739 END
2740 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002741 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002742
2743 call term_sendkeys(buf, "j")
2744 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2745
2746 call term_sendkeys(buf, "jjj")
2747 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2748
2749 " if the cursor is the bottom line, it stays at the bottom line.
2750 call term_sendkeys(buf, repeat("j", 20))
2751 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2752
2753 call term_sendkeys(buf, "kk")
2754 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2755
2756 call term_sendkeys(buf, "k")
2757 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2758
2759 " if the cursor is in the top line, it stays in the top line.
2760 call term_sendkeys(buf, repeat("k", 20))
2761 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2762
2763 " close the menu popupwin.
2764 call term_sendkeys(buf, " ")
2765
2766 " clean up
2767 call StopVimInTerminal(buf)
2768 call delete('XtestPopupMenuScroll')
2769endfunc
2770
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002771func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002772 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002773
2774 let lines =<< trim END
2775 function! MyFilter(winid, key) abort
2776 if a:key == "0"
2777 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2778 return 1
2779 endif
2780 if a:key == "G"
2781 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2782 return 1
2783 endif
2784 if a:key == "j"
2785 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2786 return 1
2787 endif
2788 if a:key == "k"
2789 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2790 return 1
2791 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002792 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002793 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002794 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002795 endif
2796 return 0
2797 endfunction
2798 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2799 \ maxheight : 3,
2800 \ filter : 'MyFilter'
2801 \ })
2802 END
2803 call writefile(lines, 'XtestPopupMenuFilter')
2804 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2805
2806 call term_sendkeys(buf, "j")
2807 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2808
2809 call term_sendkeys(buf, "k")
2810 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2811
2812 call term_sendkeys(buf, "G")
2813 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2814
2815 call term_sendkeys(buf, "0")
2816 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2817
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002818 " check that when the popup is closed in the filter the screen is redrawn
2819 call term_sendkeys(buf, ":")
2820 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2821 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002822
2823 " clean up
2824 call StopVimInTerminal(buf)
2825 call delete('XtestPopupMenuFilter')
2826endfunc
2827
2828func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002829 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002830
2831 let winid = popup_create('some text', {})
2832 call assert_equal(0, popup_getoptions(winid).cursorline)
2833 call popup_close(winid)
2834
2835 let winid = popup_create('some text', #{ cursorline: 1, })
2836 call assert_equal(1, popup_getoptions(winid).cursorline)
2837 call popup_close(winid)
2838
2839 let winid = popup_create('some text', #{ cursorline: 0, })
2840 call assert_equal(0, popup_getoptions(winid).cursorline)
2841 call popup_close(winid)
2842
2843 let winid = popup_menu('some text', {})
2844 call assert_equal(1, popup_getoptions(winid).cursorline)
2845 call popup_close(winid)
2846
2847 let winid = popup_menu('some text', #{ cursorline: 1, })
2848 call assert_equal(1, popup_getoptions(winid).cursorline)
2849 call popup_close(winid)
2850
2851 let winid = popup_menu('some text', #{ cursorline: 0, })
2852 call assert_equal(0, popup_getoptions(winid).cursorline)
2853 call popup_close(winid)
2854
2855 " ---------
2856 " Pattern 1
2857 " ---------
2858 let lines =<< trim END
2859 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
2860 END
2861 call writefile(lines, 'XtestPopupCursorLine')
2862 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2863 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
2864 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2865 call StopVimInTerminal(buf)
2866
2867 " ---------
2868 " Pattern 2
2869 " ---------
2870 let lines =<< trim END
2871 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
2872 END
2873 call writefile(lines, 'XtestPopupCursorLine')
2874 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2875 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
2876 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2877 call StopVimInTerminal(buf)
2878
2879 " ---------
2880 " Pattern 3
2881 " ---------
2882 let lines =<< trim END
2883 function! MyFilter(winid, key) abort
2884 if a:key == "j"
2885 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2886 return 1
2887 endif
2888 if a:key == 'x'
2889 call popup_close(a:winid)
2890 return 1
2891 endif
2892 return 0
2893 endfunction
2894 call popup_menu(['111', '222', '333'], #{
2895 \ cursorline : 0,
2896 \ maxheight : 2,
2897 \ filter : 'MyFilter',
2898 \ })
2899 END
2900 call writefile(lines, 'XtestPopupCursorLine')
2901 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2902 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
2903 call term_sendkeys(buf, "j")
2904 call term_sendkeys(buf, "j")
2905 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
2906 call term_sendkeys(buf, "x")
2907 call StopVimInTerminal(buf)
2908
2909 " ---------
2910 " Pattern 4
2911 " ---------
2912 let lines =<< trim END
2913 function! MyFilter(winid, key) abort
2914 if a:key == "j"
2915 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2916 return 1
2917 endif
2918 if a:key == 'x'
2919 call popup_close(a:winid)
2920 return 1
2921 endif
2922 return 0
2923 endfunction
2924 call popup_menu(['111', '222', '333'], #{
2925 \ cursorline : 1,
2926 \ maxheight : 2,
2927 \ filter : 'MyFilter',
2928 \ })
2929 END
2930 call writefile(lines, 'XtestPopupCursorLine')
2931 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2932 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
2933 call term_sendkeys(buf, "j")
2934 call term_sendkeys(buf, "j")
2935 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
2936 call term_sendkeys(buf, "x")
2937 call StopVimInTerminal(buf)
2938
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02002939 " ---------
2940 " Cursor in second line when creating the popup
2941 " ---------
2942 let lines =<< trim END
2943 let winid = popup_create(['111', '222', '333'], #{
2944 \ cursorline : 1,
2945 \ })
2946 call win_execute(winid, "2")
2947 END
2948 call writefile(lines, 'XtestPopupCursorLine')
2949 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2950 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
2951 call StopVimInTerminal(buf)
2952
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002953 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01002954
2955 " ---------
2956 " Use current buffer for popupmenu
2957 " ---------
2958 let lines =<< trim END
2959 call setline(1, ['one', 'two', 'three'])
2960 let winid = popup_create(bufnr('%'), #{
2961 \ cursorline : 1,
2962 \ })
2963 call win_execute(winid, "2")
2964 END
2965 call writefile(lines, 'XtestPopupCursorLine')
2966 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2967 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
2968 call StopVimInTerminal(buf)
2969
2970 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002971endfunc
2972
Bram Moolenaarf914a332019-07-20 15:09:56 +02002973func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002974 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01002975 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002976
Bram Moolenaarf914a332019-07-20 15:09:56 +02002977 call writefile([
2978 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
2979 \ "another\tXtagfile\t/^this is another",
2980 \ "theword\tXtagfile\t/^theword"],
2981 \ 'Xtags')
2982 call writefile(range(1,20)
2983 \ + ['theword is here']
2984 \ + range(22, 27)
2985 \ + ['this is another place']
2986 \ + range(29, 40),
2987 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02002988 call writefile(range(1,10)
2989 \ + ['searched word is here']
2990 \ + range(12, 20),
2991 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02002992 let lines =<< trim END
2993 set tags=Xtags
2994 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002995 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02002996 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002997 \ 'three',
2998 \ 'four',
2999 \ 'five',
3000 \ 'six',
3001 \ 'seven',
3002 \ 'find theword somewhere',
3003 \ 'nine',
3004 \ 'this is another word',
3005 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003006 set previewpopup=height:4,width:40
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003007 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003008 END
3009 call writefile(lines, 'XtestPreviewPopup')
3010 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3011
3012 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3013 call term_sendkeys(buf, ":\<CR>")
3014 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3015
3016 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3017 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3018
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003019 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003020 call term_sendkeys(buf, ":\<CR>")
3021 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3022
3023 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3024 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3025
Bram Moolenaar799439a2020-02-11 21:44:17 +01003026 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003027 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003028 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003029
3030 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003031 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003032 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3033
3034 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3035 call term_sendkeys(buf, ":\<CR>")
3036 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3037
3038 call term_sendkeys(buf, ":pclose\<CR>")
3039 call term_sendkeys(buf, ":psearch searched\<CR>")
3040 call term_sendkeys(buf, ":\<CR>")
3041 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003042
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003043 call term_sendkeys(buf, "\<C-W>p")
3044 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3045
3046 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3047 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3048
Bram Moolenaarf914a332019-07-20 15:09:56 +02003049 call StopVimInTerminal(buf)
3050 call delete('Xtags')
3051 call delete('Xtagfile')
3052 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003053 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003054endfunc
3055
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003056func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003057 let lines =<< trim END
3058 set completeopt+=preview,popup
3059 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003060 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003061
3062 func CompleteFuncDict(findstart, base)
3063 if a:findstart
3064 if col('.') > 10
3065 return col('.') - 10
3066 endif
3067 return 0
3068 endif
3069
3070 return {
3071 \ 'words': [
3072 \ {
3073 \ 'word': 'aword',
3074 \ 'abbr': 'wrd',
3075 \ 'menu': 'extra text',
3076 \ 'info': 'words are cool',
3077 \ 'kind': 'W',
3078 \ 'user_data': 'test'
3079 \ },
3080 \ {
3081 \ 'word': 'anotherword',
3082 \ 'abbr': 'anotwrd',
3083 \ 'menu': 'extra text',
3084 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3085 \ 'kind': 'W',
3086 \ 'user_data': 'notest'
3087 \ },
3088 \ {
3089 \ 'word': 'noinfo',
3090 \ 'abbr': 'noawrd',
3091 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003092 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003093 \ 'kind': 'W',
3094 \ 'user_data': 'notest'
3095 \ },
3096 \ {
3097 \ 'word': 'thatword',
3098 \ 'abbr': 'thatwrd',
3099 \ 'menu': 'extra text',
3100 \ 'info': 'that word is cool',
3101 \ 'kind': 'W',
3102 \ 'user_data': 'notest'
3103 \ },
3104 \ ]
3105 \ }
3106 endfunc
3107 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003108 func ChangeColor()
3109 let id = popup_findinfo()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003110 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003111 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003112
3113 func InfoHidden()
3114 set completepopup=height:4,border:off,align:menu
3115 set completeopt-=popup completeopt+=popuphidden
3116 au CompleteChanged * call HandleChange()
3117 endfunc
3118
3119 let s:counter = 0
3120 func HandleChange()
3121 let s:counter += 1
3122 let selected = complete_info(['selected']).selected
3123 if selected <= 0
3124 " First time: do nothing, info remains hidden
3125 return
3126 endif
3127 if selected == 1
3128 " Second time: show info right away
3129 let id = popup_findinfo()
3130 if id
3131 call popup_settext(id, 'immediate info ' .. s:counter)
3132 call popup_show(id)
3133 endif
3134 else
3135 " Third time: show info after a short delay
3136 call timer_start(100, 'ShowInfo')
3137 endif
3138 endfunc
3139
3140 func ShowInfo(...)
3141 let id = popup_findinfo()
3142 if id
3143 call popup_settext(id, 'async info ' .. s:counter)
3144 call popup_show(id)
3145 endif
3146 endfunc
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003147 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003148 return lines
3149endfunc
3150
3151func Test_popupmenu_info_border()
3152 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003153 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003154
3155 let lines = Get_popupmenu_lines()
3156 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003157 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003158
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003159 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003160 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003161
3162 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3163 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3164
3165 call term_sendkeys(buf, "\<C-N>")
3166 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3167
3168 call term_sendkeys(buf, "\<C-N>")
3169 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3170
3171 call term_sendkeys(buf, "\<C-N>\<C-N>")
3172 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3173
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003174 " info on the left with scrollbar
3175 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3176 call term_sendkeys(buf, "\<C-N>\<C-N>")
3177 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3178
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003179 " Test that the popupmenu's scrollbar and infopopup do not overlap
3180 call term_sendkeys(buf, "\<Esc>")
3181 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3182 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3183 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3184
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003185 " Hide the info popup, cycle trough buffers, make sure it didn't get
3186 " deleted.
3187 call term_sendkeys(buf, "\<Esc>")
3188 call term_sendkeys(buf, ":set hidden\<CR>")
3189 call term_sendkeys(buf, ":bn\<CR>")
3190 call term_sendkeys(buf, ":bn\<CR>")
3191 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3192 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3193
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003194 " Test that when the option is changed the popup changes.
3195 call term_sendkeys(buf, "\<Esc>")
3196 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3197 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3198 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3199
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003200 call term_sendkeys(buf, " \<Esc>")
3201 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3202 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3203 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3204
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003205 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003206 call StopVimInTerminal(buf)
3207 call delete('XtestInfoPopup')
3208endfunc
3209
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003210func Test_popupmenu_info_noborder()
3211 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003212 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003213
3214 let lines = Get_popupmenu_lines()
3215 call add(lines, 'set completepopup=height:4,border:off')
3216 call writefile(lines, 'XtestInfoPopupNb')
3217
3218 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003219 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003220
3221 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3222 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3223
3224 call StopVimInTerminal(buf)
3225 call delete('XtestInfoPopupNb')
3226endfunc
3227
Bram Moolenaar258cef52019-08-21 17:29:29 +02003228func Test_popupmenu_info_align_menu()
3229 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003230 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003231
3232 let lines = Get_popupmenu_lines()
3233 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3234 call writefile(lines, 'XtestInfoPopupNb')
3235
3236 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003237 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003238
3239 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3240 call term_sendkeys(buf, "\<C-N>")
3241 call term_sendkeys(buf, "\<C-N>")
3242 call term_sendkeys(buf, "\<C-N>")
3243 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3244
3245 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3246 call term_sendkeys(buf, "\<C-N>")
3247 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3248
3249 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003250 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003251 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3252 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3253 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3254
3255 call StopVimInTerminal(buf)
3256 call delete('XtestInfoPopupNb')
3257endfunc
3258
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003259func Test_popupmenu_info_hidden()
3260 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003261 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003262
3263 let lines = Get_popupmenu_lines()
3264 call add(lines, 'call InfoHidden()')
3265 call writefile(lines, 'XtestInfoPopupHidden')
3266
3267 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003268 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003269
3270 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3271 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3272
3273 call term_sendkeys(buf, "\<C-N>")
3274 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3275
3276 call term_sendkeys(buf, "\<C-N>")
3277 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3278
3279 call term_sendkeys(buf, "\<Esc>")
3280 call StopVimInTerminal(buf)
3281 call delete('XtestInfoPopupHidden')
3282endfunc
3283
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003284func Test_popupmenu_info_too_wide()
3285 CheckScreendump
3286 CheckFeature quickfix
3287
3288 let lines =<< trim END
3289 call setline(1, range(10))
3290
3291 set completeopt+=preview,popup
3292 set completepopup=align:menu
3293 set omnifunc=OmniFunc
3294 hi InfoPopup ctermbg=lightgrey
3295
3296 func OmniFunc(findstart, base)
3297 if a:findstart
3298 return 0
3299 endif
3300
3301 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3302 return #{
3303 \ words: [
3304 \ #{
3305 \ word: 'scrap',
3306 \ menu: menuText,
3307 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3308 \ },
3309 \ #{
3310 \ word: 'scappier',
3311 \ menu: menuText,
3312 \ info: 'words are cool',
3313 \ },
3314 \ #{
3315 \ word: 'scrappier2',
3316 \ menu: menuText,
3317 \ info: 'words are cool',
3318 \ },
3319 \ ]
3320 \ }
3321 endfunc
3322 END
3323
3324 call writefile(lines, 'XtestInfoPopupWide')
3325 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003326 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003327
3328 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3329 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3330
3331 call term_sendkeys(buf, "\<Esc>")
3332 call StopVimInTerminal(buf)
3333 call delete('XtestInfoPopupWide')
3334endfunc
3335
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003336func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003337 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003338 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003339 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003340 call assert_equal(bufnr, winbufnr(winid))
3341 call popup_clear()
3342endfunc
3343
Bram Moolenaar1824f452019-10-02 23:06:46 +02003344func Test_popupwin_getoptions_tablocal()
3345 topleft split
3346 let win1 = popup_create('nothing', #{maxheight: 8})
3347 let win2 = popup_create('something', #{maxheight: 10})
3348 let win3 = popup_create('something', #{maxheight: 15})
3349 call assert_equal(8, popup_getoptions(win1).maxheight)
3350 call assert_equal(10, popup_getoptions(win2).maxheight)
3351 call assert_equal(15, popup_getoptions(win3).maxheight)
3352 call popup_clear()
3353 quit
3354endfunc
3355
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003356func Test_popupwin_cancel()
3357 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3358 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3359 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3360 call assert_equal(5, popup_getpos(win1).line)
3361 call assert_equal(10, popup_getpos(win2).line)
3362 call assert_equal(15, popup_getpos(win3).line)
3363 " TODO: this also works without patch 8.1.2110
3364 call feedkeys("\<C-C>", 'xt')
3365 call assert_equal(5, popup_getpos(win1).line)
3366 call assert_equal(10, popup_getpos(win2).line)
3367 call assert_equal({}, popup_getpos(win3))
3368 call feedkeys("\<C-C>", 'xt')
3369 call assert_equal(5, popup_getpos(win1).line)
3370 call assert_equal({}, popup_getpos(win2))
3371 call assert_equal({}, popup_getpos(win3))
3372 call feedkeys("\<C-C>", 'xt')
3373 call assert_equal({}, popup_getpos(win1))
3374 call assert_equal({}, popup_getpos(win2))
3375 call assert_equal({}, popup_getpos(win3))
3376endfunc
3377
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003378func Test_popupwin_filter_redraw()
3379 " Create two popups with a filter that closes the popup when typing "0".
3380 " Both popups should close, even though the redraw also calls
3381 " popup_reset_handled()
3382
3383 func CloseFilter(winid, key)
3384 if a:key == '0'
3385 call popup_close(a:winid)
3386 redraw
3387 endif
3388 return 0 " pass the key
3389 endfunc
3390
3391 let id1 = popup_create('first one', #{
3392 \ line: 1,
3393 \ col: 1,
3394 \ filter: 'CloseFilter',
3395 \ })
3396 let id2 = popup_create('second one', #{
3397 \ line: 9,
3398 \ col: 1,
3399 \ filter: 'CloseFilter',
3400 \ })
3401 call assert_equal(1, popup_getpos(id1).line)
3402 call assert_equal(9, popup_getpos(id2).line)
3403
3404 call feedkeys('0', 'xt')
3405 call assert_equal({}, popup_getpos(id1))
3406 call assert_equal({}, popup_getpos(id2))
3407
3408 call popup_clear()
3409 delfunc CloseFilter
3410endfunc
3411
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003412func Test_popupwin_double_width()
3413 CheckScreendump
3414
3415 let lines =<< trim END
3416 call setline(1, 'x你好世界你好世你好世界你好')
3417 call setline(2, '你好世界你好世你好世界你好')
3418 call setline(3, 'x你好世界你好世你好世界你好')
3419 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3420 END
3421 call writefile(lines, 'XtestPopupWide')
3422
3423 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3424 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3425
3426 call StopVimInTerminal(buf)
3427 call delete('XtestPopupWide')
3428endfunc
3429
3430func Test_popupwin_sign()
3431 CheckScreendump
3432
3433 let lines =<< trim END
3434 call setline(1, range(10))
3435 call sign_define('Current', {
3436 \ 'text': '>>',
3437 \ 'texthl': 'WarningMsg',
3438 \ 'linehl': 'Error',
3439 \ })
3440 call sign_define('Other', {
3441 \ 'text': '#!',
3442 \ 'texthl': 'Error',
3443 \ 'linehl': 'Search',
3444 \ })
3445 let winid = popup_create(['hello', 'bright', 'world'], {
3446 \ 'minwidth': 20,
3447 \ })
3448 call setwinvar(winid, "&signcolumn", "yes")
3449 let winbufnr = winbufnr(winid)
3450
3451 " add sign to current buffer, shows
3452 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3453 " add sign to current buffer, does not show
3454 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3455
3456 " add sign to popup buffer, shows
3457 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3458 " add sign to popup buffer, does not show
3459 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003460
3461 func SetOptions()
3462 call setwinvar(g:winid, '&number', 1)
3463 call setwinvar(g:winid, '&foldcolumn', 2)
3464 call popup_settext(g:winid, 'a longer line to check the width')
3465 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003466 END
3467 call writefile(lines, 'XtestPopupSign')
3468
3469 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3470 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3471
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003472 " set more options to check the width is adjusted
3473 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3474 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3475
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003476 call StopVimInTerminal(buf)
3477 call delete('XtestPopupSign')
3478endfunc
3479
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003480func Test_popupwin_bufnr()
3481 let popwin = popup_create(['blah'], #{})
3482 let popbuf = winbufnr(popwin)
3483 split asdfasdf
3484 let newbuf = bufnr()
3485 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3486 call assert_equal(newbuf, bufnr('$'))
3487 call popup_clear()
3488 let popwin = popup_create(['blah'], #{})
3489 " reuses previous buffer number
3490 call assert_equal(popbuf, winbufnr(popwin))
3491 call assert_equal(newbuf, bufnr('$'))
3492
3493 call popup_clear()
3494 bwipe!
3495endfunc
3496
Bram Moolenaarec084d32020-02-28 22:44:47 +01003497func Test_popupwin_filter_input_multibyte()
3498 func MyPopupFilter(winid, c)
3499 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3500 return 0
3501 endfunc
3502 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3503
3504 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3505 call feedkeys("\u3000", 'xt')
3506 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3507
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003508 " UTF-8: E3 80 9B, including CSI(0x9B)
3509 call feedkeys("\u301b", 'xt')
3510 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003511
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003512 if has('unix')
3513 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003514 if has('gui_running')
3515 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3516 else
3517 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3518 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003519 call assert_equal([0xc3, 0x81], g:bytes)
3520 endif
3521
Bram Moolenaarec084d32020-02-28 22:44:47 +01003522 call popup_clear()
3523 delfunc MyPopupFilter
3524 unlet g:bytes
3525endfunc
3526
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003527func Test_popupwin_filter_close_ctrl_c()
3528 CheckScreendump
3529
3530 let lines =<< trim END
3531 vsplit
3532 set laststatus=2
3533 set statusline=%!Statusline()
3534
3535 function Statusline() abort
3536 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3537 endfunction
3538
3539 call popup_create('test test test test...', {'filter': {-> 0}})
3540 END
3541 call writefile(lines, 'XtestPopupCtrlC')
3542
3543 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3544
3545 call term_sendkeys(buf, "\<C-C>")
3546 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3547
3548 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003549 call delete('XtestPopupCtrlC')
3550endfunc
3551
3552func Test_popupwin_filter_close_wrong_name()
3553 CheckScreendump
3554
3555 let lines =<< trim END
3556 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3557 END
3558 call writefile(lines, 'XtestPopupWrongName')
3559
3560 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3561
3562 call term_sendkeys(buf, "j")
3563 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3564
3565 call StopVimInTerminal(buf)
3566 call delete('XtestPopupWrongName')
3567endfunc
3568
3569func Test_popupwin_filter_close_three_errors()
3570 CheckScreendump
3571
3572 let lines =<< trim END
3573 set cmdheight=2
3574 call popup_create('one two three...', {'filter': 'filter'})
3575 END
3576 call writefile(lines, 'XtestPopupThreeErrors')
3577
3578 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3579
3580 call term_sendkeys(buf, "jj")
3581 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3582 call term_sendkeys(buf, "j")
3583 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3584
3585 call StopVimInTerminal(buf)
3586 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003587endfunc
3588
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003589func Test_popupwin_atcursor_far_right()
3590 new
3591
3592 " this was getting stuck
3593 set signcolumn=yes
3594 call setline(1, repeat('=', &columns))
3595 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003596 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003597
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003598 " 'signcolumn' was getting reset
3599 call setwinvar(winid, '&signcolumn', 'yes')
3600 call popup_setoptions(winid, {'zindex': 1000})
3601 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3602
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003603 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003604 bwipe!
3605 set signcolumn&
3606endfunc
3607
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003608func Test_popupwin_splitmove()
3609 vsplit
3610 let win2 = win_getid()
3611 let popup_winid = popup_dialog('hello', {})
3612 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3613 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3614
3615 call popup_clear()
3616 bwipe
3617endfunc
3618
3619
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003620" vim: shiftwidth=2 sts=2