changeset 10885:310834b0256a v8.0.0332

patch 8.0.0332: GUI test fails on some systems commit https://github.com/vim/vim/commit/4e9dbc74df24dc22d0eeda3741c3fb0e0e7373bf Author: Bram Moolenaar <Bram@vim.org> Date: Fri Feb 17 13:44:48 2017 +0100 patch 8.0.0332: GUI test fails on some systems Problem: GUI test fails on some systems. Solution: Try different language settings. (Kazunobu Kuriyama)
author Christian Brabandt <cb@256bit.org>
date Fri, 17 Feb 2017 13:45:04 +0100
parents 44174df54b0b
children 5b3545b55610
files src/testdir/test_gui.vim src/version.c
diffstat 2 files changed, 147 insertions(+), 115 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_gui.vim
+++ b/src/testdir/test_gui.vim
@@ -7,6 +7,11 @@ endif
 let s:x11_based_gui = has('gui_athena') || has('gui_motif')
 	\ || has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
 
+" Reasons for 'skipped'.
+let s:not_supported   = "Skipped: Feature/Option not supported by this GUI: "
+let s:not_implemented = "Skipped: Test not implemented yet for this GUI"
+let s:not_hosted      = "Skipped: Test not hosted by the system/environment"
+
 " For KDE set a font, empty 'guifont' may cause a hang.
 func SetUp()
   if has("gui_kde")
@@ -36,61 +41,77 @@ func Test_1_set_secure()
 endfunc
 
 func Test_getfontname_with_arg()
-  if has('gui_athena') || has('gui_motif')
+  let skipped = ''
+
+  if !s:x11_based_gui
+    let skipped = s:not_implemented
+  elseif has('gui_athena') || has('gui_motif')
     " Invalid font name. The result should be an empty string.
     call assert_equal('', getfontname('notexist'))
 
     " Valid font name. This is usually the real name of 7x13 by default.
-    let l:fname = '-misc-fixed-medium-r-normal--13-120-75-75-c-70-iso8859-1'
-    call assert_equal(l:fname, getfontname(l:fname))
+    let fname = '-misc-fixed-medium-r-normal--13-120-75-75-c-70-iso8859-1'
+    call assert_equal(fname, getfontname(fname))
 
   elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
     " Invalid font name. The result should be the name plus the default size.
     call assert_equal('notexist 10', getfontname('notexist'))
 
     " Valid font name. This is usually the real name of Monospace by default.
-    let l:fname = 'Bitstream Vera Sans Mono 12'
-    call assert_equal(l:fname, getfontname(l:fname))
-  else
-    throw "Skipped: Matched font name unpredictable to test on this GUI"
+    let fname = 'Bitstream Vera Sans Mono 12'
+    call assert_equal(fname, getfontname(fname))
+  endif
+
+  if !empty(skipped)
+    throw skipped
   endif
 endfunc
 
 func Test_getfontname_without_arg()
-  let l:fname = getfontname()
-  if has('gui_kde')
+  let skipped = ''
+
+  let fname = getfontname()
+
+  if !s:x11_based_gui
+    let skipped = s:not_implemented
+  elseif has('gui_kde')
     " 'expected' is the value specified by SetUp() above.
-    call assert_equal('Courier 10 Pitch/8/-1/5/50/0/0/0/0/0', l:fname)
+    call assert_equal('Courier 10 Pitch/8/-1/5/50/0/0/0/0/0', fname)
   elseif has('gui_athena') || has('gui_motif')
     " 'expected' is DFLT_FONT of gui_x11.c.
-    call assert_equal('7x13', l:fname)
+    call assert_equal('7x13', fname)
   elseif has('gui_gtk2') || has('gui_gnome') || has('gui_gtk3')
     " 'expected' is DEFAULT_FONT of gui_gtk_x11.c.
-    call assert_equal('Monospace 10', l:fname)
-  else
-    throw "Skipped: Default font name unpredictable to test on this GUI"
+    call assert_equal('Monospace 10', fname)
+  endif
+
+  if !empty(skipped)
+    throw skipped
   endif
 endfunc
 
 func Test_set_guifont()
-  let l:guifont_saved = &guifont
+  let skipped = ''
+
+  let guifont_saved = &guifont
   if has('xfontset')
     " Prevent 'guifontset' from canceling 'guifont'.
-    let l:guifontset_saved = &guifontset
+    let guifontset_saved = &guifontset
     set guifontset=
   endif
 
-  let skipped = 0
-  if has('gui_athena') || has('gui_motif')
+  if !s:x11_based_gui
+    let skipped = s:not_implemented
+  elseif has('gui_athena') || has('gui_motif')
     " Non-empty font list with invalid font names.
     "
     " This test is twofold: (1) It checks if the command fails as expected
     " when there are no loadable fonts found in the list. (2) It checks if
     " 'guifont' remains the same after the command loads none of the fonts
     " listed.
-    let l:flist = &guifont
+    let flist = &guifont
     call assert_fails('set guifont=-notexist1-*,-notexist2-*')
