blob: 8e02ef1f0338bc29cfdbd1a7f9739093082c4287 [file] [log] [blame]
Bram Moolenaar4d784b22019-05-25 19:51:39 +02001" Tests for popup windows
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
Bram Moolenaar05ad5ff2019-11-30 22:48:27 +01004CheckFeature popupwin
Bram Moolenaar4d784b22019-05-25 19:51:39 +02005
6source screendump.vim
7
8func Test_simple_popup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02009 CheckScreendump
10
Bram Moolenaare7eb9272019-06-24 00:58:07 +020011 let lines =<< trim END
12 call setline(1, range(1, 100))
13 hi PopupColor1 ctermbg=lightblue
14 hi PopupColor2 ctermbg=lightcyan
Bram Moolenaar1666ac92019-11-10 17:22:31 +010015 hi EndOfBuffer ctermbg=lightgrey
Bram Moolenaare7eb9272019-06-24 00:58:07 +020016 hi Comment ctermfg=red
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020017 call prop_type_add('comment', #{highlight: 'Comment'})
18 let winid = popup_create('hello there', #{line: 3, col: 11, minwidth: 20, highlight: 'PopupColor1'})
19 let winid2 = popup_create(['another one', 'another two', 'another three'], #{line: 3, col: 25, minwidth: 20})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020020 call setwinvar(winid2, '&wincolor', 'PopupColor2')
21 END
22 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020023 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar4d784b22019-05-25 19:51:39 +020024 call VerifyScreenDump(buf, 'Test_popupwin_01', {})
25
Bram Moolenaarec583842019-05-26 14:11:23 +020026 " Add a tabpage
27 call term_sendkeys(buf, ":tabnew\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020028 call term_sendkeys(buf, ":let popupwin = popup_create(["
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020029 \ .. "#{text: 'other tab'},"
30 \ .. "#{text: 'a comment line', props: [#{"
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020031 \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
Bram Moolenaar7a8d0272019-05-26 23:32:06 +020032 \ .. "}]},"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020033 \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
Bram Moolenaarec583842019-05-26 14:11:23 +020034 call VerifyScreenDump(buf, 'Test_popupwin_02', {})
35
36 " switch back to first tabpage
37 call term_sendkeys(buf, "gt")
38 call VerifyScreenDump(buf, 'Test_popupwin_03', {})
39
40 " close that tabpage
41 call term_sendkeys(buf, ":quit!\<CR>")
42 call VerifyScreenDump(buf, 'Test_popupwin_04', {})
43
Bram Moolenaar202d9822019-06-11 21:56:30 +020044 " set 'columns' to a small value, size must be recomputed
45 call term_sendkeys(buf, ":let cols = &columns\<CR>")
46 call term_sendkeys(buf, ":set columns=12\<CR>")
47 call VerifyScreenDump(buf, 'Test_popupwin_04a', {})
48 call term_sendkeys(buf, ":let &columns = cols\<CR>")
49
Bram Moolenaar17146962019-05-30 00:12:11 +020050 " resize popup, show empty line at bottom
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020051 call term_sendkeys(buf, ":call popup_move(popupwin, #{minwidth: 15, maxwidth: 25, minheight: 3, maxheight: 5})\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020052 call term_sendkeys(buf, ":redraw\<CR>")
53 call VerifyScreenDump(buf, 'Test_popupwin_05', {})
54
Bram Moolenaar17146962019-05-30 00:12:11 +020055 " show not fitting line at bottom
56 call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\<CR>")
57 call term_sendkeys(buf, ":redraw\<CR>")
58 call VerifyScreenDump(buf, 'Test_popupwin_06', {})
59
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020060 " move popup over ruler
61 call term_sendkeys(buf, ":set cmdheight=2\<CR>")
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020062 call term_sendkeys(buf, ":call popup_move(popupwin, #{line: 7, col: 55})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +020063 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020064 call VerifyScreenDump(buf, 'Test_popupwin_07', {})
65
66 " clear all popups after moving the cursor a bit, so that ruler is updated
67 call term_sendkeys(buf, "axxx\<Esc>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020068 call TermWait(buf)
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020069 call term_sendkeys(buf, "0")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020070 call TermWait(buf)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +020071 call term_sendkeys(buf, ":call popup_clear()\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020072 call VerifyScreenDump(buf, 'Test_popupwin_08', {})
73
Bram Moolenaar4d784b22019-05-25 19:51:39 +020074 " clean up
75 call StopVimInTerminal(buf)
76 call delete('XtestPopup')
77endfunc
Bram Moolenaar51fe3b12019-05-26 20:10:06 +020078
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020079func Test_popup_with_border_and_padding()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +020080 CheckScreendump
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020081
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +020082 for iter in range(0, 1)
Bram Moolenaare7eb9272019-06-24 00:58:07 +020083 let lines =<< trim END
84 call setline(1, range(1, 100))
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020085 call popup_create('hello border', #{line: 2, col: 3, border: []})
86 call popup_create('hello padding', #{line: 2, col: 23, padding: []})
Bram Moolenaarc363fe12019-08-04 18:13:46 +020087 call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020088 call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
Bram Moolenaarb0992022020-01-30 14:55:42 +010089 call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020090 call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
91 call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
Bram Moolenaarfbcdf672020-01-06 23:07:48 +010092 call popup_create('X', #{line: 2, col: 73})
93 call popup_create('X', #{line: 3, col: 74})
94 call popup_create('X', #{line: 4, col: 75})
95 call popup_create('X', #{line: 5, col: 76})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020096 END
97 call insert(lines, iter == 1 ? '' : 'set enc=latin1')
98 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020099 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 15})
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +0200100 call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
101
102 call StopVimInTerminal(buf)
103 call delete('XtestPopupBorder')
104 endfor
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200105
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200106 let lines =<< trim END
107 call setline(1, range(1, 100))
108 hi BlueColor ctermbg=lightblue
109 hi TopColor ctermbg=253
110 hi RightColor ctermbg=245
111 hi BottomColor ctermbg=240
112 hi LeftColor ctermbg=248
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200113 call popup_create('hello border', #{line: 2, col: 3, border: [], borderhighlight: ['BlueColor']})
114 call popup_create(['hello border', 'and more'], #{line: 2, col: 23, border: [], borderhighlight: ['TopColor', 'RightColor', 'BottomColor', 'LeftColor']})
115 call popup_create(['hello border', 'lines only'], #{line: 2, col: 43, border: [], borderhighlight: ['BlueColor'], borderchars: ['x']})
116 call popup_create(['hello border', 'with corners'], #{line: 2, col: 60, border: [], borderhighlight: ['BlueColor'], borderchars: ['x', '#']})
117 let winid = popup_create(['hello border', 'with numbers'], #{line: 6, col: 3, border: [], borderhighlight: ['BlueColor'], borderchars: ['0', '1', '2', '3', '4', '5', '6', '7']})
118 call popup_create(['hello border', 'just blanks'], #{line: 7, col: 23, border: [], borderhighlight: ['BlueColor'], borderchars: [' ']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200119 func MultiByte()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200120 call popup_create(['hello'], #{line: 8, col: 43, border: [], borderchars: ['─', '│', '─', '│', '┌', '┐', '┘', '└']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200121 endfunc
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200122 END
123 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200124 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 12})
Bram Moolenaar790498b2019-06-01 22:15:29 +0200125 call VerifyScreenDump(buf, 'Test_popupwin_22', {})
126
Bram Moolenaarad24a712019-06-17 20:05:45 +0200127 " check that changing borderchars triggers a redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200128 call term_sendkeys(buf, ":call popup_setoptions(winid, #{borderchars: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']})\<CR>")
Bram Moolenaarad24a712019-06-17 20:05:45 +0200129 call VerifyScreenDump(buf, 'Test_popupwin_23', {})
130
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200131 " check multi-byte border only with 'ambiwidth' single
132 if &ambiwidth == 'single'
133 call term_sendkeys(buf, ":call MultiByte()\<CR>")
134 call VerifyScreenDump(buf, 'Test_popupwin_24', {})
135 endif
136
Bram Moolenaar790498b2019-06-01 22:15:29 +0200137 call StopVimInTerminal(buf)
138 call delete('XtestPopupBorder')
139
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200140 let with_border_or_padding = #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200141 \ line: 2,
142 \ core_line: 3,
143 \ col: 3,
144 \ core_col: 4,
145 \ width: 14,
146 \ core_width: 12,
147 \ height: 3,
148 \ core_height: 1,
149 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100150 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200151 \ scrollbar: 0,
152 \ visible: 1}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200153 let winid = popup_create('hello border', #{line: 2, col: 3, border: []})",
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200154 call assert_equal(with_border_or_padding, winid->popup_getpos())
Bram Moolenaarae943152019-06-16 22:54:14 +0200155 let options = popup_getoptions(winid)
156 call assert_equal([], options.border)
157 call assert_false(has_key(options, "padding"))
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200158
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200159 let winid = popup_create('hello padding', #{line: 2, col: 3, padding: []})
Bram Moolenaarae943152019-06-16 22:54:14 +0200160 let with_border_or_padding.width = 15
161 let with_border_or_padding.core_width = 13
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200162 call assert_equal(with_border_or_padding, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200163 let options = popup_getoptions(winid)
164 call assert_false(has_key(options, "border"))
165 call assert_equal([], options.padding)
166
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200167 call popup_setoptions(winid, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200168 \ padding: [1, 2, 3, 4],
169 \ border: [4, 0, 7, 8],
170 \ borderhighlight: ['Top', 'Right', 'Bottom', 'Left'],
171 \ borderchars: ['1', '^', '2', '>', '3', 'v', '4', '<'],
Bram Moolenaarae943152019-06-16 22:54:14 +0200172 \ })
173 let options = popup_getoptions(winid)
174 call assert_equal([1, 0, 1, 1], options.border)
175 call assert_equal([1, 2, 3, 4], options.padding)
176 call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
177 call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200178
Bram Moolenaara1396152019-10-20 18:46:05 +0200179 " Check that popup_setoptions() takes the output of popup_getoptions()
180 call popup_setoptions(winid, options)
181 call assert_equal(options, popup_getoptions(winid))
182
Bram Moolenaarb0992022020-01-30 14:55:42 +0100183 " Check that range() doesn't crash
184 call popup_setoptions(winid, #{
185 \ padding: range(1, 4),
186 \ border: range(5, 8),
187 \ borderhighlight: range(4),
188 \ borderchars: range(8),
189 \ })
190
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200191 let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
192 call assert_equal(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200193 \ line: 3,
194 \ core_line: 5,
195 \ col: 8,
196 \ core_col: 10,
197 \ width: 14,
198 \ core_width: 10,
199 \ height: 5,
200 \ scrollbar: 0,
201 \ core_height: 1,
202 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100203 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200204 \ visible: 1}, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200205
206 call popup_clear()
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200207endfunc
208
Bram Moolenaarb4230122019-05-30 18:40:53 +0200209func Test_popup_with_syntax_win_execute()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200210 CheckScreendump
211
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200212 let lines =<< trim END
213 call setline(1, range(1, 100))
214 hi PopupColor ctermbg=lightblue
215 let winid = popup_create([
216 \ '#include <stdio.h>',
217 \ 'int main(void)',
218 \ '{',
219 \ ' printf(123);',
220 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200221 \], #{line: 3, col: 25, highlight: 'PopupColor'})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200222 call win_execute(winid, 'set syntax=cpp')
223 END
224 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200225 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200226 call VerifyScreenDump(buf, 'Test_popupwin_10', {})
227
228 " clean up
229 call StopVimInTerminal(buf)
230 call delete('XtestPopup')
231endfunc
232
233func Test_popup_with_syntax_setbufvar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200234 CheckScreendump
235
Bram Moolenaar402502d2019-05-30 22:07:36 +0200236 let lines =<< trim END
237 call setline(1, range(1, 100))
238 hi PopupColor ctermbg=lightgrey
239 let winid = popup_create([
240 \ '#include <stdio.h>',
241 \ 'int main(void)',
242 \ '{',
Bram Moolenaare089c3f2019-07-09 20:25:25 +0200243 \ "\tprintf(567);",
Bram Moolenaar402502d2019-05-30 22:07:36 +0200244 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200245 \], #{line: 3, col: 21, highlight: 'PopupColor'})
Bram Moolenaar402502d2019-05-30 22:07:36 +0200246 call setbufvar(winbufnr(winid), '&syntax', 'cpp')
247 END
248 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200249 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200250 call VerifyScreenDump(buf, 'Test_popupwin_11', {})
251
252 " clean up
253 call StopVimInTerminal(buf)
254 call delete('XtestPopup')
255endfunc
256
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200257func Test_popup_with_matches()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200258 CheckScreendump
259
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200260 let lines =<< trim END
261 call setline(1, ['111 222 333', '444 555 666'])
262 let winid = popup_create([
263 \ '111 222 333',
264 \ '444 555 666',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200265 \], #{line: 3, col: 10, border: []})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200266 set hlsearch
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100267 hi VeryBlue ctermfg=blue guifg=blue
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200268 /666
269 call matchadd('ErrorMsg', '111')
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100270 call matchadd('VeryBlue', '444')
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200271 call win_execute(winid, "call matchadd('ErrorMsg', '111')")
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100272 call win_execute(winid, "call matchadd('VeryBlue', '555')")
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200273 END
274 call writefile(lines, 'XtestPopupMatches')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200275 let buf = RunVimInTerminal('-S XtestPopupMatches', #{rows: 10})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200276 call VerifyScreenDump(buf, 'Test_popupwin_matches', {})
277
278 " clean up
279 call StopVimInTerminal(buf)
280 call delete('XtestPopupMatches')
281endfunc
282
Bram Moolenaar399d8982019-06-02 15:34:29 +0200283func Test_popup_all_corners()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200284 CheckScreendump
285
Bram Moolenaar399d8982019-06-02 15:34:29 +0200286 let lines =<< trim END
287 call setline(1, repeat([repeat('-', 60)], 15))
288 set so=0
289 normal 2G3|r#
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200290 let winid1 = popup_create(['first', 'second'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200291 \ line: 'cursor+1',
292 \ col: 'cursor',
293 \ pos: 'topleft',
294 \ border: [],
295 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200296 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200297 normal 24|r@
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200298 let winid1 = popup_create(['First', 'SeconD'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200299 \ line: 'cursor+1',
300 \ col: 'cursor',
301 \ pos: 'topright',
302 \ border: [],
303 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200304 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200305 normal 9G27|r%
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200306 let winid1 = popup_create(['fiRSt', 'seCOnd'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200307 \ line: 'cursor-1',
308 \ col: 'cursor',
309 \ pos: 'botleft',
310 \ border: [],
311 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200312 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200313 normal 48|r&
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200314 let winid1 = popup_create(['FIrsT', 'SEcoND'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200315 \ line: 'cursor-1',
316 \ col: 'cursor',
317 \ pos: 'botright',
318 \ border: [],
319 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200320 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200321 normal 1G51|r*
322 let winid1 = popup_create(['one', 'two'], #{
323 \ line: 'cursor-1',
324 \ col: 'cursor',
325 \ pos: 'botleft',
326 \ border: [],
327 \ padding: [],
328 \ })
Bram Moolenaar399d8982019-06-02 15:34:29 +0200329 END
330 call writefile(lines, 'XtestPopupCorners')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200331 let buf = RunVimInTerminal('-S XtestPopupCorners', #{rows: 12})
Bram Moolenaar399d8982019-06-02 15:34:29 +0200332 call VerifyScreenDump(buf, 'Test_popupwin_corners', {})
333
334 " clean up
335 call StopVimInTerminal(buf)
336 call delete('XtestPopupCorners')
337endfunc
338
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100339func Test_popup_nospace()
340 CheckScreendump
341
342 let lines =<< trim END
343 call setline(1, repeat([repeat('-', 60)], 15))
344 set so=0
345
346 " cursor in a line in top half, using "botleft" with popup that
347 " does fit
348 normal 5G2|r@
349 let winid1 = popup_create(['one', 'two'], #{
350 \ line: 'cursor-1',
351 \ col: 'cursor',
352 \ pos: 'botleft',
353 \ border: [],
354 \ })
355 " cursor in a line in top half, using "botleft" with popup that
356 " doesn't fit: gets truncated
357 normal 5G9|r#
358 let winid1 = popup_create(['one', 'two', 'tee'], #{
359 \ line: 'cursor-1',
360 \ col: 'cursor',
361 \ pos: 'botleft',
362 \ posinvert: 0,
363 \ border: [],
364 \ })
365 " cursor in a line in top half, using "botleft" with popup that
366 " doesn't fit and 'posinvert' set: flips to below.
367 normal 5G16|r%
368 let winid1 = popup_create(['one', 'two', 'tee'], #{
369 \ line: 'cursor-1',
370 \ col: 'cursor',
371 \ pos: 'botleft',
372 \ border: [],
373 \ })
374 " cursor in a line in bottom half, using "botleft" with popup that
375 " doesn't fit: does not flip.
376 normal 8G23|r*
377 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
378 \ line: 'cursor-1',
379 \ col: 'cursor',
380 \ pos: 'botleft',
381 \ border: [],
382 \ })
383
384 " cursor in a line in bottom half, using "topleft" with popup that
385 " does fit
386 normal 8G30|r@
387 let winid1 = popup_create(['one', 'two'], #{
388 \ line: 'cursor+1',
389 \ col: 'cursor',
390 \ pos: 'topleft',
391 \ border: [],
392 \ })
393 " cursor in a line in top half, using "topleft" with popup that
394 " doesn't fit: truncated
395 normal 8G37|r#
396 let winid1 = popup_create(['one', 'two', 'tee'], #{
397 \ line: 'cursor+1',
398 \ col: 'cursor',
399 \ pos: 'topleft',
400 \ posinvert: 0,
401 \ border: [],
402 \ })
403 " cursor in a line in top half, using "topleft" with popup that
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100404 " doesn't fit and "posinvert" set: flips to above.
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100405 normal 8G44|r%
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100406 let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100407 \ line: 'cursor+1',
408 \ col: 'cursor',
409 \ pos: 'topleft',
410 \ border: [],
411 \ })
412 " cursor in a line in top half, using "topleft" with popup that
413 " doesn't fit: does not flip.
414 normal 5G51|r*
415 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
416 \ line: 'cursor+1',
417 \ col: 'cursor',
418 \ pos: 'topleft',
419 \ border: [],
420 \ })
421 END
422 call writefile(lines, 'XtestPopupNospace')
423 let buf = RunVimInTerminal('-S XtestPopupNospace', #{rows: 12})
424 call VerifyScreenDump(buf, 'Test_popupwin_nospace', {})
425
426 " clean up
427 call StopVimInTerminal(buf)
428 call delete('XtestPopupNospace')
429endfunc
430
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200431func Test_popup_firstline_dump()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200432 CheckScreendump
433
Bram Moolenaar8d241042019-06-12 23:40:01 +0200434 let lines =<< trim END
435 call setline(1, range(1, 20))
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200436 let winid = popup_create(['1111', '222222', '33333', '44', '5', '666666', '77777', '888', '9999999999999999'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200437 \ maxheight: 4,
438 \ firstline: 3,
Bram Moolenaar8d241042019-06-12 23:40:01 +0200439 \ })
440 END
441 call writefile(lines, 'XtestPopupFirstline')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200442 let buf = RunVimInTerminal('-S XtestPopupFirstline', #{rows: 10})
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200443 call VerifyScreenDump(buf, 'Test_popupwin_firstline_1', {})
444
445 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: -1})\<CR>")
446 call term_sendkeys(buf, ":\<CR>")
447 call VerifyScreenDump(buf, 'Test_popupwin_firstline_2', {})
Bram Moolenaar8d241042019-06-12 23:40:01 +0200448
449 " clean up
450 call StopVimInTerminal(buf)
451 call delete('XtestPopupFirstline')
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200452endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +0200453
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200454func Test_popup_firstline()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200455 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200456 \ maxheight: 2,
457 \ firstline: 3,
Bram Moolenaarae943152019-06-16 22:54:14 +0200458 \ })
459 call assert_equal(3, popup_getoptions(winid).firstline)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200460 call popup_setoptions(winid, #{firstline: 1})
Bram Moolenaarae943152019-06-16 22:54:14 +0200461 call assert_equal(1, popup_getoptions(winid).firstline)
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200462 eval winid->popup_close()
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200463
464 let winid = popup_create(['xxx']->repeat(50), #{
465 \ maxheight: 3,
466 \ firstline: 11,
467 \ })
468 redraw
469 call assert_equal(11, popup_getoptions(winid).firstline)
470 call assert_equal(11, popup_getpos(winid).firstline)
Bram Moolenaar8e0a8e72019-09-02 22:56:24 +0200471 " check line() works with popup window
472 call assert_equal(11, line('.', winid))
473 call assert_equal(50, line('$', winid))
474 call assert_equal(0, line('$', 123456))
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200475
476 " Normal command changes what is displayed but not "firstline"
477 call win_execute(winid, "normal! \<c-y>")
478 call assert_equal(11, popup_getoptions(winid).firstline)
479 call assert_equal(10, popup_getpos(winid).firstline)
480
481 " Making some property change applies "firstline" again
482 call popup_setoptions(winid, #{line: 4})
483 call assert_equal(11, popup_getoptions(winid).firstline)
484 call assert_equal(11, popup_getpos(winid).firstline)
485
486 " Remove "firstline" property and scroll
487 call popup_setoptions(winid, #{firstline: 0})
488 call win_execute(winid, "normal! \<c-y>")
489 call assert_equal(0, popup_getoptions(winid).firstline)
490 call assert_equal(10, popup_getpos(winid).firstline)
491
492 " Making some property change has no side effect
493 call popup_setoptions(winid, #{line: 3})
494 call assert_equal(0, popup_getoptions(winid).firstline)
495 call assert_equal(10, popup_getpos(winid).firstline)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200496 call popup_close(winid)
Bram Moolenaarae943152019-06-16 22:54:14 +0200497
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100498 " CTRL-D scrolls down half a page
499 let winid = popup_create(['xxx']->repeat(50), #{
500 \ maxheight: 8,
501 \ })
502 redraw
503 call assert_equal(1, popup_getpos(winid).firstline)
504 call win_execute(winid, "normal! \<C-D>")
505 call assert_equal(5, popup_getpos(winid).firstline)
506 call win_execute(winid, "normal! \<C-D>")
507 call assert_equal(9, popup_getpos(winid).firstline)
508 call win_execute(winid, "normal! \<C-U>")
509 call assert_equal(5, popup_getpos(winid).firstline)
510
511 call win_execute(winid, "normal! \<C-F>")
512 call assert_equal(11, popup_getpos(winid).firstline)
513 call win_execute(winid, "normal! \<C-B>")
514 call assert_equal(5, popup_getpos(winid).firstline)
515
Bram Moolenaarae943152019-06-16 22:54:14 +0200516 call popup_close(winid)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200517endfunc
518
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200519func Test_popup_firstline_cursorline()
520 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
521 \ maxheight: 2,
522 \ firstline: 3,
523 \ cursorline: 1,
524 \ })
525 call assert_equal(3, popup_getoptions(winid).firstline)
526 call assert_equal(3, getwininfo(winid)[0].topline)
527 call assert_equal(3, getcurpos(winid)[1])
528
529 call popup_close(winid)
530endfunc
531
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200532func Test_popup_noscrolloff()
533 set scrolloff=5
534 let winid = popup_create(['xxx']->repeat(50), #{
535 \ maxheight: 5,
536 \ firstline: 11,
537 \ })
538 redraw
539 call assert_equal(11, popup_getoptions(winid).firstline)
540 call assert_equal(11, popup_getpos(winid).firstline)
541
542 call popup_setoptions(winid, #{firstline: 0})
543 call win_execute(winid, "normal! \<c-y>")
544 call assert_equal(0, popup_getoptions(winid).firstline)
545 call assert_equal(10, popup_getpos(winid).firstline)
546
547 call popup_close(winid)
548endfunc
549
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200550func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200551 CheckScreendump
552
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200553 " create a popup that covers the command line
554 let lines =<< trim END
555 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200556 split
557 vsplit
558 $wincmd w
559 vsplit
560 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200561 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200562 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200563 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200564 \ border: [],
565 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200566 \ })
567 func Dragit()
568 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
569 endfunc
570 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
Bram Moolenaar356375f2019-08-24 14:46:29 +0200571 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200572 func Resize()
573 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
574 endfunc
Bram Moolenaar356375f2019-08-24 14:46:29 +0200575 map <silent> <F5> :call test_setmouse(6, 21)<CR>
576 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200577 END
578 call writefile(lines, 'XtestPopupDrag')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200579 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200580 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
581
582 call term_sendkeys(buf, ":call Dragit()\<CR>")
583 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
584
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200585 call term_sendkeys(buf, ":call Resize()\<CR>")
586 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
587
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200588 " clean up
589 call StopVimInTerminal(buf)
590 call delete('XtestPopupDrag')
591endfunc
592
Bram Moolenaar35910f22020-07-12 19:24:10 +0200593func Test_popup_drag_termwin()
594 CheckUnix
595 CheckScreendump
596 CheckFeature terminal
597
598 " create a popup that covers the terminal window
599 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200600 set foldmethod=marker
601 call setline(1, range(100))
602 for nr in range(7)
603 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200604 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200605 endfor
606 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200607 set shell=/bin/sh noruler
Bram Moolenaar4b2ce122020-11-21 21:41:41 +0100608 unlet $PROMPT_COMMAND
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200609 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200610 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200611 $wincmd w
612 let winid = popup_create(['1111', '2222'], #{
613 \ drag: 1,
614 \ resize: 1,
615 \ border: [],
616 \ line: 3,
617 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200618 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200619 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
620 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200621 func DragitDown()
622 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
623 endfunc
624 func DragitDownLeft()
625 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
626 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200627 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
628 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200629 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
630 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200631 END
632 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200633 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200634 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
635
Bram Moolenaar452143c2020-07-15 17:38:21 +0200636 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200637 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
638
Bram Moolenaar452143c2020-07-15 17:38:21 +0200639 call term_sendkeys(buf, ":call DragitDown()\<CR>")
640 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
641
642 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
643 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
644
Bram Moolenaar35910f22020-07-12 19:24:10 +0200645 " clean up
646 call StopVimInTerminal(buf)
647 call delete('XtestPopupTerm')
648endfunc
649
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200650func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200651 CheckScreendump
652
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200653 let lines =<< trim END
654 call setline(1, range(1, 20))
655 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200656 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200657 \ close: 'button',
658 \ border: [],
659 \ line: 1,
660 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200661 \ })
662 func CloseMsg(id, result)
663 echomsg 'Popup closed with ' .. a:result
664 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200665 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200666 \ close: 'click',
667 \ line: 3,
668 \ col: 15,
669 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200670 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200671 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200672 \ close: 'button',
673 \ line: 5,
674 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200675 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200676 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200677 \ close: 'button',
678 \ padding: [],
679 \ line: 5,
680 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200681 \ })
682 func CloseWithX()
683 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
684 endfunc
685 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
686 func CloseWithClick()
687 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
688 endfunc
689 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200690 func CreateWithMenuFilter()
691 let winid = popup_create('barfoo', #{
692 \ close: 'button',
693 \ filter: 'popup_filter_menu',
694 \ border: [],
695 \ line: 1,
696 \ col: 40,
697 \ })
698 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200699 END
700 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200701 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200702 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
703
704 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
705 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
706
707 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
708 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
709
Bram Moolenaarf6396232019-08-24 19:36:00 +0200710 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
711 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
712
713 " We have to send the actual mouse code, feedkeys() would be caught the
714 " filter.
715 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
716 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
717
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200718 " clean up
719 call StopVimInTerminal(buf)
720 call delete('XtestPopupClose')
721endfunction
722
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200723func Test_popup_menu_wrap()
724 CheckScreendump
725
726 let lines =<< trim END
727 call setline(1, range(1, 20))
728 call popup_create([
729 \ 'one',
730 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
731 \ 'three',
732 \ 'four',
733 \ ], #{
734 \ pos: "botleft",
735 \ border: [],
736 \ padding: [0,1,0,1],
737 \ maxheight: 3,
738 \ cursorline: 1,
739 \ filter: 'popup_filter_menu',
740 \ })
741 END
742 call writefile(lines, 'XtestPopupWrap')
743 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
744 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
745
746 call term_sendkeys(buf, "jj")
747 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
748
749 " clean up
750 call term_sendkeys(buf, "\<Esc>")
751 call StopVimInTerminal(buf)
752 call delete('XtestPopupWrap')
753endfunction
754
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200755func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200756 CheckScreendump
757
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200758 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200759 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200760 hi PopupColor ctermbg=lightgrey
761 let winid = popup_create([
762 \ 'some text',
763 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200764 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200765 \ line: 1,
766 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100767 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200768 \ wrap: 0,
769 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200770 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200771 \ zindex: 90,
772 \ padding: [],
773 \ highlight: 'PopupColor',
774 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200775 call popup_create([
776 \ 'xxxxxxxxx',
777 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200778 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200779 \ line: 3,
780 \ col: 18,
781 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200782 let winidb = popup_create([
783 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200784 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200785 \ line: 7,
786 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100787 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200788 \ wrap: 0,
789 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200790 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200791 \ close: 'button',
792 \ zindex: 90,
793 \ padding: [],
794 \ border: [],
795 \ mask: [[1,2,1,1], [-5,-1,4,4], [7,9,2,3], [3,5,5,5],[-7,-4,5,5]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200796 END
797 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200798 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200799 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
800
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200801 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
802 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200803 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200804 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
805
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200806 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
807 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200808 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200809 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
810
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200811 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
812 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200813 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200814 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
815
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200816 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
817 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200818 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200819 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
820
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200821 " clean up
822 call StopVimInTerminal(buf)
823 call delete('XtestPopupMask')
Bram Moolenaar4012d262020-12-29 11:57:46 +0100824
825 " this was causing a crash
826 call popup_create('test', #{mask: [[0, 0, 0, 0]]})
827 call popup_clear()
Bram Moolenaar10ccfb22021-02-13 21:31:18 +0100828
829 " this was causing an internal error
830 enew
831 set nowrap
832 call repeat('x', &columns)->setline(1)
833 call prop_type_add('textprop', {})
834 call prop_add(1, 1, #{length: &columns, type: 'textprop'})
835 vsplit
836 let opts = popup_create('', #{textprop: 'textprop'})
837 \ ->popup_getoptions()
838 \ ->extend(#{mask: [[1, 1, 1, 1]]})
839 call popup_create('', opts)
840 redraw
841
842 close!
843 bwipe!
844 call prop_type_delete('textprop')
845 call popup_clear()
846 set wrap&
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200847endfunc
848
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200849func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200850 CheckScreendump
851 CheckFeature clipboard_working
852
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200853 " create a popup with some text to be selected
854 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200855 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200856 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200857 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200858 \ drag: 1,
859 \ border: [],
860 \ line: 3,
861 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200862 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200863 \ })
864 func Select1()
865 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
866 endfunc
867 map <silent> <F3> :call test_setmouse(4, 15)<CR>
868 map <silent> <F4> :call test_setmouse(6, 23)<CR>
869 END
870 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200871 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200872 call term_sendkeys(buf, ":call Select1()\<CR>")
873 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
874
875 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
876 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200877 " clean the command line, sometimes it still shows a command
878 call term_sendkeys(buf, ":\<esc>")
879
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200880 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
881
882 " clean up
883 call StopVimInTerminal(buf)
884 call delete('XtestPopupSelect')
885endfunc
886
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200887func Test_popup_in_tab()
888 " default popup is local to tab, not visible when in other tab
889 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200890 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200891 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200892 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200893 tabnew
894 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200895 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200896 quit
897 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200898
899 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200900 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200901 " buffer is gone now
902 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200903
904 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200905 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200906 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200907 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200908 tabnew
909 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200910 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200911 quit
912 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200913 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200914
915 " create popup in other tab
916 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200917 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200918 call assert_equal(0, popup_getpos(winid).visible)
919 call assert_equal(1, popup_getoptions(winid).tabpage)
920 quit
921 call assert_equal(1, popup_getpos(winid).visible)
922 call assert_equal(0, popup_getoptions(winid).tabpage)
923 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200924endfunc
925
926func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200927 call assert_equal(0, len(popup_list()))
928
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200929 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200930 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200931 let pos = popup_getpos(winid)
932 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200933 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200934 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200935
936 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200937 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200938 let pos = popup_getpos(winid)
939 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200940 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200941
942 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200943 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200944 let pos = popup_getpos(winid)
945 let around = (&columns - pos.width) / 2
946 call assert_inrange(around - 1, around + 1, pos.col)
947 let around = (&lines - pos.height) / 2
948 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200949 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200950endfunc
951
952func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +0200953 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200954 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200955 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200956 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200957 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
958 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
959 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200960
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200961 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200962 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200963 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200964 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200965 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200966 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200967 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200968 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200969
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200970 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
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", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200973 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200974 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200975 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200976 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200977 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200978
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200979 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200980 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200981 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200982 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200983 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200984 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200985 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200986 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +0200987 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
988 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200989 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200990 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200991
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200992 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200993 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200994 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200995 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200996 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200997 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100998 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
999 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001000 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
1001 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +01001002 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
1003 call popup_clear()
1004 call popup_create("text", #{mask: [range(4)]})
1005 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001006 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001007 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001008 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001009 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
1010 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001011endfunc
1012
Bram Moolenaareea16992019-05-31 17:34:48 +02001013func Test_win_execute_closing_curwin()
1014 split
1015 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001016 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001017 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +01001018
1019 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001020 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 +01001021 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001022endfunc
1023
1024func Test_win_execute_not_allowed()
1025 let winid = popup_create('some text', {})
1026 call assert_fails('call win_execute(winid, "split")', 'E994:')
1027 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1028 call assert_fails('call win_execute(winid, "close")', 'E994:')
1029 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001030 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001031 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1032 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1033 call assert_fails('call win_execute(winid, "next")', 'E994:')
1034 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001035 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001036 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001037 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1038 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1039 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1040 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001041 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1042 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001043 call assert_fails('call win_execute(winid, "help")', 'E994:')
1044 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001045 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1046 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1047 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1048 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001049 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001050endfunc
1051
Bram Moolenaar402502d2019-05-30 22:07:36 +02001052func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001053 CheckScreendump
1054
Bram Moolenaar402502d2019-05-30 22:07:36 +02001055 let lines =<< trim END
1056 call setline(1, range(1, 100))
1057 let winid = popup_create(
1058 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001059 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001060 END
1061 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001062 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001063 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1064
1065 " clean up
1066 call StopVimInTerminal(buf)
1067 call delete('XtestPopup')
1068endfunc
1069
1070func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001071 CheckScreendump
1072
Bram Moolenaar402502d2019-05-30 22:07:36 +02001073 let lines =<< trim END
1074 call setline(1, range(1, 100))
1075 let winid = popup_create(
1076 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001077 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001078 END
1079 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001080 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001081 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1082
1083 " clean up
1084 call StopVimInTerminal(buf)
1085 call delete('XtestPopup')
1086endfunc
1087
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001088func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001089 CheckScreendump
1090
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001091 let lines =<< trim END
1092 set showbreak=>>\
1093 call setline(1, range(1, 20))
1094 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001095 \ 'a long line here that wraps',
1096 \ #{filter: 'popup_filter_yesno',
1097 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001098 END
1099 call writefile(lines, 'XtestPopupShowbreak')
1100 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1101 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1102
1103 " clean up
1104 call term_sendkeys(buf, "y")
1105 call StopVimInTerminal(buf)
1106 call delete('XtestPopupShowbreak')
1107endfunc
1108
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001109func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001110 CheckFeature timers
1111
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001112 topleft vnew
1113 call setline(1, 'hello')
1114
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001115 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001116 \ line: 1,
1117 \ col: 1,
1118 \ minwidth: 20,
1119 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001120 \})
1121 redraw
1122 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1123 call assert_equal('world', line)
1124
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001125 call assert_equal(winid, popup_locate(1, 1))
1126 call assert_equal(winid, popup_locate(1, 20))
1127 call assert_equal(0, popup_locate(1, 21))
1128 call assert_equal(0, popup_locate(2, 1))
1129
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001130 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001131 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001132 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001133 call assert_equal('hello', line)
1134
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001135 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001136 \ line: &lines,
1137 \ col: 10,
1138 \ minwidth: 20,
1139 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001140 \})
1141 redraw
1142 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1143 call assert_match('.*on the command line.*', line)
1144
1145 sleep 700m
1146 redraw
1147 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1148 call assert_notmatch('.*on the command line.*', line)
1149
1150 bwipe!
1151endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001152
1153func Test_popup_hide()
1154 topleft vnew
1155 call setline(1, 'hello')
1156
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001157 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001158 \ line: 1,
1159 \ col: 1,
1160 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001161 \})
1162 redraw
1163 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1164 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001165 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001166 " buffer is still listed and active
1167 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001168
1169 call popup_hide(winid)
1170 redraw
1171 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1172 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001173 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001174 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001175 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001176
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001177 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001178 redraw
1179 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1180 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001181 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001182
1183
1184 call popup_close(winid)
1185 redraw
1186 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1187 call assert_equal('hello', line)
1188
1189 " error is given for existing non-popup window
1190 call assert_fails('call popup_hide(win_getid())', 'E993:')
1191
1192 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001193 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001194 call popup_show(41234234)
1195
1196 bwipe!
1197endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001198
1199func Test_popup_move()
1200 topleft vnew
1201 call setline(1, 'hello')
1202
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001203 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001204 \ line: 1,
1205 \ col: 1,
1206 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001207 \})
1208 redraw
1209 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1210 call assert_equal('world ', line)
1211
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001212 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001213 redraw
1214 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1215 call assert_equal('hello ', line)
1216 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1217 call assert_equal('~world', line)
1218
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001219 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001220 redraw
1221 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1222 call assert_equal('hworld', line)
1223
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001224 call assert_fails('call popup_move(winid, [])', 'E715:')
1225 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1226
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001227 call popup_close(winid)
1228
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001229 call assert_equal(0, popup_move(-1, {}))
1230
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001231 bwipe!
1232endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001233
Bram Moolenaar402502d2019-05-30 22:07:36 +02001234func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001235 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001236 \ line: 2,
1237 \ col: 3,
1238 \ minwidth: 10,
1239 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001240 \})
1241 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001242 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001243 call assert_equal(2, res.line)
1244 call assert_equal(3, res.col)
1245 call assert_equal(10, res.width)
1246 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001247 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001248
1249 call popup_close(winid)
1250endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001251
1252func Test_popup_width_longest()
1253 let tests = [
1254 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1255 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1256 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1257 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1258 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1259 \ ]
1260
1261 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001262 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001263 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001264 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001265 call assert_equal(test[1], position.width)
1266 call popup_close(winid)
1267 endfor
1268endfunc
1269
1270func Test_popup_wraps()
1271 let tests = [
1272 \ ['nowrap', 6, 1],
1273 \ ['a line that wraps once', 12, 2],
1274 \ ['a line that wraps two times', 12, 3],
1275 \ ]
1276 for test in tests
1277 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001278 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001279 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001280 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001281 call assert_equal(test[1], position.width)
1282 call assert_equal(test[2], position.height)
1283
1284 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001285 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001286 endfor
1287endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001288
1289func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001290 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001291 \ line: 2,
1292 \ col: 3,
1293 \ minwidth: 10,
1294 \ minheight: 11,
1295 \ maxwidth: 20,
1296 \ maxheight: 21,
1297 \ zindex: 100,
1298 \ time: 5000,
1299 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001300 \})
1301 redraw
1302 let res = popup_getoptions(winid)
1303 call assert_equal(2, res.line)
1304 call assert_equal(3, res.col)
1305 call assert_equal(10, res.minwidth)
1306 call assert_equal(11, res.minheight)
1307 call assert_equal(20, res.maxwidth)
1308 call assert_equal(21, res.maxheight)
1309 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001310 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001311 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001312 if has('timers')
1313 call assert_equal(5000, res.time)
1314 endif
1315 call popup_close(winid)
1316
1317 let winid = popup_create('hello', {})
1318 redraw
1319 let res = popup_getoptions(winid)
1320 call assert_equal(0, res.line)
1321 call assert_equal(0, res.col)
1322 call assert_equal(0, res.minwidth)
1323 call assert_equal(0, res.minheight)
1324 call assert_equal(0, res.maxwidth)
1325 call assert_equal(0, res.maxheight)
1326 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001327 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001328 if has('timers')
1329 call assert_equal(0, res.time)
1330 endif
1331 call popup_close(winid)
1332 call assert_equal({}, popup_getoptions(winid))
1333endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001334
1335func Test_popup_option_values()
1336 new
1337 " window-local
1338 setlocal number
1339 setlocal nowrap
1340 " buffer-local
1341 setlocal omnifunc=Something
1342 " global/buffer-local
1343 setlocal path=/there
1344 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001345 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001346
1347 let winid = popup_create('hello', {})
1348 call assert_equal(0, getwinvar(winid, '&number'))
1349 call assert_equal(1, getwinvar(winid, '&wrap'))
1350 call assert_equal('', getwinvar(winid, '&omnifunc'))
1351 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001352 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1353
1354 " 'scrolloff' is reset to zero
1355 call assert_equal(5, &scrolloff)
1356 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001357
1358 call popup_close(winid)
1359 bwipe
1360endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001361
1362func Test_popup_atcursor()
1363 topleft vnew
1364 call setline(1, [
1365 \ 'xxxxxxxxxxxxxxxxx',
1366 \ 'xxxxxxxxxxxxxxxxx',
1367 \ 'xxxxxxxxxxxxxxxxx',
1368 \])
1369
1370 call cursor(2, 2)
1371 redraw
1372 let winid = popup_atcursor('vim', {})
1373 redraw
1374 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1375 call assert_equal('xvimxxxxxxxxxxxxx', line)
1376 call popup_close(winid)
1377
1378 call cursor(3, 4)
1379 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001380 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001381 redraw
1382 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1383 call assert_equal('xxxvimxxxxxxxxxxx', line)
1384 call popup_close(winid)
1385
1386 call cursor(1, 1)
1387 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001388 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001389 \ line: 'cursor+2',
1390 \ col: 'cursor+1',
1391 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001392 redraw
1393 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1394 call assert_equal('xvimxxxxxxxxxxxxx', line)
1395 call popup_close(winid)
1396
1397 call cursor(3, 3)
1398 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001399 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001400 \ line: 'cursor-2',
1401 \ col: 'cursor-1',
1402 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001403 redraw
1404 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1405 call assert_equal('xvimxxxxxxxxxxxxx', line)
1406 call popup_close(winid)
1407
Bram Moolenaar402502d2019-05-30 22:07:36 +02001408 " just enough room above
1409 call cursor(3, 3)
1410 redraw
1411 let winid = popup_atcursor(['vim', 'is great'], {})
1412 redraw
1413 let pos = popup_getpos(winid)
1414 call assert_equal(1, pos.line)
1415 call popup_close(winid)
1416
1417 " not enough room above, popup goes below the cursor
1418 call cursor(3, 3)
1419 redraw
1420 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1421 redraw
1422 let pos = popup_getpos(winid)
1423 call assert_equal(4, pos.line)
1424 call popup_close(winid)
1425
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001426 " cursor in first line, popup in line 2
1427 call cursor(1, 1)
1428 redraw
1429 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1430 redraw
1431 let pos = popup_getpos(winid)
1432 call assert_equal(2, pos.line)
1433 call popup_close(winid)
1434
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001435 bwipe!
1436endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001437
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001438func Test_popup_atcursor_pos()
1439 CheckScreendump
Dominique Pellec60e9592021-07-03 21:41:38 +02001440 CheckFeature conceal
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001441
1442 let lines =<< trim END
1443 call setline(1, repeat([repeat('-', 60)], 15))
1444 set so=0
1445
1446 normal 9G3|r#
1447 let winid1 = popup_atcursor(['first', 'second'], #{
1448 \ moved: [0, 0, 0],
1449 \ })
1450 normal 9G21|r&
1451 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1452 \ pos: 'botright',
1453 \ moved: [0, 0, 0],
1454 \ })
1455 normal 3G27|r%
1456 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1457 \ pos: 'topleft',
1458 \ moved: [0, 0, 0],
1459 \ })
1460 normal 3G45|r@
1461 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1462 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001463 \ moved: range(3),
1464 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001465 \ })
Bram Moolenaarea042672021-06-29 20:22:32 +02001466
1467 normal 9G27|Rconcealed X
1468 syn match Hidden /concealed/ conceal
1469 set conceallevel=2 concealcursor=n
1470 redraw
1471 normal 0fX
1472 call popup_atcursor('mark', {})
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001473 END
1474 call writefile(lines, 'XtestPopupAtcursorPos')
1475 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1476 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1477
1478 " clean up
1479 call StopVimInTerminal(buf)
1480 call delete('XtestPopupAtcursorPos')
1481endfunc
1482
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001483func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001484 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001485 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001486
1487 let lines =<< trim END
1488 call setline(1, range(1, 20))
1489 call setline(5, 'here is some text to hover over')
1490 set balloonevalterm
1491 set balloonexpr=BalloonExpr()
1492 set balloondelay=100
1493 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001494 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001495 return ''
1496 endfunc
1497 func Hover()
1498 call test_setmouse(5, 15)
1499 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1500 sleep 100m
1501 endfunc
1502 func MoveOntoPopup()
1503 call test_setmouse(4, 17)
1504 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1505 endfunc
1506 func MoveAway()
1507 call test_setmouse(5, 13)
1508 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1509 endfunc
1510 END
1511 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001512 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001513 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001514 call term_sendkeys(buf, 'j')
1515 call term_sendkeys(buf, ":call Hover()\<CR>")
1516 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1517
1518 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1519 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1520
1521 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1522 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1523
1524 " clean up
1525 call StopVimInTerminal(buf)
1526 call delete('XtestPopupBeval')
1527endfunc
1528
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001529func Test_popup_filter()
1530 new
1531 call setline(1, 'some text')
1532
1533 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001534 if a:c == 'e' || a:c == "\<F9>"
1535 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001536 return 1
1537 endif
1538 if a:c == '0'
1539 let g:ignored = '0'
1540 return 0
1541 endif
1542 if a:c == 'x'
1543 call popup_close(a:winid)
1544 return 1
1545 endif
1546 return 0
1547 endfunc
1548
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001549 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001550 redraw
1551
1552 " e is consumed by the filter
1553 call feedkeys('e', 'xt')
1554 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001555 call feedkeys("\<F9>", 'xt')
1556 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001557
1558 " 0 is ignored by the filter
1559 normal $
1560 call assert_equal(9, getcurpos()[2])
1561 call feedkeys('0', 'xt')
1562 call assert_equal('0', g:ignored)
Yegappan Lakshmanan7237cab2021-06-22 19:52:27 +02001563 normal! l
1564 call assert_equal(2, getcurpos()[2])
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001565
1566 " x closes the popup
1567 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001568 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001569 call assert_equal(-1, winbufnr(winid))
1570
1571 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001572 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001573endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001574
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001575" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001576func Test_popup_filter_normal_cmd()
1577 CheckScreendump
1578
1579 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001580 let text = range(1, 20)->map({_, v -> string(v)})
1581 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1582 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001583 END
1584 call writefile(lines, 'XtestPopupNormal')
1585 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1586 call TermWait(buf, 100)
1587 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1588
1589 call StopVimInTerminal(buf)
1590 call delete('XtestPopupNormal')
1591endfunc
1592
Bram Moolenaar10476522020-09-24 22:57:31 +02001593" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001594func Test_popup_filter_win_execute()
1595 CheckScreendump
1596
1597 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001598 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1599 let g:id = popup_create(lines, #{
1600 \ minheight: &lines - 5,
1601 \ maxheight: &lines - 5,
1602 \ cursorline: 1,
1603 \ })
1604 redraw
1605 END
1606 call writefile(lines, 'XtestPopupWinExecute')
1607 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1608
1609 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1610 call term_sendkeys(buf, ":\<CR>")
1611
1612 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1613
1614 call StopVimInTerminal(buf)
1615 call delete('XtestPopupWinExecute')
1616endfunc
1617
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001618func Test_popup_set_firstline()
1619 CheckScreendump
1620
1621 let lines =<< trim END
1622 let lines = range(1, 50)->map({_, v -> string(v)})
1623 let g:id = popup_create(lines, #{
1624 \ minwidth: 20,
1625 \ maxwidth: 20,
1626 \ minheight: &lines - 5,
1627 \ maxheight: &lines - 5,
1628 \ cursorline: 1,
1629 \ })
1630 call popup_setoptions(g:id, #{firstline: 10})
1631 redraw
1632 END
1633 call writefile(lines, 'XtestPopupWinSetFirstline')
1634 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1635
1636 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1637
1638 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1639 call term_sendkeys(buf, ":\<CR>")
1640 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1641
1642 call StopVimInTerminal(buf)
1643 call delete('XtestPopupWinSetFirstline')
1644endfunc
1645
Bram Moolenaar10476522020-09-24 22:57:31 +02001646" this tests that we don't get stuck with an error in "win_execute()"
1647func Test_popup_filter_win_execute_error()
1648 CheckScreendump
1649
1650 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001651 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1652 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1653 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001654 call writefile(lines, 'XtestPopupWinExecuteError')
1655 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001656
1657 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1658 call term_sendkeys(buf, "\<CR>")
1659 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1660 call term_sendkeys(buf, "\<CR>")
1661 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1662 call term_sendkeys(buf, "\<CR>")
1663 call term_sendkeys(buf, "\<CR>")
1664 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1665
1666 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001667 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001668endfunc
1669
Bram Moolenaara42d9452019-06-15 21:46:30 +02001670func ShowDialog(key, result)
1671 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001672 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001673 \ filter: 'popup_filter_yesno',
1674 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001675 \ })
1676 redraw
1677 call feedkeys(a:key, "xt")
1678 call assert_equal(winid, s:cb_winid)
1679 call assert_equal(a:result, s:cb_res)
1680endfunc
1681
1682func Test_popup_dialog()
1683 func QuitCallback(id, res)
1684 let s:cb_winid = a:id
1685 let s:cb_res = a:res
1686 endfunc
1687
1688 let winid = ShowDialog("y", 1)
1689 let winid = ShowDialog("Y", 1)
1690 let winid = ShowDialog("n", 0)
1691 let winid = ShowDialog("N", 0)
1692 let winid = ShowDialog("x", 0)
1693 let winid = ShowDialog("X", 0)
1694 let winid = ShowDialog("\<Esc>", 0)
1695 let winid = ShowDialog("\<C-C>", -1)
1696
1697 delfunc QuitCallback
1698endfunc
1699
Bram Moolenaara730e552019-06-16 19:05:31 +02001700func ShowMenu(key, result)
1701 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001702 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001703 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001704 \ })
1705 redraw
1706 call feedkeys(a:key, "xt")
1707 call assert_equal(winid, s:cb_winid)
1708 call assert_equal(a:result, s:cb_res)
1709endfunc
1710
1711func Test_popup_menu()
1712 func QuitCallback(id, res)
1713 let s:cb_winid = a:id
1714 let s:cb_res = a:res
1715 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001716 " mapping won't be used in popup
1717 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001718
1719 let winid = ShowMenu(" ", 1)
1720 let winid = ShowMenu("j \<CR>", 2)
1721 let winid = ShowMenu("JjK \<CR>", 2)
1722 let winid = ShowMenu("jjjjjj ", 3)
1723 let winid = ShowMenu("kkk ", 1)
1724 let winid = ShowMenu("x", -1)
1725 let winid = ShowMenu("X", -1)
1726 let winid = ShowMenu("\<Esc>", -1)
1727 let winid = ShowMenu("\<C-C>", -1)
1728
1729 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001730 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001731endfunc
1732
1733func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001734 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001735
1736 let lines =<< trim END
1737 call setline(1, range(1, 20))
1738 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001739 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001740 func MenuDone(id, res)
1741 echomsg "selected " .. a:res
1742 endfunc
1743 END
1744 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001745 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001746 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1747
1748 call term_sendkeys(buf, "jj")
1749 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1750
1751 call term_sendkeys(buf, " ")
1752 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1753
1754 " clean up
1755 call StopVimInTerminal(buf)
1756 call delete('XtestPopupMenu')
1757endfunc
1758
Bram Moolenaarf914a332019-07-20 15:09:56 +02001759func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001760 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001761
1762 let lines =<< trim END
1763 call setline(1, range(1, 20))
1764 hi PopupSelected ctermbg=green
1765 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1766 func MenuDone(id, res)
1767 echomsg "selected " .. a:res
1768 endfunc
1769 END
1770 call writefile(lines, 'XtestPopupNarrowMenu')
1771 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1772 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1773
1774 " clean up
1775 call term_sendkeys(buf, "x")
1776 call StopVimInTerminal(buf)
1777 call delete('XtestPopupNarrowMenu')
1778endfunc
1779
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001780func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001781 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001782
1783 " Create a popup without title or border, a line of padding will be added to
1784 " put the title on.
1785 let lines =<< trim END
1786 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001787 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001788 END
1789 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001790 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001791 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1792
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001793 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1794 call term_sendkeys(buf, ":\<CR>")
1795 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1796
1797 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1798 call term_sendkeys(buf, ":\<CR>")
1799 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1800
Bram Moolenaar3ae50c72020-12-12 18:18:06 +01001801 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1802 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, padding: [2, 2, 2, 2]})\<CR>")
1803 call term_sendkeys(buf, ":\<CR>")
1804 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_3', {})
1805
1806 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1807 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, border: [], padding: [2, 2, 2, 2]})\<CR>")
1808 call term_sendkeys(buf, ":\<CR>")
1809 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_4', {})
1810
Ralf Schandlbc869872021-05-28 14:12:14 +02001811 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1812 call term_sendkeys(buf, ":call popup_menu(['This is a line', 'and another line'], #{title: '▶ÄÖÜ◀', })\<CR>")
1813 call VerifyScreenDump(buf, 'Test_popupwin_multibytetitle', {})
1814 call term_sendkeys(buf, "x")
1815
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001816 " clean up
1817 call StopVimInTerminal(buf)
1818 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001819
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001820 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001821 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001822 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001823 call assert_equal('Another Title', popup_getoptions(winid).title)
1824
1825 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001826endfunc
1827
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001828func Test_popup_close_callback()
1829 func PopupDone(id, result)
1830 let g:result = a:result
1831 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001832 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001833 redraw
1834 call popup_close(winid, 'done')
1835 call assert_equal('done', g:result)
1836endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001837
1838func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001839 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001840 redraw
1841 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001842 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001843 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001844 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001845
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001846 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001847 redraw
1848 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001849 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001850 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001851 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001852endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001853
1854func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001855 CheckScreendump
1856
Bram Moolenaar988c4332019-06-02 14:12:11 +02001857 " +-----------------------------+
1858 " | | |
1859 " | | |
1860 " | | |
1861 " | line1 |
1862 " |------------line2------------|
1863 " | line3 |
1864 " | line4 |
1865 " | |
1866 " | |
1867 " +-----------------------------+
1868 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001869 split
1870 vsplit
1871 let info_window1 = getwininfo()[0]
1872 let line = info_window1['height']
1873 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001874 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001875 \ line : line,
1876 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001877 \ })
1878 END
1879 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001880 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001881 call term_sendkeys(buf, "\<C-W>w")
1882 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1883
1884 " clean up
1885 call StopVimInTerminal(buf)
1886 call delete('XtestPopupBehind')
1887endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001888
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001889func s:VerifyPosition(p, msg, line, col, width, height)
1890 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1891 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1892 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1893 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001894endfunc
1895
1896func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001897 " Anything placed past the last cell on the right of the screen is moved to
1898 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001899 "
1900 " When wrapping is disabled, we also shift to the left to display on the
1901 " screen, unless fixed is set.
1902
1903 " Entries for cases which don't vary based on wrapping.
1904 " Format is per tests described below
1905 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001906 \ ['a', 5, &columns, 5, &columns, 1, 1],
1907 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1908 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001909 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001910 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001911
1912 " these test groups are dicts with:
1913 " - comment: something to identify the group of tests by
1914 " - options: dict of options to merge with the row/col in tests
1915 " - tests: list of cases. Each one is a list with elements:
1916 " - text
1917 " - row
1918 " - col
1919 " - expected row
1920 " - expected col
1921 " - expected width
1922 " - expected height
1923 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001924 \ #{
1925 \ comment: 'left-aligned with wrapping',
1926 \ options: #{
1927 \ wrap: 1,
1928 \ pos: 'botleft',
1929 \ },
1930 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001931 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1932 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1933 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1934 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1935 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1936 \
1937 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1938 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1939 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1940 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1941 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1942 \
1943 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1944 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1945 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001946 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1947 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001948 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001949 \ ],
1950 \ },
1951 \ #{
1952 \ comment: 'left aligned without wrapping',
1953 \ options: #{
1954 \ wrap: 0,
1955 \ pos: 'botleft',
1956 \ },
1957 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001958 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1959 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1960 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1961 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1962 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1963 \
1964 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1965 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1966 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1967 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1968 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1969 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001970 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1971 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1972 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1973 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1974 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1975 \ ],
1976 \ },
1977 \ #{
1978 \ comment: 'left aligned with fixed position',
1979 \ options: #{
1980 \ wrap: 0,
1981 \ fixed: 1,
1982 \ pos: 'botleft',
1983 \ },
1984 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001985 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1986 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1987 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1988 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1989 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1990 \
1991 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1992 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1993 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1994 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1995 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1996 \
1997 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1998 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1999 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002000 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2001 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2002 \ ],
2003 \ },
2004 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002005
2006 for test_group in tests
2007 for test in test_group.tests
2008 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002009 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002010 \ line: line,
2011 \ col: col,
2012 \ }
2013 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002014
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002015 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002016
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002017 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002018 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
2019 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002020 endfor
2021 endfor
2022
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002023 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002024 %bwipe!
2025endfunc
2026
Bram Moolenaar3397f742019-06-02 18:40:06 +02002027func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002028 " width of screen
2029 let X = join(map(range(&columns), {->'X'}), '')
2030
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002031 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2032 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002033
2034 redraw
2035 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2036 call assert_equal(X, line)
2037
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002038 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002039 redraw
2040
2041 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002042 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
2043 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002044
2045 redraw
2046 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2047 call assert_equal(X, line)
2048
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002049 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002050 redraw
2051
2052 " Extend so > window width
2053 let X .= 'x'
2054
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002055 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2056 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002057
2058 redraw
2059 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2060 call assert_equal(X[ : -2 ], line)
2061
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002062 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002063 redraw
2064
2065 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002066 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2067 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002068
2069 redraw
2070 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2071 call assert_equal(X[ : -2 ], line)
2072
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002073 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002074 redraw
2075
2076 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002077 let p = popup_create(X,
2078 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2079 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002080
2081 redraw
2082 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2083 let e_line = ' ' . X[ 1 : -2 ]
2084 call assert_equal(e_line, line)
2085
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002086 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002087 redraw
2088
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002089 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002090 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002091endfunc
2092
2093func Test_popup_moved()
2094 new
2095 call test_override('char_avail', 1)
2096 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2097
2098 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002099 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002100 redraw
2101 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002102 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002103 " trigger the check for last_cursormoved by going into insert mode
2104 call feedkeys("li\<Esc>", 'xt')
2105 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002106 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002107
2108 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002109 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002110 redraw
2111 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002112 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002113 call feedkeys("hi\<Esc>", 'xt')
2114 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002115 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002116
2117 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002118 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002119 redraw
2120 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002121 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002122 call feedkeys("li\<Esc>", 'xt')
2123 call assert_equal(1, popup_getpos(winid).visible)
2124 call feedkeys("ei\<Esc>", 'xt')
2125 call assert_equal(1, popup_getpos(winid).visible)
2126 call feedkeys("eli\<Esc>", 'xt')
2127 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002128 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002129
Bram Moolenaar17627312019-06-02 19:53:44 +02002130 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002131 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002132 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002133 redraw
2134 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002135 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002136 call feedkeys("eli\<Esc>", 'xt')
2137 call assert_equal(1, popup_getpos(winid).visible)
2138 call feedkeys("wi\<Esc>", 'xt')
2139 call assert_equal(1, popup_getpos(winid).visible)
2140 call feedkeys("Eli\<Esc>", 'xt')
2141 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002142 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002143
2144 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002145 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002146 redraw
2147 call assert_equal(1, popup_getpos(winid).visible)
2148 call feedkeys("eli\<Esc>", 'xt')
2149 call feedkeys("ei\<Esc>", 'xt')
2150 call assert_equal(1, popup_getpos(winid).visible)
2151 call feedkeys("eli\<Esc>", 'xt')
2152 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002153 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002154
2155 bwipe!
2156 call test_override('ALL', 0)
2157endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002158
2159func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002160 CheckFeature timers
2161 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002162
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002163 let lines =<< trim END
2164 call setline(1, range(1, 20))
2165 hi Notification ctermbg=lightblue
2166 call popup_notification('first notification', {})
2167 END
2168 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002169 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002170 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2171
2172 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002173 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2174 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002175 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2176
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002177 " clean up
2178 call StopVimInTerminal(buf)
2179 call delete('XtestNotifications')
2180endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002181
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002182func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002183 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002184
2185 let lines =<< trim END
2186 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002187 hi ScrollThumb ctermbg=blue
2188 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002189 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002190 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002191 \ minwidth: 8,
2192 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002193 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002194 func ScrollUp()
2195 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2196 endfunc
2197 func ScrollDown()
2198 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2199 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002200 func ClickTop()
2201 call feedkeys("\<F4>\<LeftMouse>", "xt")
2202 endfunc
2203 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002204 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002205 call feedkeys("\<F5>\<LeftMouse>", "xt")
2206 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002207 func Popup_filter(winid, key)
2208 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002209 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002210 let line = popup_getoptions(a:winid).firstline
2211 let nlines = line('$', a:winid)
2212 let newline = line < nlines ? (line + 1) : nlines
2213 call popup_setoptions(a:winid, #{firstline: newline})
2214 return v:true
2215 elseif a:key == 'x'
2216 call popup_close(a:winid)
2217 return v:true
2218 endif
2219 endfunc
2220
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002221 def CreatePopup(text: list<string>)
Bram Moolenaare0de1712020-12-02 17:36:54 +01002222 popup_create(text, {
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002223 \ minwidth: 30,
2224 \ maxwidth: 30,
2225 \ minheight: 4,
2226 \ maxheight: 4,
2227 \ firstline: 1,
2228 \ lastline: 4,
2229 \ wrap: true,
2230 \ scrollbar: true,
2231 \ mapping: false,
2232 \ filter: Popup_filter,
2233 \ })
2234 enddef
2235
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002236 func PopupScroll()
2237 call popup_clear()
2238 let text =<< trim END
2239 1
2240 2
2241 3
2242 4
2243 long line long line long line long line long line long line
2244 long line long line long line long line long line long line
2245 long line long line long line long line long line long line
2246 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002247 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002248 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002249 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002250 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2251 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002252 END
2253 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002254 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002255 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2256
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002257 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002258 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002259 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2260
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002261 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002262 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002263 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2264
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002265 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002266 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002267 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2268
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002269 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002270 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002271 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2272 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2273
2274 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2275 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2276
2277 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002278 " wait a bit, otherwise it fails sometimes (double click recognized?)
2279 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002280 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2281 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2282
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002283 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2284 sleep 100m
2285 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2286 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2287
2288 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2289 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2290
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002291 " remove the minwidth and maxheight
2292 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002293 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002294 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2295
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002296 " check size with non-wrapping lines
2297 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2298 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2299
2300 " check size with wrapping lines
2301 call term_sendkeys(buf, "j")
2302 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002303
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002304 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002305 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002306 call StopVimInTerminal(buf)
2307 call delete('XtestPopupScroll')
2308endfunc
2309
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002310func Test_popup_too_high_scrollbar()
2311 CheckScreendump
2312
2313 let lines =<< trim END
2314 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2315 set scrolloff=0
2316 func ShowPopup()
2317 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2318 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2319 \ minwidth: 8,
2320 \ border: [],
2321 \ })
2322 endfunc
2323 normal 3G$
2324 call ShowPopup()
2325 END
2326 call writefile(lines, 'XtestPopupToohigh')
2327 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2328 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2329
2330 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2331 call term_sendkeys(buf, "8G$")
2332 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2333 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2334
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002335 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2336 call term_sendkeys(buf, "gg$")
2337 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2338 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2339
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002340 " clean up
2341 call StopVimInTerminal(buf)
2342 call delete('XtestPopupToohigh')
2343endfunc
2344
Bram Moolenaar437a7462019-07-05 20:17:22 +02002345func Test_popup_fitting_scrollbar()
2346 " this was causing a crash, divide by zero
2347 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002348 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002349 \ scrollbar: 1,
2350 \ maxwidth: 10,
2351 \ maxheight: 5,
2352 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002353 redraw
2354 call popup_clear()
2355endfunc
2356
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002357func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002358 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002359
2360 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002361 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002362 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002363 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002364 END
2365
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002366 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002367 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002368 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2369
2370 " Setting to empty string clears it
2371 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2372 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2373
2374 " Setting a list
2375 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2376 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2377
2378 " Shrinking with a list
2379 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2380 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2381
2382 " Growing with a list
2383 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2384 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2385
2386 " Empty list clears
2387 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2388 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2389
2390 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002391 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002392 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2393
Bram Moolenaarb0992022020-01-30 14:55:42 +01002394 " range() (doesn't work)
2395 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2396 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2397
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002398 " clean up
2399 call StopVimInTerminal(buf)
2400 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002401endfunc
2402
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002403func Test_popup_settext_getline()
2404 let id = popup_create('', #{ tabpage: 0 })
2405 call popup_settext(id, ['a','b'])
2406 call assert_equal(2, line('$', id)) " OK :)
2407 call popup_close(id)
2408
2409 let id = popup_create('', #{ tabpage: -1 })
2410 call popup_settext(id, ['a','b'])
2411 call assert_equal(2, line('$', id)) " Fails :(
2412 call popup_close(id)
2413endfunc
2414
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002415func Test_popup_settext_null()
2416 let id = popup_create('', #{ tabpage: 0 })
2417 call popup_settext(id, test_null_list())
2418 call popup_close(id)
2419
2420 let id = popup_create('', #{ tabpage: 0 })
2421 call popup_settext(id, test_null_string())
2422 call popup_close(id)
2423endfunc
2424
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002425func Test_popup_hidden()
2426 new
2427
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002428 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002429 redraw
2430 call assert_equal(0, popup_getpos(winid).visible)
2431 call popup_close(winid)
2432
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002433 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002434 redraw
2435 call assert_equal(0, popup_getpos(winid).visible)
2436 call popup_close(winid)
2437
2438 func QuitCallback(id, res)
2439 let s:cb_winid = a:id
2440 let s:cb_res = a:res
2441 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002442 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002443 \ filter: 'popup_filter_yesno',
2444 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002445 \ })
2446 redraw
2447 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002448 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2449 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002450 exe "normal anot used by filter\<Esc>"
2451 call assert_equal('not used by filter', getline(1))
2452
2453 call popup_show(winid)
2454 call feedkeys('y', "xt")
2455 call assert_equal(1, s:cb_res)
2456
2457 bwipe!
2458 delfunc QuitCallback
2459endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002460
2461" Test options not checked elsewhere
2462func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002463 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002464 let options = popup_getoptions(winid)
2465 call assert_equal(1, options.wrap)
2466 call assert_equal(0, options.drag)
2467 call assert_equal('Beautiful', options.highlight)
2468
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002469 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002470 let options = popup_getoptions(winid)
2471 call assert_equal(0, options.wrap)
2472 call assert_equal(1, options.drag)
2473 call assert_equal('Another', options.highlight)
2474
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002475 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2476 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2477
Bram Moolenaarae943152019-06-16 22:54:14 +02002478 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002479 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002480endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002481
2482func Test_popupwin_garbage_collect()
2483 func MyPopupFilter(x, winid, c)
2484 " NOP
2485 endfunc
2486
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002487 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002488 call test_garbagecollect_now()
2489 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002490 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002491 call feedkeys('j', 'xt')
2492 call assert_true(v:true)
2493
2494 call popup_close(winid)
2495 delfunc MyPopupFilter
2496endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002497
Bram Moolenaar581ba392019-09-03 22:08:33 +02002498func Test_popupwin_filter_mode()
2499 func MyPopupFilter(winid, c)
2500 let s:typed = a:c
2501 if a:c == ':' || a:c == "\r" || a:c == 'v'
2502 " can start cmdline mode, get out, and start/stop Visual mode
2503 return 0
2504 endif
2505 return 1
2506 endfunc
2507
2508 " Normal, Visual and Insert mode
2509 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2510 redraw
2511 call feedkeys('x', 'xt')
2512 call assert_equal('x', s:typed)
2513
2514 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2515 call assert_equal(':', s:typed)
2516 call assert_equal('foo', g:foo)
2517
2518 let @x = 'something'
2519 call feedkeys('v$"xy', 'xt')
2520 call assert_equal('y', s:typed)
2521 call assert_equal('something', @x) " yank command is filtered out
2522 call feedkeys('v', 'xt') " end Visual mode
2523
2524 call popup_close(winid)
2525
2526 " only Normal mode
2527 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2528 redraw
2529 call feedkeys('x', 'xt')
2530 call assert_equal('x', s:typed)
2531
2532 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2533 call assert_equal(':', s:typed)
2534 call assert_equal('foo', g:foo)
2535
2536 let @x = 'something'
2537 call feedkeys('v$"xy', 'xt')
2538 call assert_equal('v', s:typed)
2539 call assert_notequal('something', @x)
2540
2541 call popup_close(winid)
2542
2543 " default: all modes
2544 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2545 redraw
2546 call feedkeys('x', 'xt')
2547 call assert_equal('x', s:typed)
2548
2549 let g:foo = 'bar'
2550 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2551 call assert_equal("\r", s:typed)
2552 call assert_equal('bar', g:foo)
2553
2554 let @x = 'something'
2555 call feedkeys('v$"xy', 'xt')
2556 call assert_equal('y', s:typed)
2557 call assert_equal('something', @x) " yank command is filtered out
2558 call feedkeys('v', 'xt') " end Visual mode
2559
2560 call popup_close(winid)
2561 delfunc MyPopupFilter
2562endfunc
2563
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002564func Test_popupwin_filter_mouse()
2565 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002566 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002567 return 0
2568 endfunc
2569
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002570 call setline(1, ['.'->repeat(25)]->repeat(10))
2571 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2572 \ line: 2,
2573 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002574 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002575 \ padding: [],
2576 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002577 \ filter: 'MyPopupFilter',
2578 \ })
2579 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002580 " 123456789012345678901
2581 " 1 .....................
2582 " 2 ...+--------------+..
2583 " 3 ...| |..
2584 " 4 ...| short |..
2585 " 5 ...| long line th |..
2586 " 6 ...| at will wrap |..
2587 " 7 ...| other |..
2588 " 8 ...| |..
2589 " 9 ...+--------------+..
2590 " 10 .....................
2591 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002592
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002593 func AddItemOutsidePopup(tests, row, col)
2594 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2595 \ screenrow: a:row, screencol: a:col,
2596 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2597 \ line: a:row, column: a:col,
2598 \ }})
2599 endfunc
2600 func AddItemInPopupBorder(tests, winid, row, col)
2601 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2602 \ screenrow: a:row, screencol: a:col,
2603 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2604 \ line: 0, column: 0,
2605 \ }})
2606 endfunc
2607 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2608 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2609 \ screenrow: a:row, screencol: a:col,
2610 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2611 \ line: a:textline, column: a:textcol,
2612 \ }})
2613 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002614
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002615 " above and below popup
2616 for c in range(1, 21)
2617 call AddItemOutsidePopup(tests, 1, c)
2618 call AddItemOutsidePopup(tests, 10, c)
2619 endfor
2620 " left and right of popup
2621 for r in range(1, 10)
2622 call AddItemOutsidePopup(tests, r, 3)
2623 call AddItemOutsidePopup(tests, r, 20)
2624 endfor
2625 " top and bottom in popup
2626 for c in range(4, 19)
2627 call AddItemInPopupBorder(tests, winid, 2, c)
2628 call AddItemInPopupBorder(tests, winid, 3, c)
2629 call AddItemInPopupBorder(tests, winid, 8, c)
2630 call AddItemInPopupBorder(tests, winid, 9, c)
2631 endfor
2632 " left and right margin in popup
2633 for r in range(2, 9)
2634 call AddItemInPopupBorder(tests, winid, r, 4)
2635 call AddItemInPopupBorder(tests, winid, r, 5)
2636 call AddItemInPopupBorder(tests, winid, r, 18)
2637 call AddItemInPopupBorder(tests, winid, r, 19)
2638 endfor
2639 " text "short"
2640 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2641 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2642 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2643 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2644 " text "long line th"
2645 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2646 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2647 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2648 " text "at will wrap"
2649 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2650 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2651 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2652 " text "other"
2653 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2654 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2655 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2656 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002657
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002658 for item in tests
2659 call test_setmouse(item.clickrow, item.clickcol)
2660 call feedkeys("\<LeftMouse>", 'xt')
2661 call assert_equal(item.result, g:got_mousepos)
2662 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002663
2664 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002665 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002666 delfunc MyPopupFilter
2667endfunc
2668
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002669func Test_popupwin_with_buffer()
2670 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2671 let buf = bufadd('XsomeFile')
2672 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002673
2674 setlocal number
2675 call setbufvar(buf, "&wrapmargin", 13)
2676
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002677 let winid = popup_create(buf, {})
2678 call assert_notequal(0, winid)
2679 let pos = popup_getpos(winid)
2680 call assert_equal(2, pos.height)
2681 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002682
2683 " window-local option is set to default, buffer-local is not
2684 call assert_equal(0, getwinvar(winid, '&number'))
2685 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2686
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002687 call popup_close(winid)
2688 call assert_equal({}, popup_getpos(winid))
2689 call assert_equal(1, bufloaded(buf))
2690 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002691 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002692
2693 edit test_popupwin.vim
2694 let winid = popup_create(bufnr(''), {})
2695 redraw
2696 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002697 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002698endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002699
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002700func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002701 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002702 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002703 " Starting a terminal to run a shell in is considered flaky.
2704 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002705
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002706 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002707
2708 " open help window to test that :help below fails
2709 help
2710
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002711 let termbuf = term_start(&shell, #{hidden: 1})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002712 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002713 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002714 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002715 " Wait for a prompt (see border char first, then space after prompt)
2716 call WaitForAssert({ -> assert_equal(' ', screenstring(screenrow(), screencol() - 1))})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002717
2718 " When typing a character, the cursor is after it.
2719 call feedkeys("x", 'xt')
Bram Moolenaar0353f562020-12-17 22:27:38 +01002720 call term_wait(termbuf)
Bram Moolenaarf5452692020-11-28 21:56:06 +01002721 redraw
2722 call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))})
2723 call feedkeys("\<BS>", 'xt')
2724
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002725 " Check this doesn't crash
2726 call assert_equal(winnr(), winnr('j'))
2727 call assert_equal(winnr(), winnr('k'))
2728 call assert_equal(winnr(), winnr('h'))
2729 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002730
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002731 " Cannot quit while job is running
2732 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002733
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002734 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002735 call feedkeys("xxx\<C-W>N", 'xt')
2736 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2737 call feedkeys("a\<C-U>", 'xt')
2738
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002739 " Cannot escape from terminal window
2740 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002741 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002742
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002743 " Cannot open a second one.
2744 let termbuf2 = term_start(&shell, #{hidden: 1})
2745 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2746 call term_sendkeys(termbuf2, "exit\<CR>")
2747
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002748 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002749 call feedkeys("exit\<CR>", 'xt')
2750 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002751 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002752
Bram Moolenaar349f6092020-10-06 20:46:49 +02002753 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002754 call feedkeys(":quit\<CR>", 'xt')
2755 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002756endfunc
2757
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002758func Test_popupwin_close_prevwin()
2759 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002760 call Popupwin_close_prevwin()
2761endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002762
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002763def Popupwin_close_prevwin()
2764 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002765 split
2766 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002767 assert_equal(2, winnr())
Bram Moolenaare0de1712020-12-02 17:36:54 +01002768 var buf = term_start(&shell, {hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002769 popup_create(buf, {})
2770 TermWait(buf, 100)
2771 popup_clear(true)
2772 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002773
2774 quit
2775 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002776enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002777
Bram Moolenaar934470e2019-09-01 23:27:05 +02002778func Test_popupwin_with_buffer_and_filter()
2779 new Xwithfilter
2780 call setline(1, range(100))
2781 let bufnr = bufnr()
2782 hide
2783
2784 func BufferFilter(win, key)
2785 if a:key == 'G'
2786 " recursive use of "G" does not cause problems.
2787 call win_execute(a:win, 'normal! G')
2788 return 1
2789 endif
2790 return 0
2791 endfunc
2792
2793 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2794 call assert_equal(1, popup_getpos(winid).firstline)
2795 redraw
2796 call feedkeys("G", 'xt')
2797 call assert_equal(99, popup_getpos(winid).firstline)
2798
2799 call popup_close(winid)
2800 exe 'bwipe! ' .. bufnr
2801endfunc
2802
Bram Moolenaare296e312019-07-03 23:20:18 +02002803func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002804 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002805 \ maxwidth: 40,
2806 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002807 \ })
2808 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002809 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002810 redraw
2811 call assert_equal(19, popup_getpos(winid).width)
2812 endfor
2813 call popup_clear()
2814endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002815
2816func Test_popupwin_buf_close()
2817 let buf = bufadd('Xtestbuf')
2818 call bufload(buf)
2819 call setbufline(buf, 1, ['just', 'some', 'lines'])
2820 let winid = popup_create(buf, {})
2821 redraw
2822 call assert_equal(3, popup_getpos(winid).height)
2823 let bufinfo = getbufinfo(buf)[0]
2824 call assert_equal(1, bufinfo.changed)
2825 call assert_equal(0, bufinfo.hidden)
2826 call assert_equal(0, bufinfo.listed)
2827 call assert_equal(1, bufinfo.loaded)
2828 call assert_equal([], bufinfo.windows)
2829 call assert_equal([winid], bufinfo.popups)
2830
2831 call popup_close(winid)
2832 call assert_equal({}, popup_getpos(winid))
2833 let bufinfo = getbufinfo(buf)[0]
2834 call assert_equal(1, bufinfo.changed)
2835 call assert_equal(1, bufinfo.hidden)
2836 call assert_equal(0, bufinfo.listed)
2837 call assert_equal(1, bufinfo.loaded)
2838 call assert_equal([], bufinfo.windows)
2839 call assert_equal([], bufinfo.popups)
2840 exe 'bwipe! ' .. buf
2841endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002842
2843func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002844 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002845
2846 let lines =<< trim END
2847 call setline(1, range(1, 10))
2848 hi ScrollThumb ctermbg=blue
2849 hi ScrollBar ctermbg=red
2850 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002851 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002852 \ maxwidth: 10,
2853 \ maxheight: 3,
2854 \ pos : 'topleft',
2855 \ col : a:col,
2856 \ line : a:line,
2857 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002858 \ })
2859 endfunc
2860 call PopupMenu(['x'], 1, 1)
2861 call PopupMenu(['123456789|'], 1, 16)
2862 call PopupMenu(['123456789|' .. ' '], 7, 1)
2863 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2864 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2865 END
2866 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002867 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002868 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2869
2870 " close the menu popupwin.
2871 call term_sendkeys(buf, " ")
2872 call term_sendkeys(buf, " ")
2873 call term_sendkeys(buf, " ")
2874 call term_sendkeys(buf, " ")
2875 call term_sendkeys(buf, " ")
2876
2877 " clean up
2878 call StopVimInTerminal(buf)
2879 call delete('XtestPopupMenuMaxWidth')
2880endfunc
2881
Bram Moolenaara901a372019-07-13 16:38:50 +02002882func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002883 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002884
2885 let lines =<< trim END
2886 call setline(1, range(1, 20))
2887 hi ScrollThumb ctermbg=blue
2888 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002889 eval ['one', 'two', 'three', 'four', 'five',
2890 \ 'six', 'seven', 'eight', 'nine']
2891 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002892 \ minwidth: 8,
2893 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002894 \ })
2895 END
2896 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002897 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002898
2899 call term_sendkeys(buf, "j")
2900 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2901
2902 call term_sendkeys(buf, "jjj")
2903 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2904
2905 " if the cursor is the bottom line, it stays at the bottom line.
2906 call term_sendkeys(buf, repeat("j", 20))
2907 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2908
2909 call term_sendkeys(buf, "kk")
2910 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2911
2912 call term_sendkeys(buf, "k")
2913 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2914
2915 " if the cursor is in the top line, it stays in the top line.
2916 call term_sendkeys(buf, repeat("k", 20))
2917 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2918
2919 " close the menu popupwin.
2920 call term_sendkeys(buf, " ")
2921
2922 " clean up
2923 call StopVimInTerminal(buf)
2924 call delete('XtestPopupMenuScroll')
2925endfunc
2926
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002927func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002928 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002929
2930 let lines =<< trim END
2931 function! MyFilter(winid, key) abort
2932 if a:key == "0"
2933 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2934 return 1
2935 endif
2936 if a:key == "G"
2937 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2938 return 1
2939 endif
2940 if a:key == "j"
2941 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2942 return 1
2943 endif
2944 if a:key == "k"
2945 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2946 return 1
2947 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002948 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002949 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002950 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002951 endif
2952 return 0
2953 endfunction
2954 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2955 \ maxheight : 3,
2956 \ filter : 'MyFilter'
2957 \ })
2958 END
2959 call writefile(lines, 'XtestPopupMenuFilter')
2960 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2961
2962 call term_sendkeys(buf, "j")
2963 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2964
2965 call term_sendkeys(buf, "k")
2966 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2967
2968 call term_sendkeys(buf, "G")
2969 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2970
2971 call term_sendkeys(buf, "0")
2972 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2973
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002974 " check that when the popup is closed in the filter the screen is redrawn
2975 call term_sendkeys(buf, ":")
2976 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2977 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002978
2979 " clean up
2980 call StopVimInTerminal(buf)
2981 call delete('XtestPopupMenuFilter')
2982endfunc
2983
2984func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002985 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002986
2987 let winid = popup_create('some text', {})
2988 call assert_equal(0, popup_getoptions(winid).cursorline)
2989 call popup_close(winid)
2990
2991 let winid = popup_create('some text', #{ cursorline: 1, })
2992 call assert_equal(1, popup_getoptions(winid).cursorline)
2993 call popup_close(winid)
2994
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01002995 let winid = popup_create('some text', #{ cursorline: v:true, })
2996 call assert_equal(1, popup_getoptions(winid).cursorline)
2997 call popup_close(winid)
2998
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002999 let winid = popup_create('some text', #{ cursorline: 0, })
3000 call assert_equal(0, popup_getoptions(winid).cursorline)
3001 call popup_close(winid)
3002
3003 let winid = popup_menu('some text', {})
3004 call assert_equal(1, popup_getoptions(winid).cursorline)
3005 call popup_close(winid)
3006
3007 let winid = popup_menu('some text', #{ cursorline: 1, })
3008 call assert_equal(1, popup_getoptions(winid).cursorline)
3009 call popup_close(winid)
3010
3011 let winid = popup_menu('some text', #{ cursorline: 0, })
3012 call assert_equal(0, popup_getoptions(winid).cursorline)
3013 call popup_close(winid)
3014
3015 " ---------
3016 " Pattern 1
3017 " ---------
3018 let lines =<< trim END
3019 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
3020 END
3021 call writefile(lines, 'XtestPopupCursorLine')
3022 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3023 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
3024 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3025 call StopVimInTerminal(buf)
3026
3027 " ---------
3028 " Pattern 2
3029 " ---------
3030 let lines =<< trim END
3031 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
3032 END
3033 call writefile(lines, 'XtestPopupCursorLine')
3034 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3035 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
3036 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3037 call StopVimInTerminal(buf)
3038
3039 " ---------
3040 " Pattern 3
3041 " ---------
3042 let lines =<< trim END
3043 function! MyFilter(winid, key) abort
3044 if a:key == "j"
3045 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3046 return 1
3047 endif
3048 if a:key == 'x'
3049 call popup_close(a:winid)
3050 return 1
3051 endif
3052 return 0
3053 endfunction
3054 call popup_menu(['111', '222', '333'], #{
3055 \ cursorline : 0,
3056 \ maxheight : 2,
3057 \ filter : 'MyFilter',
3058 \ })
3059 END
3060 call writefile(lines, 'XtestPopupCursorLine')
3061 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3062 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3063 call term_sendkeys(buf, "j")
3064 call term_sendkeys(buf, "j")
3065 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3066 call term_sendkeys(buf, "x")
3067 call StopVimInTerminal(buf)
3068
3069 " ---------
3070 " Pattern 4
3071 " ---------
3072 let lines =<< trim END
3073 function! MyFilter(winid, key) abort
3074 if a:key == "j"
3075 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3076 return 1
3077 endif
3078 if a:key == 'x'
3079 call popup_close(a:winid)
3080 return 1
3081 endif
3082 return 0
3083 endfunction
3084 call popup_menu(['111', '222', '333'], #{
3085 \ cursorline : 1,
3086 \ maxheight : 2,
3087 \ filter : 'MyFilter',
3088 \ })
3089 END
3090 call writefile(lines, 'XtestPopupCursorLine')
3091 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3092 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3093 call term_sendkeys(buf, "j")
3094 call term_sendkeys(buf, "j")
3095 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3096 call term_sendkeys(buf, "x")
3097 call StopVimInTerminal(buf)
3098
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003099 " ---------
3100 " Cursor in second line when creating the popup
3101 " ---------
3102 let lines =<< trim END
3103 let winid = popup_create(['111', '222', '333'], #{
3104 \ cursorline : 1,
3105 \ })
3106 call win_execute(winid, "2")
3107 END
3108 call writefile(lines, 'XtestPopupCursorLine')
3109 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3110 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3111 call StopVimInTerminal(buf)
3112
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003113 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003114
3115 " ---------
3116 " Use current buffer for popupmenu
3117 " ---------
3118 let lines =<< trim END
3119 call setline(1, ['one', 'two', 'three'])
3120 let winid = popup_create(bufnr('%'), #{
3121 \ cursorline : 1,
3122 \ })
3123 call win_execute(winid, "2")
3124 END
3125 call writefile(lines, 'XtestPopupCursorLine')
3126 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3127 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3128 call StopVimInTerminal(buf)
3129
3130 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003131endfunc
3132
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003133def Test_popup_cursorline_vim9()
3134 var winid = popup_create('some text', { cursorline: true, })
3135 assert_equal(1, popup_getoptions(winid).cursorline)
3136 popup_close(winid)
3137
3138 assert_fails("popup_create('some text', { cursorline: 2, })", 'E1023:')
3139 popup_clear()
3140enddef
3141
Bram Moolenaarf914a332019-07-20 15:09:56 +02003142func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003143 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003144 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003145
Bram Moolenaarf914a332019-07-20 15:09:56 +02003146 call writefile([
3147 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3148 \ "another\tXtagfile\t/^this is another",
3149 \ "theword\tXtagfile\t/^theword"],
3150 \ 'Xtags')
3151 call writefile(range(1,20)
3152 \ + ['theword is here']
3153 \ + range(22, 27)
3154 \ + ['this is another place']
3155 \ + range(29, 40),
3156 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003157 call writefile(range(1,10)
3158 \ + ['searched word is here']
3159 \ + range(12, 20),
3160 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003161 let lines =<< trim END
3162 set tags=Xtags
3163 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003164 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003165 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003166 \ 'three',
3167 \ 'four',
3168 \ 'five',
3169 \ 'six',
3170 \ 'seven',
3171 \ 'find theword somewhere',
3172 \ 'nine',
3173 \ 'this is another word',
3174 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003175 set previewpopup=height:4,width:40
Bram Moolenaar60577482021-03-04 21:35:07 +01003176 hi OtherColor ctermbg=lightcyan guibg=lightcyan
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003177 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003178 END
3179 call writefile(lines, 'XtestPreviewPopup')
3180 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3181
3182 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3183 call term_sendkeys(buf, ":\<CR>")
3184 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3185
Bram Moolenaar60577482021-03-04 21:35:07 +01003186 call term_sendkeys(buf, ":set previewpopup+=highlight:OtherColor\<CR>")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003187 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3188 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3189
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003190 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003191 call term_sendkeys(buf, ":\<CR>")
3192 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3193
3194 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3195 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3196
Bram Moolenaar799439a2020-02-11 21:44:17 +01003197 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003198 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003199 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003200
Bram Moolenaar60577482021-03-04 21:35:07 +01003201 call term_sendkeys(buf, ":set previewpopup-=highlight:OtherColor\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003202 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003203 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003204 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3205
3206 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3207 call term_sendkeys(buf, ":\<CR>")
3208 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3209
3210 call term_sendkeys(buf, ":pclose\<CR>")
3211 call term_sendkeys(buf, ":psearch searched\<CR>")
3212 call term_sendkeys(buf, ":\<CR>")
3213 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003214
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003215 call term_sendkeys(buf, "\<C-W>p")
3216 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3217
3218 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3219 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3220
Bram Moolenaarf914a332019-07-20 15:09:56 +02003221 call StopVimInTerminal(buf)
3222 call delete('Xtags')
3223 call delete('Xtagfile')
3224 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003225 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003226endfunc
3227
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003228func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003229 let lines =<< trim END
3230 set completeopt+=preview,popup
3231 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003232 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003233
3234 func CompleteFuncDict(findstart, base)
3235 if a:findstart
3236 if col('.') > 10
3237 return col('.') - 10
3238 endif
3239 return 0
3240 endif
3241
3242 return {
3243 \ 'words': [
3244 \ {
3245 \ 'word': 'aword',
3246 \ 'abbr': 'wrd',
3247 \ 'menu': 'extra text',
3248 \ 'info': 'words are cool',
3249 \ 'kind': 'W',
3250 \ 'user_data': 'test'
3251 \ },
3252 \ {
3253 \ 'word': 'anotherword',
3254 \ 'abbr': 'anotwrd',
3255 \ 'menu': 'extra text',
3256 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3257 \ 'kind': 'W',
3258 \ 'user_data': 'notest'
3259 \ },
3260 \ {
3261 \ 'word': 'noinfo',
3262 \ 'abbr': 'noawrd',
3263 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003264 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003265 \ 'kind': 'W',
3266 \ 'user_data': 'notest'
3267 \ },
3268 \ {
3269 \ 'word': 'thatword',
3270 \ 'abbr': 'thatwrd',
3271 \ 'menu': 'extra text',
3272 \ 'info': 'that word is cool',
3273 \ 'kind': 'W',
3274 \ 'user_data': 'notest'
3275 \ },
3276 \ ]
3277 \ }
3278 endfunc
3279 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003280 func ChangeColor()
3281 let id = popup_findinfo()
Bram Moolenaard356fc62020-12-09 18:13:44 +01003282 if buflisted(winbufnr(id))
3283 call setline(1, 'buffer is listed')
3284 endif
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003285 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003286 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003287
3288 func InfoHidden()
3289 set completepopup=height:4,border:off,align:menu
3290 set completeopt-=popup completeopt+=popuphidden
3291 au CompleteChanged * call HandleChange()
3292 endfunc
3293
3294 let s:counter = 0
3295 func HandleChange()
3296 let s:counter += 1
3297 let selected = complete_info(['selected']).selected
3298 if selected <= 0
3299 " First time: do nothing, info remains hidden
3300 return
3301 endif
3302 if selected == 1
3303 " Second time: show info right away
3304 let id = popup_findinfo()
3305 if id
3306 call popup_settext(id, 'immediate info ' .. s:counter)
3307 call popup_show(id)
3308 endif
3309 else
3310 " Third time: show info after a short delay
3311 call timer_start(100, 'ShowInfo')
3312 endif
3313 endfunc
3314
3315 func ShowInfo(...)
3316 let id = popup_findinfo()
3317 if id
3318 call popup_settext(id, 'async info ' .. s:counter)
3319 call popup_show(id)
3320 endif
3321 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003322
3323 " Check that no autocommands are triggered for the info popup
3324 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3325 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003326 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003327 return lines
3328endfunc
3329
3330func Test_popupmenu_info_border()
3331 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003332 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003333
3334 let lines = Get_popupmenu_lines()
3335 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003336 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003337
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003338 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003339 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003340
3341 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3342 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3343
3344 call term_sendkeys(buf, "\<C-N>")
3345 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3346
3347 call term_sendkeys(buf, "\<C-N>")
3348 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3349
3350 call term_sendkeys(buf, "\<C-N>\<C-N>")
3351 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3352
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003353 " info on the left with scrollbar
3354 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3355 call term_sendkeys(buf, "\<C-N>\<C-N>")
3356 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3357
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003358 " Test that the popupmenu's scrollbar and infopopup do not overlap
3359 call term_sendkeys(buf, "\<Esc>")
3360 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3361 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3362 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3363
Bram Moolenaar8e7d6222020-12-18 19:49:56 +01003364 " Hide the info popup, cycle through buffers, make sure it didn't get
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003365 " deleted.
3366 call term_sendkeys(buf, "\<Esc>")
3367 call term_sendkeys(buf, ":set hidden\<CR>")
3368 call term_sendkeys(buf, ":bn\<CR>")
3369 call term_sendkeys(buf, ":bn\<CR>")
3370 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3371 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3372
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003373 " Test that when the option is changed the popup changes.
3374 call term_sendkeys(buf, "\<Esc>")
3375 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3376 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3377 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3378
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003379 call term_sendkeys(buf, " \<Esc>")
3380 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3381 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3382 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3383
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003384 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003385 call StopVimInTerminal(buf)
3386 call delete('XtestInfoPopup')
3387endfunc
3388
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003389func Test_popupmenu_info_noborder()
3390 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003391 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003392
3393 let lines = Get_popupmenu_lines()
3394 call add(lines, 'set completepopup=height:4,border:off')
3395 call writefile(lines, 'XtestInfoPopupNb')
3396
3397 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003398 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003399
3400 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3401 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3402
3403 call StopVimInTerminal(buf)
3404 call delete('XtestInfoPopupNb')
3405endfunc
3406
Bram Moolenaar258cef52019-08-21 17:29:29 +02003407func Test_popupmenu_info_align_menu()
3408 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003409 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003410
3411 let lines = Get_popupmenu_lines()
3412 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3413 call writefile(lines, 'XtestInfoPopupNb')
3414
3415 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003416 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003417
3418 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3419 call term_sendkeys(buf, "\<C-N>")
3420 call term_sendkeys(buf, "\<C-N>")
3421 call term_sendkeys(buf, "\<C-N>")
3422 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3423
3424 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3425 call term_sendkeys(buf, "\<C-N>")
3426 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3427
3428 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003429 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003430 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3431 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3432 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3433
3434 call StopVimInTerminal(buf)
3435 call delete('XtestInfoPopupNb')
3436endfunc
3437
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003438func Test_popupmenu_info_hidden()
3439 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003440 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003441
3442 let lines = Get_popupmenu_lines()
3443 call add(lines, 'call InfoHidden()')
3444 call writefile(lines, 'XtestInfoPopupHidden')
3445
3446 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003447 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003448
3449 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3450 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3451
3452 call term_sendkeys(buf, "\<C-N>")
3453 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3454
3455 call term_sendkeys(buf, "\<C-N>")
3456 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3457
3458 call term_sendkeys(buf, "\<Esc>")
3459 call StopVimInTerminal(buf)
3460 call delete('XtestInfoPopupHidden')
3461endfunc
3462
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003463func Test_popupmenu_info_too_wide()
3464 CheckScreendump
3465 CheckFeature quickfix
3466
3467 let lines =<< trim END
3468 call setline(1, range(10))
3469
3470 set completeopt+=preview,popup
3471 set completepopup=align:menu
3472 set omnifunc=OmniFunc
3473 hi InfoPopup ctermbg=lightgrey
3474
3475 func OmniFunc(findstart, base)
3476 if a:findstart
3477 return 0
3478 endif
3479
3480 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3481 return #{
3482 \ words: [
3483 \ #{
3484 \ word: 'scrap',
3485 \ menu: menuText,
3486 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3487 \ },
3488 \ #{
3489 \ word: 'scappier',
3490 \ menu: menuText,
3491 \ info: 'words are cool',
3492 \ },
3493 \ #{
3494 \ word: 'scrappier2',
3495 \ menu: menuText,
3496 \ info: 'words are cool',
3497 \ },
3498 \ ]
3499 \ }
3500 endfunc
3501 END
3502
3503 call writefile(lines, 'XtestInfoPopupWide')
3504 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003505 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003506
3507 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3508 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3509
3510 call term_sendkeys(buf, "\<Esc>")
3511 call StopVimInTerminal(buf)
3512 call delete('XtestInfoPopupWide')
3513endfunc
3514
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003515func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003516 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003517 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003518 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003519 call assert_equal(bufnr, winbufnr(winid))
3520 call popup_clear()
3521endfunc
3522
Bram Moolenaar1824f452019-10-02 23:06:46 +02003523func Test_popupwin_getoptions_tablocal()
3524 topleft split
3525 let win1 = popup_create('nothing', #{maxheight: 8})
3526 let win2 = popup_create('something', #{maxheight: 10})
3527 let win3 = popup_create('something', #{maxheight: 15})
3528 call assert_equal(8, popup_getoptions(win1).maxheight)
3529 call assert_equal(10, popup_getoptions(win2).maxheight)
3530 call assert_equal(15, popup_getoptions(win3).maxheight)
3531 call popup_clear()
3532 quit
3533endfunc
3534
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003535func Test_popupwin_cancel()
3536 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3537 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3538 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3539 call assert_equal(5, popup_getpos(win1).line)
3540 call assert_equal(10, popup_getpos(win2).line)
3541 call assert_equal(15, popup_getpos(win3).line)
3542 " TODO: this also works without patch 8.1.2110
3543 call feedkeys("\<C-C>", 'xt')
3544 call assert_equal(5, popup_getpos(win1).line)
3545 call assert_equal(10, popup_getpos(win2).line)
3546 call assert_equal({}, popup_getpos(win3))
3547 call feedkeys("\<C-C>", 'xt')
3548 call assert_equal(5, popup_getpos(win1).line)
3549 call assert_equal({}, popup_getpos(win2))
3550 call assert_equal({}, popup_getpos(win3))
3551 call feedkeys("\<C-C>", 'xt')
3552 call assert_equal({}, popup_getpos(win1))
3553 call assert_equal({}, popup_getpos(win2))
3554 call assert_equal({}, popup_getpos(win3))
3555endfunc
3556
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003557func Test_popupwin_filter_redraw()
3558 " Create two popups with a filter that closes the popup when typing "0".
3559 " Both popups should close, even though the redraw also calls
3560 " popup_reset_handled()
3561
3562 func CloseFilter(winid, key)
3563 if a:key == '0'
3564 call popup_close(a:winid)
3565 redraw
3566 endif
3567 return 0 " pass the key
3568 endfunc
3569
3570 let id1 = popup_create('first one', #{
3571 \ line: 1,
3572 \ col: 1,
3573 \ filter: 'CloseFilter',
3574 \ })
3575 let id2 = popup_create('second one', #{
3576 \ line: 9,
3577 \ col: 1,
3578 \ filter: 'CloseFilter',
3579 \ })
3580 call assert_equal(1, popup_getpos(id1).line)
3581 call assert_equal(9, popup_getpos(id2).line)
3582
3583 call feedkeys('0', 'xt')
3584 call assert_equal({}, popup_getpos(id1))
3585 call assert_equal({}, popup_getpos(id2))
3586
3587 call popup_clear()
3588 delfunc CloseFilter
3589endfunc
3590
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003591func Test_popupwin_double_width()
3592 CheckScreendump
3593
3594 let lines =<< trim END
3595 call setline(1, 'x你好世界你好世你好世界你好')
3596 call setline(2, '你好世界你好世你好世界你好')
3597 call setline(3, 'x你好世界你好世你好世界你好')
3598 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3599 END
3600 call writefile(lines, 'XtestPopupWide')
3601
3602 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3603 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3604
3605 call StopVimInTerminal(buf)
3606 call delete('XtestPopupWide')
3607endfunc
3608
3609func Test_popupwin_sign()
3610 CheckScreendump
3611
3612 let lines =<< trim END
3613 call setline(1, range(10))
3614 call sign_define('Current', {
3615 \ 'text': '>>',
3616 \ 'texthl': 'WarningMsg',
3617 \ 'linehl': 'Error',
3618 \ })
3619 call sign_define('Other', {
3620 \ 'text': '#!',
3621 \ 'texthl': 'Error',
3622 \ 'linehl': 'Search',
3623 \ })
3624 let winid = popup_create(['hello', 'bright', 'world'], {
3625 \ 'minwidth': 20,
3626 \ })
3627 call setwinvar(winid, "&signcolumn", "yes")
3628 let winbufnr = winbufnr(winid)
3629
3630 " add sign to current buffer, shows
3631 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3632 " add sign to current buffer, does not show
3633 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3634
3635 " add sign to popup buffer, shows
3636 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3637 " add sign to popup buffer, does not show
3638 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003639
3640 func SetOptions()
3641 call setwinvar(g:winid, '&number', 1)
3642 call setwinvar(g:winid, '&foldcolumn', 2)
3643 call popup_settext(g:winid, 'a longer line to check the width')
3644 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003645 END
3646 call writefile(lines, 'XtestPopupSign')
3647
3648 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3649 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3650
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003651 " set more options to check the width is adjusted
3652 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3653 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3654
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003655 call StopVimInTerminal(buf)
3656 call delete('XtestPopupSign')
3657endfunc
3658
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003659func Test_popupwin_bufnr()
3660 let popwin = popup_create(['blah'], #{})
3661 let popbuf = winbufnr(popwin)
3662 split asdfasdf
3663 let newbuf = bufnr()
3664 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3665 call assert_equal(newbuf, bufnr('$'))
3666 call popup_clear()
3667 let popwin = popup_create(['blah'], #{})
3668 " reuses previous buffer number
3669 call assert_equal(popbuf, winbufnr(popwin))
3670 call assert_equal(newbuf, bufnr('$'))
3671
3672 call popup_clear()
3673 bwipe!
3674endfunc
3675
Bram Moolenaarec084d32020-02-28 22:44:47 +01003676func Test_popupwin_filter_input_multibyte()
3677 func MyPopupFilter(winid, c)
3678 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3679 return 0
3680 endfunc
3681 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3682
3683 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3684 call feedkeys("\u3000", 'xt')
3685 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3686
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003687 " UTF-8: E3 80 9B, including CSI(0x9B)
3688 call feedkeys("\u301b", 'xt')
3689 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003690
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003691 if has('unix')
3692 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003693 if has('gui_running')
3694 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3695 else
3696 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3697 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003698 call assert_equal([0xc3, 0x81], g:bytes)
3699 endif
3700
Bram Moolenaarec084d32020-02-28 22:44:47 +01003701 call popup_clear()
3702 delfunc MyPopupFilter
3703 unlet g:bytes
3704endfunc
3705
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003706func Test_popupwin_filter_close_ctrl_c()
3707 CheckScreendump
3708
3709 let lines =<< trim END
3710 vsplit
3711 set laststatus=2
3712 set statusline=%!Statusline()
3713
3714 function Statusline() abort
3715 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3716 endfunction
3717
3718 call popup_create('test test test test...', {'filter': {-> 0}})
3719 END
3720 call writefile(lines, 'XtestPopupCtrlC')
3721
3722 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3723
3724 call term_sendkeys(buf, "\<C-C>")
3725 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3726
3727 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003728 call delete('XtestPopupCtrlC')
3729endfunc
3730
3731func Test_popupwin_filter_close_wrong_name()
3732 CheckScreendump
3733
3734 let lines =<< trim END
3735 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3736 END
3737 call writefile(lines, 'XtestPopupWrongName')
3738
3739 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3740
3741 call term_sendkeys(buf, "j")
3742 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3743
3744 call StopVimInTerminal(buf)
3745 call delete('XtestPopupWrongName')
3746endfunc
3747
3748func Test_popupwin_filter_close_three_errors()
3749 CheckScreendump
3750
3751 let lines =<< trim END
3752 set cmdheight=2
3753 call popup_create('one two three...', {'filter': 'filter'})
3754 END
3755 call writefile(lines, 'XtestPopupThreeErrors')
3756
3757 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3758
3759 call term_sendkeys(buf, "jj")
3760 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3761 call term_sendkeys(buf, "j")
3762 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3763
3764 call StopVimInTerminal(buf)
3765 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003766endfunc
3767
Bram Moolenaar927495b2020-11-06 17:58:35 +01003768func Test_popupwin_latin1_encoding()
3769 CheckScreendump
3770 CheckUnix
3771
3772 " When 'encoding' is a single-byte encoding a terminal window will mess up
3773 " the display. Check that showing a popup on top of that doesn't crash.
3774 let lines =<< trim END
3775 set encoding=latin1
3776 terminal cat Xmultibyte
3777 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003778 redraw
Bram Moolenaarb125b532020-12-17 21:56:09 +01003779 " wait for "cat" to finish
3780 while execute('ls!') !~ 'finished'
3781 sleep 10m
3782 endwhile
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003783 echo "Done"
Bram Moolenaar927495b2020-11-06 17:58:35 +01003784 END
3785 call writefile(lines, 'XtestPopupLatin')
3786 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte')
3787
3788 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003789 call WaitForAssert({-> assert_match('Done', term_getline(buf, 10))})
Bram Moolenaar927495b2020-11-06 17:58:35 +01003790
3791 call term_sendkeys(buf, ":q\<CR>")
3792 call StopVimInTerminal(buf)
3793 call delete('XtestPopupLatin')
3794 call delete('Xmultibyte')
3795endfunc
3796
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003797func Test_popupwin_atcursor_far_right()
3798 new
3799
3800 " this was getting stuck
3801 set signcolumn=yes
3802 call setline(1, repeat('=', &columns))
3803 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003804 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003805
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003806 " 'signcolumn' was getting reset
3807 call setwinvar(winid, '&signcolumn', 'yes')
3808 call popup_setoptions(winid, {'zindex': 1000})
3809 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3810
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003811 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003812 bwipe!
3813 set signcolumn&
3814endfunc
3815
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003816func Test_popupwin_splitmove()
3817 vsplit
3818 let win2 = win_getid()
3819 let popup_winid = popup_dialog('hello', {})
3820 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3821 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3822
3823 call popup_clear()
3824 bwipe
3825endfunc
3826
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01003827func Test_popupwin_exiting_terminal()
3828 CheckFeature terminal
3829
3830 " Tests that when creating a popup right after closing a terminal window does
3831 " not make the popup the current window.
3832 let winid = win_getid()
3833 try
3834 augroup Test_popupwin_exiting_terminal
3835 autocmd!
3836 autocmd WinEnter * :call popup_create('test', {})
3837 augroup END
3838 let bnr = term_start(&shell, #{term_finish: 'close'})
3839 call term_sendkeys(bnr, "exit\r\n")
3840 call WaitForAssert({-> assert_equal(winid, win_getid())})
3841 finally
3842 call popup_clear(1)
3843 augroup Test_popupwin_exiting_terminal
3844 autocmd!
3845 augroup END
3846 endtry
3847endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003848
Bram Moolenaar014f6982021-01-04 13:18:30 +01003849func Test_popup_filter_menu()
3850 let colors = ['red', 'green', 'blue']
3851 call popup_menu(colors, #{callback: {_, result -> assert_equal('green', colors[result - 1])}})
3852 call feedkeys("\<c-n>\<c-n>\<c-p>\<cr>", 'xt')
3853endfunc
3854
Bram Moolenaar65026432021-02-06 14:22:32 +01003855func Test_popup_getoptions_other_tab()
3856 new
3857 call setline(1, 'some text')
3858 call prop_type_add('textprop', {})
3859 call prop_add(1, 1, #{type: 'textprop', length: 1})
3860 let id = popup_create('TEST', #{textprop: 'textprop', highlight: 'ErrorMsg', tabpage: 1})
3861 tab sp
3862 call assert_equal(['textprop', 'textpropid', 'textpropwin'], popup_getoptions(id)->keys()->filter({_, v -> v =~ 'textprop'}))
3863
3864 tabclose
Bram Moolenaarefa19232021-02-06 14:59:27 +01003865 call popup_close(id)
Bram Moolenaar65026432021-02-06 14:22:32 +01003866 bwipe!
3867 call prop_type_delete('textprop')
3868endfunc
3869
Bram Moolenaarefa19232021-02-06 14:59:27 +01003870
3871func Test_popup_setoptions_other_tab()
3872 new Xfile
3873 let winid = win_getid()
3874 call setline(1, 'some text')
3875 call prop_type_add('textprop', {})
3876 call prop_add(1, 1, #{type: 'textprop', length: 1})
3877 let id = popup_create('TEST', #{textprop: 'textprop'})
3878 tab sp
3879 call popup_setoptions(id, #{textprop: 'textprop', textpropwin: winid})
3880 call assert_equal(winid, popup_getoptions(id).textpropwin)
3881
3882 tabclose
3883 call popup_close(id)
3884 bwipe! Xfile
3885 call prop_type_delete('textprop')
3886endfunc
3887
Bram Moolenaar82db31c2021-02-10 14:56:11 +01003888func Test_popup_prop_not_visible()
3889 CheckScreendump
3890
3891 let lines =<< trim END
3892 vim9script
3893 set nowrap stal=2
3894 rightbelow :31vnew
3895 setline(1, ['', 'some text', '', 'other text'])
3896 prop_type_add('someprop', {})
3897 prop_add(2, 9, {type: 'someprop', length: 5})
3898 popup_create('attached to "some"', {
3899 textprop: 'someprop',
3900 highlight: 'ErrorMsg',
3901 line: -1,
3902 wrap: false,
3903 fixed: true,
3904 })
3905 prop_type_add('otherprop', {})
3906 prop_add(4, 10, {type: 'otherprop', length: 5})
3907 popup_create('attached to "other"', {
3908 textprop: 'otherprop',
3909 highlight: 'ErrorMsg',
3910 line: -1,
3911 wrap: false,
3912 fixed: false,
3913 })
3914 END
3915 call writefile(lines, 'XtestPropNotVisble')
3916 let buf = RunVimInTerminal('-S XtestPropNotVisble', #{rows: 10})
3917 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01', {})
3918
3919 call term_sendkeys(buf, ":vert resize -14\<CR>")
3920 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_02', {})
3921
3922 call term_sendkeys(buf, ":vert resize -8\<CR>")
3923 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_03', {})
3924
3925 " clean up
3926 call StopVimInTerminal(buf)
3927 call delete('XtestPropNotVisble')
3928endfunction
3929
Bram Moolenaar7b4f76c2021-06-10 21:07:48 +02003930func Test_bufdel_skips_popupwin_buffer()
3931 let id = popup_create("Some text", {})
3932 %bd
3933 call popup_close(id)
3934endfunc
3935
Bram Moolenaar82db31c2021-02-10 14:56:11 +01003936
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003937" vim: shiftwidth=2 sts=2