blob: 15fa3ca0660e6f7188e67e3043fac4a96faf44c3 [file] [log] [blame]
Bram Moolenaar4d784b22019-05-25 19:51:39 +02001" Tests for popup windows
2
Bram Moolenaarb46fecd2019-06-15 17:58:09 +02003source check.vim
Bram Moolenaar05ad5ff2019-11-30 22:48:27 +01004CheckFeature popupwin
Bram Moolenaar4d784b22019-05-25 19:51:39 +02005
6source screendump.vim
7
8func Test_simple_popup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02009 CheckScreendump
10
Bram Moolenaare7eb9272019-06-24 00:58:07 +020011 let lines =<< trim END
12 call setline(1, range(1, 100))
13 hi PopupColor1 ctermbg=lightblue
14 hi PopupColor2 ctermbg=lightcyan
Bram Moolenaar1666ac92019-11-10 17:22:31 +010015 hi EndOfBuffer ctermbg=lightgrey
Bram Moolenaare7eb9272019-06-24 00:58:07 +020016 hi Comment ctermfg=red
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020017 call prop_type_add('comment', #{highlight: 'Comment'})
18 let winid = popup_create('hello there', #{line: 3, col: 11, minwidth: 20, highlight: 'PopupColor1'})
19 let winid2 = popup_create(['another one', 'another two', 'another three'], #{line: 3, col: 25, minwidth: 20})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020020 call setwinvar(winid2, '&wincolor', 'PopupColor2')
21 END
22 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020023 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar4d784b22019-05-25 19:51:39 +020024 call VerifyScreenDump(buf, 'Test_popupwin_01', {})
25
Bram Moolenaarec583842019-05-26 14:11:23 +020026 " Add a tabpage
27 call term_sendkeys(buf, ":tabnew\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020028 call term_sendkeys(buf, ":let popupwin = popup_create(["
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020029 \ .. "#{text: 'other tab'},"
30 \ .. "#{text: 'a comment line', props: [#{"
Bram Moolenaard5abb4c2019-07-13 22:46:10 +020031 \ .. "col: 3, length: 7, minwidth: 20, type: 'comment'"
Bram Moolenaar7a8d0272019-05-26 23:32:06 +020032 \ .. "}]},"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020033 \ .. "], #{line: 4, col: 9, minwidth: 20})\<CR>")
Bram Moolenaarec583842019-05-26 14:11:23 +020034 call VerifyScreenDump(buf, 'Test_popupwin_02', {})
35
36 " switch back to first tabpage
37 call term_sendkeys(buf, "gt")
38 call VerifyScreenDump(buf, 'Test_popupwin_03', {})
39
40 " close that tabpage
41 call term_sendkeys(buf, ":quit!\<CR>")
42 call VerifyScreenDump(buf, 'Test_popupwin_04', {})
43
Bram Moolenaar202d9822019-06-11 21:56:30 +020044 " set 'columns' to a small value, size must be recomputed
45 call term_sendkeys(buf, ":let cols = &columns\<CR>")
46 call term_sendkeys(buf, ":set columns=12\<CR>")
47 call VerifyScreenDump(buf, 'Test_popupwin_04a', {})
48 call term_sendkeys(buf, ":let &columns = cols\<CR>")
49
Bram Moolenaar17146962019-05-30 00:12:11 +020050 " resize popup, show empty line at bottom
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020051 call term_sendkeys(buf, ":call popup_move(popupwin, #{minwidth: 15, maxwidth: 25, minheight: 3, maxheight: 5})\<CR>")
Bram Moolenaar60cdb302019-05-27 21:54:10 +020052 call term_sendkeys(buf, ":redraw\<CR>")
53 call VerifyScreenDump(buf, 'Test_popupwin_05', {})
54
Bram Moolenaar17146962019-05-30 00:12:11 +020055 " show not fitting line at bottom
56 call term_sendkeys(buf, ":call setbufline(winbufnr(popupwin), 3, 'this line will not fit here')\<CR>")
57 call term_sendkeys(buf, ":redraw\<CR>")
58 call VerifyScreenDump(buf, 'Test_popupwin_06', {})
59
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020060 " move popup over ruler
61 call term_sendkeys(buf, ":set cmdheight=2\<CR>")
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020062 call term_sendkeys(buf, ":call popup_move(popupwin, #{line: 7, col: 55})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +020063 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020064 call VerifyScreenDump(buf, 'Test_popupwin_07', {})
65
66 " clear all popups after moving the cursor a bit, so that ruler is updated
67 call term_sendkeys(buf, "axxx\<Esc>")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020068 call TermWait(buf)
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020069 call term_sendkeys(buf, "0")
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +020070 call TermWait(buf)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +020071 call term_sendkeys(buf, ":call popup_clear()\<CR>")
Bram Moolenaar24a5ac52019-06-08 19:01:18 +020072 call VerifyScreenDump(buf, 'Test_popupwin_08', {})
73
Bram Moolenaar4d784b22019-05-25 19:51:39 +020074 " clean up
75 call StopVimInTerminal(buf)
76 call delete('XtestPopup')
77endfunc
Bram Moolenaar51fe3b12019-05-26 20:10:06 +020078
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020079func Test_popup_with_border_and_padding()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +020080 CheckScreendump
Bram Moolenaar2fd8e352019-06-01 20:16:48 +020081
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +020082 for iter in range(0, 1)
Bram Moolenaare7eb9272019-06-24 00:58:07 +020083 let lines =<< trim END
84 call setline(1, range(1, 100))
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020085 call popup_create('hello border', #{line: 2, col: 3, border: []})
86 call popup_create('hello padding', #{line: 2, col: 23, padding: []})
Bram Moolenaarc363fe12019-08-04 18:13:46 +020087 call popup_create('hello both', #{line: 2, col: 43, border: [], padding: [], highlight: 'Normal'})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020088 call popup_create('border TL', #{line: 6, col: 3, border: [1, 0, 0, 4]})
Bram Moolenaarb0992022020-01-30 14:55:42 +010089 call popup_create('paddings', #{line: 6, col: 23, padding: range(1, 4)})
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020090 call popup_create('wrapped longer text', #{line: 8, col: 55, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
91 call popup_create('right aligned text', #{line: 11, col: 56, wrap: 0, padding: [0, 3, 0, 3], border: [0, 1, 0, 1]})
Bram Moolenaarfbcdf672020-01-06 23:07:48 +010092 call popup_create('X', #{line: 2, col: 73})
93 call popup_create('X', #{line: 3, col: 74})
94 call popup_create('X', #{line: 4, col: 75})
95 call popup_create('X', #{line: 5, col: 76})
Bram Moolenaare7eb9272019-06-24 00:58:07 +020096 END
97 call insert(lines, iter == 1 ? '' : 'set enc=latin1')
98 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +020099 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 15})
Bram Moolenaar3bfd04e2019-06-01 20:45:21 +0200100 call VerifyScreenDump(buf, 'Test_popupwin_2' .. iter, {})
101
102 call StopVimInTerminal(buf)
103 call delete('XtestPopupBorder')
104 endfor
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200105
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200106 let lines =<< trim END
107 call setline(1, range(1, 100))
108 hi BlueColor ctermbg=lightblue
109 hi TopColor ctermbg=253
110 hi RightColor ctermbg=245
111 hi BottomColor ctermbg=240
112 hi LeftColor ctermbg=248
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200113 call popup_create('hello border', #{line: 2, col: 3, border: [], borderhighlight: ['BlueColor']})
114 call popup_create(['hello border', 'and more'], #{line: 2, col: 23, border: [], borderhighlight: ['TopColor', 'RightColor', 'BottomColor', 'LeftColor']})
115 call popup_create(['hello border', 'lines only'], #{line: 2, col: 43, border: [], borderhighlight: ['BlueColor'], borderchars: ['x']})
116 call popup_create(['hello border', 'with corners'], #{line: 2, col: 60, border: [], borderhighlight: ['BlueColor'], borderchars: ['x', '#']})
117 let winid = popup_create(['hello border', 'with numbers'], #{line: 6, col: 3, border: [], borderhighlight: ['BlueColor'], borderchars: ['0', '1', '2', '3', '4', '5', '6', '7']})
118 call popup_create(['hello border', 'just blanks'], #{line: 7, col: 23, border: [], borderhighlight: ['BlueColor'], borderchars: [' ']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200119 func MultiByte()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200120 call popup_create(['hello'], #{line: 8, col: 43, border: [], borderchars: ['─', '│', '─', '│', '┌', '┐', '┘', '└']})
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200121 endfunc
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200122 END
123 call writefile(lines, 'XtestPopupBorder')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200124 let buf = RunVimInTerminal('-S XtestPopupBorder', #{rows: 12})
Bram Moolenaar790498b2019-06-01 22:15:29 +0200125 call VerifyScreenDump(buf, 'Test_popupwin_22', {})
126
Bram Moolenaarad24a712019-06-17 20:05:45 +0200127 " check that changing borderchars triggers a redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200128 call term_sendkeys(buf, ":call popup_setoptions(winid, #{borderchars: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']})\<CR>")
Bram Moolenaarad24a712019-06-17 20:05:45 +0200129 call VerifyScreenDump(buf, 'Test_popupwin_23', {})
130
Bram Moolenaar3dabd712019-07-08 23:30:22 +0200131 " check multi-byte border only with 'ambiwidth' single
132 if &ambiwidth == 'single'
133 call term_sendkeys(buf, ":call MultiByte()\<CR>")
134 call VerifyScreenDump(buf, 'Test_popupwin_24', {})
135 endif
136
Bram Moolenaar790498b2019-06-01 22:15:29 +0200137 call StopVimInTerminal(buf)
138 call delete('XtestPopupBorder')
139
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200140 let with_border_or_padding = #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200141 \ line: 2,
142 \ core_line: 3,
143 \ col: 3,
144 \ core_col: 4,
145 \ width: 14,
146 \ core_width: 12,
147 \ height: 3,
148 \ core_height: 1,
149 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100150 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200151 \ scrollbar: 0,
152 \ visible: 1}
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200153 let winid = popup_create('hello border', #{line: 2, col: 3, border: []})",
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200154 call assert_equal(with_border_or_padding, winid->popup_getpos())
Bram Moolenaarae943152019-06-16 22:54:14 +0200155 let options = popup_getoptions(winid)
156 call assert_equal([], options.border)
157 call assert_false(has_key(options, "padding"))
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200158
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200159 let winid = popup_create('hello padding', #{line: 2, col: 3, padding: []})
Bram Moolenaarae943152019-06-16 22:54:14 +0200160 let with_border_or_padding.width = 15
161 let with_border_or_padding.core_width = 13
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200162 call assert_equal(with_border_or_padding, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200163 let options = popup_getoptions(winid)
164 call assert_false(has_key(options, "border"))
165 call assert_equal([], options.padding)
166
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200167 call popup_setoptions(winid, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200168 \ padding: [1, 2, 3, 4],
169 \ border: [4, 0, 7, 8],
170 \ borderhighlight: ['Top', 'Right', 'Bottom', 'Left'],
171 \ borderchars: ['1', '^', '2', '>', '3', 'v', '4', '<'],
Bram Moolenaarae943152019-06-16 22:54:14 +0200172 \ })
173 let options = popup_getoptions(winid)
174 call assert_equal([1, 0, 1, 1], options.border)
175 call assert_equal([1, 2, 3, 4], options.padding)
176 call assert_equal(['Top', 'Right', 'Bottom', 'Left'], options.borderhighlight)
177 call assert_equal(['1', '^', '2', '>', '3', 'v', '4', '<'], options.borderchars)
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200178
Bram Moolenaara1396152019-10-20 18:46:05 +0200179 " Check that popup_setoptions() takes the output of popup_getoptions()
180 call popup_setoptions(winid, options)
181 call assert_equal(options, popup_getoptions(winid))
182
Bram Moolenaarb0992022020-01-30 14:55:42 +0100183 " Check that range() doesn't crash
184 call popup_setoptions(winid, #{
185 \ padding: range(1, 4),
186 \ border: range(5, 8),
187 \ borderhighlight: range(4),
188 \ borderchars: range(8),
189 \ })
190
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200191 let winid = popup_create('hello both', #{line: 3, col: 8, border: [], padding: []})
192 call assert_equal(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200193 \ line: 3,
194 \ core_line: 5,
195 \ col: 8,
196 \ core_col: 10,
197 \ width: 14,
198 \ core_width: 10,
199 \ height: 5,
200 \ scrollbar: 0,
201 \ core_height: 1,
202 \ firstline: 1,
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100203 \ lastline: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200204 \ visible: 1}, popup_getpos(winid))
Bram Moolenaarae943152019-06-16 22:54:14 +0200205
206 call popup_clear()
Bram Moolenaar2fd8e352019-06-01 20:16:48 +0200207endfunc
208
Bram Moolenaarb4230122019-05-30 18:40:53 +0200209func Test_popup_with_syntax_win_execute()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200210 CheckScreendump
211
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200212 let lines =<< trim END
213 call setline(1, range(1, 100))
214 hi PopupColor ctermbg=lightblue
215 let winid = popup_create([
216 \ '#include <stdio.h>',
217 \ 'int main(void)',
218 \ '{',
219 \ ' printf(123);',
220 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200221 \], #{line: 3, col: 25, highlight: 'PopupColor'})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200222 call win_execute(winid, 'set syntax=cpp')
223 END
224 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200225 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200226 call VerifyScreenDump(buf, 'Test_popupwin_10', {})
227
228 " clean up
229 call StopVimInTerminal(buf)
230 call delete('XtestPopup')
231endfunc
232
233func Test_popup_with_syntax_setbufvar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200234 CheckScreendump
235
Bram Moolenaar402502d2019-05-30 22:07:36 +0200236 let lines =<< trim END
237 call setline(1, range(1, 100))
238 hi PopupColor ctermbg=lightgrey
239 let winid = popup_create([
240 \ '#include <stdio.h>',
241 \ 'int main(void)',
242 \ '{',
Bram Moolenaare089c3f2019-07-09 20:25:25 +0200243 \ "\tprintf(567);",
Bram Moolenaar402502d2019-05-30 22:07:36 +0200244 \ '}',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200245 \], #{line: 3, col: 21, highlight: 'PopupColor'})
Bram Moolenaar402502d2019-05-30 22:07:36 +0200246 call setbufvar(winbufnr(winid), '&syntax', 'cpp')
247 END
248 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200249 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaarb4230122019-05-30 18:40:53 +0200250 call VerifyScreenDump(buf, 'Test_popupwin_11', {})
251
252 " clean up
253 call StopVimInTerminal(buf)
254 call delete('XtestPopup')
255endfunc
256
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200257func Test_popup_with_matches()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200258 CheckScreendump
259
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200260 let lines =<< trim END
261 call setline(1, ['111 222 333', '444 555 666'])
262 let winid = popup_create([
263 \ '111 222 333',
264 \ '444 555 666',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200265 \], #{line: 3, col: 10, border: []})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200266 set hlsearch
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100267 hi VeryBlue ctermfg=blue guifg=blue
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200268 /666
269 call matchadd('ErrorMsg', '111')
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100270 call matchadd('VeryBlue', '444')
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200271 call win_execute(winid, "call matchadd('ErrorMsg', '111')")
Bram Moolenaar024dbd22019-11-02 22:00:15 +0100272 call win_execute(winid, "call matchadd('VeryBlue', '555')")
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200273 END
274 call writefile(lines, 'XtestPopupMatches')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200275 let buf = RunVimInTerminal('-S XtestPopupMatches', #{rows: 10})
Bram Moolenaarac2450a2019-06-09 18:04:28 +0200276 call VerifyScreenDump(buf, 'Test_popupwin_matches', {})
277
278 " clean up
279 call StopVimInTerminal(buf)
280 call delete('XtestPopupMatches')
281endfunc
282
Bram Moolenaar399d8982019-06-02 15:34:29 +0200283func Test_popup_all_corners()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200284 CheckScreendump
285
Bram Moolenaar399d8982019-06-02 15:34:29 +0200286 let lines =<< trim END
287 call setline(1, repeat([repeat('-', 60)], 15))
288 set so=0
289 normal 2G3|r#
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200290 let winid1 = popup_create(['first', 'second'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200291 \ line: 'cursor+1',
292 \ col: 'cursor',
293 \ pos: 'topleft',
294 \ border: [],
295 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200296 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200297 normal 24|r@
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200298 let winid1 = popup_create(['First', 'SeconD'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200299 \ line: 'cursor+1',
300 \ col: 'cursor',
301 \ pos: 'topright',
302 \ border: [],
303 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200304 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200305 normal 9G27|r%
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200306 let winid1 = popup_create(['fiRSt', 'seCOnd'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200307 \ line: 'cursor-1',
308 \ col: 'cursor',
309 \ pos: 'botleft',
310 \ border: [],
311 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200312 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200313 normal 48|r&
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200314 let winid1 = popup_create(['FIrsT', 'SEcoND'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200315 \ line: 'cursor-1',
316 \ col: 'cursor',
317 \ pos: 'botright',
318 \ border: [],
319 \ padding: [],
Bram Moolenaar399d8982019-06-02 15:34:29 +0200320 \ })
Bram Moolenaarb754b5b2019-10-24 19:25:00 +0200321 normal 1G51|r*
322 let winid1 = popup_create(['one', 'two'], #{
323 \ line: 'cursor-1',
324 \ col: 'cursor',
325 \ pos: 'botleft',
326 \ border: [],
327 \ padding: [],
328 \ })
Bram Moolenaar399d8982019-06-02 15:34:29 +0200329 END
330 call writefile(lines, 'XtestPopupCorners')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200331 let buf = RunVimInTerminal('-S XtestPopupCorners', #{rows: 12})
Bram Moolenaar399d8982019-06-02 15:34:29 +0200332 call VerifyScreenDump(buf, 'Test_popupwin_corners', {})
333
334 " clean up
335 call StopVimInTerminal(buf)
336 call delete('XtestPopupCorners')
337endfunc
338
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100339func Test_popup_nospace()
340 CheckScreendump
341
342 let lines =<< trim END
343 call setline(1, repeat([repeat('-', 60)], 15))
344 set so=0
345
346 " cursor in a line in top half, using "botleft" with popup that
347 " does fit
348 normal 5G2|r@
349 let winid1 = popup_create(['one', 'two'], #{
350 \ line: 'cursor-1',
351 \ col: 'cursor',
352 \ pos: 'botleft',
353 \ border: [],
354 \ })
355 " cursor in a line in top half, using "botleft" with popup that
356 " doesn't fit: gets truncated
357 normal 5G9|r#
358 let winid1 = popup_create(['one', 'two', 'tee'], #{
359 \ line: 'cursor-1',
360 \ col: 'cursor',
361 \ pos: 'botleft',
362 \ posinvert: 0,
363 \ border: [],
364 \ })
365 " cursor in a line in top half, using "botleft" with popup that
366 " doesn't fit and 'posinvert' set: flips to below.
367 normal 5G16|r%
368 let winid1 = popup_create(['one', 'two', 'tee'], #{
369 \ line: 'cursor-1',
370 \ col: 'cursor',
371 \ pos: 'botleft',
372 \ border: [],
373 \ })
374 " cursor in a line in bottom half, using "botleft" with popup that
375 " doesn't fit: does not flip.
376 normal 8G23|r*
377 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
378 \ line: 'cursor-1',
379 \ col: 'cursor',
380 \ pos: 'botleft',
381 \ border: [],
382 \ })
383
384 " cursor in a line in bottom half, using "topleft" with popup that
385 " does fit
386 normal 8G30|r@
387 let winid1 = popup_create(['one', 'two'], #{
388 \ line: 'cursor+1',
389 \ col: 'cursor',
390 \ pos: 'topleft',
391 \ border: [],
392 \ })
393 " cursor in a line in top half, using "topleft" with popup that
394 " doesn't fit: truncated
395 normal 8G37|r#
396 let winid1 = popup_create(['one', 'two', 'tee'], #{
397 \ line: 'cursor+1',
398 \ col: 'cursor',
399 \ pos: 'topleft',
400 \ posinvert: 0,
401 \ border: [],
402 \ })
403 " cursor in a line in top half, using "topleft" with popup that
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100404 " doesn't fit and "posinvert" set: flips to above.
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100405 normal 8G44|r%
Bram Moolenaar5c6b6182019-11-10 17:51:38 +0100406 let winid1 = popup_create(['one', 'two', 'tee', 'fou', 'fiv'], #{
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100407 \ line: 'cursor+1',
408 \ col: 'cursor',
409 \ pos: 'topleft',
410 \ border: [],
411 \ })
412 " cursor in a line in top half, using "topleft" with popup that
413 " doesn't fit: does not flip.
414 normal 5G51|r*
415 let winid1 = popup_create(['aaa', 'bbb', 'ccc', 'ddd', 'eee', 'fff'], #{
416 \ line: 'cursor+1',
417 \ col: 'cursor',
418 \ pos: 'topleft',
419 \ border: [],
420 \ })
421 END
422 call writefile(lines, 'XtestPopupNospace')
423 let buf = RunVimInTerminal('-S XtestPopupNospace', #{rows: 12})
424 call VerifyScreenDump(buf, 'Test_popupwin_nospace', {})
425
426 " clean up
427 call StopVimInTerminal(buf)
428 call delete('XtestPopupNospace')
429endfunc
430
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200431func Test_popup_firstline_dump()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200432 CheckScreendump
433
Bram Moolenaar8d241042019-06-12 23:40:01 +0200434 let lines =<< trim END
435 call setline(1, range(1, 20))
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200436 let winid = popup_create(['1111', '222222', '33333', '44', '5', '666666', '77777', '888', '9999999999999999'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200437 \ maxheight: 4,
438 \ firstline: 3,
Bram Moolenaar8d241042019-06-12 23:40:01 +0200439 \ })
440 END
441 call writefile(lines, 'XtestPopupFirstline')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200442 let buf = RunVimInTerminal('-S XtestPopupFirstline', #{rows: 10})
Bram Moolenaar8c6173c2019-08-30 22:08:34 +0200443 call VerifyScreenDump(buf, 'Test_popupwin_firstline_1', {})
444
445 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: -1})\<CR>")
446 call term_sendkeys(buf, ":\<CR>")
447 call VerifyScreenDump(buf, 'Test_popupwin_firstline_2', {})
Bram Moolenaar8d241042019-06-12 23:40:01 +0200448
449 " clean up
450 call StopVimInTerminal(buf)
451 call delete('XtestPopupFirstline')
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200452endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +0200453
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200454func Test_popup_firstline()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200455 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200456 \ maxheight: 2,
457 \ firstline: 3,
Bram Moolenaarae943152019-06-16 22:54:14 +0200458 \ })
459 call assert_equal(3, popup_getoptions(winid).firstline)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200460 call popup_setoptions(winid, #{firstline: 1})
Bram Moolenaarae943152019-06-16 22:54:14 +0200461 call assert_equal(1, popup_getoptions(winid).firstline)
Bram Moolenaar6a124e62019-09-04 18:15:19 +0200462 eval winid->popup_close()
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200463
464 let winid = popup_create(['xxx']->repeat(50), #{
465 \ maxheight: 3,
466 \ firstline: 11,
467 \ })
468 redraw
469 call assert_equal(11, popup_getoptions(winid).firstline)
470 call assert_equal(11, popup_getpos(winid).firstline)
Bram Moolenaar8e0a8e72019-09-02 22:56:24 +0200471 " check line() works with popup window
472 call assert_equal(11, line('.', winid))
473 call assert_equal(50, line('$', winid))
474 call assert_equal(0, line('$', 123456))
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +0200475
476 " Normal command changes what is displayed but not "firstline"
477 call win_execute(winid, "normal! \<c-y>")
478 call assert_equal(11, popup_getoptions(winid).firstline)
479 call assert_equal(10, popup_getpos(winid).firstline)
480
481 " Making some property change applies "firstline" again
482 call popup_setoptions(winid, #{line: 4})
483 call assert_equal(11, popup_getoptions(winid).firstline)
484 call assert_equal(11, popup_getpos(winid).firstline)
485
486 " Remove "firstline" property and scroll
487 call popup_setoptions(winid, #{firstline: 0})
488 call win_execute(winid, "normal! \<c-y>")
489 call assert_equal(0, popup_getoptions(winid).firstline)
490 call assert_equal(10, popup_getpos(winid).firstline)
491
492 " Making some property change has no side effect
493 call popup_setoptions(winid, #{line: 3})
494 call assert_equal(0, popup_getoptions(winid).firstline)
495 call assert_equal(10, popup_getpos(winid).firstline)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200496 call popup_close(winid)
Bram Moolenaarae943152019-06-16 22:54:14 +0200497
Bram Moolenaar30efcf32019-11-03 22:29:38 +0100498 " CTRL-D scrolls down half a page
499 let winid = popup_create(['xxx']->repeat(50), #{
500 \ maxheight: 8,
501 \ })
502 redraw
503 call assert_equal(1, popup_getpos(winid).firstline)
504 call win_execute(winid, "normal! \<C-D>")
505 call assert_equal(5, popup_getpos(winid).firstline)
506 call win_execute(winid, "normal! \<C-D>")
507 call assert_equal(9, popup_getpos(winid).firstline)
508 call win_execute(winid, "normal! \<C-U>")
509 call assert_equal(5, popup_getpos(winid).firstline)
510
511 call win_execute(winid, "normal! \<C-F>")
512 call assert_equal(11, popup_getpos(winid).firstline)
513 call win_execute(winid, "normal! \<C-B>")
514 call assert_equal(5, popup_getpos(winid).firstline)
515
Bram Moolenaarae943152019-06-16 22:54:14 +0200516 call popup_close(winid)
Bram Moolenaar8d241042019-06-12 23:40:01 +0200517endfunc
518
Bram Moolenaar99ca9c42020-09-22 21:55:41 +0200519func Test_popup_firstline_cursorline()
520 let winid = popup_create(['1111', '222222', '33333', '44444'], #{
521 \ maxheight: 2,
522 \ firstline: 3,
523 \ cursorline: 1,
524 \ })
525 call assert_equal(3, popup_getoptions(winid).firstline)
526 call assert_equal(3, getwininfo(winid)[0].topline)
527 call assert_equal(3, getcurpos(winid)[1])
528
529 call popup_close(winid)
530endfunc
531
Bram Moolenaara112f2d2019-09-01 17:38:09 +0200532func Test_popup_noscrolloff()
533 set scrolloff=5
534 let winid = popup_create(['xxx']->repeat(50), #{
535 \ maxheight: 5,
536 \ firstline: 11,
537 \ })
538 redraw
539 call assert_equal(11, popup_getoptions(winid).firstline)
540 call assert_equal(11, popup_getpos(winid).firstline)
541
542 call popup_setoptions(winid, #{firstline: 0})
543 call win_execute(winid, "normal! \<c-y>")
544 call assert_equal(0, popup_getoptions(winid).firstline)
545 call assert_equal(10, popup_getpos(winid).firstline)
546
547 call popup_close(winid)
548endfunc
549
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200550func Test_popup_drag()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200551 CheckScreendump
552
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200553 " create a popup that covers the command line
554 let lines =<< trim END
555 call setline(1, range(1, 20))
Bram Moolenaar356375f2019-08-24 14:46:29 +0200556 split
557 vsplit
558 $wincmd w
559 vsplit
560 1wincmd w
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200561 let winid = popup_create(['1111', '222222', '33333'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200562 \ drag: 1,
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200563 \ resize: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200564 \ border: [],
565 \ line: &lines - 4,
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200566 \ })
567 func Dragit()
568 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
569 endfunc
570 map <silent> <F3> :call test_setmouse(&lines - 4, &columns / 2)<CR>
Bram Moolenaar356375f2019-08-24 14:46:29 +0200571 map <silent> <F4> :call test_setmouse(&lines - 8, &columns / 2 - 20)<CR>
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200572 func Resize()
573 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
574 endfunc
Bram Moolenaar356375f2019-08-24 14:46:29 +0200575 map <silent> <F5> :call test_setmouse(6, 21)<CR>
576 map <silent> <F6> :call test_setmouse(7, 25)<CR>
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200577 END
578 call writefile(lines, 'XtestPopupDrag')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200579 let buf = RunVimInTerminal('-S XtestPopupDrag', #{rows: 10})
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200580 call VerifyScreenDump(buf, 'Test_popupwin_drag_01', {})
581
582 call term_sendkeys(buf, ":call Dragit()\<CR>")
583 call VerifyScreenDump(buf, 'Test_popupwin_drag_02', {})
584
Bram Moolenaar9bcb70c2019-08-01 21:11:05 +0200585 call term_sendkeys(buf, ":call Resize()\<CR>")
586 call VerifyScreenDump(buf, 'Test_popupwin_drag_03', {})
587
Bram Moolenaara540f8a2019-06-14 19:23:57 +0200588 " clean up
589 call StopVimInTerminal(buf)
590 call delete('XtestPopupDrag')
591endfunc
592
Bram Moolenaar35910f22020-07-12 19:24:10 +0200593func Test_popup_drag_termwin()
594 CheckUnix
595 CheckScreendump
596 CheckFeature terminal
597
598 " create a popup that covers the terminal window
599 let lines =<< trim END
Bram Moolenaar452143c2020-07-15 17:38:21 +0200600 set foldmethod=marker
601 call setline(1, range(100))
602 for nr in range(7)
603 call setline(nr * 12 + 1, "fold {{{")
Bram Moolenaar9d489562020-07-30 20:08:50 +0200604 call setline(nr * 12 + 11, "end }}}")
Bram Moolenaar452143c2020-07-15 17:38:21 +0200605 endfor
606 %foldclose
Bram Moolenaar35910f22020-07-12 19:24:10 +0200607 set shell=/bin/sh noruler
Bram Moolenaar4b2ce122020-11-21 21:41:41 +0100608 unlet $PROMPT_COMMAND
Bram Moolenaara4dc6f92020-07-12 19:52:36 +0200609 let $PS1 = 'vim> '
Bram Moolenaar452143c2020-07-15 17:38:21 +0200610 terminal ++rows=4
Bram Moolenaar35910f22020-07-12 19:24:10 +0200611 $wincmd w
612 let winid = popup_create(['1111', '2222'], #{
613 \ drag: 1,
614 \ resize: 1,
615 \ border: [],
616 \ line: 3,
617 \ })
Bram Moolenaar452143c2020-07-15 17:38:21 +0200618 func DragitLeft()
Bram Moolenaar35910f22020-07-12 19:24:10 +0200619 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
620 endfunc
Bram Moolenaar452143c2020-07-15 17:38:21 +0200621 func DragitDown()
622 call feedkeys("\<F4>\<LeftMouse>\<F5>\<LeftDrag>\<LeftRelease>", "xt")
623 endfunc
624 func DragitDownLeft()
625 call feedkeys("\<F5>\<LeftMouse>\<F6>\<LeftDrag>\<LeftRelease>", "xt")
626 endfunc
Bram Moolenaar35910f22020-07-12 19:24:10 +0200627 map <silent> <F3> :call test_setmouse(3, &columns / 2)<CR>
628 map <silent> <F4> :call test_setmouse(3, &columns / 2 - 20)<CR>
Bram Moolenaar452143c2020-07-15 17:38:21 +0200629 map <silent> <F5> :call test_setmouse(12, &columns / 2)<CR>
630 map <silent> <F6> :call test_setmouse(12, &columns / 2 - 20)<CR>
Bram Moolenaar35910f22020-07-12 19:24:10 +0200631 END
632 call writefile(lines, 'XtestPopupTerm')
Bram Moolenaar452143c2020-07-15 17:38:21 +0200633 let buf = RunVimInTerminal('-S XtestPopupTerm', #{rows: 16})
Bram Moolenaar35910f22020-07-12 19:24:10 +0200634 call VerifyScreenDump(buf, 'Test_popupwin_term_01', {})
635
Bram Moolenaar452143c2020-07-15 17:38:21 +0200636 call term_sendkeys(buf, ":call DragitLeft()\<CR>")
Bram Moolenaar35910f22020-07-12 19:24:10 +0200637 call VerifyScreenDump(buf, 'Test_popupwin_term_02', {})
638
Bram Moolenaar452143c2020-07-15 17:38:21 +0200639 call term_sendkeys(buf, ":call DragitDown()\<CR>")
640 call VerifyScreenDump(buf, 'Test_popupwin_term_03', {})
641
642 call term_sendkeys(buf, ":call DragitDownLeft()\<CR>")
643 call VerifyScreenDump(buf, 'Test_popupwin_term_04', {})
644
Bram Moolenaar35910f22020-07-12 19:24:10 +0200645 " clean up
646 call StopVimInTerminal(buf)
647 call delete('XtestPopupTerm')
648endfunc
649
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200650func Test_popup_close_with_mouse()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200651 CheckScreendump
652
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200653 let lines =<< trim END
654 call setline(1, range(1, 20))
655 " With border, can click on X
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200656 let winid = popup_create('foobar', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200657 \ close: 'button',
658 \ border: [],
659 \ line: 1,
660 \ col: 1,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200661 \ })
662 func CloseMsg(id, result)
663 echomsg 'Popup closed with ' .. a:result
664 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200665 let winid = popup_create('notification', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200666 \ close: 'click',
667 \ line: 3,
668 \ col: 15,
669 \ callback: 'CloseMsg',
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200670 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200671 let winid = popup_create('no border here', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200672 \ close: 'button',
673 \ line: 5,
674 \ col: 3,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200675 \ })
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200676 let winid = popup_create('only padding', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200677 \ close: 'button',
678 \ padding: [],
679 \ line: 5,
680 \ col: 23,
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200681 \ })
682 func CloseWithX()
683 call feedkeys("\<F3>\<LeftMouse>\<LeftRelease>", "xt")
684 endfunc
685 map <silent> <F3> :call test_setmouse(1, len('foobar') + 2)<CR>
686 func CloseWithClick()
687 call feedkeys("\<F4>\<LeftMouse>\<LeftRelease>", "xt")
688 endfunc
689 map <silent> <F4> :call test_setmouse(3, 17)<CR>
Bram Moolenaarf6396232019-08-24 19:36:00 +0200690 func CreateWithMenuFilter()
691 let winid = popup_create('barfoo', #{
692 \ close: 'button',
693 \ filter: 'popup_filter_menu',
694 \ border: [],
695 \ line: 1,
696 \ col: 40,
697 \ })
698 endfunc
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200699 END
700 call writefile(lines, 'XtestPopupClose')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200701 let buf = RunVimInTerminal('-S XtestPopupClose', #{rows: 10})
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200702 call VerifyScreenDump(buf, 'Test_popupwin_close_01', {})
703
704 call term_sendkeys(buf, ":call CloseWithX()\<CR>")
705 call VerifyScreenDump(buf, 'Test_popupwin_close_02', {})
706
707 call term_sendkeys(buf, ":call CloseWithClick()\<CR>")
708 call VerifyScreenDump(buf, 'Test_popupwin_close_03', {})
709
Bram Moolenaarf6396232019-08-24 19:36:00 +0200710 call term_sendkeys(buf, ":call CreateWithMenuFilter()\<CR>")
711 call VerifyScreenDump(buf, 'Test_popupwin_close_04', {})
712
713 " We have to send the actual mouse code, feedkeys() would be caught the
714 " filter.
715 call term_sendkeys(buf, "\<Esc>[<0;47;1M")
716 call VerifyScreenDump(buf, 'Test_popupwin_close_05', {})
717
Bram Moolenaar2e62b562019-06-30 18:07:00 +0200718 " clean up
719 call StopVimInTerminal(buf)
720 call delete('XtestPopupClose')
721endfunction
722
Bram Moolenaar7b3d9392019-10-16 22:17:07 +0200723func Test_popup_menu_wrap()
724 CheckScreendump
725
726 let lines =<< trim END
727 call setline(1, range(1, 20))
728 call popup_create([
729 \ 'one',
730 \ 'asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfas',
731 \ 'three',
732 \ 'four',
733 \ ], #{
734 \ pos: "botleft",
735 \ border: [],
736 \ padding: [0,1,0,1],
737 \ maxheight: 3,
738 \ cursorline: 1,
739 \ filter: 'popup_filter_menu',
740 \ })
741 END
742 call writefile(lines, 'XtestPopupWrap')
743 let buf = RunVimInTerminal('-S XtestPopupWrap', #{rows: 10})
744 call VerifyScreenDump(buf, 'Test_popupwin_wrap_1', {})
745
746 call term_sendkeys(buf, "jj")
747 call VerifyScreenDump(buf, 'Test_popupwin_wrap_2', {})
748
749 " clean up
750 call term_sendkeys(buf, "\<Esc>")
751 call StopVimInTerminal(buf)
752 call delete('XtestPopupWrap')
753endfunction
754
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200755func Test_popup_with_mask()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200756 CheckScreendump
757
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200758 let lines =<< trim END
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200759 call setline(1, repeat([join(range(1, 42), '')], 13))
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200760 hi PopupColor ctermbg=lightgrey
761 let winid = popup_create([
762 \ 'some text',
763 \ 'another line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200764 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200765 \ line: 1,
766 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100767 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200768 \ wrap: 0,
769 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200770 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200771 \ zindex: 90,
772 \ padding: [],
773 \ highlight: 'PopupColor',
774 \ mask: [[1,1,1,1], [-5,-1,4,4], [7,9,2,3], [2,4,3,3]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200775 call popup_create([
776 \ 'xxxxxxxxx',
777 \ 'yyyyyyyyy',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200778 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200779 \ line: 3,
780 \ col: 18,
781 \ zindex: 20})
Bram Moolenaarba45f1f2019-07-03 22:50:41 +0200782 let winidb = popup_create([
783 \ 'just one line',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200784 \], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200785 \ line: 7,
786 \ col: 10,
Bram Moolenaar638a4a72019-11-06 19:25:22 +0100787 \ posinvert: 0,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200788 \ wrap: 0,
789 \ fixed: 1,
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +0200790 \ scrollbar: v:false,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200791 \ close: 'button',
792 \ zindex: 90,
793 \ padding: [],
794 \ border: [],
795 \ mask: [[1,2,1,1], [-5,-1,4,4], [7,9,2,3], [3,5,5,5],[-7,-4,5,5]]})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200796 END
797 call writefile(lines, 'XtestPopupMask')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200798 let buf = RunVimInTerminal('-S XtestPopupMask', #{rows: 13})
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200799 call VerifyScreenDump(buf, 'Test_popupwin_mask_1', {})
800
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200801 call term_sendkeys(buf, ":call popup_move(winid, #{col: 11, line: 2})\<CR>")
802 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200803 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200804 call VerifyScreenDump(buf, 'Test_popupwin_mask_2', {})
805
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200806 call term_sendkeys(buf, ":call popup_move(winid, #{col: 65, line: 2})\<CR>")
807 call term_sendkeys(buf, ":call popup_move(winidb, #{col: 63})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200808 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200809 call VerifyScreenDump(buf, 'Test_popupwin_mask_3', {})
810
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200811 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 2})\<CR>")
812 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topright', col: 12})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200813 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaard529ba52019-07-02 23:13:53 +0200814 call VerifyScreenDump(buf, 'Test_popupwin_mask_4', {})
815
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200816 call term_sendkeys(buf, ":call popup_move(winid, #{pos: 'topright', col: 12, line: 11})\<CR>")
817 call term_sendkeys(buf, ":call popup_move(winidb, #{pos: 'topleft', col: 42, line: 11})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +0200818 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaarb4207472019-07-12 16:05:45 +0200819 call VerifyScreenDump(buf, 'Test_popupwin_mask_5', {})
820
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200821 " clean up
822 call StopVimInTerminal(buf)
823 call delete('XtestPopupMask')
Bram Moolenaar4012d262020-12-29 11:57:46 +0100824
825 " this was causing a crash
826 call popup_create('test', #{mask: [[0, 0, 0, 0]]})
827 call popup_clear()
Bram Moolenaar10ccfb22021-02-13 21:31:18 +0100828
829 " this was causing an internal error
830 enew
831 set nowrap
832 call repeat('x', &columns)->setline(1)
833 call prop_type_add('textprop', {})
834 call prop_add(1, 1, #{length: &columns, type: 'textprop'})
835 vsplit
836 let opts = popup_create('', #{textprop: 'textprop'})
837 \ ->popup_getoptions()
838 \ ->extend(#{mask: [[1, 1, 1, 1]]})
839 call popup_create('', opts)
840 redraw
841
842 close!
843 bwipe!
844 call prop_type_delete('textprop')
845 call popup_clear()
846 set wrap&
Bram Moolenaare7eb9272019-06-24 00:58:07 +0200847endfunc
848
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200849func Test_popup_select()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +0200850 CheckScreendump
851 CheckFeature clipboard_working
852
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200853 " create a popup with some text to be selected
854 let lines =<< trim END
Bram Moolenaar1755ec42019-06-15 13:13:54 +0200855 set clipboard=autoselect
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200856 call setline(1, range(1, 20))
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200857 let winid = popup_create(['the word', 'some more', 'several words here', 'invisible', '5', '6', '7'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +0200858 \ drag: 1,
859 \ border: [],
860 \ line: 3,
861 \ col: 10,
Bram Moolenaar4dd751b2019-08-17 19:10:53 +0200862 \ maxheight: 3,
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200863 \ })
864 func Select1()
865 call feedkeys("\<F3>\<LeftMouse>\<F4>\<LeftDrag>\<LeftRelease>", "xt")
866 endfunc
867 map <silent> <F3> :call test_setmouse(4, 15)<CR>
868 map <silent> <F4> :call test_setmouse(6, 23)<CR>
869 END
870 call writefile(lines, 'XtestPopupSelect')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200871 let buf = RunVimInTerminal('-S XtestPopupSelect', #{rows: 10})
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200872 call term_sendkeys(buf, ":call Select1()\<CR>")
873 call VerifyScreenDump(buf, 'Test_popupwin_select_01', {})
874
875 call term_sendkeys(buf, ":call popup_close(winid)\<CR>")
876 call term_sendkeys(buf, "\"*p")
Bram Moolenaar8ccabf62019-07-12 18:12:51 +0200877 " clean the command line, sometimes it still shows a command
878 call term_sendkeys(buf, ":\<esc>")
879
Bram Moolenaarbd75b532019-06-14 23:41:55 +0200880 call VerifyScreenDump(buf, 'Test_popupwin_select_02', {})
881
882 " clean up
883 call StopVimInTerminal(buf)
884 call delete('XtestPopupSelect')
885endfunc
886
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200887func Test_popup_in_tab()
888 " default popup is local to tab, not visible when in other tab
889 let winid = popup_create("text", {})
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200890 let bufnr = winbufnr(winid)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200891 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200892 call assert_equal(0, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200893 tabnew
894 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200895 call assert_equal(1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200896 quit
897 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200898
899 call assert_equal(1, bufexists(bufnr))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200900 call popup_clear()
Bram Moolenaar7c7f01e2019-06-12 21:06:32 +0200901 " buffer is gone now
902 call assert_equal(0, bufexists(bufnr))
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200903
904 " global popup is visible in any tab
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200905 let winid = popup_create("text", #{tabpage: -1})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200906 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200907 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200908 tabnew
909 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaara3fce622019-06-20 02:31:49 +0200910 call assert_equal(-1, popup_getoptions(winid).tabpage)
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200911 quit
912 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200913 call popup_clear()
Bram Moolenaara3fce622019-06-20 02:31:49 +0200914
915 " create popup in other tab
916 tabnew
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200917 let winid = popup_create("text", #{tabpage: 1})
Bram Moolenaara3fce622019-06-20 02:31:49 +0200918 call assert_equal(0, popup_getpos(winid).visible)
919 call assert_equal(1, popup_getoptions(winid).tabpage)
920 quit
921 call assert_equal(1, popup_getpos(winid).visible)
922 call assert_equal(0, popup_getoptions(winid).tabpage)
923 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200924endfunc
925
926func Test_popup_valid_arguments()
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200927 call assert_equal(0, len(popup_list()))
928
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200929 " Zero value is like the property wasn't there
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200930 let winid = popup_create("text", #{col: 0})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200931 let pos = popup_getpos(winid)
932 call assert_inrange(&columns / 2 - 1, &columns / 2 + 1, pos.col)
Bram Moolenaaref6b9792020-05-13 16:34:15 +0200933 call assert_equal([winid], popup_list())
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200934 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200935
936 " using cursor column has minimum value of 1
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200937 let winid = popup_create("text", #{col: 'cursor-100'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200938 let pos = popup_getpos(winid)
939 call assert_equal(1, pos.col)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200940 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200941
942 " center
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200943 let winid = popup_create("text", #{pos: 'center'})
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200944 let pos = popup_getpos(winid)
945 let around = (&columns - pos.width) / 2
946 call assert_inrange(around - 1, around + 1, pos.col)
947 let around = (&lines - pos.height) / 2
948 call assert_inrange(around - 1, around + 1, pos.line)
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200949 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200950endfunc
951
952func Test_popup_invalid_arguments()
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +0200953 call assert_fails('call popup_create(666, {})', 'E86:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200954 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200955 call assert_fails('call popup_create("text", "none")', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200956 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +0200957 call assert_fails('call popup_create(test_null_string(), {})', 'E450:')
958 call assert_fails('call popup_create(test_null_list(), {})', 'E450:')
959 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200960
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200961 call assert_fails('call popup_create("text", #{col: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200962 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200963 call assert_fails('call popup_create("text", #{col: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200964 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200965 call assert_fails('call popup_create("text", #{col: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200966 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200967 call assert_fails('call popup_create("text", #{col: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200968 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200969
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200970 call assert_fails('call popup_create("text", #{line: "xxx"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200971 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200972 call assert_fails('call popup_create("text", #{line: "cursor8"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200973 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200974 call assert_fails('call popup_create("text", #{line: "cursor+x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200975 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200976 call assert_fails('call popup_create("text", #{line: "cursor+8x"})', 'E15:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200977 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200978
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200979 call assert_fails('call popup_create("text", #{pos: "there"})', 'E475:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200980 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200981 call assert_fails('call popup_create("text", #{padding: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200982 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200983 call assert_fails('call popup_create("text", #{border: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200984 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200985 call assert_fails('call popup_create("text", #{borderhighlight: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200986 call popup_clear()
Bram Moolenaar403d0902019-07-17 21:37:32 +0200987 call assert_fails('call popup_create("text", #{borderhighlight: test_null_list()})', 'E714:')
988 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200989 call assert_fails('call popup_create("text", #{borderchars: "none"})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200990 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +0200991
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200992 call assert_fails('call popup_create([#{text: "text"}, 666], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200993 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200994 call assert_fails('call popup_create([#{text: "text", props: "none"}], {})', 'E714:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200995 call popup_clear()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +0200996 call assert_fails('call popup_create([#{text: "text", props: ["none"]}], {})', 'E715:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +0200997 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +0100998 call assert_fails('call popup_create([#{text: "text", props: range(3)}], {})', 'E715:')
999 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001000 call assert_fails('call popup_create("text", #{mask: ["asdf"]})', 'E475:')
1001 call popup_clear()
Bram Moolenaarb0992022020-01-30 14:55:42 +01001002 call assert_fails('call popup_create("text", #{mask: range(5)})', 'E475:')
1003 call popup_clear()
1004 call popup_create("text", #{mask: [range(4)]})
1005 call popup_clear()
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001006 call assert_fails('call popup_create("text", #{mask: test_null_list()})', 'E475:')
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001007 call assert_fails('call popup_create("text", #{mapping: []})', 'E745:')
Bram Moolenaarcfdbc5a2019-07-17 21:27:52 +02001008 call popup_clear()
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001009 call assert_fails('call popup_create("text", #{tabpage : 4})', 'E997:')
1010 call popup_clear()
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001011endfunc
1012
Bram Moolenaareea16992019-05-31 17:34:48 +02001013func Test_win_execute_closing_curwin()
1014 split
1015 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001016 call assert_fails('call win_execute(winid, winnr() .. "close")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001017 call popup_clear()
Bram Moolenaar49540192019-12-11 19:34:54 +01001018
1019 let winid = popup_create('some text', {})
Bram Moolenaare2e40752020-09-04 21:18:46 +02001020 call assert_fails('call win_execute(winid, printf("normal! :\<C-u>call popup_close(%d)\<CR>", winid))', 'E994:')
Bram Moolenaar49540192019-12-11 19:34:54 +01001021 call popup_clear()
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001022endfunc
1023
1024func Test_win_execute_not_allowed()
1025 let winid = popup_create('some text', {})
1026 call assert_fails('call win_execute(winid, "split")', 'E994:')
1027 call assert_fails('call win_execute(winid, "vsplit")', 'E994:')
1028 call assert_fails('call win_execute(winid, "close")', 'E994:')
1029 call assert_fails('call win_execute(winid, "bdelete")', 'E994:')
Bram Moolenaar2d247842019-06-01 17:06:25 +02001030 call assert_fails('call win_execute(winid, "bwipe!")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001031 call assert_fails('call win_execute(winid, "tabnew")', 'E994:')
1032 call assert_fails('call win_execute(winid, "tabnext")', 'E994:')
1033 call assert_fails('call win_execute(winid, "next")', 'E994:')
1034 call assert_fails('call win_execute(winid, "rewind")', 'E994:')
Bram Moolenaar3a2505c2020-03-09 16:40:41 +01001035 call assert_fails('call win_execute(winid, "pedit filename")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001036 call assert_fails('call win_execute(winid, "buf")', 'E994:')
Bram Moolenaar3029bcc2020-01-18 15:06:19 +01001037 call assert_fails('call win_execute(winid, "bnext")', 'E994:')
1038 call assert_fails('call win_execute(winid, "bprev")', 'E994:')
1039 call assert_fails('call win_execute(winid, "bfirst")', 'E994:')
1040 call assert_fails('call win_execute(winid, "blast")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001041 call assert_fails('call win_execute(winid, "edit")', 'E994:')
1042 call assert_fails('call win_execute(winid, "enew")', 'E994:')
Bram Moolenaar5d3c9f82020-06-26 20:41:39 +02001043 call assert_fails('call win_execute(winid, "help")', 'E994:')
1044 call assert_fails('call win_execute(winid, "1only")', 'E994:')
Bram Moolenaar815b76b2019-06-01 14:15:52 +02001045 call assert_fails('call win_execute(winid, "wincmd x")', 'E994:')
1046 call assert_fails('call win_execute(winid, "wincmd w")', 'E994:')
1047 call assert_fails('call win_execute(winid, "wincmd t")', 'E994:')
1048 call assert_fails('call win_execute(winid, "wincmd b")', 'E994:')
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001049 call popup_clear()
Bram Moolenaareea16992019-05-31 17:34:48 +02001050endfunc
1051
Bram Moolenaar402502d2019-05-30 22:07:36 +02001052func Test_popup_with_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001053 CheckScreendump
1054
Bram Moolenaar402502d2019-05-30 22:07:36 +02001055 let lines =<< trim END
1056 call setline(1, range(1, 100))
1057 let winid = popup_create(
1058 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001059 \ #{line: 3, col: 20, maxwidth: 10, wrap: 1})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001060 END
1061 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001062 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001063 call VerifyScreenDump(buf, 'Test_popupwin_wrap', {})
1064
1065 " clean up
1066 call StopVimInTerminal(buf)
1067 call delete('XtestPopup')
1068endfunc
1069
1070func Test_popup_without_wrap()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001071 CheckScreendump
1072
Bram Moolenaar402502d2019-05-30 22:07:36 +02001073 let lines =<< trim END
1074 call setline(1, range(1, 100))
1075 let winid = popup_create(
1076 \ 'a long line that wont fit',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001077 \ #{line: 3, col: 20, maxwidth: 10, wrap: 0})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001078 END
1079 call writefile(lines, 'XtestPopup')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001080 let buf = RunVimInTerminal('-S XtestPopup', #{rows: 10})
Bram Moolenaar402502d2019-05-30 22:07:36 +02001081 call VerifyScreenDump(buf, 'Test_popupwin_nowrap', {})
1082
1083 " clean up
1084 call StopVimInTerminal(buf)
1085 call delete('XtestPopup')
1086endfunc
1087
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001088func Test_popup_with_showbreak()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001089 CheckScreendump
1090
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001091 let lines =<< trim END
1092 set showbreak=>>\
1093 call setline(1, range(1, 20))
1094 let winid = popup_dialog(
Bram Moolenaar8ae54372019-09-15 18:11:16 +02001095 \ 'a long line here that wraps',
1096 \ #{filter: 'popup_filter_yesno',
1097 \ maxwidth: 12})
Bram Moolenaar331bafd2019-07-20 17:46:05 +02001098 END
1099 call writefile(lines, 'XtestPopupShowbreak')
1100 let buf = RunVimInTerminal('-S XtestPopupShowbreak', #{rows: 10})
1101 call VerifyScreenDump(buf, 'Test_popupwin_showbreak', {})
1102
1103 " clean up
1104 call term_sendkeys(buf, "y")
1105 call StopVimInTerminal(buf)
1106 call delete('XtestPopupShowbreak')
1107endfunc
1108
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001109func Test_popup_time()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001110 CheckFeature timers
1111
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001112 topleft vnew
1113 call setline(1, 'hello')
1114
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001115 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001116 \ line: 1,
1117 \ col: 1,
1118 \ minwidth: 20,
1119 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001120 \})
1121 redraw
1122 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1123 call assert_equal('world', line)
1124
Bram Moolenaarb4f06282019-07-12 21:07:54 +02001125 call assert_equal(winid, popup_locate(1, 1))
1126 call assert_equal(winid, popup_locate(1, 20))
1127 call assert_equal(0, popup_locate(1, 21))
1128 call assert_equal(0, popup_locate(2, 1))
1129
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001130 sleep 700m
Bram Moolenaar35d5af62019-05-26 20:44:10 +02001131 redraw
Bram Moolenaar196b4662019-09-06 21:34:30 +02001132 let line = join(map(range(1, 5), '1->screenstring(v:val)'), '')
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001133 call assert_equal('hello', line)
1134
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001135 call popup_create('on the command line', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001136 \ line: &lines,
1137 \ col: 10,
1138 \ minwidth: 20,
1139 \ time: 500,
Bram Moolenaar51fe3b12019-05-26 20:10:06 +02001140 \})
1141 redraw
1142 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1143 call assert_match('.*on the command line.*', line)
1144
1145 sleep 700m
1146 redraw
1147 let line = join(map(range(1, 30), 'screenstring(&lines, v:val)'), '')
1148 call assert_notmatch('.*on the command line.*', line)
1149
1150 bwipe!
1151endfunc
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001152
1153func Test_popup_hide()
1154 topleft vnew
1155 call setline(1, 'hello')
1156
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001157 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001158 \ line: 1,
1159 \ col: 1,
1160 \ minwidth: 20,
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001161 \})
1162 redraw
1163 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1164 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001165 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001166 " buffer is still listed and active
1167 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001168
1169 call popup_hide(winid)
1170 redraw
1171 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1172 call assert_equal('hello', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001173 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarc6896e22019-05-30 22:32:34 +02001174 " buffer is still listed but hidden
Bram Moolenaarca7c0782020-01-14 20:42:48 +01001175 call assert_match(winbufnr(winid) .. 'u a.*\[Popup\]', execute('ls u'))
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001176
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001177 eval winid->popup_show()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001178 redraw
1179 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1180 call assert_equal('world', line)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001181 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001182
1183
1184 call popup_close(winid)
1185 redraw
1186 let line = join(map(range(1, 5), 'screenstring(1, v:val)'), '')
1187 call assert_equal('hello', line)
1188
1189 " error is given for existing non-popup window
1190 call assert_fails('call popup_hide(win_getid())', 'E993:')
1191
1192 " no error non-existing window
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001193 eval 1234234->popup_hide()
Bram Moolenaar2cd0dce2019-05-26 22:17:52 +02001194 call popup_show(41234234)
1195
1196 bwipe!
1197endfunc
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001198
1199func Test_popup_move()
1200 topleft vnew
1201 call setline(1, 'hello')
1202
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001203 let winid = popup_create('world', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001204 \ line: 1,
1205 \ col: 1,
1206 \ minwidth: 20,
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001207 \})
1208 redraw
1209 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1210 call assert_equal('world ', line)
1211
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001212 call popup_move(winid, #{line: 2, col: 2})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001213 redraw
1214 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1215 call assert_equal('hello ', line)
1216 let line = join(map(range(1, 6), 'screenstring(2, v:val)'), '')
1217 call assert_equal('~world', line)
1218
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001219 eval winid->popup_move(#{line: 1})
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001220 redraw
1221 let line = join(map(range(1, 6), 'screenstring(1, v:val)'), '')
1222 call assert_equal('hworld', line)
1223
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001224 call assert_fails('call popup_move(winid, [])', 'E715:')
1225 call assert_fails('call popup_move(winid, test_null_dict())', 'E715:')
1226
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001227 call popup_close(winid)
1228
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02001229 call assert_equal(0, popup_move(-1, {}))
1230
Bram Moolenaar60cdb302019-05-27 21:54:10 +02001231 bwipe!
1232endfunc
Bram Moolenaarbc133542019-05-29 20:26:46 +02001233
Bram Moolenaar402502d2019-05-30 22:07:36 +02001234func Test_popup_getpos()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001235 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001236 \ line: 2,
1237 \ col: 3,
1238 \ minwidth: 10,
1239 \ minheight: 11,
Bram Moolenaarbc133542019-05-29 20:26:46 +02001240 \})
1241 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001242 let res = popup_getpos(winid)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001243 call assert_equal(2, res.line)
1244 call assert_equal(3, res.col)
1245 call assert_equal(10, res.width)
1246 call assert_equal(11, res.height)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001247 call assert_equal(1, res.visible)
Bram Moolenaarbc133542019-05-29 20:26:46 +02001248
1249 call popup_close(winid)
1250endfunc
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001251
1252func Test_popup_width_longest()
1253 let tests = [
1254 \ [['hello', 'this', 'window', 'displays', 'all of its text'], 15],
1255 \ [['hello', 'this', 'window', 'all of its text', 'displays'], 15],
1256 \ [['hello', 'this', 'all of its text', 'window', 'displays'], 15],
1257 \ [['hello', 'all of its text', 'this', 'window', 'displays'], 15],
1258 \ [['all of its text', 'hello', 'this', 'window', 'displays'], 15],
1259 \ ]
1260
1261 for test in tests
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001262 let winid = popup_create(test[0], #{line: 2, col: 3})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001263 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001264 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001265 call assert_equal(test[1], position.width)
1266 call popup_close(winid)
1267 endfor
1268endfunc
1269
1270func Test_popup_wraps()
1271 let tests = [
1272 \ ['nowrap', 6, 1],
1273 \ ['a line that wraps once', 12, 2],
1274 \ ['a line that wraps two times', 12, 3],
1275 \ ]
1276 for test in tests
1277 let winid = popup_create(test[0],
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001278 \ #{line: 2, col: 3, maxwidth: 12})
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001279 redraw
Bram Moolenaar402502d2019-05-30 22:07:36 +02001280 let position = popup_getpos(winid)
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001281 call assert_equal(test[1], position.width)
1282 call assert_equal(test[2], position.height)
1283
1284 call popup_close(winid)
Bram Moolenaar402502d2019-05-30 22:07:36 +02001285 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar88c4e1f2019-05-29 23:14:28 +02001286 endfor
1287endfunc
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001288
1289func Test_popup_getoptions()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001290 let winid = popup_create('hello', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001291 \ line: 2,
1292 \ col: 3,
1293 \ minwidth: 10,
1294 \ minheight: 11,
1295 \ maxwidth: 20,
1296 \ maxheight: 21,
1297 \ zindex: 100,
1298 \ time: 5000,
1299 \ fixed: 1
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001300 \})
1301 redraw
1302 let res = popup_getoptions(winid)
1303 call assert_equal(2, res.line)
1304 call assert_equal(3, res.col)
1305 call assert_equal(10, res.minwidth)
1306 call assert_equal(11, res.minheight)
1307 call assert_equal(20, res.maxwidth)
1308 call assert_equal(21, res.maxheight)
1309 call assert_equal(100, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001310 call assert_equal(1, res.fixed)
Bram Moolenaarb8350ab2019-08-04 17:59:49 +02001311 call assert_equal(1, res.mapping)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001312 if has('timers')
1313 call assert_equal(5000, res.time)
1314 endif
1315 call popup_close(winid)
1316
1317 let winid = popup_create('hello', {})
1318 redraw
1319 let res = popup_getoptions(winid)
1320 call assert_equal(0, res.line)
1321 call assert_equal(0, res.col)
1322 call assert_equal(0, res.minwidth)
1323 call assert_equal(0, res.minheight)
1324 call assert_equal(0, res.maxwidth)
1325 call assert_equal(0, res.maxheight)
1326 call assert_equal(50, res.zindex)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001327 call assert_equal(0, res.fixed)
Bram Moolenaar8c2a6002019-05-30 14:29:45 +02001328 if has('timers')
1329 call assert_equal(0, res.time)
1330 endif
1331 call popup_close(winid)
1332 call assert_equal({}, popup_getoptions(winid))
1333endfunc
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001334
1335func Test_popup_option_values()
1336 new
1337 " window-local
1338 setlocal number
1339 setlocal nowrap
1340 " buffer-local
1341 setlocal omnifunc=Something
1342 " global/buffer-local
1343 setlocal path=/there
1344 " global/window-local
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001345 setlocal statusline=2
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001346
1347 let winid = popup_create('hello', {})
1348 call assert_equal(0, getwinvar(winid, '&number'))
1349 call assert_equal(1, getwinvar(winid, '&wrap'))
1350 call assert_equal('', getwinvar(winid, '&omnifunc'))
1351 call assert_equal(&g:path, getwinvar(winid, '&path'))
Bram Moolenaara112f2d2019-09-01 17:38:09 +02001352 call assert_equal(&g:statusline, getwinvar(winid, '&statusline'))
1353
1354 " 'scrolloff' is reset to zero
1355 call assert_equal(5, &scrolloff)
1356 call assert_equal(0, getwinvar(winid, '&scrolloff'))
Bram Moolenaarcacc6a52019-05-30 15:22:43 +02001357
1358 call popup_close(winid)
1359 bwipe
1360endfunc
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001361
1362func Test_popup_atcursor()
1363 topleft vnew
1364 call setline(1, [
1365 \ 'xxxxxxxxxxxxxxxxx',
1366 \ 'xxxxxxxxxxxxxxxxx',
1367 \ 'xxxxxxxxxxxxxxxxx',
1368 \])
1369
1370 call cursor(2, 2)
1371 redraw
1372 let winid = popup_atcursor('vim', {})
1373 redraw
1374 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1375 call assert_equal('xvimxxxxxxxxxxxxx', line)
1376 call popup_close(winid)
1377
1378 call cursor(3, 4)
1379 redraw
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001380 let winid = 'vim'->popup_atcursor({})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001381 redraw
1382 let line = join(map(range(1, 17), 'screenstring(2, v:val)'), '')
1383 call assert_equal('xxxvimxxxxxxxxxxx', line)
1384 call popup_close(winid)
1385
1386 call cursor(1, 1)
1387 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001388 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001389 \ line: 'cursor+2',
1390 \ col: 'cursor+1',
1391 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001392 redraw
1393 let line = join(map(range(1, 17), 'screenstring(3, v:val)'), '')
1394 call assert_equal('xvimxxxxxxxxxxxxx', line)
1395 call popup_close(winid)
1396
1397 call cursor(3, 3)
1398 redraw
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001399 let winid = popup_create('vim', #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001400 \ line: 'cursor-2',
1401 \ col: 'cursor-1',
1402 \})
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001403 redraw
1404 let line = join(map(range(1, 17), 'screenstring(1, v:val)'), '')
1405 call assert_equal('xvimxxxxxxxxxxxxx', line)
1406 call popup_close(winid)
1407
Bram Moolenaar402502d2019-05-30 22:07:36 +02001408 " just enough room above
1409 call cursor(3, 3)
1410 redraw
1411 let winid = popup_atcursor(['vim', 'is great'], {})
1412 redraw
1413 let pos = popup_getpos(winid)
1414 call assert_equal(1, pos.line)
1415 call popup_close(winid)
1416
1417 " not enough room above, popup goes below the cursor
1418 call cursor(3, 3)
1419 redraw
1420 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1421 redraw
1422 let pos = popup_getpos(winid)
1423 call assert_equal(4, pos.line)
1424 call popup_close(winid)
1425
Bram Moolenaarb0ebbda2019-06-02 16:51:21 +02001426 " cursor in first line, popup in line 2
1427 call cursor(1, 1)
1428 redraw
1429 let winid = popup_atcursor(['vim', 'is', 'great'], {})
1430 redraw
1431 let pos = popup_getpos(winid)
1432 call assert_equal(2, pos.line)
1433 call popup_close(winid)
1434
Bram Moolenaarcc31ad92019-05-30 19:25:06 +02001435 bwipe!
1436endfunc
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001437
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001438func Test_popup_atcursor_pos()
1439 CheckScreendump
Dominique Pellec60e9592021-07-03 21:41:38 +02001440 CheckFeature conceal
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001441
1442 let lines =<< trim END
1443 call setline(1, repeat([repeat('-', 60)], 15))
1444 set so=0
1445
1446 normal 9G3|r#
1447 let winid1 = popup_atcursor(['first', 'second'], #{
1448 \ moved: [0, 0, 0],
1449 \ })
1450 normal 9G21|r&
1451 let winid1 = popup_atcursor(['FIrsT', 'SEcoND'], #{
1452 \ pos: 'botright',
1453 \ moved: [0, 0, 0],
1454 \ })
1455 normal 3G27|r%
1456 let winid1 = popup_atcursor(['fiRSt', 'seCOnd'], #{
1457 \ pos: 'topleft',
1458 \ moved: [0, 0, 0],
1459 \ })
1460 normal 3G45|r@
1461 let winid1 = popup_atcursor(['First', 'SeconD'], #{
1462 \ pos: 'topright',
Bram Moolenaarb0992022020-01-30 14:55:42 +01001463 \ moved: range(3),
1464 \ mousemoved: range(3),
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001465 \ })
Bram Moolenaarea042672021-06-29 20:22:32 +02001466
1467 normal 9G27|Rconcealed X
1468 syn match Hidden /concealed/ conceal
1469 set conceallevel=2 concealcursor=n
1470 redraw
1471 normal 0fX
1472 call popup_atcursor('mark', {})
Bram Moolenaar4dd8fe02019-11-09 15:33:31 +01001473 END
1474 call writefile(lines, 'XtestPopupAtcursorPos')
1475 let buf = RunVimInTerminal('-S XtestPopupAtcursorPos', #{rows: 12})
1476 call VerifyScreenDump(buf, 'Test_popupwin_atcursor_pos', {})
1477
1478 " clean up
1479 call StopVimInTerminal(buf)
1480 call delete('XtestPopupAtcursorPos')
1481endfunc
1482
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001483func Test_popup_beval()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001484 CheckScreendump
Bram Moolenaar1e82a782019-09-21 22:57:06 +02001485 CheckFeature balloon_eval_term
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001486
1487 let lines =<< trim END
1488 call setline(1, range(1, 20))
1489 call setline(5, 'here is some text to hover over')
1490 set balloonevalterm
1491 set balloonexpr=BalloonExpr()
1492 set balloondelay=100
1493 func BalloonExpr()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001494 let s:winid = [v:beval_text]->popup_beval({})
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001495 return ''
1496 endfunc
1497 func Hover()
1498 call test_setmouse(5, 15)
1499 call feedkeys("\<MouseMove>\<Ignore>", "xt")
1500 sleep 100m
1501 endfunc
1502 func MoveOntoPopup()
1503 call test_setmouse(4, 17)
1504 call feedkeys("\<F4>\<MouseMove>\<Ignore>", "xt")
1505 endfunc
1506 func MoveAway()
1507 call test_setmouse(5, 13)
1508 call feedkeys("\<F5>\<MouseMove>\<Ignore>", "xt")
1509 endfunc
1510 END
1511 call writefile(lines, 'XtestPopupBeval')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001512 let buf = RunVimInTerminal('-S XtestPopupBeval', #{rows: 10})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02001513 call TermWait(buf, 50)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02001514 call term_sendkeys(buf, 'j')
1515 call term_sendkeys(buf, ":call Hover()\<CR>")
1516 call VerifyScreenDump(buf, 'Test_popupwin_beval_1', {})
1517
1518 call term_sendkeys(buf, ":call MoveOntoPopup()\<CR>")
1519 call VerifyScreenDump(buf, 'Test_popupwin_beval_2', {})
1520
1521 call term_sendkeys(buf, ":call MoveAway()\<CR>")
1522 call VerifyScreenDump(buf, 'Test_popupwin_beval_3', {})
1523
1524 " clean up
1525 call StopVimInTerminal(buf)
1526 call delete('XtestPopupBeval')
1527endfunc
1528
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001529func Test_popup_filter()
1530 new
1531 call setline(1, 'some text')
1532
1533 func MyPopupFilter(winid, c)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001534 if a:c == 'e' || a:c == "\<F9>"
1535 let g:eaten = a:c
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001536 return 1
1537 endif
1538 if a:c == '0'
1539 let g:ignored = '0'
1540 return 0
1541 endif
1542 if a:c == 'x'
1543 call popup_close(a:winid)
1544 return 1
1545 endif
1546 return 0
1547 endfunc
1548
Bram Moolenaar6a124e62019-09-04 18:15:19 +02001549 let winid = 'something'->popup_create(#{filter: 'MyPopupFilter'})
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001550 redraw
1551
1552 " e is consumed by the filter
Bram Moolenaar999db232021-07-04 14:00:55 +02001553 let g:eaten = ''
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001554 call feedkeys('e', 'xt')
1555 call assert_equal('e', g:eaten)
Bram Moolenaarec084d32020-02-28 22:44:47 +01001556 call feedkeys("\<F9>", 'xt')
1557 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001558
1559 " 0 is ignored by the filter
Bram Moolenaar999db232021-07-04 14:00:55 +02001560 let g:ignored = ''
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001561 normal $
1562 call assert_equal(9, getcurpos()[2])
1563 call feedkeys('0', 'xt')
1564 call assert_equal('0', g:ignored)
Bram Moolenaar999db232021-07-04 14:00:55 +02001565
1566 if has('win32') && has('gui_running')
1567 echo "FIXME: this check is very flaky on MS-Windows GUI, the cursor doesn't move"
1568 else
1569 call assert_equal(1, getcurpos()[2])
1570 endif
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001571
1572 " x closes the popup
1573 call feedkeys('x', 'xt')
Bram Moolenaarec084d32020-02-28 22:44:47 +01001574 call assert_equal("\<F9>", g:eaten)
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001575 call assert_equal(-1, winbufnr(winid))
1576
Bram Moolenaar999db232021-07-04 14:00:55 +02001577 unlet g:eaten
1578 unlet g:ignored
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001579 delfunc MyPopupFilter
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02001580 call popup_clear()
Bram Moolenaarbf0eff02019-06-01 17:13:36 +02001581endfunc
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001582
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001583" this tests that the filter is not used for :normal command
Bram Moolenaar189832b2020-09-23 12:29:11 +02001584func Test_popup_filter_normal_cmd()
1585 CheckScreendump
1586
1587 let lines =<< trim END
Bram Moolenaar4934ad02020-09-28 22:29:58 +02001588 let text = range(1, 20)->map({_, v -> string(v)})
1589 let g:winid = popup_create(text, #{maxheight: 5, minwidth: 3, filter: 'invalidfilter'})
1590 call timer_start(0, {-> win_execute(g:winid, 'norm! 10Gzz')})
Bram Moolenaar189832b2020-09-23 12:29:11 +02001591 END
1592 call writefile(lines, 'XtestPopupNormal')
1593 let buf = RunVimInTerminal('-S XtestPopupNormal', #{rows: 10})
1594 call TermWait(buf, 100)
1595 call VerifyScreenDump(buf, 'Test_popupwin_normal_cmd', {})
1596
1597 call StopVimInTerminal(buf)
1598 call delete('XtestPopupNormal')
1599endfunc
1600
Bram Moolenaar10476522020-09-24 22:57:31 +02001601" test that cursor line highlight is updated after using win_execute()
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001602func Test_popup_filter_win_execute()
1603 CheckScreendump
1604
1605 let lines =<< trim END
Bram Moolenaar10476522020-09-24 22:57:31 +02001606 let lines = range(1, &lines * 2)->map({_, v -> string(v)})
1607 let g:id = popup_create(lines, #{
1608 \ minheight: &lines - 5,
1609 \ maxheight: &lines - 5,
1610 \ cursorline: 1,
1611 \ })
1612 redraw
1613 END
1614 call writefile(lines, 'XtestPopupWinExecute')
1615 let buf = RunVimInTerminal('-S XtestPopupWinExecute', #{rows: 14})
1616
1617 call term_sendkeys(buf, ":call win_execute(g:id, ['normal 17Gzz'])\<CR>")
1618 call term_sendkeys(buf, ":\<CR>")
1619
1620 call VerifyScreenDump(buf, 'Test_popupwin_win_execute_cursorline', {})
1621
1622 call StopVimInTerminal(buf)
1623 call delete('XtestPopupWinExecute')
1624endfunc
1625
Bram Moolenaar3697c9b2020-09-26 22:03:00 +02001626func Test_popup_set_firstline()
1627 CheckScreendump
1628
1629 let lines =<< trim END
1630 let lines = range(1, 50)->map({_, v -> string(v)})
1631 let g:id = popup_create(lines, #{
1632 \ minwidth: 20,
1633 \ maxwidth: 20,
1634 \ minheight: &lines - 5,
1635 \ maxheight: &lines - 5,
1636 \ cursorline: 1,
1637 \ })
1638 call popup_setoptions(g:id, #{firstline: 10})
1639 redraw
1640 END
1641 call writefile(lines, 'XtestPopupWinSetFirstline')
1642 let buf = RunVimInTerminal('-S XtestPopupWinSetFirstline', #{rows: 16})
1643
1644 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_1', {})
1645
1646 call term_sendkeys(buf, ":call popup_setoptions(g:id, #{firstline: 5})\<CR>")
1647 call term_sendkeys(buf, ":\<CR>")
1648 call VerifyScreenDump(buf, 'Test_popupwin_set_firstline_2', {})
1649
1650 call StopVimInTerminal(buf)
1651 call delete('XtestPopupWinSetFirstline')
1652endfunc
1653
Bram Moolenaar10476522020-09-24 22:57:31 +02001654" this tests that we don't get stuck with an error in "win_execute()"
1655func Test_popup_filter_win_execute_error()
1656 CheckScreendump
1657
1658 let lines =<< trim END
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001659 let g:winid = popup_create('some text', {'filter': 'invalidfilter'})
1660 call timer_start(0, {-> win_execute(g:winid, 'invalidCommand')})
1661 END
Bram Moolenaar10476522020-09-24 22:57:31 +02001662 call writefile(lines, 'XtestPopupWinExecuteError')
1663 let buf = RunVimInTerminal('-S XtestPopupWinExecuteError', #{rows: 10, wait_for_ruler: 0})
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001664
1665 call WaitFor({-> term_getline(buf, 9) =~ 'Not an editor command: invalidCommand'})
1666 call term_sendkeys(buf, "\<CR>")
1667 call WaitFor({-> term_getline(buf, 9) =~ 'Unknown function: invalidfilter'})
1668 call term_sendkeys(buf, "\<CR>")
1669 call WaitFor({-> term_getline(buf, 9) =~ 'Not allowed in a popup window'})
1670 call term_sendkeys(buf, "\<CR>")
1671 call term_sendkeys(buf, "\<CR>")
1672 call VerifyScreenDump(buf, 'Test_popupwin_win_execute', {})
1673
1674 call StopVimInTerminal(buf)
Bram Moolenaar10476522020-09-24 22:57:31 +02001675 call delete('XtestPopupWinExecuteError')
Bram Moolenaar6bf1b522020-09-23 17:41:26 +02001676endfunc
1677
Bram Moolenaara42d9452019-06-15 21:46:30 +02001678func ShowDialog(key, result)
1679 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001680 let winid = popup_dialog('do you want to quit (Yes/no)?', #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001681 \ filter: 'popup_filter_yesno',
1682 \ callback: 'QuitCallback',
Bram Moolenaara42d9452019-06-15 21:46:30 +02001683 \ })
1684 redraw
1685 call feedkeys(a:key, "xt")
1686 call assert_equal(winid, s:cb_winid)
1687 call assert_equal(a:result, s:cb_res)
1688endfunc
1689
1690func Test_popup_dialog()
1691 func QuitCallback(id, res)
1692 let s:cb_winid = a:id
1693 let s:cb_res = a:res
1694 endfunc
1695
1696 let winid = ShowDialog("y", 1)
1697 let winid = ShowDialog("Y", 1)
1698 let winid = ShowDialog("n", 0)
1699 let winid = ShowDialog("N", 0)
1700 let winid = ShowDialog("x", 0)
1701 let winid = ShowDialog("X", 0)
1702 let winid = ShowDialog("\<Esc>", 0)
1703 let winid = ShowDialog("\<C-C>", -1)
1704
1705 delfunc QuitCallback
1706endfunc
1707
Bram Moolenaara730e552019-06-16 19:05:31 +02001708func ShowMenu(key, result)
1709 let s:cb_res = 999
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001710 let winid = popup_menu(['one', 'two', 'something else'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001711 \ callback: 'QuitCallback',
Bram Moolenaara730e552019-06-16 19:05:31 +02001712 \ })
1713 redraw
1714 call feedkeys(a:key, "xt")
1715 call assert_equal(winid, s:cb_winid)
1716 call assert_equal(a:result, s:cb_res)
1717endfunc
1718
1719func Test_popup_menu()
1720 func QuitCallback(id, res)
1721 let s:cb_winid = a:id
1722 let s:cb_res = a:res
1723 endfunc
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001724 " mapping won't be used in popup
1725 map j k
Bram Moolenaara730e552019-06-16 19:05:31 +02001726
1727 let winid = ShowMenu(" ", 1)
1728 let winid = ShowMenu("j \<CR>", 2)
1729 let winid = ShowMenu("JjK \<CR>", 2)
1730 let winid = ShowMenu("jjjjjj ", 3)
1731 let winid = ShowMenu("kkk ", 1)
1732 let winid = ShowMenu("x", -1)
1733 let winid = ShowMenu("X", -1)
1734 let winid = ShowMenu("\<Esc>", -1)
1735 let winid = ShowMenu("\<C-C>", -1)
1736
1737 delfunc QuitCallback
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02001738 unmap j
Bram Moolenaara730e552019-06-16 19:05:31 +02001739endfunc
1740
1741func Test_popup_menu_screenshot()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001742 CheckScreendump
Bram Moolenaara730e552019-06-16 19:05:31 +02001743
1744 let lines =<< trim END
1745 call setline(1, range(1, 20))
1746 hi PopupSelected ctermbg=lightblue
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001747 call popup_menu(['one', 'two', 'another'], #{callback: 'MenuDone', title: ' make a choice from the list '})
Bram Moolenaara730e552019-06-16 19:05:31 +02001748 func MenuDone(id, res)
1749 echomsg "selected " .. a:res
1750 endfunc
1751 END
1752 call writefile(lines, 'XtestPopupMenu')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001753 let buf = RunVimInTerminal('-S XtestPopupMenu', #{rows: 10})
Bram Moolenaara730e552019-06-16 19:05:31 +02001754 call VerifyScreenDump(buf, 'Test_popupwin_menu_01', {})
1755
1756 call term_sendkeys(buf, "jj")
1757 call VerifyScreenDump(buf, 'Test_popupwin_menu_02', {})
1758
1759 call term_sendkeys(buf, " ")
1760 call VerifyScreenDump(buf, 'Test_popupwin_menu_03', {})
1761
1762 " clean up
1763 call StopVimInTerminal(buf)
1764 call delete('XtestPopupMenu')
1765endfunc
1766
Bram Moolenaarf914a332019-07-20 15:09:56 +02001767func Test_popup_menu_narrow()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001768 CheckScreendump
Bram Moolenaarf914a332019-07-20 15:09:56 +02001769
1770 let lines =<< trim END
1771 call setline(1, range(1, 20))
1772 hi PopupSelected ctermbg=green
1773 call popup_menu(['one', 'two', 'three'], #{callback: 'MenuDone'})
1774 func MenuDone(id, res)
1775 echomsg "selected " .. a:res
1776 endfunc
1777 END
1778 call writefile(lines, 'XtestPopupNarrowMenu')
1779 let buf = RunVimInTerminal('-S XtestPopupNarrowMenu', #{rows: 10})
1780 call VerifyScreenDump(buf, 'Test_popupwin_menu_04', {})
1781
1782 " clean up
1783 call term_sendkeys(buf, "x")
1784 call StopVimInTerminal(buf)
1785 call delete('XtestPopupNarrowMenu')
1786endfunc
1787
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001788func Test_popup_title()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001789 CheckScreendump
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001790
1791 " Create a popup without title or border, a line of padding will be added to
1792 " put the title on.
1793 let lines =<< trim END
1794 call setline(1, range(1, 20))
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001795 let winid = popup_create(['one', 'two', 'another'], #{title: 'Title String'})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001796 END
1797 call writefile(lines, 'XtestPopupTitle')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001798 let buf = RunVimInTerminal('-S XtestPopupTitle', #{rows: 10})
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001799 call VerifyScreenDump(buf, 'Test_popupwin_title', {})
1800
Bram Moolenaar5d458a72019-08-04 21:12:15 +02001801 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxwidth: 20, title: 'a very long title that is not going to fit'})\<CR>")
1802 call term_sendkeys(buf, ":\<CR>")
1803 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_1', {})
1804
1805 call term_sendkeys(buf, ":call popup_setoptions(winid, #{border: []})\<CR>")
1806 call term_sendkeys(buf, ":\<CR>")
1807 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_2', {})
1808
Bram Moolenaar3ae50c72020-12-12 18:18:06 +01001809 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1810 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, padding: [2, 2, 2, 2]})\<CR>")
1811 call term_sendkeys(buf, ":\<CR>")
1812 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_3', {})
1813
1814 call term_sendkeys(buf, ":call popup_clear()\<CR>")
1815 call term_sendkeys(buf, ":call popup_create(['aaa', 'bbb'], #{title: 'Title', minwidth: 12, border: [], padding: [2, 2, 2, 2]})\<CR>")
1816 call term_sendkeys(buf, ":\<CR>")
1817 call VerifyScreenDump(buf, 'Test_popupwin_longtitle_4', {})
1818
Ralf Schandlbc869872021-05-28 14:12:14 +02001819 call term_sendkeys(buf, ":call popup_clear()\<CR>")
rbtnnc6119412021-08-07 13:08:45 +02001820 call term_sendkeys(buf, ":call popup_menu(['This is a line', 'and another line'], #{title: '▶Äあいうえお◀', })\<CR>")
Ralf Schandlbc869872021-05-28 14:12:14 +02001821 call VerifyScreenDump(buf, 'Test_popupwin_multibytetitle', {})
1822 call term_sendkeys(buf, "x")
1823
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001824 " clean up
1825 call StopVimInTerminal(buf)
1826 call delete('XtestPopupTitle')
Bram Moolenaarae943152019-06-16 22:54:14 +02001827
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001828 let winid = popup_create('something', #{title: 'Some Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001829 call assert_equal('Some Title', popup_getoptions(winid).title)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001830 call popup_setoptions(winid, #{title: 'Another Title'})
Bram Moolenaarae943152019-06-16 22:54:14 +02001831 call assert_equal('Another Title', popup_getoptions(winid).title)
1832
1833 call popup_clear()
Bram Moolenaareb2310d2019-06-16 20:09:10 +02001834endfunc
1835
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001836func Test_popup_close_callback()
1837 func PopupDone(id, result)
1838 let g:result = a:result
1839 endfunc
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001840 let winid = popup_create('something', #{callback: 'PopupDone'})
Bram Moolenaar9eaac892019-06-01 22:49:29 +02001841 redraw
1842 call popup_close(winid, 'done')
1843 call assert_equal('done', g:result)
1844endfunc
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001845
1846func Test_popup_empty()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001847 let winid = popup_create('', #{padding: [2,2,2,2]})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001848 redraw
1849 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001850 call assert_equal(5, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001851 call assert_equal(5, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001852 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001853
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001854 let winid = popup_create([], #{border: []})
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001855 redraw
1856 let pos = popup_getpos(winid)
Bram Moolenaardc2ce582019-06-16 15:32:14 +02001857 call assert_equal(3, pos.width)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001858 call assert_equal(3, pos.height)
Bram Moolenaaref6b9792020-05-13 16:34:15 +02001859 call popup_close(winid)
Bram Moolenaar7b29dd82019-06-02 13:22:11 +02001860endfunc
Bram Moolenaar988c4332019-06-02 14:12:11 +02001861
1862func Test_popup_never_behind()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02001863 CheckScreendump
1864
Bram Moolenaar988c4332019-06-02 14:12:11 +02001865 " +-----------------------------+
1866 " | | |
1867 " | | |
1868 " | | |
1869 " | line1 |
1870 " |------------line2------------|
1871 " | line3 |
1872 " | line4 |
1873 " | |
1874 " | |
1875 " +-----------------------------+
1876 let lines =<< trim END
Bram Moolenaar988c4332019-06-02 14:12:11 +02001877 split
1878 vsplit
1879 let info_window1 = getwininfo()[0]
1880 let line = info_window1['height']
1881 let col = info_window1['width']
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001882 call popup_create(['line1', 'line2', 'line3', 'line4'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02001883 \ line : line,
1884 \ col : col,
Bram Moolenaar988c4332019-06-02 14:12:11 +02001885 \ })
1886 END
1887 call writefile(lines, 'XtestPopupBehind')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02001888 let buf = RunVimInTerminal('-S XtestPopupBehind', #{rows: 10})
Bram Moolenaar988c4332019-06-02 14:12:11 +02001889 call term_sendkeys(buf, "\<C-W>w")
1890 call VerifyScreenDump(buf, 'Test_popupwin_behind', {})
1891
1892 " clean up
1893 call StopVimInTerminal(buf)
1894 call delete('XtestPopupBehind')
1895endfunc
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001896
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001897func s:VerifyPosition(p, msg, line, col, width, height)
1898 call assert_equal(a:line, popup_getpos(a:p).line, a:msg . ' (l)')
1899 call assert_equal(a:col, popup_getpos(a:p).col, a:msg . ' (c)')
1900 call assert_equal(a:width, popup_getpos(a:p).width, a:msg . ' (w)')
1901 call assert_equal(a:height, popup_getpos(a:p).height, a:msg . ' (h)')
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001902endfunc
1903
1904func Test_popup_position_adjust()
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001905 " Anything placed past the last cell on the right of the screen is moved to
1906 " the left.
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001907 "
1908 " When wrapping is disabled, we also shift to the left to display on the
1909 " screen, unless fixed is set.
1910
1911 " Entries for cases which don't vary based on wrapping.
1912 " Format is per tests described below
1913 let both_wrap_tests = [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001914 \ ['a', 5, &columns, 5, &columns, 1, 1],
1915 \ ['b', 5, &columns + 1, 5, &columns, 1, 1],
1916 \ ['c', 5, &columns - 1, 5, &columns - 1, 1, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001917 \ ['d', 5, &columns - 2, 5, &columns - 2, 1, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001918 \ ['e', 5, &columns - 3, 5, &columns - 3, 1, 1]]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02001919
1920 " these test groups are dicts with:
1921 " - comment: something to identify the group of tests by
1922 " - options: dict of options to merge with the row/col in tests
1923 " - tests: list of cases. Each one is a list with elements:
1924 " - text
1925 " - row
1926 " - col
1927 " - expected row
1928 " - expected col
1929 " - expected width
1930 " - expected height
1931 let tests = [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001932 \ #{
1933 \ comment: 'left-aligned with wrapping',
1934 \ options: #{
1935 \ wrap: 1,
1936 \ pos: 'botleft',
1937 \ },
1938 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001939 \ ['aa', 5, &columns, 4, &columns, 1, 2],
1940 \ ['bb', 5, &columns + 1, 4, &columns, 1, 2],
1941 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1942 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1943 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1944 \
1945 \ ['aaa', 5, &columns, 3, &columns, 1, 3],
1946 \ ['bbb', 5, &columns + 1, 3, &columns, 1, 3],
1947 \ ['ccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
1948 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1949 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1950 \
1951 \ ['aaaa', 5, &columns, 2, &columns, 1, 4],
1952 \ ['bbbb', 5, &columns + 1, 2, &columns, 1, 4],
1953 \ ['cccc', 5, &columns - 1, 4, &columns - 1, 2, 2],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001954 \ ['dddd', 5, &columns - 2, 4, &columns - 2, 3, 2],
1955 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001956 \ ['eeee', 5, &columns - 4, 5, &columns - 4, 4, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001957 \ ],
1958 \ },
1959 \ #{
1960 \ comment: 'left aligned without wrapping',
1961 \ options: #{
1962 \ wrap: 0,
1963 \ pos: 'botleft',
1964 \ },
1965 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001966 \ ['aa', 5, &columns, 5, &columns - 1, 2, 1],
1967 \ ['bb', 5, &columns + 1, 5, &columns - 1, 2, 1],
1968 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1969 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1970 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1971 \
1972 \ ['aaa', 5, &columns, 5, &columns - 2, 3, 1],
1973 \ ['bbb', 5, &columns + 1, 5, &columns - 2, 3, 1],
1974 \ ['ccc', 5, &columns - 1, 5, &columns - 2, 3, 1],
1975 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
1976 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
1977 \
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02001978 \ ['aaaa', 5, &columns, 5, &columns - 3, 4, 1],
1979 \ ['bbbb', 5, &columns + 1, 5, &columns - 3, 4, 1],
1980 \ ['cccc', 5, &columns - 1, 5, &columns - 3, 4, 1],
1981 \ ['dddd', 5, &columns - 2, 5, &columns - 3, 4, 1],
1982 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
1983 \ ],
1984 \ },
1985 \ #{
1986 \ comment: 'left aligned with fixed position',
1987 \ options: #{
1988 \ wrap: 0,
1989 \ fixed: 1,
1990 \ pos: 'botleft',
1991 \ },
1992 \ tests: both_wrap_tests + [
Bram Moolenaarfbcdf672020-01-06 23:07:48 +01001993 \ ['aa', 5, &columns, 5, &columns, 1, 1],
1994 \ ['bb', 5, &columns + 1, 5, &columns, 1, 1],
1995 \ ['cc', 5, &columns - 1, 5, &columns - 1, 2, 1],
1996 \ ['dd', 5, &columns - 2, 5, &columns - 2, 2, 1],
1997 \ ['ee', 5, &columns - 3, 5, &columns - 3, 2, 1],
1998 \
1999 \ ['aaa', 5, &columns, 5, &columns, 1, 1],
2000 \ ['bbb', 5, &columns + 1, 5, &columns, 1, 1],
2001 \ ['ccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
2002 \ ['ddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2003 \ ['eee', 5, &columns - 3, 5, &columns - 3, 3, 1],
2004 \
2005 \ ['aaaa', 5, &columns, 5, &columns, 1, 1],
2006 \ ['bbbb', 5, &columns + 1, 5, &columns, 1, 1],
2007 \ ['cccc', 5, &columns - 1, 5, &columns - 1, 2, 1],
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002008 \ ['dddd', 5, &columns - 2, 5, &columns - 2, 3, 1],
2009 \ ['eeee', 5, &columns - 3, 5, &columns - 3, 4, 1],
2010 \ ],
2011 \ },
2012 \ ]
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002013
2014 for test_group in tests
2015 for test in test_group.tests
2016 let [ text, line, col, e_line, e_col, e_width, e_height ] = test
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002017 let options = #{
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002018 \ line: line,
2019 \ col: col,
2020 \ }
2021 call extend(options, test_group.options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002022
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002023 let p = popup_create(text, options)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002024
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002025 let msg = string(extend(options, #{text: text}))
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002026 call s:VerifyPosition(p, msg, e_line, e_col, e_width, e_height)
2027 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002028 endfor
2029 endfor
2030
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002031 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002032 %bwipe!
2033endfunc
2034
Bram Moolenaar3397f742019-06-02 18:40:06 +02002035func Test_adjust_left_past_screen_width()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002036 " width of screen
2037 let X = join(map(range(&columns), {->'X'}), '')
2038
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002039 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2040 call s:VerifyPosition(p, 'full width topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002041
2042 redraw
2043 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2044 call assert_equal(X, line)
2045
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002046 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002047 redraw
2048
2049 " Same if placed on the right hand side
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002050 let p = popup_create(X, #{line: 1, col: &columns, wrap: 0})
2051 call s:VerifyPosition(p, 'full width topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002052
2053 redraw
2054 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2055 call assert_equal(X, line)
2056
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002057 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002058 redraw
2059
2060 " Extend so > window width
2061 let X .= 'x'
2062
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002063 let p = popup_create(X, #{line: 1, col: 1, wrap: 0})
2064 call s:VerifyPosition(p, 'full width + 1 topleft', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002065
2066 redraw
2067 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2068 call assert_equal(X[ : -2 ], line)
2069
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002070 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002071 redraw
2072
2073 " Shifted then truncated (the x is not visible)
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002074 let p = popup_create(X, #{line: 1, col: &columns - 3, wrap: 0})
2075 call s:VerifyPosition(p, 'full width + 1 topright', 1, 1, &columns, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002076
2077 redraw
2078 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2079 call assert_equal(X[ : -2 ], line)
2080
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002081 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002082 redraw
2083
2084 " Not shifted, just truncated
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002085 let p = popup_create(X,
2086 \ #{line: 1, col: 2, wrap: 0, fixed: 1})
2087 call s:VerifyPosition(p, 'full width + 1 fixed', 1, 2, &columns - 1, 1)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002088
2089 redraw
2090 let line = join(map(range(1, &columns + 1), 'screenstring(1, v:val)'), '')
2091 let e_line = ' ' . X[ 1 : -2 ]
2092 call assert_equal(e_line, line)
2093
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002094 call popup_close(p)
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002095 redraw
2096
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002097 call popup_clear()
Bram Moolenaar042fb4b2019-06-02 14:49:56 +02002098 %bwipe!
Bram Moolenaar3397f742019-06-02 18:40:06 +02002099endfunc
2100
2101func Test_popup_moved()
2102 new
2103 call test_override('char_avail', 1)
2104 call setline(1, ['one word to move around', 'a WORD.and->some thing'])
2105
2106 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002107 let winid = popup_atcursor('text', #{moved: 'any'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002108 redraw
2109 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002110 call assert_equal([1, 4, 4], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002111 " trigger the check for last_cursormoved by going into insert mode
2112 call feedkeys("li\<Esc>", 'xt')
2113 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002114 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002115
2116 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002117 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002118 redraw
2119 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002120 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002121 call feedkeys("hi\<Esc>", 'xt')
2122 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002123 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002124
2125 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002126 let winid = popup_atcursor('text', #{moved: 'word'})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002127 redraw
2128 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002129 call assert_equal([1, 4, 7], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002130 call feedkeys("li\<Esc>", 'xt')
2131 call assert_equal(1, popup_getpos(winid).visible)
2132 call feedkeys("ei\<Esc>", 'xt')
2133 call assert_equal(1, popup_getpos(winid).visible)
2134 call feedkeys("eli\<Esc>", 'xt')
2135 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002136 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002137
Bram Moolenaar17627312019-06-02 19:53:44 +02002138 " WORD is the default
Bram Moolenaar3397f742019-06-02 18:40:06 +02002139 exe "normal gg0/WORD\<CR>"
Bram Moolenaar17627312019-06-02 19:53:44 +02002140 let winid = popup_atcursor('text', {})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002141 redraw
2142 call assert_equal(1, popup_getpos(winid).visible)
Bram Moolenaarb3d17a22019-07-07 18:28:14 +02002143 call assert_equal([2, 2, 15], popup_getoptions(winid).moved)
Bram Moolenaar3397f742019-06-02 18:40:06 +02002144 call feedkeys("eli\<Esc>", 'xt')
2145 call assert_equal(1, popup_getpos(winid).visible)
2146 call feedkeys("wi\<Esc>", 'xt')
2147 call assert_equal(1, popup_getpos(winid).visible)
2148 call feedkeys("Eli\<Esc>", 'xt')
2149 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002150 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002151
2152 exe "normal gg0/word\<CR>"
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002153 let winid = popup_atcursor('text', #{moved: [5, 10]})
Bram Moolenaar3397f742019-06-02 18:40:06 +02002154 redraw
2155 call assert_equal(1, popup_getpos(winid).visible)
2156 call feedkeys("eli\<Esc>", 'xt')
2157 call feedkeys("ei\<Esc>", 'xt')
2158 call assert_equal(1, popup_getpos(winid).visible)
2159 call feedkeys("eli\<Esc>", 'xt')
2160 call assert_equal({}, popup_getpos(winid))
Bram Moolenaar3ff5f0f2019-06-10 13:11:22 +02002161 call popup_clear()
Bram Moolenaar3397f742019-06-02 18:40:06 +02002162
2163 bwipe!
2164 call test_override('ALL', 0)
2165endfunc
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002166
2167func Test_notifications()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002168 CheckFeature timers
2169 CheckScreendump
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002170
Bram Moolenaar0fdddee2019-09-01 15:26:23 +02002171 let lines =<< trim END
2172 call setline(1, range(1, 20))
2173 hi Notification ctermbg=lightblue
2174 call popup_notification('first notification', {})
2175 END
2176 call writefile(lines, 'XtestNotifications')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002177 let buf = RunVimInTerminal('-S XtestNotifications', #{rows: 10})
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002178 call VerifyScreenDump(buf, 'Test_popupwin_notify_01', {})
2179
2180 " second one goes below the first one
Bram Moolenaardfa97f22019-06-15 14:31:55 +02002181 call term_sendkeys(buf, ":hi link PopupNotification Notification\<CR>")
2182 call term_sendkeys(buf, ":call popup_notification('another important notification', {})\<CR>")
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002183 call VerifyScreenDump(buf, 'Test_popupwin_notify_02', {})
2184
Bram Moolenaar68d48f42019-06-12 22:42:41 +02002185 " clean up
2186 call StopVimInTerminal(buf)
2187 call delete('XtestNotifications')
2188endfunc
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002189
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002190func Test_popup_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002191 CheckScreendump
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002192
2193 let lines =<< trim END
2194 call setline(1, range(1, 20))
Bram Moolenaar8da41812019-06-26 18:04:54 +02002195 hi ScrollThumb ctermbg=blue
2196 hi ScrollBar ctermbg=red
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002197 let winid = popup_create(['one', 'two', 'three', 'four', 'five',
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002198 \ 'six', 'seven', 'eight', 'nine'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002199 \ minwidth: 8,
2200 \ maxheight: 4,
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002201 \ })
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002202 func ScrollUp()
2203 call feedkeys("\<F3>\<ScrollWheelUp>", "xt")
2204 endfunc
2205 func ScrollDown()
2206 call feedkeys("\<F3>\<ScrollWheelDown>", "xt")
2207 endfunc
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002208 func ClickTop()
2209 call feedkeys("\<F4>\<LeftMouse>", "xt")
2210 endfunc
2211 func ClickBot()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002212 call popup_setoptions(g:winid, #{border: [], close: 'button'})
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002213 call feedkeys("\<F5>\<LeftMouse>", "xt")
2214 endfunc
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002215 func Popup_filter(winid, key)
2216 if a:key == 'j'
Bram Moolenaar371806e2020-10-22 13:44:54 +02002217 silent! this_throws_an_error_but_is_ignored
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002218 let line = popup_getoptions(a:winid).firstline
2219 let nlines = line('$', a:winid)
2220 let newline = line < nlines ? (line + 1) : nlines
2221 call popup_setoptions(a:winid, #{firstline: newline})
2222 return v:true
2223 elseif a:key == 'x'
2224 call popup_close(a:winid)
2225 return v:true
2226 endif
2227 endfunc
2228
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002229 def CreatePopup(text: list<string>)
Bram Moolenaare0de1712020-12-02 17:36:54 +01002230 popup_create(text, {
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002231 \ minwidth: 30,
2232 \ maxwidth: 30,
2233 \ minheight: 4,
2234 \ maxheight: 4,
2235 \ firstline: 1,
2236 \ lastline: 4,
2237 \ wrap: true,
2238 \ scrollbar: true,
2239 \ mapping: false,
2240 \ filter: Popup_filter,
2241 \ })
2242 enddef
2243
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002244 func PopupScroll()
2245 call popup_clear()
2246 let text =<< trim END
2247 1
2248 2
2249 3
2250 4
2251 long line long line long line long line long line long line
2252 long line long line long line long line long line long line
2253 long line long line long line long line long line long line
2254 END
Bram Moolenaar6c542f72020-09-27 21:16:45 +02002255 call CreatePopup(text)
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002256 endfunc
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002257 map <silent> <F3> :call test_setmouse(5, 36)<CR>
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002258 map <silent> <F4> :call test_setmouse(4, 42)<CR>
2259 map <silent> <F5> :call test_setmouse(7, 42)<CR>
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002260 END
2261 call writefile(lines, 'XtestPopupScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002262 let buf = RunVimInTerminal('-S XtestPopupScroll', #{rows: 10})
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002263 call VerifyScreenDump(buf, 'Test_popupwin_scroll_1', {})
2264
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002265 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 2})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002266 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002267 call VerifyScreenDump(buf, 'Test_popupwin_scroll_2', {})
2268
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002269 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 6})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002270 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002271 call VerifyScreenDump(buf, 'Test_popupwin_scroll_3', {})
2272
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002273 call term_sendkeys(buf, ":call popup_setoptions(winid, #{firstline: 9})\<CR>")
Bram Moolenaarb8be54d2019-07-14 18:22:59 +02002274 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002275 call VerifyScreenDump(buf, 'Test_popupwin_scroll_4', {})
2276
Bram Moolenaar9e67b6a2019-08-30 17:34:08 +02002277 call term_sendkeys(buf, ":call popup_setoptions(winid, #{scrollbarhighlight: 'ScrollBar', thumbhighlight: 'ScrollThumb', firstline: 5})\<CR>")
Bram Moolenaara112f2d2019-09-01 17:38:09 +02002278 " this scrolls two lines (half the window height)
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002279 call term_sendkeys(buf, ":call ScrollUp()\<CR>")
2280 call VerifyScreenDump(buf, 'Test_popupwin_scroll_5', {})
2281
2282 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2283 call VerifyScreenDump(buf, 'Test_popupwin_scroll_6', {})
2284
2285 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
Bram Moolenaar13b47c32019-06-28 21:55:48 +02002286 " wait a bit, otherwise it fails sometimes (double click recognized?)
2287 sleep 100m
Bram Moolenaar53a95d62019-06-26 03:54:08 +02002288 call term_sendkeys(buf, ":call ScrollDown()\<CR>")
2289 call VerifyScreenDump(buf, 'Test_popupwin_scroll_7', {})
2290
Bram Moolenaarf9c85f52019-06-29 07:41:35 +02002291 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2292 sleep 100m
2293 call term_sendkeys(buf, ":call ClickTop()\<CR>")
2294 call VerifyScreenDump(buf, 'Test_popupwin_scroll_8', {})
2295
2296 call term_sendkeys(buf, ":call ClickBot()\<CR>")
2297 call VerifyScreenDump(buf, 'Test_popupwin_scroll_9', {})
2298
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002299 " remove the minwidth and maxheight
2300 call term_sendkeys(buf, ":call popup_setoptions(winid, #{maxheight: 0, minwidth: 0})\<CR>")
Bram Moolenaar7e0f4622019-09-17 21:23:39 +02002301 call term_sendkeys(buf, ":\<CR>")
Bram Moolenaar8c6173c2019-08-30 22:08:34 +02002302 call VerifyScreenDump(buf, 'Test_popupwin_scroll_10', {})
2303
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002304 " check size with non-wrapping lines
2305 call term_sendkeys(buf, ":call PopupScroll()\<CR>")
2306 call VerifyScreenDump(buf, 'Test_popupwin_scroll_11', {})
2307
2308 " check size with wrapping lines
2309 call term_sendkeys(buf, "j")
2310 call VerifyScreenDump(buf, 'Test_popupwin_scroll_12', {})
Bram Moolenaarf2885d32019-11-02 20:21:25 +01002311
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002312 " clean up
Bram Moolenaar20298ce2020-06-19 21:46:52 +02002313 call term_sendkeys(buf, "x")
Bram Moolenaar75fb0852019-06-25 05:15:58 +02002314 call StopVimInTerminal(buf)
2315 call delete('XtestPopupScroll')
2316endfunc
2317
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002318func Test_popup_too_high_scrollbar()
2319 CheckScreendump
2320
2321 let lines =<< trim END
2322 call setline(1, range(1, 20)->map({i, v -> repeat(v, 10)}))
2323 set scrolloff=0
2324 func ShowPopup()
2325 let winid = popup_atcursor(['one', 'two', 'three', 'four', 'five',
2326 \ 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve'], #{
2327 \ minwidth: 8,
2328 \ border: [],
2329 \ })
2330 endfunc
2331 normal 3G$
2332 call ShowPopup()
2333 END
2334 call writefile(lines, 'XtestPopupToohigh')
2335 let buf = RunVimInTerminal('-S XtestPopupToohigh', #{rows: 10})
2336 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_1', {})
2337
2338 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2339 call term_sendkeys(buf, "8G$")
2340 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2341 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_2', {})
2342
Bram Moolenaarbf61fdd2020-08-10 20:39:17 +02002343 call term_sendkeys(buf, ":call popup_clear()\<CR>")
2344 call term_sendkeys(buf, "gg$")
2345 call term_sendkeys(buf, ":call ShowPopup()\<CR>")
2346 call VerifyScreenDump(buf, 'Test_popupwin_toohigh_3', {})
2347
Bram Moolenaara1b9b0c2020-08-09 16:37:48 +02002348 " clean up
2349 call StopVimInTerminal(buf)
2350 call delete('XtestPopupToohigh')
2351endfunc
2352
Bram Moolenaar437a7462019-07-05 20:17:22 +02002353func Test_popup_fitting_scrollbar()
2354 " this was causing a crash, divide by zero
2355 let winid = popup_create([
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002356 \ 'one', 'two', 'longer line that wraps', 'four', 'five'], #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002357 \ scrollbar: 1,
2358 \ maxwidth: 10,
2359 \ maxheight: 5,
2360 \ firstline: 2})
Bram Moolenaar437a7462019-07-05 20:17:22 +02002361 redraw
2362 call popup_clear()
2363endfunc
2364
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002365func Test_popup_settext()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002366 CheckScreendump
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002367
2368 let lines =<< trim END
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002369 let opts = #{wrap: 0}
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002370 let p = popup_create('test', opts)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002371 eval p->popup_settext('this is a text')
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002372 END
2373
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02002374 call writefile(lines, 'XtestPopupSetText')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002375 let buf = RunVimInTerminal('-S XtestPopupSetText', #{rows: 10})
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002376 call VerifyScreenDump(buf, 'Test_popup_settext_01', {})
2377
2378 " Setting to empty string clears it
2379 call term_sendkeys(buf, ":call popup_settext(p, '')\<CR>")
2380 call VerifyScreenDump(buf, 'Test_popup_settext_02', {})
2381
2382 " Setting a list
2383 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2384 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2385
2386 " Shrinking with a list
2387 call term_sendkeys(buf, ":call popup_settext(p, ['a'])\<CR>")
2388 call VerifyScreenDump(buf, 'Test_popup_settext_04', {})
2389
2390 " Growing with a list
2391 call term_sendkeys(buf, ":call popup_settext(p, ['a','b','c'])\<CR>")
2392 call VerifyScreenDump(buf, 'Test_popup_settext_03', {})
2393
2394 " Empty list clears
2395 call term_sendkeys(buf, ":call popup_settext(p, [])\<CR>")
2396 call VerifyScreenDump(buf, 'Test_popup_settext_05', {})
2397
2398 " Dicts
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002399 call term_sendkeys(buf, ":call popup_settext(p, [#{text: 'aaaa'}, #{text: 'bbbb'}, #{text: 'cccc'}])\<CR>")
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002400 call VerifyScreenDump(buf, 'Test_popup_settext_06', {})
2401
Bram Moolenaarb0992022020-01-30 14:55:42 +01002402 " range() (doesn't work)
2403 call term_sendkeys(buf, ":call popup_settext(p, range(4, 8))\<CR>")
2404 call VerifyScreenDump(buf, 'Test_popup_settext_07', {})
2405
Bram Moolenaardc2ce582019-06-16 15:32:14 +02002406 " clean up
2407 call StopVimInTerminal(buf)
2408 call delete('XtestPopupSetText')
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002409endfunc
2410
Bram Moolenaar1f42f5a2020-09-03 18:52:24 +02002411func Test_popup_settext_getline()
2412 let id = popup_create('', #{ tabpage: 0 })
2413 call popup_settext(id, ['a','b'])
2414 call assert_equal(2, line('$', id)) " OK :)
2415 call popup_close(id)
2416
2417 let id = popup_create('', #{ tabpage: -1 })
2418 call popup_settext(id, ['a','b'])
2419 call assert_equal(2, line('$', id)) " Fails :(
2420 call popup_close(id)
2421endfunc
2422
Bram Moolenaar74f8eec2020-10-15 19:10:56 +02002423func Test_popup_settext_null()
2424 let id = popup_create('', #{ tabpage: 0 })
2425 call popup_settext(id, test_null_list())
2426 call popup_close(id)
2427
2428 let id = popup_create('', #{ tabpage: 0 })
2429 call popup_settext(id, test_null_string())
2430 call popup_close(id)
2431endfunc
2432
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002433func Test_popup_hidden()
2434 new
2435
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002436 let winid = popup_atcursor('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002437 redraw
2438 call assert_equal(0, popup_getpos(winid).visible)
2439 call popup_close(winid)
2440
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002441 let winid = popup_create('text', #{hidden: 1})
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002442 redraw
2443 call assert_equal(0, popup_getpos(winid).visible)
2444 call popup_close(winid)
2445
2446 func QuitCallback(id, res)
2447 let s:cb_winid = a:id
2448 let s:cb_res = a:res
2449 endfunc
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002450 let winid = 'make a choice'->popup_dialog(#{hidden: 1,
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002451 \ filter: 'popup_filter_yesno',
2452 \ callback: 'QuitCallback',
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002453 \ })
2454 redraw
2455 call assert_equal(0, popup_getpos(winid).visible)
Bram Moolenaarae943152019-06-16 22:54:14 +02002456 call assert_equal(function('popup_filter_yesno'), popup_getoptions(winid).filter)
2457 call assert_equal(function('QuitCallback'), popup_getoptions(winid).callback)
Bram Moolenaar6313c4f2019-06-16 20:39:13 +02002458 exe "normal anot used by filter\<Esc>"
2459 call assert_equal('not used by filter', getline(1))
2460
2461 call popup_show(winid)
2462 call feedkeys('y', "xt")
2463 call assert_equal(1, s:cb_res)
2464
2465 bwipe!
2466 delfunc QuitCallback
2467endfunc
Bram Moolenaarae943152019-06-16 22:54:14 +02002468
2469" Test options not checked elsewhere
2470func Test_set_get_options()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002471 let winid = popup_create('some text', #{highlight: 'Beautiful'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002472 let options = popup_getoptions(winid)
2473 call assert_equal(1, options.wrap)
2474 call assert_equal(0, options.drag)
2475 call assert_equal('Beautiful', options.highlight)
2476
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002477 call popup_setoptions(winid, #{wrap: 0, drag: 1, highlight: 'Another'})
Bram Moolenaarae943152019-06-16 22:54:14 +02002478 let options = popup_getoptions(winid)
2479 call assert_equal(0, options.wrap)
2480 call assert_equal(1, options.drag)
2481 call assert_equal('Another', options.highlight)
2482
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002483 call assert_fails('call popup_setoptions(winid, [])', 'E715:')
2484 call assert_fails('call popup_setoptions(winid, test_null_dict())', 'E715:')
2485
Bram Moolenaarae943152019-06-16 22:54:14 +02002486 call popup_close(winid)
Bram Moolenaarad48e6c2020-04-21 22:19:45 +02002487 call assert_equal(0, popup_setoptions(winid, options.wrap))
Bram Moolenaarae943152019-06-16 22:54:14 +02002488endfunc
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002489
2490func Test_popupwin_garbage_collect()
2491 func MyPopupFilter(x, winid, c)
2492 " NOP
2493 endfunc
2494
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002495 let winid = popup_create('something', #{filter: function('MyPopupFilter', [{}])})
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002496 call test_garbagecollect_now()
2497 redraw
Bram Moolenaar1bc353b2019-09-01 14:45:28 +02002498 " Must not crash caused by invalid memory access
Bram Moolenaar75a1a942019-06-20 03:45:36 +02002499 call feedkeys('j', 'xt')
2500 call assert_true(v:true)
2501
2502 call popup_close(winid)
2503 delfunc MyPopupFilter
2504endfunc
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002505
Bram Moolenaar581ba392019-09-03 22:08:33 +02002506func Test_popupwin_filter_mode()
2507 func MyPopupFilter(winid, c)
2508 let s:typed = a:c
2509 if a:c == ':' || a:c == "\r" || a:c == 'v'
2510 " can start cmdline mode, get out, and start/stop Visual mode
2511 return 0
2512 endif
2513 return 1
2514 endfunc
2515
2516 " Normal, Visual and Insert mode
2517 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'nvi'})
2518 redraw
2519 call feedkeys('x', 'xt')
2520 call assert_equal('x', s:typed)
2521
2522 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2523 call assert_equal(':', s:typed)
2524 call assert_equal('foo', g:foo)
2525
2526 let @x = 'something'
2527 call feedkeys('v$"xy', 'xt')
2528 call assert_equal('y', s:typed)
2529 call assert_equal('something', @x) " yank command is filtered out
2530 call feedkeys('v', 'xt') " end Visual mode
2531
2532 call popup_close(winid)
2533
2534 " only Normal mode
2535 let winid = popup_create('something', #{filter: 'MyPopupFilter', filtermode: 'n'})
2536 redraw
2537 call feedkeys('x', 'xt')
2538 call assert_equal('x', s:typed)
2539
2540 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2541 call assert_equal(':', s:typed)
2542 call assert_equal('foo', g:foo)
2543
2544 let @x = 'something'
2545 call feedkeys('v$"xy', 'xt')
2546 call assert_equal('v', s:typed)
2547 call assert_notequal('something', @x)
2548
2549 call popup_close(winid)
2550
2551 " default: all modes
2552 let winid = popup_create('something', #{filter: 'MyPopupFilter'})
2553 redraw
2554 call feedkeys('x', 'xt')
2555 call assert_equal('x', s:typed)
2556
2557 let g:foo = 'bar'
2558 call feedkeys(":let g:foo = 'foo'\<CR>", 'xt')
2559 call assert_equal("\r", s:typed)
2560 call assert_equal('bar', g:foo)
2561
2562 let @x = 'something'
2563 call feedkeys('v$"xy', 'xt')
2564 call assert_equal('y', s:typed)
2565 call assert_equal('something', @x) " yank command is filtered out
2566 call feedkeys('v', 'xt') " end Visual mode
2567
2568 call popup_close(winid)
2569 delfunc MyPopupFilter
2570endfunc
2571
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002572func Test_popupwin_filter_mouse()
2573 func MyPopupFilter(winid, c)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002574 let g:got_mousepos = getmousepos()
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002575 return 0
2576 endfunc
2577
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002578 call setline(1, ['.'->repeat(25)]->repeat(10))
2579 let winid = popup_create(['short', 'long line that will wrap', 'other'], #{
2580 \ line: 2,
2581 \ col: 4,
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002582 \ maxwidth: 12,
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002583 \ padding: [],
2584 \ border: [],
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002585 \ filter: 'MyPopupFilter',
2586 \ })
2587 redraw
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002588 " 123456789012345678901
2589 " 1 .....................
2590 " 2 ...+--------------+..
2591 " 3 ...| |..
2592 " 4 ...| short |..
2593 " 5 ...| long line th |..
2594 " 6 ...| at will wrap |..
2595 " 7 ...| other |..
2596 " 8 ...| |..
2597 " 9 ...+--------------+..
2598 " 10 .....................
2599 let tests = []
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002600
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002601 func AddItemOutsidePopup(tests, row, col)
2602 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2603 \ screenrow: a:row, screencol: a:col,
2604 \ winid: win_getid(), winrow: a:row, wincol: a:col,
2605 \ line: a:row, column: a:col,
2606 \ }})
2607 endfunc
2608 func AddItemInPopupBorder(tests, winid, row, col)
2609 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2610 \ screenrow: a:row, screencol: a:col,
2611 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2612 \ line: 0, column: 0,
2613 \ }})
2614 endfunc
2615 func AddItemInPopupText(tests, winid, row, col, textline, textcol)
2616 eval a:tests->add(#{clickrow: a:row, clickcol: a:col, result: #{
2617 \ screenrow: a:row, screencol: a:col,
2618 \ winid: a:winid, winrow: a:row - 1, wincol: a:col - 3,
2619 \ line: a:textline, column: a:textcol,
2620 \ }})
2621 endfunc
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002622
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002623 " above and below popup
2624 for c in range(1, 21)
2625 call AddItemOutsidePopup(tests, 1, c)
2626 call AddItemOutsidePopup(tests, 10, c)
2627 endfor
2628 " left and right of popup
2629 for r in range(1, 10)
2630 call AddItemOutsidePopup(tests, r, 3)
2631 call AddItemOutsidePopup(tests, r, 20)
2632 endfor
2633 " top and bottom in popup
2634 for c in range(4, 19)
2635 call AddItemInPopupBorder(tests, winid, 2, c)
2636 call AddItemInPopupBorder(tests, winid, 3, c)
2637 call AddItemInPopupBorder(tests, winid, 8, c)
2638 call AddItemInPopupBorder(tests, winid, 9, c)
2639 endfor
2640 " left and right margin in popup
2641 for r in range(2, 9)
2642 call AddItemInPopupBorder(tests, winid, r, 4)
2643 call AddItemInPopupBorder(tests, winid, r, 5)
2644 call AddItemInPopupBorder(tests, winid, r, 18)
2645 call AddItemInPopupBorder(tests, winid, r, 19)
2646 endfor
2647 " text "short"
2648 call AddItemInPopupText(tests, winid, 4, 6, 1, 1)
2649 call AddItemInPopupText(tests, winid, 4, 10, 1, 5)
2650 call AddItemInPopupText(tests, winid, 4, 11, 1, 6)
2651 call AddItemInPopupText(tests, winid, 4, 17, 1, 6)
2652 " text "long line th"
2653 call AddItemInPopupText(tests, winid, 5, 6, 2, 1)
2654 call AddItemInPopupText(tests, winid, 5, 10, 2, 5)
2655 call AddItemInPopupText(tests, winid, 5, 17, 2, 12)
2656 " text "at will wrap"
2657 call AddItemInPopupText(tests, winid, 6, 6, 2, 13)
2658 call AddItemInPopupText(tests, winid, 6, 10, 2, 17)
2659 call AddItemInPopupText(tests, winid, 6, 17, 2, 24)
2660 " text "other"
2661 call AddItemInPopupText(tests, winid, 7, 6, 3, 1)
2662 call AddItemInPopupText(tests, winid, 7, 10, 3, 5)
2663 call AddItemInPopupText(tests, winid, 7, 11, 3, 6)
2664 call AddItemInPopupText(tests, winid, 7, 17, 3, 6)
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002665
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002666 for item in tests
2667 call test_setmouse(item.clickrow, item.clickcol)
2668 call feedkeys("\<LeftMouse>", 'xt')
2669 call assert_equal(item.result, g:got_mousepos)
2670 endfor
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002671
2672 call popup_close(winid)
Bram Moolenaardb3a2052019-11-16 18:22:41 +01002673 enew!
Bram Moolenaarf8b036b2019-11-06 21:09:17 +01002674 delfunc MyPopupFilter
2675endfunc
2676
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002677func Test_popupwin_with_buffer()
2678 call writefile(['some text', 'in a buffer'], 'XsomeFile')
2679 let buf = bufadd('XsomeFile')
2680 call assert_equal(0, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002681
2682 setlocal number
2683 call setbufvar(buf, "&wrapmargin", 13)
2684
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002685 let winid = popup_create(buf, {})
2686 call assert_notequal(0, winid)
2687 let pos = popup_getpos(winid)
2688 call assert_equal(2, pos.height)
2689 call assert_equal(1, bufloaded(buf))
Bram Moolenaar46451042019-08-24 15:50:46 +02002690
2691 " window-local option is set to default, buffer-local is not
2692 call assert_equal(0, getwinvar(winid, '&number'))
2693 call assert_equal(13, getbufvar(buf, '&wrapmargin'))
2694
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002695 call popup_close(winid)
2696 call assert_equal({}, popup_getpos(winid))
2697 call assert_equal(1, bufloaded(buf))
2698 exe 'bwipe! ' .. buf
Bram Moolenaar46451042019-08-24 15:50:46 +02002699 setlocal nonumber
Bram Moolenaar7866b872019-07-01 22:21:01 +02002700
2701 edit test_popupwin.vim
2702 let winid = popup_create(bufnr(''), {})
2703 redraw
2704 call popup_close(winid)
Bram Moolenaar3940ec62019-07-05 21:53:24 +02002705 call delete('XsomeFile')
Bram Moolenaar5b8cfed2019-06-30 22:16:10 +02002706endfunc
Bram Moolenaare296e312019-07-03 23:20:18 +02002707
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002708func Test_popupwin_terminal_buffer()
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002709 CheckFeature terminal
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002710 CheckUnix
Bram Moolenaare06a28f2020-05-13 23:24:12 +02002711 " Starting a terminal to run a shell in is considered flaky.
2712 let g:test_is_flaky = 1
Bram Moolenaard2c1fb42019-09-25 23:06:40 +02002713
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002714 let origwin = win_getid()
Bram Moolenaar349f6092020-10-06 20:46:49 +02002715
2716 " open help window to test that :help below fails
2717 help
2718
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002719 let termbuf = term_start(&shell, #{hidden: 1})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002720 let winid = popup_create(termbuf, #{minwidth: 40, minheight: 10, border: []})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002721 " Wait for shell to start
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002722 call WaitForAssert({-> assert_equal("run", job_status(term_getjob(termbuf)))})
Bram Moolenaar0353f562020-12-17 22:27:38 +01002723 " Wait for a prompt (see border char first, then space after prompt)
2724 call WaitForAssert({ -> assert_equal(' ', screenstring(screenrow(), screencol() - 1))})
Bram Moolenaarf5452692020-11-28 21:56:06 +01002725
2726 " When typing a character, the cursor is after it.
2727 call feedkeys("x", 'xt')
Bram Moolenaar0353f562020-12-17 22:27:38 +01002728 call term_wait(termbuf)
Bram Moolenaarf5452692020-11-28 21:56:06 +01002729 redraw
2730 call WaitForAssert({ -> assert_equal('x', screenstring(screenrow(), screencol() - 1))})
2731 call feedkeys("\<BS>", 'xt')
2732
Bram Moolenaar631ebc42020-02-03 22:15:26 +01002733 " Check this doesn't crash
2734 call assert_equal(winnr(), winnr('j'))
2735 call assert_equal(winnr(), winnr('k'))
2736 call assert_equal(winnr(), winnr('h'))
2737 call assert_equal(winnr(), winnr('l'))
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002738
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002739 " Cannot quit while job is running
2740 call assert_fails('call feedkeys("\<C-W>:quit\<CR>", "xt")', 'E948:')
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002741
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002742 " Cannot enter Terminal-Normal mode. (TODO: but it works...)
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002743 call feedkeys("xxx\<C-W>N", 'xt')
2744 call assert_fails('call feedkeys("gf", "xt")', 'E863:')
2745 call feedkeys("a\<C-U>", 'xt')
2746
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002747 " Cannot escape from terminal window
2748 call assert_fails('tab drop xxx', 'E863:')
Bram Moolenaar349f6092020-10-06 20:46:49 +02002749 call assert_fails('help', 'E994:')
Bram Moolenaar3f65c662020-05-27 23:15:16 +02002750
Bram Moolenaarb5383b12020-05-18 19:46:48 +02002751 " Cannot open a second one.
2752 let termbuf2 = term_start(&shell, #{hidden: 1})
2753 call assert_fails('call popup_create(termbuf2, #{})', 'E861:')
2754 call term_sendkeys(termbuf2, "exit\<CR>")
2755
Bram Moolenaar5aed0cc2020-05-12 22:02:21 +02002756 " Exiting shell closes popup window
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002757 call feedkeys("exit\<CR>", 'xt')
2758 " Wait for shell to exit
Bram Moolenaarb2b218d2020-06-22 20:22:19 +02002759 call WaitForAssert({-> assert_equal("dead", job_status(term_getjob(termbuf)))})
Bram Moolenaar373c6512020-06-22 19:24:23 +02002760
Bram Moolenaar349f6092020-10-06 20:46:49 +02002761 helpclose
Bram Moolenaard98c0b62020-02-02 15:25:16 +01002762 call feedkeys(":quit\<CR>", 'xt')
2763 call assert_equal(origwin, win_getid())
Bram Moolenaare0d749a2019-09-25 22:14:48 +02002764endfunc
2765
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002766func Test_popupwin_close_prevwin()
2767 CheckFeature terminal
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002768 call Popupwin_close_prevwin()
2769endfunc
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002770
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002771def Popupwin_close_prevwin()
2772 assert_equal(1, winnr('$'))
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002773 split
2774 wincmd b
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002775 assert_equal(2, winnr())
Bram Moolenaare0de1712020-12-02 17:36:54 +01002776 var buf = term_start(&shell, {hidden: 1})
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002777 popup_create(buf, {})
2778 TermWait(buf, 100)
2779 popup_clear(true)
2780 assert_equal(2, winnr())
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002781
2782 quit
2783 exe 'bwipe! ' .. buf
Bram Moolenaar62f93f42020-09-02 22:33:24 +02002784enddef
Bram Moolenaarab176ce2020-06-15 21:19:08 +02002785
Bram Moolenaar934470e2019-09-01 23:27:05 +02002786func Test_popupwin_with_buffer_and_filter()
2787 new Xwithfilter
2788 call setline(1, range(100))
2789 let bufnr = bufnr()
2790 hide
2791
2792 func BufferFilter(win, key)
2793 if a:key == 'G'
2794 " recursive use of "G" does not cause problems.
2795 call win_execute(a:win, 'normal! G')
2796 return 1
2797 endif
2798 return 0
2799 endfunc
2800
2801 let winid = popup_create(bufnr, #{maxheight: 5, filter: 'BufferFilter'})
2802 call assert_equal(1, popup_getpos(winid).firstline)
2803 redraw
2804 call feedkeys("G", 'xt')
2805 call assert_equal(99, popup_getpos(winid).firstline)
2806
2807 call popup_close(winid)
2808 exe 'bwipe! ' .. bufnr
2809endfunc
2810
Bram Moolenaare296e312019-07-03 23:20:18 +02002811func Test_popupwin_width()
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002812 let winid = popup_create(repeat(['short', 'long long long line', 'medium width'], 50), #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002813 \ maxwidth: 40,
2814 \ maxheight: 10,
Bram Moolenaare296e312019-07-03 23:20:18 +02002815 \ })
2816 for top in range(1, 20)
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002817 eval winid->popup_setoptions(#{firstline: top})
Bram Moolenaare296e312019-07-03 23:20:18 +02002818 redraw
2819 call assert_equal(19, popup_getpos(winid).width)
2820 endfor
2821 call popup_clear()
2822endfunc
Bram Moolenaar5ca1ac32019-07-04 15:39:28 +02002823
2824func Test_popupwin_buf_close()
2825 let buf = bufadd('Xtestbuf')
2826 call bufload(buf)
2827 call setbufline(buf, 1, ['just', 'some', 'lines'])
2828 let winid = popup_create(buf, {})
2829 redraw
2830 call assert_equal(3, popup_getpos(winid).height)
2831 let bufinfo = getbufinfo(buf)[0]
2832 call assert_equal(1, bufinfo.changed)
2833 call assert_equal(0, bufinfo.hidden)
2834 call assert_equal(0, bufinfo.listed)
2835 call assert_equal(1, bufinfo.loaded)
2836 call assert_equal([], bufinfo.windows)
2837 call assert_equal([winid], bufinfo.popups)
2838
2839 call popup_close(winid)
2840 call assert_equal({}, popup_getpos(winid))
2841 let bufinfo = getbufinfo(buf)[0]
2842 call assert_equal(1, bufinfo.changed)
2843 call assert_equal(1, bufinfo.hidden)
2844 call assert_equal(0, bufinfo.listed)
2845 call assert_equal(1, bufinfo.loaded)
2846 call assert_equal([], bufinfo.windows)
2847 call assert_equal([], bufinfo.popups)
2848 exe 'bwipe! ' .. buf
2849endfunc
Bram Moolenaar017c2692019-07-13 14:17:51 +02002850
2851func Test_popup_menu_with_maxwidth()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002852 CheckScreendump
Bram Moolenaar017c2692019-07-13 14:17:51 +02002853
2854 let lines =<< trim END
2855 call setline(1, range(1, 10))
2856 hi ScrollThumb ctermbg=blue
2857 hi ScrollBar ctermbg=red
2858 func PopupMenu(lines, line, col, scrollbar = 0)
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002859 return popup_menu(a:lines, #{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002860 \ maxwidth: 10,
2861 \ maxheight: 3,
2862 \ pos : 'topleft',
2863 \ col : a:col,
2864 \ line : a:line,
2865 \ scrollbar : a:scrollbar,
Bram Moolenaar017c2692019-07-13 14:17:51 +02002866 \ })
2867 endfunc
2868 call PopupMenu(['x'], 1, 1)
2869 call PopupMenu(['123456789|'], 1, 16)
2870 call PopupMenu(['123456789|' .. ' '], 7, 1)
2871 call PopupMenu([repeat('123456789|', 100)], 7, 16)
2872 call PopupMenu(repeat(['123456789|' .. ' '], 5), 1, 33, 1)
2873 END
2874 call writefile(lines, 'XtestPopupMenuMaxWidth')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002875 let buf = RunVimInTerminal('-S XtestPopupMenuMaxWidth', #{rows: 13})
Bram Moolenaar017c2692019-07-13 14:17:51 +02002876 call VerifyScreenDump(buf, 'Test_popupwin_menu_maxwidth_1', {})
2877
2878 " close the menu popupwin.
2879 call term_sendkeys(buf, " ")
2880 call term_sendkeys(buf, " ")
2881 call term_sendkeys(buf, " ")
2882 call term_sendkeys(buf, " ")
2883 call term_sendkeys(buf, " ")
2884
2885 " clean up
2886 call StopVimInTerminal(buf)
2887 call delete('XtestPopupMenuMaxWidth')
2888endfunc
2889
Bram Moolenaara901a372019-07-13 16:38:50 +02002890func Test_popup_menu_with_scrollbar()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002891 CheckScreendump
Bram Moolenaara901a372019-07-13 16:38:50 +02002892
2893 let lines =<< trim END
2894 call setline(1, range(1, 20))
2895 hi ScrollThumb ctermbg=blue
2896 hi ScrollBar ctermbg=red
Bram Moolenaar6a124e62019-09-04 18:15:19 +02002897 eval ['one', 'two', 'three', 'four', 'five',
2898 \ 'six', 'seven', 'eight', 'nine']
2899 \ ->popup_menu(#{
Bram Moolenaard5abb4c2019-07-13 22:46:10 +02002900 \ minwidth: 8,
2901 \ maxheight: 3,
Bram Moolenaara901a372019-07-13 16:38:50 +02002902 \ })
2903 END
2904 call writefile(lines, 'XtestPopupMenuScroll')
Bram Moolenaar4c6d9042019-07-16 22:04:02 +02002905 let buf = RunVimInTerminal('-S XtestPopupMenuScroll', #{rows: 10})
Bram Moolenaara901a372019-07-13 16:38:50 +02002906
2907 call term_sendkeys(buf, "j")
2908 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_1', {})
2909
2910 call term_sendkeys(buf, "jjj")
2911 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_2', {})
2912
2913 " if the cursor is the bottom line, it stays at the bottom line.
2914 call term_sendkeys(buf, repeat("j", 20))
2915 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_3', {})
2916
2917 call term_sendkeys(buf, "kk")
2918 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_4', {})
2919
2920 call term_sendkeys(buf, "k")
2921 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_5', {})
2922
2923 " if the cursor is in the top line, it stays in the top line.
2924 call term_sendkeys(buf, repeat("k", 20))
2925 call VerifyScreenDump(buf, 'Test_popupwin_menu_scroll_6', {})
2926
2927 " close the menu popupwin.
2928 call term_sendkeys(buf, " ")
2929
2930 " clean up
2931 call StopVimInTerminal(buf)
2932 call delete('XtestPopupMenuScroll')
2933endfunc
2934
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002935func Test_popup_menu_filter()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002936 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002937
2938 let lines =<< trim END
2939 function! MyFilter(winid, key) abort
2940 if a:key == "0"
2941 call win_execute(a:winid, "call setpos('.', [0, 1, 1, 0])")
2942 return 1
2943 endif
2944 if a:key == "G"
2945 call win_execute(a:winid, "call setpos('.', [0, line('$'), 1, 0])")
2946 return 1
2947 endif
2948 if a:key == "j"
2949 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0])")
2950 return 1
2951 endif
2952 if a:key == "k"
2953 call win_execute(a:winid, "call setpos('.', [0, line('.') - 1, 1, 0])")
2954 return 1
2955 endif
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002956 if a:key == ':'
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002957 call popup_close(a:winid)
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002958 return 0
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002959 endif
2960 return 0
2961 endfunction
2962 call popup_menu(['111', '222', '333', '444', '555', '666', '777', '888', '999'], #{
2963 \ maxheight : 3,
2964 \ filter : 'MyFilter'
2965 \ })
2966 END
2967 call writefile(lines, 'XtestPopupMenuFilter')
2968 let buf = RunVimInTerminal('-S XtestPopupMenuFilter', #{rows: 10})
2969
2970 call term_sendkeys(buf, "j")
2971 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_1', {})
2972
2973 call term_sendkeys(buf, "k")
2974 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_2', {})
2975
2976 call term_sendkeys(buf, "G")
2977 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_3', {})
2978
2979 call term_sendkeys(buf, "0")
2980 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_4', {})
2981
Bram Moolenaarbcb4c8f2019-09-07 14:06:52 +02002982 " check that when the popup is closed in the filter the screen is redrawn
2983 call term_sendkeys(buf, ":")
2984 call VerifyScreenDump(buf, 'Test_popupwin_menu_filter_5', {})
2985 call term_sendkeys(buf, "\<CR>")
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002986
2987 " clean up
2988 call StopVimInTerminal(buf)
2989 call delete('XtestPopupMenuFilter')
2990endfunc
2991
2992func Test_popup_cursorline()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02002993 CheckScreendump
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02002994
2995 let winid = popup_create('some text', {})
2996 call assert_equal(0, popup_getoptions(winid).cursorline)
2997 call popup_close(winid)
2998
2999 let winid = popup_create('some text', #{ cursorline: 1, })
3000 call assert_equal(1, popup_getoptions(winid).cursorline)
3001 call popup_close(winid)
3002
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003003 let winid = popup_create('some text', #{ cursorline: v:true, })
3004 call assert_equal(1, popup_getoptions(winid).cursorline)
3005 call popup_close(winid)
3006
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003007 let winid = popup_create('some text', #{ cursorline: 0, })
3008 call assert_equal(0, popup_getoptions(winid).cursorline)
3009 call popup_close(winid)
3010
3011 let winid = popup_menu('some text', {})
3012 call assert_equal(1, popup_getoptions(winid).cursorline)
3013 call popup_close(winid)
3014
3015 let winid = popup_menu('some text', #{ cursorline: 1, })
3016 call assert_equal(1, popup_getoptions(winid).cursorline)
3017 call popup_close(winid)
3018
3019 let winid = popup_menu('some text', #{ cursorline: 0, })
3020 call assert_equal(0, popup_getoptions(winid).cursorline)
3021 call popup_close(winid)
3022
3023 " ---------
3024 " Pattern 1
3025 " ---------
3026 let lines =<< trim END
3027 call popup_create(['111', '222', '333'], #{ cursorline : 0 })
3028 END
3029 call writefile(lines, 'XtestPopupCursorLine')
3030 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3031 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_1', {})
3032 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3033 call StopVimInTerminal(buf)
3034
3035 " ---------
3036 " Pattern 2
3037 " ---------
3038 let lines =<< trim END
3039 call popup_create(['111', '222', '333'], #{ cursorline : 1 })
3040 END
3041 call writefile(lines, 'XtestPopupCursorLine')
3042 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3043 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_2', {})
3044 call term_sendkeys(buf, ":call popup_clear()\<cr>")
3045 call StopVimInTerminal(buf)
3046
3047 " ---------
3048 " Pattern 3
3049 " ---------
3050 let lines =<< trim END
3051 function! MyFilter(winid, key) abort
3052 if a:key == "j"
3053 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3054 return 1
3055 endif
3056 if a:key == 'x'
3057 call popup_close(a:winid)
3058 return 1
3059 endif
3060 return 0
3061 endfunction
3062 call popup_menu(['111', '222', '333'], #{
3063 \ cursorline : 0,
3064 \ maxheight : 2,
3065 \ filter : 'MyFilter',
3066 \ })
3067 END
3068 call writefile(lines, 'XtestPopupCursorLine')
3069 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3070 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_3', {})
3071 call term_sendkeys(buf, "j")
3072 call term_sendkeys(buf, "j")
3073 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_4', {})
3074 call term_sendkeys(buf, "x")
3075 call StopVimInTerminal(buf)
3076
3077 " ---------
3078 " Pattern 4
3079 " ---------
3080 let lines =<< trim END
3081 function! MyFilter(winid, key) abort
3082 if a:key == "j"
3083 call win_execute(a:winid, "call setpos('.', [0, line('.') + 1, 1, 0]) | redraw")
3084 return 1
3085 endif
3086 if a:key == 'x'
3087 call popup_close(a:winid)
3088 return 1
3089 endif
3090 return 0
3091 endfunction
3092 call popup_menu(['111', '222', '333'], #{
3093 \ cursorline : 1,
3094 \ maxheight : 2,
3095 \ filter : 'MyFilter',
3096 \ })
3097 END
3098 call writefile(lines, 'XtestPopupCursorLine')
3099 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3100 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_5', {})
3101 call term_sendkeys(buf, "j")
3102 call term_sendkeys(buf, "j")
3103 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_6', {})
3104 call term_sendkeys(buf, "x")
3105 call StopVimInTerminal(buf)
3106
Bram Moolenaar3d2a3cb2019-09-08 17:12:01 +02003107 " ---------
3108 " Cursor in second line when creating the popup
3109 " ---------
3110 let lines =<< trim END
3111 let winid = popup_create(['111', '222', '333'], #{
3112 \ cursorline : 1,
3113 \ })
3114 call win_execute(winid, "2")
3115 END
3116 call writefile(lines, 'XtestPopupCursorLine')
3117 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3118 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_7', {})
3119 call StopVimInTerminal(buf)
3120
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003121 call delete('XtestPopupCursorLine')
Bram Moolenaar4eb7dae2019-11-12 22:33:45 +01003122
3123 " ---------
3124 " Use current buffer for popupmenu
3125 " ---------
3126 let lines =<< trim END
3127 call setline(1, ['one', 'two', 'three'])
3128 let winid = popup_create(bufnr('%'), #{
3129 \ cursorline : 1,
3130 \ })
3131 call win_execute(winid, "2")
3132 END
3133 call writefile(lines, 'XtestPopupCursorLine')
3134 let buf = RunVimInTerminal('-S XtestPopupCursorLine', #{rows: 10})
3135 call VerifyScreenDump(buf, 'Test_popupwin_cursorline_8', {})
3136 call StopVimInTerminal(buf)
3137
3138 call delete('XtestPopupCursorLine')
Bram Moolenaardf9c6ca2019-07-18 13:46:42 +02003139endfunc
3140
Bram Moolenaar6bfc4752021-02-21 23:12:18 +01003141def Test_popup_cursorline_vim9()
3142 var winid = popup_create('some text', { cursorline: true, })
3143 assert_equal(1, popup_getoptions(winid).cursorline)
3144 popup_close(winid)
3145
3146 assert_fails("popup_create('some text', { cursorline: 2, })", 'E1023:')
3147 popup_clear()
3148enddef
3149
Bram Moolenaarf914a332019-07-20 15:09:56 +02003150func Test_previewpopup()
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003151 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003152 CheckFeature quickfix
Bram Moolenaar4999a7f2019-08-10 22:21:48 +02003153
Bram Moolenaarf914a332019-07-20 15:09:56 +02003154 call writefile([
3155 \ "!_TAG_FILE_ENCODING\tutf-8\t//",
3156 \ "another\tXtagfile\t/^this is another",
3157 \ "theword\tXtagfile\t/^theword"],
3158 \ 'Xtags')
3159 call writefile(range(1,20)
3160 \ + ['theword is here']
3161 \ + range(22, 27)
3162 \ + ['this is another place']
3163 \ + range(29, 40),
3164 \ "Xtagfile")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003165 call writefile(range(1,10)
3166 \ + ['searched word is here']
3167 \ + range(12, 20),
3168 \ "Xheader.h")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003169 let lines =<< trim END
3170 set tags=Xtags
3171 call setline(1, [
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003172 \ 'one',
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003173 \ '#include "Xheader.h"',
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003174 \ 'three',
3175 \ 'four',
3176 \ 'five',
3177 \ 'six',
3178 \ 'seven',
3179 \ 'find theword somewhere',
3180 \ 'nine',
3181 \ 'this is another word',
3182 \ 'very long line where the word is also another'])
Bram Moolenaarf914a332019-07-20 15:09:56 +02003183 set previewpopup=height:4,width:40
Bram Moolenaar60577482021-03-04 21:35:07 +01003184 hi OtherColor ctermbg=lightcyan guibg=lightcyan
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003185 set path=.
Bram Moolenaarf914a332019-07-20 15:09:56 +02003186 END
3187 call writefile(lines, 'XtestPreviewPopup')
3188 let buf = RunVimInTerminal('-S XtestPreviewPopup', #{rows: 14})
3189
3190 call term_sendkeys(buf, "/theword\<CR>\<C-W>}")
3191 call term_sendkeys(buf, ":\<CR>")
3192 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_1', {})
3193
Bram Moolenaar60577482021-03-04 21:35:07 +01003194 call term_sendkeys(buf, ":set previewpopup+=highlight:OtherColor\<CR>")
Bram Moolenaarf914a332019-07-20 15:09:56 +02003195 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3196 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_2', {})
3197
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003198 call term_sendkeys(buf, ":call popup_move(popup_findpreview(), #{col: 15})\<CR>")
Bram Moolenaar13d5c3f2019-07-28 21:42:38 +02003199 call term_sendkeys(buf, ":\<CR>")
3200 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_3', {})
3201
3202 call term_sendkeys(buf, "/another\<CR>\<C-W>}")
3203 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_4', {})
3204
Bram Moolenaar799439a2020-02-11 21:44:17 +01003205 call term_sendkeys(buf, ":silent cd ..\<CR>:\<CR>")
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003206 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_5', {})
Bram Moolenaar799439a2020-02-11 21:44:17 +01003207 call term_sendkeys(buf, ":silent cd testdir\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003208
Bram Moolenaar60577482021-03-04 21:35:07 +01003209 call term_sendkeys(buf, ":set previewpopup-=highlight:OtherColor\<CR>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003210 call term_sendkeys(buf, ":pclose\<CR>")
Bram Moolenaar78d629a2019-08-16 17:31:15 +02003211 call term_sendkeys(buf, ":\<BS>")
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003212 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_6', {})
3213
3214 call term_sendkeys(buf, ":pedit +/theword Xtagfile\<CR>")
3215 call term_sendkeys(buf, ":\<CR>")
3216 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_7', {})
3217
3218 call term_sendkeys(buf, ":pclose\<CR>")
3219 call term_sendkeys(buf, ":psearch searched\<CR>")
3220 call term_sendkeys(buf, ":\<CR>")
3221 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_8', {})
Bram Moolenaar749fa0a2019-08-03 16:18:07 +02003222
Bram Moolenaar8bf716c2020-01-23 15:33:54 +01003223 call term_sendkeys(buf, "\<C-W>p")
3224 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_9', {})
3225
3226 call term_sendkeys(buf, ":call win_execute(popup_findpreview(), 'call popup_clear()')\<CR>")
3227 call VerifyScreenDump(buf, 'Test_popupwin_previewpopup_10', {})
3228
Bram Moolenaarf914a332019-07-20 15:09:56 +02003229 call StopVimInTerminal(buf)
3230 call delete('Xtags')
3231 call delete('Xtagfile')
3232 call delete('XtestPreviewPopup')
Bram Moolenaar1b6d9c42019-08-05 21:52:04 +02003233 call delete('Xheader.h')
Bram Moolenaarf914a332019-07-20 15:09:56 +02003234endfunc
3235
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003236func Get_popupmenu_lines()
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003237 let lines =<< trim END
3238 set completeopt+=preview,popup
3239 set completefunc=CompleteFuncDict
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003240 hi InfoPopup ctermbg=yellow
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003241
3242 func CompleteFuncDict(findstart, base)
3243 if a:findstart
3244 if col('.') > 10
3245 return col('.') - 10
3246 endif
3247 return 0
3248 endif
3249
3250 return {
3251 \ 'words': [
3252 \ {
3253 \ 'word': 'aword',
3254 \ 'abbr': 'wrd',
3255 \ 'menu': 'extra text',
3256 \ 'info': 'words are cool',
3257 \ 'kind': 'W',
3258 \ 'user_data': 'test'
3259 \ },
3260 \ {
3261 \ 'word': 'anotherword',
3262 \ 'abbr': 'anotwrd',
3263 \ 'menu': 'extra text',
3264 \ 'info': "other words are\ncooler than this and some more text\nto make wrap",
3265 \ 'kind': 'W',
3266 \ 'user_data': 'notest'
3267 \ },
3268 \ {
3269 \ 'word': 'noinfo',
3270 \ 'abbr': 'noawrd',
3271 \ 'menu': 'extra text',
Bram Moolenaar62a0cb42019-08-18 16:35:23 +02003272 \ 'info': "lets\nshow\na\nscrollbar\nhere",
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003273 \ 'kind': 'W',
3274 \ 'user_data': 'notest'
3275 \ },
3276 \ {
3277 \ 'word': 'thatword',
3278 \ 'abbr': 'thatwrd',
3279 \ 'menu': 'extra text',
3280 \ 'info': 'that word is cool',
3281 \ 'kind': 'W',
3282 \ 'user_data': 'notest'
3283 \ },
3284 \ ]
3285 \ }
3286 endfunc
3287 call setline(1, 'text text text text text text text ')
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003288 func ChangeColor()
3289 let id = popup_findinfo()
Bram Moolenaard356fc62020-12-09 18:13:44 +01003290 if buflisted(winbufnr(id))
3291 call setline(1, 'buffer is listed')
3292 endif
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003293 eval id->popup_setoptions(#{highlight: 'InfoPopup'})
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003294 endfunc
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003295
3296 func InfoHidden()
3297 set completepopup=height:4,border:off,align:menu
3298 set completeopt-=popup completeopt+=popuphidden
3299 au CompleteChanged * call HandleChange()
3300 endfunc
3301
3302 let s:counter = 0
3303 func HandleChange()
3304 let s:counter += 1
3305 let selected = complete_info(['selected']).selected
3306 if selected <= 0
3307 " First time: do nothing, info remains hidden
3308 return
3309 endif
3310 if selected == 1
3311 " Second time: show info right away
3312 let id = popup_findinfo()
3313 if id
3314 call popup_settext(id, 'immediate info ' .. s:counter)
3315 call popup_show(id)
3316 endif
3317 else
3318 " Third time: show info after a short delay
3319 call timer_start(100, 'ShowInfo')
3320 endif
3321 endfunc
3322
3323 func ShowInfo(...)
3324 let id = popup_findinfo()
3325 if id
3326 call popup_settext(id, 'async info ' .. s:counter)
3327 call popup_show(id)
3328 endif
3329 endfunc
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003330
Bakudankun65555002021-11-17 20:40:16 +00003331 func OpenOtherPopups()
3332 call popup_create([
3333 \ 'popup below',
3334 \ 'popup below',
3335 \ 'popup below',
3336 \ 'popup below',
3337 \ ], #{
3338 \ line: 'cursor',
3339 \ col: 'cursor+3',
3340 \ highlight: 'ErrorMsg',
3341 \ minwidth: 17,
3342 \ zindex: 50,
3343 \ })
3344 call popup_create([
3345 \ 'popup on top',
3346 \ 'popup on top',
3347 \ 'popup on top',
3348 \ ], #{
3349 \ line: 'cursor+3',
3350 \ col: 'cursor-10',
3351 \ highlight: 'Search',
3352 \ minwidth: 10,
3353 \ zindex: 200,
3354 \ })
3355 endfunc
3356
Bram Moolenaar2dfae042020-11-15 14:09:37 +01003357 " Check that no autocommands are triggered for the info popup
3358 au WinEnter * if win_gettype() == 'popup' | call setline(2, 'WinEnter') | endif
3359 au WinLeave * if win_gettype() == 'popup' | call setline(2, 'WinLeave') | endif
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003360 END
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003361 return lines
3362endfunc
3363
3364func Test_popupmenu_info_border()
3365 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003366 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003367
3368 let lines = Get_popupmenu_lines()
3369 call add(lines, 'set completepopup=height:4,highlight:InfoPopup')
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003370 call writefile(lines, 'XtestInfoPopup')
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003371
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003372 let buf = RunVimInTerminal('-S XtestInfoPopup', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003373 call TermWait(buf, 25)
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003374
3375 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3376 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_1', {})
3377
3378 call term_sendkeys(buf, "\<C-N>")
3379 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_2', {})
3380
3381 call term_sendkeys(buf, "\<C-N>")
3382 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_3', {})
3383
3384 call term_sendkeys(buf, "\<C-N>\<C-N>")
3385 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_4', {})
3386
Bram Moolenaarfe6e7612019-08-21 20:57:20 +02003387 " info on the left with scrollbar
3388 call term_sendkeys(buf, "test text test text\<C-X>\<C-U>")
3389 call term_sendkeys(buf, "\<C-N>\<C-N>")
3390 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_5', {})
3391
Bram Moolenaar202c3f72019-11-21 12:12:35 +01003392 " Test that the popupmenu's scrollbar and infopopup do not overlap
3393 call term_sendkeys(buf, "\<Esc>")
3394 call term_sendkeys(buf, ":set pumheight=3\<CR>")
3395 call term_sendkeys(buf, "cc\<C-X>\<C-U>")
3396 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_6', {})
3397
Bram Moolenaar8e7d6222020-12-18 19:49:56 +01003398 " Hide the info popup, cycle through buffers, make sure it didn't get
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003399 " deleted.
3400 call term_sendkeys(buf, "\<Esc>")
3401 call term_sendkeys(buf, ":set hidden\<CR>")
3402 call term_sendkeys(buf, ":bn\<CR>")
3403 call term_sendkeys(buf, ":bn\<CR>")
3404 call term_sendkeys(buf, "otest text test text\<C-X>\<C-U>")
3405 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_7', {})
3406
Bram Moolenaar447bfba2020-07-18 16:07:16 +02003407 " Test that when the option is changed the popup changes.
3408 call term_sendkeys(buf, "\<Esc>")
3409 call term_sendkeys(buf, ":set completepopup=border:off\<CR>")
3410 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3411 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_8', {})
3412
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003413 call term_sendkeys(buf, " \<Esc>")
3414 call term_sendkeys(buf, ":set completepopup+=width:10\<CR>")
3415 call term_sendkeys(buf, "a\<C-X>\<C-U>")
3416 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_9', {})
3417
Bram Moolenaarca7c0782020-01-14 20:42:48 +01003418 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaar576a4a62019-08-18 15:25:17 +02003419 call StopVimInTerminal(buf)
3420 call delete('XtestInfoPopup')
3421endfunc
3422
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003423func Test_popupmenu_info_noborder()
3424 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003425 CheckFeature quickfix
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003426
3427 let lines = Get_popupmenu_lines()
3428 call add(lines, 'set completepopup=height:4,border:off')
3429 call writefile(lines, 'XtestInfoPopupNb')
3430
3431 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003432 call TermWait(buf, 25)
Bram Moolenaarbd483b32019-08-21 15:13:41 +02003433
3434 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3435 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_nb_1', {})
3436
3437 call StopVimInTerminal(buf)
3438 call delete('XtestInfoPopupNb')
3439endfunc
3440
Bram Moolenaar258cef52019-08-21 17:29:29 +02003441func Test_popupmenu_info_align_menu()
3442 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003443 CheckFeature quickfix
Bram Moolenaar258cef52019-08-21 17:29:29 +02003444
3445 let lines = Get_popupmenu_lines()
3446 call add(lines, 'set completepopup=height:4,border:off,align:menu')
3447 call writefile(lines, 'XtestInfoPopupNb')
3448
3449 let buf = RunVimInTerminal('-S XtestInfoPopupNb', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003450 call TermWait(buf, 25)
Bram Moolenaar258cef52019-08-21 17:29:29 +02003451
3452 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3453 call term_sendkeys(buf, "\<C-N>")
3454 call term_sendkeys(buf, "\<C-N>")
3455 call term_sendkeys(buf, "\<C-N>")
3456 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_1', {})
3457
3458 call term_sendkeys(buf, "test text test text test\<C-X>\<C-U>")
3459 call term_sendkeys(buf, "\<C-N>")
3460 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_2', {})
3461
3462 call term_sendkeys(buf, "\<Esc>")
Bram Moolenaarc7c5f102019-08-21 18:31:03 +02003463 call term_sendkeys(buf, ":call ChangeColor()\<CR>")
Bram Moolenaar258cef52019-08-21 17:29:29 +02003464 call term_sendkeys(buf, ":call setline(2, ['x']->repeat(10))\<CR>")
3465 call term_sendkeys(buf, "Gotest text test text\<C-X>\<C-U>")
3466 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_align_3', {})
3467
3468 call StopVimInTerminal(buf)
3469 call delete('XtestInfoPopupNb')
3470endfunc
3471
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003472func Test_popupmenu_info_hidden()
3473 CheckScreendump
Bram Moolenaar5a4c3082019-12-01 15:23:11 +01003474 CheckFeature quickfix
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003475
3476 let lines = Get_popupmenu_lines()
3477 call add(lines, 'call InfoHidden()')
3478 call writefile(lines, 'XtestInfoPopupHidden')
3479
3480 let buf = RunVimInTerminal('-S XtestInfoPopupHidden', #{rows: 14})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003481 call TermWait(buf, 25)
Bram Moolenaardca7abe2019-10-20 18:17:57 +02003482
3483 call term_sendkeys(buf, "A\<C-X>\<C-U>")
3484 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_1', {})
3485
3486 call term_sendkeys(buf, "\<C-N>")
3487 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_2', {})
3488
3489 call term_sendkeys(buf, "\<C-N>")
3490 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_hidden_3', {})
3491
3492 call term_sendkeys(buf, "\<Esc>")
3493 call StopVimInTerminal(buf)
3494 call delete('XtestInfoPopupHidden')
3495endfunc
3496
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003497func Test_popupmenu_info_too_wide()
3498 CheckScreendump
3499 CheckFeature quickfix
3500
3501 let lines =<< trim END
3502 call setline(1, range(10))
3503
3504 set completeopt+=preview,popup
3505 set completepopup=align:menu
3506 set omnifunc=OmniFunc
3507 hi InfoPopup ctermbg=lightgrey
3508
3509 func OmniFunc(findstart, base)
3510 if a:findstart
3511 return 0
3512 endif
3513
3514 let menuText = 'some long text to make sure the menu takes up all of the width of the window'
3515 return #{
3516 \ words: [
3517 \ #{
3518 \ word: 'scrap',
3519 \ menu: menuText,
3520 \ info: "other words are\ncooler than this and some more text\nto make wrap",
3521 \ },
3522 \ #{
3523 \ word: 'scappier',
3524 \ menu: menuText,
3525 \ info: 'words are cool',
3526 \ },
3527 \ #{
3528 \ word: 'scrappier2',
3529 \ menu: menuText,
3530 \ info: 'words are cool',
3531 \ },
3532 \ ]
3533 \ }
3534 endfunc
3535 END
3536
3537 call writefile(lines, 'XtestInfoPopupWide')
3538 let buf = RunVimInTerminal('-S XtestInfoPopupWide', #{rows: 8})
Bram Moolenaar6a2c5a72020-04-08 21:50:25 +02003539 call TermWait(buf, 25)
Bram Moolenaarbef93ac2019-12-06 20:17:35 +01003540
3541 call term_sendkeys(buf, "Ascr\<C-X>\<C-O>")
3542 call VerifyScreenDump(buf, 'Test_popupwin_infopopup_wide_1', {})
3543
3544 call term_sendkeys(buf, "\<Esc>")
3545 call StopVimInTerminal(buf)
3546 call delete('XtestInfoPopupWide')
3547endfunc
3548
Bakudankun65555002021-11-17 20:40:16 +00003549func Test_popupmenu_masking()
3550 " Test that popup windows that are opened while popup menu is open are
3551 " properly displayed.
3552 CheckScreendump
3553 CheckFeature quickfix
3554
3555 let lines = Get_popupmenu_lines()
3556 call add(lines, 'inoremap <C-A> <Cmd>call OpenOtherPopups()<CR>')
3557 call writefile(lines, 'XtestPopupmenuMasking')
3558
3559 let buf = RunVimInTerminal('-S XtestPopupmenuMasking', #{rows: 14})
3560 call TermWait(buf, 25)
3561
3562 call term_sendkeys(buf, "A\<C-X>\<C-U>\<C-A>")
3563 call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_1', {})
3564
3565 call term_sendkeys(buf, "\<Esc>")
3566 call VerifyScreenDump(buf, 'Test_popupwin_popupmenu_masking_2', {})
3567
3568 call StopVimInTerminal(buf)
3569 call delete('XtestPopupmenuMasking')
3570endfunc
3571
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003572func Test_popupwin_recycle_bnr()
Bram Moolenaare49fbff2019-08-21 22:50:07 +02003573 let bufnr = popup_notification('nothing wrong', {})->winbufnr()
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003574 call popup_clear()
Bram Moolenaar6a124e62019-09-04 18:15:19 +02003575 let winid = 'nothing wrong'->popup_notification({})
Bram Moolenaar00b0d6d2019-08-21 22:25:30 +02003576 call assert_equal(bufnr, winbufnr(winid))
3577 call popup_clear()
3578endfunc
3579
Bram Moolenaar1824f452019-10-02 23:06:46 +02003580func Test_popupwin_getoptions_tablocal()
3581 topleft split
3582 let win1 = popup_create('nothing', #{maxheight: 8})
3583 let win2 = popup_create('something', #{maxheight: 10})
3584 let win3 = popup_create('something', #{maxheight: 15})
3585 call assert_equal(8, popup_getoptions(win1).maxheight)
3586 call assert_equal(10, popup_getoptions(win2).maxheight)
3587 call assert_equal(15, popup_getoptions(win3).maxheight)
3588 call popup_clear()
3589 quit
3590endfunc
3591
Bram Moolenaare8a7dfe2019-10-03 22:35:52 +02003592func Test_popupwin_cancel()
3593 let win1 = popup_create('one', #{line: 5, filter: {... -> 0}})
3594 let win2 = popup_create('two', #{line: 10, filter: {... -> 0}})
3595 let win3 = popup_create('three', #{line: 15, filter: {... -> 0}})
3596 call assert_equal(5, popup_getpos(win1).line)
3597 call assert_equal(10, popup_getpos(win2).line)
3598 call assert_equal(15, popup_getpos(win3).line)
3599 " TODO: this also works without patch 8.1.2110
3600 call feedkeys("\<C-C>", 'xt')
3601 call assert_equal(5, popup_getpos(win1).line)
3602 call assert_equal(10, popup_getpos(win2).line)
3603 call assert_equal({}, popup_getpos(win3))
3604 call feedkeys("\<C-C>", 'xt')
3605 call assert_equal(5, popup_getpos(win1).line)
3606 call assert_equal({}, popup_getpos(win2))
3607 call assert_equal({}, popup_getpos(win3))
3608 call feedkeys("\<C-C>", 'xt')
3609 call assert_equal({}, popup_getpos(win1))
3610 call assert_equal({}, popup_getpos(win2))
3611 call assert_equal({}, popup_getpos(win3))
3612endfunc
3613
Bram Moolenaarafe45b62019-11-13 22:35:19 +01003614func Test_popupwin_filter_redraw()
3615 " Create two popups with a filter that closes the popup when typing "0".
3616 " Both popups should close, even though the redraw also calls
3617 " popup_reset_handled()
3618
3619 func CloseFilter(winid, key)
3620 if a:key == '0'
3621 call popup_close(a:winid)
3622 redraw
3623 endif
3624 return 0 " pass the key
3625 endfunc
3626
3627 let id1 = popup_create('first one', #{
3628 \ line: 1,
3629 \ col: 1,
3630 \ filter: 'CloseFilter',
3631 \ })
3632 let id2 = popup_create('second one', #{
3633 \ line: 9,
3634 \ col: 1,
3635 \ filter: 'CloseFilter',
3636 \ })
3637 call assert_equal(1, popup_getpos(id1).line)
3638 call assert_equal(9, popup_getpos(id2).line)
3639
3640 call feedkeys('0', 'xt')
3641 call assert_equal({}, popup_getpos(id1))
3642 call assert_equal({}, popup_getpos(id2))
3643
3644 call popup_clear()
3645 delfunc CloseFilter
3646endfunc
3647
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003648func Test_popupwin_double_width()
3649 CheckScreendump
3650
3651 let lines =<< trim END
3652 call setline(1, 'x你好世界你好世你好世界你好')
3653 call setline(2, '你好世界你好世你好世界你好')
3654 call setline(3, 'x你好世界你好世你好世界你好')
3655 call popup_create('你好,世界 - 你好,世界xxxxx', #{line: 1, col: 3, maxwidth: 14})
3656 END
3657 call writefile(lines, 'XtestPopupWide')
3658
3659 let buf = RunVimInTerminal('-S XtestPopupWide', #{rows: 10})
3660 call VerifyScreenDump(buf, 'Test_popupwin_doublewidth_1', {})
3661
3662 call StopVimInTerminal(buf)
3663 call delete('XtestPopupWide')
3664endfunc
3665
3666func Test_popupwin_sign()
3667 CheckScreendump
3668
3669 let lines =<< trim END
3670 call setline(1, range(10))
3671 call sign_define('Current', {
3672 \ 'text': '>>',
3673 \ 'texthl': 'WarningMsg',
3674 \ 'linehl': 'Error',
3675 \ })
3676 call sign_define('Other', {
3677 \ 'text': '#!',
3678 \ 'texthl': 'Error',
3679 \ 'linehl': 'Search',
3680 \ })
3681 let winid = popup_create(['hello', 'bright', 'world'], {
3682 \ 'minwidth': 20,
3683 \ })
3684 call setwinvar(winid, "&signcolumn", "yes")
3685 let winbufnr = winbufnr(winid)
3686
3687 " add sign to current buffer, shows
3688 call sign_place(1, 'Selected', 'Current', bufnr('%'), {'lnum': 1})
3689 " add sign to current buffer, does not show
3690 call sign_place(2, 'PopUpSelected', 'Other', bufnr('%'), {'lnum': 2})
3691
3692 " add sign to popup buffer, shows
3693 call sign_place(3, 'PopUpSelected', 'Other', winbufnr, {'lnum': 1})
3694 " add sign to popup buffer, does not show
3695 call sign_place(4, 'Selected', 'Current', winbufnr, {'lnum': 2})
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003696
3697 func SetOptions()
3698 call setwinvar(g:winid, '&number', 1)
3699 call setwinvar(g:winid, '&foldcolumn', 2)
3700 call popup_settext(g:winid, 'a longer line to check the width')
3701 endfunc
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003702 END
3703 call writefile(lines, 'XtestPopupSign')
3704
3705 let buf = RunVimInTerminal('-S XtestPopupSign', #{rows: 10})
3706 call VerifyScreenDump(buf, 'Test_popupwin_sign_1', {})
3707
Bram Moolenaar0aac67a2020-07-27 22:40:37 +02003708 " set more options to check the width is adjusted
3709 call term_sendkeys(buf, ":call SetOptions()\<CR>")
3710 call VerifyScreenDump(buf, 'Test_popupwin_sign_2', {})
3711
Bram Moolenaar20ebbea2019-11-30 17:58:27 +01003712 call StopVimInTerminal(buf)
3713 call delete('XtestPopupSign')
3714endfunc
3715
Bram Moolenaar99ebf222019-12-10 23:44:48 +01003716func Test_popupwin_bufnr()
3717 let popwin = popup_create(['blah'], #{})
3718 let popbuf = winbufnr(popwin)
3719 split asdfasdf
3720 let newbuf = bufnr()
3721 call assert_true(newbuf > popbuf, 'New buffer number is higher')
3722 call assert_equal(newbuf, bufnr('$'))
3723 call popup_clear()
3724 let popwin = popup_create(['blah'], #{})
3725 " reuses previous buffer number
3726 call assert_equal(popbuf, winbufnr(popwin))
3727 call assert_equal(newbuf, bufnr('$'))
3728
3729 call popup_clear()
3730 bwipe!
3731endfunc
3732
Bram Moolenaarec084d32020-02-28 22:44:47 +01003733func Test_popupwin_filter_input_multibyte()
3734 func MyPopupFilter(winid, c)
3735 let g:bytes = range(a:c->strlen())->map({i -> char2nr(a:c[i])})
3736 return 0
3737 endfunc
3738 let winid = popup_create('', #{mapping: 0, filter: 'MyPopupFilter'})
3739
3740 " UTF-8: E3 80 80, including K_SPECIAL(0x80)
3741 call feedkeys("\u3000", 'xt')
3742 call assert_equal([0xe3, 0x80, 0x80], g:bytes)
3743
Bram Moolenaar8f027fe2020-03-04 23:21:35 +01003744 " UTF-8: E3 80 9B, including CSI(0x9B)
3745 call feedkeys("\u301b", 'xt')
3746 call assert_equal([0xe3, 0x80, 0x9b], g:bytes)
Bram Moolenaarec084d32020-02-28 22:44:47 +01003747
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003748 if has('unix')
3749 " with modifyOtherKeys <M-S-a> does not include a modifier sequence
Bram Moolenaarb326edf2020-06-20 15:03:38 +02003750 if has('gui_running')
3751 call feedkeys("\x9b\xfc\x08A", 'Lx!')
3752 else
3753 call feedkeys("\<Esc>[27;4;65~", 'Lx!')
3754 endif
Bram Moolenaar20298ce2020-06-19 21:46:52 +02003755 call assert_equal([0xc3, 0x81], g:bytes)
3756 endif
3757
Bram Moolenaarec084d32020-02-28 22:44:47 +01003758 call popup_clear()
3759 delfunc MyPopupFilter
3760 unlet g:bytes
3761endfunc
3762
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003763func Test_popupwin_filter_close_ctrl_c()
3764 CheckScreendump
3765
3766 let lines =<< trim END
3767 vsplit
3768 set laststatus=2
3769 set statusline=%!Statusline()
3770
3771 function Statusline() abort
3772 return '%<%f %h%m%r%=%-14.(%l,%c%V%) %P'
3773 endfunction
3774
3775 call popup_create('test test test test...', {'filter': {-> 0}})
3776 END
3777 call writefile(lines, 'XtestPopupCtrlC')
3778
3779 let buf = RunVimInTerminal('-S XtestPopupCtrlC', #{rows: 10})
3780
3781 call term_sendkeys(buf, "\<C-C>")
3782 call VerifyScreenDump(buf, 'Test_popupwin_ctrl_c', {})
3783
3784 call StopVimInTerminal(buf)
Bram Moolenaar6defa7b2020-09-08 22:06:44 +02003785 call delete('XtestPopupCtrlC')
3786endfunc
3787
3788func Test_popupwin_filter_close_wrong_name()
3789 CheckScreendump
3790
3791 let lines =<< trim END
3792 call popup_create('one two three...', {'filter': 'NoSuchFunc'})
3793 END
3794 call writefile(lines, 'XtestPopupWrongName')
3795
3796 let buf = RunVimInTerminal('-S XtestPopupWrongName', #{rows: 10})
3797
3798 call term_sendkeys(buf, "j")
3799 call VerifyScreenDump(buf, 'Test_popupwin_wrong_name', {})
3800
3801 call StopVimInTerminal(buf)
3802 call delete('XtestPopupWrongName')
3803endfunc
3804
3805func Test_popupwin_filter_close_three_errors()
3806 CheckScreendump
3807
3808 let lines =<< trim END
3809 set cmdheight=2
3810 call popup_create('one two three...', {'filter': 'filter'})
3811 END
3812 call writefile(lines, 'XtestPopupThreeErrors')
3813
3814 let buf = RunVimInTerminal('-S XtestPopupThreeErrors', #{rows: 10})
3815
3816 call term_sendkeys(buf, "jj")
3817 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_1', {})
3818 call term_sendkeys(buf, "j")
3819 call VerifyScreenDump(buf, 'Test_popupwin_three_errors_2', {})
3820
3821 call StopVimInTerminal(buf)
3822 call delete('XtestPopupThreeErrors')
Bram Moolenaar6f8f7332020-08-10 21:19:23 +02003823endfunc
3824
Bram Moolenaar927495b2020-11-06 17:58:35 +01003825func Test_popupwin_latin1_encoding()
3826 CheckScreendump
3827 CheckUnix
3828
3829 " When 'encoding' is a single-byte encoding a terminal window will mess up
3830 " the display. Check that showing a popup on top of that doesn't crash.
3831 let lines =<< trim END
3832 set encoding=latin1
3833 terminal cat Xmultibyte
3834 call popup_create(['one', 'two', 'three', 'four'], #{line: 1, col: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003835 redraw
Bram Moolenaarb125b532020-12-17 21:56:09 +01003836 " wait for "cat" to finish
3837 while execute('ls!') !~ 'finished'
3838 sleep 10m
3839 endwhile
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003840 echo "Done"
Bram Moolenaar927495b2020-11-06 17:58:35 +01003841 END
3842 call writefile(lines, 'XtestPopupLatin')
3843 call writefile([repeat("\u3042 ", 120)], 'Xmultibyte')
3844
3845 let buf = RunVimInTerminal('-S XtestPopupLatin', #{rows: 10})
Bram Moolenaar4c5bdb92020-12-17 17:45:59 +01003846 call WaitForAssert({-> assert_match('Done', term_getline(buf, 10))})
Bram Moolenaar927495b2020-11-06 17:58:35 +01003847
3848 call term_sendkeys(buf, ":q\<CR>")
3849 call StopVimInTerminal(buf)
3850 call delete('XtestPopupLatin')
3851 call delete('Xmultibyte')
3852endfunc
3853
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003854func Test_popupwin_atcursor_far_right()
3855 new
3856
3857 " this was getting stuck
3858 set signcolumn=yes
3859 call setline(1, repeat('=', &columns))
3860 normal! ggg$
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003861 let winid = popup_atcursor(repeat('x', 500), #{moved: 'any', border: []})
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003862
Bram Moolenaar6d585f42020-07-26 22:20:54 +02003863 " 'signcolumn' was getting reset
3864 call setwinvar(winid, '&signcolumn', 'yes')
3865 call popup_setoptions(winid, {'zindex': 1000})
3866 call assert_equal('yes', getwinvar(winid, '&signcolumn'))
3867
Bram Moolenaaref6b9792020-05-13 16:34:15 +02003868 call popup_close(winid)
Bram Moolenaarba2920f2020-03-06 21:43:17 +01003869 bwipe!
3870 set signcolumn&
3871endfunc
3872
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003873func Test_popupwin_splitmove()
3874 vsplit
3875 let win2 = win_getid()
3876 let popup_winid = popup_dialog('hello', {})
3877 call assert_fails('call win_splitmove(popup_winid, win2)', 'E957:')
3878 call assert_fails('call win_splitmove(win2, popup_winid)', 'E957:')
3879
3880 call popup_clear()
3881 bwipe
3882endfunc
3883
Bram Moolenaarcbcd9cb2020-11-07 16:58:59 +01003884func Test_popupwin_exiting_terminal()
3885 CheckFeature terminal
3886
3887 " Tests that when creating a popup right after closing a terminal window does
3888 " not make the popup the current window.
3889 let winid = win_getid()
3890 try
3891 augroup Test_popupwin_exiting_terminal
3892 autocmd!
3893 autocmd WinEnter * :call popup_create('test', {})
3894 augroup END
3895 let bnr = term_start(&shell, #{term_finish: 'close'})
3896 call term_sendkeys(bnr, "exit\r\n")
3897 call WaitForAssert({-> assert_equal(winid, win_getid())})
3898 finally
3899 call popup_clear(1)
3900 augroup Test_popupwin_exiting_terminal
3901 autocmd!
3902 augroup END
3903 endtry
3904endfunc
Bram Moolenaar0f1563f2020-03-20 21:15:51 +01003905
Bram Moolenaar014f6982021-01-04 13:18:30 +01003906func Test_popup_filter_menu()
3907 let colors = ['red', 'green', 'blue']
3908 call popup_menu(colors, #{callback: {_, result -> assert_equal('green', colors[result - 1])}})
3909 call feedkeys("\<c-n>\<c-n>\<c-p>\<cr>", 'xt')
3910endfunc
3911
Bram Moolenaar65026432021-02-06 14:22:32 +01003912func Test_popup_getoptions_other_tab()
3913 new
3914 call setline(1, 'some text')
3915 call prop_type_add('textprop', {})
3916 call prop_add(1, 1, #{type: 'textprop', length: 1})
3917 let id = popup_create('TEST', #{textprop: 'textprop', highlight: 'ErrorMsg', tabpage: 1})
3918 tab sp
3919 call assert_equal(['textprop', 'textpropid', 'textpropwin'], popup_getoptions(id)->keys()->filter({_, v -> v =~ 'textprop'}))
3920
3921 tabclose
Bram Moolenaarefa19232021-02-06 14:59:27 +01003922 call popup_close(id)
Bram Moolenaar65026432021-02-06 14:22:32 +01003923 bwipe!
3924 call prop_type_delete('textprop')
3925endfunc
3926
Bram Moolenaarefa19232021-02-06 14:59:27 +01003927
3928func Test_popup_setoptions_other_tab()
3929 new Xfile
3930 let winid = win_getid()
3931 call setline(1, 'some text')
3932 call prop_type_add('textprop', {})
3933 call prop_add(1, 1, #{type: 'textprop', length: 1})
3934 let id = popup_create('TEST', #{textprop: 'textprop'})
3935 tab sp
3936 call popup_setoptions(id, #{textprop: 'textprop', textpropwin: winid})
3937 call assert_equal(winid, popup_getoptions(id).textpropwin)
3938
3939 tabclose
3940 call popup_close(id)
3941 bwipe! Xfile
3942 call prop_type_delete('textprop')
3943endfunc
3944
Bram Moolenaar82db31c2021-02-10 14:56:11 +01003945func Test_popup_prop_not_visible()
3946 CheckScreendump
3947
3948 let lines =<< trim END
3949 vim9script
3950 set nowrap stal=2
3951 rightbelow :31vnew
3952 setline(1, ['', 'some text', '', 'other text'])
3953 prop_type_add('someprop', {})
3954 prop_add(2, 9, {type: 'someprop', length: 5})
3955 popup_create('attached to "some"', {
3956 textprop: 'someprop',
3957 highlight: 'ErrorMsg',
3958 line: -1,
3959 wrap: false,
3960 fixed: true,
3961 })
3962 prop_type_add('otherprop', {})
3963 prop_add(4, 10, {type: 'otherprop', length: 5})
3964 popup_create('attached to "other"', {
3965 textprop: 'otherprop',
3966 highlight: 'ErrorMsg',
3967 line: -1,
3968 wrap: false,
3969 fixed: false,
3970 })
3971 END
3972 call writefile(lines, 'XtestPropNotVisble')
3973 let buf = RunVimInTerminal('-S XtestPropNotVisble', #{rows: 10})
3974 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_01', {})
3975
3976 call term_sendkeys(buf, ":vert resize -14\<CR>")
3977 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_02', {})
3978
3979 call term_sendkeys(buf, ":vert resize -8\<CR>")
3980 call VerifyScreenDump(buf, 'Test_popup_prop_not_visible_03', {})
3981
3982 " clean up
3983 call StopVimInTerminal(buf)
3984 call delete('XtestPropNotVisble')
3985endfunction
3986
Bram Moolenaar7b4f76c2021-06-10 21:07:48 +02003987func Test_bufdel_skips_popupwin_buffer()
3988 let id = popup_create("Some text", {})
3989 %bd
3990 call popup_close(id)
3991endfunc
3992
Bram Moolenaar82db31c2021-02-10 14:56:11 +01003993
Bram Moolenaar331bafd2019-07-20 17:46:05 +02003994" vim: shiftwidth=2 sts=2