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