xref: /vim-8.2.3635/src/testdir/test_gui.vim (revision dad4473f)
1" Tests specifically for the GUI
2
3source shared.vim
4source check.vim
5CheckCanRunGui
6
7source setup_gui.vim
8
9func Setup()
10  call GUISetUpCommon()
11endfunc
12
13func TearDown()
14  call GUITearDownCommon()
15endfunc
16
17" Test for resetting "secure" flag after GUI has started.
18" Must be run first, since it starts the GUI on Unix.
19func Test_1_set_secure()
20  set exrc secure
21  gui -f
22  call assert_equal(1, has('gui_running'))
23endfunc
24
25" As for non-GUI, a balloon_show() test was already added with patch 8.0.0401
26func Test_balloon_show()
27  CheckFeature balloon_eval
28  " This won't do anything but must not crash either.
29  call balloon_show('hi!')
30endfunc
31
32func Test_colorscheme()
33  call assert_equal('16777216', &t_Co)
34
35  let colorscheme_saved = exists('g:colors_name') ? g:colors_name : 'default'
36  let g:color_count = 0
37  augroup TestColors
38    au!
39    au ColorScheme * let g:color_count += 1| let g:after_colors = g:color_count
40    au ColorSchemePre * let g:color_count += 1 |let g:before_colors = g:color_count
41  augroup END
42
43  colorscheme torte
44  redraw!
45  call assert_equal('dark', &background)
46  call assert_equal(1, g:before_colors)
47  call assert_equal(2, g:after_colors)
48  call assert_equal("\ntorte", execute('colorscheme'))
49
50  let a = substitute(execute('hi Search'), "\n\\s\\+", ' ', 'g')
51  call assert_match("\nSearch         xxx term=reverse ctermfg=0 ctermbg=12 gui=bold guifg=Black guibg=Red", a)
52
53  call assert_fails('colorscheme does_not_exist', 'E185:')
54
55  exec 'colorscheme' colorscheme_saved
56  augroup TestColors
57    au!
58  augroup END
59  unlet g:color_count g:after_colors g:before_colors
60  redraw!
61endfunc
62
63func Test_getfontname_with_arg()
64  let skipped = ''
65
66  if !g:x11_based_gui
67    let skipped = g:not_implemented
68  elseif has('gui_athena') || has('gui_motif')
69    " Invalid font name. The result should be an empty string.
70    call assert_equal('', getfontname('notexist'))
71
72    " Valid font name. This is usually the real name of 7x13 by default.
73    let fname = '-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1'
74    call assert_match(fname, getfontname(fname))
75
76  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
77    " Invalid font name. The result should be the name plus the default size.
78    call assert_equal('notexist 10', getfontname('notexist'))
79    call assert_equal('', getfontname('*'))
80
81    " Valid font name. This is usually the real name of Monospace by default.
82    let fname = 'Bitstream Vera Sans Mono 12'
83    call assert_equal(fname, getfontname(fname))
84  endif
85
86  if !empty(skipped)
87    throw skipped
88  endif
89endfunc
90
91func Test_getfontname_without_arg()
92  let skipped = ''
93
94  let fname = getfontname()
95
96  if !g:x11_based_gui
97    let skipped = g:not_implemented
98  elseif has('gui_kde')
99    " 'expected' is the value specified by SetUp() above.
100    call assert_equal('Courier 10 Pitch/8/-1/5/50/0/0/0/0/0', fname)
101  elseif has('gui_athena') || has('gui_motif')
102    " 'expected' is DFLT_FONT of gui_x11.c or its real name.
103    let pat = '\(7x13\)\|\(\c-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1\)'
104    call assert_match(pat, fname)
105  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
106    " 'expected' is DEFAULT_FONT of gui_gtk_x11.c.
107    call assert_equal('Monospace 10', fname)
108  endif
109
110  if !empty(skipped)
111    throw skipped
112  endif
113endfunc
114
115func Test_getwinpos()
116  call assert_match('Window position: X \d\+, Y \d\+', execute('winpos'))
117  call assert_true(getwinposx() >= 0)
118  call assert_true(getwinposy() >= 0)
119  call assert_equal([getwinposx(), getwinposy()], getwinpos())
120endfunc
121
122func Test_quoteplus()
123  let skipped = ''
124
125  if !g:x11_based_gui
126    let skipped = g:not_supported . 'quoteplus'
127  else
128    let quoteplus_saved = @+
129
130    let test_call     = 'Can you hear me?'
131    let test_response = 'Yes, I can.'
132    let vim_exe = GetVimCommand()
133    let testee = 'VIMRUNTIME=' . $VIMRUNTIME . '; export VIMRUNTIME;'
134          \ . vim_exe . ' --noplugin --not-a-term -c ''%s'''
135    " Ignore the "failed to create input context" error.
136    let cmd = 'call test_ignore_error("E285") | '
137	  \ . 'gui -f | '
138	  \ . 'call feedkeys("'
139          \ . '\"+p'
140          \ . ':s/' . test_call . '/' . test_response . '/\<CR>'
141          \ . '\"+yis'
142          \ . ':q!\<CR>", "tx")'
143    let run_vimtest = printf(testee, cmd)
144
145    " Set the quoteplus register to test_call, and another gvim will launched.
146    " Then, it first tries to paste the content of its own quotedplus register
147    " onto it.  Second, it tries to substitute test_response for the pasted
148    " sentence.  If the sentence is identical to test_call, the substitution
149    " should succeed.  Third, it tries to yank the result of the substitution
150    " to its own quoteplus register, and last it quits.  When system()
151    " returns, the content of the quoteplus register should be identical to
152    " test_response if those quoteplus registers are synchronized properly
153    " with/through the X11 clipboard.
154    let @+ = test_call
155    call system(run_vimtest)
156    call assert_equal(test_response, @+)
157
158    let @+ = quoteplus_saved
159  endif
160
161  if !empty(skipped)
162    throw skipped
163  endif
164endfunc
165
166func Test_set_background()
167  let background_saved = &background
168
169  set background&
170  call assert_equal('light', &background)
171
172  set background=dark
173  call assert_equal('dark', &background)
174
175  let &background = background_saved
176endfunc
177
178func Test_set_balloondelay()
179  CheckOption balloondelay
180
181  let balloondelay_saved = &balloondelay
182
183  " Check if the default value is identical to that described in the manual.
184  set balloondelay&
185  call assert_equal(600, &balloondelay)
186
187  " Edge cases
188
189  " XXX This fact should be hidden so that people won't be tempted to write
190  " plugin/TimeMachine.vim.  TODO Add reasonable range checks to the source
191  " code.
192  set balloondelay=-1
193  call assert_equal(-1, &balloondelay)
194
195  " Though it's possible to interpret the zero delay to be 'as soon as
196  " possible' or even 'indefinite', its actual meaning depends on the GUI
197  " toolkit in use after all.
198  set balloondelay=0
199  call assert_equal(0, &balloondelay)
200
201  set balloondelay=1
202  call assert_equal(1, &balloondelay)
203
204  " Since p_bdelay is of type long currently, the upper bound can be
205  " impractically huge and machine-dependent.  Practically, it's sufficient
206  " to check if balloondelay works with 0x7fffffff (32 bits) for now.
207  set balloondelay=2147483647
208  call assert_equal(2147483647, &balloondelay)
209
210  let &balloondelay = balloondelay_saved
211endfunc
212
213func Test_set_ballooneval()
214  CheckOption ballooneval
215
216  let ballooneval_saved = &ballooneval
217
218  set ballooneval&
219  call assert_equal(0, &ballooneval)
220
221  set ballooneval
222  call assert_notequal(0, &ballooneval)
223
224  set noballooneval
225  call assert_equal(0, &ballooneval)
226
227  let &ballooneval = ballooneval_saved
228endfunc
229
230func Test_set_balloonexpr()
231  CheckOption balloonexpr
232
233  let balloonexpr_saved = &balloonexpr
234
235  " Default value
236  set balloonexpr&
237  call assert_equal('', &balloonexpr)
238
239  " User-defined function
240  new
241  func MyBalloonExpr()
242      return 'Cursor is at line ' . v:beval_lnum .
243	      \', column ' . v:beval_col .
244	      \ ' of file ' .  bufname(v:beval_bufnr) .
245	      \ ' on word "' . v:beval_text . '"' .
246	      \ ' in window ' . v:beval_winid . ' (#' . v:beval_winnr . ')'
247  endfunc
248  setl balloonexpr=MyBalloonExpr()
249  setl ballooneval
250  call assert_equal('MyBalloonExpr()', &balloonexpr)
251  " TODO Read non-empty text, place the pointer at a character of a word,
252  " and check if the content of the balloon is the same as what is expected.
253  " Also, check if textlock works as expected.
254  setl balloonexpr&
255  call assert_equal('', &balloonexpr)
256  delfunc MyBalloonExpr
257  bwipe!
258
259  " Multiline support
260  if has('balloon_multiline')
261    " Multiline balloon using NL
262    new
263    func MyBalloonFuncForMultilineUsingNL()
264      return "Multiline\nSuppported\nBalloon\nusing NL"
265    endfunc
266    setl balloonexpr=MyBalloonFuncForMultilineUsingNL()
267    setl ballooneval
268    call assert_equal('MyBalloonFuncForMultilineUsingNL()', &balloonexpr)
269    " TODO Read non-empty text, place the pointer at a character of a word,
270    " and check if the content of the balloon is the same as what is
271    " expected.  Also, check if textlock works as expected.
272    setl balloonexpr&
273    delfunc MyBalloonFuncForMultilineUsingNL
274    bwipe!
275
276    " Multiline balloon using List
277    new
278    func MyBalloonFuncForMultilineUsingList()
279      return [ 'Multiline', 'Suppported', 'Balloon', 'using List' ]
280    endfunc
281    setl balloonexpr=MyBalloonFuncForMultilineUsingList()
282    setl ballooneval
283    call assert_equal('MyBalloonFuncForMultilineUsingList()', &balloonexpr)
284    " TODO Read non-empty text, place the pointer at a character of a word,
285    " and check if the content of the balloon is the same as what is
286    " expected.  Also, check if textlock works as expected.
287    setl balloonexpr&
288    delfunc MyBalloonFuncForMultilineUsingList
289    bwipe!
290  endif
291
292  let &balloonexpr = balloonexpr_saved
293endfunc
294
295" Invalid arguments are tested with test_options in conjunction with segfaults
296" caused by them (Patch 8.0.0357, 24922ec233).
297func Test_set_guicursor()
298  let guicursor_saved = &guicursor
299
300  let default = [
301        \ "n-v-c:block-Cursor/lCursor",
302        \ "ve:ver35-Cursor",
303        \ "o:hor50-Cursor",
304        \ "i-ci:ver25-Cursor/lCursor",
305        \ "r-cr:hor20-Cursor/lCursor",
306        \ "sm:block-Cursor-blinkwait175-blinkoff150-blinkon175"
307        \ ]
308
309  " Default Value
310  set guicursor&
311  call assert_equal(join(default, ','), &guicursor)
312
313  " Argument List Example 1
314  let opt_list = copy(default)
315  let opt_list[0] = "n-c-v:block-nCursor"
316  exec "set guicursor=" . join(opt_list, ',')
317  call assert_equal(join(opt_list, ','), &guicursor)
318  unlet opt_list
319
320  " Argument List Example 2
321  let opt_list = copy(default)
322  let opt_list[3] = "i-ci:ver30-iCursor-blinkwait300-blinkon200-blinkoff150"
323  exec "set guicursor=" . join(opt_list, ',')
324  call assert_equal(join(opt_list, ','), &guicursor)
325  unlet opt_list
326
327  " 'a' Mode
328  set guicursor&
329  let &guicursor .= ',a:blinkon0'
330  call assert_equal(join(default, ',') . ",a:blinkon0", &guicursor)
331
332  let &guicursor = guicursor_saved
333endfunc
334
335func Test_set_guifont()
336  let skipped = ''
337
338  let guifont_saved = &guifont
339  if has('xfontset')
340    " Prevent 'guifontset' from canceling 'guifont'.
341    let guifontset_saved = &guifontset
342    set guifontset=
343  endif
344
345  if !g:x11_based_gui
346    let skipped = g:not_implemented
347  elseif has('gui_athena') || has('gui_motif')
348    " Non-empty font list with invalid font names.
349    "
350    " This test is twofold: (1) It checks if the command fails as expected
351    " when there are no loadable fonts found in the list. (2) It checks if
352    " 'guifont' remains the same after the command loads none of the fonts
353    " listed.
354    let flist = &guifont
355    call assert_fails('set guifont=-notexist1-*,-notexist2-*')
356    call assert_equal(flist, &guifont)
357
358    " Non-empty font list with a valid font name.  Should pick up the first
359    " valid font.
360    set guifont=-notexist1-*,fixed,-notexist2-*
361    let pat = '\(fixed\)\|\(\c-Misc-Fixed-Medium-R-SemiCondensed--13-120-75-75-C-60-ISO8859-1\)'
362    call assert_match(pat, getfontname())
363
364    " Empty list. Should fallback to the built-in default.
365    set guifont=
366    let pat = '\(7x13\)\|\(\c-Misc-Fixed-Medium-R-Normal--13-120-75-75-C-70-ISO8859-1\)'
367    call assert_match(pat, getfontname())
368
369  elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
370    " For GTK, what we refer to as 'font names' in our manual are actually
371    " 'initial font patterns'.  A valid font which matches the 'canonical font
372    " pattern' constructed from a given 'initial pattern' is to be looked up
373    " and loaded.  That explains why the GTK GUIs appear to accept 'invalid
374    " font names'.
375    "
376    " Non-empty list.  Should always pick up the first element, no matter how
377    " strange it is, as explained above.
378    set guifont=(´・ω・`)\ 12,Courier\ 12
379    call assert_equal('(´・ω・`) 12', getfontname())
380
381    " Empty list. Should fallback to the built-in default.
382    set guifont=
383    call assert_equal('Monospace 10', getfontname())
384  endif
385
386  if has('win32')
387    " Invalid font names are accepted in GTK GUI
388    call assert_fails('set guifont=xa1bc23d7f', 'E596:')
389  endif
390
391  " This only works if 'renderoptions' exists and does not work for Windows XP
392  " and older.
393  if exists('+renderoptions') && windowsversion() !~ '^[345]\.'
394    " doing this four times used to cause a crash
395    set renderoptions=type:directx
396    for i in range(5)
397      set guifont=
398    endfor
399    set renderoptions=
400    for i in range(5)
401      set guifont=
402    endfor
403  endif
404
405  if has('xfontset')
406    let &guifontset = guifontset_saved
407  endif
408  let &guifont = guifont_saved
409
410  if !empty(skipped)
411    throw skipped
412  endif
413endfunc
414
415func Test_set_guifontset()
416  CheckFeature xfontset
417  let skipped = ''
418
419  call assert_fails('set guifontset=*', 'E597:')
420
421  let ctype_saved = v:ctype
422
423  " First, since XCreateFontSet(3) is very sensitive to locale, fonts must
424  " be chosen meticulously.
425  let font_head = '-misc-fixed-medium-r-normal--14'
426
427  let font_aw70 = font_head . '-130-75-75-c-70'
428  let font_aw140 = font_head . '-130-75-75-c-140'
429
430  let font_jisx0201 = font_aw70 . '-jisx0201.1976-0'
431  let font_jisx0208 = font_aw140 . '-jisx0208.1983-0'
432
433  let full_XLFDs = join([ font_jisx0208, font_jisx0201 ], ',')
434  let short_XLFDs = join([ font_aw140, font_aw70 ], ',')
435  let singleton = font_head . '-*'
436  let aliases = 'k14,r14'
437
438  " Second, among 'locales', look up such a locale that gets 'set
439  " guifontset=' to work successfully with every fontset specified with
440  " 'fontsets'.
441  let locales = [ 'ja_JP.UTF-8', 'ja_JP.eucJP', 'ja_JP.SJIS' ]
442  let fontsets = [ full_XLFDs, short_XLFDs, singleton, aliases ]
443
444  let feasible = 0
445  for locale in locales
446    try
447      exec 'language ctype' locale
448    catch /^Vim\%((\a\+)\)\=:E197/
449      continue
450    endtry
451    let done = 0
452    for fontset in fontsets
453      try
454	exec 'set guifontset=' . fontset
455      catch /^Vim\%((\a\+)\)\=:E\%(250\|252\|234\|597\|598\)/
456	break
457      endtry
458      let done += 1
459    endfor
460    if done == len(fontsets)
461      let feasible = 1
462      break
463    endif
464  endfor
465
466  " Third, give a set of tests if it is found feasible.
467  if !feasible
468    let skipped = g:not_hosted
469  else
470    " N.B. 'v:ctype' has already been set to an appropriate value in the
471    " previous loop.
472    for fontset in fontsets
473      exec 'set guifontset=' . fontset
474      call assert_equal(fontset, &guifontset)
475    endfor
476  endif
477
478  " Finally, restore ctype.
479  exec 'language ctype' ctype_saved
480
481  if !empty(skipped)
482    throw skipped
483  endif
484endfunc
485
486func Test_set_guifontwide()
487  call assert_fails('set guifontwide=*', 'E533:')
488  let skipped = ''
489
490  if !g:x11_based_gui
491    let skipped = g:not_implemented
492  elseif has('gui_gtk')
493    let guifont_saved = &guifont
494    let guifontwide_saved = &guifontwide
495
496    let fc_match = exepath('fc-match')
497    if empty(fc_match)
498      let skipped = g:not_hosted
499    else
500      let &guifont = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=en')
501      let wide = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=ja')
502      exec 'set guifontwide=' . fnameescape(wide)
503      call assert_equal(wide, &guifontwide)
504    endif
505
506    let &guifontwide = guifontwide_saved
507    let &guifont = guifont_saved
508
509  elseif has('gui_athena') || has('gui_motif')
510    " guifontwide is premised upon the xfontset feature.
511    if !has('xfontset')
512      let skipped = g:not_supported . 'xfontset'
513    else
514      let encoding_saved    = &encoding
515      let guifont_saved     = &guifont
516      let guifontset_saved  = &guifontset
517      let guifontwide_saved = &guifontwide
518
519      let nfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-90-iso10646-1'
520      let wfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-180-iso10646-1'
521
522      set encoding=utf-8
523
524      " Case 1: guifontset is empty
525      set guifontset=
526
527      " Case 1-1: Automatic selection
528      set guifontwide=
529      exec 'set guifont=' . nfont
530      call assert_equal(wfont, &guifontwide)
531
532      " Case 1-2: Manual selection
533      exec 'set guifontwide=' . wfont
534      exec 'set guifont=' . nfont
535      call assert_equal(wfont, &guifontwide)
536
537      " Case 2: guifontset is invalid
538      try
539        set guifontset=-*-notexist-*
540        call assert_report("'set guifontset=-*-notexist-*' should have failed")
541      catch
542        call assert_exception('E598:')
543      endtry
544      " Set it to an invalid value brutally for preparation.
545      let &guifontset = '-*-notexist-*'
546
547      " Case 2-1: Automatic selection
548      set guifontwide=
549      exec 'set guifont=' . nfont
550      call assert_equal(wfont, &guifontwide)
551
552      " Case 2-2: Manual selection
553      exec 'set guifontwide=' . wfont
554      exec 'set guifont=' . nfont
555      call assert_equal(wfont, &guifontwide)
556
557      let &guifontwide = guifontwide_saved
558      let &guifontset  = guifontset_saved
559      let &guifont     = guifont_saved
560      let &encoding    = encoding_saved
561    endif
562  endif
563
564  if !empty(skipped)
565    throw skipped
566  endif
567endfunc
568
569func Test_set_guiheadroom()
570  let skipped = ''
571
572  if !g:x11_based_gui
573    let skipped = g:not_supported . 'guiheadroom'
574  else
575    " Since this script is to be read together with '-U NONE', the default
576    " value must be preserved.
577    call assert_equal(50, &guiheadroom)
578  endif
579
580  if !empty(skipped)
581    throw skipped
582  endif
583endfunc
584
585func Test_set_guioptions()
586  let guioptions_saved = &guioptions
587  let duration = '200m'
588
589  if has('win32')
590    " Default Value
591    set guioptions&
592    call assert_equal('egmrLtT', &guioptions)
593
594  else
595    " Default Value
596    set guioptions&
597    call assert_equal('aegimrLtT', &guioptions)
598
599    " To activate scrollbars of type 'L' or 'R'.
600    wincmd v
601    redraw!
602
603    " Remove all default GUI ornaments
604    set guioptions-=T
605    exec 'sleep' . duration
606    call assert_equal('aegimrLt', &guioptions)
607    set guioptions-=t
608    exec 'sleep' . duration
609    call assert_equal('aegimrL', &guioptions)
610    set guioptions-=L
611    exec 'sleep' . duration
612    call assert_equal('aegimr', &guioptions)
613    set guioptions-=r
614    exec 'sleep' . duration
615    call assert_equal('aegim', &guioptions)
616    set guioptions-=m
617    exec 'sleep' . duration
618    call assert_equal('aegi', &guioptions)
619
620    " Try non-default GUI ornaments
621    set guioptions+=l
622    exec 'sleep' . duration
623    call assert_equal('aegil', &guioptions)
624    set guioptions-=l
625    exec 'sleep' . duration
626    call assert_equal('aegi', &guioptions)
627
628    set guioptions+=R
629    exec 'sleep' . duration
630    call assert_equal('aegiR', &guioptions)
631    set guioptions-=R
632    exec 'sleep' . duration
633    call assert_equal('aegi', &guioptions)
634
635    set guioptions+=b
636    exec 'sleep' . duration
637    call assert_equal('aegib', &guioptions)
638    set guioptions+=h
639    exec 'sleep' . duration
640    call assert_equal('aegibh', &guioptions)
641    set guioptions-=h
642    exec 'sleep' . duration
643    call assert_equal('aegib', &guioptions)
644    set guioptions-=b
645    exec 'sleep' . duration
646    call assert_equal('aegi', &guioptions)
647
648    set guioptions+=v
649    exec 'sleep' . duration
650    call assert_equal('aegiv', &guioptions)
651    set guioptions-=v
652    exec 'sleep' . duration
653    call assert_equal('aegi', &guioptions)
654
655    if has('gui_motif')
656      set guioptions+=F
657      exec 'sleep' . duration
658      call assert_equal('aegiF', &guioptions)
659      set guioptions-=F
660      exec 'sleep' . duration
661      call assert_equal('aegi', &guioptions)
662    endif
663
664    if has('gui_gtk3')
665      set guioptions+=d
666      exec 'sleep' . duration
667      call assert_equal('aegid', &guioptions)
668      set guioptions-=d
669      exec 'sleep' . duration
670      call assert_equal('aegi', &guioptions)
671    endif
672
673    " Restore GUI ornaments to the default state.
674    set guioptions+=m
675    exec 'sleep' . duration
676    call assert_equal('aegim', &guioptions)
677    set guioptions+=r
678    exec 'sleep' . duration
679    call assert_equal('aegimr', &guioptions)
680    set guioptions+=L
681    exec 'sleep' . duration
682    call assert_equal('aegimrL', &guioptions)
683    set guioptions+=t
684    exec 'sleep' . duration
685    call assert_equal('aegimrLt', &guioptions)
686    set guioptions+=T
687    exec 'sleep' . duration
688    call assert_equal("aegimrLtT", &guioptions)
689
690    wincmd o
691    redraw!
692  endif
693
694  let &guioptions = guioptions_saved
695endfunc
696
697func Test_scrollbars()
698  new
699  " buffer with 200 lines
700  call setline(1, repeat(['one', 'two'], 100))
701  set guioptions+=rlb
702
703  " scroll to move line 11 at top, moves the cursor there
704  eval 10->test_scrollbar('left', 0)
705  redraw
706  call assert_equal(1, winline())
707  call assert_equal(11, line('.'))
708
709  " scroll to move line 1 at top, cursor stays in line 11
710  call test_scrollbar('right', 0, 0)
711  redraw
712  call assert_equal(11, winline())
713  call assert_equal(11, line('.'))
714
715  set nowrap
716  call setline(11, repeat('x', 150))
717  redraw
718  call assert_equal(1, wincol())
719  set number
720  redraw
721  call assert_equal(5, wincol())
722  set nonumber
723  redraw
724  call assert_equal(1, col('.'))
725
726  " scroll to character 11, cursor is moved
727  call test_scrollbar('hor', 10, 0)
728  redraw
729  call assert_equal(1, wincol())
730  set number
731  redraw
732  call assert_equal(5, wincol())
733  set nonumber
734  redraw
735  call assert_equal(11, col('.'))
736
737  set guioptions&
738  set wrap&
739  bwipe!
740endfunc
741
742func Test_menu()
743  CheckFeature quickfix
744
745  " Check Help menu exists
746  let help_menu = execute('menu Help')
747  call assert_match('Overview', help_menu)
748
749  " Check Help menu works
750  emenu Help.Overview
751  call assert_equal('help', &buftype)
752  close
753
754  " Check deleting menu doesn't cause trouble.
755  aunmenu Help
756  if exists(':tlmenu')
757    tlunmenu Help
758  endif
759  call assert_fails('menu Help', 'E329:')
760endfunc
761
762func Test_set_guipty()
763  let guipty_saved = &guipty
764
765  " Default Value
766  set guipty&
767  call assert_equal(1, &guipty)
768
769  set noguipty
770  call assert_equal(0, &guipty)
771
772  let &guipty = guipty_saved
773endfunc
774
775func Test_encoding_conversion()
776  " GTK supports conversion between 'encoding' and "utf-8"
777  CheckFeature gui_gtk
778  let encoding_saved = &encoding
779  set encoding=latin1
780
781  " would be nice if we could take a screenshot
782  intro
783  " sets the window title
784  edit SomeFile
785
786  let &encoding = encoding_saved
787endfunc
788
789func Test_shell_command()
790  new
791  r !echo hello
792  call assert_equal('hello', substitute(getline(2), '\W', '', 'g'))
793  bwipe!
794endfunc
795
796func Test_syntax_colortest()
797  runtime syntax/colortest.vim
798  redraw!
799  sleep 200m
800  bwipe!
801endfunc
802
803func Test_set_term()
804  " It's enough to check the current value since setting 'term' to anything
805  " other than builtin_gui makes no sense at all.
806  call assert_equal('builtin_gui', &term)
807  call assert_fails('set term=xterm', 'E530:')
808endfunc
809
810func Test_windowid_variable()
811  if g:x11_based_gui || has('win32')
812    call assert_true(v:windowid > 0)
813  else
814    call assert_equal(0, v:windowid)
815  endif
816endfunc
817
818" Test "vim -g" and also the GUIEnter autocommand.
819func Test_gui_dash_g()
820  let cmd = GetVimCommand('Xscriptgui')
821  call writefile([""], "Xtestgui")
822  let lines =<< trim END
823	au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
824	au GUIEnter * qall
825  END
826  call writefile(lines, 'Xscriptgui')
827  call system(cmd . ' -g')
828  call WaitForAssert({-> assert_equal(['insertmode: 0'], readfile('Xtestgui'))})
829
830  call delete('Xscriptgui')
831  call delete('Xtestgui')
832endfunc
833
834" Test "vim -7" and also the GUIEnter autocommand.
835func Test_gui_dash_y()
836  let cmd = GetVimCommand('Xscriptgui')
837  call writefile([""], "Xtestgui")
838  let lines =<< trim END
839	au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
840	au GUIEnter * qall
841  END
842  call writefile(lines, 'Xscriptgui')
843  call system(cmd . ' -y')
844  call WaitForAssert({-> assert_equal(['insertmode: 1'], readfile('Xtestgui'))})
845
846  call delete('Xscriptgui')
847  call delete('Xtestgui')
848endfunc
849
850" Test for "!" option in 'guioptions'. Use a terminal for running external
851" commands
852func Test_gui_run_cmd_in_terminal()
853  CheckFeature terminal
854  let save_guioptions = &guioptions
855  set guioptions+=!
856  if has('win32')
857    let cmd = 'type'
858  else
859    " assume all the other systems have a cat command
860    let cmd = 'cat'
861  endif
862  exe "silent !" . cmd . " test_gui.vim"
863  " TODO: how to check that the command ran in a separate terminal?
864  " Maybe check for $TERM (dumb vs xterm) in the spawned shell?
865  let &guioptions = save_guioptions
866endfunc
867
868func Test_gui_recursive_mapping()
869  nmap ' <C-W>
870  nmap <C-W>a :let didit = 1<CR>
871  call feedkeys("'a", 'xt')
872  call assert_equal(1, didit)
873
874  nunmap '
875  nunmap <C-W>a
876endfunc
877
878" vim: shiftwidth=2 sts=2 expandtab
879