blob: 50d4715e7bd53eda3480a98adc9269d2123abd80 [file] [log] [blame]
Bram Moolenaar4d784b22019-05-25 19:51:39 +02001" Tests for popup windows
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
Bram Moolenaar05ad5ff2019-11-30 22:48:27 +01004CheckFeature popupwin
Bram Moolenaar4d784b22019-05-25 19:51:39 +02005
6source screendump.vim
7
8func Test_simple_popup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02009 CheckScreendump
10
Bram Moolenaare7eb9272019-06-24 00:58:07 +020011 let lines =<< trim END
12 call setline(1, range(1, 100))
13 hi PopupColor1 ctermbg=lightblue
14 hi PopupColor2 ctermbg=lightcyan
Bram Moolenaar1666ac92019-11-10 17:22:31 +010015 hi EndOfBuffer ctermbg=lightgrey
Bram Moolenaare7eb9272019-06-24 00:58:07 +020016 hi Comment ctermfg=red
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020017 call prop_type_add('comment', #{highlight: 'Comment'})
18 let winid = popup_create('hello there', #{line: 3, col: 11, minwidth: 20, highlight: 'PopupColor1'})
19 let winid2 = popup_create(['another one', 'another two', 'another three'], #{line: 3, col: 25, minwidth: 20})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020020 call setwinvar(winid2, '&wincolor', 'PopupColor2')
21 END
22 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020023 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar4d784b22019-05-25 19:51:39 +020024 call VerifyScreenDump(buf, 'Test_popupwin_01', {})
25
Bram Moolenaarec583842019-05-26 14:11:23 +020026 " Add a tabpage
27 call term_sendkeys(buf, ":tabnew\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020028 call term_sendkeys(buf, ":let popupwin = popup_create(["
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020029 \ .. "#{text: 'other tab'},"
30 \ .. "#{text: 'a comment line', props: [#{"
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020031 \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
Bram Moolenaar7a8d0272019-05-26 23:32:06 +020032 \ .. "}]},"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020033 \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
Bram Moolenaarec583842019-05-26 14:11:23 +020034 call VerifyScreenDump(buf, 'Test_popupwin_02', {})
35
36 " switch back to first tabpage
37 call term_sendkeys(buf, "gt")
38 call VerifyScreenDump(buf, 'Test_popupwin_03', {})
39
40 " close that tabpage
41 call term_sendkeys(buf, ":quit!\<CR>")
42 call VerifyScreenDump(buf, 'Test_popupwin_04', {})
43
Bram Moolenaar202d9822019-06-11 21:56:30 +020044 " set 'columns' to a small value, size must be recomputed
45 call term_sendkeys(buf, ":let cols = &columns\<CR>")
46 call term_sendkeys(buf, ":set columns=12\<CR>")
47 call VerifyScreenDump(buf, 'Test_popupwin_04a', {})
48 call term_sendkeys(buf, ":let &columns = cols\<CR>")
49
Bram Moolenaar17146962019-05-30 00:12:11 +020050 " resize popup, show empty line at bottom
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020051 call term_sendkeys(buf, ":call popup_move(popupwin, #{minwidth: 15, maxwidth: 25, minheight: 3, maxheight: 5})\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020052 call term_sendkeys(buf, ":redraw\<CR>")
53 call VerifyScreenDump(buf, 'Test_popupwin_05', {})
54
Bram Moolenaar17146962019-05-30 00:12:11 +020055 " show not fitting line at bottom
56 call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\<CR>")
57 call term_sendkeys(buf, ":redraw\<CR>")
58 call VerifyScreenDump(buf, 'Test_popupwin_06', {})
59
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020060 " move popup over ruler
61 call term_sendkeys(buf, ":set cmdheight=2\<CR>")
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020062 call term_sendkeys(buf, ":call popup_move(popupwin, #{line: 7, col: 55})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +020063 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020064 call VerifyScreenDump(buf, 'Test_popupwin_07', {})
65
66 " clear all popups after moving the cursor a bit, so that ruler is updated
67 call term_sendkeys(buf, "axxx\<Esc>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020068 call TermWait(buf)
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020069 call term_sendkeys(buf, "0")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020070 call TermWait(buf)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +020071 call term_sendkeys(buf, ":call popup_clear()\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020072 call VerifyScreenDump(buf, 'Test_popupwin_08', {})
73
Bram Moolenaar4d784b22019-05-25 19:51:39 +020074 " clean up
75 call StopVimInTerminal(buf)
76 call delete('XtestPopup')
77endfunc
Bram Moolenaar51fe3b12019-05-26 20:10:06 +020078
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020079func Test_popup_with_border_and_padding()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +020080 CheckScreendump
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020081
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +020082 for iter in range(0, 1)
Bram Moolenaare7eb9272019-06-24 00:58:07 +020083 let lines =<< trim END
84 call setline(1, range(1, 100))
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020085 call popup_create('hello border', #{line: 2, col: 3, border: []})
86 call popup_create('hello padding', #{line: 2, col: 23, padding: []})
Bram Moolenaarc363fe12019-08-04 18:13:46 +020087 call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020088 call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
Bram Moolenaarb0992022020-01-30 14:55:42 +010089 call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020090 call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
91 call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
Bram Moolenaarfbcdf672020-01-06 23:07:48 +010092 call popup_create('X', #{line: 2, col: 73})
93 call popup_create('X', #{line: 3, col: 74})
94 call popup_create('X', #{line: 4, col: 75})
95 call popup_create('X', #{line: 5, col: 76})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020096 END
97 call insert(lines, iter == 1 ? '' : 'set enc=latin1')
98 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020099 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 15})
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +0200100 call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
101
102 call StopVimInTerminal(buf)
103 call delete('XtestPopupBorder')
104 endfor
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200105
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200106 let lines =<< trim END
107 call setline(1, range(1, 100))
108 hi BlueColor ctermbg=lightblue
109 hi TopColor ctermbg=253
110 hi RightColor ctermbg=245
111 hi BottomColor ctermbg=240
112 hi LeftColor ctermbg=248
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200113 call popup_create('hello border', #{line: 2, col: 3, border: [], borderhighlight: ['BlueColor']})
114 call popup_create(['hello border', 'and more'], #{line: 2, col: 23, border: [], borderhighlight: ['TopColor', 'RightColor', 'BottomColor', 'LeftColor']})
115 call popup_create(['hello border', 'lines only'], #{line: 2, col: 43, border: [], borderhighlight: ['BlueColor'], borderchars: ['x']})
116 call popup_create(['hello border', 'with corners'], #{line: 2, col: 60, border: [], borderhighlight: ['BlueColor'], borderchars: ['x', '#']})
117 let winid = popup_create(['hello border', 'with numbers'], #{line: 6, col: 3, border: [], borderhighlight: ['BlueColor'], borderchars: ['0', '1', '2', '3', '4', '5', '6', '7']})
118 call popup_create(['hello border', 'just blanks'], #{line: 7, col: 23, border: [], borderhighlight: ['BlueColor'], borderchars: [' ']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200119 func MultiByte()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200120 call popup_create(['hello'], #{line: 8, col: 43, border: [], borderchars: ['─', '│', '─', '│', '┌', '┐', '┘', '└']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200121 endfunc
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200122 END
123 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200124 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 12})
Bram Moolenaar790498b2019-06-01 22:15:29 +0200125 call VerifyScreenDump(buf, 'Test_popupwin_22', {})
126
Bram Moolenaarad24a712019-06-17 20:05:45 +0200127 " check that changing borderchars triggers a redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200128 call term_sendkeys(buf, ":call popup_setoptions(winid, #{borderchars: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']})\<CR>")
Bram Moolenaarad24a712019-06-17 20:05:45 +0200129 call VerifyScreenDump(buf, 'Test_popupwin_23', {})
130
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200131 " check multi-byte border only with 'ambiwidth' single
132 if &ambiwidth == 'single'
133 call term_sendkeys(buf, ":call MultiByte()\<CR>")
134 call VerifyScreenDump(buf, 'Test_popupwin_24', {})
135 endif
136
Bram Moolenaar790498b2019-06-01 22:15:29 +0200137 call StopVimInTerminal(buf)
138 call delete('XtestPopupBorder')
139
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200140 let with_border_or_padding = #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200141 \ line: 2,
142 \ core_line: 3,
143 \ col: 3,
144 \ core_col: 4,
145 \ width: 14,
146 \ core_width: 12,
147 \ height: 3,
148 \ core_height: 1,
149 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100150 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200151 \ scrollbar: 0,
152 \ visible: 1}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200153 let winid = popup_create('hello border', #{line: 2, col: 3, border: []})",
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200154 call assert_equal(with_border_or_padding, winid->popup_getpos())
Bram Moolenaarae943152019-06-16 22:54:14 +0200155 let options = popup_getoptions(winid)
156 call assert_equal([], options.border)
157 call assert_false(has_key(options, "padding"))
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200158
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200159 let winid = popup_create('hello padding', #{line: 2, col: 3, padding: []})
Bram Moolenaarae943152019-06-16 22:54:14 +0200160 let with_border_or_padding.width = 15
161 let with_border_or_padding.core_width = 13
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200162 call assert_equal(with_border_or_padding, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200163 let options = popup_getoptions(winid)
164 call assert_false(has_key(options, "border"))
165 call assert_equal([], options.padding)
166
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200167 call popup_setoptions(winid, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200168 \ padding: [1, 2, 3, 4],
169 \ border: [4, 0, 7, 8],
170 \ borderhighlight: ['Top', 'Right', 'Bottom', 'Left'],
171 \ borderchars: ['1', '^', '2', '>', '3', 'v', '4', '<'],
Bram Moolenaarae943152019-06-16 22:54:14 +0200172 \ })
173 let options = popup_getoptions(winid)
174 call assert_equal([1, 0, 1, 1], options.border)
175 call assert_equal([1, 2, 3, 4], options.padding)
176 call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
177 call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200178
Bram Moolenaara1396152019-10-20 18:46:05 +0200179 " Check that popup_setoptions() takes the output of popup_getoptions()
180 call popup_setoptions(winid, options)
181 call assert_equal(options, popup_getoptions(winid))
182
Bram Moolenaarb0992022020-01-30 14:55:42 +0100183 " Check that range() doesn't crash
184 call popup_setoptions(winid, #{
185 \ padding: range(1, 4),
186 \ border: range(5, 8),
187 \ borderhighlight: range(4),
188 \ borderchars: range(8),
189 \ })
190
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200191 let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
192 call assert_equal(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200193 \ line: 3,
194 \ core_line: 5,
195 \ col: 8,
196 \ core_col: 10,
197 \ width: 14,
198 \ core_width: 10,
199 \ height: 5,
200 \ scrollbar: 0,
201 \ core_height: 1,
202 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100203 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200204 \ visible: 1}, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200205
206 call popup_clear()
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200207endfunc
208
Bram Moolenaarb4230122019-05-30 18:40:53 +0200209func Test_popup_with_syntax_win_execute()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200210 CheckScreendump
211
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200212 let lines =<< trim END
213 call setline(1, range(1, 100))
214 hi PopupColor ctermbg=lightblue
215 let winid = popup_create([
216 \ '#include <stdio.h>',
217 \ 'int main(void)',
218 \ '{',
219 \ ' printf(123);',
220 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200221 \], #{line: 3, col: 25, highlight: 'PopupColor'})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200222 call win_execute(winid, 'set syntax=cpp')
223 END
224 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200225 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200226 call VerifyScreenDump(buf, 'Test_popupwin_10', {})
227
228 " clean up
229 call StopVimInTerminal(buf)
230 call delete('XtestPopup')
231endfunc
232
233func Test_popup_with_syntax_setbufvar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200234 CheckScreendump
235
Bram Moolenaar402502d2019-05-30 22:07:36 +0200236 let lines =<< trim END
237 call setline(1, range(1, 100))
238 hi PopupColor ctermbg=lightgrey
239 let winid = popup_create([
240 \ '#include <stdio.h>',
241 \ 'int main(void)',
242 \ '{',
Bram Moolenaare089c3f2019-07-09 20:25:25 +0200243 \ "\tprintf(567);",
Bram Moolenaar402502d2019-05-30 22:07:36 +0200244 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200245 \], #{line: 3, col: 21, highlight: 'PopupColor'})
Bram Moolenaar402502d2019-05-30 22:07:36 +0200246 call setbufvar(winbufnr(winid), '&syntax', 'cpp')
247 END
248 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200249 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200250 call VerifyScreenDump(buf, 'Test_popupwin_11', {})
251
252 " clean up
253 call StopVimInTerminal(buf)
254 call delete('XtestPopup')
255endfunc
256
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200257func Test_popup_with_matches()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200258 CheckScreendump
259
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200260 let lines =<< trim END
261 call setline(1, ['111 222 333', '444 555 666'])
262 let winid = popup_create([
263 \ '111 222 333',
264 \ '444 555 666',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200265 \], #{line: 3, col: 10, border: []})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200266 set hlsearch
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100267 hi VeryBlue ctermfg=blue guifg=blue
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200268 /666
269 call matchadd('ErrorMsg', '111')
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100270 call matchadd('VeryBlue', '444')
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200271 call win_execute(winid, "call matchadd('ErrorMsg', '111')")
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100272 call win_execute(winid, "call matchadd('VeryBlue', '555')")
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200273 END
274 call writefile(lines, 'XtestPopupMatches')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200275 let buf = RunVimInTerminal('-S XtestPopupMatches', #{rows: 10})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200276 call VerifyScreenDump(buf, 'Test_popupwin_matches', {})
277
278 " clean up
279 call StopVimInTerminal(buf)
280 call delete('XtestPopupMatches')
281endfunc
282
Bram Moolenaar399d8982019-06-02 15:34:29 +0200283func Test_popup_all_corners()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200284 CheckScreendump
285
Bram Moolenaar399d8982019-06-02 15:34:29 +0200286 let lines =<< trim END
287 call setline(1, repeat([repeat('-', 60)], 15))
288 set so=0
289 normal 2G3|r#
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200290 let winid1 = popup_create(['first', 'second'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200291 \ line: 'cursor+1',
292 \ col: 'cursor',
293 \ pos: 'topleft',
294 \ border: [],
295 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200296 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200297 normal 24|r@
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200298 let winid1 = popup_create(['First', 'SeconD'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200299 \ line: 'cursor+1',
300 \ col: 'cursor',
301 \ pos: 'topright',
302 \ border: [],
303 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200304 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200305 normal 9G27|r%
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200306 let winid1 = popup_create(['fiRSt', 'seCOnd'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200307 \ line: 'cursor-1',
308 \ col: 'cursor',
309 \ pos: 'botleft',
310 \ border: [],
311 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200312 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200313 normal 48|r&
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200314 let winid1 = popup_create(['FIrsT', 'SEcoND'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200315 \ line: 'cursor-1',
316 \ col: 'cursor',
317 \ pos: 'botright',
318 \ border: [],
319 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200320 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200321 normal 1G51|r*
322 let winid1 = popup_create(['one', 'two'], #{
323 \ line: 'cursor-1',
324 \ col: 'cursor',
325 \ pos: 'botleft',
326 \ border: [],
327 \ padding: [],
328 \ })
Bram Moolenaar399d8982019-06-02 15:34:29 +0200329 END
330 call writefile(lines, 'XtestPopupCorners')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200331 let buf = RunVimInTerminal('-S XtestPopupCorners', #{rows: 12})
Bram Moolenaar399d8982019-06-02 15:34:29 +0200332 call VerifyScreenDump(buf, 'Test_popupwin_corners', {})
333
334 " clean up
335 call StopVimInTerminal(buf)
336 call delete('XtestPopupCorners')
337endfunc
338
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100339func Test_popup_nospace()
340 CheckScreendump
341
342 let lines =<< trim END
343 call setline(1, repeat([repeat('-', 60)], 15))
344 set so=0
345
346 " cursor in a line in top half, using "botleft" with popup that
347 " does fit
348 normal 5G2|r@
349 let winid1 = popup_create(['one', 'two'], #{
350 \ line: 'cursor-1',
351 \ col: 'cursor',
352 \ pos: 'botleft',
353 \ border: [],
354 \ })
355 " cursor in a line in top half, using "botleft" with popup that
356 " doesn't fit: gets truncated
357 normal 5G9|r#
358 let winid1 = popup_create(['one', 'two', 'tee'], #{
359 \ line: 'cursor-1',
360 \ col: 'cursor',
361 \ pos: 'botleft',
362 \ posinvert: 0,
363 \ border: [],
364 \ })
365 " cursor in a line in top half, using "botleft" with popup that
366 " doesn't fit and 'posinvert' set: flips to below.
367 normal 5G16|r%
368 let winid1 = popup_create(['one', 'two', 'tee'], #{
369 \ line: 'cursor-1',
370 \ col: 'cursor',
371 \ pos: 'botleft',
372 \ border: [],
373 \ })
374 " cursor in a line in bottom half, using "botleft" with popup that
375 " doesn't fit: does not flip.
376 normal 8G23|r*
377 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
378 \ line: 'cursor-1',
379 \ col: 'cursor',
380 \ pos: 'botleft',
381 \ border: [],
382 \ })
383
384 " cursor in a line in bottom half, using "topleft" with popup that
385 " does fit
386 normal 8G30|r@
387 let winid1 = popup_create(['one', 'two'], #{
388 \ line: 'cursor+1',
389 \ col: 'cursor',
390 \ pos: 'topleft',
391 \ border: [],
392 \ })
393 " cursor in a line in top half, using "topleft" with popup that
394 " doesn't fit: truncated
395 normal 8G37|r#
396 let winid1 = popup_create(['one', 'two', 'tee'], #{
397 \ line: 'cursor+1',
398 \ col: 'cursor',
399 \ pos: 'topleft',
400 \ posinvert: 0,
401 \ border: [],
402 \ })
403 " cursor in a line in top half, using "topleft" with popup that
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100404 " doesn't fit and "posinvert" set: flips to above.
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100405 normal 8G44|r%
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100406 let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100407 \ line: 'cursor+1',
408 \ col: 'cursor',
409 \ pos: 'topleft',
410 \ border: [],
411 \ })
412 " cursor in a line in top half, using "topleft" with popup that
413 " doesn't fit: does not flip.
414 normal 5G51|r*
415 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
416 \ line: 'cursor+1',
417 \ col: 'cursor',
418 \ pos: 'topleft',
419 \ border: [],
420 \ })
421 END
422 call writefile(lines, 'XtestPopupNospace')
423 let buf = RunVimInTerminal('-S XtestPopupNospace', #{rows: 12})
424 call VerifyScreenDump(buf, 'Test_popupwin_nospace', {})
425
426 " clean up
427 call StopVimInTerminal(buf)
428 call delete('XtestPopupNospace')
429endfunc
430
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200431func Test_popup_firstline_dump()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200432 CheckScreendump
433
Bram Moolenaar8d241042019-06-12 23:40:01 +0200434 let lines =<< trim END
435 call setline(1, range(1, 20))
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200436 let winid = popup_create(['1111', '222222', '33333', '44', '5', '666666', '77777', '888', '9999999999999999'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200437 \ maxheight: 4,
438 \ firstline: 3,
Bram Moolenaar8d241042019-06-12 23:40:01 +0200439 \ })
440 END
441 call writefile(lines, 'XtestPopupFirstline')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200442 let buf = RunVimInTerminal('-S XtestPopupFirstline', #{rows: 10})
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200443 call VerifyScreenDump(buf, 'Test_popupwin_firstline_1', {})
444
445 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: -1})\<CR>")
446 call term_sendkeys(buf, ":\<CR>")
447 call VerifyScreenDump(buf, 'Test_popupwin_firstline_2', {})
Bram Moolenaar8d241042019-06-12 23:40:01 +0200448
449 " clean up
450 call StopVimInTerminal(buf)
451 call delete('XtestPopupFirstline')
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200452endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +0200453
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200454func Test_popup_firstline()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200455 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200456 \ maxheight: 2,
457 \ firstline: 3,
Bram Moolenaarae943152019-06-16 22:54:14 +0200458 \ })
459 call assert_equal(3, popup_getoptions(winid).firstline)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200460 call popup_setoptions(winid, #{firstline: 1})
Bram Moolenaarae943152019-06-16 22:54:14 +0200461 call assert_equal(1, popup_getoptions(winid).firstline)
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200462 eval winid->popup_close()
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200463
464 let winid = popup_create(['xxx']->repeat(50), #{
465 \ maxheight: 3,
466 \ firstline: 11,
467 \ })
468 redraw
469 call assert_equal(11, popup_getoptions(winid).firstline)
470 call assert_equal(11, popup_getpos(winid).firstline)
Bram Moolenaar8e0a8e72019-09-02 22:56:24 +0200471 " check line() works with popup window
472 call assert_equal(11, line('.', winid))
473 call assert_equal(50, line('$', winid))
474 call assert_equal(0, line('$', 123456))
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200475
476 " Normal command changes what is displayed but not "firstline"
477 call win_execute(winid, "normal! \<c-y>")
478 call assert_equal(11, popup_getoptions(winid).firstline)
479 call assert_equal(10, popup_getpos(winid).firstline)
480
481 " Making some property change applies "firstline" again
482 call popup_setoptions(winid, #{line: 4})
483 call assert_equal(11, popup_getoptions(winid).firstline)
484 call assert_equal(11, popup_getpos(winid).firstline)
485
486 " Remove "firstline" property and scroll
487 call popup_setoptions(winid, #{firstline: 0})
488 call win_execute(winid, "normal! \<c-y>")
489 call assert_equal(0, popup_getoptions(winid).firstline)
490 call assert_equal(10, popup_getpos(winid).firstline)
491
492 " Making some property change has no side effect
493 call popup_setoptions(winid, #{line: 3})
494 call assert_equal(0, popup_getoptions(winid).firstline)
495 call assert_equal(10, popup_getpos(winid).firstline)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200496 call popup_close(winid)
Bram Moolenaarae943152019-06-16 22:54:14 +0200497
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100498 " CTRL-D scrolls down half a page
499 let winid = popup_create(['xxx']->repeat(50), #{
500 \ maxheight: 8,
501 \ })
502 redraw
503 call assert_equal(1, popup_getpos(winid).firstline)
504 call win_execute(winid, "normal! \<C-D>")
505 call assert_equal(5, popup_getpos(winid).firstline)
506 call win_execute(winid, "normal! \<C-D>")
507 call assert_equal(9, popup_getpos(winid).firstline)
508 call win_execute(winid, "normal! \<C-U>")
509 call assert_equal(5, popup_getpos(winid).firstline)
510
511 call win_execute(winid, "normal! \<C-F>")
512 call assert_equal(11, popup_getpos(winid).firstline)
513 call win_execute(winid, "normal! \<C-B>")
514 call assert_equal(5, popup_getpos(winid).firstline)
515
Bram Moolenaarae943152019-06-16 22:54:14 +0200516 call popup_close(winid)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200517endfunc
518
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200519func Test_popup_firstline_cursorline()
520 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
521 \ maxheight: 2,
522 \ firstline: 3,
523 \ cursorline: 1,
524 \ })
525 call assert_equal(3, popup_getoptions(winid).firstline)
526 call assert_equal(3, getwininfo(winid)[0].topline)
527 call assert_equal(3, getcurpos(winid)[1])
528
529 call popup_close(winid)
530endfunc
531
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200532func Test_popup_noscrolloff()
533 set scrolloff=5
534 let winid = popup_create(['xxx']->repeat(50), #{
535 \ maxheight: 5,
536 \ firstline: 11,
537 \ })
538 redraw
539 call assert_equal(11, popup_getoptions(winid).firstline)
540 call assert_equal(11, popup_getpos(winid).firstline)
541
542 call popup_setoptions(winid, #{firstline: 0})
543 call win_execute(winid, "normal! \<c-y>")
544 call assert_equal(0, popup_getoptions(winid).firstline)
545 call assert_equal(10, popup_getpos(winid).firstline)
546
547 call popup_close(winid)
548endfunc
549
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200550func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200551 CheckScreendump
552
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200553 " create a popup that covers the command line
554 let lines =<< trim END
555 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200556 split
557 vsplit
558 $wincmd w
559 vsplit
560 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200561 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200562 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200563 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200564 \ border: [],
565 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200566 \ })
567 func Dragit()
568 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
569 endfunc
570 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
Bram Moolenaar356375f2019-08-24 14:46:29 +0200571 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200572 func Resize()
573 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
574 endfunc
Bram Moolenaar356375f2019-08-24 14:46:29 +0200575 map <silent> <F5> :call test_setmouse(6, 21)<CR>
576 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200577 END
578 call writefile(lines, 'XtestPopupDrag')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200579 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200580 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
581
582 call term_sendkeys(buf, ":call Dragit()\<CR>")
583 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
584
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200585 call term_sendkeys(buf, ":call Resize()\<CR>")
586 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
587
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200588 " clean up
589 call StopVimInTerminal(buf)
590 call delete('XtestPopupDrag')
591endfunc
592
Bram Moolenaar35910f22020-07-12 19:24:10 +0200593func Test_popup_drag_termwin()
594 CheckUnix
595 CheckScreendump
596 CheckFeature terminal
597
598 " create a popup that covers the terminal window
599 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200600 set foldmethod=marker
601 call setline(1, range(100))
602 for nr in range(7)
603 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200604 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200605 endfor
606 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200607 set shell=/bin/sh noruler
Bram Moolenaar4b2ce122020-11-21 21:41:41 +0100608 unlet $PROMPT_COMMAND
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200609 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200610 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200611 $wincmd w
612 let winid = popup_create(['1111', '2222'], #{
613 \ drag: 1,
614 \ resize: 1,
615 \ border: [],
616 \ line: 3,
617 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200618 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200619 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
620 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200621 func DragitDown()
622 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
623 endfunc
624 func DragitDownLeft()
625 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
626 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200627 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
628 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200629 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
630 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200631 END
632 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200633 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200634 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
635
Bram Moolenaar452143c2020-07-15 17:38:21 +0200636 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200637 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
638
Bram Moolenaar452143c2020-07-15 17:38:21 +0200639 call term_sendkeys(buf, ":call DragitDown()\<CR>")
640 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
641
642 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
643 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
644
Bram Moolenaar35910f22020-07-12 19:24:10 +0200645 " clean up
646 call StopVimInTerminal(buf)
647 call delete('XtestPopupTerm')
648endfunc
649
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200650func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200651 CheckScreendump
652
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200653 let lines =<< trim END
654 call setline(1, range(1, 20))
655 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200656 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200657 \ close: 'button',
658 \ border: [],
659 \ line: 1,
660 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200661 \ })
662 func CloseMsg(id, result)
663 echomsg 'Popup closed with ' .. a:result
664 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200665 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200666 \ close: 'click',
667 \ line: 3,
668 \ col: 15,
669 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200670 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200671 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200672 \ close: 'button',
673 \ line: 5,
674 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200675 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200676 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200677 \ close: 'button',
678 \ padding: [],
679 \ line: 5,
680 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200681 \ })
682 func CloseWithX()
683 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
684 endfunc
685 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
686 func CloseWithClick()
687 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
688 endfunc
689 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200690 func CreateWithMenuFilter()
691 let winid = popup_create('barfoo', #{
692 \ close: 'button',
693 \ filter: 'popup_filter_menu',
694 \ border: [],
695 \ line: 1,
696 \ col: 40,
697 \ })
698 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200699 END
700 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200701 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200702 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
703
704 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
705 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
706
707 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
708 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
709
Bram Moolenaarf6396232019-08-24 19:36:00 +0200710 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
711 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
712
713 " We have to send the actual mouse code, feedkeys() would be caught the
714 " filter.
715 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
716 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
717
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200718 " clean up
719 call StopVimInTerminal(buf)
720 call delete('XtestPopupClose')
721endfunction
722
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200723func Test_popup_menu_wrap()
724 CheckScreendump
725
726 let lines =<< trim END
727 call setline(1, range(1, 20))
728 call popup_create([
729 \ 'one',
730 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
731 \ 'three',
732 \ 'four',
733 \ ], #{
734 \ pos: "botleft",
735 \ border: [],
736 \ padding: [0,1,0,1],
737 \ maxheight: 3,
738 \ cursorline: 1,
739 \ filter: 'popup_filter_menu',
740 \ })
741 END
742 call writefile(lines, 'XtestPopupWrap')
743 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
744 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
745
746 call term_sendkeys(buf, "jj")
747 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
748
749 " clean up
750 call term_sendkeys(buf, "\<Esc>")
751 call StopVimInTerminal(buf)
752 call delete('XtestPopupWrap')
753endfunction
754
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200755func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200756 CheckScreendump
757
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200758 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200759 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200760 hi PopupColor ctermbg=lightgrey
761 let winid = popup_create([
762 \ 'some text',
763 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200764 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200765 \ line: 1,
766 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100767 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200768 \ wrap: 0,
769 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200770 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200771 \ zindex: 90,
772 \ padding: [],
773 \ highlight: 'PopupColor',
774 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200775 call popup_create([
776 \ 'xxxxxxxxx',
777 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200778 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200779 \ line: 3,
780 \ col: 18,
781 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200782 let winidb = popup_create([
783 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200784 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200785 \ line: 7,
786 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100787 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200788 \ wrap: 0,
789 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200790 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200791 \ close: 'button',
792 \ zindex: 90,
793 \ padding: [],
794 \ border: [],
795 \ mask: [[1,2,1,1], [-5,-1,4,4], [7,9,2,3], [3,5,5,5],[-7,-4,5,5]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200796 END
797 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200798 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200799 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
800
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200801 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
802 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200803 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200804 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
805
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200806 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
807 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200808 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200809 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
810
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200811 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
812 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200813 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200814 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
815
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200816 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
817 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200818 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200819 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
820
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200821 " clean up
822 call StopVimInTerminal(buf)
823 call delete('XtestPopupMask')
824endfunc
825
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200826func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200827 CheckScreendump
828 CheckFeature clipboard_working
829
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200830 " create a popup with some text to be selected
831 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200832 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200833 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200834 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200835 \ drag: 1,
836 \ border: [],
837 \ line: 3,
838 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200839 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200840 \ })
841 func Select1()
842 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
843 endfunc
844 map <silent> <F3> :call test_setmouse(4, 15)<CR>
845 map <silent> <F4> :call test_setmouse(6, 23)<CR>
846 END
847 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200848 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200849 call term_sendkeys(buf, ":call Select1()\<CR>")
850 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
851
852 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
853 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200854 " clean the command line, sometimes it still shows a command
855 call term_sendkeys(buf, ":\<esc>")
856
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200857 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
858
859 " clean up
860 call StopVimInTerminal(buf)
861 call delete('XtestPopupSelect')
862endfunc
863
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200864func Test_popup_in_tab()
865 " default popup is local to tab, not visible when in other tab
866 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200867 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200868 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200869 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200870 tabnew
871 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200872 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200873 quit
874 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200875
876 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200877 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200878 " buffer is gone now
879 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200880
881 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200882 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200883 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200884 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200885 tabnew
886 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200887 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200888 quit
889 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200890 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200891
892 " create popup in other tab
893 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200894 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200895 call assert_equal(0, popup_getpos(winid).visible)
896 call assert_equal(1, popup_getoptions(winid).tabpage)
897 quit
898 call assert_equal(1, popup_getpos(winid).visible)
899 call assert_equal(0, popup_getoptions(winid).tabpage)
900 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200901endfunc
902
903func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200904 call assert_equal(0, len(popup_list()))
905
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200906 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200907 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200908 let pos = popup_getpos(winid)
909 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200910 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200911 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200912
913 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200914 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200915 let pos = popup_getpos(winid)
916 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200917 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200918
919 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200920 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200921 let pos = popup_getpos(winid)
922 let around = (&columns - pos.width) / 2
923 call assert_inrange(around - 1, around + 1, pos.col)
924 let around = (&lines - pos.height) / 2
925 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200926 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200927endfunc
928
929func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +0200930 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200931 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200932 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200933 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200934 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
935 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
936 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200937
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200938 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200939 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200940 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200941 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200942 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200943 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200944 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200945 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200946
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200947 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200948 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200949 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200950 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200951 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200952 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200953 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200954 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200955
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200956 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200957 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200958 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200959 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200960 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200961 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200962 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200963 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +0200964 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
965 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200966 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200967 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200968
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200969 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200970 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200971 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200972 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200973 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200974 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100975 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
976 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200977 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
978 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100979 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
980 call popup_clear()
981 call popup_create("text", #{mask: [range(4)]})
982 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200983 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +0200984 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +0200985 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200986 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
987 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200988endfunc
989
Bram Moolenaareea16992019-05-31 17:34:48 +0200990func Test_win_execute_closing_curwin()
991 split
992 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200993 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200994 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +0100995
996 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +0200997 call assert_fails('call win_execute(winid, printf("normal! :\<C-u>call popup_close(%d)\<CR>", winid))', 'E994:')
Bram Moolenaar49540192019-12-11 19:34:54 +0100998 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +0200999endfunc
1000
1001func Test_win_execute_not_allowed()
1002 let winid = popup_create('some text', {})
1003 call assert_fails('call win_execute(winid, "split")', 'E994:')
1004 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1005 call assert_fails('call win_execute(winid, "close")', 'E994:')
1006 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001007 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001008 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1009 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1010 call assert_fails('call win_execute(winid, "next")', 'E994:')
1011 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001012 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001013 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001014 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1015 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1016 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1017 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001018 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1019 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001020 call assert_fails('call win_execute(winid, "help")', 'E994:')
1021 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001022 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1023 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1024 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1025 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001026 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001027endfunc
1028
Bram Moolenaar402502d2019-05-30 22:07:36 +02001029func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001030 CheckScreendump
1031
Bram Moolenaar402502d2019-05-30 22:07:36 +02001032 let lines =<< trim END
1033 call setline(1, range(1, 100))
1034 let winid = popup_create(
1035 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001036 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001037 END
1038 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001039 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001040 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1041
1042 " clean up
1043 call StopVimInTerminal(buf)
1044 call delete('XtestPopup')
1045endfunc
1046
1047func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001048 CheckScreendump
1049
Bram Moolenaar402502d2019-05-30 22:07:36 +02001050 let lines =<< trim END
1051 call setline(1, range(1, 100))
1052 let winid = popup_create(
1053 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001054 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001055 END
1056 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001057 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001058 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1059
1060 " clean up
1061 call StopVimInTerminal(buf)
1062 call delete('XtestPopup')
1063endfunc
1064
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001065func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001066 CheckScreendump
1067
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001068 let lines =<< trim END
1069 set showbreak=>>\
1070 call setline(1, range(1, 20))
1071 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001072 \ 'a long line here that wraps',
1073 \ #{filter: 'popup_filter_yesno',
1074 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001075 END
1076 call writefile(lines, 'XtestPopupShowbreak')
1077 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1078 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1079
1080 " clean up
1081 call term_sendkeys(buf, "y")
1082 call StopVimInTerminal(buf)
1083 call delete('XtestPopupShowbreak')
1084endfunc
1085
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001086func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001087 CheckFeature timers
1088
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001089 topleft vnew
1090 call setline(1, 'hello')
1091
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001092 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001093 \ line: 1,
1094 \ col: 1,
1095 \ minwidth: 20,
1096 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001097 \})
1098 redraw
1099 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1100 call assert_equal('world', line)
1101
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001102 call assert_equal(winid, popup_locate(1, 1))
1103 call assert_equal(winid, popup_locate(1, 20))
1104 call assert_equal(0, popup_locate(1, 21))
1105 call assert_equal(0, popup_locate(2, 1))
1106
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001107 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001108 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001109 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001110 call assert_equal('hello', line)
1111
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001112 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001113 \ line: &lines,
1114 \ col: 10,
1115 \ minwidth: 20,
1116 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001117 \})
1118 redraw
1119 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1120 call assert_match('.*on the command line.*', line)
1121
1122 sleep 700m
1123 redraw
1124 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1125 call assert_notmatch('.*on the command line.*', line)
1126
1127 bwipe!
1128endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001129
1130func Test_popup_hide()
1131 topleft vnew
1132 call setline(1, 'hello')
1133
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001134 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001135 \ line: 1,
1136 \ col: 1,
1137 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001138 \})
1139 redraw
1140 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1141 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001142 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001143 " buffer is still listed and active
1144 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001145
1146 call popup_hide(winid)
1147 redraw
1148 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1149 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001150 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001151 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001152 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001153
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001154 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001155 redraw
1156 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1157 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001158 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001159
1160
1161 call popup_close(winid)
1162 redraw
1163 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1164 call assert_equal('hello', line)
1165
1166 " error is given for existing non-popup window
1167 call assert_fails('call popup_hide(win_getid())', 'E993:')
1168
1169 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001170 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001171 call popup_show(41234234)
1172
1173 bwipe!
1174endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001175
1176func Test_popup_move()
1177 topleft vnew
1178 call setline(1, 'hello')
1179
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001180 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001181 \ line: 1,
1182 \ col: 1,
1183 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001184 \})
1185 redraw
1186 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1187 call assert_equal('world ', line)
1188
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001189 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001190 redraw
1191 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1192 call assert_equal('hello ', line)
1193 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1194 call assert_equal('~world', line)
1195
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001196 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001197 redraw
1198 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1199 call assert_equal('hworld', line)
1200
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001201 call assert_fails('call popup_move(winid, [])', 'E715:')
1202 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1203
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001204 call popup_close(winid)
1205
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001206 call assert_equal(0, popup_move(-1, {}))
1207
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001208 bwipe!
1209endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001210
Bram Moolenaar402502d2019-05-30 22:07:36 +02001211func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001212 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001213 \ line: 2,
1214 \ col: 3,
1215 \ minwidth: 10,
1216 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001217 \})
1218 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001219 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001220 call assert_equal(2, res.line)
1221 call assert_equal(3, res.col)
1222 call assert_equal(10, res.width)
1223 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001224 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001225
1226 call popup_close(winid)
1227endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001228
1229func Test_popup_width_longest()
1230 let tests = [
1231 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1232 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1233 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1234 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1235 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1236 \ ]
1237
1238 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001239 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001240 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001241 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001242 call assert_equal(test[1], position.width)
1243 call popup_close(winid)
1244 endfor
1245endfunc
1246
1247func Test_popup_wraps()
1248 let tests = [
1249 \ ['nowrap', 6, 1],
1250 \ ['a line that wraps once', 12, 2],
1251 \ ['a line that wraps two times', 12, 3],
1252 \ ]
1253 for test in tests
1254 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001255 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001256 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001257 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001258 call assert_equal(test[1], position.width)
1259 call assert_equal(test[2], position.height)
1260
1261 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001262 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001263 endfor
1264endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001265
1266func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001267 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001268 \ line: 2,
1269 \ col: 3,
1270 \ minwidth: 10,
1271 \ minheight: 11,
1272 \ maxwidth: 20,
1273 \ maxheight: 21,
1274 \ zindex: 100,
1275 \ time: 5000,
1276 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001277 \})
1278 redraw
1279 let res = popup_getoptions(winid)
1280 call assert_equal(2, res.line)
1281 call assert_equal(3, res.col)
1282 call assert_equal(10, res.minwidth)
1283 call assert_equal(11, res.minheight)
1284 call assert_equal(20, res.maxwidth)
1285 call assert_equal(21, res.maxheight)
1286 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001287 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001288 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001289 if has('timers')
1290 call assert_equal(5000, res.time)
1291 endif
1292 call popup_close(winid)
1293
1294 let winid = popup_create('hello', {})
1295 redraw
1296 let res = popup_getoptions(winid)
1297 call assert_equal(0, res.line)
1298 call assert_equal(0, res.col)
1299 call assert_equal(0, res.minwidth)
1300 call assert_equal(0, res.minheight)
1301 call assert_equal(0, res.maxwidth)
1302 call assert_equal(0, res.maxheight)
1303 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001304 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001305 if has('timers')
1306 call assert_equal(0, res.time)
1307 endif
1308 call popup_close(winid)
1309 call assert_equal({}, popup_getoptions(winid))
1310endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001311
1312func Test_popup_option_values()
1313 new
1314 " window-local
1315 setlocal number
1316 setlocal nowrap
1317 " buffer-local
1318 setlocal omnifunc=Something
1319 " global/buffer-local
1320 setlocal path=/there
1321 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001322 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001323
1324 let winid = popup_create('hello', {})
1325 call assert_equal(0, getwinvar(winid, '&number'))
1326 call assert_equal(1, getwinvar(winid, '&wrap'))
1327 call assert_equal('', getwinvar(winid, '&omnifunc'))
1328 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001329 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1330
1331 " 'scrolloff' is reset to zero
1332 call assert_equal(5, &scrolloff)
1333 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001334
1335 call popup_close(winid)
1336 bwipe
1337endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001338
1339func Test_popup_atcursor()
1340 topleft vnew
1341 call setline(1, [
1342 \ 'xxxxxxxxxxxxxxxxx',
1343 \ 'xxxxxxxxxxxxxxxxx',
1344 \ 'xxxxxxxxxxxxxxxxx',
1345 \])
1346
1347 call cursor(2, 2)
1348 redraw
1349 let winid = popup_atcursor('vim', {})
1350 redraw
1351 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1352 call assert_equal('xvimxxxxxxxxxxxxx', line)
1353 call popup_close(winid)
1354
1355 call cursor(3, 4)
1356 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001357 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001358 redraw
1359 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1360 call assert_equal('xxxvimxxxxxxxxxxx', line)
1361 call popup_close(winid)
1362
1363 call cursor(1, 1)
1364 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001365 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001366 \ line: 'cursor+2',
1367 \ col: 'cursor+1',
1368 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001369 redraw
1370 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1371 call assert_equal('xvimxxxxxxxxxxxxx', line)
1372 call popup_close(winid)
1373
1374 call cursor(3, 3)
1375 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001376 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001377 \ line: 'cursor-2',
1378 \ col: 'cursor-1',
1379 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001380 redraw
1381 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1382 call assert_equal('xvimxxxxxxxxxxxxx', line)
1383 call popup_close(winid)
1384
Bram Moolenaar402502d2019-05-30 22:07:36 +02001385 " just enough room above
1386 call cursor(3, 3)
1387 redraw
1388 let winid = popup_atcursor(['vim', 'is great'], {})
1389 redraw
1390 let pos = popup_getpos(winid)
1391 call assert_equal(1, pos.line)
1392 call popup_close(winid)
1393
1394 " not enough room above, popup goes below the cursor
1395 call cursor(3, 3)
1396 redraw
1397 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1398 redraw
1399 let pos = popup_getpos(winid)
1400 call assert_equal(4, pos.line)
1401 call popup_close(winid)
1402
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001403 " cursor in first line, popup in line 2
1404 call cursor(1, 1)
1405 redraw
1406 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1407 redraw
1408 let pos = popup_getpos(winid)
1409 call assert_equal(2, pos.line)
1410 call popup_close(winid)
1411
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001412 bwipe!
1413endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001414
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001415func Test_popup_atcursor_pos()
1416 CheckScreendump
1417
1418 let lines =<< trim END
1419 call setline(1, repeat([repeat('-', 60)], 15))
1420 set so=0
1421
1422 normal 9G3|r#
1423 let winid1 = popup_atcursor(['first', 'second'], #{
1424 \ moved: [0, 0, 0],
1425 \ })
1426 normal 9G21|r&
1427 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1428 \ pos: 'botright',
1429 \ moved: [0, 0, 0],
1430 \ })
1431 normal 3G27|r%
1432 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1433 \ pos: 'topleft',
1434 \ moved: [0, 0, 0],
1435 \ })
1436 normal 3G45|r@
1437 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1438 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001439 \ moved: range(3),
1440 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001441 \ })
1442 END
1443 call writefile(lines, 'XtestPopupAtcursorPos')
1444 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1445 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1446
1447 " clean up
1448 call StopVimInTerminal(buf)
1449 call delete('XtestPopupAtcursorPos')
1450endfunc
1451
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001452func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001453 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001454 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001455
1456 let lines =<< trim END
1457 call setline(1, range(1, 20))
1458 call setline(5, 'here is some text to hover over')
1459 set balloonevalterm
1460 set balloonexpr=BalloonExpr()
1461 set balloondelay=100
1462 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001463 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001464 return ''
1465 endfunc
1466 func Hover()
1467 call test_setmouse(5, 15)
1468 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1469 sleep 100m
1470 endfunc
1471 func MoveOntoPopup()
1472 call test_setmouse(4, 17)
1473 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1474 endfunc
1475 func MoveAway()
1476 call test_setmouse(5, 13)
1477 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1478 endfunc
1479 END
1480 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001481 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001482 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001483 call term_sendkeys(buf, 'j')
1484 call term_sendkeys(buf, ":call Hover()\<CR>")
1485 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1486
1487 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1488 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1489
1490 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1491 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1492
1493 " clean up
1494 call StopVimInTerminal(buf)
1495 call delete('XtestPopupBeval')
1496endfunc
1497
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001498func Test_popup_filter()
1499 new
1500 call setline(1, 'some text')
1501
1502 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001503 if a:c == 'e' || a:c == "\<F9>"
1504 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001505 return 1
1506 endif
1507 if a:c == '0'
1508 let g:ignored = '0'
1509 return 0
1510 endif
1511 if a:c == 'x'
1512 call popup_close(a:winid)
1513 return 1
1514 endif
1515 return 0
1516 endfunc
1517
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001518 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001519 redraw
1520
1521 " e is consumed by the filter
1522 call feedkeys('e', 'xt')
1523 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001524 call feedkeys("\<F9>", 'xt')
1525 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001526
1527 " 0 is ignored by the filter
1528 normal $
1529 call assert_equal(9, getcurpos()[2])
1530 call feedkeys('0', 'xt')
1531 call assert_equal('0', g:ignored)
1532 call assert_equal(1, getcurpos()[2])
1533
1534 " x closes the popup
1535 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001536 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001537 call assert_equal(-1, winbufnr(winid))
1538
1539 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001540 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001541endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001542
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001543" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001544func Test_popup_filter_normal_cmd()
1545 CheckScreendump
1546
1547 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001548 let text = range(1, 20)->map({_, v -> string(v)})
1549 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1550 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001551 END
1552 call writefile(lines, 'XtestPopupNormal')
1553 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1554 call TermWait(buf, 100)
1555 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1556
1557 call StopVimInTerminal(buf)
1558 call delete('XtestPopupNormal')
1559endfunc
1560
Bram Moolenaar10476522020-09-24 22:57:31 +02001561" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001562func Test_popup_filter_win_execute()
1563 CheckScreendump
1564
1565 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001566 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1567 let g:id = popup_create(lines, #{
1568 \ minheight: &lines - 5,
1569 \ maxheight: &lines - 5,
1570 \ cursorline: 1,
1571 \ })
1572 redraw
1573 END
1574 call writefile(lines, 'XtestPopupWinExecute')
1575 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1576
1577 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1578 call term_sendkeys(buf, ":\<CR>")
1579
1580 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1581
1582 call StopVimInTerminal(buf)
1583 call delete('XtestPopupWinExecute')
1584endfunc
1585
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001586func Test_popup_set_firstline()
1587 CheckScreendump
1588
1589 let lines =<< trim END
1590 let lines = range(1, 50)->map({_, v -> string(v)})
1591 let g:id = popup_create(lines, #{
1592 \ minwidth: 20,
1593 \ maxwidth: 20,
1594 \ minheight: &lines - 5,
1595 \ maxheight: &lines - 5,
1596 \ cursorline: 1,
1597 \ })
1598 call popup_setoptions(g:id, #{firstline: 10})
1599 redraw
1600 END
1601 call writefile(lines, 'XtestPopupWinSetFirstline')
1602 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1603
1604 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1605
1606 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1607 call term_sendkeys(buf, ":\<CR>")
1608 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1609
1610 call StopVimInTerminal(buf)
1611 call delete('XtestPopupWinSetFirstline')
1612endfunc
1613
Bram Moolenaar10476522020-09-24 22:57:31 +02001614" this tests that we don't get stuck with an error in "win_execute()"
1615func Test_popup_filter_win_execute_error()
1616 CheckScreendump
1617
1618 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001619 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1620 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1621 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001622 call writefile(lines, 'XtestPopupWinExecuteError')
1623 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001624
1625 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1626 call term_sendkeys(buf, "\<CR>")
1627 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1628 call term_sendkeys(buf, "\<CR>")
1629 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1630 call term_sendkeys(buf, "\<CR>")
1631 call term_sendkeys(buf, "\<CR>")
1632 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1633
1634 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001635 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001636endfunc
1637
Bram Moolenaara42d9452019-06-15 21:46:30 +02001638func ShowDialog(key, result)
1639 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001640 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001641 \ filter: 'popup_filter_yesno',
1642 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001643 \ })
1644 redraw
1645 call feedkeys(a:key, "xt")
1646 call assert_equal(winid, s:cb_winid)
1647 call assert_equal(a:result, s:cb_res)
1648endfunc
1649
1650func Test_popup_dialog()
1651 func QuitCallback(id, res)
1652 let s:cb_winid = a:id
1653 let s:cb_res = a:res
1654 endfunc
1655
1656 let winid = ShowDialog("y", 1)
1657 let winid = ShowDialog("Y", 1)
1658 let winid = ShowDialog("n", 0)
1659 let winid = ShowDialog("N", 0)
1660 let winid = ShowDialog("x", 0)
1661 let winid = ShowDialog("X", 0)
1662 let winid = ShowDialog("\<Esc>", 0)
1663 let winid = ShowDialog("\<C-C>", -1)
1664
1665 delfunc QuitCallback
1666endfunc
1667
Bram Moolenaara730e552019-06-16 19:05:31 +02001668func ShowMenu(key, result)
1669 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001670 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001671 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001672 \ })
1673 redraw
1674 call feedkeys(a:key, "xt")
1675 call assert_equal(winid, s:cb_winid)
1676 call assert_equal(a:result, s:cb_res)
1677endfunc
1678
1679func Test_popup_menu()
1680 func QuitCallback(id, res)
1681 let s:cb_winid = a:id
1682 let s:cb_res = a:res
1683 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001684 " mapping won't be used in popup
1685 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001686
1687 let winid = ShowMenu(" ", 1)
1688 let winid = ShowMenu("j \<CR>", 2)
1689 let winid = ShowMenu("JjK \<CR>", 2)
1690 let winid = ShowMenu("jjjjjj ", 3)
1691 let winid = ShowMenu("kkk ", 1)
1692 let winid = ShowMenu("x", -1)
1693 let winid = ShowMenu("X", -1)
1694 let winid = ShowMenu("\<Esc>", -1)
1695 let winid = ShowMenu("\<C-C>", -1)
1696
1697 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001698 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001699endfunc
1700
1701func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001702 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001703
1704 let lines =<< trim END
1705 call setline(1, range(1, 20))
1706 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001707 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001708 func MenuDone(id, res)
1709 echomsg "selected " .. a:res
1710 endfunc
1711 END
1712 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001713 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001714 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1715
1716 call term_sendkeys(buf, "jj")
1717 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1718
1719 call term_sendkeys(buf, " ")
1720 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1721
1722 " clean up
1723 call StopVimInTerminal(buf)
1724 call delete('XtestPopupMenu')
1725endfunc
1726
Bram Moolenaarf914a332019-07-20 15:09:56 +02001727func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001728 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001729
1730 let lines =<< trim END
1731 call setline(1, range(1, 20))
1732 hi PopupSelected ctermbg=green
1733 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1734 func MenuDone(id, res)
1735 echomsg "selected " .. a:res
1736 endfunc
1737 END
1738 call writefile(lines, 'XtestPopupNarrowMenu')
1739 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1740 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1741
1742 " clean up
1743 call term_sendkeys(buf, "x")
1744 call StopVimInTerminal(buf)
1745 call delete('XtestPopupNarrowMenu')
1746endfunc
1747
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001748func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001749 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001750
1751 " Create a popup without title or border, a line of padding will be added to
1752 " put the title on.
1753 let lines =<< trim END
1754 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001755 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001756 END
1757 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001758 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001759 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1760
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001761 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1762 call term_sendkeys(buf, ":\<CR>")
1763 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1764
1765 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1766 call term_sendkeys(buf, ":\<CR>")
1767 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1768
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001769 " clean up
1770 call StopVimInTerminal(buf)
1771 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001772
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001773 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001774 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001775 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001776 call assert_equal('Another Title', popup_getoptions(winid).title)
1777
1778 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001779endfunc
1780
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001781func Test_popup_close_callback()
1782 func PopupDone(id, result)
1783 let g:result = a:result
1784 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001785 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001786 redraw
1787 call popup_close(winid, 'done')
1788 call assert_equal('done', g:result)
1789endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001790
1791func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001792 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001793 redraw
1794 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001795 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001796 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001797 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001798
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001799 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001800 redraw
1801 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001802 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001803 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001804 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001805endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001806
1807func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001808 CheckScreendump
1809
Bram Moolenaar988c4332019-06-02 14:12:11 +02001810 " +-----------------------------+
1811 " | | |
1812 " | | |
1813 " | | |
1814 " | line1 |
1815 " |------------line2------------|
1816 " | line3 |
1817 " | line4 |
1818 " | |
1819 " | |
1820 " +-----------------------------+
1821 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001822 split
1823 vsplit
1824 let info_window1 = getwininfo()[0]
1825 let line = info_window1['height']
1826 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001827 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001828 \ line : line,
1829 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001830 \ })
1831 END
1832 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001833 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001834 call term_sendkeys(buf, "\<C-W>w")
1835 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1836
1837 " clean up
1838 call StopVimInTerminal(buf)
1839 call delete('XtestPopupBehind')
1840endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001841
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001842func s:VerifyPosition(p, msg, line, col, width, height)
1843 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1844 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1845 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1846 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001847endfunc
1848
1849func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001850 " Anything placed past the last cell on the right of the screen is moved to
1851 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001852 "
1853 " When wrapping is disabled, we also shift to the left to display on the
1854 " screen, unless fixed is set.
1855
1856 " Entries for cases which don't vary based on wrapping.
1857 " Format is per tests described below
1858 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001859 \ ['a', 5, &columns, 5, &columns, 1, 1],
1860 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1861 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001862 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001863 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001864
1865 " these test groups are dicts with:
1866 " - comment: something to identify the group of tests by
1867 " - options: dict of options to merge with the row/col in tests
1868 " - tests: list of cases. Each one is a list with elements:
1869 " - text
1870 " - row
1871 " - col
1872 " - expected row
1873 " - expected col
1874 " - expected width
1875 " - expected height
1876 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001877 \ #{
1878 \ comment: 'left-aligned with wrapping',
1879 \ options: #{
1880 \ wrap: 1,
1881 \ pos: 'botleft',
1882 \ },
1883 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001884 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1885 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1886 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1887 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1888 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1889 \
1890 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1891 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1892 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1893 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1894 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1895 \
1896 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1897 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1898 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001899 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1900 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001901 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001902 \ ],
1903 \ },
1904 \ #{
1905 \ comment: 'left aligned without wrapping',
1906 \ options: #{
1907 \ wrap: 0,
1908 \ pos: 'botleft',
1909 \ },
1910 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001911 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1912 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1913 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1914 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1915 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1916 \
1917 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1918 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1919 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1920 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1921 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1922 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001923 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1924 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1925 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1926 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1927 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1928 \ ],
1929 \ },
1930 \ #{
1931 \ comment: 'left aligned with fixed position',
1932 \ options: #{
1933 \ wrap: 0,
1934 \ fixed: 1,
1935 \ pos: 'botleft',
1936 \ },
1937 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001938 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1939 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1940 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1941 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1942 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1943 \
1944 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
1945 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
1946 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1947 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1948 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1949 \
1950 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
1951 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
1952 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001953 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1954 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1955 \ ],
1956 \ },
1957 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001958
1959 for test_group in tests
1960 for test in test_group.tests
1961 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001962 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001963 \ line: line,
1964 \ col: col,
1965 \ }
1966 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001967
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001968 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001969
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001970 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001971 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
1972 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001973 endfor
1974 endfor
1975
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001976 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001977 %bwipe!
1978endfunc
1979
Bram Moolenaar3397f742019-06-02 18:40:06 +02001980func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001981 " width of screen
1982 let X = join(map(range(&columns), {->'X'}), '')
1983
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001984 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
1985 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001986
1987 redraw
1988 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
1989 call assert_equal(X, line)
1990
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001991 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001992 redraw
1993
1994 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001995 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
1996 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001997
1998 redraw
1999 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2000 call assert_equal(X, line)
2001
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002002 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002003 redraw
2004
2005 " Extend so > window width
2006 let X .= 'x'
2007
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002008 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2009 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002010
2011 redraw
2012 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2013 call assert_equal(X[ : -2 ], line)
2014
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002015 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002016 redraw
2017
2018 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002019 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2020 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002021
2022 redraw
2023 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2024 call assert_equal(X[ : -2 ], line)
2025
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002026 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002027 redraw
2028
2029 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002030 let p = popup_create(X,
2031 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2032 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002033
2034 redraw
2035 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2036 let e_line = ' ' . X[ 1 : -2 ]
2037 call assert_equal(e_line, line)
2038
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002039 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002040 redraw
2041
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002042 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002043 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002044endfunc
2045
2046func Test_popup_moved()
2047 new
2048 call test_override('char_avail', 1)
2049 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2050
2051 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002052 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002053 redraw
2054 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002055 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002056 " trigger the check for last_cursormoved by going into insert mode
2057 call feedkeys("li\<Esc>", 'xt')
2058 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002059 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002060
2061 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002062 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002063 redraw
2064 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002065 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002066 call feedkeys("hi\<Esc>", 'xt')
2067 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002068 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002069
2070 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002071 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002072 redraw
2073 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002074 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002075 call feedkeys("li\<Esc>", 'xt')
2076 call assert_equal(1, popup_getpos(winid).visible)
2077 call feedkeys("ei\<Esc>", 'xt')
2078 call assert_equal(1, popup_getpos(winid).visible)
2079 call feedkeys("eli\<Esc>", 'xt')
2080 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002081 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002082
Bram Moolenaar17627312019-06-02 19:53:44 +02002083 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002084 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002085 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002086 redraw
2087 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002088 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002089 call feedkeys("eli\<Esc>", 'xt')
2090 call assert_equal(1, popup_getpos(winid).visible)
2091 call feedkeys("wi\<Esc>", 'xt')
2092 call assert_equal(1, popup_getpos(winid).visible)
2093 call feedkeys("Eli\<Esc>", 'xt')
2094 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002095 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002096
2097 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002098 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002099 redraw
2100 call assert_equal(1, popup_getpos(winid).visible)
2101 call feedkeys("eli\<Esc>", 'xt')
2102 call feedkeys("ei\<Esc>", 'xt')
2103 call assert_equal(1, popup_getpos(winid).visible)
2104 call feedkeys("eli\<Esc>", 'xt')
2105 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002106 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002107
2108 bwipe!
2109 call test_override('ALL', 0)
2110endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002111
2112func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002113 CheckFeature timers
2114 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002115
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002116 let lines =<< trim END
2117 call setline(1, range(1, 20))
2118 hi Notification ctermbg=lightblue
2119 call popup_notification('first notification', {})
2120 END
2121 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002122 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002123 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2124
2125 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002126 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2127 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002128 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2129
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002130 " clean up
2131 call StopVimInTerminal(buf)
2132 call delete('XtestNotifications')
2133endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002134
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002135func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002136 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002137
2138 let lines =<< trim END
2139 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002140 hi ScrollThumb ctermbg=blue
2141 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002142 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002143 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002144 \ minwidth: 8,
2145 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002146 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002147 func ScrollUp()
2148 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2149 endfunc
2150 func ScrollDown()
2151 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2152 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002153 func ClickTop()
2154 call feedkeys("\<F4>\<LeftMouse>", "xt")
2155 endfunc
2156 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002157 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002158 call feedkeys("\<F5>\<LeftMouse>", "xt")
2159 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002160 func Popup_filter(winid, key)
2161 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002162 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002163 let line = popup_getoptions(a:winid).firstline
2164 let nlines = line('$', a:winid)
2165 let newline = line < nlines ? (line + 1) : nlines
2166 call popup_setoptions(a:winid, #{firstline: newline})
2167 return v:true
2168 elseif a:key == 'x'
2169 call popup_close(a:winid)
2170 return v:true
2171 endif
2172 endfunc
2173
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002174 def CreatePopup(text: list<string>)
Bram Moolenaare0de1712020-12-02 17:36:54 +01002175 popup_create(text, {
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002176 \ minwidth: 30,
2177 \ maxwidth: 30,
2178 \ minheight: 4,
2179 \ maxheight: 4,
2180 \ firstline: 1,
2181 \ lastline: 4,
2182 \ wrap: true,
2183 \ scrollbar: true,
2184 \ mapping: false,
2185 \ filter: Popup_filter,
2186 \ })
2187 enddef
2188
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002189 func PopupScroll()
2190 call popup_clear()
2191 let text =<< trim END
2192 1
2193 2
2194 3
2195 4
2196 long line long line long line long line long line long line
2197 long line long line long line long line long line long line
2198 long line long line long line long line long line long line
2199 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002200 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002201 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002202 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002203 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2204 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002205 END
2206 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002207 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002208 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2209
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002210 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002211 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002212 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2213
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002214 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002215 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002216 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2217
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002218 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002219 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002220 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2221
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002222 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002223 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002224 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2225 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2226
2227 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2228 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2229
2230 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002231 " wait a bit, otherwise it fails sometimes (double click recognized?)
2232 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002233 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2234 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2235
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002236 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2237 sleep 100m
2238 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2239 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2240
2241 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2242 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2243
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002244 " remove the minwidth and maxheight
2245 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002246 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002247 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2248
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002249 " check size with non-wrapping lines
2250 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2251 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2252
2253 " check size with wrapping lines
2254 call term_sendkeys(buf, "j")
2255 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002256
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002257 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002258 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002259 call StopVimInTerminal(buf)
2260 call delete('XtestPopupScroll')
2261endfunc
2262
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002263func Test_popup_too_high_scrollbar()
2264 CheckScreendump
2265
2266 let lines =<< trim END
2267 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2268 set scrolloff=0
2269 func ShowPopup()
2270 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2271 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2272 \ minwidth: 8,
2273 \ border: [],
2274 \ })
2275 endfunc
2276 normal 3G$
2277 call ShowPopup()
2278 END
2279 call writefile(lines, 'XtestPopupToohigh')
2280 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2281 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2282
2283 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2284 call term_sendkeys(buf, "8G$")
2285 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2286 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2287
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002288 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2289 call term_sendkeys(buf, "gg$")
2290 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2291 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2292
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002293 " clean up
2294 call StopVimInTerminal(buf)
2295 call delete('XtestPopupToohigh')
2296endfunc
2297
Bram Moolenaar437a7462019-07-05 20:17:22 +02002298func Test_popup_fitting_scrollbar()
2299 " this was causing a crash, divide by zero
2300 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002301 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002302 \ scrollbar: 1,
2303 \ maxwidth: 10,
2304 \ maxheight: 5,
2305 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002306 redraw
2307 call popup_clear()
2308endfunc
2309
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002310func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002311 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002312
2313 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002314 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002315 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002316 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002317 END
2318
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002319 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002320 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002321 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2322
2323 " Setting to empty string clears it
2324 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2325 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2326
2327 " Setting a list
2328 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2329 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2330
2331 " Shrinking with a list
2332 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2333 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2334
2335 " Growing with a list
2336 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2337 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2338
2339 " Empty list clears
2340 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2341 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2342
2343 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002344 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002345 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2346
Bram Moolenaarb0992022020-01-30 14:55:42 +01002347 " range() (doesn't work)
2348 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2349 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2350
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002351 " clean up
2352 call StopVimInTerminal(buf)
2353 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002354endfunc
2355
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002356func Test_popup_settext_getline()
2357 let id = popup_create('', #{ tabpage: 0 })
2358 call popup_settext(id, ['a','b'])
2359 call assert_equal(2, line('$', id)) " OK :)
2360 call popup_close(id)
2361
2362 let id = popup_create('', #{ tabpage: -1 })
2363 call popup_settext(id, ['a','b'])
2364 call assert_equal(2, line('$', id)) " Fails :(
2365 call popup_close(id)
2366endfunc
2367
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002368func Test_popup_settext_null()
2369 let id = popup_create('', #{ tabpage: 0 })
2370 call popup_settext(id, test_null_list())
2371 call popup_close(id)
2372
2373 let id = popup_create('', #{ tabpage: 0 })
2374 call popup_settext(id, test_null_string())
2375 call popup_close(id)
2376endfunc
2377
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002378func Test_popup_hidden()
2379 new
2380
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002381 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002382 redraw
2383 call assert_equal(0, popup_getpos(winid).visible)
2384 call popup_close(winid)
2385
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002386 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002387 redraw
2388 call assert_equal(0, popup_getpos(winid).visible)
2389 call popup_close(winid)
2390
2391 func QuitCallback(id, res)
2392 let s:cb_winid = a:id
2393 let s:cb_res = a:res
2394 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002395 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002396 \ filter: 'popup_filter_yesno',
2397 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002398 \ })
2399 redraw
2400 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002401 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2402 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002403 exe "normal anot used by filter\<Esc>"
2404 call assert_equal('not used by filter', getline(1))
2405
2406 call popup_show(winid)
2407 call feedkeys('y', "xt")
2408 call assert_equal(1, s:cb_res)
2409
2410 bwipe!
2411 delfunc QuitCallback
2412endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002413
2414" Test options not checked elsewhere
2415func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002416 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002417 let options = popup_getoptions(winid)
2418 call assert_equal(1, options.wrap)
2419 call assert_equal(0, options.drag)
2420 call assert_equal('Beautiful', options.highlight)
2421
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002422 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002423 let options = popup_getoptions(winid)
2424 call assert_equal(0, options.wrap)
2425 call assert_equal(1, options.drag)
2426 call assert_equal('Another', options.highlight)
2427
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002428 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2429 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2430
Bram Moolenaarae943152019-06-16 22:54:14 +02002431 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002432 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002433endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002434
2435func Test_popupwin_garbage_collect()
2436 func MyPopupFilter(x, winid, c)
2437 " NOP
2438 endfunc
2439
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002440 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002441 call test_garbagecollect_now()
2442 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002443 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002444 call feedkeys('j', 'xt')
2445 call assert_true(v:true)
2446
2447 call popup_close(winid)
2448 delfunc MyPopupFilter
2449endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002450
Bram Moolenaar581ba392019-09-03 22:08:33 +02002451func Test_popupwin_filter_mode()
2452 func MyPopupFilter(winid, c)
2453 let s:typed = a:c
2454 if a:c == ':' || a:c == "\r" || a:c == 'v'
2455 " can start cmdline mode, get out, and start/stop Visual mode
2456 return 0
2457 endif
2458 return 1
2459 endfunc
2460
2461 " Normal, Visual and Insert mode
2462 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2463 redraw
2464 call feedkeys('x', 'xt')
2465 call assert_equal('x', s:typed)
2466
2467 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2468 call assert_equal(':', s:typed)
2469 call assert_equal('foo', g:foo)
2470
2471 let @x = 'something'
2472 call feedkeys('v$"xy', 'xt')
2473 call assert_equal('y', s:typed)
2474 call assert_equal('something', @x) " yank command is filtered out
2475 call feedkeys('v', 'xt') " end Visual mode
2476
2477 call popup_close(winid)
2478
2479 " only Normal mode
2480 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2481 redraw
2482 call feedkeys('x', 'xt')
2483 call assert_equal('x', s:typed)
2484
2485 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2486 call assert_equal(':', s:typed)
2487 call assert_equal('foo', g:foo)
2488
2489 let @x = 'something'
2490 call feedkeys('v$"xy', 'xt')
2491 call assert_equal('v', s:typed)
2492 call assert_notequal('something', @x)
2493
2494 call popup_close(winid)
2495
2496 " default: all modes
2497 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2498 redraw
2499 call feedkeys('x', 'xt')
2500 call assert_equal('x', s:typed)
2501
2502 let g:foo = 'bar'
2503 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2504 call assert_equal("\r", s:typed)
2505 call assert_equal('bar', g:foo)
2506
2507 let @x = 'something'
2508 call feedkeys('v$"xy', 'xt')
2509 call assert_equal('y', s:typed)
2510 call assert_equal('something', @x) " yank command is filtered out
2511 call feedkeys('v', 'xt') " end Visual mode
2512
2513 call popup_close(winid)
2514 delfunc MyPopupFilter
2515endfunc
2516
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002517func Test_popupwin_filter_mouse()
2518 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002519 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002520 return 0
2521 endfunc
2522
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002523 call setline(1, ['.'->repeat(25)]->repeat(10))
2524 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2525 \ line: 2,
2526 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002527 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002528 \ padding: [],
2529 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002530 \ filter: 'MyPopupFilter',
2531 \ })
2532 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002533 " 123456789012345678901
2534 " 1 .....................
2535 " 2 ...+--------------+..
2536 " 3 ...| |..
2537 " 4 ...| short |..
2538 " 5 ...| long line th |..
2539 " 6 ...| at will wrap |..
2540 " 7 ...| other |..
2541 " 8 ...| |..
2542 " 9 ...+--------------+..
2543 " 10 .....................
2544 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002545
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002546 func AddItemOutsidePopup(tests, row, col)
2547 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2548 \ screenrow: a:row, screencol: a:col,
2549 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2550 \ line: a:row, column: a:col,
2551 \ }})
2552 endfunc
2553 func AddItemInPopupBorder(tests, winid, row, col)
2554 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2555 \ screenrow: a:row, screencol: a:col,
2556 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2557 \ line: 0, column: 0,
2558 \ }})
2559 endfunc
2560 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2561 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2562 \ screenrow: a:row, screencol: a:col,
2563 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2564 \ line: a:textline, column: a:textcol,
2565 \ }})
2566 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002567
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002568 " above and below popup
2569 for c in range(1, 21)
2570 call AddItemOutsidePopup(tests, 1, c)
2571 call AddItemOutsidePopup(tests, 10, c)
2572 endfor
2573 " left and right of popup
2574 for r in range(1, 10)
2575 call AddItemOutsidePopup(tests, r, 3)
2576 call AddItemOutsidePopup(tests, r, 20)
2577 endfor
2578 " top and bottom in popup
2579 for c in range(4, 19)
2580 call AddItemInPopupBorder(tests, winid, 2, c)
2581 call AddItemInPopupBorder(tests, winid, 3, c)
2582 call AddItemInPopupBorder(tests, winid, 8, c)
2583 call AddItemInPopupBorder(tests, winid, 9, c)
2584 endfor
2585 " left and right margin in popup
2586 for r in range(2, 9)
2587 call AddItemInPopupBorder(tests, winid, r, 4)
2588 call AddItemInPopupBorder(tests, winid, r, 5)
2589 call AddItemInPopupBorder(tests, winid, r, 18)
2590 call AddItemInPopupBorder(tests, winid, r, 19)
2591 endfor
2592 " text "short"
2593 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2594 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2595 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2596 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2597 " text "long line th"
2598 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2599 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2600 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2601 " text "at will wrap"
2602 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2603 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2604 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2605 " text "other"
2606 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2607 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2608 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2609 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002610
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002611 for item in tests
2612 call test_setmouse(item.clickrow, item.clickcol)
2613 call feedkeys("\<LeftMouse>", 'xt')
2614 call assert_equal(item.result, g:got_mousepos)
2615 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002616
2617 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002618 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002619 delfunc MyPopupFilter
2620endfunc
2621
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002622func Test_popupwin_with_buffer()
2623 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2624 let buf = bufadd('XsomeFile')
2625 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002626
2627 setlocal number
2628 call setbufvar(buf, "&wrapmargin", 13)
2629
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002630 let winid = popup_create(buf, {})
2631 call assert_notequal(0, winid)
2632 let pos = popup_getpos(winid)
2633 call assert_equal(2, pos.height)
2634 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002635
2636 " window-local option is set to default, buffer-local is not
2637 call assert_equal(0, getwinvar(winid, '&number'))
2638 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2639
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002640 call popup_close(winid)
2641 call assert_equal({}, popup_getpos(winid))
2642 call assert_equal(1, bufloaded(buf))
2643 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002644 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002645
2646 edit test_popupwin.vim
2647 let winid = popup_create(bufnr(''), {})
2648 redraw
2649 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002650 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002651endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002652
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002653func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002654 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002655 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002656 " Starting a terminal to run a shell in is considered flaky.
2657 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002658
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002659 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002660
2661 " open help window to test that :help below fails
2662 help
2663
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002664 let termbuf = term_start(&shell, #{hidden: 1})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002665 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
2666 " Wait for shell to start and show a prompt
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002667 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002668 sleep 20m
2669
2670 " When typing a character, the cursor is after it.
2671 call feedkeys("x", 'xt')
2672 sleep 10m
2673 redraw
2674 call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))})
2675 call feedkeys("\<BS>", 'xt')
2676
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002677 " Check this doesn't crash
2678 call assert_equal(winnr(), winnr('j'))
2679 call assert_equal(winnr(), winnr('k'))
2680 call assert_equal(winnr(), winnr('h'))
2681 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002682
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002683 " Cannot quit while job is running
2684 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002685
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002686 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002687 call feedkeys("xxx\<C-W>N", 'xt')
2688 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2689 call feedkeys("a\<C-U>", 'xt')
2690
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002691 " Cannot escape from terminal window
2692 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002693 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002694
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002695 " Cannot open a second one.
2696 let termbuf2 = term_start(&shell, #{hidden: 1})
2697 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2698 call term_sendkeys(termbuf2, "exit\<CR>")
2699
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002700 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002701 call feedkeys("exit\<CR>", 'xt')
2702 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002703 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002704
Bram Moolenaar349f6092020-10-06 20:46:49 +02002705 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002706 call feedkeys(":quit\<CR>", 'xt')
2707 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002708endfunc
2709
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002710func Test_popupwin_close_prevwin()
2711 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002712 call Popupwin_close_prevwin()
2713endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002714
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002715def Popupwin_close_prevwin()
2716 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002717 split
2718 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002719 assert_equal(2, winnr())
Bram Moolenaare0de1712020-12-02 17:36:54 +01002720 var buf = term_start(&shell, {hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002721 popup_create(buf, {})
2722 TermWait(buf, 100)
2723 popup_clear(true)
2724 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002725
2726 quit
2727 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002728enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002729
Bram Moolenaar934470e2019-09-01 23:27:05 +02002730func Test_popupwin_with_buffer_and_filter()
2731 new Xwithfilter
2732 call setline(1, range(100))
2733 let bufnr = bufnr()
2734 hide
2735
2736 func BufferFilter(win, key)
2737 if a:key == 'G'
2738 " recursive use of "G" does not cause problems.
2739 call win_execute(a:win, 'normal! G')
2740 return 1
2741 endif
2742 return 0
2743 endfunc
2744
2745 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2746 call assert_equal(1, popup_getpos(winid).firstline)
2747 redraw
2748 call feedkeys("G", 'xt')
2749 call assert_equal(99, popup_getpos(winid).firstline)
2750
2751 call popup_close(winid)
2752 exe 'bwipe! ' .. bufnr
2753endfunc
2754
Bram Moolenaare296e312019-07-03 23:20:18 +02002755func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002756 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002757 \ maxwidth: 40,
2758 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002759 \ })
2760 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002761 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002762 redraw
2763 call assert_equal(19, popup_getpos(winid).width)
2764 endfor
2765 call popup_clear()
2766endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002767
2768func Test_popupwin_buf_close()
2769 let buf = bufadd('Xtestbuf')
2770 call bufload(buf)
2771 call setbufline(buf, 1, ['just', 'some', 'lines'])
2772 let winid = popup_create(buf, {})
2773 redraw
2774 call assert_equal(3, popup_getpos(winid).height)
2775 let bufinfo = getbufinfo(buf)[0]
2776 call assert_equal(1, bufinfo.changed)
2777 call assert_equal(0, bufinfo.hidden)
2778 call assert_equal(0, bufinfo.listed)
2779 call assert_equal(1, bufinfo.loaded)
2780 call assert_equal([], bufinfo.windows)
2781 call assert_equal([winid], bufinfo.popups)
2782
2783 call popup_close(winid)
2784 call assert_equal({}, popup_getpos(winid))
2785 let bufinfo = getbufinfo(buf)[0]
2786 call assert_equal(1, bufinfo.changed)
2787 call assert_equal(1, bufinfo.hidden)
2788 call assert_equal(0, bufinfo.listed)
2789 call assert_equal(1, bufinfo.loaded)
2790 call assert_equal([], bufinfo.windows)
2791 call assert_equal([], bufinfo.popups)
2792 exe 'bwipe! ' .. buf
2793endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002794
2795func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002796 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002797
2798 let lines =<< trim END
2799 call setline(1, range(1, 10))
2800 hi ScrollThumb ctermbg=blue
2801 hi ScrollBar ctermbg=red
2802 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002803 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002804 \ maxwidth: 10,
2805 \ maxheight: 3,
2806 \ pos : 'topleft',
2807 \ col : a:col,
2808 \ line : a:line,
2809 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002810 \ })
2811 endfunc
2812 call PopupMenu(['x'], 1, 1)
2813 call PopupMenu(['123456789|'], 1, 16)
2814 call PopupMenu(['123456789|' .. ' '], 7, 1)
2815 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2816 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2817 END
2818 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002819 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002820 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2821
2822 " close the menu popupwin.
2823 call term_sendkeys(buf, " ")
2824 call term_sendkeys(buf, " ")
2825 call term_sendkeys(buf, " ")
2826 call term_sendkeys(buf, " ")
2827 call term_sendkeys(buf, " ")
2828
2829 " clean up
2830 call StopVimInTerminal(buf)
2831 call delete('XtestPopupMenuMaxWidth')
2832endfunc
2833
Bram Moolenaara901a372019-07-13 16:38:50 +02002834func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002835 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002836
2837 let lines =<< trim END
2838 call setline(1, range(1, 20))
2839 hi ScrollThumb ctermbg=blue
2840 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002841 eval ['one', 'two', 'three', 'four', 'five',
2842 \ 'six', 'seven', 'eight', 'nine']
2843 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002844 \ minwidth: 8,
2845 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002846 \ })
2847 END
2848 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002849 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002850
2851 call term_sendkeys(buf, "j")
2852 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2853
2854 call term_sendkeys(buf, "jjj")
2855 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2856
2857 " if the cursor is the bottom line, it stays at the bottom line.
2858 call term_sendkeys(buf, repeat("j", 20))
2859 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2860
2861 call term_sendkeys(buf, "kk")
2862 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2863
2864 call term_sendkeys(buf, "k")
2865 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2866
2867 " if the cursor is in the top line, it stays in the top line.
2868 call term_sendkeys(buf, repeat("k", 20))
2869 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2870
2871 " close the menu popupwin.
2872 call term_sendkeys(buf, " ")
2873
2874 " clean up
2875 call StopVimInTerminal(buf)
2876 call delete('XtestPopupMenuScroll')
2877endfunc
2878
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002879func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002880 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002881
2882 let lines =<< trim END
2883 function! MyFilter(winid, key) abort
2884 if a:key == "0"
2885 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2886 return 1
2887 endif
2888 if a:key == "G"
2889 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2890 return 1
2891 endif
2892 if a:key == "j"
2893 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2894 return 1
2895 endif
2896 if a:key == "k"
2897 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2898 return 1
2899 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002900 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002901 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002902 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002903 endif
2904 return 0
2905 endfunction
2906 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2907 \ maxheight : 3,
2908 \ filter : 'MyFilter'
2909 \ })
2910 END
2911 call writefile(lines, 'XtestPopupMenuFilter')
2912 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2913
2914 call term_sendkeys(buf, "j")
2915 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2916
2917 call term_sendkeys(buf, "k")
2918 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2919
2920 call term_sendkeys(buf, "G")
2921 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2922
2923 call term_sendkeys(buf, "0")
2924 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2925
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002926 " check that when the popup is closed in the filter the screen is redrawn
2927 call term_sendkeys(buf, ":")
2928 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2929 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002930
2931 " clean up
2932 call StopVimInTerminal(buf)
2933 call delete('XtestPopupMenuFilter')
2934endfunc
2935
2936func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002937 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002938
2939 let winid = popup_create('some text', {})
2940 call assert_equal(0, popup_getoptions(winid).cursorline)
2941 call popup_close(winid)
2942
2943 let winid = popup_create('some text', #{ cursorline: 1, })
2944 call assert_equal(1, popup_getoptions(winid).cursorline)
2945 call popup_close(winid)
2946
2947 let winid = popup_create('some text', #{ cursorline: 0, })
2948 call assert_equal(0, popup_getoptions(winid).cursorline)
2949 call popup_close(winid)
2950
2951 let winid = popup_menu('some text', {})
2952 call assert_equal(1, popup_getoptions(winid).cursorline)
2953 call popup_close(winid)
2954
2955 let winid = popup_menu('some text', #{ cursorline: 1, })
2956 call assert_equal(1, popup_getoptions(winid).cursorline)
2957 call popup_close(winid)
2958
2959 let winid = popup_menu('some text', #{ cursorline: 0, })
2960 call assert_equal(0, popup_getoptions(winid).cursorline)
2961 call popup_close(winid)
2962
2963 " ---------
2964 " Pattern 1
2965 " ---------
2966 let lines =<< trim END
2967 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
2968 END
2969 call writefile(lines, 'XtestPopupCursorLine')
2970 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2971 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
2972 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2973 call StopVimInTerminal(buf)
2974
2975 " ---------
2976 " Pattern 2
2977 " ---------
2978 let lines =<< trim END
2979 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
2980 END
2981 call writefile(lines, 'XtestPopupCursorLine')
2982 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
2983 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
2984 call term_sendkeys(buf, ":call popup_clear()\<cr>")
2985 call StopVimInTerminal(buf)
2986
2987 " ---------
2988 " Pattern 3
2989 " ---------
2990 let lines =<< trim END
2991 function! MyFilter(winid, key) abort
2992 if a:key == "j"
2993 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
2994 return 1
2995 endif
2996 if a:key == 'x'
2997 call popup_close(a:winid)
2998 return 1
2999 endif
3000 return 0
3001 endfunction
3002 call popup_menu(['111', '222', '333'], #{
3003 \ cursorline : 0,
3004 \ maxheight : 2,
3005 \ filter : 'MyFilter',
3006 \ })
3007 END
3008 call writefile(lines, 'XtestPopupCursorLine')
3009 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3010 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3011 call term_sendkeys(buf, "j")
3012 call term_sendkeys(buf, "j")
3013 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3014 call term_sendkeys(buf, "x")
3015 call StopVimInTerminal(buf)
3016
3017 " ---------
3018 " Pattern 4
3019 " ---------
3020 let lines =<< trim END
3021 function! MyFilter(winid, key) abort
3022 if a:key == "j"
3023 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3024 return 1
3025 endif
3026 if a:key == 'x'
3027 call popup_close(a:winid)
3028 return 1
3029 endif
3030 return 0
3031 endfunction
3032 call popup_menu(['111', '222', '333'], #{
3033 \ cursorline : 1,
3034 \ maxheight : 2,
3035 \ filter : 'MyFilter',
3036 \ })
3037 END
3038 call writefile(lines, 'XtestPopupCursorLine')
3039 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3040 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3041 call term_sendkeys(buf, "j")
3042 call term_sendkeys(buf, "j")
3043 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3044 call term_sendkeys(buf, "x")
3045 call StopVimInTerminal(buf)
3046
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003047 " ---------
3048 " Cursor in second line when creating the popup
3049 " ---------
3050 let lines =<< trim END
3051 let winid = popup_create(['111', '222', '333'], #{
3052 \ cursorline : 1,
3053 \ })
3054 call win_execute(winid, "2")
3055 END
3056 call writefile(lines, 'XtestPopupCursorLine')
3057 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3058 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3059 call StopVimInTerminal(buf)
3060
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003061 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003062
3063 " ---------
3064 " Use current buffer for popupmenu
3065 " ---------
3066 let lines =<< trim END
3067 call setline(1, ['one', 'two', 'three'])
3068 let winid = popup_create(bufnr('%'), #{
3069 \ cursorline : 1,
3070 \ })
3071 call win_execute(winid, "2")
3072 END
3073 call writefile(lines, 'XtestPopupCursorLine')
3074 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3075 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3076 call StopVimInTerminal(buf)
3077
3078 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003079endfunc
3080
Bram Moolenaarf914a332019-07-20 15:09:56 +02003081func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003082 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003083 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003084
Bram Moolenaarf914a332019-07-20 15:09:56 +02003085 call writefile([
3086 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3087 \ "another\tXtagfile\t/^this is another",
3088 \ "theword\tXtagfile\t/^theword"],
3089 \ 'Xtags')
3090 call writefile(range(1,20)
3091 \ + ['theword is here']
3092 \ + range(22, 27)
3093 \ + ['this is another place']
3094 \ + range(29, 40),
3095 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003096 call writefile(range(1,10)
3097 \ + ['searched word is here']
3098 \ + range(12, 20),
3099 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003100 let lines =<< trim END
3101 set tags=Xtags
3102 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003103 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003104 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003105 \ 'three',
3106 \ 'four',
3107 \ 'five',
3108 \ 'six',
3109 \ 'seven',
3110 \ 'find theword somewhere',
3111 \ 'nine',
3112 \ 'this is another word',
3113 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003114 set previewpopup=height:4,width:40
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003115 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003116 END
3117 call writefile(lines, 'XtestPreviewPopup')
3118 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3119
3120 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3121 call term_sendkeys(buf, ":\<CR>")
3122 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3123
3124 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3125 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3126
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003127 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003128 call term_sendkeys(buf, ":\<CR>")
3129 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3130
3131 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3132 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3133
Bram Moolenaar799439a2020-02-11 21:44:17 +01003134 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003135 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003136 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003137
3138 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003139 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003140 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3141
3142 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3143 call term_sendkeys(buf, ":\<CR>")
3144 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3145
3146 call term_sendkeys(buf, ":pclose\<CR>")
3147 call term_sendkeys(buf, ":psearch searched\<CR>")
3148 call term_sendkeys(buf, ":\<CR>")
3149 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003150
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003151 call term_sendkeys(buf, "\<C-W>p")
3152 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3153
3154 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3155 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3156
Bram Moolenaarf914a332019-07-20 15:09:56 +02003157 call StopVimInTerminal(buf)
3158 call delete('Xtags')
3159 call delete('Xtagfile')
3160 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003161 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003162endfunc
3163
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003164func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003165 let lines =<< trim END
3166 set completeopt+=preview,popup
3167 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003168 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003169
3170 func CompleteFuncDict(findstart, base)
3171 if a:findstart
3172 if col('.') > 10
3173 return col('.') - 10
3174 endif
3175 return 0
3176 endif
3177
3178 return {
3179 \ 'words': [
3180 \ {
3181 \ 'word': 'aword',
3182 \ 'abbr': 'wrd',
3183 \ 'menu': 'extra text',
3184 \ 'info': 'words are cool',
3185 \ 'kind': 'W',
3186 \ 'user_data': 'test'
3187 \ },
3188 \ {
3189 \ 'word': 'anotherword',
3190 \ 'abbr': 'anotwrd',
3191 \ 'menu': 'extra text',
3192 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3193 \ 'kind': 'W',
3194 \ 'user_data': 'notest'
3195 \ },
3196 \ {
3197 \ 'word': 'noinfo',
3198 \ 'abbr': 'noawrd',
3199 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003200 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003201 \ 'kind': 'W',
3202 \ 'user_data': 'notest'
3203 \ },
3204 \ {
3205 \ 'word': 'thatword',
3206 \ 'abbr': 'thatwrd',
3207 \ 'menu': 'extra text',
3208 \ 'info': 'that word is cool',
3209 \ 'kind': 'W',
3210 \ 'user_data': 'notest'
3211 \ },
3212 \ ]
3213 \ }
3214 endfunc
3215 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003216 func ChangeColor()
3217 let id = popup_findinfo()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003218 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003219 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003220
3221 func InfoHidden()
3222 set completepopup=height:4,border:off,align:menu
3223 set completeopt-=popup completeopt+=popuphidden
3224 au CompleteChanged * call HandleChange()
3225 endfunc
3226
3227 let s:counter = 0
3228 func HandleChange()
3229 let s:counter += 1
3230 let selected = complete_info(['selected']).selected
3231 if selected <= 0
3232 " First time: do nothing, info remains hidden
3233 return
3234 endif
3235 if selected == 1
3236 " Second time: show info right away
3237 let id = popup_findinfo()
3238 if id
3239 call popup_settext(id, 'immediate info ' .. s:counter)
3240 call popup_show(id)
3241 endif
3242 else
3243 " Third time: show info after a short delay
3244 call timer_start(100, 'ShowInfo')
3245 endif
3246 endfunc
3247
3248 func ShowInfo(...)
3249 let id = popup_findinfo()
3250 if id
3251 call popup_settext(id, 'async info ' .. s:counter)
3252 call popup_show(id)
3253 endif
3254 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003255
3256 " Check that no autocommands are triggered for the info popup
3257 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3258 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003259 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003260 return lines
3261endfunc
3262
3263func Test_popupmenu_info_border()
3264 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003265 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003266
3267 let lines = Get_popupmenu_lines()
3268 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003269 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003270
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003271 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003272 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003273
3274 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3275 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3276
3277 call term_sendkeys(buf, "\<C-N>")
3278 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3279
3280 call term_sendkeys(buf, "\<C-N>")
3281 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3282
3283 call term_sendkeys(buf, "\<C-N>\<C-N>")
3284 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3285
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003286 " info on the left with scrollbar
3287 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3288 call term_sendkeys(buf, "\<C-N>\<C-N>")
3289 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3290
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003291 " Test that the popupmenu's scrollbar and infopopup do not overlap
3292 call term_sendkeys(buf, "\<Esc>")
3293 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3294 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3295 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3296
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003297 " Hide the info popup, cycle trough buffers, make sure it didn't get
3298 " deleted.
3299 call term_sendkeys(buf, "\<Esc>")
3300 call term_sendkeys(buf, ":set hidden\<CR>")
3301 call term_sendkeys(buf, ":bn\<CR>")
3302 call term_sendkeys(buf, ":bn\<CR>")
3303 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3304 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3305
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003306 " Test that when the option is changed the popup changes.
3307 call term_sendkeys(buf, "\<Esc>")
3308 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3309 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3310 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3311
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003312 call term_sendkeys(buf, " \<Esc>")
3313 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3314 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3315 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3316
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003317 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003318 call StopVimInTerminal(buf)
3319 call delete('XtestInfoPopup')
3320endfunc
3321
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003322func Test_popupmenu_info_noborder()
3323 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003324 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003325
3326 let lines = Get_popupmenu_lines()
3327 call add(lines, 'set completepopup=height:4,border:off')
3328 call writefile(lines, 'XtestInfoPopupNb')
3329
3330 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003331 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003332
3333 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3334 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3335
3336 call StopVimInTerminal(buf)
3337 call delete('XtestInfoPopupNb')
3338endfunc
3339
Bram Moolenaar258cef52019-08-21 17:29:29 +02003340func Test_popupmenu_info_align_menu()
3341 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003342 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003343
3344 let lines = Get_popupmenu_lines()
3345 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3346 call writefile(lines, 'XtestInfoPopupNb')
3347
3348 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003349 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003350
3351 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3352 call term_sendkeys(buf, "\<C-N>")
3353 call term_sendkeys(buf, "\<C-N>")
3354 call term_sendkeys(buf, "\<C-N>")
3355 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3356
3357 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3358 call term_sendkeys(buf, "\<C-N>")
3359 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3360
3361 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003362 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003363 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3364 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3365 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3366
3367 call StopVimInTerminal(buf)
3368 call delete('XtestInfoPopupNb')
3369endfunc
3370
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003371func Test_popupmenu_info_hidden()
3372 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003373 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003374
3375 let lines = Get_popupmenu_lines()
3376 call add(lines, 'call InfoHidden()')
3377 call writefile(lines, 'XtestInfoPopupHidden')
3378
3379 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003380 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003381
3382 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3383 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3384
3385 call term_sendkeys(buf, "\<C-N>")
3386 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3387
3388 call term_sendkeys(buf, "\<C-N>")
3389 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3390
3391 call term_sendkeys(buf, "\<Esc>")
3392 call StopVimInTerminal(buf)
3393 call delete('XtestInfoPopupHidden')
3394endfunc
3395
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003396func Test_popupmenu_info_too_wide()
3397 CheckScreendump
3398 CheckFeature quickfix
3399
3400 let lines =<< trim END
3401 call setline(1, range(10))
3402
3403 set completeopt+=preview,popup
3404 set completepopup=align:menu
3405 set omnifunc=OmniFunc
3406 hi InfoPopup ctermbg=lightgrey
3407
3408 func OmniFunc(findstart, base)
3409 if a:findstart
3410 return 0
3411 endif
3412
3413 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3414 return #{
3415 \ words: [
3416 \ #{
3417 \ word: 'scrap',
3418 \ menu: menuText,
3419 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3420 \ },
3421 \ #{
3422 \ word: 'scappier',
3423 \ menu: menuText,
3424 \ info: 'words are cool',
3425 \ },
3426 \ #{
3427 \ word: 'scrappier2',
3428 \ menu: menuText,
3429 \ info: 'words are cool',
3430 \ },
3431 \ ]
3432 \ }
3433 endfunc
3434 END
3435
3436 call writefile(lines, 'XtestInfoPopupWide')
3437 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003438 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003439
3440 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3441 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3442
3443 call term_sendkeys(buf, "\<Esc>")
3444 call StopVimInTerminal(buf)
3445 call delete('XtestInfoPopupWide')
3446endfunc
3447
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003448func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003449 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003450 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003451 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003452 call assert_equal(bufnr, winbufnr(winid))
3453 call popup_clear()
3454endfunc
3455
Bram Moolenaar1824f452019-10-02 23:06:46 +02003456func Test_popupwin_getoptions_tablocal()
3457 topleft split
3458 let win1 = popup_create('nothing', #{maxheight: 8})
3459 let win2 = popup_create('something', #{maxheight: 10})
3460 let win3 = popup_create('something', #{maxheight: 15})
3461 call assert_equal(8, popup_getoptions(win1).maxheight)
3462 call assert_equal(10, popup_getoptions(win2).maxheight)
3463 call assert_equal(15, popup_getoptions(win3).maxheight)
3464 call popup_clear()
3465 quit
3466endfunc
3467
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003468func Test_popupwin_cancel()
3469 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3470 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3471 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3472 call assert_equal(5, popup_getpos(win1).line)
3473 call assert_equal(10, popup_getpos(win2).line)
3474 call assert_equal(15, popup_getpos(win3).line)
3475 " TODO: this also works without patch 8.1.2110
3476 call feedkeys("\<C-C>", 'xt')
3477 call assert_equal(5, popup_getpos(win1).line)
3478 call assert_equal(10, popup_getpos(win2).line)
3479 call assert_equal({}, popup_getpos(win3))
3480 call feedkeys("\<C-C>", 'xt')
3481 call assert_equal(5, popup_getpos(win1).line)
3482 call assert_equal({}, popup_getpos(win2))
3483 call assert_equal({}, popup_getpos(win3))
3484 call feedkeys("\<C-C>", 'xt')
3485 call assert_equal({}, popup_getpos(win1))
3486 call assert_equal({}, popup_getpos(win2))
3487 call assert_equal({}, popup_getpos(win3))
3488endfunc
3489
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003490func Test_popupwin_filter_redraw()
3491 " Create two popups with a filter that closes the popup when typing "0".
3492 " Both popups should close, even though the redraw also calls
3493 " popup_reset_handled()
3494
3495 func CloseFilter(winid, key)
3496 if a:key == '0'
3497 call popup_close(a:winid)
3498 redraw
3499 endif
3500 return 0 " pass the key
3501 endfunc
3502
3503 let id1 = popup_create('first one', #{
3504 \ line: 1,
3505 \ col: 1,
3506 \ filter: 'CloseFilter',
3507 \ })
3508 let id2 = popup_create('second one', #{
3509 \ line: 9,
3510 \ col: 1,
3511 \ filter: 'CloseFilter',
3512 \ })
3513 call assert_equal(1, popup_getpos(id1).line)
3514 call assert_equal(9, popup_getpos(id2).line)
3515
3516 call feedkeys('0', 'xt')
3517 call assert_equal({}, popup_getpos(id1))
3518 call assert_equal({}, popup_getpos(id2))
3519
3520 call popup_clear()
3521 delfunc CloseFilter
3522endfunc
3523
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003524func Test_popupwin_double_width()
3525 CheckScreendump
3526
3527 let lines =<< trim END
3528 call setline(1, 'x你好世界你好世你好世界你好')
3529 call setline(2, '你好世界你好世你好世界你好')
3530 call setline(3, 'x你好世界你好世你好世界你好')
3531 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3532 END
3533 call writefile(lines, 'XtestPopupWide')
3534
3535 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3536 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3537
3538 call StopVimInTerminal(buf)
3539 call delete('XtestPopupWide')
3540endfunc
3541
3542func Test_popupwin_sign()
3543 CheckScreendump
3544
3545 let lines =<< trim END
3546 call setline(1, range(10))
3547 call sign_define('Current', {
3548 \ 'text': '>>',
3549 \ 'texthl': 'WarningMsg',
3550 \ 'linehl': 'Error',
3551 \ })
3552 call sign_define('Other', {
3553 \ 'text': '#!',
3554 \ 'texthl': 'Error',
3555 \ 'linehl': 'Search',
3556 \ })
3557 let winid = popup_create(['hello', 'bright', 'world'], {
3558 \ 'minwidth': 20,
3559 \ })
3560 call setwinvar(winid, "&signcolumn", "yes")
3561 let winbufnr = winbufnr(winid)
3562
3563 " add sign to current buffer, shows
3564 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3565 " add sign to current buffer, does not show
3566 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3567
3568 " add sign to popup buffer, shows
3569 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3570 " add sign to popup buffer, does not show
3571 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003572
3573 func SetOptions()
3574 call setwinvar(g:winid, '&number', 1)
3575 call setwinvar(g:winid, '&foldcolumn', 2)
3576 call popup_settext(g:winid, 'a longer line to check the width')
3577 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003578 END
3579 call writefile(lines, 'XtestPopupSign')
3580
3581 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3582 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3583
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003584 " set more options to check the width is adjusted
3585 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3586 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3587
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003588 call StopVimInTerminal(buf)
3589 call delete('XtestPopupSign')
3590endfunc
3591
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003592func Test_popupwin_bufnr()
3593 let popwin = popup_create(['blah'], #{})
3594 let popbuf = winbufnr(popwin)
3595 split asdfasdf
3596 let newbuf = bufnr()
3597 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3598 call assert_equal(newbuf, bufnr('$'))
3599 call popup_clear()
3600 let popwin = popup_create(['blah'], #{})
3601 " reuses previous buffer number
3602 call assert_equal(popbuf, winbufnr(popwin))
3603 call assert_equal(newbuf, bufnr('$'))
3604
3605 call popup_clear()
3606 bwipe!
3607endfunc
3608
Bram Moolenaarec084d32020-02-28 22:44:47 +01003609func Test_popupwin_filter_input_multibyte()
3610 func MyPopupFilter(winid, c)
3611 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3612 return 0
3613 endfunc
3614 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3615
3616 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3617 call feedkeys("\u3000", 'xt')
3618 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3619
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003620 " UTF-8: E3 80 9B, including CSI(0x9B)
3621 call feedkeys("\u301b", 'xt')
3622 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003623
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003624 if has('unix')
3625 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003626 if has('gui_running')
3627 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3628 else
3629 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3630 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003631 call assert_equal([0xc3, 0x81], g:bytes)
3632 endif
3633
Bram Moolenaarec084d32020-02-28 22:44:47 +01003634 call popup_clear()
3635 delfunc MyPopupFilter
3636 unlet g:bytes
3637endfunc
3638
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003639func Test_popupwin_filter_close_ctrl_c()
3640 CheckScreendump
3641
3642 let lines =<< trim END
3643 vsplit
3644 set laststatus=2
3645 set statusline=%!Statusline()
3646
3647 function Statusline() abort
3648 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3649 endfunction
3650
3651 call popup_create('test test test test...', {'filter': {-> 0}})
3652 END
3653 call writefile(lines, 'XtestPopupCtrlC')
3654
3655 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3656
3657 call term_sendkeys(buf, "\<C-C>")
3658 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3659
3660 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003661 call delete('XtestPopupCtrlC')
3662endfunc
3663
3664func Test_popupwin_filter_close_wrong_name()
3665 CheckScreendump
3666
3667 let lines =<< trim END
3668 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3669 END
3670 call writefile(lines, 'XtestPopupWrongName')
3671
3672 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3673
3674 call term_sendkeys(buf, "j")
3675 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3676
3677 call StopVimInTerminal(buf)
3678 call delete('XtestPopupWrongName')
3679endfunc
3680
3681func Test_popupwin_filter_close_three_errors()
3682 CheckScreendump
3683
3684 let lines =<< trim END
3685 set cmdheight=2
3686 call popup_create('one two three...', {'filter': 'filter'})
3687 END
3688 call writefile(lines, 'XtestPopupThreeErrors')
3689
3690 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3691
3692 call term_sendkeys(buf, "jj")
3693 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3694 call term_sendkeys(buf, "j")
3695 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3696
3697 call StopVimInTerminal(buf)
3698 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003699endfunc
3700
Bram Moolenaar927495b2020-11-06 17:58:35 +01003701func Test_popupwin_latin1_encoding()
3702 CheckScreendump
3703 CheckUnix
3704
3705 " When 'encoding' is a single-byte encoding a terminal window will mess up
3706 " the display. Check that showing a popup on top of that doesn't crash.
3707 let lines =<< trim END
3708 set encoding=latin1
3709 terminal cat Xmultibyte
3710 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
3711 END
3712 call writefile(lines, 'XtestPopupLatin')
3713 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte')
3714
3715 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
3716
3717 call term_sendkeys(buf, ":q\<CR>")
3718 call StopVimInTerminal(buf)
3719 call delete('XtestPopupLatin')
3720 call delete('Xmultibyte')
3721endfunc
3722
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003723func Test_popupwin_atcursor_far_right()
3724 new
3725
3726 " this was getting stuck
3727 set signcolumn=yes
3728 call setline(1, repeat('=', &columns))
3729 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003730 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003731
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003732 " 'signcolumn' was getting reset
3733 call setwinvar(winid, '&signcolumn', 'yes')
3734 call popup_setoptions(winid, {'zindex': 1000})
3735 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3736
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003737 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003738 bwipe!
3739 set signcolumn&
3740endfunc
3741
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003742func Test_popupwin_splitmove()
3743 vsplit
3744 let win2 = win_getid()
3745 let popup_winid = popup_dialog('hello', {})
3746 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3747 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3748
3749 call popup_clear()
3750 bwipe
3751endfunc
3752
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01003753func Test_popupwin_exiting_terminal()
3754 CheckFeature terminal
3755
3756 " Tests that when creating a popup right after closing a terminal window does
3757 " not make the popup the current window.
3758 let winid = win_getid()
3759 try
3760 augroup Test_popupwin_exiting_terminal
3761 autocmd!
3762 autocmd WinEnter * :call popup_create('test', {})
3763 augroup END
3764 let bnr = term_start(&shell, #{term_finish: 'close'})
3765 call term_sendkeys(bnr, "exit\r\n")
3766 call WaitForAssert({-> assert_equal(winid, win_getid())})
3767 finally
3768 call popup_clear(1)
3769 augroup Test_popupwin_exiting_terminal
3770 autocmd!
3771 augroup END
3772 endtry
3773endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003774
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003775" vim: shiftwidth=2 sts=2