changeset 11000:307f9ae2a7fb v8.0.0389

patch 8.0.0389: test for arabic does not check what is displayed commit https://github.com/vim/vim/commit/5342f00ff95ed0256b8183063a83d72112f1243c Author: Bram Moolenaar <Bram@vim.org> Date: Tue Feb 28 22:51:12 2017 +0100 patch 8.0.0389: test for arabic does not check what is displayed Problem: Test for arabic does not check what is displayed. Solution: Improve what is asserted. (Dominique Pelle, closes https://github.com/vim/vim/issues/1523) Add a first shaping test.
author Christian Brabandt <cb@256bit.org>
date Wed, 01 Mar 2017 11:15:04 +0100
parents fe8f61b878ad
children 6ae7e97c528a
files src/testdir/test_arabic.vim src/version.c
diffstat 2 files changed, 67 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_arabic.vim
+++ b/src/testdir/test_arabic.vim
@@ -1,21 +1,23 @@
 " Simplistic testing of Arabic mode.
 
-if !has('arabic')
+if !has('arabic') || !has('multi_byte')
   finish
 endif
 
-set encoding=utf-8
-scriptencoding utf-8
+source view_util.vim
 
-" Return list of utf8 sequences of each character at line lnum.
+" Return list of Unicode characters at line lnum.
 " Combining characters are treated as a single item.
-func GetCharsUtf8(lnum)
+func s:get_chars(lnum)
   call cursor(a:lnum, 1)
   let chars = []
   let numchars = strchars(getline('.'), 1)
   for i in range(1, numchars)
     exe 'norm ' i . '|'
-    call add(chars, execute('norm g8'))
+    let c=execute('ascii')
+    let c=substitute(c, '\n\?<.\{-}Hex\s*', 'U+', 'g')
+    let c=substitute(c, ',\s*Octal\s*\d*', '', 'g')
+    call add(chars, c)
   endfor
   return chars
 endfunc
@@ -43,25 +45,28 @@ func Test_arabic_input()
   new
   set arabic
   " Typing sghl in Arabic insert mode should show the
-  " Arabic word 'Salaam' i.e. 'peace'.
-  call feedkeys('isghl', 'tx')
-  redraw
+  " Arabic word 'Salaam' i.e. 'peace', spelled:
+  " SEEN, LAM, ALEF, MEEM.
+  " See: https://www.mediawiki.org/wiki/VisualEditor/Typing/Right-to-left
+  call feedkeys('isghl!', 'tx')
+  call assert_match("^ *!\uFEE1\uFEFC\uFEB3$", ScreenLines(1, &columns)[0])
   call assert_equal([
-  \ "\nd8 b3 ",
-  \ "\nd9 84 + d8 a7 ",
-  \ "\nd9 85 "], GetCharsUtf8(1))
+  \ 'U+0633',
+  \ 'U+0644 U+0627',
+  \ 'U+0645',
+  \ 'U+21'], s:get_chars(1))
 
   " Without shaping, it should give individual Arabic letters.
   set noarabicshape
-  redraw
+  call assert_match("^ *!\u0645\u0627\u0644\u0633$", ScreenLines(1, &columns)[0])
   call assert_equal([
-  \ "\nd8 b3 ",
-  \ "\nd9 84 ",
-  \ "\nd8 a7 ",
-  \ "\nd9 85 "], GetCharsUtf8(1))
+  \ 'U+0633',
+  \ 'U+0644',
+  \ 'U+0627',
+  \ 'U+0645',
+  \ 'U+21'], s:get_chars(1))
 
-  set arabicshape&
-  set arabic&
+  set arabic& arabicshape&
   bwipe!
 endfunc
 
@@ -69,7 +74,7 @@ func Test_arabic_toggle_keymap()
   new
   set arabic
   call feedkeys("i12\<C-^>12\<C-^>12", 'tx')
-  redraw
+  call assert_match("^ *٢١21٢١$", ScreenLines(1, &columns)[0])
   call assert_equal('١٢12١٢', getline('.'))
   set arabic&
   bwipe!
@@ -79,14 +84,50 @@ func Test_delcombine()
   new
   set arabic
   call feedkeys("isghl\<BS>\<BS>", 'tx')
-  redraw
-  call assert_equal(["\nd8 b3 ", "\nd9 84 "], GetCharsUtf8(1))
+  call assert_match("^ *\uFEDE\uFEB3$", ScreenLines(1, &columns)[0])
+  call assert_equal(['U+0633', 'U+0644'], s:get_chars(1))
 
-  " Now the same with nodelcombine
+  " Now the same with 'nodelcombine'
   set nodelcombine
   %d
   call feedkeys("isghl\<BS>\<BS>", 'tx')
-  call assert_equal(["\nd8 b3 "], GetCharsUtf8(1)) 
+  call assert_match("^ *\uFEB1$", ScreenLines(1, &columns)[0])
+  call assert_equal(['U+0633'], s:get_chars(1))
   set arabic&
   bwipe!
 endfunc
+
+let s:a_YEH_HAMZA = "\u0626"
+let s:a_i_YEH_HAMZA = "\ufe8b"
+
+let s:a_HAMZA = "\u0621"
+let s:a_s_HAMZA = "\ufe80"
+
+let s:a_ALEF_MADDA = "\u0622"
+let s:a_s_ALEF_MADDA = "\ufe81"
+
+let s:a_ALEF_HAMZA_ABOVE = "\u0623"
+let s:a_s_ALEF_HAMZA_ABOVE = "\ufe83"
+
+let s:a_GHAIN = "\u063a"
+let s:a_f_GHAIN = "\ufece"
+let s:a_s_GHAIN = "\ufecd"
+
+func Test_shape_initial()
+  new
+  set arabicshape
+
+  " Shaping arabic {testchar} non-arabic   Uses chg_c_a2i().
+  " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result
+  for pair in [[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_i_YEH_HAMZA],
+	\ [s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA],
+	\ [s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_s_ALEF_MADDA],
+	\ [s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_ABOVE],
+	\ ]
+    call setline(1, s:a_GHAIN . pair[0] . ' ')
+    call assert_equal([pair[1] . pair[2] . ' '], ScreenLines(1, 3))
+  endfor
+
+  set arabicshape&
+  bwipe!
+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 */
 /**/
+    389,
+/**/
     388,
 /**/
     387,