2018-01-14 05:52:51 -07:00
|
|
|
|
" Simplistic testing of Arabic mode.
|
2018-05-19 01:37:10 -07:00
|
|
|
|
" NOTE: This just checks if the code works. If you know Arabic please add
|
|
|
|
|
" functional tests that check the shaping works with real text.
|
2018-01-14 05:52:51 -07:00
|
|
|
|
|
2022-07-07 17:26:25 -07:00
|
|
|
|
source check.vim
|
|
|
|
|
CheckFeature arabic
|
2018-01-14 05:52:51 -07:00
|
|
|
|
|
2018-01-15 02:32:54 -07:00
|
|
|
|
source view_util.vim
|
2018-01-14 05:52:51 -07:00
|
|
|
|
|
2018-01-15 02:32:54 -07:00
|
|
|
|
" Return list of Unicode characters at line lnum.
|
2018-01-14 05:52:51 -07:00
|
|
|
|
" Combining characters are treated as a single item.
|
2018-01-15 02:32:54 -07:00
|
|
|
|
func s:get_chars(lnum)
|
2018-01-14 05:52:51 -07:00
|
|
|
|
call cursor(a:lnum, 1)
|
|
|
|
|
let chars = []
|
|
|
|
|
let numchars = strchars(getline('.'), 1)
|
|
|
|
|
for i in range(1, numchars)
|
|
|
|
|
exe 'norm ' i . '|'
|
2018-02-28 04:06:14 -07:00
|
|
|
|
let c = execute('ascii')
|
|
|
|
|
let c = substitute(c, '\n\?<.\{-}Hex\s*', 'U+', 'g')
|
|
|
|
|
let c = substitute(c, ',\s*Oct\(al\)\=\s\d*\(, Digr ..\)\=', '', 'g')
|
2018-01-15 02:32:54 -07:00
|
|
|
|
call add(chars, c)
|
2018-01-14 05:52:51 -07:00
|
|
|
|
endfor
|
|
|
|
|
return chars
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
func Test_arabic_toggle()
|
|
|
|
|
set arabic
|
|
|
|
|
call assert_equal(1, &rightleft)
|
|
|
|
|
call assert_equal(1, &arabicshape)
|
|
|
|
|
call assert_equal('arabic', &keymap)
|
|
|
|
|
call assert_equal(1, &delcombine)
|
|
|
|
|
|
|
|
|
|
set iminsert=1 imsearch=1
|
|
|
|
|
set arabic&
|
|
|
|
|
call assert_equal(0, &rightleft)
|
|
|
|
|
call assert_equal(1, &arabicshape)
|
|
|
|
|
call assert_equal('arabic', &keymap)
|
|
|
|
|
call assert_equal(1, &delcombine)
|
|
|
|
|
call assert_equal(0, &iminsert)
|
|
|
|
|
call assert_equal(-1, &imsearch)
|
|
|
|
|
|
|
|
|
|
set arabicshape& keymap= delcombine&
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
func Test_arabic_input()
|
|
|
|
|
new
|
|
|
|
|
set arabic
|
|
|
|
|
" Typing sghl in Arabic insert mode should show the
|
2018-01-15 02:32:54 -07:00
|
|
|
|
" 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])
|
2018-01-14 05:52:51 -07:00
|
|
|
|
call assert_equal([
|
2018-01-15 02:32:54 -07:00
|
|
|
|
\ 'U+0633',
|
|
|
|
|
\ 'U+0644 U+0627',
|
|
|
|
|
\ 'U+0645',
|
|
|
|
|
\ 'U+21'], s:get_chars(1))
|
2018-01-14 05:52:51 -07:00
|
|
|
|
|
|
|
|
|
" Without shaping, it should give individual Arabic letters.
|
|
|
|
|
set noarabicshape
|
2018-01-15 02:32:54 -07:00
|
|
|
|
call assert_match("^ *!\u0645\u0627\u0644\u0633$", ScreenLines(1, &columns)[0])
|
2018-01-14 05:52:51 -07:00
|
|
|
|
call assert_equal([
|
2018-01-15 02:32:54 -07:00
|
|
|
|
\ 'U+0633',
|
|
|
|
|
\ 'U+0644',
|
|
|
|
|
\ 'U+0627',
|
|
|
|
|
\ 'U+0645',
|
|
|
|
|
\ 'U+21'], s:get_chars(1))
|
2018-01-14 05:52:51 -07:00
|
|
|
|
|
2018-01-15 02:32:54 -07:00
|
|
|
|
set arabic& arabicshape&
|
2018-01-14 05:52:51 -07:00
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
func Test_arabic_toggle_keymap()
|
|
|
|
|
new
|
|
|
|
|
set arabic
|
2023-11-05 11:23:16 -07:00
|
|
|
|
call feedkeys("i12\<C-^>12\<C-^>12abcd", 'tx')
|
|
|
|
|
call assert_match("^ *.*ﺷ212121$", ScreenLines(1, &columns)[0])
|
|
|
|
|
call assert_equal('121212شلاؤي', getline('.'))
|
2018-01-14 05:52:51 -07:00
|
|
|
|
set arabic&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
func Test_delcombine()
|
|
|
|
|
new
|
|
|
|
|
set arabic
|
|
|
|
|
call feedkeys("isghl\<BS>\<BS>", 'tx')
|
2018-01-15 02:32:54 -07:00
|
|
|
|
call assert_match("^ *\uFEDE\uFEB3$", ScreenLines(1, &columns)[0])
|
|
|
|
|
call assert_equal(['U+0633', 'U+0644'], s:get_chars(1))
|
2018-01-14 05:52:51 -07:00
|
|
|
|
|
2018-01-15 02:32:54 -07:00
|
|
|
|
" Now the same with 'nodelcombine'
|
2018-01-14 05:52:51 -07:00
|
|
|
|
set nodelcombine
|
|
|
|
|
%d
|
|
|
|
|
call feedkeys("isghl\<BS>\<BS>", 'tx')
|
2018-01-15 02:32:54 -07:00
|
|
|
|
call assert_match("^ *\uFEB1$", ScreenLines(1, &columns)[0])
|
|
|
|
|
call assert_equal(['U+0633'], s:get_chars(1))
|
2018-01-14 05:52:51 -07:00
|
|
|
|
set arabic&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
2018-01-15 02:32:54 -07:00
|
|
|
|
|
2018-01-15 02:33:34 -07:00
|
|
|
|
" Values from src/arabic.h (not all used yet)
|
|
|
|
|
let s:a_COMMA = "\u060C"
|
|
|
|
|
let s:a_SEMICOLON = "\u061B"
|
|
|
|
|
let s:a_QUESTION = "\u061F"
|
|
|
|
|
let s:a_HAMZA = "\u0621"
|
|
|
|
|
let s:a_ALEF_MADDA = "\u0622"
|
|
|
|
|
let s:a_ALEF_HAMZA_ABOVE = "\u0623"
|
|
|
|
|
let s:a_WAW_HAMZA = "\u0624"
|
|
|
|
|
let s:a_ALEF_HAMZA_BELOW = "\u0625"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
let s:a_YEH_HAMZA = "\u0626"
|
2018-01-15 02:33:34 -07:00
|
|
|
|
let s:a_ALEF = "\u0627"
|
|
|
|
|
let s:a_BEH = "\u0628"
|
|
|
|
|
let s:a_TEH_MARBUTA = "\u0629"
|
|
|
|
|
let s:a_TEH = "\u062a"
|
|
|
|
|
let s:a_THEH = "\u062b"
|
|
|
|
|
let s:a_JEEM = "\u062c"
|
|
|
|
|
let s:a_HAH = "\u062d"
|
|
|
|
|
let s:a_KHAH = "\u062e"
|
|
|
|
|
let s:a_DAL = "\u062f"
|
|
|
|
|
let s:a_THAL = "\u0630"
|
|
|
|
|
let s:a_REH = "\u0631"
|
|
|
|
|
let s:a_ZAIN = "\u0632"
|
|
|
|
|
let s:a_SEEN = "\u0633"
|
|
|
|
|
let s:a_SHEEN = "\u0634"
|
|
|
|
|
let s:a_SAD = "\u0635"
|
|
|
|
|
let s:a_DAD = "\u0636"
|
|
|
|
|
let s:a_TAH = "\u0637"
|
|
|
|
|
let s:a_ZAH = "\u0638"
|
|
|
|
|
let s:a_AIN = "\u0639"
|
|
|
|
|
let s:a_GHAIN = "\u063a"
|
|
|
|
|
let s:a_TATWEEL = "\u0640"
|
|
|
|
|
let s:a_FEH = "\u0641"
|
|
|
|
|
let s:a_QAF = "\u0642"
|
|
|
|
|
let s:a_KAF = "\u0643"
|
|
|
|
|
let s:a_LAM = "\u0644"
|
|
|
|
|
let s:a_MEEM = "\u0645"
|
|
|
|
|
let s:a_NOON = "\u0646"
|
|
|
|
|
let s:a_HEH = "\u0647"
|
|
|
|
|
let s:a_WAW = "\u0648"
|
|
|
|
|
let s:a_ALEF_MAKSURA = "\u0649"
|
|
|
|
|
let s:a_YEH = "\u064a"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
|
2018-01-15 02:33:34 -07:00
|
|
|
|
let s:a_FATHATAN = "\u064b"
|
|
|
|
|
let s:a_DAMMATAN = "\u064c"
|
|
|
|
|
let s:a_KASRATAN = "\u064d"
|
|
|
|
|
let s:a_FATHA = "\u064e"
|
|
|
|
|
let s:a_DAMMA = "\u064f"
|
|
|
|
|
let s:a_KASRA = "\u0650"
|
|
|
|
|
let s:a_SHADDA = "\u0651"
|
|
|
|
|
let s:a_SUKUN = "\u0652"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
|
2018-01-15 02:33:34 -07:00
|
|
|
|
let s:a_MADDA_ABOVE = "\u0653"
|
|
|
|
|
let s:a_HAMZA_ABOVE = "\u0654"
|
|
|
|
|
let s:a_HAMZA_BELOW = "\u0655"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
|
2018-01-15 02:33:34 -07:00
|
|
|
|
let s:a_ZERO = "\u0660"
|
|
|
|
|
let s:a_ONE = "\u0661"
|
|
|
|
|
let s:a_TWO = "\u0662"
|
|
|
|
|
let s:a_THREE = "\u0663"
|
|
|
|
|
let s:a_FOUR = "\u0664"
|
|
|
|
|
let s:a_FIVE = "\u0665"
|
|
|
|
|
let s:a_SIX = "\u0666"
|
|
|
|
|
let s:a_SEVEN = "\u0667"
|
|
|
|
|
let s:a_EIGHT = "\u0668"
|
|
|
|
|
let s:a_NINE = "\u0669"
|
|
|
|
|
let s:a_PERCENT = "\u066a"
|
|
|
|
|
let s:a_DECIMAL = "\u066b"
|
|
|
|
|
let s:a_THOUSANDS = "\u066c"
|
|
|
|
|
let s:a_STAR = "\u066d"
|
|
|
|
|
let s:a_MINI_ALEF = "\u0670"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
|
2018-01-15 02:33:34 -07:00
|
|
|
|
let s:a_s_FATHATAN = "\ufe70"
|
|
|
|
|
let s:a_m_TATWEEL_FATHATAN = "\ufe71"
|
|
|
|
|
let s:a_s_DAMMATAN = "\ufe72"
|
|
|
|
|
|
|
|
|
|
let s:a_s_KASRATAN = "\ufe74"
|
|
|
|
|
|
|
|
|
|
let s:a_s_FATHA = "\ufe76"
|
|
|
|
|
let s:a_m_FATHA = "\ufe77"
|
|
|
|
|
let s:a_s_DAMMA = "\ufe78"
|
|
|
|
|
let s:a_m_DAMMA = "\ufe79"
|
|
|
|
|
let s:a_s_KASRA = "\ufe7a"
|
|
|
|
|
let s:a_m_KASRA = "\ufe7b"
|
|
|
|
|
let s:a_s_SHADDA = "\ufe7c"
|
|
|
|
|
let s:a_m_SHADDA = "\ufe7d"
|
|
|
|
|
let s:a_s_SUKUN = "\ufe7e"
|
|
|
|
|
let s:a_m_SUKUN = "\ufe7f"
|
|
|
|
|
|
|
|
|
|
let s:a_s_HAMZA = "\ufe80"
|
|
|
|
|
let s:a_s_ALEF_MADDA = "\ufe81"
|
|
|
|
|
let s:a_f_ALEF_MADDA = "\ufe82"
|
|
|
|
|
let s:a_s_ALEF_HAMZA_ABOVE = "\ufe83"
|
|
|
|
|
let s:a_f_ALEF_HAMZA_ABOVE = "\ufe84"
|
|
|
|
|
let s:a_s_WAW_HAMZA = "\ufe85"
|
|
|
|
|
let s:a_f_WAW_HAMZA = "\ufe86"
|
|
|
|
|
let s:a_s_ALEF_HAMZA_BELOW = "\ufe87"
|
|
|
|
|
let s:a_f_ALEF_HAMZA_BELOW = "\ufe88"
|
|
|
|
|
let s:a_s_YEH_HAMZA = "\ufe89"
|
|
|
|
|
let s:a_f_YEH_HAMZA = "\ufe8a"
|
|
|
|
|
let s:a_i_YEH_HAMZA = "\ufe8b"
|
|
|
|
|
let s:a_m_YEH_HAMZA = "\ufe8c"
|
|
|
|
|
let s:a_s_ALEF = "\ufe8d"
|
|
|
|
|
let s:a_f_ALEF = "\ufe8e"
|
|
|
|
|
let s:a_s_BEH = "\ufe8f"
|
|
|
|
|
let s:a_f_BEH = "\ufe90"
|
|
|
|
|
let s:a_i_BEH = "\ufe91"
|
|
|
|
|
let s:a_m_BEH = "\ufe92"
|
|
|
|
|
let s:a_s_TEH_MARBUTA = "\ufe93"
|
|
|
|
|
let s:a_f_TEH_MARBUTA = "\ufe94"
|
|
|
|
|
let s:a_s_TEH = "\ufe95"
|
|
|
|
|
let s:a_f_TEH = "\ufe96"
|
|
|
|
|
let s:a_i_TEH = "\ufe97"
|
|
|
|
|
let s:a_m_TEH = "\ufe98"
|
|
|
|
|
let s:a_s_THEH = "\ufe99"
|
|
|
|
|
let s:a_f_THEH = "\ufe9a"
|
|
|
|
|
let s:a_i_THEH = "\ufe9b"
|
|
|
|
|
let s:a_m_THEH = "\ufe9c"
|
|
|
|
|
let s:a_s_JEEM = "\ufe9d"
|
|
|
|
|
let s:a_f_JEEM = "\ufe9e"
|
|
|
|
|
let s:a_i_JEEM = "\ufe9f"
|
|
|
|
|
let s:a_m_JEEM = "\ufea0"
|
|
|
|
|
let s:a_s_HAH = "\ufea1"
|
|
|
|
|
let s:a_f_HAH = "\ufea2"
|
|
|
|
|
let s:a_i_HAH = "\ufea3"
|
|
|
|
|
let s:a_m_HAH = "\ufea4"
|
|
|
|
|
let s:a_s_KHAH = "\ufea5"
|
|
|
|
|
let s:a_f_KHAH = "\ufea6"
|
|
|
|
|
let s:a_i_KHAH = "\ufea7"
|
|
|
|
|
let s:a_m_KHAH = "\ufea8"
|
|
|
|
|
let s:a_s_DAL = "\ufea9"
|
|
|
|
|
let s:a_f_DAL = "\ufeaa"
|
|
|
|
|
let s:a_s_THAL = "\ufeab"
|
|
|
|
|
let s:a_f_THAL = "\ufeac"
|
|
|
|
|
let s:a_s_REH = "\ufead"
|
|
|
|
|
let s:a_f_REH = "\ufeae"
|
|
|
|
|
let s:a_s_ZAIN = "\ufeaf"
|
|
|
|
|
let s:a_f_ZAIN = "\ufeb0"
|
|
|
|
|
let s:a_s_SEEN = "\ufeb1"
|
|
|
|
|
let s:a_f_SEEN = "\ufeb2"
|
|
|
|
|
let s:a_i_SEEN = "\ufeb3"
|
|
|
|
|
let s:a_m_SEEN = "\ufeb4"
|
|
|
|
|
let s:a_s_SHEEN = "\ufeb5"
|
|
|
|
|
let s:a_f_SHEEN = "\ufeb6"
|
|
|
|
|
let s:a_i_SHEEN = "\ufeb7"
|
|
|
|
|
let s:a_m_SHEEN = "\ufeb8"
|
|
|
|
|
let s:a_s_SAD = "\ufeb9"
|
|
|
|
|
let s:a_f_SAD = "\ufeba"
|
|
|
|
|
let s:a_i_SAD = "\ufebb"
|
|
|
|
|
let s:a_m_SAD = "\ufebc"
|
|
|
|
|
let s:a_s_DAD = "\ufebd"
|
|
|
|
|
let s:a_f_DAD = "\ufebe"
|
|
|
|
|
let s:a_i_DAD = "\ufebf"
|
|
|
|
|
let s:a_m_DAD = "\ufec0"
|
|
|
|
|
let s:a_s_TAH = "\ufec1"
|
|
|
|
|
let s:a_f_TAH = "\ufec2"
|
|
|
|
|
let s:a_i_TAH = "\ufec3"
|
|
|
|
|
let s:a_m_TAH = "\ufec4"
|
|
|
|
|
let s:a_s_ZAH = "\ufec5"
|
|
|
|
|
let s:a_f_ZAH = "\ufec6"
|
|
|
|
|
let s:a_i_ZAH = "\ufec7"
|
|
|
|
|
let s:a_m_ZAH = "\ufec8"
|
|
|
|
|
let s:a_s_AIN = "\ufec9"
|
|
|
|
|
let s:a_f_AIN = "\ufeca"
|
|
|
|
|
let s:a_i_AIN = "\ufecb"
|
|
|
|
|
let s:a_m_AIN = "\ufecc"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
let s:a_s_GHAIN = "\ufecd"
|
2018-01-15 02:33:34 -07:00
|
|
|
|
let s:a_f_GHAIN = "\ufece"
|
|
|
|
|
let s:a_i_GHAIN = "\ufecf"
|
|
|
|
|
let s:a_m_GHAIN = "\ufed0"
|
|
|
|
|
let s:a_s_FEH = "\ufed1"
|
|
|
|
|
let s:a_f_FEH = "\ufed2"
|
|
|
|
|
let s:a_i_FEH = "\ufed3"
|
|
|
|
|
let s:a_m_FEH = "\ufed4"
|
|
|
|
|
let s:a_s_QAF = "\ufed5"
|
|
|
|
|
let s:a_f_QAF = "\ufed6"
|
|
|
|
|
let s:a_i_QAF = "\ufed7"
|
|
|
|
|
let s:a_m_QAF = "\ufed8"
|
|
|
|
|
let s:a_s_KAF = "\ufed9"
|
|
|
|
|
let s:a_f_KAF = "\ufeda"
|
|
|
|
|
let s:a_i_KAF = "\ufedb"
|
|
|
|
|
let s:a_m_KAF = "\ufedc"
|
|
|
|
|
let s:a_s_LAM = "\ufedd"
|
|
|
|
|
let s:a_f_LAM = "\ufede"
|
|
|
|
|
let s:a_i_LAM = "\ufedf"
|
|
|
|
|
let s:a_m_LAM = "\ufee0"
|
|
|
|
|
let s:a_s_MEEM = "\ufee1"
|
|
|
|
|
let s:a_f_MEEM = "\ufee2"
|
|
|
|
|
let s:a_i_MEEM = "\ufee3"
|
|
|
|
|
let s:a_m_MEEM = "\ufee4"
|
|
|
|
|
let s:a_s_NOON = "\ufee5"
|
|
|
|
|
let s:a_f_NOON = "\ufee6"
|
|
|
|
|
let s:a_i_NOON = "\ufee7"
|
|
|
|
|
let s:a_m_NOON = "\ufee8"
|
|
|
|
|
let s:a_s_HEH = "\ufee9"
|
|
|
|
|
let s:a_f_HEH = "\ufeea"
|
|
|
|
|
let s:a_i_HEH = "\ufeeb"
|
|
|
|
|
let s:a_m_HEH = "\ufeec"
|
|
|
|
|
let s:a_s_WAW = "\ufeed"
|
|
|
|
|
let s:a_f_WAW = "\ufeee"
|
|
|
|
|
let s:a_s_ALEF_MAKSURA = "\ufeef"
|
|
|
|
|
let s:a_f_ALEF_MAKSURA = "\ufef0"
|
|
|
|
|
let s:a_s_YEH = "\ufef1"
|
|
|
|
|
let s:a_f_YEH = "\ufef2"
|
|
|
|
|
let s:a_i_YEH = "\ufef3"
|
|
|
|
|
let s:a_m_YEH = "\ufef4"
|
|
|
|
|
let s:a_s_LAM_ALEF_MADDA_ABOVE = "\ufef5"
|
|
|
|
|
let s:a_f_LAM_ALEF_MADDA_ABOVE = "\ufef6"
|
|
|
|
|
let s:a_s_LAM_ALEF_HAMZA_ABOVE = "\ufef7"
|
|
|
|
|
let s:a_f_LAM_ALEF_HAMZA_ABOVE = "\ufef8"
|
|
|
|
|
let s:a_s_LAM_ALEF_HAMZA_BELOW = "\ufef9"
|
|
|
|
|
let s:a_f_LAM_ALEF_HAMZA_BELOW = "\ufefa"
|
|
|
|
|
let s:a_s_LAM_ALEF = "\ufefb"
|
|
|
|
|
let s:a_f_LAM_ALEF = "\ufefc"
|
|
|
|
|
|
|
|
|
|
let s:a_BYTE_ORDER_MARK = "\ufeff"
|
2018-01-15 02:32:54 -07:00
|
|
|
|
|
|
|
|
|
func Test_shape_initial()
|
|
|
|
|
new
|
|
|
|
|
set arabicshape
|
|
|
|
|
|
2018-01-15 02:33:34 -07:00
|
|
|
|
" Shaping arabic {testchar} non-arabic Tests chg_c_a2i().
|
2018-01-15 02:32:54 -07:00
|
|
|
|
" 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],
|
2018-01-15 02:33:34 -07:00
|
|
|
|
\ [s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_s_WAW_HAMZA],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_BELOW],
|
|
|
|
|
\ [s:a_ALEF, s:a_s_GHAIN, s:a_s_ALEF],
|
|
|
|
|
\ [s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_s_TEH_MARBUTA],
|
|
|
|
|
\ [s:a_DAL, s:a_s_GHAIN, s:a_s_DAL],
|
|
|
|
|
\ [s:a_THAL, s:a_s_GHAIN, s:a_s_THAL],
|
|
|
|
|
\ [s:a_REH, s:a_s_GHAIN, s:a_s_REH],
|
|
|
|
|
\ [s:a_ZAIN, s:a_s_GHAIN, s:a_s_ZAIN],
|
|
|
|
|
\ [s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL],
|
|
|
|
|
\ [s:a_WAW, s:a_s_GHAIN, s:a_s_WAW],
|
|
|
|
|
\ [s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_s_ALEF_MAKSURA],
|
|
|
|
|
\ [s:a_BEH, s:a_f_GHAIN, s:a_i_BEH],
|
|
|
|
|
\ [s:a_TEH, s:a_f_GHAIN, s:a_i_TEH],
|
|
|
|
|
\ [s:a_THEH, s:a_f_GHAIN, s:a_i_THEH],
|
|
|
|
|
\ [s:a_JEEM, s:a_f_GHAIN, s:a_i_JEEM],
|
|
|
|
|
\ [s:a_HAH, s:a_f_GHAIN, s:a_i_HAH],
|
|
|
|
|
\ [s:a_KHAH, s:a_f_GHAIN, s:a_i_KHAH],
|
|
|
|
|
\ [s:a_SEEN, s:a_f_GHAIN, s:a_i_SEEN],
|
|
|
|
|
\ [s:a_SHEEN, s:a_f_GHAIN, s:a_i_SHEEN],
|
|
|
|
|
\ [s:a_SAD, s:a_f_GHAIN, s:a_i_SAD],
|
|
|
|
|
\ [s:a_DAD, s:a_f_GHAIN, s:a_i_DAD],
|
|
|
|
|
\ [s:a_TAH, s:a_f_GHAIN, s:a_i_TAH],
|
|
|
|
|
\ [s:a_ZAH, s:a_f_GHAIN, s:a_i_ZAH],
|
|
|
|
|
\ [s:a_AIN, s:a_f_GHAIN, s:a_i_AIN],
|
|
|
|
|
\ [s:a_GHAIN, s:a_f_GHAIN, s:a_i_GHAIN],
|
|
|
|
|
\ [s:a_FEH, s:a_f_GHAIN, s:a_i_FEH],
|
|
|
|
|
\ [s:a_QAF, s:a_f_GHAIN, s:a_i_QAF],
|
|
|
|
|
\ [s:a_KAF, s:a_f_GHAIN, s:a_i_KAF],
|
|
|
|
|
\ [s:a_LAM, s:a_f_GHAIN, s:a_i_LAM],
|
|
|
|
|
\ [s:a_MEEM, s:a_f_GHAIN, s:a_i_MEEM],
|
|
|
|
|
\ [s:a_NOON, s:a_f_GHAIN, s:a_i_NOON],
|
|
|
|
|
\ [s:a_HEH, s:a_f_GHAIN, s:a_i_HEH],
|
|
|
|
|
\ [s:a_YEH, s:a_f_GHAIN, s:a_i_YEH],
|
2018-01-15 02:32:54 -07:00
|
|
|
|
\ ]
|
|
|
|
|
call setline(1, s:a_GHAIN . pair[0] . ' ')
|
|
|
|
|
call assert_equal([pair[1] . pair[2] . ' '], ScreenLines(1, 3))
|
|
|
|
|
endfor
|
|
|
|
|
|
|
|
|
|
set arabicshape&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
2018-01-15 02:33:34 -07:00
|
|
|
|
|
|
|
|
|
func Test_shape_isolated()
|
|
|
|
|
new
|
|
|
|
|
set arabicshape
|
|
|
|
|
|
|
|
|
|
" Shaping non-arabic {testchar} non-arabic Tests chg_c_a2s().
|
|
|
|
|
" pair[0] = testchar, pair[1] = current-result
|
|
|
|
|
for pair in [[s:a_HAMZA, s:a_s_HAMZA],
|
|
|
|
|
\ [s:a_ALEF_MADDA, s:a_s_ALEF_MADDA],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_ABOVE, s:a_s_ALEF_HAMZA_ABOVE],
|
|
|
|
|
\ [s:a_WAW_HAMZA, s:a_s_WAW_HAMZA],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_BELOW, s:a_s_ALEF_HAMZA_BELOW],
|
|
|
|
|
\ [s:a_YEH_HAMZA, s:a_s_YEH_HAMZA],
|
|
|
|
|
\ [s:a_ALEF, s:a_s_ALEF],
|
|
|
|
|
\ [s:a_TEH_MARBUTA, s:a_s_TEH_MARBUTA],
|
|
|
|
|
\ [s:a_DAL, s:a_s_DAL],
|
|
|
|
|
\ [s:a_THAL, s:a_s_THAL],
|
|
|
|
|
\ [s:a_REH, s:a_s_REH],
|
|
|
|
|
\ [s:a_ZAIN, s:a_s_ZAIN],
|
|
|
|
|
\ [s:a_TATWEEL, s:a_TATWEEL],
|
|
|
|
|
\ [s:a_WAW, s:a_s_WAW],
|
|
|
|
|
\ [s:a_ALEF_MAKSURA, s:a_s_ALEF_MAKSURA],
|
|
|
|
|
\ [s:a_BEH, s:a_s_BEH],
|
|
|
|
|
\ [s:a_TEH, s:a_s_TEH],
|
|
|
|
|
\ [s:a_THEH, s:a_s_THEH],
|
|
|
|
|
\ [s:a_JEEM, s:a_s_JEEM],
|
|
|
|
|
\ [s:a_HAH, s:a_s_HAH],
|
|
|
|
|
\ [s:a_KHAH, s:a_s_KHAH],
|
|
|
|
|
\ [s:a_SEEN, s:a_s_SEEN],
|
|
|
|
|
\ [s:a_SHEEN, s:a_s_SHEEN],
|
|
|
|
|
\ [s:a_SAD, s:a_s_SAD],
|
|
|
|
|
\ [s:a_DAD, s:a_s_DAD],
|
|
|
|
|
\ [s:a_TAH, s:a_s_TAH],
|
|
|
|
|
\ [s:a_ZAH, s:a_s_ZAH],
|
|
|
|
|
\ [s:a_AIN, s:a_s_AIN],
|
|
|
|
|
\ [s:a_GHAIN, s:a_s_GHAIN],
|
|
|
|
|
\ [s:a_FEH, s:a_s_FEH],
|
|
|
|
|
\ [s:a_QAF, s:a_s_QAF],
|
|
|
|
|
\ [s:a_KAF, s:a_s_KAF],
|
|
|
|
|
\ [s:a_LAM, s:a_s_LAM],
|
|
|
|
|
\ [s:a_MEEM, s:a_s_MEEM],
|
|
|
|
|
\ [s:a_NOON, s:a_s_NOON],
|
|
|
|
|
\ [s:a_HEH, s:a_s_HEH],
|
|
|
|
|
\ [s:a_YEH, s:a_s_YEH],
|
|
|
|
|
\ ]
|
|
|
|
|
call setline(1, ' ' . pair[0] . ' ')
|
|
|
|
|
call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3))
|
|
|
|
|
endfor
|
|
|
|
|
|
|
|
|
|
set arabicshape&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
2018-05-19 01:37:10 -07:00
|
|
|
|
func Test_shape_iso_to_medial()
|
2018-01-15 02:33:34 -07:00
|
|
|
|
new
|
|
|
|
|
set arabicshape
|
|
|
|
|
|
|
|
|
|
" Shaping arabic {testchar} arabic Tests chg_c_a2m().
|
|
|
|
|
" pair[0] = testchar, pair[1] = next-result, pair[2] = current-result,
|
|
|
|
|
" pair[3] = previous-result
|
|
|
|
|
for pair in [[s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA, s:a_s_BEH],
|
|
|
|
|
\[s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_f_ALEF_MADDA, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH],
|
|
|
|
|
\[s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_f_WAW_HAMZA, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH],
|
|
|
|
|
\[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_m_YEH_HAMZA, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF, s:a_s_GHAIN, s:a_f_ALEF, s:a_i_BEH],
|
|
|
|
|
\[s:a_BEH, s:a_f_GHAIN, s:a_m_BEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_f_TEH_MARBUTA, s:a_i_BEH],
|
|
|
|
|
\[s:a_TEH, s:a_f_GHAIN, s:a_m_TEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_THEH, s:a_f_GHAIN, s:a_m_THEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_JEEM, s:a_f_GHAIN, s:a_m_JEEM, s:a_i_BEH],
|
|
|
|
|
\[s:a_HAH, s:a_f_GHAIN, s:a_m_HAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_KHAH, s:a_f_GHAIN, s:a_m_KHAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_DAL, s:a_s_GHAIN, s:a_f_DAL, s:a_i_BEH],
|
|
|
|
|
\[s:a_THAL, s:a_s_GHAIN, s:a_f_THAL, s:a_i_BEH],
|
|
|
|
|
\[s:a_REH, s:a_s_GHAIN, s:a_f_REH, s:a_i_BEH],
|
|
|
|
|
\[s:a_ZAIN, s:a_s_GHAIN, s:a_f_ZAIN, s:a_i_BEH],
|
|
|
|
|
\[s:a_SEEN, s:a_f_GHAIN, s:a_m_SEEN, s:a_i_BEH],
|
|
|
|
|
\[s:a_SHEEN, s:a_f_GHAIN, s:a_m_SHEEN, s:a_i_BEH],
|
|
|
|
|
\[s:a_SAD, s:a_f_GHAIN, s:a_m_SAD, s:a_i_BEH],
|
|
|
|
|
\[s:a_DAD, s:a_f_GHAIN, s:a_m_DAD, s:a_i_BEH],
|
|
|
|
|
\[s:a_TAH, s:a_f_GHAIN, s:a_m_TAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_ZAH, s:a_f_GHAIN, s:a_m_ZAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_AIN, s:a_f_GHAIN, s:a_m_AIN, s:a_i_BEH],
|
|
|
|
|
\[s:a_GHAIN, s:a_f_GHAIN, s:a_m_GHAIN, s:a_i_BEH],
|
|
|
|
|
\[s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL, s:a_i_BEH],
|
|
|
|
|
\[s:a_FEH, s:a_f_GHAIN, s:a_m_FEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_QAF, s:a_f_GHAIN, s:a_m_QAF, s:a_i_BEH],
|
|
|
|
|
\[s:a_KAF, s:a_f_GHAIN, s:a_m_KAF, s:a_i_BEH],
|
|
|
|
|
\[s:a_LAM, s:a_f_GHAIN, s:a_m_LAM, s:a_i_BEH],
|
|
|
|
|
\[s:a_MEEM, s:a_f_GHAIN, s:a_m_MEEM, s:a_i_BEH],
|
|
|
|
|
\[s:a_NOON, s:a_f_GHAIN, s:a_m_NOON, s:a_i_BEH],
|
|
|
|
|
\[s:a_HEH, s:a_f_GHAIN, s:a_m_HEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_WAW, s:a_s_GHAIN, s:a_f_WAW, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_f_ALEF_MAKSURA, s:a_i_BEH],
|
|
|
|
|
\[s:a_YEH, s:a_f_GHAIN, s:a_m_YEH, s:a_i_BEH],
|
|
|
|
|
\ ]
|
|
|
|
|
call setline(1, s:a_GHAIN . pair[0] . s:a_BEH)
|
|
|
|
|
call assert_equal([pair[1] . pair[2] . pair[3]], ScreenLines(1, 3))
|
|
|
|
|
endfor
|
|
|
|
|
|
|
|
|
|
set arabicshape&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
2018-05-19 01:37:10 -07:00
|
|
|
|
func Test_shape_final()
|
|
|
|
|
new
|
|
|
|
|
set arabicshape
|
|
|
|
|
|
|
|
|
|
" Shaping arabic {testchar} arabic Tests chg_c_a2f().
|
|
|
|
|
" pair[0] = testchar, pair[1] = current-result, pair[2] = previous-result
|
|
|
|
|
for pair in [[s:a_HAMZA, s:a_s_HAMZA, s:a_s_BEH],
|
|
|
|
|
\[s:a_ALEF_MADDA, s:a_f_ALEF_MADDA, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF_HAMZA_ABOVE, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH],
|
|
|
|
|
\[s:a_WAW_HAMZA, s:a_f_WAW_HAMZA, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF_HAMZA_BELOW, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH],
|
|
|
|
|
\[s:a_YEH_HAMZA, s:a_f_YEH_HAMZA, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF, s:a_f_ALEF, s:a_i_BEH],
|
|
|
|
|
\[s:a_BEH, s:a_f_BEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_TEH_MARBUTA, s:a_f_TEH_MARBUTA, s:a_i_BEH],
|
|
|
|
|
\[s:a_TEH, s:a_f_TEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_THEH, s:a_f_THEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_JEEM, s:a_f_JEEM, s:a_i_BEH],
|
|
|
|
|
\[s:a_HAH, s:a_f_HAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_KHAH, s:a_f_KHAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_DAL, s:a_f_DAL, s:a_i_BEH],
|
|
|
|
|
\[s:a_THAL, s:a_f_THAL, s:a_i_BEH],
|
|
|
|
|
\[s:a_REH, s:a_f_REH, s:a_i_BEH],
|
|
|
|
|
\[s:a_ZAIN, s:a_f_ZAIN, s:a_i_BEH],
|
|
|
|
|
\[s:a_SEEN, s:a_f_SEEN, s:a_i_BEH],
|
|
|
|
|
\[s:a_SHEEN, s:a_f_SHEEN, s:a_i_BEH],
|
|
|
|
|
\[s:a_SAD, s:a_f_SAD, s:a_i_BEH],
|
|
|
|
|
\[s:a_DAD, s:a_f_DAD, s:a_i_BEH],
|
|
|
|
|
\[s:a_TAH, s:a_f_TAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_ZAH, s:a_f_ZAH, s:a_i_BEH],
|
|
|
|
|
\[s:a_AIN, s:a_f_AIN, s:a_i_BEH],
|
|
|
|
|
\[s:a_GHAIN, s:a_f_GHAIN, s:a_i_BEH],
|
|
|
|
|
\[s:a_TATWEEL, s:a_TATWEEL, s:a_i_BEH],
|
|
|
|
|
\[s:a_FEH, s:a_f_FEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_QAF, s:a_f_QAF, s:a_i_BEH],
|
|
|
|
|
\[s:a_KAF, s:a_f_KAF, s:a_i_BEH],
|
|
|
|
|
\[s:a_LAM, s:a_f_LAM, s:a_i_BEH],
|
|
|
|
|
\[s:a_MEEM, s:a_f_MEEM, s:a_i_BEH],
|
|
|
|
|
\[s:a_NOON, s:a_f_NOON, s:a_i_BEH],
|
|
|
|
|
\[s:a_HEH, s:a_f_HEH, s:a_i_BEH],
|
|
|
|
|
\[s:a_WAW, s:a_f_WAW, s:a_i_BEH],
|
|
|
|
|
\[s:a_ALEF_MAKSURA, s:a_f_ALEF_MAKSURA, s:a_i_BEH],
|
|
|
|
|
\[s:a_YEH, s:a_f_YEH, s:a_i_BEH],
|
|
|
|
|
\ ]
|
|
|
|
|
call setline(1, ' ' . pair[0] . s:a_BEH)
|
|
|
|
|
call assert_equal([' ' . pair[1] . pair[2]], ScreenLines(1, 3))
|
|
|
|
|
endfor
|
|
|
|
|
|
|
|
|
|
set arabicshape&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
func Test_shape_combination_final()
|
|
|
|
|
new
|
|
|
|
|
set arabicshape
|
|
|
|
|
|
|
|
|
|
" Shaping arabic {testchar} arabic Tests chg_c_laa2f().
|
|
|
|
|
" pair[0] = testchar, pair[1] = current-result
|
|
|
|
|
for pair in [[s:a_ALEF_MADDA, s:a_f_LAM_ALEF_MADDA_ABOVE],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_ABOVE, s:a_f_LAM_ALEF_HAMZA_ABOVE],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_BELOW, s:a_f_LAM_ALEF_HAMZA_BELOW],
|
|
|
|
|
\ [s:a_ALEF, s:a_f_LAM_ALEF],
|
|
|
|
|
\ ]
|
|
|
|
|
" The test char is a composing char, put on s:a_LAM.
|
|
|
|
|
call setline(1, ' ' . s:a_LAM . pair[0] . s:a_BEH)
|
|
|
|
|
call assert_equal([' ' . pair[1] . s:a_i_BEH], ScreenLines(1, 3))
|
|
|
|
|
endfor
|
|
|
|
|
|
|
|
|
|
set arabicshape&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
func Test_shape_combination_isolated()
|
|
|
|
|
new
|
|
|
|
|
set arabicshape
|
|
|
|
|
|
|
|
|
|
" Shaping arabic {testchar} arabic Tests chg_c_laa2i().
|
|
|
|
|
" pair[0] = testchar, pair[1] = current-result
|
|
|
|
|
for pair in [[s:a_ALEF_MADDA, s:a_s_LAM_ALEF_MADDA_ABOVE],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_ABOVE, s:a_s_LAM_ALEF_HAMZA_ABOVE],
|
|
|
|
|
\ [s:a_ALEF_HAMZA_BELOW, s:a_s_LAM_ALEF_HAMZA_BELOW],
|
|
|
|
|
\ [s:a_ALEF, s:a_s_LAM_ALEF],
|
|
|
|
|
\ ]
|
|
|
|
|
" The test char is a composing char, put on s:a_LAM.
|
|
|
|
|
call setline(1, ' ' . s:a_LAM . pair[0] . ' ')
|
|
|
|
|
call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3))
|
|
|
|
|
endfor
|
|
|
|
|
|
|
|
|
|
set arabicshape&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
2022-07-09 01:28:14 -07:00
|
|
|
|
|
|
|
|
|
" Test for entering arabic character in a search command
|
|
|
|
|
func Test_arabic_chars_in_search_cmd()
|
|
|
|
|
new
|
|
|
|
|
set arabic
|
|
|
|
|
call feedkeys("i\nsghl!\<C-^>vim\<C-^>", 'tx')
|
|
|
|
|
call cursor(1, 1)
|
|
|
|
|
call feedkeys("/^sghl!\<C-^>vim$\<C-^>\<CR>", 'tx')
|
|
|
|
|
call assert_equal([2, 1], [line('.'), col('.')])
|
|
|
|
|
|
|
|
|
|
" Try searching in left-to-right mode
|
|
|
|
|
set rightleftcmd=
|
|
|
|
|
call cursor(1, 1)
|
|
|
|
|
call feedkeys("/^sghl!\<C-^>vim$\<CR>", 'tx')
|
|
|
|
|
call assert_equal([2, 1], [line('.'), col('.')])
|
|
|
|
|
|
|
|
|
|
set rightleftcmd&
|
|
|
|
|
set rightleft&
|
|
|
|
|
set arabic&
|
|
|
|
|
bwipe!
|
|
|
|
|
endfunc
|
|
|
|
|
|
|
|
|
|
" vim: shiftwidth=2 sts=2 expandtab
|