-    call assert_equal(l:flist, &guifont)
+    call assert_equal(flist, &guifont)
 
     " Non-empty font list with a valid font name.  Should pick up the first
     " valid font.
@@ -116,107 +137,124 @@ func Test_set_guifont()
     " Empty list. Should fallback to the built-in default.
     set guifont=
     call assert_equal('Monospace 10', getfontname())
-
-  else
-    let skipped = 1
   endif
 
   if has('xfontset')
-    let &guifontset = l:guifontset_saved
+    let &guifontset = guifontset_saved
   endif
-  let &guifont = l:guifont_saved
+  let &guifont = guifont_saved
 
-  if skipped
-    throw "Skipped: Test not implemented yet for this GUI"
+  if !empty(skipped)
+    throw skipped
   endif
 endfunc
 
 func Test_set_guifontset()
-  let skipped = 0
+  let skipped = ''
+
+  if !has('xfontset')
+    let skipped = s:not_supported . 'xfontset'
+  else
+    let ctype_saved = v:ctype
 
-  if has('xfontset')
-    let l:ctype_saved = v:ctype
+    " First, since XCreateFontSet(3) is very sensitive to locale, fonts must
+    " be chosen meticulously.
+    let font_head = '-misc-fixed-medium-r-normal--14'
+
+    let font_aw70 = font_head . '-130-75-75-c-70'
+    let font_aw140 = font_head . '-130-75-75-c-140'
 
-    " For UTF-8 locales, XCreateFontSet(3) is likely to fail in constructing a
-    " fontset automatically from one or two simple XLFDs because it requires
-    " the host system to have a fairly comprehensive collection of fixed-width
-    " fonts with various sizes and registries/encodings in order to get the
-    " job done.  To make the test meaningful for a wide variety of hosts, we
-    " confine ourselves to the following locale for which X11 historically has
-    " the fonts to use with.
-    language ctype ja_JP.eucJP
+    let font_jisx0201 = font_aw70 . '-jisx0201.1976-0'
+    let font_jisx0208 = font_aw140 . '-jisx0208.1983-0'
 
-    " Since XCreateFontSet(3) is very sensitive to locale, fonts must be
-    " chosen meticulously.
-    let l:font_head = '-misc-fixed-medium-r-normal--14'
+    let full_XLFDs = join([ font_jisx0208, font_jisx0201 ], ',')
+    let short_XLFDs = join([ font_aw140, font_aw70 ], ',')
+    let singleton = font_head . '-*'
+    let aliases = 'k14,r14'
 
-    let l:font_aw70 = l:font_head . '-130-75-75-c-70'
-    let l:font_aw140 = l:font_head . '-130-75-75-c-140'
-
-    let l:font_jisx0201 = l:font_aw70 . '-jisx0201.1976-0'
-    let l:font_jisx0208 = l:font_aw140 . '-jisx0208.1983-0'
+    " Second, among 'locales', look up such a locale that gets 'set
+    " guifontset=' to work successfully with every fontset specified with
+    " 'fontsets'.
+    let locales = [ 'ja_JP.UTF-8', 'ja_JP.eucJP', 'ja_JP.SJIS' ]
+    let fontsets = [ full_XLFDs, short_XLFDs, singleton, aliases ]
 
-    " Full XLFDs
-    let l:fontset_name = join([ l:font_jisx0208, l:font_jisx0201 ], ',')
-    exec 'set guifontset=' . l:fontset_name
-    call assert_equal(l:fontset_name, &guifontset)
-
-    " XLFDs w/o CharSetRegistry and CharSetEncoding
-    let l:fontset_name = join([ l:font_aw140, l:font_aw70 ], ',')
-    exec 'set guifontset=' . l:fontset_name
-    call assert_equal(l:fontset_name, &guifontset)
+    let feasible = 0
+    for locale in locales
+      try
+        exec 'language ctype' locale
+      catch /^Vim\%((\a\+)\)\=:E197/
+        continue
+      endtry
+      let done = 0
+      for fontset in fontsets
+        try
+          exec 'set guifontset=' . fontset
+        catch /^Vim\%((\a\+)\)\=:E\%(250\|252\|234\|597\|598\)/
+          break
+        endtry
+        let done += 1
+      endfor
+      if done == len(fontsets)
+        let feasible = 1
+        break
+      endif
+    endfor
 
-    " Singleton
-    let l:fontset_name = l:font_head . '-*'
-    exec 'set guifontset=' . l:fontset_name
-    call assert_equal(l:fontset_name, &guifontset)
+    " Third, give a set of tests if it is found feasible.
+    if !feasible
+      let skipped = s:not_hosted
+    else
+      " N.B. 'v:ctype' has already been set to an appropriate value in the
+      " previous loop.
+      for fontset in fontsets
+        exec 'set guifontset=' . fontset
+        call assert_equal(fontset, &guifontset)
+      endfor
+    endif
 
-    " Aliases
-    let l:fontset_name = 'k14,r14'
-    exec 'set guifontset=' . l:fontset_name
-    call assert_equal(l:fontset_name, &guifontset)
-
-    exec 'language ctype' l:ctype_saved
-
-  else
-    let skipped = 1
+    " Finally, restore ctype.
+    exec 'language ctype' ctype_saved
   endif
 
