xref: /vim-8.2.3635/src/testdir/test_spell.vim (revision 96fdf434)
1" Test spell checking
2" Note: this file uses latin1 encoding, but is used with utf-8 encoding.
3
4source check.vim
5CheckFeature spell
6
7source screendump.vim
8
9func TearDown()
10  set nospell
11  call delete('Xtest.aff')
12  call delete('Xtest.dic')
13  call delete('Xtest.latin1.add')
14  call delete('Xtest.latin1.add.spl')
15  call delete('Xtest.latin1.spl')
16  call delete('Xtest.latin1.sug')
17endfunc
18
19func Test_wrap_search()
20  new
21  call setline(1, ['The', '', 'A plong line with two zpelling mistakes', '', 'End'])
22  set spell wrapscan
23  normal ]s
24  call assert_equal('plong', expand('<cword>'))
25  normal ]s
26  call assert_equal('zpelling', expand('<cword>'))
27  normal ]s
28  call assert_equal('plong', expand('<cword>'))
29  bwipe!
30  set nospell
31endfunc
32
33func Test_curswant()
34  new
35  call setline(1, ['Another plong line', 'abcdefghijklmnopq'])
36  set spell wrapscan
37  normal 0]s
38  call assert_equal('plong', expand('<cword>'))
39  normal j
40  call assert_equal(9, getcurpos()[2])
41  normal 0[s
42  call assert_equal('plong', expand('<cword>'))
43  normal j
44  call assert_equal(9, getcurpos()[2])
45
46  normal 0]S
47  call assert_equal('plong', expand('<cword>'))
48  normal j
49  call assert_equal(9, getcurpos()[2])
50  normal 0[S
51  call assert_equal('plong', expand('<cword>'))
52  normal j
53  call assert_equal(9, getcurpos()[2])
54
55  normal 1G0
56  call assert_equal('plong', spellbadword()[0])
57  normal j
58  call assert_equal(9, getcurpos()[2])
59
60  bwipe!
61  set nospell
62endfunc
63
64func Test_z_equal_on_invalid_utf8_word()
65  split
66  set spell
67  call setline(1, "\xff")
68  norm z=
69  set nospell
70  bwipe!
71endfunc
72
73" Test spellbadword() with argument
74func Test_spellbadword()
75  set spell
76
77  call assert_equal(['bycycle', 'bad'],  spellbadword('My bycycle.'))
78  call assert_equal(['another', 'caps'], 'A sentence. another sentence'->spellbadword())
79
80  call assert_equal(['TheCamelWord', 'bad'], 'TheCamelWord asdf'->spellbadword())
81  set spelloptions=camel
82  call assert_equal(['asdf', 'bad'], 'TheCamelWord asdf'->spellbadword())
83  set spelloptions=
84
85  set spelllang=en
86  call assert_equal(['', ''],            spellbadword('centre'))
87  call assert_equal(['', ''],            spellbadword('center'))
88  set spelllang=en_us
89  call assert_equal(['centre', 'local'], spellbadword('centre'))
90  call assert_equal(['', ''],            spellbadword('center'))
91  set spelllang=en_gb
92  call assert_equal(['', ''],            spellbadword('centre'))
93  call assert_equal(['center', 'local'], spellbadword('center'))
94
95  " Create a small word list to test that spellbadword('...')
96  " can return ['...', 'rare'].
97  e Xwords
98  insert
99foo
100foobar/?
101.
102   w!
103   mkspell! Xwords.spl Xwords
104   set spelllang=Xwords.spl
105   call assert_equal(['foobar', 'rare'], spellbadword('foo foobar'))
106
107  " Typo should be detected even without the 'spell' option.
108  set spelllang=en_gb nospell
109  call assert_equal(['', ''], spellbadword('centre'))
110  call assert_equal(['bycycle', 'bad'], spellbadword('My bycycle.'))
111  call assert_equal(['another', 'caps'], spellbadword('A sentence. another sentence'))
112
113  set spelllang=
114  call assert_fails("call spellbadword('maxch')", 'E756:')
115  call assert_fails("spelldump", 'E756:')
116
117  call delete('Xwords.spl')
118  call delete('Xwords')
119  set spelllang&
120  set spell&
121endfunc
122
123func Test_spellreall()
124  new
125  set spell
126  call assert_fails('spellrepall', 'E752:')
127  call setline(1, ['A speling mistake. The same speling mistake.',
128        \                'Another speling mistake.'])
129  call feedkeys(']s1z=', 'tx')
130  call assert_equal('A spelling mistake. The same speling mistake.', getline(1))
131  call assert_equal('Another speling mistake.', getline(2))
132  spellrepall
133  call assert_equal('A spelling mistake. The same spelling mistake.', getline(1))
134  call assert_equal('Another spelling mistake.', getline(2))
135  call assert_fails('spellrepall', 'E753:')
136  set spell&
137  bwipe!
138endfunc
139
140" Test spellsuggest({word} [, {max} [, {capital}]])
141func Test_spellsuggest()
142  " Verify suggestions are given even when spell checking is not enabled.
143  set nospell
144  call assert_equal(['march', 'March'], spellsuggest('marrch', 2))
145
146  set spell
147
148  " With 1 argument.
149  call assert_equal(['march', 'March'], spellsuggest('marrch')[0:1])
150
151  " With 2 arguments.
152  call assert_equal(['march', 'March'], spellsuggest('marrch', 2))
153
154  " With 3 arguments.
155  call assert_equal(['march'], spellsuggest('marrch', 1, 0))
156  call assert_equal(['March'], spellsuggest('marrch', 1, 1))
157
158  " Test with digits and hyphen.
159  call assert_equal('Carbon-14', spellsuggest('Carbon-15')[0])
160
161  " Comment taken from spellsuggest.c explains the following test cases:
162  "
163  " If there are more UPPER than lower case letters suggest an
164  " ALLCAP word.  Otherwise, if the first letter is UPPER then
165  " suggest ONECAP.  Exception: "ALl" most likely should be "All",
166  " require three upper case letters.
167  call assert_equal(['THIRD', 'third'], spellsuggest('thIRD', 2))
168  call assert_equal(['third', 'THIRD'], spellsuggest('tHIrd', 2))
169  call assert_equal(['Third'], spellsuggest('THird', 1))
170  call assert_equal(['All'],      spellsuggest('ALl', 1))
171
172  call assert_fails("call spellsuggest('maxch', [])", 'E745:')
173  call assert_fails("call spellsuggest('maxch', 2, [])", 'E745:')
174
175  set spelllang=
176  call assert_fails("call spellsuggest('maxch')", 'E756:')
177  set spelllang&
178
179  set spell&
180endfunc
181
182" Test 'spellsuggest' option with methods fast, best and double.
183func Test_spellsuggest_option_methods()
184  set spell
185
186  for e in ['latin1', 'utf-8']
187    exe 'set encoding=' .. e
188
189    set spellsuggest=fast
190    call assert_equal(['Stick', 'Stitch'], spellsuggest('Stich', 2), e)
191
192    " With best or double option, "Stitch" should become the top suggestion
193    " because of better phonetic matching.
194    set spellsuggest=best
195    call assert_equal(['Stitch', 'Stick'], spellsuggest('Stich', 2), e)
196
197    set spellsuggest=double
198    call assert_equal(['Stitch', 'Stick'], spellsuggest('Stich', 2), e)
199  endfor
200
201  set spell& spellsuggest& encoding&
202endfunc
203
204" Test 'spellsuggest' option with value file:{filename}
205func Test_spellsuggest_option_file()
206  set spell spellsuggest=file:Xspellsuggest
207  call writefile(['emacs/vim',
208        \         'theribal/terrible',
209        \         'teribal/terrrible',
210        \         'terribal'],
211        \         'Xspellsuggest')
212
213  call assert_equal(['vim'],      spellsuggest('emacs', 2))
214  call assert_equal(['terrible'], spellsuggest('theribal',2))
215
216  " If the suggestion is misspelled (*terrrible* with 3 r),
217  " it should not be proposed.
218  " The entry for "terribal" should be ignored because of missing slash.
219  call assert_equal([], spellsuggest('teribal', 2))
220  call assert_equal([], spellsuggest('terribal', 2))
221
222  set spell spellsuggest=best,file:Xspellsuggest
223  call assert_equal(['vim', 'Emacs'],       spellsuggest('emacs', 2))
224  call assert_equal(['terrible', 'tribal'], spellsuggest('theribal', 2))
225  call assert_equal(['tribal'],             spellsuggest('teribal', 1))
226  call assert_equal(['tribal'],             spellsuggest('terribal', 1))
227
228  call delete('Xspellsuggest')
229  call assert_fails("call spellsuggest('vim')", "E484: Can't open file Xspellsuggest")
230
231  set spellsuggest& spell&
232endfunc
233
234" Test 'spellsuggest' option with value {number}
235" to limit the number of suggestions
236func Test_spellsuggest_option_number()
237  set spell spellsuggest=2,best
238  new
239
240  " We limited the number of suggestions to 2, so selecting
241  " the 1st and 2nd suggestion should correct the word, but
242  " selecting a 3rd suggestion should do nothing.
243  call setline(1, 'A baord')
244  norm $1z=
245  call assert_equal('A board', getline(1))
246
247  call setline(1, 'A baord')
248  norm $2z=
249  call assert_equal('A bard', getline(1))
250
251  call setline(1, 'A baord')
252  norm $3z=
253  call assert_equal('A baord', getline(1))
254
255  let a = execute('norm $z=')
256  call assert_equal(
257  \    "\n"
258  \ .. "Change \"baord\" to:\n"
259  \ .. " 1 \"board\"\n"
260  \ .. " 2 \"bard\"\n"
261  \ .. "Type number and <Enter> or click with the mouse (q or empty cancels): ", a)
262
263  set spell spellsuggest=0
264  call assert_equal("\nSorry, no suggestions", execute('norm $z='))
265
266  " Unlike z=, function spellsuggest(...) should not be affected by the
267  " max number of suggestions (2) set by the 'spellsuggest' option.
268  call assert_equal(['board', 'bard', 'broad'], spellsuggest('baord', 3))
269
270  set spellsuggest& spell&
271  bwipe!
272endfunc
273
274" Test 'spellsuggest' option with value expr:{expr}
275func Test_spellsuggest_option_expr()
276  " A silly 'spellsuggest' function which makes suggestions all uppercase
277  " and makes the score of each suggestion the length of the suggested word.
278  " So shorter suggestions are preferred.
279  func MySuggest()
280    let spellsuggest_save = &spellsuggest
281    set spellsuggest=3,best
282    let result = map(spellsuggest(v:val, 3), "[toupper(v:val), len(v:val)]")
283    let &spellsuggest = spellsuggest_save
284    return result
285  endfunc
286
287  set spell spellsuggest=expr:MySuggest()
288  call assert_equal(['BARD', 'BOARD', 'BROAD'], spellsuggest('baord', 3))
289
290  new
291  call setline(1, 'baord')
292  let a = execute('norm z=')
293  call assert_equal(
294  \    "\n"
295  \ .. "Change \"baord\" to:\n"
296  \ .. " 1 \"BARD\"\n"
297  \ .. " 2 \"BOARD\"\n"
298  \ .. " 3 \"BROAD\"\n"
299  \ .. "Type number and <Enter> or click with the mouse (q or empty cancels): ", a)
300
301  " With verbose, z= should show the score i.e. word length with
302  " our SpellSuggest() function.
303  set verbose=1
304  let a = execute('norm z=')
305  call assert_equal(
306  \    "\n"
307  \ .. "Change \"baord\" to:\n"
308  \ .. " 1 \"BARD\"                      (4 - 0)\n"
309  \ .. " 2 \"BOARD\"                     (5 - 0)\n"
310  \ .. " 3 \"BROAD\"                     (5 - 0)\n"
311  \ .. "Type number and <Enter> or click with the mouse (q or empty cancels): ", a)
312
313  set spell& spellsuggest& verbose&
314  bwipe!
315endfunc
316
317" Test for 'spellsuggest' expr errrors
318func Test_spellsuggest_expr_errors()
319  " 'spellsuggest'
320  func MySuggest()
321    return range(3)
322  endfunc
323  set spell spellsuggest=expr:MySuggest()
324  call assert_equal([], spellsuggest('baord', 3))
325
326  " Test for 'spellsuggest' expression returning a non-list value
327  func! MySuggest2()
328    return 'good'
329  endfunc
330  set spellsuggest=expr:MySuggest2()
331  call assert_equal([], spellsuggest('baord'))
332
333  " Test for 'spellsuggest' expression returning a list with dict values
334  func! MySuggest3()
335    return [[{}, {}]]
336  endfunc
337  set spellsuggest=expr:MySuggest3()
338  call assert_fails("call spellsuggest('baord')", 'E731:')
339
340  set nospell spellsuggest&
341  delfunc MySuggest
342  delfunc MySuggest2
343  delfunc MySuggest3
344endfunc
345
346func Test_spellinfo()
347  new
348  let runtime = substitute($VIMRUNTIME, '\\', '/', 'g')
349
350  set enc=latin1 spell spelllang=en
351  call assert_match("^\nfile: " .. runtime .. "/spell/en.latin1.spl\n$", execute('spellinfo'))
352
353  set enc=cp1250 spell spelllang=en
354  call assert_match("^\nfile: " .. runtime .. "/spell/en.ascii.spl\n$", execute('spellinfo'))
355
356  set enc=utf-8 spell spelllang=en
357  call assert_match("^\nfile: " .. runtime .. "/spell/en.utf-8.spl\n$", execute('spellinfo'))
358
359  set enc=latin1 spell spelllang=en_us,en_nz
360  call assert_match("^\n" .
361                 \  "file: " .. runtime .. "/spell/en.latin1.spl\n" .
362                 \  "file: " .. runtime.. "/spell/en.latin1.spl\n$", execute('spellinfo'))
363
364  set spell spelllang=
365  call assert_fails('spellinfo', 'E756:')
366
367  set nospell spelllang=en
368  call assert_fails('spellinfo', 'E756:')
369
370  call assert_fails('set spelllang=foo/bar', 'E474:')
371  call assert_fails('set spelllang=foo\ bar', 'E474:')
372  call assert_fails("set spelllang=foo\\\nbar", 'E474:')
373  call assert_fails("set spelllang=foo\\\rbar", 'E474:')
374  call assert_fails("set spelllang=foo+bar", 'E474:')
375
376  set enc& spell& spelllang&
377  bwipe
378endfunc
379
380func Test_zz_basic()
381  call LoadAffAndDic(g:test_data_aff1, g:test_data_dic1)
382  call RunGoodBad("wrong OK puts. Test the end",
383        \ "bad: inputs comment ok Ok. test d\xE9\xF4l end the",
384        \["Comment", "deol", "d\xE9\xF4r", "input", "OK", "output", "outputs", "outtest", "put", "puts",
385        \  "test", "testen", "testn", "the end", "uk", "wrong"],
386        \[
387        \   ["bad", ["put", "uk", "OK"]],
388        \   ["inputs", ["input", "puts", "outputs"]],
389        \   ["comment", ["Comment", "outtest", "the end"]],
390        \   ["ok", ["OK", "uk", "put"]],
391        \   ["Ok", ["OK", "Uk", "Put"]],
392        \   ["test", ["Test", "testn", "testen"]],
393        \   ["d\xE9\xF4l", ["deol", "d\xE9\xF4r", "test"]],
394        \   ["end", ["put", "uk", "test"]],
395        \   ["the", ["put", "uk", "test"]],
396        \ ]
397        \ )
398
399  call assert_equal("gebletegek", soundfold('goobledygoook'))
400  call assert_equal("kepereneven", 'k�op�r�n�ven'->soundfold())
401  call assert_equal("everles gesvets etele", soundfold('oeverloos gezwets edale'))
402endfunc
403
404" Postponed prefixes
405func Test_zz_prefixes()
406  call LoadAffAndDic(g:test_data_aff2, g:test_data_dic1)
407  call RunGoodBad("puts",
408        \ "bad: inputs comment ok Ok end the. test d\xE9\xF4l",
409        \ ["Comment", "deol", "d\xE9\xF4r", "OK", "put", "input", "output", "puts", "outputs", "test", "outtest", "testen", "testn", "the end", "uk", "wrong"],
410        \ [
411        \   ["bad", ["put", "uk", "OK"]],
412        \   ["inputs", ["input", "puts", "outputs"]],
413        \   ["comment", ["Comment"]],
414        \   ["ok", ["OK", "uk", "put"]],
415        \   ["Ok", ["OK", "Uk", "Put"]],
416        \   ["end", ["put", "uk", "deol"]],
417        \   ["the", ["put", "uk", "test"]],
418        \   ["test", ["Test", "testn", "testen"]],
419        \   ["d\xE9\xF4l", ["deol", "d\xE9\xF4r", "test"]],
420        \ ])
421endfunc
422
423"Compound words
424func Test_zz_compound()
425  call LoadAffAndDic(g:test_data_aff3, g:test_data_dic3)
426  call RunGoodBad("foo m\xEF foobar foofoobar barfoo barbarfoo",
427        \ "bad: bar la foom\xEF barm\xEF m\xEFfoo m\xEFbar m\xEFm\xEF lala m\xEFla lam\xEF foola labar",
428        \ ["foo", "m\xEF"],
429        \ [
430        \   ["bad", ["foo", "m\xEF"]],
431        \   ["bar", ["barfoo", "foobar", "foo"]],
432        \   ["la", ["m\xEF", "foo"]],
433        \   ["foom\xEF", ["foo m\xEF", "foo", "foofoo"]],
434        \   ["barm\xEF", ["barfoo", "m\xEF", "barbar"]],
435        \   ["m\xEFfoo", ["m\xEF foo", "foo", "foofoo"]],
436        \   ["m\xEFbar", ["foobar", "barbar", "m\xEF"]],
437        \   ["m\xEFm\xEF", ["m\xEF m\xEF", "m\xEF"]],
438        \   ["lala", []],
439        \   ["m\xEFla", ["m\xEF", "m\xEF m\xEF"]],
440        \   ["lam\xEF", ["m\xEF", "m\xEF m\xEF"]],
441        \   ["foola", ["foo", "foobar", "foofoo"]],
442        \   ["labar", ["barbar", "foobar"]],
443        \ ])
444
445  call LoadAffAndDic(g:test_data_aff4, g:test_data_dic4)
446  call RunGoodBad("word util bork prebork start end wordutil wordutils pro-ok bork borkbork borkborkbork borkborkborkbork borkborkborkborkbork tomato tomatotomato startend startword startwordword startwordend startwordwordend startwordwordwordend prebork preborkbork preborkborkbork nouword",
447        \ "bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato endstart endend startstart wordend wordstart preborkprebork  preborkpreborkbork startwordwordwordwordend borkpreborkpreborkbork utilsbork  startnouword",
448        \ ["bork", "prebork", "end", "pro-ok", "start", "tomato", "util", "utilize", "utils", "word", "nouword"],
449        \ [
450        \   ["bad", ["end", "bork", "word"]],
451        \   ["wordutilize", ["word utilize", "wordutils", "wordutil"]],
452        \   ["pro", ["bork", "word", "end"]],
453        \   ["borkborkborkborkborkbork", ["bork borkborkborkborkbork", "borkbork borkborkborkbork", "borkborkbork borkborkbork"]],
454        \   ["tomatotomatotomato", ["tomato tomatotomato", "tomatotomato tomato", "tomato tomato tomato"]],
455        \   ["endstart", ["end start", "start"]],
456        \   ["endend", ["end end", "end"]],
457        \   ["startstart", ["start start"]],
458        \   ["wordend", ["word end", "word", "wordword"]],
459        \   ["wordstart", ["word start", "bork start"]],
460        \   ["preborkprebork", ["prebork prebork", "preborkbork", "preborkborkbork"]],
461        \   ["preborkpreborkbork", ["prebork preborkbork", "preborkborkbork", "preborkborkborkbork"]],
462        \   ["startwordwordwordwordend", ["startwordwordwordword end", "startwordwordwordword", "start wordwordwordword end"]],
463        \   ["borkpreborkpreborkbork", ["bork preborkpreborkbork", "bork prebork preborkbork", "bork preborkprebork bork"]],
464        \   ["utilsbork", ["utilbork", "utils bork", "util bork"]],
465        \   ["startnouword", ["start nouword", "startword", "startborkword"]],
466        \ ])
467
468endfunc
469
470"Test affix flags with two characters
471func Test_zz_affix()
472  call LoadAffAndDic(g:test_data_aff5, g:test_data_dic5)
473  call RunGoodBad("fooa1 fooa\xE9 bar prebar barbork prebarbork  startprebar start end startend  startmiddleend nouend",
474        \ "bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart startprobar startnouend",
475        \ ["bar", "barbork", "end", "fooa1", "fooa\xE9", "nouend", "prebar", "prebarbork", "start"],
476        \ [
477        \   ["bad", ["bar", "end", "fooa1"]],
478        \   ["foo", ["fooa1", "fooa\xE9", "bar"]],
479        \   ["fooa2", ["fooa1", "fooa\xE9", "bar"]],
480        \   ["prabar", ["prebar", "bar", "bar bar"]],
481        \   ["probarbirk", ["prebarbork"]],
482        \   ["middle", []],
483        \   ["startmiddle", ["startmiddleend", "startmiddlebar"]],
484        \   ["middleend", []],
485        \   ["endstart", ["end start", "start"]],
486        \   ["startprobar", ["startprebar", "start prebar", "startbar"]],
487        \   ["startnouend", ["start nouend", "startend"]],
488        \ ])
489
490  call LoadAffAndDic(g:test_data_aff6, g:test_data_dic6)
491  call RunGoodBad("meea1 meea\xE9 bar prebar barbork prebarbork  leadprebar lead end leadend  leadmiddleend",
492        \  "bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead leadprobar",
493        \ ["bar", "barbork", "end", "lead", "meea1", "meea\xE9", "prebar", "prebarbork"],
494        \ [
495        \   ["bad", ["bar", "end", "lead"]],
496        \   ["mee", ["meea1", "meea\xE9", "bar"]],
497        \   ["meea2", ["meea1", "meea\xE9", "lead"]],
498        \   ["prabar", ["prebar", "bar", "leadbar"]],
499        \   ["probarbirk", ["prebarbork"]],
500        \   ["middle", []],
501        \   ["leadmiddle", ["leadmiddleend", "leadmiddlebar"]],
502        \   ["middleend", []],
503        \   ["endlead", ["end lead", "lead", "end end"]],
504        \   ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
505        \ ])
506
507  call LoadAffAndDic(g:test_data_aff7, g:test_data_dic7)
508  call RunGoodBad("meea1 meezero meea\xE9 bar prebar barmeat prebarmeat  leadprebar lead tail leadtail  leadmiddletail",
509        \ "bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead leadprobar",
510        \ ["bar", "barmeat", "lead", "meea1", "meea\xE9", "meezero", "prebar", "prebarmeat", "tail"],
511        \ [
512        \   ["bad", ["bar", "lead", "tail"]],
513        \   ["mee", ["meea1", "meea\xE9", "bar"]],
514        \   ["meea2", ["meea1", "meea\xE9", "lead"]],
515        \   ["prabar", ["prebar", "bar", "leadbar"]],
516        \   ["probarmaat", ["prebarmeat"]],
517        \   ["middle", []],
518        \   ["leadmiddle", ["leadmiddlebar"]],
519        \   ["middletail", []],
520        \   ["taillead", ["tail lead", "tail"]],
521        \   ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
522        \ ])
523endfunc
524
525func Test_zz_NOSLITSUGS()
526  call LoadAffAndDic(g:test_data_aff8, g:test_data_dic8)
527  call RunGoodBad("foo bar faabar", "bad: foobar barfoo",
528        \ ["bar", "faabar", "foo"],
529        \ [
530        \   ["bad", ["bar", "foo"]],
531        \   ["foobar", ["faabar", "foo bar", "bar"]],
532        \   ["barfoo", ["bar foo", "bar", "foo"]],
533        \ ])
534endfunc
535
536" Numbers
537func Test_zz_Numbers()
538  call LoadAffAndDic(g:test_data_aff9, g:test_data_dic9)
539  call RunGoodBad("0b1011 0777 1234 0x01ff", "",
540        \ ["bar", "foo"],
541        \ [
542        \ ])
543endfunc
544
545" Affix flags
546func Test_zz_affix_flags()
547  call LoadAffAndDic(g:test_data_aff10, g:test_data_dic10)
548  call RunGoodBad("drink drinkable drinkables drinktable drinkabletable",
549	\ "bad: drinks drinkstable drinkablestable",
550        \ ["drink", "drinkable", "drinkables", "table"],
551        \ [['bad', []],
552	\ ['drinks', ['drink']],
553	\ ['drinkstable', ['drinktable', 'drinkable', 'drink table']],
554        \ ['drinkablestable', ['drinkabletable', 'drinkables table', 'drinkable table']],
555	\ ])
556endfunc
557
558function FirstSpellWord()
559  call feedkeys("/^start:\n", 'tx')
560  normal ]smm
561  let [str, a] = spellbadword()
562  return str
563endfunc
564
565function SecondSpellWord()
566  normal `m]s
567  let [str, a] = spellbadword()
568  return str
569endfunc
570
571"Test with SAL instead of SOFO items; test automatic reloading
572func Test_zz_sal_and_addition()
573  set enc=latin1
574  set spellfile=
575  call writefile(g:test_data_dic1, "Xtest.dic")
576  call writefile(g:test_data_aff_sal, "Xtest.aff")
577  mkspell! Xtest Xtest
578  set spl=Xtest.latin1.spl spell
579  call assert_equal('kbltykk', soundfold('goobledygoook'))
580  call assert_equal('kprnfn', soundfold('k�op�r�n�ven'))
581  call assert_equal('*fls kswts tl', soundfold('oeverloos gezwets edale'))
582
583  "also use an addition file
584  call writefile(["/regions=usgbnz", "elequint/2", "elekwint/3"], "Xtest.latin1.add")
585  mkspell! Xtest.latin1.add.spl Xtest.latin1.add
586
587  bwipe!
588  call setline(1, ["start: elequint test elekwint test elekwent asdf"])
589
590  set spellfile=Xtest.latin1.add
591  call assert_equal("elekwent", FirstSpellWord())
592
593  set spl=Xtest_us.latin1.spl
594  call assert_equal("elequint", FirstSpellWord())
595  call assert_equal("elekwint", SecondSpellWord())
596
597  set spl=Xtest_gb.latin1.spl
598  call assert_equal("elekwint", FirstSpellWord())
599  call assert_equal("elekwent", SecondSpellWord())
600
601  set spl=Xtest_nz.latin1.spl
602  call assert_equal("elequint", FirstSpellWord())
603  call assert_equal("elekwent", SecondSpellWord())
604
605  set spl=Xtest_ca.latin1.spl
606  call assert_equal("elequint", FirstSpellWord())
607  call assert_equal("elekwint", SecondSpellWord())
608endfunc
609
610func Test_spellfile_value()
611  set spellfile=Xdir/Xtest.latin1.add
612  set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add
613endfunc
614
615func Test_region_error()
616  messages clear
617  call writefile(["/regions=usgbnz", "elequint/0"], "Xtest.latin1.add")
618  mkspell! Xtest.latin1.add.spl Xtest.latin1.add
619  call assert_match('Invalid region nr in Xtest.latin1.add line 2: 0', execute('messages'))
620  call delete('Xtest.latin1.add')
621  call delete('Xtest.latin1.add.spl')
622endfunc
623
624" Check using z= in new buffer (crash fixed by patch 7.4a.028).
625func Test_zeq_crash()
626  new
627  set maxmem=512 spell
628  call feedkeys('iasdz=:\"', 'tx')
629
630  bwipe!
631endfunc
632
633" Check that z= works even when 'nospell' is set.  This test uses one of the
634" tests in Test_spellsuggest_option_number() just to verify that z= basically
635" works and that "E756: Spell checking is not enabled" is not generated.
636func Test_zeq_nospell()
637  new
638  set nospell spellsuggest=1,best
639  call setline(1, 'A baord')
640  try
641    norm $1z=
642    call assert_equal('A board', getline(1))
643  catch
644    call assert_report("Caught exception: " . v:exception)
645  endtry
646  set spell& spellsuggest&
647  bwipe!
648endfunc
649
650" Check that "E756: Spell checking is not possible" is reported when z= is
651" executed and 'spelllang' is empty.
652func Test_zeq_no_spelllang()
653  new
654  set spelllang= spellsuggest=1,best
655  call setline(1, 'A baord')
656  call assert_fails('normal $1z=', 'E756:')
657  set spelllang& spellsuggest&
658  bwipe!
659endfunc
660
661" Check handling a word longer than MAXWLEN.
662func Test_spell_long_word()
663  set enc=utf-8
664  new
665  call setline(1, "d\xCC\xB4\xCC\xBD\xCD\x88\xCD\x94a\xCC\xB5\xCD\x84\xCD\x84\xCC\xA8\xCD\x9Cr\xCC\xB5\xCC\x8E\xCD\x85\xCD\x85k\xCC\xB6\xCC\x89\xCC\x9D \xCC\xB6\xCC\x83\xCC\x8F\xCC\xA4\xCD\x8Ef\xCC\xB7\xCC\x81\xCC\x80\xCC\xA9\xCC\xB0\xCC\xAC\xCC\xA2\xCD\x95\xCD\x87\xCD\x8D\xCC\x9E\xCD\x99\xCC\xAD\xCC\xAB\xCC\x97\xCC\xBBo\xCC\xB6\xCC\x84\xCC\x95\xCC\x8C\xCC\x8B\xCD\x9B\xCD\x9C\xCC\xAFr\xCC\xB7\xCC\x94\xCD\x83\xCD\x97\xCC\x8C\xCC\x82\xCD\x82\xCD\x80\xCD\x91\xCC\x80\xCC\xBE\xCC\x82\xCC\x8F\xCC\xA3\xCD\x85\xCC\xAE\xCD\x8D\xCD\x99\xCC\xBC\xCC\xAB\xCC\xA7\xCD\x88c\xCC\xB7\xCD\x83\xCC\x84\xCD\x92\xCC\x86\xCC\x83\xCC\x88\xCC\x92\xCC\x94\xCC\xBE\xCC\x9D\xCC\xAF\xCC\x98\xCC\x9D\xCC\xBB\xCD\x8E\xCC\xBB\xCC\xB3\xCC\xA3\xCD\x8E\xCD\x99\xCC\xA5\xCC\xAD\xCC\x99\xCC\xB9\xCC\xAE\xCC\xA5\xCC\x9E\xCD\x88\xCC\xAE\xCC\x9E\xCC\xA9\xCC\x97\xCC\xBC\xCC\x99\xCC\xA5\xCD\x87\xCC\x97\xCD\x8E\xCD\x94\xCC\x99\xCC\x9D\xCC\x96\xCD\x94\xCC\xAB\xCC\xA7\xCC\xA5\xCC\x98\xCC\xBB\xCC\xAF\xCC\xABe\xCC\xB7\xCC\x8E\xCC\x82\xCD\x86\xCD\x9B\xCC\x94\xCD\x83\xCC\x85\xCD\x8A\xCD\x8C\xCC\x8B\xCD\x92\xCD\x91\xCC\x8F\xCC\x81\xCD\x95\xCC\xA2\xCC\xB9\xCC\xB2\xCD\x9C\xCC\xB1\xCC\xA6\xCC\xB3\xCC\xAF\xCC\xAE\xCC\x9C\xCD\x99s\xCC\xB8\xCC\x8C\xCC\x8E\xCC\x87\xCD\x81\xCD\x82\xCC\x86\xCD\x8C\xCD\x8C\xCC\x8B\xCC\x84\xCC\x8C\xCD\x84\xCD\x9B\xCD\x86\xCC\x93\xCD\x90\xCC\x85\xCC\x94\xCD\x98\xCD\x84\xCD\x92\xCD\x8B\xCC\x90\xCC\x83\xCC\x8F\xCD\x84\xCD\x81\xCD\x9B\xCC\x90\xCD\x81\xCC\x8F\xCC\xBD\xCC\x88\xCC\xBF\xCC\x88\xCC\x84\xCC\x8E\xCD\x99\xCD\x94\xCC\x99\xCD\x99\xCC\xB0\xCC\xA8\xCC\xA3\xCC\xA8\xCC\x96\xCC\x99\xCC\xAE\xCC\xBC\xCC\x99\xCD\x9A\xCC\xB2\xCC\xB1\xCC\x9F\xCC\xBB\xCC\xA6\xCD\x85\xCC\xAA\xCD\x89\xCC\x9D\xCC\x99\xCD\x96\xCC\xB1\xCC\xB1\xCC\x99\xCC\xA6\xCC\xA5\xCD\x95\xCC\xB2\xCC\xA0\xCD\x99 within")
666  set spell spelllang=en
667  redraw
668  redraw!
669  bwipe!
670  set nospell
671endfunc
672
673func LoadAffAndDic(aff_contents, dic_contents)
674  set enc=latin1
675  set spellfile=
676  call writefile(a:aff_contents, "Xtest.aff")
677  call writefile(a:dic_contents, "Xtest.dic")
678  " Generate a .spl file from a .dic and .aff file.
679  mkspell! Xtest Xtest
680  " use that spell file
681  set spl=Xtest.latin1.spl spell
682endfunc
683
684func ListWords()
685  spelldump
686  %yank
687  quit
688  return split(@", "\n")
689endfunc
690
691func TestGoodBadBase()
692  exe '1;/^good:'
693  normal 0f:]s
694  let prevbad = ''
695  let result = []
696  while 1
697    let [bad, a] = spellbadword()
698    if bad == '' || bad == prevbad || bad == 'badend'
699      break
700    endif
701    let prevbad = bad
702    let lst = bad->spellsuggest(3)
703    normal mm
704
705    call add(result, [bad, lst])
706    normal `m]s
707  endwhile
708  return result
709endfunc
710
711func RunGoodBad(good, bad, expected_words, expected_bad_words)
712  bwipe!
713  call setline(1, ["good: ", a:good,  a:bad, " badend "])
714  let words = ListWords()
715  call assert_equal(a:expected_words, words[1:-1])
716  let bad_words = TestGoodBadBase()
717  call assert_equal(a:expected_bad_words, bad_words)
718  bwipe!
719endfunc
720
721func Test_spell_screendump()
722  CheckScreendump
723
724  let lines =<< trim END
725       call setline(1, [
726             \ "This is some text without any spell errors.  Everything",
727             \ "should just be black, nothing wrong here.",
728             \ "",
729             \ "This line has a sepll error. and missing caps.",
730             \ "And and this is the the duplication.",
731             \ "with missing caps here.",
732             \ ])
733       set spell spelllang=en_nz
734  END
735  call writefile(lines, 'XtestSpell')
736  let buf = RunVimInTerminal('-S XtestSpell', {'rows': 8})
737  call VerifyScreenDump(buf, 'Test_spell_1', {})
738
739  " clean up
740  call StopVimInTerminal(buf)
741  call delete('XtestSpell')
742endfunc
743
744let g:test_data_aff1 = [
745      \"SET ISO8859-1",
746      \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
747      \"",
748      \"FOL  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
749      \"LOW  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
750      \"UPP  \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
751      \"",
752      \"SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xBF",
753      \"SOFOTO   ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?",
754      \"",
755      \"MIDWORD\t'-",
756      \"",
757      \"KEP =",
758      \"RAR ?",
759      \"BAD !",
760      \"",
761      \"PFX I N 1",
762      \"PFX I 0 in .",
763      \"",
764      \"PFX O Y 1",
765      \"PFX O 0 out .",
766      \"",
767      \"SFX S Y 2",
768      \"SFX S 0 s [^s]",
769      \"SFX S 0 es s",
770      \"",
771      \"SFX N N 3",
772      \"SFX N 0 en [^n]",
773      \"SFX N 0 nen n",
774      \"SFX N 0 n .",
775      \"",
776      \"REP 3",
777      \"REP g ch",
778      \"REP ch g",
779      \"REP svp s.v.p.",
780      \"",
781      \"MAP 9",
782      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
783      \"MAP e\xE8\xE9\xEA\xEB",
784      \"MAP i\xEC\xED\xEE\xEF",
785      \"MAP o\xF2\xF3\xF4\xF5\xF6",
786      \"MAP u\xF9\xFA\xFB\xFC",
787      \"MAP n\xF1",
788      \"MAP c\xE7",
789      \"MAP y\xFF\xFD",
790      \"MAP s\xDF",
791      \ ]
792let g:test_data_dic1 = [
793      \"123456",
794      \"test/NO",
795      \"# comment",
796      \"wrong",
797      \"Comment",
798      \"OK",
799      \"uk",
800      \"put/ISO",
801      \"the end",
802      \"deol",
803      \"d\xE9\xF4r",
804      \ ]
805let g:test_data_aff2 = [
806      \"SET ISO8859-1",
807      \"",
808      \"FOL  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
809      \"LOW  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
810      \"UPP  \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
811      \"",
812      \"PFXPOSTPONE",
813      \"",
814      \"MIDWORD\t'-",
815      \"",
816      \"KEP =",
817      \"RAR ?",
818      \"BAD !",
819      \"",
820      \"PFX I N 1",
821      \"PFX I 0 in .",
822      \"",
823      \"PFX O Y 1",
824      \"PFX O 0 out [a-z]",
825      \"",
826      \"SFX S Y 2",
827      \"SFX S 0 s [^s]",
828      \"SFX S 0 es s",
829      \"",
830      \"SFX N N 3",
831      \"SFX N 0 en [^n]",
832      \"SFX N 0 nen n",
833      \"SFX N 0 n .",
834      \"",
835      \"REP 3",
836      \"REP g ch",
837      \"REP ch g",
838      \"REP svp s.v.p.",
839      \"",
840      \"MAP 9",
841      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
842      \"MAP e\xE8\xE9\xEA\xEB",
843      \"MAP i\xEC\xED\xEE\xEF",
844      \"MAP o\xF2\xF3\xF4\xF5\xF6",
845      \"MAP u\xF9\xFA\xFB\xFC",
846      \"MAP n\xF1",
847      \"MAP c\xE7",
848      \"MAP y\xFF\xFD",
849      \"MAP s\xDF",
850      \ ]
851let g:test_data_aff3 = [
852      \"SET ISO8859-1",
853      \"",
854      \"COMPOUNDMIN 3",
855      \"COMPOUNDRULE m*",
856      \"NEEDCOMPOUND x",
857      \ ]
858let g:test_data_dic3 = [
859      \"1234",
860      \"foo/m",
861      \"bar/mx",
862      \"m\xEF/m",
863      \"la/mx",
864      \ ]
865let g:test_data_aff4 = [
866      \"SET ISO8859-1",
867      \"",
868      \"FOL  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
869      \"LOW  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
870      \"UPP  \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
871      \"",
872      \"COMPOUNDRULE m+",
873      \"COMPOUNDRULE sm*e",
874      \"COMPOUNDRULE sm+",
875      \"COMPOUNDMIN 3",
876      \"COMPOUNDWORDMAX 3",
877      \"COMPOUNDFORBIDFLAG t",
878      \"",
879      \"COMPOUNDSYLMAX 5",
880      \"SYLLABLE a\xE1e\xE9i\xEDo\xF3\xF6\xF5u\xFA\xFC\xFBy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui",
881      \"",
882      \"MAP 9",
883      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
884      \"MAP e\xE8\xE9\xEA\xEB",
885      \"MAP i\xEC\xED\xEE\xEF",
886      \"MAP o\xF2\xF3\xF4\xF5\xF6",
887      \"MAP u\xF9\xFA\xFB\xFC",
888      \"MAP n\xF1",
889      \"MAP c\xE7",
890      \"MAP y\xFF\xFD",
891      \"MAP s\xDF",
892      \"",
893      \"NEEDAFFIX x",
894      \"",
895      \"PFXPOSTPONE",
896      \"",
897      \"MIDWORD '-",
898      \"",
899      \"SFX q N 1",
900      \"SFX q   0    -ok .",
901      \"",
902      \"SFX a Y 2",
903      \"SFX a 0 s .",
904      \"SFX a 0 ize/t .",
905      \"",
906      \"PFX p N 1",
907      \"PFX p 0 pre .",
908      \"",
909      \"PFX P N 1",
910      \"PFX P 0 nou .",
911      \ ]
912let g:test_data_dic4 = [
913      \"1234",
914      \"word/mP",
915      \"util/am",
916      \"pro/xq",
917      \"tomato/m",
918      \"bork/mp",
919      \"start/s",
920      \"end/e",
921      \ ]
922let g:test_data_aff5 = [
923      \"SET ISO8859-1",
924      \"",
925      \"FLAG long",
926      \"",
927      \"NEEDAFFIX !!",
928      \"",
929      \"COMPOUNDRULE ssmm*ee",
930      \"",
931      \"NEEDCOMPOUND xx",
932      \"COMPOUNDPERMITFLAG pp",
933      \"",
934      \"SFX 13 Y 1",
935      \"SFX 13 0 bork .",
936      \"",
937      \"SFX a1 Y 1",
938      \"SFX a1 0 a1 .",
939      \"",
940      \"SFX a\xE9 Y 1",
941      \"SFX a\xE9 0 a\xE9 .",
942      \"",
943      \"PFX zz Y 1",
944      \"PFX zz 0 pre/pp .",
945      \"",
946      \"PFX yy Y 1",
947      \"PFX yy 0 nou .",
948      \ ]
949let g:test_data_dic5 = [
950      \"1234",
951      \"foo/a1a\xE9!!",
952      \"bar/zz13ee",
953      \"start/ss",
954      \"end/eeyy",
955      \"middle/mmxx",
956      \ ]
957let g:test_data_aff6 = [
958      \"SET ISO8859-1",
959      \"",
960      \"FLAG caplong",
961      \"",
962      \"NEEDAFFIX A!",
963      \"",
964      \"COMPOUNDRULE sMm*Ee",
965      \"",
966      \"NEEDCOMPOUND Xx",
967      \"",
968      \"COMPOUNDPERMITFLAG p",
969      \"",
970      \"SFX N3 Y 1",
971      \"SFX N3 0 bork .",
972      \"",
973      \"SFX A1 Y 1",
974      \"SFX A1 0 a1 .",
975      \"",
976      \"SFX A\xE9 Y 1",
977      \"SFX A\xE9 0 a\xE9 .",
978      \"",
979      \"PFX Zz Y 1",
980      \"PFX Zz 0 pre/p .",
981      \ ]
982let g:test_data_dic6 = [
983      \"1234",
984      \"mee/A1A\xE9A!",
985      \"bar/ZzN3Ee",
986      \"lead/s",
987      \"end/Ee",
988      \"middle/MmXx",
989      \ ]
990let g:test_data_aff7 = [
991      \"SET ISO8859-1",
992      \"",
993      \"FLAG num",
994      \"",
995      \"NEEDAFFIX 9999",
996      \"",
997      \"COMPOUNDRULE 2,77*123",
998      \"",
999      \"NEEDCOMPOUND 1",
1000      \"COMPOUNDPERMITFLAG 432",
1001      \"",
1002      \"SFX 61003 Y 1",
1003      \"SFX 61003 0 meat .",
1004      \"",
1005      \"SFX 0 Y 1",
1006      \"SFX 0 0 zero .",
1007      \"",
1008      \"SFX 391 Y 1",
1009      \"SFX 391 0 a1 .",
1010      \"",
1011      \"SFX 111 Y 1",
1012      \"SFX 111 0 a\xE9 .",
1013      \"",
1014      \"PFX 17 Y 1",
1015      \"PFX 17 0 pre/432 .",
1016      \ ]
1017let g:test_data_dic7 = [
1018      \"1234",
1019      \"mee/0,391,111,9999",
1020      \"bar/17,61003,123",
1021      \"lead/2",
1022      \"tail/123",
1023      \"middle/77,1",
1024      \ ]
1025let g:test_data_aff8 = [
1026      \"SET ISO8859-1",
1027      \"",
1028      \"NOSPLITSUGS",
1029      \ ]
1030let g:test_data_dic8 = [
1031      \"1234",
1032      \"foo",
1033      \"bar",
1034      \"faabar",
1035      \ ]
1036let g:test_data_aff9 = [
1037      \ ]
1038let g:test_data_dic9 = [
1039      \"1234",
1040      \"foo",
1041      \"bar",
1042      \ ]
1043let g:test_data_aff10 = [
1044      \"COMPOUNDRULE se",
1045      \"COMPOUNDPERMITFLAG p",
1046      \"",
1047      \"SFX A Y 1",
1048      \"SFX A 0 able/Mp .",
1049      \"",
1050      \"SFX M Y 1",
1051      \"SFX M 0 s .",
1052      \ ]
1053let g:test_data_dic10 = [
1054      \"1234",
1055      \"drink/As",
1056      \"table/e",
1057      \ ]
1058let g:test_data_aff_sal = [
1059      \"SET ISO8859-1",
1060      \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
1061      \"",
1062      \"FOL  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
1063      \"LOW  \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xDF\xFF",
1064      \"UPP  \xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xFF",
1065      \"",
1066      \"MIDWORD\t'-",
1067      \"",
1068      \"KEP =",
1069      \"RAR ?",
1070      \"BAD !",
1071      \"",
1072      \"PFX I N 1",
1073      \"PFX I 0 in .",
1074      \"",
1075      \"PFX O Y 1",
1076      \"PFX O 0 out .",
1077      \"",
1078      \"SFX S Y 2",
1079      \"SFX S 0 s [^s]",
1080      \"SFX S 0 es s",
1081      \"",
1082      \"SFX N N 3",
1083      \"SFX N 0 en [^n]",
1084      \"SFX N 0 nen n",
1085      \"SFX N 0 n .",
1086      \"",
1087      \"REP 3",
1088      \"REP g ch",
1089      \"REP ch g",
1090      \"REP svp s.v.p.",
1091      \"",
1092      \"MAP 9",
1093      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
1094      \"MAP e\xE8\xE9\xEA\xEB",
1095      \"MAP i\xEC\xED\xEE\xEF",
1096      \"MAP o\xF2\xF3\xF4\xF5\xF6",
1097      \"MAP u\xF9\xFA\xFB\xFC",
1098      \"MAP n\xF1",
1099      \"MAP c\xE7",
1100      \"MAP y\xFF\xFD",
1101      \"MAP s\xDF",
1102      \"",
1103      \"SAL AH(AEIOUY)-^         *H",
1104      \"SAL AR(AEIOUY)-^         *R",
1105      \"SAL A(HR)^               *",
1106      \"SAL A^                   *",
1107      \"SAL AH(AEIOUY)-          H",
1108      \"SAL AR(AEIOUY)-          R",
1109      \"SAL A(HR)                _",
1110      \"SAL \xC0^                   *",
1111      \"SAL \xC5^                   *",
1112      \"SAL BB-                  _",
1113      \"SAL B                    B",
1114      \"SAL CQ-                  _",
1115      \"SAL CIA                  X",
1116      \"SAL CH                   X",
1117      \"SAL C(EIY)-              S",
1118      \"SAL CK                   K",
1119      \"SAL COUGH^               KF",
1120      \"SAL CC<                  C",
1121      \"SAL C                    K",
1122      \"SAL DG(EIY)              K",
1123      \"SAL DD-                  _",
1124      \"SAL D                    T",
1125      \"SAL \xC9<                   E",
1126      \"SAL EH(AEIOUY)-^         *H",
1127      \"SAL ER(AEIOUY)-^         *R",
1128      \"SAL E(HR)^               *",
1129      \"SAL ENOUGH^$             *NF",
1130      \"SAL E^                   *",
1131      \"SAL EH(AEIOUY)-          H",
1132      \"SAL ER(AEIOUY)-          R",
1133      \"SAL E(HR)                _",
1134      \"SAL FF-                  _",
1135      \"SAL F                    F",
1136      \"SAL GN^                  N",
1137      \"SAL GN$                  N",
1138      \"SAL GNS$                 NS",
1139      \"SAL GNED$                N",
1140      \"SAL GH(AEIOUY)-          K",
1141      \"SAL GH                   _",
1142      \"SAL GG9                  K",
1143      \"SAL G                    K",
1144      \"SAL H                    H",
1145      \"SAL IH(AEIOUY)-^         *H",
1146      \"SAL IR(AEIOUY)-^         *R",
1147      \"SAL I(HR)^               *",
1148      \"SAL I^                   *",
1149      \"SAL ING6                 N",
1150      \"SAL IH(AEIOUY)-          H",
1151      \"SAL IR(AEIOUY)-          R",
1152      \"SAL I(HR)                _",
1153      \"SAL J                    K",
1154      \"SAL KN^                  N",
1155      \"SAL KK-                  _",
1156      \"SAL K                    K",
1157      \"SAL LAUGH^               LF",
1158      \"SAL LL-                  _",
1159      \"SAL L                    L",
1160      \"SAL MB$                  M",
1161      \"SAL MM                   M",
1162      \"SAL M                    M",
1163      \"SAL NN-                  _",
1164      \"SAL N                    N",
1165      \"SAL OH(AEIOUY)-^         *H",
1166      \"SAL OR(AEIOUY)-^         *R",
1167      \"SAL O(HR)^               *",
1168      \"SAL O^                   *",
1169      \"SAL OH(AEIOUY)-          H",
1170      \"SAL OR(AEIOUY)-          R",
1171      \"SAL O(HR)                _",
1172      \"SAL PH                   F",
1173      \"SAL PN^                  N",
1174      \"SAL PP-                  _",
1175      \"SAL P                    P",
1176      \"SAL Q                    K",
1177      \"SAL RH^                  R",
1178      \"SAL ROUGH^               RF",
1179      \"SAL RR-                  _",
1180      \"SAL R                    R",
1181      \"SAL SCH(EOU)-            SK",
1182      \"SAL SC(IEY)-             S",
1183      \"SAL SH                   X",
1184      \"SAL SI(AO)-              X",
1185      \"SAL SS-                  _",
1186      \"SAL S                    S",
1187      \"SAL TI(AO)-              X",
1188      \"SAL TH                   @",
1189      \"SAL TCH--                _",
1190      \"SAL TOUGH^               TF",
1191      \"SAL TT-                  _",
1192      \"SAL T                    T",
1193      \"SAL UH(AEIOUY)-^         *H",
1194      \"SAL UR(AEIOUY)-^         *R",
1195      \"SAL U(HR)^               *",
1196      \"SAL U^                   *",
1197      \"SAL UH(AEIOUY)-          H",
1198      \"SAL UR(AEIOUY)-          R",
1199      \"SAL U(HR)                _",
1200      \"SAL V^                   W",
1201      \"SAL V                    F",
1202      \"SAL WR^                  R",
1203      \"SAL WH^                  W",
1204      \"SAL W(AEIOU)-            W",
1205      \"SAL X^                   S",
1206      \"SAL X                    KS",
1207      \"SAL Y(AEIOU)-            Y",
1208      \"SAL ZZ-                  _",
1209      \"SAL Z                    S",
1210      \ ]
1211
1212" vim: shiftwidth=2 sts=2 expandtab
1213