xref: /vim-8.2.3635/src/testdir/test_gui.vim (revision 1b3e0727)
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
390    " doing this four times used to cause a crash
391    set guifont=
392    set guifont=
393    set guifont=
394    set guifont=
395    set guifont=
396  endif
397
398  if has('xfontset')
399    let &guifontset = guifontset_saved
400  endif
401  let &guifont = guifont_saved
402
403  if !empty(skipped)
404    throw skipped
405  endif
406endfunc
407
408func Test_set_guifontset()
409  CheckFeature xfontset
410  let skipped = ''
411
412  call assert_fails('set guifontset=*', 'E597:')
413
414  let ctype_saved = v:ctype
415
416  " First, since XCreateFontSet(3) is very sensitive to locale, fonts must
417  " be chosen meticulously.
418  let font_head = '-misc-fixed-medium-r-normal--14'
419
420  let font_aw70 = font_head . '-130-75-75-c-70'
421  let font_aw140 = font_head . '-130-75-75-c-140'
422
423  let font_jisx0201 = font_aw70 . '-jisx0201.1976-0'
424  let font_jisx0208 = font_aw140 . '-jisx0208.1983-0'
425
426  let full_XLFDs = join([ font_jisx0208, font_jisx0201 ], ',')
427  let short_XLFDs = join([ font_aw140, font_aw70 ], ',')
428  let singleton = font_head . '-*'
429  let aliases = 'k14,r14'
430
431  " Second, among 'locales', look up such a locale that gets 'set
432  " guifontset=' to work successfully with every fontset specified with
433  " 'fontsets'.
434  let locales = [ 'ja_JP.UTF-8', 'ja_JP.eucJP', 'ja_JP.SJIS' ]
435  let fontsets = [ full_XLFDs, short_XLFDs, singleton, aliases ]
436
437  let feasible = 0
438  for locale in locales
439    try
440      exec 'language ctype' locale
441    catch /^Vim\%((\a\+)\)\=:E197/
442      continue
443    endtry
444    let done = 0
445    for fontset in fontsets
446      try
447	exec 'set guifontset=' . fontset
448      catch /^Vim\%((\a\+)\)\=:E\%(250\|252\|234\|597\|598\)/
449	break
450      endtry
451      let done += 1
452    endfor
453    if done == len(fontsets)
454      let feasible = 1
455      break
456    endif
457  endfor
458
459  " Third, give a set of tests if it is found feasible.
460  if !feasible
461    let skipped = g:not_hosted
462  else
463    " N.B. 'v:ctype' has already been set to an appropriate value in the
464    " previous loop.
465    for fontset in fontsets
466      exec 'set guifontset=' . fontset
467      call assert_equal(fontset, &guifontset)
468    endfor
469  endif
470
471  " Finally, restore ctype.
472  exec 'language ctype' ctype_saved
473
474  if !empty(skipped)
475    throw skipped
476  endif
477endfunc
478
479func Test_set_guifontwide()
480  call assert_fails('set guifontwide=*', 'E533:')
481  let skipped = ''
482
483  if !g:x11_based_gui
484    let skipped = g:not_implemented
485  elseif has('gui_gtk')
486    let guifont_saved = &guifont
487    let guifontwide_saved = &guifontwide
488
489    let fc_match = exepath('fc-match')
490    if empty(fc_match)
491      let skipped = g:not_hosted
492    else
493      let &guifont = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=en')
494      let wide = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=ja')
495      exec 'set guifontwide=' . fnameescape(wide)
496      call assert_equal(wide, &guifontwide)
497    endif
498
499    let &guifontwide = guifontwide_saved
500    let &guifont = guifont_saved
501
502  elseif has('gui_athena') || has('gui_motif')
503    " guifontwide is premised upon the xfontset feature.
504    if !has('xfontset')
505      let skipped = g:not_supported . 'xfontset'
506    else
507      let encoding_saved    = &encoding
508      let guifont_saved     = &guifont
509      let guifontset_saved  = &guifontset
510      let guifontwide_saved = &guifontwide
511
512      let nfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-90-iso10646-1'
513      let wfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-180-iso10646-1'
514
515      set encoding=utf-8
516
517      " Case 1: guifontset is empty
518      set guifontset=
519
520      " Case 1-1: Automatic selection
521      set guifontwide=
522      exec 'set guifont=' . nfont
523      call assert_equal(wfont, &guifontwide)
524
525      " Case 1-2: Manual selection
526      exec 'set guifontwide=' . wfont
527      exec 'set guifont=' . nfont
528      call assert_equal(wfont, &guifontwide)
529
530      " Case 2: guifontset is invalid
531      try
532        set guifontset=-*-notexist-*
533        call assert_report("'set guifontset=-*-notexist-*' should have failed")
534      catch
535        call assert_exception('E598:')
536      endtry
537      " Set it to an invalid value brutally for preparation.
538      let &guifontset = '-*-notexist-*'
539
540      " Case 2-1: Automatic selection
541      set guifontwide=
542      exec 'set guifont=' . nfont
543      call assert_equal(wfont, &guifontwide)
544
545      " Case 2-2: Manual selection
546      exec 'set guifontwide=' . wfont
547      exec 'set guifont=' . nfont
548      call assert_equal(wfont, &guifontwide)
549
550      let &guifontwide = guifontwide_saved
551      let &guifontset  = guifontset_saved
552      let &guifont     = guifont_saved
553      let &encoding    = encoding_saved
554    endif
555  endif
556
557  if !empty(skipped)
558    throw skipped
559  endif
560endfunc
561
562func Test_set_guiheadroom()
563  let skipped = ''
564
565  if !g:x11_based_gui
566    let skipped = g:not_supported . 'guiheadroom'
567  else
568    " Since this script is to be read together with '-U NONE', the default
569    " value must be preserved.
570    call assert_equal(50, &guiheadroom)
571  endif
572
573  if !empty(skipped)
574    throw skipped
575  endif
576endfunc
577
578func Test_set_guioptions()
579  let guioptions_saved = &guioptions
580  let duration = '200m'
581
582  if has('win32')
583    " Default Value
584    set guioptions&
585    call assert_equal('egmrLtT', &guioptions)
586
587  else
588    " Default Value
589    set guioptions&
590    call assert_equal('aegimrLtT', &guioptions)
591
592    " To activate scrollbars of type 'L' or 'R'.
593    wincmd v
594    redraw!
595
596    " Remove all default GUI ornaments
597    set guioptions-=T
598    exec 'sleep' . duration
599    call assert_equal('aegimrLt', &guioptions)
600    set guioptions-=t
601    exec 'sleep' . duration
602    call assert_equal('aegimrL', &guioptions)
603    set guioptions-=L
604    exec 'sleep' . duration
605    call assert_equal('aegimr', &guioptions)
606    set guioptions-=r
607    exec 'sleep' . duration
608    call assert_equal('aegim', &guioptions)
609    set guioptions-=m
610    exec 'sleep' . duration
611    call assert_equal('aegi', &guioptions)
612
613    " Try non-default GUI ornaments
614    set guioptions+=l
615    exec 'sleep' . duration
616    call assert_equal('aegil', &guioptions)
617    set guioptions-=l
618    exec 'sleep' . duration
619    call assert_equal('aegi', &guioptions)
620
621    set guioptions+=R
622    exec 'sleep' . duration
623    call assert_equal('aegiR', &guioptions)
624    set guioptions-=R
625    exec 'sleep' . duration
626    call assert_equal('aegi', &guioptions)
627
628    set guioptions+=b
629    exec 'sleep' . duration
630    call assert_equal('aegib', &guioptions)
631    set guioptions+=h
632    exec 'sleep' . duration
633    call assert_equal('aegibh', &guioptions)
634    set guioptions-=h
635    exec 'sleep' . duration
636    call assert_equal('aegib', &guioptions)
637    set guioptions-=b
638    exec 'sleep' . duration
639    call assert_equal('aegi', &guioptions)
640
641    set guioptions+=v
642    exec 'sleep' . duration
643    call assert_equal('aegiv', &guioptions)
644    set guioptions-=v
645    exec 'sleep' . duration
646    call assert_equal('aegi', &guioptions)
647
648    if has('gui_motif')
649      set guioptions+=F
650      exec 'sleep' . duration
651      call assert_equal('aegiF', &guioptions)
652      set guioptions-=F
653      exec 'sleep' . duration
654      call assert_equal('aegi', &guioptions)
655    endif
656
657    if has('gui_gtk3')
658      set guioptions+=d
659      exec 'sleep' . duration
660      call assert_equal('aegid', &guioptions)
661      set guioptions-=d
662      exec 'sleep' . duration
663      call assert_equal('aegi', &guioptions)
664    endif
665
666    " Restore GUI ornaments to the default state.
667    set guioptions+=m
668    exec 'sleep' . duration
669    call assert_equal('aegim', &guioptions)
670    set guioptions+=r
671    exec 'sleep' . duration
672    call assert_equal('aegimr', &guioptions)
673    set guioptions+=L
674    exec 'sleep' . duration
675    call assert_equal('aegimrL', &guioptions)
676    set guioptions+=t
677    exec 'sleep' . duration
678    call assert_equal('aegimrLt', &guioptions)
679    set guioptions+=T
680    exec 'sleep' . duration
681    call assert_equal("aegimrLtT", &guioptions)
682
683    wincmd o
684    redraw!
685  endif
686
687  let &guioptions = guioptions_saved
688endfunc
689
690func Test_scrollbars()
691  new
692  " buffer with 200 lines
693  call setline(1, repeat(['one', 'two'], 100))
694  set guioptions+=rlb
695
696  " scroll to move line 11 at top, moves the cursor there
697  eval 10->test_scrollbar('left', 0)
698  redraw
699  call assert_equal(1, winline())
700  call assert_equal(11, line('.'))
701
702  " scroll to move line 1 at top, cursor stays in line 11
703  call test_scrollbar('right', 0, 0)
704  redraw
705  call assert_equal(11, winline())
706  call assert_equal(11, line('.'))
707
708  set nowrap
709  call setline(11, repeat('x', 150))
710  redraw
711  call assert_equal(1, wincol())
712  set number
713  redraw
714  call assert_equal(5, wincol())
715  set nonumber
716  redraw
717  call assert_equal(1, col('.'))
718
719  " scroll to character 11, cursor is moved
720  call test_scrollbar('hor', 10, 0)
721  redraw
722  call assert_equal(1, wincol())
723  set number
724  redraw
725  call assert_equal(5, wincol())
726  set nonumber
727  redraw
728  call assert_equal(11, col('.'))
729
730  set guioptions&
731  set wrap&
732  bwipe!
733endfunc
734
735func Test_menu()
736  CheckFeature quickfix
737
738  " Check Help menu exists
739  let help_menu = execute('menu Help')
740  call assert_match('Overview', help_menu)
741
742  " Check Help menu works
743  emenu Help.Overview
744  call assert_equal('help', &buftype)
745  close
746
747  " Check deleting menu doesn't cause trouble.
748  aunmenu Help
749  if exists(':tlmenu')
750    tlunmenu Help
751  endif
752  call assert_fails('menu Help', 'E329:')
753endfunc
754
755func Test_set_guipty()
756  let guipty_saved = &guipty
757
758  " Default Value
759  set guipty&
760  call assert_equal(1, &guipty)
761
762  set noguipty
763  call assert_equal(0, &guipty)
764
765  let &guipty = guipty_saved
766endfunc
767
768func Test_encoding_conversion()
769  " GTK supports conversion between 'encoding' and "utf-8"
770  CheckFeature gui_gtk
771  let encoding_saved = &encoding
772  set encoding=latin1
773
774  " would be nice if we could take a screenshot
775  intro
776  " sets the window title
777  edit SomeFile
778
779  let &encoding = encoding_saved
780endfunc
781
782func Test_shell_command()
783  new
784  r !echo hello
785  call assert_equal('hello', substitute(getline(2), '\W', '', 'g'))
786  bwipe!
787endfunc
788
789func Test_syntax_colortest()
790  runtime syntax/colortest.vim
791  redraw!
792  sleep 200m
793  bwipe!
794endfunc
795
796func Test_set_term()
797  " It's enough to check the current value since setting 'term' to anything
798  " other than builtin_gui makes no sense at all.
799  call assert_equal('builtin_gui', &term)
800  call assert_fails('set term=xterm', 'E530:')
801endfunc
802
803func Test_windowid_variable()
804  if g:x11_based_gui || has('win32')
805    call assert_true(v:windowid > 0)
806  else
807    call assert_equal(0, v:windowid)
808  endif
809endfunc
810
811" Test "vim -g" and also the GUIEnter autocommand.
812func Test_gui_dash_g()
813  let cmd = GetVimCommand('Xscriptgui')
814  call writefile([""], "Xtestgui")
815  let lines =<< trim END
816	au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
817	au GUIEnter * qall
818  END
819  call writefile(lines, 'Xscriptgui')
820  call system(cmd . ' -g')
821  call WaitForAssert({-> assert_equal(['insertmode: 0'], readfile('Xtestgui'))})
822
823  call delete('Xscriptgui')
824  call delete('Xtestgui')
825endfunc
826
827" Test "vim -7" and also the GUIEnter autocommand.
828func Test_gui_dash_y()
829  let cmd = GetVimCommand('Xscriptgui')
830  call writefile([""], "Xtestgui")
831  let lines =<< trim END
832	au GUIEnter * call writefile(["insertmode: " . &insertmode], "Xtestgui")
833	au GUIEnter * qall
834  END
835  call writefile(lines, 'Xscriptgui')
836  call system(cmd . ' -y')
837  call WaitForAssert({-> assert_equal(['insertmode: 1'], readfile('Xtestgui'))})
838
839  call delete('Xscriptgui')
840  call delete('Xtestgui')
841endfunc
842
843" Test for "!" option in 'guioptions'. Use a terminal for running external
844" commands
845func Test_gui_run_cmd_in_terminal()
846  CheckFeature terminal
847  let save_guioptions = &guioptions
848  set guioptions+=!
849  if has('win32')
850    let cmd = 'type'
851  else
852    " assume all the other systems have a cat command
853    let cmd = 'cat'
854  endif
855  exe "silent !" . cmd . " test_gui.vim"
856  " TODO: how to check that the command ran in a separate terminal?
857  " Maybe check for $TERM (dumb vs xterm) in the spawned shell?
858  let &guioptions = save_guioptions
859endfunc
860
861func Test_gui_recursive_mapping()
862  nmap ' <C-W>
863  nmap <C-W>a :let didit = 1<CR>
864  call feedkeys("'a", 'xt')
865  call assert_equal(1, didit)
866
867  nunmap '
868  nunmap <C-W>a
869endfunc
870
871" vim: shiftwidth=2 sts=2 expandtab
872