-  if skipped
-    throw "Skipped: Not supported by this GUI"
+  if !empty(skipped)
+    throw skipped
   endif
 endfunc
 
 func Test_set_guifontwide()
-  let skipped = 0
+  let skipped = ''
 
-  if has('gui_gtk')
-    let l:guifont_saved = &guifont
-    let l:guifontwide_saved = &guifontwide
+  if !s:x11_based_gui
+    let skipped = s:not_implemented
+  elseif has('gui_gtk')
+    let guifont_saved = &guifont
+    let guifontwide_saved = &guifontwide
 
-    let l:fc_match = exepath('fc-match')
-    if l:fc_match != ''
-      let &guifont = system('fc-match -f "%{family[0]} %{size}" monospace:size=10')
-      let l:wide = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=ja')
-      exec 'set guifontwide=' . fnameescape(l:wide)
-      call assert_equal(l:wide, &guifontwide)
+    let fc_match = exepath('fc-match')
+    if empty(fc_match)
+      let skipped = s:not_hosted
     else
-      let skipped = 3
+      let &guifont = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=en')
+      let wide = system('fc-match -f "%{family[0]} %{size}" monospace:size=10:lang=ja')
+      exec 'set guifontwide=' . fnameescape(wide)
+      call assert_equal(wide, &guifontwide)
     endif
 
-    let &guifontwide = l:guifontwide_saved
-    let &guifont = l:guifont_saved
+    let &guifontwide = guifontwide_saved
+    let &guifont = guifont_saved
 
   elseif has('gui_athena') || has('gui_motif')
     " guifontwide is premised upon the xfontset feature.
-    if has('xfontset')
-      let l:encoding_saved = &encoding
-      let l:guifont_saved = &guifont
-      let l:guifontset_saved = &guifontset
-      let l:guifontwide_saved = &guifontwide
+    if !has('xfontset')
+      let skipped = s:not_supported . 'xfontset'
+    else
+      let encoding_saved    = &encoding
+      let guifont_saved     = &guifont
+      let guifontset_saved  = &guifontset
+      let guifontwide_saved = &guifontwide
 
-      let l:nfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-90-iso10646-1'
-      let l:wfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-180-iso10646-1'
+      let nfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-90-iso10646-1'
+      let wfont = '-misc-fixed-medium-r-normal-*-18-120-100-100-c-180-iso10646-1'
 
       set encoding=utf-8
 
@@ -225,18 +263,18 @@ func Test_set_guifontwide()
 
       " Case 1-1: Automatic selection
       set guifontwide=
-      exec 'set guifont=' . l:nfont
-      call assert_equal(l:wfont, &guifontwide)
+      exec 'set guifont=' . nfont
+      call assert_equal(wfont, &guifontwide)
 
       " Case 1-2: Manual selection
-      exec 'set guifontwide=' . l:wfont
-      exec 'set guifont=' . l:nfont
-      call assert_equal(l:wfont, &guifontwide)
+      exec 'set guifontwide=' . wfont
+      exec 'set guifont=' . nfont
+      call assert_equal(wfont, &guifontwide)
 
       " Case 2: guifontset is invalid
       try
         set guifontset=-*-notexist-*
-        call assert_false(1, "'set guifontset=notexist' should have failed")
+        call assert_false(1, "'set guifontset=-*-notexist-*' should have failed")
       catch
         call assert_exception('E598')
       endtry
@@ -245,31 +283,23 @@ func Test_set_guifontwide()
 
       " Case 2-1: Automatic selection
       set guifontwide=
-      exec 'set guifont=' . l:nfont
-      call assert_equal(l:wfont, &guifontwide)
+      exec 'set guifont=' . nfont
+      call assert_equal(wfont, &guifontwide)
 
       " Case 2-2: Manual selection
-      exec 'set guifontwide=' . l:wfont
-      exec 'set guifont=' . l:nfont
-      call assert_equal(l:wfont, &guifontwide)
+      exec 'set guifontwide=' . wfont
+      exec 'set guifont=' . nfont
+      call assert_equal(wfont, &guifontwide)
 
-      let &guifontwide = l:guifontwide_saved
-      let &guifontset = l:guifontset_saved
-      let &guifont = l:guifont_saved
-      let &encoding = l:encoding_saved
-    else
-      let skipped = 2
+      let &guifontwide = guifontwide_saved
+      let &guifontset  = guifontset_saved
+      let &guifont     = guifont_saved
+      let &encoding    = encoding_saved
     endif
-  else
-    let skipped = 1
   endif
 
-  if skipped == 1
-    throw "Skipped: Test not implemented yet for this GUI"
-  elseif skipped == 2
-    throw "Skipped: Not supported by this GUI"
-  elseif skipped == 3
-    throw "Skipped: Test not supported by the environment"
+  if !empty(skipped)
+    throw skipped
   endif
 endfunc
 
--- a/src/version.c
+++ b/src/version.c
@@ -765,6 +765,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    332,
+/**/
     331,
 /**/
     330,