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