xref: /vim-8.2.3635/src/testdir/test_gui.vim (revision d68a0044)
1877e9577SBram Moolenaar" Tests specifically for the GUI
2877e9577SBram Moolenaar
39f0139a2SBram Moolenaarsource shared.vim
48c5a278fSBram Moolenaarsource check.vim
58c5a278fSBram MoolenaarCheckCanRunGui
6877e9577SBram Moolenaar
78be2fbb6SBram Moolenaarsource setup_gui.vim
813c724fbSBram Moolenaar
98be2fbb6SBram Moolenaarfunc Setup()
108be2fbb6SBram Moolenaar  call GUISetUpCommon()
1150fa8dd0SBram Moolenaarendfunc
1250fa8dd0SBram Moolenaar
1350fa8dd0SBram Moolenaarfunc TearDown()
148be2fbb6SBram Moolenaar  call GUITearDownCommon()
15877e9577SBram Moolenaarendfunc
16877e9577SBram Moolenaar
17877e9577SBram Moolenaar" Test for resetting "secure" flag after GUI has started.
185d7ead3bSBram Moolenaar" Must be run first, since it starts the GUI on Unix.
19877e9577SBram Moolenaarfunc Test_1_set_secure()
20877e9577SBram Moolenaar  set exrc secure
21877e9577SBram Moolenaar  gui -f
22877e9577SBram Moolenaar  call assert_equal(1, has('gui_running'))
23877e9577SBram Moolenaarendfunc
24877e9577SBram Moolenaar
25d5841f28SBram Moolenaar" As for non-GUI, a balloon_show() test was already added with patch 8.0.0401
26d5841f28SBram Moolenaarfunc Test_balloon_show()
276d91bcb4SBram Moolenaar  CheckFeature balloon_eval
28d5841f28SBram Moolenaar  " This won't do anything but must not crash either.
29d5841f28SBram Moolenaar  call balloon_show('hi!')
30d5841f28SBram Moolenaarendfunc
31d5841f28SBram Moolenaar
328774845cSBram Moolenaarfunc Test_colorscheme()
33acc770a1SBram Moolenaar  call assert_equal('16777216', &t_Co)
34acc770a1SBram Moolenaar
358774845cSBram Moolenaar  let colorscheme_saved = exists('g:colors_name') ? g:colors_name : 'default'
3660a68362SBram Moolenaar  let g:color_count = 0
3760a68362SBram Moolenaar  augroup TestColors
3860a68362SBram Moolenaar    au!
3960a68362SBram Moolenaar    au ColorScheme * let g:color_count += 1| let g:after_colors = g:color_count
4060a68362SBram Moolenaar    au ColorSchemePre * let g:color_count += 1 |let g:before_colors = g:color_count
4160a68362SBram Moolenaar  augroup END
428774845cSBram Moolenaar
438774845cSBram Moolenaar  colorscheme torte
448774845cSBram Moolenaar  redraw!
458774845cSBram Moolenaar  call assert_equal('dark', &background)
4660a68362SBram Moolenaar  call assert_equal(1, g:before_colors)
4760a68362SBram Moolenaar  call assert_equal(2, g:after_colors)
486d4470b0SBram Moolenaar  call assert_equal("\ntorte", execute('colorscheme'))
496d4470b0SBram Moolenaar
506d4470b0SBram Moolenaar  let a = substitute(execute('hi Search'), "\n\\s\\+", ' ', 'g')
516d4470b0SBram Moolenaar  call assert_match("\nSearch         xxx term=reverse ctermfg=0 ctermbg=12 gui=bold guifg=Black guibg=Red", a)
526d4470b0SBram Moolenaar
536d4470b0SBram Moolenaar  call assert_fails('colorscheme does_not_exist', 'E185:')
548774845cSBram Moolenaar
558774845cSBram Moolenaar  exec 'colorscheme' colorscheme_saved
5660a68362SBram Moolenaar  augroup TestColors
5760a68362SBram Moolenaar    au!
5860a68362SBram Moolenaar  augroup END
5960a68362SBram Moolenaar  unlet g:color_count g:after_colors g:before_colors
608774845cSBram Moolenaar  redraw!
618774845cSBram Moolenaarendfunc
628774845cSBram Moolenaar
636f785749SBram Moolenaarfunc Test_getfontname_with_arg()
6440bd5a15SBram Moolenaar  CheckX11BasedGui
654e9dbc74SBram Moolenaar
6640bd5a15SBram Moolenaar  if has('gui_athena') || has('gui_motif')
676f785749SBram Moolenaar    " Invalid font name. The result should be an empty string.
686f785749SBram Moolenaar    call assert_equal('', getfontname('notexist'))
696f785749SBram Moolenaar
706f785749SBram Moolenaar    " Valid font name. This is usually the real name of 7x13 by default.
718774845cSBram Moolenaar    let fname = '-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1'
728774845cSBram Moolenaar    call assert_match(fname, getfontname(fname))
736f785749SBram Moolenaar
746f785749SBram Moolenaar  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
756f785749SBram Moolenaar    " Invalid font name. The result should be the name plus the default size.
766f785749SBram Moolenaar    call assert_equal('notexist 10', getfontname('notexist'))
770e05de46SBram Moolenaar    call assert_equal('', getfontname('*'))
786f785749SBram Moolenaar
796f785749SBram Moolenaar    " Valid font name. This is usually the real name of Monospace by default.
804e9dbc74SBram Moolenaar    let fname = 'Bitstream Vera Sans Mono 12'
814e9dbc74SBram Moolenaar    call assert_equal(fname, getfontname(fname))
824e9dbc74SBram Moolenaar  endif
836f785749SBram Moolenaarendfunc
846f785749SBram Moolenaar
856f785749SBram Moolenaarfunc Test_getfontname_without_arg()
8640bd5a15SBram Moolenaar  CheckX11BasedGui
874e9dbc74SBram Moolenaar
884e9dbc74SBram Moolenaar  let fname = getfontname()
894e9dbc74SBram Moolenaar
9040bd5a15SBram Moolenaar  if has('gui_kde')
916f785749SBram Moolenaar    " 'expected' is the value specified by SetUp() above.
924e9dbc74SBram Moolenaar    call assert_equal('Courier 10 Pitch/8/-1/5/50/0/0/0/0/0', fname)
936f785749SBram Moolenaar  elseif has('gui_athena') || has('gui_motif')
948774845cSBram Moolenaar    " 'expected' is DFLT_FONT of gui_x11.c or its real name.
958774845cSBram Moolenaar    let pat = '\(7x13\)\|\(\c-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1\)'
968774845cSBram Moolenaar    call assert_match(pat, fname)
976f785749SBram Moolenaar  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
986f785749SBram Moolenaar    " 'expected' is DEFAULT_FONT of gui_gtk_x11.c.
994e9dbc74SBram Moolenaar    call assert_equal('Monospace 10', fname)
1004e9dbc74SBram Moolenaar  endif
1016f785749SBram Moolenaarendfunc
1026f785749SBram Moolenaar
1038774845cSBram Moolenaarfunc Test_getwinpos()
1048774845cSBram Moolenaar  call assert_match('Window position: X \d\+, Y \d\+', execute('winpos'))
1058774845cSBram Moolenaar  call assert_true(getwinposx() >= 0)
1068774845cSBram Moolenaar  call assert_true(getwinposy() >= 0)
107027df2a7SBram Moolenaar  call assert_equal([getwinposx(), getwinposy()], getwinpos())
1088774845cSBram Moolenaarendfunc
1098774845cSBram Moolenaar
1105074a0e0SBram Moolenaarfunc Test_quoteplus()
11140bd5a15SBram Moolenaar  CheckX11BasedGui
1125074a0e0SBram Moolenaar
11340bd5a15SBram Moolenaar  let g:test_is_flaky = 1
11440bd5a15SBram Moolenaar
1155074a0e0SBram Moolenaar  let quoteplus_saved = @+
1165074a0e0SBram Moolenaar
1175074a0e0SBram Moolenaar  let test_call     = 'Can you hear me?'
1185074a0e0SBram Moolenaar  let test_response = 'Yes, I can.'
11993344c2dSBram Moolenaar  let vim_exe = GetVimCommand()
1205074a0e0SBram Moolenaar  let testee = 'VIMRUNTIME=' . $VIMRUNTIME . '; export VIMRUNTIME;'
12193344c2dSBram Moolenaar        \ . vim_exe . ' --noplugin --not-a-term -c ''%s'''
122f8ab1b14SBram Moolenaar  " Ignore the "failed to create input context" error.
12324d7636eSBram Moolenaar  let cmd = 'call test_ignore_error("E285") | '
12424d7636eSBram Moolenaar        \ . 'gui -f | '
12524d7636eSBram Moolenaar        \ . 'call feedkeys("'
1265074a0e0SBram Moolenaar        \ . '\"+p'
1275074a0e0SBram Moolenaar        \ . ':s/' . test_call . '/' . test_response . '/\<CR>'
1285074a0e0SBram Moolenaar        \ . '\"+yis'
1295074a0e0SBram Moolenaar        \ . ':q!\<CR>", "tx")'
13024d7636eSBram Moolenaar  let run_vimtest = printf(testee, cmd)
1315074a0e0SBram Moolenaar
1325074a0e0SBram Moolenaar  " Set the quoteplus register to test_call, and another gvim will launched.
1335074a0e0SBram Moolenaar  " Then, it first tries to paste the content of its own quotedplus register
134027df2a7SBram Moolenaar  " onto it.  Second, it tries to substitute test_response for the pasted
1355074a0e0SBram Moolenaar  " sentence.  If the sentence is identical to test_call, the substitution
1365074a0e0SBram Moolenaar  " should succeed.  Third, it tries to yank the result of the substitution
1375074a0e0SBram Moolenaar  " to its own quoteplus register, and last it quits.  When system()
1385074a0e0SBram Moolenaar  " returns, the content of the quoteplus register should be identical to
1395074a0e0SBram Moolenaar  " test_response if those quoteplus registers are synchronized properly
1405074a0e0SBram Moolenaar  " with/through the X11 clipboard.
1415074a0e0SBram Moolenaar  let @+ = test_call
1425074a0e0SBram Moolenaar  call system(run_vimtest)
1435074a0e0SBram Moolenaar  call assert_equal(test_response, @+)
1445074a0e0SBram Moolenaar
1455074a0e0SBram Moolenaar  let @+ = quoteplus_saved
1465074a0e0SBram Moolenaarendfunc
1475074a0e0SBram Moolenaar
148*d68a0044SBram Moolenaarfunc Test_gui_read_stdin()
149*d68a0044SBram Moolenaar  CheckUnix
150*d68a0044SBram Moolenaar
151*d68a0044SBram Moolenaar  call writefile(['some', 'lines'], 'Xstdin')
152*d68a0044SBram Moolenaar  let script =<< trim END
153*d68a0044SBram Moolenaar      call writefile(getline(1, '$'), 'XstdinOK')
154*d68a0044SBram Moolenaar      qa!
155*d68a0044SBram Moolenaar  END
156*d68a0044SBram Moolenaar  call writefile(script, 'Xscript')
157*d68a0044SBram Moolenaar
158*d68a0044SBram Moolenaar  " Cannot use --not-a-term here, the "reading from stdin" message would not be
159*d68a0044SBram Moolenaar  " displayed.
160*d68a0044SBram Moolenaar  let vimcmd = substitute(GetVimCommand(), '--not-a-term', '', '')
161*d68a0044SBram Moolenaar
162*d68a0044SBram Moolenaar  call system('cat Xstdin | ' .. vimcmd .. ' -f -g -S Xscript -')
163*d68a0044SBram Moolenaar  call assert_equal(['some', 'lines'], readfile('XstdinOK'))
164*d68a0044SBram Moolenaar
165*d68a0044SBram Moolenaar  call delete('Xstdin')
166*d68a0044SBram Moolenaar  call delete('XstdinOK')
167*d68a0044SBram Moolenaar  call delete('Xscript')
168*d68a0044SBram Moolenaarendfunc
169*d68a0044SBram Moolenaar
1708774845cSBram Moolenaarfunc Test_set_background()
1718774845cSBram Moolenaar  let background_saved = &background
1728774845cSBram Moolenaar
1738774845cSBram Moolenaar  set background&
1748774845cSBram Moolenaar  call assert_equal('light', &background)
1758774845cSBram Moolenaar
1768774845cSBram Moolenaar  set background=dark
1778774845cSBram Moolenaar  call assert_equal('dark', &background)
1788774845cSBram Moolenaar
1798774845cSBram Moolenaar  let &background = background_saved
1808774845cSBram Moolenaarendfunc
1818774845cSBram Moolenaar
182d5841f28SBram Moolenaarfunc Test_set_balloondelay()
1836d91bcb4SBram Moolenaar  CheckOption balloondelay
184d5841f28SBram Moolenaar
185d5841f28SBram Moolenaar  let balloondelay_saved = &balloondelay
186d5841f28SBram Moolenaar
187d5841f28SBram Moolenaar  " Check if the default value is identical to that described in the manual.
188d5841f28SBram Moolenaar  set balloondelay&
189d5841f28SBram Moolenaar  call assert_equal(600, &balloondelay)
190d5841f28SBram Moolenaar
191d5841f28SBram Moolenaar  " Edge cases
192d5841f28SBram Moolenaar
193d5841f28SBram Moolenaar  " XXX This fact should be hidden so that people won't be tempted to write
194d5841f28SBram Moolenaar  " plugin/TimeMachine.vim.  TODO Add reasonable range checks to the source
195d5841f28SBram Moolenaar  " code.
196d5841f28SBram Moolenaar  set balloondelay=-1
197d5841f28SBram Moolenaar  call assert_equal(-1, &balloondelay)
198d5841f28SBram Moolenaar
199d5841f28SBram Moolenaar  " Though it's possible to interpret the zero delay to be 'as soon as
200d5841f28SBram Moolenaar  " possible' or even 'indefinite', its actual meaning depends on the GUI
201d5841f28SBram Moolenaar  " toolkit in use after all.
202d5841f28SBram Moolenaar  set balloondelay=0
203d5841f28SBram Moolenaar  call assert_equal(0, &balloondelay)
204d5841f28SBram Moolenaar
205d5841f28SBram Moolenaar  set balloondelay=1
206d5841f28SBram Moolenaar  call assert_equal(1, &balloondelay)
207d5841f28SBram Moolenaar
208d5841f28SBram Moolenaar  " Since p_bdelay is of type long currently, the upper bound can be
209d5841f28SBram Moolenaar  " impractically huge and machine-dependent.  Practically, it's sufficient
2100f9ea22cSBram Moolenaar  " to check if balloondelay works with 0x7fffffff (32 bits) for now.
2110f9ea22cSBram Moolenaar  set balloondelay=2147483647
2120f9ea22cSBram Moolenaar  call assert_equal(2147483647, &balloondelay)
213d5841f28SBram Moolenaar
214d5841f28SBram Moolenaar  let &balloondelay = balloondelay_saved
215d5841f28SBram Moolenaarendfunc
216d5841f28SBram Moolenaar
217d5841f28SBram Moolenaarfunc Test_set_ballooneval()
2186d91bcb4SBram Moolenaar  CheckOption ballooneval
219d5841f28SBram Moolenaar
220d5841f28SBram Moolenaar  let ballooneval_saved = &ballooneval
221d5841f28SBram Moolenaar
222d5841f28SBram Moolenaar  set ballooneval&
223d5841f28SBram Moolenaar  call assert_equal(0, &ballooneval)
224d5841f28SBram Moolenaar
225d5841f28SBram Moolenaar  set ballooneval
226d5841f28SBram Moolenaar  call assert_notequal(0, &ballooneval)
227d5841f28SBram Moolenaar
228d5841f28SBram Moolenaar  set noballooneval
229d5841f28SBram Moolenaar  call assert_equal(0, &ballooneval)
230d5841f28SBram Moolenaar
231d5841f28SBram Moolenaar  let &ballooneval = ballooneval_saved
232d5841f28SBram Moolenaarendfunc
233d5841f28SBram Moolenaar
234d5841f28SBram Moolenaarfunc Test_set_balloonexpr()
2356d91bcb4SBram Moolenaar  CheckOption balloonexpr
236d5841f28SBram Moolenaar
237d5841f28SBram Moolenaar  let balloonexpr_saved = &balloonexpr
238d5841f28SBram Moolenaar
239d5841f28SBram Moolenaar  " Default value
240d5841f28SBram Moolenaar  set balloonexpr&
241d5841f28SBram Moolenaar  call assert_equal('', &balloonexpr)
242d5841f28SBram Moolenaar
243d5841f28SBram Moolenaar  " User-defined function
244d5841f28SBram Moolenaar  new
245d5841f28SBram Moolenaar  func MyBalloonExpr()
246d5841f28SBram Moolenaar      return 'Cursor is at line ' . v:beval_lnum .
247d5841f28SBram Moolenaar	      \', column ' . v:beval_col .
248d5841f28SBram Moolenaar	      \ ' of file ' .  bufname(v:beval_bufnr) .
249d5841f28SBram Moolenaar	      \ ' on word "' . v:beval_text . '"' .
250d5841f28SBram Moolenaar	      \ ' in window ' . v:beval_winid . ' (#' . v:beval_winnr . ')'
251d5841f28SBram Moolenaar  endfunc
252d5841f28SBram Moolenaar  setl balloonexpr=MyBalloonExpr()
253d5841f28SBram Moolenaar  setl ballooneval
254d5841f28SBram Moolenaar  call assert_equal('MyBalloonExpr()', &balloonexpr)
255d5841f28SBram Moolenaar  " TODO Read non-empty text, place the pointer at a character of a word,
256027df2a7SBram Moolenaar  " and check if the content of the balloon is the same as what is expected.
257d5841f28SBram Moolenaar  " Also, check if textlock works as expected.
258d5841f28SBram Moolenaar  setl balloonexpr&
259d5841f28SBram Moolenaar  call assert_equal('', &balloonexpr)
260d5841f28SBram Moolenaar  delfunc MyBalloonExpr
261d5841f28SBram Moolenaar  bwipe!
262d5841f28SBram Moolenaar
263d5841f28SBram Moolenaar  " Multiline support
264d5841f28SBram Moolenaar  if has('balloon_multiline')
265d5841f28SBram Moolenaar    " Multiline balloon using NL
266d5841f28SBram Moolenaar    new
267d5841f28SBram Moolenaar    func MyBalloonFuncForMultilineUsingNL()
268d5841f28SBram Moolenaar      return "Multiline\nSuppported\nBalloon\nusing NL"
269d5841f28SBram Moolenaar    endfunc
270d5841f28SBram Moolenaar    setl balloonexpr=MyBalloonFuncForMultilineUsingNL()
271d5841f28SBram Moolenaar    setl ballooneval
272d5841f28SBram Moolenaar    call assert_equal('MyBalloonFuncForMultilineUsingNL()', &balloonexpr)
273d5841f28SBram Moolenaar    " TODO Read non-empty text, place the pointer at a character of a word,
274027df2a7SBram Moolenaar    " and check if the content of the balloon is the same as what is
275d5841f28SBram Moolenaar    " expected.  Also, check if textlock works as expected.
276d5841f28SBram Moolenaar    setl balloonexpr&
277d5841f28SBram Moolenaar    delfunc MyBalloonFuncForMultilineUsingNL
278d5841f28SBram Moolenaar    bwipe!
279d5841f28SBram Moolenaar
280d5841f28SBram Moolenaar    " Multiline balloon using List
281d5841f28SBram Moolenaar    new
282d5841f28SBram Moolenaar    func MyBalloonFuncForMultilineUsingList()
283d5841f28SBram Moolenaar      return [ 'Multiline', 'Suppported', 'Balloon', 'using List' ]
284d5841f28SBram Moolenaar    endfunc
285d5841f28SBram Moolenaar    setl balloonexpr=MyBalloonFuncForMultilineUsingList()
286d5841f28SBram Moolenaar    setl ballooneval
287d5841f28SBram Moolenaar    call assert_equal('MyBalloonFuncForMultilineUsingList()', &balloonexpr)
288d5841f28SBram Moolenaar    " TODO Read non-empty text, place the pointer at a character of a word,
289027df2a7SBram Moolenaar    " and check if the content of the balloon is the same as what is
290d5841f28SBram Moolenaar    " expected.  Also, check if textlock works as expected.
291d5841f28SBram Moolenaar    setl balloonexpr&
292d5841f28SBram Moolenaar    delfunc MyBalloonFuncForMultilineUsingList
293d5841f28SBram Moolenaar    bwipe!
294d5841f28SBram Moolenaar  endif
295d5841f28SBram Moolenaar
296d5841f28SBram Moolenaar  let &balloonexpr = balloonexpr_saved
297d5841f28SBram Moolenaarendfunc
298d5841f28SBram Moolenaar
2998774845cSBram Moolenaar" Invalid arguments are tested with test_options in conjunction with segfaults
3008774845cSBram Moolenaar" caused by them (Patch 8.0.0357, 24922ec233).
3018774845cSBram Moolenaarfunc Test_set_guicursor()
3028774845cSBram Moolenaar  let guicursor_saved = &guicursor
3038774845cSBram Moolenaar
3048774845cSBram Moolenaar  let default = [
3058774845cSBram Moolenaar        \ "n-v-c:block-Cursor/lCursor",
3068774845cSBram Moolenaar        \ "ve:ver35-Cursor",
3078774845cSBram Moolenaar        \ "o:hor50-Cursor",
3088774845cSBram Moolenaar        \ "i-ci:ver25-Cursor/lCursor",
3098774845cSBram Moolenaar        \ "r-cr:hor20-Cursor/lCursor",
3108774845cSBram Moolenaar        \ "sm:block-Cursor-blinkwait175-blinkoff150-blinkon175"
3118774845cSBram Moolenaar        \ ]
3128774845cSBram Moolenaar
3138774845cSBram Moolenaar  " Default Value
3148774845cSBram Moolenaar  set guicursor&
3158774845cSBram Moolenaar  call assert_equal(join(default, ','), &guicursor)
3168774845cSBram Moolenaar
3178774845cSBram Moolenaar  " Argument List Example 1
3188774845cSBram Moolenaar  let opt_list = copy(default)
3198774845cSBram Moolenaar  let opt_list[0] = "n-c-v:block-nCursor"
3208774845cSBram Moolenaar  exec "set guicursor=" . join(opt_list, ',')
3218774845cSBram Moolenaar  call assert_equal(join(opt_list, ','), &guicursor)
3228774845cSBram Moolenaar  unlet opt_list
3238774845cSBram Moolenaar
3248774845cSBram Moolenaar  " Argument List Example 2
3258774845cSBram Moolenaar  let opt_list = copy(default)
3268774845cSBram Moolenaar  let opt_list[3] = "i-ci:ver30-iCursor-blinkwait300-blinkon200-blinkoff150"
3278774845cSBram Moolenaar  exec "set guicursor=" . join(opt_list, ',')
3288774845cSBram Moolenaar  call assert_equal(join(opt_list, ','), &guicursor)
3298774845cSBram Moolenaar  unlet opt_list
3308774845cSBram Moolenaar
3318774845cSBram Moolenaar  " 'a' Mode
3328774845cSBram Moolenaar  set guicursor&
3338774845cSBram Moolenaar  let &guicursor .= ',a:blinkon0'
3348774845cSBram Moolenaar  call assert_equal(join(default, ',') . ",a:blinkon0", &guicursor)
3358774845cSBram Moolenaar
3368774845cSBram Moolenaar  let &guicursor = guicursor_saved
3378774845cSBram Moolenaarendfunc
3388774845cSBram Moolenaar
33940bd5a15SBram Moolenaarfunc Test_set_guifont_errors()
34040bd5a15SBram Moolenaar  if has('win32')
34140bd5a15SBram Moolenaar    " Invalid font names are accepted in GTK GUI
34240bd5a15SBram Moolenaar    call assert_fails('set guifont=xa1bc23d7f', 'E596:')
34340bd5a15SBram Moolenaar  endif
34440bd5a15SBram Moolenaar
34540bd5a15SBram Moolenaar  " This only works if 'renderoptions' exists and does not work for Windows XP
34640bd5a15SBram Moolenaar  " and older.
34740bd5a15SBram Moolenaar  if exists('+renderoptions') && windowsversion() !~ '^[345]\.'
34840bd5a15SBram Moolenaar    " doing this four times used to cause a crash
34940bd5a15SBram Moolenaar    set renderoptions=type:directx
35040bd5a15SBram Moolenaar    for i in range(5)
35140bd5a15SBram Moolenaar      set guifont=
35240bd5a15SBram Moolenaar    endfor
35340bd5a15SBram Moolenaar    set renderoptions=
35440bd5a15SBram Moolenaar    for i in range(5)
35540bd5a15SBram Moolenaar      set guifont=
35640bd5a15SBram Moolenaar    endfor
35740bd5a15SBram Moolenaar  endif
35840bd5a15SBram Moolenaarendfunc
35940bd5a15SBram Moolenaar
36043dded8cSBram Moolenaarfunc Test_set_guifont()
36140bd5a15SBram Moolenaar  CheckX11BasedGui
3624e9dbc74SBram Moolenaar
3634e9dbc74SBram Moolenaar  let guifont_saved = &guifont
36443dded8cSBram Moolenaar  if has('xfontset')
36543dded8cSBram Moolenaar    " Prevent 'guifontset' from canceling 'guifont'.
3664e9dbc74SBram Moolenaar    let guifontset_saved = &guifontset
36743dded8cSBram Moolenaar    set guifontset=
36843dded8cSBram Moolenaar  endif
36943dded8cSBram Moolenaar
37040bd5a15SBram Moolenaar  if has('gui_athena') || has('gui_motif')
37143dded8cSBram Moolenaar    " Non-empty font list with invalid font names.
37243dded8cSBram Moolenaar    "
37343dded8cSBram Moolenaar    " This test is twofold: (1) It checks if the command fails as expected
37443dded8cSBram Moolenaar    " when there are no loadable fonts found in the list. (2) It checks if
37543dded8cSBram Moolenaar    " 'guifont' remains the same after the command loads none of the fonts
37643dded8cSBram Moolenaar    " listed.
3774e9dbc74SBram Moolenaar    let flist = &guifont
37843dded8cSBram Moolenaar    call assert_fails('set guifont=-notexist1-*,-notexist2-*')
3794e9dbc74SBram Moolenaar    call assert_equal(flist, &guifont)
38043dded8cSBram Moolenaar
38143dded8cSBram Moolenaar    " Non-empty font list with a valid font name.  Should pick up the first
38243dded8cSBram Moolenaar    " valid font.
38343dded8cSBram Moolenaar    set guifont=-notexist1-*,fixed,-notexist2-*
3848774845cSBram Moolenaar    let pat = '\(fixed\)\|\(\c-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1\)'
3858774845cSBram Moolenaar    call assert_match(pat, getfontname())
38643dded8cSBram Moolenaar
38743dded8cSBram Moolenaar    " Empty list. Should fallback to the built-in default.
38843dded8cSBram Moolenaar    set guifont=
3898774845cSBram Moolenaar    let pat = '\(7x13\)\|\(\c-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1\)'
3908774845cSBram Moolenaar    call assert_match(pat, getfontname())
39143dded8cSBram Moolenaar
39243dded8cSBram Moolenaar  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
39343dded8cSBram Moolenaar    " For GTK, what we refer to as 'font names' in our manual are actually
39443dded8cSBram Moolenaar    " 'initial font patterns'.  A valid font which matches the 'canonical font
39543dded8cSBram Moolenaar    " pattern' constructed from a given 'initial pattern' is to be looked up
39643dded8cSBram Moolenaar    " and loaded.  That explains why the GTK GUIs appear to accept 'invalid
39743dded8cSBram Moolenaar    " font names'.
39843dded8cSBram Moolenaar    "
39943dded8cSBram Moolenaar    " Non-empty list.  Should always pick up the first element, no matter how
40043dded8cSBram Moolenaar    " strange it is, as explained above.
40143dded8cSBram Moolenaar    set guifont=(´・ω・`)\ 12,Courier\ 12
40243dded8cSBram Moolenaar    call assert_equal('(´・ω・`) 12', getfontname())
40343dded8cSBram Moolenaar
40443dded8cSBram Moolenaar    " Empty list. Should fallback to the built-in default.
40543dded8cSBram Moolenaar    set guifont=
40643dded8cSBram Moolenaar    call assert_equal('Monospace 10', getfontname())
40743dded8cSBram Moolenaar  endif
40843dded8cSBram Moolenaar
40943dded8cSBram Moolenaar  if has('xfontset')
4104e9dbc74SBram Moolenaar    let &guifontset = guifontset_saved
41143dded8cSBram Moolenaar  endif
4124e9dbc74SBram Moolenaar  let &guifont = guifont_saved
41343dded8cSBram Moolenaarendfunc
41443dded8cSBram Moolenaar
41510434674SBram Moolenaarfunc Test_set_guifontset()
416ce90e36fSBram Moolenaar  CheckFeature xfontset
4174e9dbc74SBram Moolenaar  let skipped = ''
41810434674SBram Moolenaar
419ee4e0c1eSBram Moolenaar  call assert_fails('set guifontset=*', 'E597:')
420ee4e0c1eSBram Moolenaar
4214e9dbc74SBram Moolenaar  let ctype_saved = v:ctype
4224e9dbc74SBram Moolenaar
4234e9dbc74SBram Moolenaar  " First, since XCreateFontSet(3) is very sensitive to locale, fonts must
4244e9dbc74SBram Moolenaar  " be chosen meticulously.
4254e9dbc74SBram Moolenaar  let font_head = '-misc-fixed-medium-r-normal--14'
4264e9dbc74SBram Moolenaar
4274e9dbc74SBram Moolenaar  let font_aw70 = font_head . '-130-75-75-c-70'
4284e9dbc74SBram Moolenaar  let font_aw140 = font_head . '-130-75-75-c-140'
4294e9dbc74SBram Moolenaar
4304e9dbc74SBram Moolenaar  let font_jisx0201 = font_aw70 . '-jisx0201.1976-0'
4314e9dbc74SBram Moolenaar  let font_jisx0208 = font_aw140 . '-jisx0208.1983-0'
4324e9dbc74SBram Moolenaar
4334e9dbc74SBram Moolenaar  let full_XLFDs = join([ font_jisx0208, font_jisx0201 ], ',')
4344e9dbc74SBram Moolenaar  let short_XLFDs = join([ font_aw140, font_aw70 ], ',')
4354e9dbc74SBram Moolenaar  let singleton = font_head . '-*'
4364e9dbc74SBram Moolenaar  let aliases = 'k14,r14'
4374e9dbc74SBram Moolenaar
4384e9dbc74SBram Moolenaar  " Second, among 'locales', look up such a locale that gets 'set
4394e9dbc74SBram Moolenaar  " guifontset=' to work successfully with every fontset specified with
4404e9dbc74SBram Moolenaar  " 'fontsets'.
4414e9dbc74SBram Moolenaar  let locales = [ 'ja_JP.UTF-8', 'ja_JP.eucJP', 'ja_JP.SJIS' ]
4424e9dbc74SBram Moolenaar  let fontsets = [ full_XLFDs, short_XLFDs, singleton, aliases ]
4434e9dbc74SBram Moolenaar
4444e9dbc74SBram Moolenaar  let feasible = 0
4454e9dbc74SBram Moolenaar  for locale in locales
4464e9dbc74SBram Moolenaar    try
4474e9dbc74SBram Moolenaar      exec 'language ctype' locale
4484e9dbc74SBram Moolenaar    catch /^Vim\%((\a\+)\)\=:E197/
4494e9dbc74SBram Moolenaar      continue
4504e9dbc74SBram Moolenaar    endtry
4514e9dbc74SBram Moolenaar    let done = 0
4524e9dbc74SBram Moolenaar    for fontset in fontsets
4534e9dbc74SBram Moolenaar      try
4544e9dbc74SBram Moolenaar	exec 'set guifontset=' . fontset
4554e9dbc74SBram Moolenaar      catch /^Vim\%((\a\+)\)\=:E\%(250\|252\|234\|597\|598\)/
4564e9dbc74SBram Moolenaar	break
4574e9dbc74SBram Moolenaar      endtry
4584e9dbc74SBram Moolenaar      let done += 1
4594e9dbc74SBram Moolenaar    endfor
4604e9dbc74SBram Moolenaar    if done == len(fontsets)
4614e9dbc74SBram Moolenaar      let feasible = 1
4624e9dbc74SBram Moolenaar      break
4634e9dbc74SBram Moolenaar    endif
4644e9dbc74SBram Moolenaar  endfor
4654e9dbc74SBram Moolenaar
4664e9dbc74SBram Moolenaar  " Third, give a set of tests if it is found feasible.
4674e9dbc74SBram Moolenaar  if !feasible
4688be2fbb6SBram Moolenaar    let skipped = g:not_hosted
4694e9dbc74SBram Moolenaar  else
4704e9dbc74SBram Moolenaar    " N.B. 'v:ctype' has already been set to an appropriate value in the
4714e9dbc74SBram Moolenaar    " previous loop.
4724e9dbc74SBram Moolenaar    for fontset in fontsets
4734e9dbc74SBram Moolenaar      exec 'set guifontset=' . fontset
4744e9dbc74SBram Moolenaar      call assert_equal(fontset, &guifontset)
4754e9dbc74SBram Moolenaar    endfor
47610434674SBram Moolenaar  endif
47710434674SBram Moolenaar
4784e9dbc74SBram Moolenaar  " Finally, restore ctype.
4794e9dbc74SBram Moolenaar  exec 'language ctype' ctype_saved
4804e9dbc74SBram Moolenaar
4814e9dbc74SBram Moolenaar  if !empty(skipped)
4824e9dbc74SBram Moolenaar    throw skipped
48310434674SBram Moolenaar  endif
48410434674SBram Moolenaarendfunc
48510434674SBram Moolenaar
48610434674SBram Moolenaarfunc Test_set_guifontwide()
48740bd5a15SBram Moolenaar  CheckX11BasedGui
48810434674SBram Moolenaar
48940bd5a15SBram Moolenaar  call assert_fails('set guifontwide=*', 'E533:')
49040bd5a15SBram Moolenaar
49140bd5a15SBram Moolenaar  if has('gui_gtk')
4924e9dbc74SBram Moolenaar    let guifont_saved = &guifont
4934e9dbc74SBram Moolenaar    let guifontwide_saved = &guifontwide
49410434674SBram Moolenaar
4954e9dbc74SBram Moolenaar    let fc_match = exepath('fc-match')
4964e9dbc74SBram Moolenaar    if empty(fc_match)
4978be2fbb6SBram Moolenaar      let skipped = g:not_hosted
49810434674SBram Moolenaar    else
4994e9dbc74SBram Moolenaar      let &guifont = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=en')
5004e9dbc74SBram Moolenaar      let wide = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=ja')
5014e9dbc74SBram Moolenaar      exec 'set guifontwide=' . fnameescape(wide)
5024e9dbc74SBram Moolenaar      call assert_equal(wide, &guifontwide)
50310434674SBram Moolenaar    endif
50410434674SBram Moolenaar
5054e9dbc74SBram Moolenaar    let &guifontwide = guifontwide_saved
5064e9dbc74SBram Moolenaar    let &guifont = guifont_saved
50710434674SBram Moolenaar
50810434674SBram Moolenaar  elseif has('gui_athena') || has('gui_motif')
50910434674SBram Moolenaar    " guifontwide is premised upon the xfontset feature.
5104e9dbc74SBram Moolenaar    if !has('xfontset')
5118be2fbb6SBram Moolenaar      let skipped = g:not_supported . 'xfontset'
5124e9dbc74SBram Moolenaar    else
5134e9dbc74SBram Moolenaar      let encoding_saved    = &encoding
5144e9dbc74SBram Moolenaar      let guifont_saved     = &guifont
5154e9dbc74SBram Moolenaar      let guifontset_saved  = &guifontset
5164e9dbc74SBram Moolenaar      let guifontwide_saved = &guifontwide
51710434674SBram Moolenaar
5184e9dbc74SBram Moolenaar      let nfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-90-iso10646-1'
5194e9dbc74SBram Moolenaar      let wfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-180-iso10646-1'
52010434674SBram Moolenaar
52110434674SBram Moolenaar      set encoding=utf-8
52210434674SBram Moolenaar
52310434674SBram Moolenaar      " Case 1: guifontset is empty
52410434674SBram Moolenaar      set guifontset=
52510434674SBram Moolenaar
52610434674SBram Moolenaar      " Case 1-1: Automatic selection
52710434674SBram Moolenaar      set guifontwide=
5284e9dbc74SBram Moolenaar      exec 'set guifont=' . nfont
5294e9dbc74SBram Moolenaar      call assert_equal(wfont, &guifontwide)
53010434674SBram Moolenaar
53110434674SBram Moolenaar      " Case 1-2: Manual selection
5324e9dbc74SBram Moolenaar      exec 'set guifontwide=' . wfont
5334e9dbc74SBram Moolenaar      exec 'set guifont=' . nfont
5344e9dbc74SBram Moolenaar      call assert_equal(wfont, &guifontwide)
53510434674SBram Moolenaar
53610434674SBram Moolenaar      " Case 2: guifontset is invalid
53710434674SBram Moolenaar      try
53810434674SBram Moolenaar        set guifontset=-*-notexist-*
53937175409SBram Moolenaar        call assert_report("'set guifontset=-*-notexist-*' should have failed")
54010434674SBram Moolenaar      catch
541e2e4075fSBram Moolenaar        call assert_exception('E598:')
54210434674SBram Moolenaar      endtry
54310434674SBram Moolenaar      " Set it to an invalid value brutally for preparation.
54410434674SBram Moolenaar      let &guifontset = '-*-notexist-*'
54510434674SBram Moolenaar
54610434674SBram Moolenaar      " Case 2-1: Automatic selection
54710434674SBram Moolenaar      set guifontwide=
5484e9dbc74SBram Moolenaar      exec 'set guifont=' . nfont
5494e9dbc74SBram Moolenaar      call assert_equal(wfont, &guifontwide)
55010434674SBram Moolenaar
55110434674SBram Moolenaar      " Case 2-2: Manual selection
5524e9dbc74SBram Moolenaar      exec 'set guifontwide=' . wfont
5534e9dbc74SBram Moolenaar      exec 'set guifont=' . nfont
5544e9dbc74SBram Moolenaar      call assert_equal(wfont, &guifontwide)
55510434674SBram Moolenaar
5564e9dbc74SBram Moolenaar      let &guifontwide = guifontwide_saved
5574e9dbc74SBram Moolenaar      let &guifontset  = guifontset_saved
5584e9dbc74SBram Moolenaar      let &guifont     = guifont_saved
5594e9dbc74SBram Moolenaar      let &encoding    = encoding_saved
56010434674SBram Moolenaar    endif
56110434674SBram Moolenaar  endif
56210434674SBram Moolenaarendfunc
56310434674SBram Moolenaar
5644eeedc09SDusan Popovicfunc Test_set_guiligatures()
56540bd5a15SBram Moolenaar  CheckX11BasedGui
5664eeedc09SDusan Popovic
5674eeedc09SDusan Popovic  if has('gui_gtk') || has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
5684eeedc09SDusan Popovic    " Try correct value
5694eeedc09SDusan Popovic    set guiligatures=<>=ab
5704eeedc09SDusan Popovic    call assert_equal("<>=ab", &guiligatures)
5714eeedc09SDusan Popovic    " Try to throw error
5724eeedc09SDusan Popovic    try
5734eeedc09SDusan Popovic      set guiligatures=<>=šab
5744eeedc09SDusan Popovic      call assert_report("'set guiligatures=<>=šab should have failed")
5754eeedc09SDusan Popovic    catch
5764eeedc09SDusan Popovic      call assert_exception('E1243:')
5774eeedc09SDusan Popovic    endtry
5784eeedc09SDusan Popovic  endif
5794eeedc09SDusan Popovicendfunc
5804eeedc09SDusan Popovic
5818be2fbb6SBram Moolenaarfunc Test_set_guiheadroom()
58240bd5a15SBram Moolenaar  CheckX11BasedGui
5838be2fbb6SBram Moolenaar
5848be2fbb6SBram Moolenaar  " Since this script is to be read together with '-U NONE', the default
5858be2fbb6SBram Moolenaar  " value must be preserved.
5868be2fbb6SBram Moolenaar  call assert_equal(50, &guiheadroom)
5878be2fbb6SBram Moolenaarendfunc
5888be2fbb6SBram Moolenaar
5898774845cSBram Moolenaarfunc Test_set_guioptions()
5908774845cSBram Moolenaar  let guioptions_saved = &guioptions
5918774845cSBram Moolenaar  let duration = '200m'
5928774845cSBram Moolenaar
5938774845cSBram Moolenaar  if has('win32')
5948774845cSBram Moolenaar    " Default Value
5958774845cSBram Moolenaar    set guioptions&
5968774845cSBram Moolenaar    call assert_equal('egmrLtT', &guioptions)
5978774845cSBram Moolenaar
5988774845cSBram Moolenaar  else
5998774845cSBram Moolenaar    " Default Value
6008774845cSBram Moolenaar    set guioptions&
6018774845cSBram Moolenaar    call assert_equal('aegimrLtT', &guioptions)
6028774845cSBram Moolenaar
6038774845cSBram Moolenaar    " To activate scrollbars of type 'L' or 'R'.
6048774845cSBram Moolenaar    wincmd v
6058774845cSBram Moolenaar    redraw!
6068774845cSBram Moolenaar
6078774845cSBram Moolenaar    " Remove all default GUI ornaments
6088774845cSBram Moolenaar    set guioptions-=T
6098774845cSBram Moolenaar    exec 'sleep' . duration
6108774845cSBram Moolenaar    call assert_equal('aegimrLt', &guioptions)
6118774845cSBram Moolenaar    set guioptions-=t
6128774845cSBram Moolenaar    exec 'sleep' . duration
6138774845cSBram Moolenaar    call assert_equal('aegimrL', &guioptions)
6148774845cSBram Moolenaar    set guioptions-=L
6158774845cSBram Moolenaar    exec 'sleep' . duration
6168774845cSBram Moolenaar    call assert_equal('aegimr', &guioptions)
6178774845cSBram Moolenaar    set guioptions-=r
6188774845cSBram Moolenaar    exec 'sleep' . duration
6198774845cSBram Moolenaar    call assert_equal('aegim', &guioptions)
6208774845cSBram Moolenaar    set guioptions-=m
6218774845cSBram Moolenaar    exec 'sleep' . duration
6228774845cSBram Moolenaar    call assert_equal('aegi', &guioptions)
6238774845cSBram Moolenaar
6248774845cSBram Moolenaar    " Try non-default GUI ornaments
6258774845cSBram Moolenaar    set guioptions+=l
6268774845cSBram Moolenaar    exec 'sleep' . duration
6278774845cSBram Moolenaar    call assert_equal('aegil', &guioptions)
6288774845cSBram Moolenaar    set guioptions-=l
6298774845cSBram Moolenaar    exec 'sleep' . duration
6308774845cSBram Moolenaar    call assert_equal('aegi', &guioptions)
6318774845cSBram Moolenaar
6328774845cSBram Moolenaar    set guioptions+=R
6338774845cSBram Moolenaar    exec 'sleep' . duration
6348774845cSBram Moolenaar    call assert_equal('aegiR', &guioptions)
6358774845cSBram Moolenaar    set guioptions-=R
6368774845cSBram Moolenaar    exec 'sleep' . duration
6378774845cSBram Moolenaar    call assert_equal('aegi', &guioptions)
6388774845cSBram Moolenaar
6398774845cSBram Moolenaar    set guioptions+=b
6408774845cSBram Moolenaar    exec 'sleep' . duration
6418774845cSBram Moolenaar    call assert_equal('aegib', &guioptions)
6428774845cSBram Moolenaar    set guioptions+=h
6438774845cSBram Moolenaar    exec 'sleep' . duration
6448774845cSBram Moolenaar    call assert_equal('aegibh', &guioptions)
6458774845cSBram Moolenaar    set guioptions-=h
6468774845cSBram Moolenaar    exec 'sleep' . duration
6478774845cSBram Moolenaar    call assert_equal('aegib', &guioptions)
6488774845cSBram Moolenaar    set guioptions-=b
6498774845cSBram Moolenaar    exec 'sleep' . duration
6508774845cSBram Moolenaar    call assert_equal('aegi', &guioptions)
6518774845cSBram Moolenaar
6528774845cSBram Moolenaar    set guioptions+=v
6538774845cSBram Moolenaar    exec 'sleep' . duration
6548774845cSBram Moolenaar    call assert_equal('aegiv', &guioptions)
6558774845cSBram Moolenaar    set guioptions-=v
6568774845cSBram Moolenaar    exec 'sleep' . duration
6578774845cSBram Moolenaar    call assert_equal('aegi', &guioptions)
6588774845cSBram Moolenaar
6598774845cSBram Moolenaar    if has('gui_motif')
6608774845cSBram Moolenaar      set guioptions+=F
6618774845cSBram Moolenaar      exec 'sleep' . duration
6628774845cSBram Moolenaar      call assert_equal('aegiF', &guioptions)
6638774845cSBram Moolenaar      set guioptions-=F
6648774845cSBram Moolenaar      exec 'sleep' . duration
6658774845cSBram Moolenaar      call assert_equal('aegi', &guioptions)
6668774845cSBram Moolenaar    endif
6678774845cSBram Moolenaar
66850bf7ce0SBram Moolenaar    if has('gui_gtk3')
66950bf7ce0SBram Moolenaar      set guioptions+=d
67050bf7ce0SBram Moolenaar      exec 'sleep' . duration
67150bf7ce0SBram Moolenaar      call assert_equal('aegid', &guioptions)
67250bf7ce0SBram Moolenaar      set guioptions-=d
67350bf7ce0SBram Moolenaar      exec 'sleep' . duration
67450bf7ce0SBram Moolenaar      call assert_equal('aegi', &guioptions)
67550bf7ce0SBram Moolenaar    endif
67650bf7ce0SBram Moolenaar
6778774845cSBram Moolenaar    " Restore GUI ornaments to the default state.
6788774845cSBram Moolenaar    set guioptions+=m
6798774845cSBram Moolenaar    exec 'sleep' . duration
6808774845cSBram Moolenaar    call assert_equal('aegim', &guioptions)
6818774845cSBram Moolenaar    set guioptions+=r
6828774845cSBram Moolenaar    exec 'sleep' . duration
6838774845cSBram Moolenaar    call assert_equal('aegimr', &guioptions)
6848774845cSBram Moolenaar    set guioptions+=L
6858774845cSBram Moolenaar    exec 'sleep' . duration
6868774845cSBram Moolenaar    call assert_equal('aegimrL', &guioptions)
6878774845cSBram Moolenaar    set guioptions+=t
6888774845cSBram Moolenaar    exec 'sleep' . duration
6898774845cSBram Moolenaar    call assert_equal('aegimrLt', &guioptions)
6908774845cSBram Moolenaar    set guioptions+=T
6918774845cSBram Moolenaar    exec 'sleep' . duration
6928774845cSBram Moolenaar    call assert_equal("aegimrLtT", &guioptions)
6938774845cSBram Moolenaar
6948774845cSBram Moolenaar    wincmd o
6958774845cSBram Moolenaar    redraw!
6968774845cSBram Moolenaar  endif
6978774845cSBram Moolenaar
6988774845cSBram Moolenaar  let &guioptions = guioptions_saved
6998774845cSBram Moolenaarendfunc
7008774845cSBram Moolenaar
701ab186737SBram Moolenaarfunc Test_scrollbars()
702ab186737SBram Moolenaar  new
703ab186737SBram Moolenaar  " buffer with 200 lines
704ab186737SBram Moolenaar  call setline(1, repeat(['one', 'two'], 100))
705ab186737SBram Moolenaar  set guioptions+=rlb
706ab186737SBram Moolenaar
707ab186737SBram Moolenaar  " scroll to move line 11 at top, moves the cursor there
708ce90e36fSBram Moolenaar  eval 10->test_scrollbar('left', 0)
709ab186737SBram Moolenaar  redraw
710ab186737SBram Moolenaar  call assert_equal(1, winline())
711ab186737SBram Moolenaar  call assert_equal(11, line('.'))
712ab186737SBram Moolenaar
713ab186737SBram Moolenaar  " scroll to move line 1 at top, cursor stays in line 11
714ab186737SBram Moolenaar  call test_scrollbar('right', 0, 0)
715ab186737SBram Moolenaar  redraw
716ab186737SBram Moolenaar  call assert_equal(11, winline())
717ab186737SBram Moolenaar  call assert_equal(11, line('.'))
718ab186737SBram Moolenaar
719ab186737SBram Moolenaar  set nowrap
720ab186737SBram Moolenaar  call setline(11, repeat('x', 150))
721ab186737SBram Moolenaar  redraw
722ab186737SBram Moolenaar  call assert_equal(1, wincol())
723f6d50f1dSBram Moolenaar  set number
724f6d50f1dSBram Moolenaar  redraw
725f6d50f1dSBram Moolenaar  call assert_equal(5, wincol())
726f6d50f1dSBram Moolenaar  set nonumber
727f6d50f1dSBram Moolenaar  redraw
728ab186737SBram Moolenaar  call assert_equal(1, col('.'))
729ab186737SBram Moolenaar
730ab186737SBram Moolenaar  " scroll to character 11, cursor is moved
731ab186737SBram Moolenaar  call test_scrollbar('hor', 10, 0)
732ab186737SBram Moolenaar  redraw
733ab186737SBram Moolenaar  call assert_equal(1, wincol())
734f6d50f1dSBram Moolenaar  set number
735f6d50f1dSBram Moolenaar  redraw
736f6d50f1dSBram Moolenaar  call assert_equal(5, wincol())
737f6d50f1dSBram Moolenaar  set nonumber
738f6d50f1dSBram Moolenaar  redraw
739ab186737SBram Moolenaar  call assert_equal(11, col('.'))
740ab186737SBram Moolenaar
741ab186737SBram Moolenaar  set guioptions&
742ab186737SBram Moolenaar  set wrap&
743ab186737SBram Moolenaar  bwipe!
744ab186737SBram Moolenaarendfunc
745ab186737SBram Moolenaar
74647cf1cc2SBram Moolenaarfunc Test_menu()
7475a4c3082SBram Moolenaar  CheckFeature quickfix
7485a4c3082SBram Moolenaar
74947cf1cc2SBram Moolenaar  " Check Help menu exists
75047cf1cc2SBram Moolenaar  let help_menu = execute('menu Help')
75147cf1cc2SBram Moolenaar  call assert_match('Overview', help_menu)
75247cf1cc2SBram Moolenaar
75347cf1cc2SBram Moolenaar  " Check Help menu works
75447cf1cc2SBram Moolenaar  emenu Help.Overview
75547cf1cc2SBram Moolenaar  call assert_equal('help', &buftype)
75647cf1cc2SBram Moolenaar  close
75747cf1cc2SBram Moolenaar
75847cf1cc2SBram Moolenaar  " Check deleting menu doesn't cause trouble.
75947cf1cc2SBram Moolenaar  aunmenu Help
760b45cd36bSBram Moolenaar  if exists(':tlmenu')
761b45cd36bSBram Moolenaar    tlunmenu Help
762b45cd36bSBram Moolenaar  endif
76347cf1cc2SBram Moolenaar  call assert_fails('menu Help', 'E329:')
76447cf1cc2SBram Moolenaarendfunc
76547cf1cc2SBram Moolenaar
7668774845cSBram Moolenaarfunc Test_set_guipty()
7678774845cSBram Moolenaar  let guipty_saved = &guipty
7688774845cSBram Moolenaar
7698774845cSBram Moolenaar  " Default Value
7708774845cSBram Moolenaar  set guipty&
7718774845cSBram Moolenaar  call assert_equal(1, &guipty)
7728774845cSBram Moolenaar
7738774845cSBram Moolenaar  set noguipty
7748774845cSBram Moolenaar  call assert_equal(0, &guipty)
7758774845cSBram Moolenaar
7768774845cSBram Moolenaar  let &guipty = guipty_saved
7776f785749SBram Moolenaarendfunc
77813c724fbSBram Moolenaar
779c701f320SBram Moolenaarfunc Test_encoding_conversion()
780c701f320SBram Moolenaar  " GTK supports conversion between 'encoding' and "utf-8"
7816d91bcb4SBram Moolenaar  CheckFeature gui_gtk
782c701f320SBram Moolenaar  let encoding_saved = &encoding
783c701f320SBram Moolenaar  set encoding=latin1
784c701f320SBram Moolenaar
785c701f320SBram Moolenaar  " would be nice if we could take a screenshot
786c701f320SBram Moolenaar  intro
787c701f320SBram Moolenaar  " sets the window title
788c701f320SBram Moolenaar  edit SomeFile
789c701f320SBram Moolenaar
790c701f320SBram Moolenaar  let &encoding = encoding_saved
791c701f320SBram Moolenaarendfunc
792c701f320SBram Moolenaar
793877e9577SBram Moolenaarfunc Test_shell_command()
794877e9577SBram Moolenaar  new
7959d5b876dSBram Moolenaar  r !echo hello
7969d5b876dSBram Moolenaar  call assert_equal('hello', substitute(getline(2), '\W', '', 'g'))
797877e9577SBram Moolenaar  bwipe!
798877e9577SBram Moolenaarendfunc
79913c724fbSBram Moolenaar
8008774845cSBram Moolenaarfunc Test_syntax_colortest()
8018774845cSBram Moolenaar  runtime syntax/colortest.vim
8028774845cSBram Moolenaar  redraw!
8038774845cSBram Moolenaar  sleep 200m
8048774845cSBram Moolenaar  bwipe!
8058774845cSBram Moolenaarendfunc
8068774845cSBram Moolenaar
8078774845cSBram Moolenaarfunc Test_set_term()
8088774845cSBram Moolenaar  " It's enough to check the current value since setting 'term' to anything
8098774845cSBram Moolenaar  " other than builtin_gui makes no sense at all.
8108774845cSBram Moolenaar  call assert_equal('builtin_gui', &term)
811ee4e0c1eSBram Moolenaar  call assert_fails('set term=xterm', 'E530:')
8128774845cSBram Moolenaarendfunc
8138774845cSBram Moolenaar
81413c724fbSBram Moolenaarfunc Test_windowid_variable()
8158be2fbb6SBram Moolenaar  if g:x11_based_gui || has('win32')
81613c724fbSBram Moolenaar    call assert_true(v:windowid > 0)
81713c724fbSBram Moolenaar  else
81813c724fbSBram Moolenaar    call assert_equal(0, v:windowid)
81913c724fbSBram Moolenaar  endif
8206f785749SBram Moolenaarendfunc
821248be5c5SBram Moolenaar
822248be5c5SBram Moolenaar" Test "vim -g" and also the GUIEnter autocommand.
823248be5c5SBram Moolenaarfunc Test_gui_dash_g()
824248be5c5SBram Moolenaar  let cmd = GetVimCommand('Xscriptgui')
825248be5c5SBram Moolenaar  call writefile([""], "Xtestgui")
826e7eb9270SBram Moolenaar  let lines =<< trim END
827e7eb9270SBram Moolenaar	au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
828e7eb9270SBram Moolenaar	au GUIEnter * qall
829e7eb9270SBram Moolenaar  END
830e7eb9270SBram Moolenaar  call writefile(lines, 'Xscriptgui')
831248be5c5SBram Moolenaar  call system(cmd . ' -g')
832248be5c5SBram Moolenaar  call WaitForAssert({-> assert_equal(['insertmode: 0'], readfile('Xtestgui'))})
833248be5c5SBram Moolenaar
834248be5c5SBram Moolenaar  call delete('Xscriptgui')
835248be5c5SBram Moolenaar  call delete('Xtestgui')
836248be5c5SBram Moolenaarendfunc
837248be5c5SBram Moolenaar
838248be5c5SBram Moolenaar" Test "vim -7" and also the GUIEnter autocommand.
839248be5c5SBram Moolenaarfunc Test_gui_dash_y()
840248be5c5SBram Moolenaar  let cmd = GetVimCommand('Xscriptgui')
841248be5c5SBram Moolenaar  call writefile([""], "Xtestgui")
842e7eb9270SBram Moolenaar  let lines =<< trim END
843e7eb9270SBram Moolenaar	au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
844e7eb9270SBram Moolenaar	au GUIEnter * qall
845e7eb9270SBram Moolenaar  END
846e7eb9270SBram Moolenaar  call writefile(lines, 'Xscriptgui')
847248be5c5SBram Moolenaar  call system(cmd . ' -y')
848248be5c5SBram Moolenaar  call WaitForAssert({-> assert_equal(['insertmode: 1'], readfile('Xtestgui'))})
849248be5c5SBram Moolenaar
850248be5c5SBram Moolenaar  call delete('Xscriptgui')
851248be5c5SBram Moolenaar  call delete('Xtestgui')
852248be5c5SBram Moolenaarendfunc
8530e05de46SBram Moolenaar
85491689ea8SBram Moolenaar" Test for "!" option in 'guioptions'. Use a terminal for running external
85591689ea8SBram Moolenaar" commands
85691689ea8SBram Moolenaarfunc Test_gui_run_cmd_in_terminal()
8574457e1d9SBram Moolenaar  CheckFeature terminal
85891689ea8SBram Moolenaar  let save_guioptions = &guioptions
85991689ea8SBram Moolenaar  set guioptions+=!
86091689ea8SBram Moolenaar  if has('win32')
86191689ea8SBram Moolenaar    let cmd = 'type'
86291689ea8SBram Moolenaar  else
86391689ea8SBram Moolenaar    " assume all the other systems have a cat command
86491689ea8SBram Moolenaar    let cmd = 'cat'
86591689ea8SBram Moolenaar  endif
86698f1671cSBram Moolenaar  exe "silent !" . cmd . " test_gui.vim"
86791689ea8SBram Moolenaar  " TODO: how to check that the command ran in a separate terminal?
86891689ea8SBram Moolenaar  " Maybe check for $TERM (dumb vs xterm) in the spawned shell?
86991689ea8SBram Moolenaar  let &guioptions = save_guioptions
87091689ea8SBram Moolenaarendfunc
87191689ea8SBram Moolenaar
87246cd43bdSBram Moolenaarfunc Test_gui_recursive_mapping()
87346cd43bdSBram Moolenaar  nmap ' <C-W>
87446cd43bdSBram Moolenaar  nmap <C-W>a :let didit = 1<CR>
87546cd43bdSBram Moolenaar  call feedkeys("'a", 'xt')
87646cd43bdSBram Moolenaar  call assert_equal(1, didit)
87746cd43bdSBram Moolenaar
87846cd43bdSBram Moolenaar  nunmap '
87946cd43bdSBram Moolenaar  nunmap <C-W>a
880f1e7449dSYegappan Lakshmananendfunc
881f1e7449dSYegappan Lakshmanan
882f1e7449dSYegappan Lakshmanan" Test GUI mouse events
883f1e7449dSYegappan Lakshmananfunc Test_gui_mouse_event()
884f1e7449dSYegappan Lakshmanan  set mousemodel=extend
885f1e7449dSYegappan Lakshmanan  call test_override('no_query_mouse', 1)
886f1e7449dSYegappan Lakshmanan  new
887f1e7449dSYegappan Lakshmanan  call setline(1, ['one two three', 'four five six'])
888f1e7449dSYegappan Lakshmanan
8897237cab8SYegappan Lakshmanan  " place the cursor using left click in normal mode
890f1e7449dSYegappan Lakshmanan  call cursor(1, 1)
891f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 2, 4, 0, 0)
892f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 2, 4, 0, 0)
893f1e7449dSYegappan Lakshmanan  call feedkeys("\<Esc>", 'Lx!')
894f1e7449dSYegappan Lakshmanan  call assert_equal([0, 2, 4, 0], getpos('.'))
895f1e7449dSYegappan Lakshmanan
896f1e7449dSYegappan Lakshmanan  " select and yank a word
897f1e7449dSYegappan Lakshmanan  let @" = ''
898f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 1, 9, 0, 0)
899f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 1, 9, 1, 0)
900f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 1, 9, 0, 0)
901f1e7449dSYegappan Lakshmanan  call feedkeys("y", 'Lx!')
902f1e7449dSYegappan Lakshmanan  call assert_equal('three', @")
903f1e7449dSYegappan Lakshmanan
904f1e7449dSYegappan Lakshmanan  " create visual selection using right click
905f1e7449dSYegappan Lakshmanan  let @" = ''
906f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 2, 6, 0, 0)
907f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 2, 6, 0, 0)
908f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(2, 2, 13, 0, 0)
909f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 2, 13, 0, 0)
910f1e7449dSYegappan Lakshmanan  call feedkeys("y", 'Lx!')
911f1e7449dSYegappan Lakshmanan  call assert_equal('five six', @")
912f1e7449dSYegappan Lakshmanan
913f1e7449dSYegappan Lakshmanan  " paste using middle mouse button
914f1e7449dSYegappan Lakshmanan  let @* = 'abc '
915f1e7449dSYegappan Lakshmanan  call feedkeys('""', 'Lx!')
916f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(1, 1, 9, 0, 0)
917f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 1, 9, 0, 0)
918f1e7449dSYegappan Lakshmanan  call feedkeys("\<Esc>", 'Lx!')
919f1e7449dSYegappan Lakshmanan  call assert_equal(['one two abc three', 'four five six'], getline(1, '$'))
920f1e7449dSYegappan Lakshmanan
921f1e7449dSYegappan Lakshmanan  " extend visual selection using right click in visual mode
922f1e7449dSYegappan Lakshmanan  let @" = ''
923f1e7449dSYegappan Lakshmanan  call cursor(1, 1)
924f1e7449dSYegappan Lakshmanan  call feedkeys('v', 'Lx!')
925f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(2, 1, 17, 0, 0)
926f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 1, 17, 0, 0)
927f1e7449dSYegappan Lakshmanan  call feedkeys("y", 'Lx!')
928f1e7449dSYegappan Lakshmanan  call assert_equal('one two abc three', @")
929f1e7449dSYegappan Lakshmanan
930f1e7449dSYegappan Lakshmanan  " extend visual selection using mouse drag
931f1e7449dSYegappan Lakshmanan  let @" = ''
932f1e7449dSYegappan Lakshmanan  call cursor(1, 1)
933f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 2, 1, 0, 0)
934f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x43, 2, 9, 0, 0)
935f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x3, 2, 9, 0, 0)
936f1e7449dSYegappan Lakshmanan  call feedkeys("y", 'Lx!')
937f1e7449dSYegappan Lakshmanan  call assert_equal('four five', @")
938f1e7449dSYegappan Lakshmanan
939f1e7449dSYegappan Lakshmanan  " select text by moving the mouse
940f1e7449dSYegappan Lakshmanan  let @" = ''
941f1e7449dSYegappan Lakshmanan  call cursor(1, 1)
942f1e7449dSYegappan Lakshmanan  redraw!
943f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 1, 4, 0, 0)
944f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x700, 1, 9, 0, 0)
945f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x700, 1, 13, 0, 0)
946f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x3, 1, 13, 0, 0)
947f1e7449dSYegappan Lakshmanan  call feedkeys("y", 'Lx!')
948f1e7449dSYegappan Lakshmanan  call assert_equal(' two abc t', @")
949f1e7449dSYegappan Lakshmanan
950f1e7449dSYegappan Lakshmanan  " Using mouse in insert mode
951f1e7449dSYegappan Lakshmanan  call cursor(1, 1)
952f1e7449dSYegappan Lakshmanan  call feedkeys('i', 't')
953f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 2, 11, 0, 0)
954f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 2, 11, 0, 0)
955f1e7449dSYegappan Lakshmanan  call feedkeys("po\<Esc>", 'Lx!')
956f1e7449dSYegappan Lakshmanan  call assert_equal(['one two abc three', 'four five posix'], getline(1, '$'))
957f1e7449dSYegappan Lakshmanan
958f1e7449dSYegappan Lakshmanan  %d _
959f1e7449dSYegappan Lakshmanan  call setline(1, range(1, 100))
960f1e7449dSYegappan Lakshmanan  " scroll up
961f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x200, 2, 1, 0, 0)
962f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x200, 2, 1, 0, 0)
963f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x200, 2, 1, 0, 0)
964f1e7449dSYegappan Lakshmanan  call feedkeys("H", 'Lx!')
965f1e7449dSYegappan Lakshmanan  call assert_equal(10, line('.'))
966f1e7449dSYegappan Lakshmanan
967f1e7449dSYegappan Lakshmanan  " scroll down
968f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x100, 2, 1, 0, 0)
969f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x100, 2, 1, 0, 0)
970f1e7449dSYegappan Lakshmanan  call feedkeys("H", 'Lx!')
971f1e7449dSYegappan Lakshmanan  call assert_equal(4, line('.'))
972f1e7449dSYegappan Lakshmanan
973f1e7449dSYegappan Lakshmanan  %d _
974f1e7449dSYegappan Lakshmanan  set nowrap
975f1e7449dSYegappan Lakshmanan  call setline(1, range(10)->join('')->repeat(10))
976f1e7449dSYegappan Lakshmanan  " scroll left
977f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x500, 1, 5, 0, 0)
978f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x500, 1, 10, 0, 0)
979f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x500, 1, 15, 0, 0)
980f1e7449dSYegappan Lakshmanan  call feedkeys('g0', 'Lx!')
981f1e7449dSYegappan Lakshmanan  call assert_equal(19, col('.'))
982f1e7449dSYegappan Lakshmanan
983f1e7449dSYegappan Lakshmanan  " scroll right
984f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x600, 1, 15, 0, 0)
985f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0x600, 1, 10, 0, 0)
986f1e7449dSYegappan Lakshmanan  call feedkeys('g0', 'Lx!')
987f1e7449dSYegappan Lakshmanan  call assert_equal(7, col('.'))
988f1e7449dSYegappan Lakshmanan  set wrap&
989f1e7449dSYegappan Lakshmanan
990f1e7449dSYegappan Lakshmanan  %d _
991f1e7449dSYegappan Lakshmanan  call setline(1, repeat([repeat('a', 60)], 10))
992f1e7449dSYegappan Lakshmanan
993f1e7449dSYegappan Lakshmanan  " record various mouse events
994f1e7449dSYegappan Lakshmanan  let mouseEventNames = [
995f1e7449dSYegappan Lakshmanan        \ 'LeftMouse', 'LeftRelease', '2-LeftMouse', '3-LeftMouse',
996f1e7449dSYegappan Lakshmanan        \ 'S-LeftMouse', 'A-LeftMouse', 'C-LeftMouse', 'MiddleMouse',
997f1e7449dSYegappan Lakshmanan        \ 'MiddleRelease', '2-MiddleMouse', '3-MiddleMouse',
998f1e7449dSYegappan Lakshmanan        \ 'S-MiddleMouse', 'A-MiddleMouse', 'C-MiddleMouse',
999f1e7449dSYegappan Lakshmanan        \ 'RightMouse', 'RightRelease', '2-RightMouse',
1000f1e7449dSYegappan Lakshmanan        \ '3-RightMouse', 'S-RightMouse', 'A-RightMouse', 'C-RightMouse',
1001f1e7449dSYegappan Lakshmanan        \ 'X1Mouse', 'S-X1Mouse', 'A-X1Mouse', 'C-X1Mouse', 'X2Mouse',
1002f1e7449dSYegappan Lakshmanan        \ 'S-X2Mouse', 'A-X2Mouse', 'C-X2Mouse'
1003f1e7449dSYegappan Lakshmanan        \ ]
1004f1e7449dSYegappan Lakshmanan  let mouseEventCodes = map(copy(mouseEventNames), "'<' .. v:val .. '>'")
1005f1e7449dSYegappan Lakshmanan  let g:events = []
1006f1e7449dSYegappan Lakshmanan  for e in mouseEventCodes
1007f1e7449dSYegappan Lakshmanan    exe 'nnoremap ' .. e .. ' <Cmd>call add(g:events, "' ..
1008f1e7449dSYegappan Lakshmanan          \ substitute(e, '[<>]', '', 'g') .. '")<CR>'
1009f1e7449dSYegappan Lakshmanan  endfor
1010f1e7449dSYegappan Lakshmanan
1011f1e7449dSYegappan Lakshmanan  " Test various mouse buttons (0 - Left, 1 - Middle, 2 - Right, 0x300 - X1,
1012f1e7449dSYegappan Lakshmanan  " 0x300- X2)
1013f1e7449dSYegappan Lakshmanan  for button in [0, 1, 2, 0x300, 0x400]
1014f1e7449dSYegappan Lakshmanan    " Single click
1015f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(button, 2, 5, 0, 0)
1016f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(3, 2, 5, 0, 0)
1017f1e7449dSYegappan Lakshmanan
1018f1e7449dSYegappan Lakshmanan    " Double/Triple click is supported by only the Left/Middle/Right mouse
1019f1e7449dSYegappan Lakshmanan    " buttons
1020f1e7449dSYegappan Lakshmanan    if button <= 2
1021f1e7449dSYegappan Lakshmanan      " Double Click
1022f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(button, 2, 5, 0, 0)
1023f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(button, 2, 5, 1, 0)
1024f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(3, 2, 5, 0, 0)
1025f1e7449dSYegappan Lakshmanan
1026f1e7449dSYegappan Lakshmanan      " Triple Click
1027f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(button, 2, 5, 0, 0)
1028f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(button, 2, 5, 1, 0)
1029f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(button, 2, 5, 1, 0)
1030f1e7449dSYegappan Lakshmanan      call test_gui_mouse_event(3, 2, 5, 0, 0)
1031f1e7449dSYegappan Lakshmanan    endif
1032f1e7449dSYegappan Lakshmanan
1033f1e7449dSYegappan Lakshmanan    " Shift click
1034f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(button, 3, 7, 0, 4)
1035f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(3, 3, 7, 0, 4)
1036f1e7449dSYegappan Lakshmanan
1037f1e7449dSYegappan Lakshmanan    " Alt click
1038f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(button, 3, 7, 0, 8)
1039f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(3, 3, 7, 0, 8)
1040f1e7449dSYegappan Lakshmanan
1041f1e7449dSYegappan Lakshmanan    " Ctrl click
1042f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(button, 3, 7, 0, 16)
1043f1e7449dSYegappan Lakshmanan    call test_gui_mouse_event(3, 3, 7, 0, 16)
1044f1e7449dSYegappan Lakshmanan
1045f1e7449dSYegappan Lakshmanan    call feedkeys("\<Esc>", 'Lx!')
1046f1e7449dSYegappan Lakshmanan  endfor
1047f1e7449dSYegappan Lakshmanan
1048f1e7449dSYegappan Lakshmanan  call assert_equal(['LeftMouse', 'LeftRelease', 'LeftMouse', '2-LeftMouse',
1049f1e7449dSYegappan Lakshmanan        \ 'LeftMouse', '2-LeftMouse', '3-LeftMouse', 'S-LeftMouse',
1050f1e7449dSYegappan Lakshmanan        \ 'A-LeftMouse', 'C-LeftMouse', 'MiddleMouse', 'MiddleRelease',
1051f1e7449dSYegappan Lakshmanan        \ 'MiddleMouse', '2-MiddleMouse', 'MiddleMouse', '2-MiddleMouse',
1052f1e7449dSYegappan Lakshmanan        \ '3-MiddleMouse', 'S-MiddleMouse', 'A-MiddleMouse', 'C-MiddleMouse',
1053f1e7449dSYegappan Lakshmanan        \ 'RightMouse', 'RightRelease', 'RightMouse', '2-RightMouse',
1054f1e7449dSYegappan Lakshmanan        \ 'RightMouse', '2-RightMouse', '3-RightMouse', 'S-RightMouse',
1055f1e7449dSYegappan Lakshmanan        \ 'A-RightMouse', 'C-RightMouse', 'X1Mouse', 'S-X1Mouse', 'A-X1Mouse',
1056f1e7449dSYegappan Lakshmanan        \ 'C-X1Mouse', 'X2Mouse', 'S-X2Mouse', 'A-X2Mouse', 'C-X2Mouse'],
1057f1e7449dSYegappan Lakshmanan        \ g:events)
1058f1e7449dSYegappan Lakshmanan
1059f1e7449dSYegappan Lakshmanan  for e in mouseEventCodes
1060f1e7449dSYegappan Lakshmanan    exe 'nunmap ' .. e
1061f1e7449dSYegappan Lakshmanan  endfor
1062f1e7449dSYegappan Lakshmanan
1063f1e7449dSYegappan Lakshmanan  " modeless selection
1064f1e7449dSYegappan Lakshmanan  set mouse=
1065f1e7449dSYegappan Lakshmanan  let save_guioptions = &guioptions
1066f1e7449dSYegappan Lakshmanan  set guioptions+=A
1067f1e7449dSYegappan Lakshmanan  %d _
1068f1e7449dSYegappan Lakshmanan  call setline(1, ['one two three', 'four five sixteen'])
1069f1e7449dSYegappan Lakshmanan  call cursor(1, 1)
1070f1e7449dSYegappan Lakshmanan  redraw!
1071f1e7449dSYegappan Lakshmanan  " Double click should select the word and copy it to clipboard
1072f1e7449dSYegappan Lakshmanan  let @* = ''
1073f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 2, 11, 0, 0)
1074f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(0, 2, 11, 1, 0)
1075f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 2, 11, 0, 0)
1076f1e7449dSYegappan Lakshmanan  call feedkeys("\<Esc>", 'Lx!')
1077f1e7449dSYegappan Lakshmanan  call assert_equal([0, 1, 1, 0], getpos('.'))
1078f1e7449dSYegappan Lakshmanan  call assert_equal('sixteen', @*)
1079f1e7449dSYegappan Lakshmanan  " Right click should extend the selection from cursor
1080f1e7449dSYegappan Lakshmanan  call cursor(1, 6)
1081f1e7449dSYegappan Lakshmanan  redraw!
1082f1e7449dSYegappan Lakshmanan  let @* = ''
1083f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(2, 1, 11, 0, 0)
1084f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 1, 11, 0, 0)
1085f1e7449dSYegappan Lakshmanan  call feedkeys("\<Esc>", 'Lx!')
1086f1e7449dSYegappan Lakshmanan  call assert_equal([0, 1, 6, 0], getpos('.'))
1087f1e7449dSYegappan Lakshmanan  call assert_equal('wo thr', @*)
1088f1e7449dSYegappan Lakshmanan  " Middle click should paste the clipboard contents
1089f1e7449dSYegappan Lakshmanan  call cursor(2, 1)
1090f1e7449dSYegappan Lakshmanan  redraw!
1091f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(1, 1, 11, 0, 0)
1092f1e7449dSYegappan Lakshmanan  call test_gui_mouse_event(3, 1, 11, 0, 0)
1093f1e7449dSYegappan Lakshmanan  call feedkeys("\<Esc>", 'Lx!')
1094f1e7449dSYegappan Lakshmanan  call assert_equal([0, 2, 7, 0], getpos('.'))
1095f1e7449dSYegappan Lakshmanan  call assert_equal('wo thrfour five sixteen', getline(2))
1096f1e7449dSYegappan Lakshmanan  set mouse&
1097f1e7449dSYegappan Lakshmanan  let &guioptions = save_guioptions
1098f1e7449dSYegappan Lakshmanan
10997237cab8SYegappan Lakshmanan  " Test invalid parameters for test_gui_mouse_event()
110083494b4aSYegappan Lakshmanan  call assert_fails('call test_gui_mouse_event("", 1, 2, 3, 4)', 'E1210:')
110183494b4aSYegappan Lakshmanan  call assert_fails('call test_gui_mouse_event(0, "", 2, 3, 4)', 'E1210:')
110283494b4aSYegappan Lakshmanan  call assert_fails('call test_gui_mouse_event(0, 1, "", 3, 4)', 'E1210:')
110383494b4aSYegappan Lakshmanan  call assert_fails('call test_gui_mouse_event(0, 1, 2, "", 4)', 'E1210:')
110483494b4aSYegappan Lakshmanan  call assert_fails('call test_gui_mouse_event(0, 1, 2, 3, "")', 'E1210:')
11057237cab8SYegappan Lakshmanan
1106f1e7449dSYegappan Lakshmanan  bw!
1107f1e7449dSYegappan Lakshmanan  call test_override('no_query_mouse', 0)
1108f1e7449dSYegappan Lakshmanan  set mousemodel&
110946cd43bdSBram Moolenaarendfunc
111046cd43bdSBram Moolenaar
11117237cab8SYegappan Lakshmanan" Test for 'guitablabel' and 'guitabtooltip' options
11127237cab8SYegappan Lakshmananfunc TestGuiTabLabel()
11137237cab8SYegappan Lakshmanan  call add(g:TabLabels, v:lnum + 100)
11147237cab8SYegappan Lakshmanan  let bufnrlist = tabpagebuflist(v:lnum)
11157237cab8SYegappan Lakshmanan  return bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
11167237cab8SYegappan Lakshmananendfunc
11177237cab8SYegappan Lakshmanan
11187237cab8SYegappan Lakshmananfunc TestGuiTabToolTip()
11197237cab8SYegappan Lakshmanan  call add(g:TabToolTips, v:lnum + 200)
11207237cab8SYegappan Lakshmanan  let bufnrlist = tabpagebuflist(v:lnum)
11217237cab8SYegappan Lakshmanan  return bufname(bufnrlist[tabpagewinnr(v:lnum) - 1])
11227237cab8SYegappan Lakshmananendfunc
11237237cab8SYegappan Lakshmanan
11247237cab8SYegappan Lakshmananfunc Test_gui_tablabel_tooltip()
1125fb773a3eSBram Moolenaar  CheckNotFeature gui_athena
1126fb773a3eSBram Moolenaar
11277237cab8SYegappan Lakshmanan  %bw!
11287237cab8SYegappan Lakshmanan  " Removing the tabline at the end of this test, reduces the window height by
11297237cab8SYegappan Lakshmanan  " one. Save and restore it after the test.
11307237cab8SYegappan Lakshmanan  let save_lines = &lines
11317237cab8SYegappan Lakshmanan  edit one
11327237cab8SYegappan Lakshmanan  set modified
11337237cab8SYegappan Lakshmanan  tabnew two
11347237cab8SYegappan Lakshmanan  set modified
11357237cab8SYegappan Lakshmanan  tabnew three
11367237cab8SYegappan Lakshmanan  set modified
11377237cab8SYegappan Lakshmanan  let g:TabLabels = []
11387237cab8SYegappan Lakshmanan  set guitablabel=%{TestGuiTabLabel()}
11397237cab8SYegappan Lakshmanan  call test_override('starting', 1)
11407237cab8SYegappan Lakshmanan  redrawtabline
11417237cab8SYegappan Lakshmanan  call test_override('starting', 0)
11427237cab8SYegappan Lakshmanan  call assert_true(index(g:TabLabels, 101) != -1)
11437237cab8SYegappan Lakshmanan  call assert_true(index(g:TabLabels, 102) != -1)
11447237cab8SYegappan Lakshmanan  call assert_true(index(g:TabLabels, 103) != -1)
11457237cab8SYegappan Lakshmanan  set guitablabel&
11467237cab8SYegappan Lakshmanan  unlet g:TabLabels
11477237cab8SYegappan Lakshmanan
11487237cab8SYegappan Lakshmanan  if has('gui_gtk')
11497237cab8SYegappan Lakshmanan    " Only on GTK+, the tooltip function is called even if the mouse is not
11507237cab8SYegappan Lakshmanan    " on the tabline. on Win32 and Motif, the tooltip function is called only
11517237cab8SYegappan Lakshmanan    " when the mouse pointer is over the tabline.
11527237cab8SYegappan Lakshmanan    let g:TabToolTips = []
11537237cab8SYegappan Lakshmanan    set guitabtooltip=%{TestGuiTabToolTip()}
11547237cab8SYegappan Lakshmanan    call test_override('starting', 1)
11557237cab8SYegappan Lakshmanan    redrawtabline
11567237cab8SYegappan Lakshmanan    call test_override('starting', 0)
11577237cab8SYegappan Lakshmanan    call assert_true(index(g:TabToolTips, 201) != -1)
11587237cab8SYegappan Lakshmanan    call assert_true(index(g:TabToolTips, 202) != -1)
11597237cab8SYegappan Lakshmanan    call assert_true(index(g:TabToolTips, 203) != -1)
11607237cab8SYegappan Lakshmanan    set guitabtooltip&
11617237cab8SYegappan Lakshmanan    unlet g:TabToolTips
11627237cab8SYegappan Lakshmanan  endif
11637237cab8SYegappan Lakshmanan  %bw!
11647237cab8SYegappan Lakshmanan  let &lines = save_lines
11657237cab8SYegappan Lakshmananendfunc
11667237cab8SYegappan Lakshmanan
116718d46587SYegappan Lakshmanan" Test for dropping files into a window in GUI
116818d46587SYegappan Lakshmananfunc DropFilesInCmdLine()
11691d1ce613SBram Moolenaar  CheckFeature drop_file
11701d1ce613SBram Moolenaar
117118d46587SYegappan Lakshmanan  call feedkeys(":\"", 'L')
117218d46587SYegappan Lakshmanan  call test_gui_drop_files(['a.c', 'b.c'], &lines, 1, 0)
117318d46587SYegappan Lakshmanan  call feedkeys("\<CR>", 'L')
117418d46587SYegappan Lakshmananendfunc
117518d46587SYegappan Lakshmanan
117618d46587SYegappan Lakshmananfunc Test_gui_drop_files()
11771d1ce613SBram Moolenaar  CheckFeature drop_file
11781d1ce613SBram Moolenaar
11795bca906bSYegappan Lakshmanan  call assert_fails('call test_gui_drop_files(1, 1, 1, 0)', 'E1211:')
11805bca906bSYegappan Lakshmanan  call assert_fails('call test_gui_drop_files(["x"], "", 1, 0)', 'E1210:')
11815bca906bSYegappan Lakshmanan  call assert_fails('call test_gui_drop_files(["x"], 1, "", 0)', 'E1210:')
11825bca906bSYegappan Lakshmanan  call assert_fails('call test_gui_drop_files(["x"], 1, 1, "")', 'E1210:')
118318d46587SYegappan Lakshmanan
118418d46587SYegappan Lakshmanan  %bw!
118518d46587SYegappan Lakshmanan  %argdelete
118618d46587SYegappan Lakshmanan  call test_gui_drop_files([], 1, 1, 0)
118718d46587SYegappan Lakshmanan  call assert_equal([], argv())
118818d46587SYegappan Lakshmanan  call test_gui_drop_files([1, 2], 1, 1, 0)
118918d46587SYegappan Lakshmanan  call assert_equal([], argv())
119018d46587SYegappan Lakshmanan
119118d46587SYegappan Lakshmanan  call test_gui_drop_files(['a.c', 'b.c'], 1, 1, 0)
119218d46587SYegappan Lakshmanan  call assert_equal(['a.c', 'b.c'], argv())
119318d46587SYegappan Lakshmanan  %bw!
119418d46587SYegappan Lakshmanan  %argdelete
119518d46587SYegappan Lakshmanan  call test_gui_drop_files([], 1, 1, 0)
119618d46587SYegappan Lakshmanan  call assert_equal([], argv())
119718d46587SYegappan Lakshmanan  %bw!
119818d46587SYegappan Lakshmanan  " if the buffer in the window is modified, then the file should be opened in
119918d46587SYegappan Lakshmanan  " a new window
120018d46587SYegappan Lakshmanan  set modified
120118d46587SYegappan Lakshmanan  call test_gui_drop_files(['x.c', 'y.c'], 1, 1, 0)
120218d46587SYegappan Lakshmanan  call assert_equal(['x.c', 'y.c'], argv())
120318d46587SYegappan Lakshmanan  call assert_equal(2, winnr('$'))
120418d46587SYegappan Lakshmanan  call assert_equal('x.c', bufname(winbufnr(1)))
120518d46587SYegappan Lakshmanan  %bw!
120618d46587SYegappan Lakshmanan  %argdelete
120718d46587SYegappan Lakshmanan  " if Ctrl is pressed, then the file should be opened in a new window
120818d46587SYegappan Lakshmanan  call test_gui_drop_files(['s.py', 't.py'], 1, 1, 0x10)
120918d46587SYegappan Lakshmanan  call assert_equal(['s.py', 't.py'], argv())
121018d46587SYegappan Lakshmanan  call assert_equal(2, winnr('$'))
121118d46587SYegappan Lakshmanan  call assert_equal('s.py', bufname(winbufnr(1)))
121218d46587SYegappan Lakshmanan  %bw!
121318d46587SYegappan Lakshmanan  %argdelete
121418d46587SYegappan Lakshmanan  " drop the files in a non-current window
121518d46587SYegappan Lakshmanan  belowright new
121618d46587SYegappan Lakshmanan  call test_gui_drop_files(['a.py', 'b.py'], 1, 1, 0)
121718d46587SYegappan Lakshmanan  call assert_equal(['a.py', 'b.py'], argv())
121818d46587SYegappan Lakshmanan  call assert_equal(2, winnr('$'))
121918d46587SYegappan Lakshmanan  call assert_equal(1, winnr())
122018d46587SYegappan Lakshmanan  call assert_equal('a.py', bufname(winbufnr(1)))
122118d46587SYegappan Lakshmanan  %bw!
122218d46587SYegappan Lakshmanan  %argdelete
122318d46587SYegappan Lakshmanan  " pressing shift when dropping files should change directory
122418d46587SYegappan Lakshmanan  let save_cwd = getcwd()
122518d46587SYegappan Lakshmanan  call mkdir('Xdir1')
122618d46587SYegappan Lakshmanan  call writefile([], 'Xdir1/Xfile1')
122718d46587SYegappan Lakshmanan  call writefile([], 'Xdir1/Xfile2')
122818d46587SYegappan Lakshmanan  call test_gui_drop_files(['Xdir1/Xfile1', 'Xdir1/Xfile2'], 1, 1, 0x4)
122918d46587SYegappan Lakshmanan  call assert_equal('Xdir1', fnamemodify(getcwd(), ':t'))
123018d46587SYegappan Lakshmanan  call assert_equal('Xfile1', @%)
123118d46587SYegappan Lakshmanan  call chdir(save_cwd)
123218d46587SYegappan Lakshmanan  " pressing shift when dropping directory and files should change directory
123318d46587SYegappan Lakshmanan  call test_gui_drop_files(['Xdir1', 'Xdir1/Xfile2'], 1, 1, 0x4)
123418d46587SYegappan Lakshmanan  call assert_equal('Xdir1', fnamemodify(getcwd(), ':t'))
123518d46587SYegappan Lakshmanan  call assert_equal('Xdir1', fnamemodify(@%, ':t'))
123618d46587SYegappan Lakshmanan  call chdir(save_cwd)
123718d46587SYegappan Lakshmanan  %bw!
123818d46587SYegappan Lakshmanan  %argdelete
123918d46587SYegappan Lakshmanan  " dropping a directory should edit it
124018d46587SYegappan Lakshmanan  call test_gui_drop_files(['Xdir1'], 1, 1, 0)
124118d46587SYegappan Lakshmanan  call assert_equal('Xdir1', @%)
124218d46587SYegappan Lakshmanan  %bw!
124318d46587SYegappan Lakshmanan  %argdelete
124418d46587SYegappan Lakshmanan  " dropping only a directory name with Shift should ignore it
124518d46587SYegappan Lakshmanan  call test_gui_drop_files(['Xdir1'], 1, 1, 0x4)
124618d46587SYegappan Lakshmanan  call assert_equal('', @%)
124718d46587SYegappan Lakshmanan  %bw!
124818d46587SYegappan Lakshmanan  %argdelete
124918d46587SYegappan Lakshmanan  call delete('Xdir1', 'rf')
125018d46587SYegappan Lakshmanan  " drop files in the command line. The GUI drop files adds the file names to
125118d46587SYegappan Lakshmanan  " the low level input buffer. So need to use a cmdline map and feedkeys()
125218d46587SYegappan Lakshmanan  " with 'Lx!' to process it in this function itself.
125318d46587SYegappan Lakshmanan  cnoremap <expr> <buffer> <F4> DropFilesInCmdLine()
125418d46587SYegappan Lakshmanan  call feedkeys(":\"\<F4>\<CR>", 'xt')
125518d46587SYegappan Lakshmanan  call feedkeys('k', 'Lx!')
125618d46587SYegappan Lakshmanan  call assert_equal('"a.c b.c', @:)
125718d46587SYegappan Lakshmanan  cunmap <buffer> <F4>
125818d46587SYegappan Lakshmananendfunc
125918d46587SYegappan Lakshmanan
12600e05de46SBram Moolenaar" vim: shiftwidth=2 sts=2 expandtab
1261