1" Simplistic testing of Arabic mode. 2" NOTE: This just checks if the code works. If you know Arabic please add 3" functional tests that check the shaping works with real text. 4 5if !has('arabic') 6 throw 'Skipped: arabic feature missing' 7endif 8 9source view_util.vim 10 11" Return list of Unicode characters at line lnum. 12" Combining characters are treated as a single item. 13func s:get_chars(lnum) 14 call cursor(a:lnum, 1) 15 let chars = [] 16 let numchars = strchars(getline('.'), 1) 17 for i in range(1, numchars) 18 exe 'norm ' i . '|' 19 let c = execute('ascii') 20 let c = substitute(c, '\n\?<.\{-}Hex\s*', 'U+', 'g') 21 let c = substitute(c, ',\s*Oct\(al\)\=\s\d*\(, Digr ..\)\=', '', 'g') 22 call add(chars, c) 23 endfor 24 return chars 25endfunc 26 27func Test_arabic_toggle() 28 set arabic 29 call assert_equal(1, &rightleft) 30 call assert_equal(1, &arabicshape) 31 call assert_equal('arabic', &keymap) 32 call assert_equal(1, &delcombine) 33 34 set iminsert=1 imsearch=1 35 set arabic& 36 call assert_equal(0, &rightleft) 37 call assert_equal(1, &arabicshape) 38 call assert_equal('arabic', &keymap) 39 call assert_equal(1, &delcombine) 40 call assert_equal(0, &iminsert) 41 call assert_equal(-1, &imsearch) 42 43 set arabicshape& keymap= delcombine& 44endfunc 45 46func Test_arabic_input() 47 new 48 set arabic 49 " Typing sghl in Arabic insert mode should show the 50 " Arabic word 'Salaam' i.e. 'peace', spelled: 51 " SEEN, LAM, ALEF, MEEM. 52 " See: https://www.mediawiki.org/wiki/VisualEditor/Typing/Right-to-left 53 call feedkeys('isghl!', 'tx') 54 call assert_match("^ *!\uFEE1\uFEFC\uFEB3$", ScreenLines(1, &columns)[0]) 55 call assert_equal([ 56 \ 'U+0633', 57 \ 'U+0644 U+0627', 58 \ 'U+0645', 59 \ 'U+21'], s:get_chars(1)) 60 61 " Without shaping, it should give individual Arabic letters. 62 set noarabicshape 63 call assert_match("^ *!\u0645\u0627\u0644\u0633$", ScreenLines(1, &columns)[0]) 64 call assert_equal([ 65 \ 'U+0633', 66 \ 'U+0644', 67 \ 'U+0627', 68 \ 'U+0645', 69 \ 'U+21'], s:get_chars(1)) 70 71 set arabic& arabicshape& 72 bwipe! 73endfunc 74 75func Test_arabic_toggle_keymap() 76 new 77 set arabic 78 call feedkeys("i12\<C-^>12\<C-^>12", 'tx') 79 call assert_match("^ *٢١21٢١$", ScreenLines(1, &columns)[0]) 80 call assert_equal('١٢12١٢', getline('.')) 81 set arabic& 82 bwipe! 83endfunc 84 85func Test_delcombine() 86 new 87 set arabic 88 call feedkeys("isghl\<BS>\<BS>", 'tx') 89 call assert_match("^ *\uFEDE\uFEB3$", ScreenLines(1, &columns)[0]) 90 call assert_equal(['U+0633', 'U+0644'], s:get_chars(1)) 91 92 " Now the same with 'nodelcombine' 93 set nodelcombine 94 %d 95 call feedkeys("isghl\<BS>\<BS>", 'tx') 96 call assert_match("^ *\uFEB1$", ScreenLines(1, &columns)[0]) 97 call assert_equal(['U+0633'], s:get_chars(1)) 98 set arabic& 99 bwipe! 100endfunc 101 102" Values from src/arabic.h (not all used yet) 103let s:a_COMMA = "\u060C" 104let s:a_SEMICOLON = "\u061B" 105let s:a_QUESTION = "\u061F" 106let s:a_HAMZA = "\u0621" 107let s:a_ALEF_MADDA = "\u0622" 108let s:a_ALEF_HAMZA_ABOVE = "\u0623" 109let s:a_WAW_HAMZA = "\u0624" 110let s:a_ALEF_HAMZA_BELOW = "\u0625" 111let s:a_YEH_HAMZA = "\u0626" 112let s:a_ALEF = "\u0627" 113let s:a_BEH = "\u0628" 114let s:a_TEH_MARBUTA = "\u0629" 115let s:a_TEH = "\u062a" 116let s:a_THEH = "\u062b" 117let s:a_JEEM = "\u062c" 118let s:a_HAH = "\u062d" 119let s:a_KHAH = "\u062e" 120let s:a_DAL = "\u062f" 121let s:a_THAL = "\u0630" 122let s:a_REH = "\u0631" 123let s:a_ZAIN = "\u0632" 124let s:a_SEEN = "\u0633" 125let s:a_SHEEN = "\u0634" 126let s:a_SAD = "\u0635" 127let s:a_DAD = "\u0636" 128let s:a_TAH = "\u0637" 129let s:a_ZAH = "\u0638" 130let s:a_AIN = "\u0639" 131let s:a_GHAIN = "\u063a" 132let s:a_TATWEEL = "\u0640" 133let s:a_FEH = "\u0641" 134let s:a_QAF = "\u0642" 135let s:a_KAF = "\u0643" 136let s:a_LAM = "\u0644" 137let s:a_MEEM = "\u0645" 138let s:a_NOON = "\u0646" 139let s:a_HEH = "\u0647" 140let s:a_WAW = "\u0648" 141let s:a_ALEF_MAKSURA = "\u0649" 142let s:a_YEH = "\u064a" 143 144let s:a_FATHATAN = "\u064b" 145let s:a_DAMMATAN = "\u064c" 146let s:a_KASRATAN = "\u064d" 147let s:a_FATHA = "\u064e" 148let s:a_DAMMA = "\u064f" 149let s:a_KASRA = "\u0650" 150let s:a_SHADDA = "\u0651" 151let s:a_SUKUN = "\u0652" 152 153let s:a_MADDA_ABOVE = "\u0653" 154let s:a_HAMZA_ABOVE = "\u0654" 155let s:a_HAMZA_BELOW = "\u0655" 156 157let s:a_ZERO = "\u0660" 158let s:a_ONE = "\u0661" 159let s:a_TWO = "\u0662" 160let s:a_THREE = "\u0663" 161let s:a_FOUR = "\u0664" 162let s:a_FIVE = "\u0665" 163let s:a_SIX = "\u0666" 164let s:a_SEVEN = "\u0667" 165let s:a_EIGHT = "\u0668" 166let s:a_NINE = "\u0669" 167let s:a_PERCENT = "\u066a" 168let s:a_DECIMAL = "\u066b" 169let s:a_THOUSANDS = "\u066c" 170let s:a_STAR = "\u066d" 171let s:a_MINI_ALEF = "\u0670" 172 173let s:a_s_FATHATAN = "\ufe70" 174let s:a_m_TATWEEL_FATHATAN = "\ufe71" 175let s:a_s_DAMMATAN = "\ufe72" 176 177let s:a_s_KASRATAN = "\ufe74" 178 179let s:a_s_FATHA = "\ufe76" 180let s:a_m_FATHA = "\ufe77" 181let s:a_s_DAMMA = "\ufe78" 182let s:a_m_DAMMA = "\ufe79" 183let s:a_s_KASRA = "\ufe7a" 184let s:a_m_KASRA = "\ufe7b" 185let s:a_s_SHADDA = "\ufe7c" 186let s:a_m_SHADDA = "\ufe7d" 187let s:a_s_SUKUN = "\ufe7e" 188let s:a_m_SUKUN = "\ufe7f" 189 190let s:a_s_HAMZA = "\ufe80" 191let s:a_s_ALEF_MADDA = "\ufe81" 192let s:a_f_ALEF_MADDA = "\ufe82" 193let s:a_s_ALEF_HAMZA_ABOVE = "\ufe83" 194let s:a_f_ALEF_HAMZA_ABOVE = "\ufe84" 195let s:a_s_WAW_HAMZA = "\ufe85" 196let s:a_f_WAW_HAMZA = "\ufe86" 197let s:a_s_ALEF_HAMZA_BELOW = "\ufe87" 198let s:a_f_ALEF_HAMZA_BELOW = "\ufe88" 199let s:a_s_YEH_HAMZA = "\ufe89" 200let s:a_f_YEH_HAMZA = "\ufe8a" 201let s:a_i_YEH_HAMZA = "\ufe8b" 202let s:a_m_YEH_HAMZA = "\ufe8c" 203let s:a_s_ALEF = "\ufe8d" 204let s:a_f_ALEF = "\ufe8e" 205let s:a_s_BEH = "\ufe8f" 206let s:a_f_BEH = "\ufe90" 207let s:a_i_BEH = "\ufe91" 208let s:a_m_BEH = "\ufe92" 209let s:a_s_TEH_MARBUTA = "\ufe93" 210let s:a_f_TEH_MARBUTA = "\ufe94" 211let s:a_s_TEH = "\ufe95" 212let s:a_f_TEH = "\ufe96" 213let s:a_i_TEH = "\ufe97" 214let s:a_m_TEH = "\ufe98" 215let s:a_s_THEH = "\ufe99" 216let s:a_f_THEH = "\ufe9a" 217let s:a_i_THEH = "\ufe9b" 218let s:a_m_THEH = "\ufe9c" 219let s:a_s_JEEM = "\ufe9d" 220let s:a_f_JEEM = "\ufe9e" 221let s:a_i_JEEM = "\ufe9f" 222let s:a_m_JEEM = "\ufea0" 223let s:a_s_HAH = "\ufea1" 224let s:a_f_HAH = "\ufea2" 225let s:a_i_HAH = "\ufea3" 226let s:a_m_HAH = "\ufea4" 227let s:a_s_KHAH = "\ufea5" 228let s:a_f_KHAH = "\ufea6" 229let s:a_i_KHAH = "\ufea7" 230let s:a_m_KHAH = "\ufea8" 231let s:a_s_DAL = "\ufea9" 232let s:a_f_DAL = "\ufeaa" 233let s:a_s_THAL = "\ufeab" 234let s:a_f_THAL = "\ufeac" 235let s:a_s_REH = "\ufead" 236let s:a_f_REH = "\ufeae" 237let s:a_s_ZAIN = "\ufeaf" 238let s:a_f_ZAIN = "\ufeb0" 239let s:a_s_SEEN = "\ufeb1" 240let s:a_f_SEEN = "\ufeb2" 241let s:a_i_SEEN = "\ufeb3" 242let s:a_m_SEEN = "\ufeb4" 243let s:a_s_SHEEN = "\ufeb5" 244let s:a_f_SHEEN = "\ufeb6" 245let s:a_i_SHEEN = "\ufeb7" 246let s:a_m_SHEEN = "\ufeb8" 247let s:a_s_SAD = "\ufeb9" 248let s:a_f_SAD = "\ufeba" 249let s:a_i_SAD = "\ufebb" 250let s:a_m_SAD = "\ufebc" 251let s:a_s_DAD = "\ufebd" 252let s:a_f_DAD = "\ufebe" 253let s:a_i_DAD = "\ufebf" 254let s:a_m_DAD = "\ufec0" 255let s:a_s_TAH = "\ufec1" 256let s:a_f_TAH = "\ufec2" 257let s:a_i_TAH = "\ufec3" 258let s:a_m_TAH = "\ufec4" 259let s:a_s_ZAH = "\ufec5" 260let s:a_f_ZAH = "\ufec6" 261let s:a_i_ZAH = "\ufec7" 262let s:a_m_ZAH = "\ufec8" 263let s:a_s_AIN = "\ufec9" 264let s:a_f_AIN = "\ufeca" 265let s:a_i_AIN = "\ufecb" 266let s:a_m_AIN = "\ufecc" 267let s:a_s_GHAIN = "\ufecd" 268let s:a_f_GHAIN = "\ufece" 269let s:a_i_GHAIN = "\ufecf" 270let s:a_m_GHAIN = "\ufed0" 271let s:a_s_FEH = "\ufed1" 272let s:a_f_FEH = "\ufed2" 273let s:a_i_FEH = "\ufed3" 274let s:a_m_FEH = "\ufed4" 275let s:a_s_QAF = "\ufed5" 276let s:a_f_QAF = "\ufed6" 277let s:a_i_QAF = "\ufed7" 278let s:a_m_QAF = "\ufed8" 279let s:a_s_KAF = "\ufed9" 280let s:a_f_KAF = "\ufeda" 281let s:a_i_KAF = "\ufedb" 282let s:a_m_KAF = "\ufedc" 283let s:a_s_LAM = "\ufedd" 284let s:a_f_LAM = "\ufede" 285let s:a_i_LAM = "\ufedf" 286let s:a_m_LAM = "\ufee0" 287let s:a_s_MEEM = "\ufee1" 288let s:a_f_MEEM = "\ufee2" 289let s:a_i_MEEM = "\ufee3" 290let s:a_m_MEEM = "\ufee4" 291let s:a_s_NOON = "\ufee5" 292let s:a_f_NOON = "\ufee6" 293let s:a_i_NOON = "\ufee7" 294let s:a_m_NOON = "\ufee8" 295let s:a_s_HEH = "\ufee9" 296let s:a_f_HEH = "\ufeea" 297let s:a_i_HEH = "\ufeeb" 298let s:a_m_HEH = "\ufeec" 299let s:a_s_WAW = "\ufeed" 300let s:a_f_WAW = "\ufeee" 301let s:a_s_ALEF_MAKSURA = "\ufeef" 302let s:a_f_ALEF_MAKSURA = "\ufef0" 303let s:a_s_YEH = "\ufef1" 304let s:a_f_YEH = "\ufef2" 305let s:a_i_YEH = "\ufef3" 306let s:a_m_YEH = "\ufef4" 307let s:a_s_LAM_ALEF_MADDA_ABOVE = "\ufef5" 308let s:a_f_LAM_ALEF_MADDA_ABOVE = "\ufef6" 309let s:a_s_LAM_ALEF_HAMZA_ABOVE = "\ufef7" 310let s:a_f_LAM_ALEF_HAMZA_ABOVE = "\ufef8" 311let s:a_s_LAM_ALEF_HAMZA_BELOW = "\ufef9" 312let s:a_f_LAM_ALEF_HAMZA_BELOW = "\ufefa" 313let s:a_s_LAM_ALEF = "\ufefb" 314let s:a_f_LAM_ALEF = "\ufefc" 315 316let s:a_BYTE_ORDER_MARK = "\ufeff" 317 318func Test_shape_initial() 319 new 320 set arabicshape 321 322 " Shaping arabic {testchar} non-arabic Tests chg_c_a2i(). 323 " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result 324 for pair in [[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_i_YEH_HAMZA], 325 \ [s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA], 326 \ [s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_s_ALEF_MADDA], 327 \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_ABOVE], 328 \ [s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_s_WAW_HAMZA], 329 \ [s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_s_ALEF_HAMZA_BELOW], 330 \ [s:a_ALEF, s:a_s_GHAIN, s:a_s_ALEF], 331 \ [s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_s_TEH_MARBUTA], 332 \ [s:a_DAL, s:a_s_GHAIN, s:a_s_DAL], 333 \ [s:a_THAL, s:a_s_GHAIN, s:a_s_THAL], 334 \ [s:a_REH, s:a_s_GHAIN, s:a_s_REH], 335 \ [s:a_ZAIN, s:a_s_GHAIN, s:a_s_ZAIN], 336 \ [s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL], 337 \ [s:a_WAW, s:a_s_GHAIN, s:a_s_WAW], 338 \ [s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_s_ALEF_MAKSURA], 339 \ [s:a_BEH, s:a_f_GHAIN, s:a_i_BEH], 340 \ [s:a_TEH, s:a_f_GHAIN, s:a_i_TEH], 341 \ [s:a_THEH, s:a_f_GHAIN, s:a_i_THEH], 342 \ [s:a_JEEM, s:a_f_GHAIN, s:a_i_JEEM], 343 \ [s:a_HAH, s:a_f_GHAIN, s:a_i_HAH], 344 \ [s:a_KHAH, s:a_f_GHAIN, s:a_i_KHAH], 345 \ [s:a_SEEN, s:a_f_GHAIN, s:a_i_SEEN], 346 \ [s:a_SHEEN, s:a_f_GHAIN, s:a_i_SHEEN], 347 \ [s:a_SAD, s:a_f_GHAIN, s:a_i_SAD], 348 \ [s:a_DAD, s:a_f_GHAIN, s:a_i_DAD], 349 \ [s:a_TAH, s:a_f_GHAIN, s:a_i_TAH], 350 \ [s:a_ZAH, s:a_f_GHAIN, s:a_i_ZAH], 351 \ [s:a_AIN, s:a_f_GHAIN, s:a_i_AIN], 352 \ [s:a_GHAIN, s:a_f_GHAIN, s:a_i_GHAIN], 353 \ [s:a_FEH, s:a_f_GHAIN, s:a_i_FEH], 354 \ [s:a_QAF, s:a_f_GHAIN, s:a_i_QAF], 355 \ [s:a_KAF, s:a_f_GHAIN, s:a_i_KAF], 356 \ [s:a_LAM, s:a_f_GHAIN, s:a_i_LAM], 357 \ [s:a_MEEM, s:a_f_GHAIN, s:a_i_MEEM], 358 \ [s:a_NOON, s:a_f_GHAIN, s:a_i_NOON], 359 \ [s:a_HEH, s:a_f_GHAIN, s:a_i_HEH], 360 \ [s:a_YEH, s:a_f_GHAIN, s:a_i_YEH], 361 \ ] 362 call setline(1, s:a_GHAIN . pair[0] . ' ') 363 call assert_equal([pair[1] . pair[2] . ' '], ScreenLines(1, 3)) 364 endfor 365 366 set arabicshape& 367 bwipe! 368endfunc 369 370func Test_shape_isolated() 371 new 372 set arabicshape 373 374 " Shaping non-arabic {testchar} non-arabic Tests chg_c_a2s(). 375 " pair[0] = testchar, pair[1] = current-result 376 for pair in [[s:a_HAMZA, s:a_s_HAMZA], 377 \ [s:a_ALEF_MADDA, s:a_s_ALEF_MADDA], 378 \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_ALEF_HAMZA_ABOVE], 379 \ [s:a_WAW_HAMZA, s:a_s_WAW_HAMZA], 380 \ [s:a_ALEF_HAMZA_BELOW, s:a_s_ALEF_HAMZA_BELOW], 381 \ [s:a_YEH_HAMZA, s:a_s_YEH_HAMZA], 382 \ [s:a_ALEF, s:a_s_ALEF], 383 \ [s:a_TEH_MARBUTA, s:a_s_TEH_MARBUTA], 384 \ [s:a_DAL, s:a_s_DAL], 385 \ [s:a_THAL, s:a_s_THAL], 386 \ [s:a_REH, s:a_s_REH], 387 \ [s:a_ZAIN, s:a_s_ZAIN], 388 \ [s:a_TATWEEL, s:a_TATWEEL], 389 \ [s:a_WAW, s:a_s_WAW], 390 \ [s:a_ALEF_MAKSURA, s:a_s_ALEF_MAKSURA], 391 \ [s:a_BEH, s:a_s_BEH], 392 \ [s:a_TEH, s:a_s_TEH], 393 \ [s:a_THEH, s:a_s_THEH], 394 \ [s:a_JEEM, s:a_s_JEEM], 395 \ [s:a_HAH, s:a_s_HAH], 396 \ [s:a_KHAH, s:a_s_KHAH], 397 \ [s:a_SEEN, s:a_s_SEEN], 398 \ [s:a_SHEEN, s:a_s_SHEEN], 399 \ [s:a_SAD, s:a_s_SAD], 400 \ [s:a_DAD, s:a_s_DAD], 401 \ [s:a_TAH, s:a_s_TAH], 402 \ [s:a_ZAH, s:a_s_ZAH], 403 \ [s:a_AIN, s:a_s_AIN], 404 \ [s:a_GHAIN, s:a_s_GHAIN], 405 \ [s:a_FEH, s:a_s_FEH], 406 \ [s:a_QAF, s:a_s_QAF], 407 \ [s:a_KAF, s:a_s_KAF], 408 \ [s:a_LAM, s:a_s_LAM], 409 \ [s:a_MEEM, s:a_s_MEEM], 410 \ [s:a_NOON, s:a_s_NOON], 411 \ [s:a_HEH, s:a_s_HEH], 412 \ [s:a_YEH, s:a_s_YEH], 413 \ ] 414 call setline(1, ' ' . pair[0] . ' ') 415 call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3)) 416 endfor 417 418 set arabicshape& 419 bwipe! 420endfunc 421 422func Test_shape_iso_to_medial() 423 new 424 set arabicshape 425 426 " Shaping arabic {testchar} arabic Tests chg_c_a2m(). 427 " pair[0] = testchar, pair[1] = next-result, pair[2] = current-result, 428 " pair[3] = previous-result 429 for pair in [[s:a_HAMZA, s:a_s_GHAIN, s:a_s_HAMZA, s:a_s_BEH], 430 \[s:a_ALEF_MADDA, s:a_s_GHAIN, s:a_f_ALEF_MADDA, s:a_i_BEH], 431 \[s:a_ALEF_HAMZA_ABOVE, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH], 432 \[s:a_WAW_HAMZA, s:a_s_GHAIN, s:a_f_WAW_HAMZA, s:a_i_BEH], 433 \[s:a_ALEF_HAMZA_BELOW, s:a_s_GHAIN, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH], 434 \[s:a_YEH_HAMZA, s:a_f_GHAIN, s:a_m_YEH_HAMZA, s:a_i_BEH], 435 \[s:a_ALEF, s:a_s_GHAIN, s:a_f_ALEF, s:a_i_BEH], 436 \[s:a_BEH, s:a_f_GHAIN, s:a_m_BEH, s:a_i_BEH], 437 \[s:a_TEH_MARBUTA, s:a_s_GHAIN, s:a_f_TEH_MARBUTA, s:a_i_BEH], 438 \[s:a_TEH, s:a_f_GHAIN, s:a_m_TEH, s:a_i_BEH], 439 \[s:a_THEH, s:a_f_GHAIN, s:a_m_THEH, s:a_i_BEH], 440 \[s:a_JEEM, s:a_f_GHAIN, s:a_m_JEEM, s:a_i_BEH], 441 \[s:a_HAH, s:a_f_GHAIN, s:a_m_HAH, s:a_i_BEH], 442 \[s:a_KHAH, s:a_f_GHAIN, s:a_m_KHAH, s:a_i_BEH], 443 \[s:a_DAL, s:a_s_GHAIN, s:a_f_DAL, s:a_i_BEH], 444 \[s:a_THAL, s:a_s_GHAIN, s:a_f_THAL, s:a_i_BEH], 445 \[s:a_REH, s:a_s_GHAIN, s:a_f_REH, s:a_i_BEH], 446 \[s:a_ZAIN, s:a_s_GHAIN, s:a_f_ZAIN, s:a_i_BEH], 447 \[s:a_SEEN, s:a_f_GHAIN, s:a_m_SEEN, s:a_i_BEH], 448 \[s:a_SHEEN, s:a_f_GHAIN, s:a_m_SHEEN, s:a_i_BEH], 449 \[s:a_SAD, s:a_f_GHAIN, s:a_m_SAD, s:a_i_BEH], 450 \[s:a_DAD, s:a_f_GHAIN, s:a_m_DAD, s:a_i_BEH], 451 \[s:a_TAH, s:a_f_GHAIN, s:a_m_TAH, s:a_i_BEH], 452 \[s:a_ZAH, s:a_f_GHAIN, s:a_m_ZAH, s:a_i_BEH], 453 \[s:a_AIN, s:a_f_GHAIN, s:a_m_AIN, s:a_i_BEH], 454 \[s:a_GHAIN, s:a_f_GHAIN, s:a_m_GHAIN, s:a_i_BEH], 455 \[s:a_TATWEEL, s:a_f_GHAIN, s:a_TATWEEL, s:a_i_BEH], 456 \[s:a_FEH, s:a_f_GHAIN, s:a_m_FEH, s:a_i_BEH], 457 \[s:a_QAF, s:a_f_GHAIN, s:a_m_QAF, s:a_i_BEH], 458 \[s:a_KAF, s:a_f_GHAIN, s:a_m_KAF, s:a_i_BEH], 459 \[s:a_LAM, s:a_f_GHAIN, s:a_m_LAM, s:a_i_BEH], 460 \[s:a_MEEM, s:a_f_GHAIN, s:a_m_MEEM, s:a_i_BEH], 461 \[s:a_NOON, s:a_f_GHAIN, s:a_m_NOON, s:a_i_BEH], 462 \[s:a_HEH, s:a_f_GHAIN, s:a_m_HEH, s:a_i_BEH], 463 \[s:a_WAW, s:a_s_GHAIN, s:a_f_WAW, s:a_i_BEH], 464 \[s:a_ALEF_MAKSURA, s:a_s_GHAIN, s:a_f_ALEF_MAKSURA, s:a_i_BEH], 465 \[s:a_YEH, s:a_f_GHAIN, s:a_m_YEH, s:a_i_BEH], 466 \ ] 467 call setline(1, s:a_GHAIN . pair[0] . s:a_BEH) 468 call assert_equal([pair[1] . pair[2] . pair[3]], ScreenLines(1, 3)) 469 endfor 470 471 set arabicshape& 472 bwipe! 473endfunc 474 475func Test_shape_final() 476 new 477 set arabicshape 478 479 " Shaping arabic {testchar} arabic Tests chg_c_a2f(). 480 " pair[0] = testchar, pair[1] = current-result, pair[2] = previous-result 481 for pair in [[s:a_HAMZA, s:a_s_HAMZA, s:a_s_BEH], 482 \[s:a_ALEF_MADDA, s:a_f_ALEF_MADDA, s:a_i_BEH], 483 \[s:a_ALEF_HAMZA_ABOVE, s:a_f_ALEF_HAMZA_ABOVE, s:a_i_BEH], 484 \[s:a_WAW_HAMZA, s:a_f_WAW_HAMZA, s:a_i_BEH], 485 \[s:a_ALEF_HAMZA_BELOW, s:a_f_ALEF_HAMZA_BELOW, s:a_i_BEH], 486 \[s:a_YEH_HAMZA, s:a_f_YEH_HAMZA, s:a_i_BEH], 487 \[s:a_ALEF, s:a_f_ALEF, s:a_i_BEH], 488 \[s:a_BEH, s:a_f_BEH, s:a_i_BEH], 489 \[s:a_TEH_MARBUTA, s:a_f_TEH_MARBUTA, s:a_i_BEH], 490 \[s:a_TEH, s:a_f_TEH, s:a_i_BEH], 491 \[s:a_THEH, s:a_f_THEH, s:a_i_BEH], 492 \[s:a_JEEM, s:a_f_JEEM, s:a_i_BEH], 493 \[s:a_HAH, s:a_f_HAH, s:a_i_BEH], 494 \[s:a_KHAH, s:a_f_KHAH, s:a_i_BEH], 495 \[s:a_DAL, s:a_f_DAL, s:a_i_BEH], 496 \[s:a_THAL, s:a_f_THAL, s:a_i_BEH], 497 \[s:a_REH, s:a_f_REH, s:a_i_BEH], 498 \[s:a_ZAIN, s:a_f_ZAIN, s:a_i_BEH], 499 \[s:a_SEEN, s:a_f_SEEN, s:a_i_BEH], 500 \[s:a_SHEEN, s:a_f_SHEEN, s:a_i_BEH], 501 \[s:a_SAD, s:a_f_SAD, s:a_i_BEH], 502 \[s:a_DAD, s:a_f_DAD, s:a_i_BEH], 503 \[s:a_TAH, s:a_f_TAH, s:a_i_BEH], 504 \[s:a_ZAH, s:a_f_ZAH, s:a_i_BEH], 505 \[s:a_AIN, s:a_f_AIN, s:a_i_BEH], 506 \[s:a_GHAIN, s:a_f_GHAIN, s:a_i_BEH], 507 \[s:a_TATWEEL, s:a_TATWEEL, s:a_i_BEH], 508 \[s:a_FEH, s:a_f_FEH, s:a_i_BEH], 509 \[s:a_QAF, s:a_f_QAF, s:a_i_BEH], 510 \[s:a_KAF, s:a_f_KAF, s:a_i_BEH], 511 \[s:a_LAM, s:a_f_LAM, s:a_i_BEH], 512 \[s:a_MEEM, s:a_f_MEEM, s:a_i_BEH], 513 \[s:a_NOON, s:a_f_NOON, s:a_i_BEH], 514 \[s:a_HEH, s:a_f_HEH, s:a_i_BEH], 515 \[s:a_WAW, s:a_f_WAW, s:a_i_BEH], 516 \[s:a_ALEF_MAKSURA, s:a_f_ALEF_MAKSURA, s:a_i_BEH], 517 \[s:a_YEH, s:a_f_YEH, s:a_i_BEH], 518 \ ] 519 call setline(1, ' ' . pair[0] . s:a_BEH) 520 call assert_equal([' ' . pair[1] . pair[2]], ScreenLines(1, 3)) 521 endfor 522 523 set arabicshape& 524 bwipe! 525endfunc 526 527func Test_shape_combination_final() 528 new 529 set arabicshape 530 531 " Shaping arabic {testchar} arabic Tests chg_c_laa2f(). 532 " pair[0] = testchar, pair[1] = current-result 533 for pair in [[s:a_ALEF_MADDA, s:a_f_LAM_ALEF_MADDA_ABOVE], 534 \ [s:a_ALEF_HAMZA_ABOVE, s:a_f_LAM_ALEF_HAMZA_ABOVE], 535 \ [s:a_ALEF_HAMZA_BELOW, s:a_f_LAM_ALEF_HAMZA_BELOW], 536 \ [s:a_ALEF, s:a_f_LAM_ALEF], 537 \ ] 538 " The test char is a composing char, put on s:a_LAM. 539 call setline(1, ' ' . s:a_LAM . pair[0] . s:a_BEH) 540 call assert_equal([' ' . pair[1] . s:a_i_BEH], ScreenLines(1, 3)) 541 endfor 542 543 set arabicshape& 544 bwipe! 545endfunc 546 547func Test_shape_combination_isolated() 548 new 549 set arabicshape 550 551 " Shaping arabic {testchar} arabic Tests chg_c_laa2i(). 552 " pair[0] = testchar, pair[1] = current-result 553 for pair in [[s:a_ALEF_MADDA, s:a_s_LAM_ALEF_MADDA_ABOVE], 554 \ [s:a_ALEF_HAMZA_ABOVE, s:a_s_LAM_ALEF_HAMZA_ABOVE], 555 \ [s:a_ALEF_HAMZA_BELOW, s:a_s_LAM_ALEF_HAMZA_BELOW], 556 \ [s:a_ALEF, s:a_s_LAM_ALEF], 557 \ ] 558 " The test char is a composing char, put on s:a_LAM. 559 call setline(1, ' ' . s:a_LAM . pair[0] . ' ') 560 call assert_equal([' ' . pair[1] . ' '], ScreenLines(1, 3)) 561 endfor 562 563 set arabicshape& 564 bwipe! 565endfunc 566