blob: cdfa3a987b20ff65c8dd5ff5779bf7299db1f7dd [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
1440
1441 let lines =<< trim END
1442 call setline(1, repeat([repeat('-', 60)], 15))
1443 set so=0
1444
1445 normal 9G3|r#
1446 let winid1 = popup_atcursor(['first', 'second'], #{
1447 \ moved: [0, 0, 0],
1448 \ })
1449 normal 9G21|r&
1450 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1451 \ pos: 'botright',
1452 \ moved: [0, 0, 0],
1453 \ })
1454 normal 3G27|r%
1455 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1456 \ pos: 'topleft',
1457 \ moved: [0, 0, 0],
1458 \ })
1459 normal 3G45|r@
1460 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1461 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001462 \ moved: range(3),
1463 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001464 \ })
Bram Moolenaarea042672021-06-29 20:22:32 +02001465
1466 normal 9G27|Rconcealed X
1467 syn match Hidden /concealed/ conceal
1468 set conceallevel=2 concealcursor=n
1469 redraw
1470 normal 0fX
1471 call popup_atcursor('mark', {})
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001472 END
1473 call writefile(lines, 'XtestPopupAtcursorPos')
1474 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1475 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1476
1477 " clean up
1478 call StopVimInTerminal(buf)
1479 call delete('XtestPopupAtcursorPos')
1480endfunc
1481
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001482func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001483 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001484 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001485
1486 let lines =<< trim END
1487 call setline(1, range(1, 20))
1488 call setline(5, 'here is some text to hover over')
1489 set balloonevalterm
1490 set balloonexpr=BalloonExpr()
1491 set balloondelay=100
1492 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001493 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001494 return ''
1495 endfunc
1496 func Hover()
1497 call test_setmouse(5, 15)
1498 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1499 sleep 100m
1500 endfunc
1501 func MoveOntoPopup()
1502 call test_setmouse(4, 17)
1503 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1504 endfunc
1505 func MoveAway()
1506 call test_setmouse(5, 13)
1507 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1508 endfunc
1509 END
1510 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001511 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001512 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001513 call term_sendkeys(buf, 'j')
1514 call term_sendkeys(buf, ":call Hover()\<CR>")
1515 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1516
1517 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1518 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1519
1520 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1521 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1522
1523 " clean up
1524 call StopVimInTerminal(buf)
1525 call delete('XtestPopupBeval')
1526endfunc
1527
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001528func Test_popup_filter()
1529 new
1530 call setline(1, 'some text')
1531
1532 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001533 if a:c == 'e' || a:c == "\<F9>"
1534 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001535 return 1
1536 endif
1537 if a:c == '0'
1538 let g:ignored = '0'
1539 return 0
1540 endif
1541 if a:c == 'x'
1542 call popup_close(a:winid)
1543 return 1
1544 endif
1545 return 0
1546 endfunc
1547
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001548 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001549 redraw
1550
1551 " e is consumed by the filter
1552 call feedkeys('e', 'xt')
1553 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001554 call feedkeys("\<F9>", 'xt')
1555 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001556
1557 " 0 is ignored by the filter
1558 normal $
1559 call assert_equal(9, getcurpos()[2])
1560 call feedkeys('0', 'xt')
1561 call assert_equal('0', g:ignored)
Yegappan Lakshmanan7237cab2021-06-22 19:52:27 +02001562 normal! l
1563 call assert_equal(2, getcurpos()[2])
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001564
1565 " x closes the popup
1566 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001567 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001568 call assert_equal(-1, winbufnr(winid))
1569
1570 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001571 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001572endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001573
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001574" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001575func Test_popup_filter_normal_cmd()
1576 CheckScreendump
1577
1578 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001579 let text = range(1, 20)->map({_, v -> string(v)})
1580 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1581 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001582 END
1583 call writefile(lines, 'XtestPopupNormal')
1584 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1585 call TermWait(buf, 100)
1586 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1587
1588 call StopVimInTerminal(buf)
1589 call delete('XtestPopupNormal')
1590endfunc
1591
Bram Moolenaar10476522020-09-24 22:57:31 +02001592" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001593func Test_popup_filter_win_execute()
1594 CheckScreendump
1595
1596 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001597 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1598 let g:id = popup_create(lines, #{
1599 \ minheight: &lines - 5,
1600 \ maxheight: &lines - 5,
1601 \ cursorline: 1,
1602 \ })
1603 redraw
1604 END
1605 call writefile(lines, 'XtestPopupWinExecute')
1606 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1607
1608 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1609 call term_sendkeys(buf, ":\<CR>")
1610
1611 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1612
1613 call StopVimInTerminal(buf)
1614 call delete('XtestPopupWinExecute')
1615endfunc
1616
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001617func Test_popup_set_firstline()
1618 CheckScreendump
1619
1620 let lines =<< trim END
1621 let lines = range(1, 50)->map({_, v -> string(v)})
1622 let g:id = popup_create(lines, #{
1623 \ minwidth: 20,
1624 \ maxwidth: 20,
1625 \ minheight: &lines - 5,
1626 \ maxheight: &lines - 5,
1627 \ cursorline: 1,
1628 \ })
1629 call popup_setoptions(g:id, #{firstline: 10})
1630 redraw
1631 END
1632 call writefile(lines, 'XtestPopupWinSetFirstline')
1633 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1634
1635 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1636
1637 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1638 call term_sendkeys(buf, ":\<CR>")
1639 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1640
1641 call StopVimInTerminal(buf)
1642 call delete('XtestPopupWinSetFirstline')
1643endfunc
1644
Bram Moolenaar10476522020-09-24 22:57:31 +02001645" this tests that we don't get stuck with an error in "win_execute()"
1646func Test_popup_filter_win_execute_error()
1647 CheckScreendump
1648
1649 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001650 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1651 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1652 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001653 call writefile(lines, 'XtestPopupWinExecuteError')
1654 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001655
1656 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1657 call term_sendkeys(buf, "\<CR>")
1658 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1659 call term_sendkeys(buf, "\<CR>")
1660 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1661 call term_sendkeys(buf, "\<CR>")
1662 call term_sendkeys(buf, "\<CR>")
1663 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1664
1665 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001666 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001667endfunc
1668
Bram Moolenaara42d9452019-06-15 21:46:30 +02001669func ShowDialog(key, result)
1670 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001671 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001672 \ filter: 'popup_filter_yesno',
1673 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001674 \ })
1675 redraw
1676 call feedkeys(a:key, "xt")
1677 call assert_equal(winid, s:cb_winid)
1678 call assert_equal(a:result, s:cb_res)
1679endfunc
1680
1681func Test_popup_dialog()
1682 func QuitCallback(id, res)
1683 let s:cb_winid = a:id
1684 let s:cb_res = a:res
1685 endfunc
1686
1687 let winid = ShowDialog("y", 1)
1688 let winid = ShowDialog("Y", 1)
1689 let winid = ShowDialog("n", 0)
1690 let winid = ShowDialog("N", 0)
1691 let winid = ShowDialog("x", 0)
1692 let winid = ShowDialog("X", 0)
1693 let winid = ShowDialog("\<Esc>", 0)
1694 let winid = ShowDialog("\<C-C>", -1)
1695
1696 delfunc QuitCallback
1697endfunc
1698
Bram Moolenaara730e552019-06-16 19:05:31 +02001699func ShowMenu(key, result)
1700 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001701 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001702 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001703 \ })
1704 redraw
1705 call feedkeys(a:key, "xt")
1706 call assert_equal(winid, s:cb_winid)
1707 call assert_equal(a:result, s:cb_res)
1708endfunc
1709
1710func Test_popup_menu()
1711 func QuitCallback(id, res)
1712 let s:cb_winid = a:id
1713 let s:cb_res = a:res
1714 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001715 " mapping won't be used in popup
1716 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001717
1718 let winid = ShowMenu(" ", 1)
1719 let winid = ShowMenu("j \<CR>", 2)
1720 let winid = ShowMenu("JjK \<CR>", 2)
1721 let winid = ShowMenu("jjjjjj ", 3)
1722 let winid = ShowMenu("kkk ", 1)
1723 let winid = ShowMenu("x", -1)
1724 let winid = ShowMenu("X", -1)
1725 let winid = ShowMenu("\<Esc>", -1)
1726 let winid = ShowMenu("\<C-C>", -1)
1727
1728 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001729 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001730endfunc
1731
1732func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001733 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001734
1735 let lines =<< trim END
1736 call setline(1, range(1, 20))
1737 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001738 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001739 func MenuDone(id, res)
1740 echomsg "selected " .. a:res
1741 endfunc
1742 END
1743 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001744 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001745 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1746
1747 call term_sendkeys(buf, "jj")
1748 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1749
1750 call term_sendkeys(buf, " ")
1751 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1752
1753 " clean up
1754 call StopVimInTerminal(buf)
1755 call delete('XtestPopupMenu')
1756endfunc
1757
Bram Moolenaarf914a332019-07-20 15:09:56 +02001758func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001759 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001760
1761 let lines =<< trim END
1762 call setline(1, range(1, 20))
1763 hi PopupSelected ctermbg=green
1764 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1765 func MenuDone(id, res)
1766 echomsg "selected " .. a:res
1767 endfunc
1768 END
1769 call writefile(lines, 'XtestPopupNarrowMenu')
1770 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1771 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1772
1773 " clean up
1774 call term_sendkeys(buf, "x")
1775 call StopVimInTerminal(buf)
1776 call delete('XtestPopupNarrowMenu')
1777endfunc
1778
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001779func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001780 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001781
1782 " Create a popup without title or border, a line of padding will be added to
1783 " put the title on.
1784 let lines =<< trim END
1785 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001786 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001787 END
1788 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001789 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001790 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1791
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001792 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1793 call term_sendkeys(buf, ":\<CR>")
1794 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1795
1796 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1797 call term_sendkeys(buf, ":\<CR>")
1798 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1799
Bram Moolenaar3ae50c72020-12-12 18:18:06 +01001800 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1801 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, padding: [2, 2, 2, 2]})\<CR>")
1802 call term_sendkeys(buf, ":\<CR>")
1803 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_3', {})
1804
1805 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1806 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, border: [], padding: [2, 2, 2, 2]})\<CR>")
1807 call term_sendkeys(buf, ":\<CR>")
1808 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_4', {})
1809
Ralf Schandlbc869872021-05-28 14:12:14 +02001810 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1811 call term_sendkeys(buf, ":call popup_menu(['This is a line', 'and another line'], #{title: '▶ÄÖÜ◀', })\<CR>")
1812 call VerifyScreenDump(buf, 'Test_popupwin_multibytetitle', {})
1813 call term_sendkeys(buf, "x")
1814
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001815 " clean up
1816 call StopVimInTerminal(buf)
1817 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001818
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001819 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001820 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001821 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001822 call assert_equal('Another Title', popup_getoptions(winid).title)
1823
1824 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001825endfunc
1826
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001827func Test_popup_close_callback()
1828 func PopupDone(id, result)
1829 let g:result = a:result
1830 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001831 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001832 redraw
1833 call popup_close(winid, 'done')
1834 call assert_equal('done', g:result)
1835endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001836
1837func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001838 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001839 redraw
1840 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001841 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001842 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001843 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001844
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001845 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001846 redraw
1847 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001848 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001849 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001850 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001851endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001852
1853func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001854 CheckScreendump
1855
Bram Moolenaar988c4332019-06-02 14:12:11 +02001856 " +-----------------------------+
1857 " | | |
1858 " | | |
1859 " | | |
1860 " | line1 |
1861 " |------------line2------------|
1862 " | line3 |
1863 " | line4 |
1864 " | |
1865 " | |
1866 " +-----------------------------+
1867 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001868 split
1869 vsplit
1870 let info_window1 = getwininfo()[0]
1871 let line = info_window1['height']
1872 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001873 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001874 \ line : line,
1875 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001876 \ })
1877 END
1878 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001879 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001880 call term_sendkeys(buf, "\<C-W>w")
1881 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1882
1883 " clean up
1884 call StopVimInTerminal(buf)
1885 call delete('XtestPopupBehind')
1886endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001887
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001888func s:VerifyPosition(p, msg, line, col, width, height)
1889 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1890 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1891 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1892 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001893endfunc
1894
1895func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001896 " Anything placed past the last cell on the right of the screen is moved to
1897 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001898 "
1899 " When wrapping is disabled, we also shift to the left to display on the
1900 " screen, unless fixed is set.
1901
1902 " Entries for cases which don't vary based on wrapping.
1903 " Format is per tests described below
1904 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001905 \ ['a', 5, &columns, 5, &columns, 1, 1],
1906 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1907 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001908 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001909 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001910
1911 " these test groups are dicts with:
1912 " - comment: something to identify the group of tests by
1913 " - options: dict of options to merge with the row/col in tests
1914 " - tests: list of cases. Each one is a list with elements:
1915 " - text
1916 " - row
1917 " - col
1918 " - expected row
1919 " - expected col
1920 " - expected width
1921 " - expected height
1922 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001923 \ #{
1924 \ comment: 'left-aligned with wrapping',
1925 \ options: #{
1926 \ wrap: 1,
1927 \ pos: 'botleft',
1928 \ },
1929 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001930 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1931 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1932 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1933 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1934 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1935 \
1936 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1937 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1938 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1939 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1940 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1941 \
1942 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1943 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1944 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001945 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1946 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001947 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001948 \ ],
1949 \ },
1950 \ #{
1951 \ comment: 'left aligned without wrapping',
1952 \ options: #{
1953 \ wrap: 0,
1954 \ pos: 'botleft',
1955 \ },
1956 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001957 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1958 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1959 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1960 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1961 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1962 \
1963 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1964 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1965 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1966 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1967 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1968 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001969 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1970 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1971 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1972 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1973 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1974 \ ],
1975 \ },
1976 \ #{
1977 \ comment: 'left aligned with fixed position',
1978 \ options: #{
1979 \ wrap: 0,
1980 \ fixed: 1,
1981 \ pos: 'botleft',
1982 \ },
1983 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001984 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1985 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1986 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1987 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1988 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1989 \
1990 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1991 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1992 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1993 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1994 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1995 \
1996 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1997 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1998 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001999 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2000 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2001 \ ],
2002 \ },
2003 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002004
2005 for test_group in tests
2006 for test in test_group.tests
2007 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002008 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002009 \ line: line,
2010 \ col: col,
2011 \ }
2012 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002013
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002014 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002015
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002016 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002017 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
2018 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002019 endfor
2020 endfor
2021
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002022 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002023 %bwipe!
2024endfunc
2025
Bram Moolenaar3397f742019-06-02 18:40:06 +02002026func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002027 " width of screen
2028 let X = join(map(range(&columns), {->'X'}), '')
2029
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002030 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2031 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002032
2033 redraw
2034 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2035 call assert_equal(X, line)
2036
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002037 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002038 redraw
2039
2040 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002041 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
2042 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002043
2044 redraw
2045 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2046 call assert_equal(X, line)
2047
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002048 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002049 redraw
2050
2051 " Extend so > window width
2052 let X .= 'x'
2053
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002054 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2055 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002056
2057 redraw
2058 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2059 call assert_equal(X[ : -2 ], line)
2060
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002061 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002062 redraw
2063
2064 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002065 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2066 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002067
2068 redraw
2069 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2070 call assert_equal(X[ : -2 ], line)
2071
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002072 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002073 redraw
2074
2075 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002076 let p = popup_create(X,
2077 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2078 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002079
2080 redraw
2081 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2082 let e_line = ' ' . X[ 1 : -2 ]
2083 call assert_equal(e_line, line)
2084
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002085 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002086 redraw
2087
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002088 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002089 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002090endfunc
2091
2092func Test_popup_moved()
2093 new
2094 call test_override('char_avail', 1)
2095 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2096
2097 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002098 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002099 redraw
2100 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002101 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002102 " trigger the check for last_cursormoved by going into insert mode
2103 call feedkeys("li\<Esc>", 'xt')
2104 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002105 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002106
2107 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002108 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002109 redraw
2110 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002111 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002112 call feedkeys("hi\<Esc>", 'xt')
2113 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002114 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002115
2116 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002117 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002118 redraw
2119 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002120 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002121 call feedkeys("li\<Esc>", 'xt')
2122 call assert_equal(1, popup_getpos(winid).visible)
2123 call feedkeys("ei\<Esc>", 'xt')
2124 call assert_equal(1, popup_getpos(winid).visible)
2125 call feedkeys("eli\<Esc>", 'xt')
2126 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002127 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002128
Bram Moolenaar17627312019-06-02 19:53:44 +02002129 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002130 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002131 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002132 redraw
2133 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002134 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002135 call feedkeys("eli\<Esc>", 'xt')
2136 call assert_equal(1, popup_getpos(winid).visible)
2137 call feedkeys("wi\<Esc>", 'xt')
2138 call assert_equal(1, popup_getpos(winid).visible)
2139 call feedkeys("Eli\<Esc>", 'xt')
2140 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002141 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002142
2143 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002144 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002145 redraw
2146 call assert_equal(1, popup_getpos(winid).visible)
2147 call feedkeys("eli\<Esc>", 'xt')
2148 call feedkeys("ei\<Esc>", 'xt')
2149 call assert_equal(1, popup_getpos(winid).visible)
2150 call feedkeys("eli\<Esc>", 'xt')
2151 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002152 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002153
2154 bwipe!
2155 call test_override('ALL', 0)
2156endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002157
2158func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002159 CheckFeature timers
2160 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002161
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002162 let lines =<< trim END
2163 call setline(1, range(1, 20))
2164 hi Notification ctermbg=lightblue
2165 call popup_notification('first notification', {})
2166 END
2167 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002168 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002169 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2170
2171 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002172 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2173 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002174 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2175
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002176 " clean up
2177 call StopVimInTerminal(buf)
2178 call delete('XtestNotifications')
2179endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002180
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002181func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002182 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002183
2184 let lines =<< trim END
2185 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002186 hi ScrollThumb ctermbg=blue
2187 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002188 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002189 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002190 \ minwidth: 8,
2191 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002192 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002193 func ScrollUp()
2194 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2195 endfunc
2196 func ScrollDown()
2197 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2198 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002199 func ClickTop()
2200 call feedkeys("\<F4>\<LeftMouse>", "xt")
2201 endfunc
2202 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002203 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002204 call feedkeys("\<F5>\<LeftMouse>", "xt")
2205 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002206 func Popup_filter(winid, key)
2207 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002208 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002209 let line = popup_getoptions(a:winid).firstline
2210 let nlines = line('$', a:winid)
2211 let newline = line < nlines ? (line + 1) : nlines
2212 call popup_setoptions(a:winid, #{firstline: newline})
2213 return v:true
2214 elseif a:key == 'x'
2215 call popup_close(a:winid)
2216 return v:true
2217 endif
2218 endfunc
2219
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002220 def CreatePopup(text: list<string>)
Bram Moolenaare0de1712020-12-02 17:36:54 +01002221 popup_create(text, {
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002222 \ minwidth: 30,
2223 \ maxwidth: 30,
2224 \ minheight: 4,
2225 \ maxheight: 4,
2226 \ firstline: 1,
2227 \ lastline: 4,
2228 \ wrap: true,
2229 \ scrollbar: true,
2230 \ mapping: false,
2231 \ filter: Popup_filter,
2232 \ })
2233 enddef
2234
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002235 func PopupScroll()
2236 call popup_clear()
2237 let text =<< trim END
2238 1
2239 2
2240 3
2241 4
2242 long line long line long line long line long line long line
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 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002246 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002247 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002248 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002249 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2250 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002251 END
2252 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002253 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002254 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2255
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002256 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002257 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002258 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2259
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002260 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002261 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002262 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2263
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002264 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002265 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002266 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2267
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002268 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002269 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002270 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2271 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2272
2273 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2274 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2275
2276 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002277 " wait a bit, otherwise it fails sometimes (double click recognized?)
2278 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002279 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2280 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2281
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002282 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2283 sleep 100m
2284 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2285 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2286
2287 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2288 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2289
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002290 " remove the minwidth and maxheight
2291 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002292 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002293 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2294
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002295 " check size with non-wrapping lines
2296 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2297 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2298
2299 " check size with wrapping lines
2300 call term_sendkeys(buf, "j")
2301 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002302
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002303 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002304 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002305 call StopVimInTerminal(buf)
2306 call delete('XtestPopupScroll')
2307endfunc
2308
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002309func Test_popup_too_high_scrollbar()
2310 CheckScreendump
2311
2312 let lines =<< trim END
2313 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2314 set scrolloff=0
2315 func ShowPopup()
2316 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2317 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2318 \ minwidth: 8,
2319 \ border: [],
2320 \ })
2321 endfunc
2322 normal 3G$
2323 call ShowPopup()
2324 END
2325 call writefile(lines, 'XtestPopupToohigh')
2326 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2327 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2328
2329 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2330 call term_sendkeys(buf, "8G$")
2331 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2332 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2333
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002334 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2335 call term_sendkeys(buf, "gg$")
2336 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2337 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2338
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002339 " clean up
2340 call StopVimInTerminal(buf)
2341 call delete('XtestPopupToohigh')
2342endfunc
2343
Bram Moolenaar437a7462019-07-05 20:17:22 +02002344func Test_popup_fitting_scrollbar()
2345 " this was causing a crash, divide by zero
2346 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002347 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002348 \ scrollbar: 1,
2349 \ maxwidth: 10,
2350 \ maxheight: 5,
2351 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002352 redraw
2353 call popup_clear()
2354endfunc
2355
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002356func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002357 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002358
2359 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002360 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002361 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002362 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002363 END
2364
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002365 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002366 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002367 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2368
2369 " Setting to empty string clears it
2370 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2371 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2372
2373 " Setting a list
2374 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2375 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2376
2377 " Shrinking with a list
2378 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2379 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2380
2381 " Growing with a list
2382 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2383 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2384
2385 " Empty list clears
2386 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2387 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2388
2389 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002390 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002391 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2392
Bram Moolenaarb0992022020-01-30 14:55:42 +01002393 " range() (doesn't work)
2394 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2395 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2396
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002397 " clean up
2398 call StopVimInTerminal(buf)
2399 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002400endfunc
2401
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002402func Test_popup_settext_getline()
2403 let id = popup_create('', #{ tabpage: 0 })
2404 call popup_settext(id, ['a','b'])
2405 call assert_equal(2, line('$', id)) " OK :)
2406 call popup_close(id)
2407
2408 let id = popup_create('', #{ tabpage: -1 })
2409 call popup_settext(id, ['a','b'])
2410 call assert_equal(2, line('$', id)) " Fails :(
2411 call popup_close(id)
2412endfunc
2413
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002414func Test_popup_settext_null()
2415 let id = popup_create('', #{ tabpage: 0 })
2416 call popup_settext(id, test_null_list())
2417 call popup_close(id)
2418
2419 let id = popup_create('', #{ tabpage: 0 })
2420 call popup_settext(id, test_null_string())
2421 call popup_close(id)
2422endfunc
2423
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002424func Test_popup_hidden()
2425 new
2426
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002427 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002428 redraw
2429 call assert_equal(0, popup_getpos(winid).visible)
2430 call popup_close(winid)
2431
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002432 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002433 redraw
2434 call assert_equal(0, popup_getpos(winid).visible)
2435 call popup_close(winid)
2436
2437 func QuitCallback(id, res)
2438 let s:cb_winid = a:id
2439 let s:cb_res = a:res
2440 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002441 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002442 \ filter: 'popup_filter_yesno',
2443 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002444 \ })
2445 redraw
2446 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002447 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2448 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002449 exe "normal anot used by filter\<Esc>"
2450 call assert_equal('not used by filter', getline(1))
2451
2452 call popup_show(winid)
2453 call feedkeys('y', "xt")
2454 call assert_equal(1, s:cb_res)
2455
2456 bwipe!
2457 delfunc QuitCallback
2458endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002459
2460" Test options not checked elsewhere
2461func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002462 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002463 let options = popup_getoptions(winid)
2464 call assert_equal(1, options.wrap)
2465 call assert_equal(0, options.drag)
2466 call assert_equal('Beautiful', options.highlight)
2467
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002468 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002469 let options = popup_getoptions(winid)
2470 call assert_equal(0, options.wrap)
2471 call assert_equal(1, options.drag)
2472 call assert_equal('Another', options.highlight)
2473
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002474 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2475 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2476
Bram Moolenaarae943152019-06-16 22:54:14 +02002477 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002478 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002479endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002480
2481func Test_popupwin_garbage_collect()
2482 func MyPopupFilter(x, winid, c)
2483 " NOP
2484 endfunc
2485
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002486 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002487 call test_garbagecollect_now()
2488 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002489 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002490 call feedkeys('j', 'xt')
2491 call assert_true(v:true)
2492
2493 call popup_close(winid)
2494 delfunc MyPopupFilter
2495endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002496
Bram Moolenaar581ba392019-09-03 22:08:33 +02002497func Test_popupwin_filter_mode()
2498 func MyPopupFilter(winid, c)
2499 let s:typed = a:c
2500 if a:c == ':' || a:c == "\r" || a:c == 'v'
2501 " can start cmdline mode, get out, and start/stop Visual mode
2502 return 0
2503 endif
2504 return 1
2505 endfunc
2506
2507 " Normal, Visual and Insert mode
2508 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2509 redraw
2510 call feedkeys('x', 'xt')
2511 call assert_equal('x', s:typed)
2512
2513 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2514 call assert_equal(':', s:typed)
2515 call assert_equal('foo', g:foo)
2516
2517 let @x = 'something'
2518 call feedkeys('v$"xy', 'xt')
2519 call assert_equal('y', s:typed)
2520 call assert_equal('something', @x) " yank command is filtered out
2521 call feedkeys('v', 'xt') " end Visual mode
2522
2523 call popup_close(winid)
2524
2525 " only Normal mode
2526 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2527 redraw
2528 call feedkeys('x', 'xt')
2529 call assert_equal('x', s:typed)
2530
2531 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2532 call assert_equal(':', s:typed)
2533 call assert_equal('foo', g:foo)
2534
2535 let @x = 'something'
2536 call feedkeys('v$"xy', 'xt')
2537 call assert_equal('v', s:typed)
2538 call assert_notequal('something', @x)
2539
2540 call popup_close(winid)
2541
2542 " default: all modes
2543 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2544 redraw
2545 call feedkeys('x', 'xt')
2546 call assert_equal('x', s:typed)
2547
2548 let g:foo = 'bar'
2549 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2550 call assert_equal("\r", s:typed)
2551 call assert_equal('bar', g:foo)
2552
2553 let @x = 'something'
2554 call feedkeys('v$"xy', 'xt')
2555 call assert_equal('y', s:typed)
2556 call assert_equal('something', @x) " yank command is filtered out
2557 call feedkeys('v', 'xt') " end Visual mode
2558
2559 call popup_close(winid)
2560 delfunc MyPopupFilter
2561endfunc
2562
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002563func Test_popupwin_filter_mouse()
2564 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002565 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002566 return 0
2567 endfunc
2568
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002569 call setline(1, ['.'->repeat(25)]->repeat(10))
2570 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2571 \ line: 2,
2572 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002573 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002574 \ padding: [],
2575 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002576 \ filter: 'MyPopupFilter',
2577 \ })
2578 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002579 " 123456789012345678901
2580 " 1 .....................
2581 " 2 ...+--------------+..
2582 " 3 ...| |..
2583 " 4 ...| short |..
2584 " 5 ...| long line th |..
2585 " 6 ...| at will wrap |..
2586 " 7 ...| other |..
2587 " 8 ...| |..
2588 " 9 ...+--------------+..
2589 " 10 .....................
2590 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002591
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002592 func AddItemOutsidePopup(tests, row, col)
2593 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2594 \ screenrow: a:row, screencol: a:col,
2595 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2596 \ line: a:row, column: a:col,
2597 \ }})
2598 endfunc
2599 func AddItemInPopupBorder(tests, winid, row, col)
2600 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2601 \ screenrow: a:row, screencol: a:col,
2602 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2603 \ line: 0, column: 0,
2604 \ }})
2605 endfunc
2606 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2607 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2608 \ screenrow: a:row, screencol: a:col,
2609 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2610 \ line: a:textline, column: a:textcol,
2611 \ }})
2612 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002613
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002614 " above and below popup
2615 for c in range(1, 21)
2616 call AddItemOutsidePopup(tests, 1, c)
2617 call AddItemOutsidePopup(tests, 10, c)
2618 endfor
2619 " left and right of popup
2620 for r in range(1, 10)
2621 call AddItemOutsidePopup(tests, r, 3)
2622 call AddItemOutsidePopup(tests, r, 20)
2623 endfor
2624 " top and bottom in popup
2625 for c in range(4, 19)
2626 call AddItemInPopupBorder(tests, winid, 2, c)
2627 call AddItemInPopupBorder(tests, winid, 3, c)
2628 call AddItemInPopupBorder(tests, winid, 8, c)
2629 call AddItemInPopupBorder(tests, winid, 9, c)
2630 endfor
2631 " left and right margin in popup
2632 for r in range(2, 9)
2633 call AddItemInPopupBorder(tests, winid, r, 4)
2634 call AddItemInPopupBorder(tests, winid, r, 5)
2635 call AddItemInPopupBorder(tests, winid, r, 18)
2636 call AddItemInPopupBorder(tests, winid, r, 19)
2637 endfor
2638 " text "short"
2639 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2640 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2641 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2642 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2643 " text "long line th"
2644 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2645 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2646 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2647 " text "at will wrap"
2648 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2649 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2650 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2651 " text "other"
2652 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2653 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2654 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2655 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002656
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002657 for item in tests
2658 call test_setmouse(item.clickrow, item.clickcol)
2659 call feedkeys("\<LeftMouse>", 'xt')
2660 call assert_equal(item.result, g:got_mousepos)
2661 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002662
2663 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002664 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002665 delfunc MyPopupFilter
2666endfunc
2667
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002668func Test_popupwin_with_buffer()
2669 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2670 let buf = bufadd('XsomeFile')
2671 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002672
2673 setlocal number
2674 call setbufvar(buf, "&wrapmargin", 13)
2675
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002676 let winid = popup_create(buf, {})
2677 call assert_notequal(0, winid)
2678 let pos = popup_getpos(winid)
2679 call assert_equal(2, pos.height)
2680 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002681
2682 " window-local option is set to default, buffer-local is not
2683 call assert_equal(0, getwinvar(winid, '&number'))
2684 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2685
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002686 call popup_close(winid)
2687 call assert_equal({}, popup_getpos(winid))
2688 call assert_equal(1, bufloaded(buf))
2689 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002690 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002691
2692 edit test_popupwin.vim
2693 let winid = popup_create(bufnr(''), {})
2694 redraw
2695 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002696 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002697endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002698
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002699func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002700 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002701 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002702 " Starting a terminal to run a shell in is considered flaky.
2703 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002704
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002705 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002706
2707 " open help window to test that :help below fails
2708 help
2709
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002710 let termbuf = term_start(&shell, #{hidden: 1})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002711 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002712 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002713 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002714 " Wait for a prompt (see border char first, then space after prompt)
2715 call WaitForAssert({ -> assert_equal(' ', screenstring(screenrow(), screencol() - 1))})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002716
2717 " When typing a character, the cursor is after it.
2718 call feedkeys("x", 'xt')
Bram Moolenaar0353f562020-12-17 22:27:38 +01002719 call term_wait(termbuf)
Bram Moolenaarf5452692020-11-28 21:56:06 +01002720 redraw
2721 call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))})
2722 call feedkeys("\<BS>", 'xt')
2723
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002724 " Check this doesn't crash
2725 call assert_equal(winnr(), winnr('j'))
2726 call assert_equal(winnr(), winnr('k'))
2727 call assert_equal(winnr(), winnr('h'))
2728 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002729
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002730 " Cannot quit while job is running
2731 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002732
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002733 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002734 call feedkeys("xxx\<C-W>N", 'xt')
2735 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2736 call feedkeys("a\<C-U>", 'xt')
2737
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002738 " Cannot escape from terminal window
2739 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002740 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002741
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002742 " Cannot open a second one.
2743 let termbuf2 = term_start(&shell, #{hidden: 1})
2744 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2745 call term_sendkeys(termbuf2, "exit\<CR>")
2746
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002747 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002748 call feedkeys("exit\<CR>", 'xt')
2749 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002750 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002751
Bram Moolenaar349f6092020-10-06 20:46:49 +02002752 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002753 call feedkeys(":quit\<CR>", 'xt')
2754 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002755endfunc
2756
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002757func Test_popupwin_close_prevwin()
2758 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002759 call Popupwin_close_prevwin()
2760endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002761
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002762def Popupwin_close_prevwin()
2763 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002764 split
2765 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002766 assert_equal(2, winnr())
Bram Moolenaare0de1712020-12-02 17:36:54 +01002767 var buf = term_start(&shell, {hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002768 popup_create(buf, {})
2769 TermWait(buf, 100)
2770 popup_clear(true)
2771 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002772
2773 quit
2774 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002775enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002776
Bram Moolenaar934470e2019-09-01 23:27:05 +02002777func Test_popupwin_with_buffer_and_filter()
2778 new Xwithfilter
2779 call setline(1, range(100))
2780 let bufnr = bufnr()
2781 hide
2782
2783 func BufferFilter(win, key)
2784 if a:key == 'G'
2785 " recursive use of "G" does not cause problems.
2786 call win_execute(a:win, 'normal! G')
2787 return 1
2788 endif
2789 return 0
2790 endfunc
2791
2792 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2793 call assert_equal(1, popup_getpos(winid).firstline)
2794 redraw
2795 call feedkeys("G", 'xt')
2796 call assert_equal(99, popup_getpos(winid).firstline)
2797
2798 call popup_close(winid)
2799 exe 'bwipe! ' .. bufnr
2800endfunc
2801
Bram Moolenaare296e312019-07-03 23:20:18 +02002802func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002803 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002804 \ maxwidth: 40,
2805 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002806 \ })
2807 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002808 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002809 redraw
2810 call assert_equal(19, popup_getpos(winid).width)
2811 endfor
2812 call popup_clear()
2813endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002814
2815func Test_popupwin_buf_close()
2816 let buf = bufadd('Xtestbuf')
2817 call bufload(buf)
2818 call setbufline(buf, 1, ['just', 'some', 'lines'])
2819 let winid = popup_create(buf, {})
2820 redraw
2821 call assert_equal(3, popup_getpos(winid).height)
2822 let bufinfo = getbufinfo(buf)[0]
2823 call assert_equal(1, bufinfo.changed)
2824 call assert_equal(0, bufinfo.hidden)
2825 call assert_equal(0, bufinfo.listed)
2826 call assert_equal(1, bufinfo.loaded)
2827 call assert_equal([], bufinfo.windows)
2828 call assert_equal([winid], bufinfo.popups)
2829
2830 call popup_close(winid)
2831 call assert_equal({}, popup_getpos(winid))
2832 let bufinfo = getbufinfo(buf)[0]
2833 call assert_equal(1, bufinfo.changed)
2834 call assert_equal(1, bufinfo.hidden)
2835 call assert_equal(0, bufinfo.listed)
2836 call assert_equal(1, bufinfo.loaded)
2837 call assert_equal([], bufinfo.windows)
2838 call assert_equal([], bufinfo.popups)
2839 exe 'bwipe! ' .. buf
2840endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002841
2842func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002843 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002844
2845 let lines =<< trim END
2846 call setline(1, range(1, 10))
2847 hi ScrollThumb ctermbg=blue
2848 hi ScrollBar ctermbg=red
2849 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002850 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002851 \ maxwidth: 10,
2852 \ maxheight: 3,
2853 \ pos : 'topleft',
2854 \ col : a:col,
2855 \ line : a:line,
2856 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002857 \ })
2858 endfunc
2859 call PopupMenu(['x'], 1, 1)
2860 call PopupMenu(['123456789|'], 1, 16)
2861 call PopupMenu(['123456789|' .. ' '], 7, 1)
2862 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2863 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2864 END
2865 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002866 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002867 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2868
2869 " close the menu popupwin.
2870 call term_sendkeys(buf, " ")
2871 call term_sendkeys(buf, " ")
2872 call term_sendkeys(buf, " ")
2873 call term_sendkeys(buf, " ")
2874 call term_sendkeys(buf, " ")
2875
2876 " clean up
2877 call StopVimInTerminal(buf)
2878 call delete('XtestPopupMenuMaxWidth')
2879endfunc
2880
Bram Moolenaara901a372019-07-13 16:38:50 +02002881func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002882 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002883
2884 let lines =<< trim END
2885 call setline(1, range(1, 20))
2886 hi ScrollThumb ctermbg=blue
2887 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002888 eval ['one', 'two', 'three', 'four', 'five',
2889 \ 'six', 'seven', 'eight', 'nine']
2890 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002891 \ minwidth: 8,
2892 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002893 \ })
2894 END
2895 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002896 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002897
2898 call term_sendkeys(buf, "j")
2899 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2900
2901 call term_sendkeys(buf, "jjj")
2902 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2903
2904 " if the cursor is the bottom line, it stays at the bottom line.
2905 call term_sendkeys(buf, repeat("j", 20))
2906 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2907
2908 call term_sendkeys(buf, "kk")
2909 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2910
2911 call term_sendkeys(buf, "k")
2912 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2913
2914 " if the cursor is in the top line, it stays in the top line.
2915 call term_sendkeys(buf, repeat("k", 20))
2916 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2917
2918 " close the menu popupwin.
2919 call term_sendkeys(buf, " ")
2920
2921 " clean up
2922 call StopVimInTerminal(buf)
2923 call delete('XtestPopupMenuScroll')
2924endfunc
2925
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002926func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002927 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002928
2929 let lines =<< trim END
2930 function! MyFilter(winid, key) abort
2931 if a:key == "0"
2932 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2933 return 1
2934 endif
2935 if a:key == "G"
2936 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2937 return 1
2938 endif
2939 if a:key == "j"
2940 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2941 return 1
2942 endif
2943 if a:key == "k"
2944 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2945 return 1
2946 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002947 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002948 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002949 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002950 endif
2951 return 0
2952 endfunction
2953 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2954 \ maxheight : 3,
2955 \ filter : 'MyFilter'
2956 \ })
2957 END
2958 call writefile(lines, 'XtestPopupMenuFilter')
2959 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2960
2961 call term_sendkeys(buf, "j")
2962 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2963
2964 call term_sendkeys(buf, "k")
2965 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2966
2967 call term_sendkeys(buf, "G")
2968 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2969
2970 call term_sendkeys(buf, "0")
2971 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2972
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002973 " check that when the popup is closed in the filter the screen is redrawn
2974 call term_sendkeys(buf, ":")
2975 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2976 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002977
2978 " clean up
2979 call StopVimInTerminal(buf)
2980 call delete('XtestPopupMenuFilter')
2981endfunc
2982
2983func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002984 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002985
2986 let winid = popup_create('some text', {})
2987 call assert_equal(0, popup_getoptions(winid).cursorline)
2988 call popup_close(winid)
2989
2990 let winid = popup_create('some text', #{ cursorline: 1, })
2991 call assert_equal(1, popup_getoptions(winid).cursorline)
2992 call popup_close(winid)
2993
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01002994 let winid = popup_create('some text', #{ cursorline: v:true, })
2995 call assert_equal(1, popup_getoptions(winid).cursorline)
2996 call popup_close(winid)
2997
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002998 let winid = popup_create('some text', #{ cursorline: 0, })
2999 call assert_equal(0, popup_getoptions(winid).cursorline)
3000 call popup_close(winid)
3001
3002 let winid = popup_menu('some text', {})
3003 call assert_equal(1, popup_getoptions(winid).cursorline)
3004 call popup_close(winid)
3005
3006 let winid = popup_menu('some text', #{ cursorline: 1, })
3007 call assert_equal(1, popup_getoptions(winid).cursorline)
3008 call popup_close(winid)
3009
3010 let winid = popup_menu('some text', #{ cursorline: 0, })
3011 call assert_equal(0, popup_getoptions(winid).cursorline)
3012 call popup_close(winid)
3013
3014 " ---------
3015 " Pattern 1
3016 " ---------
3017 let lines =<< trim END
3018 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
3019 END
3020 call writefile(lines, 'XtestPopupCursorLine')
3021 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3022 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
3023 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3024 call StopVimInTerminal(buf)
3025
3026 " ---------
3027 " Pattern 2
3028 " ---------
3029 let lines =<< trim END
3030 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
3031 END
3032 call writefile(lines, 'XtestPopupCursorLine')
3033 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3034 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
3035 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3036 call StopVimInTerminal(buf)
3037
3038 " ---------
3039 " Pattern 3
3040 " ---------
3041 let lines =<< trim END
3042 function! MyFilter(winid, key) abort
3043 if a:key == "j"
3044 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3045 return 1
3046 endif
3047 if a:key == 'x'
3048 call popup_close(a:winid)
3049 return 1
3050 endif
3051 return 0
3052 endfunction
3053 call popup_menu(['111', '222', '333'], #{
3054 \ cursorline : 0,
3055 \ maxheight : 2,
3056 \ filter : 'MyFilter',
3057 \ })
3058 END
3059 call writefile(lines, 'XtestPopupCursorLine')
3060 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3061 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3062 call term_sendkeys(buf, "j")
3063 call term_sendkeys(buf, "j")
3064 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3065 call term_sendkeys(buf, "x")
3066 call StopVimInTerminal(buf)
3067
3068 " ---------
3069 " Pattern 4
3070 " ---------
3071 let lines =<< trim END
3072 function! MyFilter(winid, key) abort
3073 if a:key == "j"
3074 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3075 return 1
3076 endif
3077 if a:key == 'x'
3078 call popup_close(a:winid)
3079 return 1
3080 endif
3081 return 0
3082 endfunction
3083 call popup_menu(['111', '222', '333'], #{
3084 \ cursorline : 1,
3085 \ maxheight : 2,
3086 \ filter : 'MyFilter',
3087 \ })
3088 END
3089 call writefile(lines, 'XtestPopupCursorLine')
3090 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3091 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3092 call term_sendkeys(buf, "j")
3093 call term_sendkeys(buf, "j")
3094 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3095 call term_sendkeys(buf, "x")
3096 call StopVimInTerminal(buf)
3097
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003098 " ---------
3099 " Cursor in second line when creating the popup
3100 " ---------
3101 let lines =<< trim END
3102 let winid = popup_create(['111', '222', '333'], #{
3103 \ cursorline : 1,
3104 \ })
3105 call win_execute(winid, "2")
3106 END
3107 call writefile(lines, 'XtestPopupCursorLine')
3108 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3109 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3110 call StopVimInTerminal(buf)
3111
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003112 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003113
3114 " ---------
3115 " Use current buffer for popupmenu
3116 " ---------
3117 let lines =<< trim END
3118 call setline(1, ['one', 'two', 'three'])
3119 let winid = popup_create(bufnr('%'), #{
3120 \ cursorline : 1,
3121 \ })
3122 call win_execute(winid, "2")
3123 END
3124 call writefile(lines, 'XtestPopupCursorLine')
3125 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3126 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3127 call StopVimInTerminal(buf)
3128
3129 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003130endfunc
3131
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003132def Test_popup_cursorline_vim9()
3133 var winid = popup_create('some text', { cursorline: true, })
3134 assert_equal(1, popup_getoptions(winid).cursorline)
3135 popup_close(winid)
3136
3137 assert_fails("popup_create('some text', { cursorline: 2, })", 'E1023:')
3138 popup_clear()
3139enddef
3140
Bram Moolenaarf914a332019-07-20 15:09:56 +02003141func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003142 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003143 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003144
Bram Moolenaarf914a332019-07-20 15:09:56 +02003145 call writefile([
3146 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3147 \ "another\tXtagfile\t/^this is another",
3148 \ "theword\tXtagfile\t/^theword"],
3149 \ 'Xtags')
3150 call writefile(range(1,20)
3151 \ + ['theword is here']
3152 \ + range(22, 27)
3153 \ + ['this is another place']
3154 \ + range(29, 40),
3155 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003156 call writefile(range(1,10)
3157 \ + ['searched word is here']
3158 \ + range(12, 20),
3159 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003160 let lines =<< trim END
3161 set tags=Xtags
3162 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003163 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003164 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003165 \ 'three',
3166 \ 'four',
3167 \ 'five',
3168 \ 'six',
3169 \ 'seven',
3170 \ 'find theword somewhere',
3171 \ 'nine',
3172 \ 'this is another word',
3173 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003174 set previewpopup=height:4,width:40
Bram Moolenaar60577482021-03-04 21:35:07 +01003175 hi OtherColor ctermbg=lightcyan guibg=lightcyan
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003176 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003177 END
3178 call writefile(lines, 'XtestPreviewPopup')
3179 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3180
3181 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3182 call term_sendkeys(buf, ":\<CR>")
3183 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3184
Bram Moolenaar60577482021-03-04 21:35:07 +01003185 call term_sendkeys(buf, ":set previewpopup+=highlight:OtherColor\<CR>")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003186 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3187 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3188
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003189 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003190 call term_sendkeys(buf, ":\<CR>")
3191 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3192
3193 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3194 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3195
Bram Moolenaar799439a2020-02-11 21:44:17 +01003196 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003197 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003198 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003199
Bram Moolenaar60577482021-03-04 21:35:07 +01003200 call term_sendkeys(buf, ":set previewpopup-=highlight:OtherColor\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003201 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003202 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003203 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3204
3205 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3206 call term_sendkeys(buf, ":\<CR>")
3207 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3208
3209 call term_sendkeys(buf, ":pclose\<CR>")
3210 call term_sendkeys(buf, ":psearch searched\<CR>")
3211 call term_sendkeys(buf, ":\<CR>")
3212 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003213
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003214 call term_sendkeys(buf, "\<C-W>p")
3215 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3216
3217 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3218 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3219
Bram Moolenaarf914a332019-07-20 15:09:56 +02003220 call StopVimInTerminal(buf)
3221 call delete('Xtags')
3222 call delete('Xtagfile')
3223 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003224 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003225endfunc
3226
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003227func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003228 let lines =<< trim END
3229 set completeopt+=preview,popup
3230 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003231 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003232
3233 func CompleteFuncDict(findstart, base)
3234 if a:findstart
3235 if col('.') > 10
3236 return col('.') - 10
3237 endif
3238 return 0
3239 endif
3240
3241 return {
3242 \ 'words': [
3243 \ {
3244 \ 'word': 'aword',
3245 \ 'abbr': 'wrd',
3246 \ 'menu': 'extra text',
3247 \ 'info': 'words are cool',
3248 \ 'kind': 'W',
3249 \ 'user_data': 'test'
3250 \ },
3251 \ {
3252 \ 'word': 'anotherword',
3253 \ 'abbr': 'anotwrd',
3254 \ 'menu': 'extra text',
3255 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3256 \ 'kind': 'W',
3257 \ 'user_data': 'notest'
3258 \ },
3259 \ {
3260 \ 'word': 'noinfo',
3261 \ 'abbr': 'noawrd',
3262 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003263 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003264 \ 'kind': 'W',
3265 \ 'user_data': 'notest'
3266 \ },
3267 \ {
3268 \ 'word': 'thatword',
3269 \ 'abbr': 'thatwrd',
3270 \ 'menu': 'extra text',
3271 \ 'info': 'that word is cool',
3272 \ 'kind': 'W',
3273 \ 'user_data': 'notest'
3274 \ },
3275 \ ]
3276 \ }
3277 endfunc
3278 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003279 func ChangeColor()
3280 let id = popup_findinfo()
Bram Moolenaard356fc62020-12-09 18:13:44 +01003281 if buflisted(winbufnr(id))
3282 call setline(1, 'buffer is listed')
3283 endif
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003284 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003285 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003286
3287 func InfoHidden()
3288 set completepopup=height:4,border:off,align:menu
3289 set completeopt-=popup completeopt+=popuphidden
3290 au CompleteChanged * call HandleChange()
3291 endfunc
3292
3293 let s:counter = 0
3294 func HandleChange()
3295 let s:counter += 1
3296 let selected = complete_info(['selected']).selected
3297 if selected <= 0
3298 " First time: do nothing, info remains hidden
3299 return
3300 endif
3301 if selected == 1
3302 " Second time: show info right away
3303 let id = popup_findinfo()
3304 if id
3305 call popup_settext(id, 'immediate info ' .. s:counter)
3306 call popup_show(id)
3307 endif
3308 else
3309 " Third time: show info after a short delay
3310 call timer_start(100, 'ShowInfo')
3311 endif
3312 endfunc
3313
3314 func ShowInfo(...)
3315 let id = popup_findinfo()
3316 if id
3317 call popup_settext(id, 'async info ' .. s:counter)
3318 call popup_show(id)
3319 endif
3320 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003321
3322 " Check that no autocommands are triggered for the info popup
3323 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3324 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003325 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003326 return lines
3327endfunc
3328
3329func Test_popupmenu_info_border()
3330 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003331 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003332
3333 let lines = Get_popupmenu_lines()
3334 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003335 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003336
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003337 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003338 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003339
3340 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3341 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3342
3343 call term_sendkeys(buf, "\<C-N>")
3344 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3345
3346 call term_sendkeys(buf, "\<C-N>")
3347 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3348
3349 call term_sendkeys(buf, "\<C-N>\<C-N>")
3350 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3351
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003352 " info on the left with scrollbar
3353 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3354 call term_sendkeys(buf, "\<C-N>\<C-N>")
3355 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3356
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003357 " Test that the popupmenu's scrollbar and infopopup do not overlap
3358 call term_sendkeys(buf, "\<Esc>")
3359 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3360 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3361 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3362
Bram Moolenaar8e7d6222020-12-18 19:49:56 +01003363 " Hide the info popup, cycle through buffers, make sure it didn't get
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003364 " deleted.
3365 call term_sendkeys(buf, "\<Esc>")
3366 call term_sendkeys(buf, ":set hidden\<CR>")
3367 call term_sendkeys(buf, ":bn\<CR>")
3368 call term_sendkeys(buf, ":bn\<CR>")
3369 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3370 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3371
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003372 " Test that when the option is changed the popup changes.
3373 call term_sendkeys(buf, "\<Esc>")
3374 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3375 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3376 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3377
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003378 call term_sendkeys(buf, " \<Esc>")
3379 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3380 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3381 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3382
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003383 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003384 call StopVimInTerminal(buf)
3385 call delete('XtestInfoPopup')
3386endfunc
3387
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003388func Test_popupmenu_info_noborder()
3389 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003390 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003391
3392 let lines = Get_popupmenu_lines()
3393 call add(lines, 'set completepopup=height:4,border:off')
3394 call writefile(lines, 'XtestInfoPopupNb')
3395
3396 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003397 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003398
3399 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3400 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3401
3402 call StopVimInTerminal(buf)
3403 call delete('XtestInfoPopupNb')
3404endfunc
3405
Bram Moolenaar258cef52019-08-21 17:29:29 +02003406func Test_popupmenu_info_align_menu()
3407 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003408 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003409
3410 let lines = Get_popupmenu_lines()
3411 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3412 call writefile(lines, 'XtestInfoPopupNb')
3413
3414 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003415 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003416
3417 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3418 call term_sendkeys(buf, "\<C-N>")
3419 call term_sendkeys(buf, "\<C-N>")
3420 call term_sendkeys(buf, "\<C-N>")
3421 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3422
3423 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3424 call term_sendkeys(buf, "\<C-N>")
3425 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3426
3427 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003428 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003429 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3430 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3431 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3432
3433 call StopVimInTerminal(buf)
3434 call delete('XtestInfoPopupNb')
3435endfunc
3436
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003437func Test_popupmenu_info_hidden()
3438 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003439 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003440
3441 let lines = Get_popupmenu_lines()
3442 call add(lines, 'call InfoHidden()')
3443 call writefile(lines, 'XtestInfoPopupHidden')
3444
3445 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003446 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003447
3448 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3449 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3450
3451 call term_sendkeys(buf, "\<C-N>")
3452 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3453
3454 call term_sendkeys(buf, "\<C-N>")
3455 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3456
3457 call term_sendkeys(buf, "\<Esc>")
3458 call StopVimInTerminal(buf)
3459 call delete('XtestInfoPopupHidden')
3460endfunc
3461
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003462func Test_popupmenu_info_too_wide()
3463 CheckScreendump
3464 CheckFeature quickfix
3465
3466 let lines =<< trim END
3467 call setline(1, range(10))
3468
3469 set completeopt+=preview,popup
3470 set completepopup=align:menu
3471 set omnifunc=OmniFunc
3472 hi InfoPopup ctermbg=lightgrey
3473
3474 func OmniFunc(findstart, base)
3475 if a:findstart
3476 return 0
3477 endif
3478
3479 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3480 return #{
3481 \ words: [
3482 \ #{
3483 \ word: 'scrap',
3484 \ menu: menuText,
3485 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3486 \ },
3487 \ #{
3488 \ word: 'scappier',
3489 \ menu: menuText,
3490 \ info: 'words are cool',
3491 \ },
3492 \ #{
3493 \ word: 'scrappier2',
3494 \ menu: menuText,
3495 \ info: 'words are cool',
3496 \ },
3497 \ ]
3498 \ }
3499 endfunc
3500 END
3501
3502 call writefile(lines, 'XtestInfoPopupWide')
3503 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003504 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003505
3506 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3507 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3508
3509 call term_sendkeys(buf, "\<Esc>")
3510 call StopVimInTerminal(buf)
3511 call delete('XtestInfoPopupWide')
3512endfunc
3513
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003514func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003515 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003516 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003517 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003518 call assert_equal(bufnr, winbufnr(winid))
3519 call popup_clear()
3520endfunc
3521
Bram Moolenaar1824f452019-10-02 23:06:46 +02003522func Test_popupwin_getoptions_tablocal()
3523 topleft split
3524 let win1 = popup_create('nothing', #{maxheight: 8})
3525 let win2 = popup_create('something', #{maxheight: 10})
3526 let win3 = popup_create('something', #{maxheight: 15})
3527 call assert_equal(8, popup_getoptions(win1).maxheight)
3528 call assert_equal(10, popup_getoptions(win2).maxheight)
3529 call assert_equal(15, popup_getoptions(win3).maxheight)
3530 call popup_clear()
3531 quit
3532endfunc
3533
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003534func Test_popupwin_cancel()
3535 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3536 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3537 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3538 call assert_equal(5, popup_getpos(win1).line)
3539 call assert_equal(10, popup_getpos(win2).line)
3540 call assert_equal(15, popup_getpos(win3).line)
3541 " TODO: this also works without patch 8.1.2110
3542 call feedkeys("\<C-C>", 'xt')
3543 call assert_equal(5, popup_getpos(win1).line)
3544 call assert_equal(10, popup_getpos(win2).line)
3545 call assert_equal({}, popup_getpos(win3))
3546 call feedkeys("\<C-C>", 'xt')
3547 call assert_equal(5, popup_getpos(win1).line)
3548 call assert_equal({}, popup_getpos(win2))
3549 call assert_equal({}, popup_getpos(win3))
3550 call feedkeys("\<C-C>", 'xt')
3551 call assert_equal({}, popup_getpos(win1))
3552 call assert_equal({}, popup_getpos(win2))
3553 call assert_equal({}, popup_getpos(win3))
3554endfunc
3555
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003556func Test_popupwin_filter_redraw()
3557 " Create two popups with a filter that closes the popup when typing "0".
3558 " Both popups should close, even though the redraw also calls
3559 " popup_reset_handled()
3560
3561 func CloseFilter(winid, key)
3562 if a:key == '0'
3563 call popup_close(a:winid)
3564 redraw
3565 endif
3566 return 0 " pass the key
3567 endfunc
3568
3569 let id1 = popup_create('first one', #{
3570 \ line: 1,
3571 \ col: 1,
3572 \ filter: 'CloseFilter',
3573 \ })
3574 let id2 = popup_create('second one', #{
3575 \ line: 9,
3576 \ col: 1,
3577 \ filter: 'CloseFilter',
3578 \ })
3579 call assert_equal(1, popup_getpos(id1).line)
3580 call assert_equal(9, popup_getpos(id2).line)
3581
3582 call feedkeys('0', 'xt')
3583 call assert_equal({}, popup_getpos(id1))
3584 call assert_equal({}, popup_getpos(id2))
3585
3586 call popup_clear()
3587 delfunc CloseFilter
3588endfunc
3589
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003590func Test_popupwin_double_width()
3591 CheckScreendump
3592
3593 let lines =<< trim END
3594 call setline(1, 'x你好世界你好世你好世界你好')
3595 call setline(2, '你好世界你好世你好世界你好')
3596 call setline(3, 'x你好世界你好世你好世界你好')
3597 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3598 END
3599 call writefile(lines, 'XtestPopupWide')
3600
3601 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3602 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3603
3604 call StopVimInTerminal(buf)
3605 call delete('XtestPopupWide')
3606endfunc
3607
3608func Test_popupwin_sign()
3609 CheckScreendump
3610
3611 let lines =<< trim END
3612 call setline(1, range(10))
3613 call sign_define('Current', {
3614 \ 'text': '>>',
3615 \ 'texthl': 'WarningMsg',
3616 \ 'linehl': 'Error',
3617 \ })
3618 call sign_define('Other', {
3619 \ 'text': '#!',
3620 \ 'texthl': 'Error',
3621 \ 'linehl': 'Search',
3622 \ })
3623 let winid = popup_create(['hello', 'bright', 'world'], {
3624 \ 'minwidth': 20,
3625 \ })
3626 call setwinvar(winid, "&signcolumn", "yes")
3627 let winbufnr = winbufnr(winid)
3628
3629 " add sign to current buffer, shows
3630 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3631 " add sign to current buffer, does not show
3632 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3633
3634 " add sign to popup buffer, shows
3635 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3636 " add sign to popup buffer, does not show
3637 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003638
3639 func SetOptions()
3640 call setwinvar(g:winid, '&number', 1)
3641 call setwinvar(g:winid, '&foldcolumn', 2)
3642 call popup_settext(g:winid, 'a longer line to check the width')
3643 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003644 END
3645 call writefile(lines, 'XtestPopupSign')
3646
3647 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3648 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3649
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003650 " set more options to check the width is adjusted
3651 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3652 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3653
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003654 call StopVimInTerminal(buf)
3655 call delete('XtestPopupSign')
3656endfunc
3657
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003658func Test_popupwin_bufnr()
3659 let popwin = popup_create(['blah'], #{})
3660 let popbuf = winbufnr(popwin)
3661 split asdfasdf
3662 let newbuf = bufnr()
3663 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3664 call assert_equal(newbuf, bufnr('$'))
3665 call popup_clear()
3666 let popwin = popup_create(['blah'], #{})
3667 " reuses previous buffer number
3668 call assert_equal(popbuf, winbufnr(popwin))
3669 call assert_equal(newbuf, bufnr('$'))
3670
3671 call popup_clear()
3672 bwipe!
3673endfunc
3674
Bram Moolenaarec084d32020-02-28 22:44:47 +01003675func Test_popupwin_filter_input_multibyte()
3676 func MyPopupFilter(winid, c)
3677 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3678 return 0
3679 endfunc
3680 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3681
3682 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3683 call feedkeys("\u3000", 'xt')
3684 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3685
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003686 " UTF-8: E3 80 9B, including CSI(0x9B)
3687 call feedkeys("\u301b", 'xt')
3688 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003689
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003690 if has('unix')
3691 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003692 if has('gui_running')
3693 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3694 else
3695 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3696 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003697 call assert_equal([0xc3, 0x81], g:bytes)
3698 endif
3699
Bram Moolenaarec084d32020-02-28 22:44:47 +01003700 call popup_clear()
3701 delfunc MyPopupFilter
3702 unlet g:bytes
3703endfunc
3704
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003705func Test_popupwin_filter_close_ctrl_c()
3706 CheckScreendump
3707
3708 let lines =<< trim END
3709 vsplit
3710 set laststatus=2
3711 set statusline=%!Statusline()
3712
3713 function Statusline() abort
3714 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3715 endfunction
3716
3717 call popup_create('test test test test...', {'filter': {-> 0}})
3718 END
3719 call writefile(lines, 'XtestPopupCtrlC')
3720
3721 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3722
3723 call term_sendkeys(buf, "\<C-C>")
3724 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3725
3726 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003727 call delete('XtestPopupCtrlC')
3728endfunc
3729
3730func Test_popupwin_filter_close_wrong_name()
3731 CheckScreendump
3732
3733 let lines =<< trim END
3734 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3735 END
3736 call writefile(lines, 'XtestPopupWrongName')
3737
3738 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3739
3740 call term_sendkeys(buf, "j")
3741 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3742
3743 call StopVimInTerminal(buf)
3744 call delete('XtestPopupWrongName')
3745endfunc
3746
3747func Test_popupwin_filter_close_three_errors()
3748 CheckScreendump
3749
3750 let lines =<< trim END
3751 set cmdheight=2
3752 call popup_create('one two three...', {'filter': 'filter'})
3753 END
3754 call writefile(lines, 'XtestPopupThreeErrors')
3755
3756 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3757
3758 call term_sendkeys(buf, "jj")
3759 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3760 call term_sendkeys(buf, "j")
3761 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3762
3763 call StopVimInTerminal(buf)
3764 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003765endfunc
3766
Bram Moolenaar927495b2020-11-06 17:58:35 +01003767func Test_popupwin_latin1_encoding()
3768 CheckScreendump
3769 CheckUnix
3770
3771 " When 'encoding' is a single-byte encoding a terminal window will mess up
3772 " the display. Check that showing a popup on top of that doesn't crash.
3773 let lines =<< trim END
3774 set encoding=latin1
3775 terminal cat Xmultibyte
3776 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003777 redraw
Bram Moolenaarb125b532020-12-17 21:56:09 +01003778 " wait for "cat" to finish
3779 while execute('ls!') !~ 'finished'
3780 sleep 10m
3781 endwhile
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003782 echo "Done"
Bram Moolenaar927495b2020-11-06 17:58:35 +01003783 END
3784 call writefile(lines, 'XtestPopupLatin')
3785 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte')
3786
3787 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003788 call WaitForAssert({-> assert_match('Done', term_getline(buf, 10))})
Bram Moolenaar927495b2020-11-06 17:58:35 +01003789
3790 call term_sendkeys(buf, ":q\<CR>")
3791 call StopVimInTerminal(buf)
3792 call delete('XtestPopupLatin')
3793 call delete('Xmultibyte')
3794endfunc
3795
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003796func Test_popupwin_atcursor_far_right()
3797 new
3798
3799 " this was getting stuck
3800 set signcolumn=yes
3801 call setline(1, repeat('=', &columns))
3802 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003803 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003804
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003805 " 'signcolumn' was getting reset
3806 call setwinvar(winid, '&signcolumn', 'yes')
3807 call popup_setoptions(winid, {'zindex': 1000})
3808 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3809
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003810 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003811 bwipe!
3812 set signcolumn&
3813endfunc
3814
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003815func Test_popupwin_splitmove()
3816 vsplit
3817 let win2 = win_getid()
3818 let popup_winid = popup_dialog('hello', {})
3819 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3820 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3821
3822 call popup_clear()
3823 bwipe
3824endfunc
3825
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01003826func Test_popupwin_exiting_terminal()
3827 CheckFeature terminal
3828
3829 " Tests that when creating a popup right after closing a terminal window does
3830 " not make the popup the current window.
3831 let winid = win_getid()
3832 try
3833 augroup Test_popupwin_exiting_terminal
3834 autocmd!
3835 autocmd WinEnter * :call popup_create('test', {})
3836 augroup END
3837 let bnr = term_start(&shell, #{term_finish: 'close'})
3838 call term_sendkeys(bnr, "exit\r\n")
3839 call WaitForAssert({-> assert_equal(winid, win_getid())})
3840 finally
3841 call popup_clear(1)
3842 augroup Test_popupwin_exiting_terminal
3843 autocmd!
3844 augroup END
3845 endtry
3846endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003847
Bram Moolenaar014f6982021-01-04 13:18:30 +01003848func Test_popup_filter_menu()
3849 let colors = ['red', 'green', 'blue']
3850 call popup_menu(colors, #{callback: {_, result -> assert_equal('green', colors[result - 1])}})
3851 call feedkeys("\<c-n>\<c-n>\<c-p>\<cr>", 'xt')
3852endfunc
3853
Bram Moolenaar65026432021-02-06 14:22:32 +01003854func Test_popup_getoptions_other_tab()
3855 new
3856 call setline(1, 'some text')
3857 call prop_type_add('textprop', {})
3858 call prop_add(1, 1, #{type: 'textprop', length: 1})
3859 let id = popup_create('TEST', #{textprop: 'textprop', highlight: 'ErrorMsg', tabpage: 1})
3860 tab sp
3861 call assert_equal(['textprop', 'textpropid', 'textpropwin'], popup_getoptions(id)->keys()->filter({_, v -> v =~ 'textprop'}))
3862
3863 tabclose
Bram Moolenaarefa19232021-02-06 14:59:27 +01003864 call popup_close(id)
Bram Moolenaar65026432021-02-06 14:22:32 +01003865 bwipe!
3866 call prop_type_delete('textprop')
3867endfunc
3868
Bram Moolenaarefa19232021-02-06 14:59:27 +01003869
3870func Test_popup_setoptions_other_tab()
3871 new Xfile
3872 let winid = win_getid()
3873 call setline(1, 'some text')
3874 call prop_type_add('textprop', {})
3875 call prop_add(1, 1, #{type: 'textprop', length: 1})
3876 let id = popup_create('TEST', #{textprop: 'textprop'})
3877 tab sp
3878 call popup_setoptions(id, #{textprop: 'textprop', textpropwin: winid})
3879 call assert_equal(winid, popup_getoptions(id).textpropwin)
3880
3881 tabclose
3882 call popup_close(id)
3883 bwipe! Xfile
3884 call prop_type_delete('textprop')
3885endfunc
3886
Bram Moolenaar82db31c2021-02-10 14:56:11 +01003887func Test_popup_prop_not_visible()
3888 CheckScreendump
3889
3890 let lines =<< trim END
3891 vim9script
3892 set nowrap stal=2
3893 rightbelow :31vnew
3894 setline(1, ['', 'some text', '', 'other text'])
3895 prop_type_add('someprop', {})
3896 prop_add(2, 9, {type: 'someprop', length: 5})
3897 popup_create('attached to "some"', {
3898 textprop: 'someprop',
3899 highlight: 'ErrorMsg',
3900 line: -1,
3901 wrap: false,
3902 fixed: true,
3903 })
3904 prop_type_add('otherprop', {})
3905 prop_add(4, 10, {type: 'otherprop', length: 5})
3906 popup_create('attached to "other"', {
3907 textprop: 'otherprop',
3908 highlight: 'ErrorMsg',
3909 line: -1,
3910 wrap: false,
3911 fixed: false,
3912 })
3913 END
3914 call writefile(lines, 'XtestPropNotVisble')
3915 let buf = RunVimInTerminal('-S XtestPropNotVisble', #{rows: 10})
3916 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01', {})
3917
3918 call term_sendkeys(buf, ":vert resize -14\<CR>")
3919 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_02', {})
3920
3921 call term_sendkeys(buf, ":vert resize -8\<CR>")
3922 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_03', {})
3923
3924 " clean up
3925 call StopVimInTerminal(buf)
3926 call delete('XtestPropNotVisble')
3927endfunction
3928
Bram Moolenaar7b4f76c2021-06-10 21:07:48 +02003929func Test_bufdel_skips_popupwin_buffer()
3930 let id = popup_create("Some text", {})
3931 %bd
3932 call popup_close(id)
3933endfunc
3934
Bram Moolenaar82db31c2021-02-10 14:56:11 +01003935
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003936" vim: shiftwidth=2 sts=2