xref: /vim-8.2.3635/src/testdir/test_spell.vim (revision 96f45c0b)
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  set spelllang=en
81  call assert_equal(['', ''],            spellbadword('centre'))
82  call assert_equal(['', ''],            spellbadword('center'))
83  set spelllang=en_us
84  call assert_equal(['centre', 'local'], spellbadword('centre'))
85  call assert_equal(['', ''],            spellbadword('center'))
86  set spelllang=en_gb
87  call assert_equal(['', ''],            spellbadword('centre'))
88  call assert_equal(['center', 'local'], spellbadword('center'))
89
90  " Create a small word list to test that spellbadword('...')
91  " can return ['...', 'rare'].
92  e Xwords
93  insert
94foo
95foobar/?
96.
97   w!
98   mkspell! Xwords.spl Xwords
99   set spelllang=Xwords.spl
100   call assert_equal(['foobar', 'rare'], spellbadword('foo foobar'))
101
102  " Typo should not be detected without the 'spell' option.
103  set spelllang=en_gb nospell
104  call assert_equal(['', ''], spellbadword('centre'))
105  call assert_equal(['', ''], spellbadword('My bycycle.'))
106  call assert_equal(['', ''], spellbadword('A sentence. another sentence'))
107
108  call delete('Xwords.spl')
109  call delete('Xwords')
110  set spelllang&
111  set spell&
112endfunc
113
114func Test_spellreall()
115  new
116  set spell
117  call assert_fails('spellrepall', 'E752:')
118  call setline(1, ['A speling mistake. The same speling mistake.',
119        \                'Another speling mistake.'])
120  call feedkeys(']s1z=', 'tx')
121  call assert_equal('A spelling mistake. The same speling mistake.', getline(1))
122  call assert_equal('Another speling mistake.', getline(2))
123  spellrepall
124  call assert_equal('A spelling mistake. The same spelling mistake.', getline(1))
125  call assert_equal('Another spelling mistake.', getline(2))
126  call assert_fails('spellrepall', 'E753:')
127  set spell&
128  bwipe!
129endfunc
130
131func Test_spellinfo()
132  new
133  let runtime = substitute($VIMRUNTIME, '\\', '/', 'g')
134
135  set enc=latin1 spell spelllang=en
136  call assert_match("^\nfile: " .. runtime .. "/spell/en.latin1.spl\n$", execute('spellinfo'))
137
138  set enc=cp1250 spell spelllang=en
139  call assert_match("^\nfile: " .. runtime .. "/spell/en.ascii.spl\n$", execute('spellinfo'))
140
141  set enc=utf-8 spell spelllang=en
142  call assert_match("^\nfile: " .. runtime .. "/spell/en.utf-8.spl\n$", execute('spellinfo'))
143
144  set enc=latin1 spell spelllang=en_us,en_nz
145  call assert_match("^\n" .
146                 \  "file: " .. runtime .. "/spell/en.latin1.spl\n" .
147                 \  "file: " .. runtime.. "/spell/en.latin1.spl\n$", execute('spellinfo'))
148
149  set spell spelllang=
150  call assert_fails('spellinfo', 'E756:')
151
152  set nospell spelllang=en
153  call assert_fails('spellinfo', 'E756:')
154
155  call assert_fails('set spelllang=foo/bar', 'E474:')
156  call assert_fails('set spelllang=foo\ bar', 'E474:')
157  call assert_fails("set spelllang=foo\\\nbar", 'E474:')
158  call assert_fails("set spelllang=foo\\\rbar", 'E474:')
159  call assert_fails("set spelllang=foo+bar", 'E474:')
160
161  set enc& spell& spelllang&
162  bwipe
163endfunc
164
165func Test_zz_basic()
166  call LoadAffAndDic(g:test_data_aff1, g:test_data_dic1)
167  call RunGoodBad("wrong OK puts. Test the end",
168        \ "bad: inputs comment ok Ok. test d\xE9\xF4l end the",
169        \["Comment", "deol", "d\xE9\xF4r", "input", "OK", "output", "outputs", "outtest", "put", "puts",
170        \  "test", "testen", "testn", "the end", "uk", "wrong"],
171        \[
172        \   ["bad", ["put", "uk", "OK"]],
173        \   ["inputs", ["input", "puts", "outputs"]],
174        \   ["comment", ["Comment", "outtest", "the end"]],
175        \   ["ok", ["OK", "uk", "put"]],
176        \   ["Ok", ["OK", "Uk", "Put"]],
177        \   ["test", ["Test", "testn", "testen"]],
178        \   ["d\xE9\xF4l", ["deol", "d\xE9\xF4r", "test"]],
179        \   ["end", ["put", "uk", "test"]],
180        \   ["the", ["put", "uk", "test"]],
181        \ ]
182        \ )
183
184  call assert_equal("gebletegek", soundfold('goobledygoook'))
185  call assert_equal("kepereneven", 'k�op�r�n�ven'->soundfold())
186  call assert_equal("everles gesvets etele", soundfold('oeverloos gezwets edale'))
187endfunc
188
189" Postponed prefixes
190func Test_zz_prefixes()
191  call LoadAffAndDic(g:test_data_aff2, g:test_data_dic1)
192  call RunGoodBad("puts",
193        \ "bad: inputs comment ok Ok end the. test d\xE9\xF4l",
194        \ ["Comment", "deol", "d\xE9\xF4r", "OK", "put", "input", "output", "puts", "outputs", "test", "outtest", "testen", "testn", "the end", "uk", "wrong"],
195        \ [
196        \   ["bad", ["put", "uk", "OK"]],
197        \   ["inputs", ["input", "puts", "outputs"]],
198        \   ["comment", ["Comment"]],
199        \   ["ok", ["OK", "uk", "put"]],
200        \   ["Ok", ["OK", "Uk", "Put"]],
201        \   ["end", ["put", "uk", "deol"]],
202        \   ["the", ["put", "uk", "test"]],
203        \   ["test", ["Test", "testn", "testen"]],
204        \   ["d\xE9\xF4l", ["deol", "d\xE9\xF4r", "test"]],
205        \ ])
206endfunc
207
208"Compound words
209func Test_zz_compound()
210  call LoadAffAndDic(g:test_data_aff3, g:test_data_dic3)
211  call RunGoodBad("foo m\xEF foobar foofoobar barfoo barbarfoo",
212        \ "bad: bar la foom\xEF barm\xEF m\xEFfoo m\xEFbar m\xEFm\xEF lala m\xEFla lam\xEF foola labar",
213        \ ["foo", "m\xEF"],
214        \ [
215        \   ["bad", ["foo", "m\xEF"]],
216        \   ["bar", ["barfoo", "foobar", "foo"]],
217        \   ["la", ["m\xEF", "foo"]],
218        \   ["foom\xEF", ["foo m\xEF", "foo", "foofoo"]],
219        \   ["barm\xEF", ["barfoo", "m\xEF", "barbar"]],
220        \   ["m\xEFfoo", ["m\xEF foo", "foo", "foofoo"]],
221        \   ["m\xEFbar", ["foobar", "barbar", "m\xEF"]],
222        \   ["m\xEFm\xEF", ["m\xEF m\xEF", "m\xEF"]],
223        \   ["lala", []],
224        \   ["m\xEFla", ["m\xEF", "m\xEF m\xEF"]],
225        \   ["lam\xEF", ["m\xEF", "m\xEF m\xEF"]],
226        \   ["foola", ["foo", "foobar", "foofoo"]],
227        \   ["labar", ["barbar", "foobar"]],
228        \ ])
229
230  call LoadAffAndDic(g:test_data_aff4, g:test_data_dic4)
231  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",
232        \ "bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato endstart endend startstart wordend wordstart preborkprebork  preborkpreborkbork startwordwordwordwordend borkpreborkpreborkbork utilsbork  startnouword",
233        \ ["bork", "prebork", "end", "pro-ok", "start", "tomato", "util", "utilize", "utils", "word", "nouword"],
234        \ [
235        \   ["bad", ["end", "bork", "word"]],
236        \   ["wordutilize", ["word utilize", "wordutils", "wordutil"]],
237        \   ["pro", ["bork", "word", "end"]],
238        \   ["borkborkborkborkborkbork", ["bork borkborkborkborkbork", "borkbork borkborkborkbork", "borkborkbork borkborkbork"]],
239        \   ["tomatotomatotomato", ["tomato tomatotomato", "tomatotomato tomato", "tomato tomato tomato"]],
240        \   ["endstart", ["end start", "start"]],
241        \   ["endend", ["end end", "end"]],
242        \   ["startstart", ["start start"]],
243        \   ["wordend", ["word end", "word", "wordword"]],
244        \   ["wordstart", ["word start", "bork start"]],
245        \   ["preborkprebork", ["prebork prebork", "preborkbork", "preborkborkbork"]],
246        \   ["preborkpreborkbork", ["prebork preborkbork", "preborkborkbork", "preborkborkborkbork"]],
247        \   ["startwordwordwordwordend", ["startwordwordwordword end", "startwordwordwordword", "start wordwordwordword end"]],
248        \   ["borkpreborkpreborkbork", ["bork preborkpreborkbork", "bork prebork preborkbork", "bork preborkprebork bork"]],
249        \   ["utilsbork", ["utilbork", "utils bork", "util bork"]],
250        \   ["startnouword", ["start nouword", "startword", "startborkword"]],
251        \ ])
252
253endfunc
254
255"Test affix flags with two characters
256func Test_zz_affix()
257  call LoadAffAndDic(g:test_data_aff5, g:test_data_dic5)
258  call RunGoodBad("fooa1 fooa\xE9 bar prebar barbork prebarbork  startprebar start end startend  startmiddleend nouend",
259        \ "bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart startprobar startnouend",
260        \ ["bar", "barbork", "end", "fooa1", "fooa\xE9", "nouend", "prebar", "prebarbork", "start"],
261        \ [
262        \   ["bad", ["bar", "end", "fooa1"]],
263        \   ["foo", ["fooa1", "fooa\xE9", "bar"]],
264        \   ["fooa2", ["fooa1", "fooa\xE9", "bar"]],
265        \   ["prabar", ["prebar", "bar", "bar bar"]],
266        \   ["probarbirk", ["prebarbork"]],
267        \   ["middle", []],
268        \   ["startmiddle", ["startmiddleend", "startmiddlebar"]],
269        \   ["middleend", []],
270        \   ["endstart", ["end start", "start"]],
271        \   ["startprobar", ["startprebar", "start prebar", "startbar"]],
272        \   ["startnouend", ["start nouend", "startend"]],
273        \ ])
274
275  call LoadAffAndDic(g:test_data_aff6, g:test_data_dic6)
276  call RunGoodBad("meea1 meea\xE9 bar prebar barbork prebarbork  leadprebar lead end leadend  leadmiddleend",
277        \  "bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead leadprobar",
278        \ ["bar", "barbork", "end", "lead", "meea1", "meea\xE9", "prebar", "prebarbork"],
279        \ [
280        \   ["bad", ["bar", "end", "lead"]],
281        \   ["mee", ["meea1", "meea\xE9", "bar"]],
282        \   ["meea2", ["meea1", "meea\xE9", "lead"]],
283        \   ["prabar", ["prebar", "bar", "leadbar"]],
284        \   ["probarbirk", ["prebarbork"]],
285        \   ["middle", []],
286        \   ["leadmiddle", ["leadmiddleend", "leadmiddlebar"]],
287        \   ["middleend", []],
288        \   ["endlead", ["end lead", "lead", "end end"]],
289        \   ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
290        \ ])
291
292  call LoadAffAndDic(g:test_data_aff7, g:test_data_dic7)
293  call RunGoodBad("meea1 meea\xE9 bar prebar barmeat prebarmeat  leadprebar lead tail leadtail  leadmiddletail",
294        \ "bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead leadprobar",
295        \ ["bar", "barmeat", "lead", "meea1", "meea\xE9", "prebar", "prebarmeat", "tail"],
296        \ [
297        \   ["bad", ["bar", "lead", "tail"]],
298        \   ["mee", ["meea1", "meea\xE9", "bar"]],
299        \   ["meea2", ["meea1", "meea\xE9", "lead"]],
300        \   ["prabar", ["prebar", "bar", "leadbar"]],
301        \   ["probarmaat", ["prebarmeat"]],
302        \   ["middle", []],
303        \   ["leadmiddle", ["leadmiddlebar"]],
304        \   ["middletail", []],
305        \   ["taillead", ["tail lead", "tail"]],
306        \   ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
307        \ ])
308endfunc
309
310func Test_zz_NOSLITSUGS()
311  call LoadAffAndDic(g:test_data_aff8, g:test_data_dic8)
312  call RunGoodBad("foo bar faabar", "bad: foobar barfoo",
313        \ ["bar", "faabar", "foo"],
314        \ [
315        \   ["bad", ["bar", "foo"]],
316        \   ["foobar", ["faabar", "foo bar", "bar"]],
317        \   ["barfoo", ["bar foo", "bar", "foo"]],
318        \ ])
319endfunc
320
321" Numbers
322func Test_zz_Numbers()
323  call LoadAffAndDic(g:test_data_aff9, g:test_data_dic9)
324  call RunGoodBad("0b1011 0777 1234 0x01ff", "",
325        \ ["bar", "foo"],
326        \ [
327        \ ])
328endfunc
329
330function FirstSpellWord()
331  call feedkeys("/^start:\n", 'tx')
332  normal ]smm
333  let [str, a] = spellbadword()
334  return str
335endfunc
336
337function SecondSpellWord()
338  normal `m]s
339  let [str, a] = spellbadword()
340  return str
341endfunc
342
343"Test with SAL instead of SOFO items; test automatic reloading
344func Test_zz_sal_and_addition()
345  set enc=latin1
346  set spellfile=
347  call writefile(g:test_data_dic1, "Xtest.dic")
348  call writefile(g:test_data_aff_sal, "Xtest.aff")
349  mkspell! Xtest Xtest
350  set spl=Xtest.latin1.spl spell
351  call assert_equal('kbltykk', soundfold('goobledygoook'))
352  call assert_equal('kprnfn', soundfold('k�op�r�n�ven'))
353  call assert_equal('*fls kswts tl', soundfold('oeverloos gezwets edale'))
354
355  "also use an addition file
356  call writefile(["/regions=usgbnz", "elequint/2", "elekwint/3"], "Xtest.latin1.add")
357  mkspell! Xtest.latin1.add.spl Xtest.latin1.add
358
359  bwipe!
360  call setline(1, ["start: elequint test elekwint test elekwent asdf"])
361
362  set spellfile=Xtest.latin1.add
363  call assert_equal("elekwent", FirstSpellWord())
364
365  set spl=Xtest_us.latin1.spl
366  call assert_equal("elequint", FirstSpellWord())
367  call assert_equal("elekwint", SecondSpellWord())
368
369  set spl=Xtest_gb.latin1.spl
370  call assert_equal("elekwint", FirstSpellWord())
371  call assert_equal("elekwent", SecondSpellWord())
372
373  set spl=Xtest_nz.latin1.spl
374  call assert_equal("elequint", FirstSpellWord())
375  call assert_equal("elekwent", SecondSpellWord())
376
377  set spl=Xtest_ca.latin1.spl
378  call assert_equal("elequint", FirstSpellWord())
379  call assert_equal("elekwint", SecondSpellWord())
380endfunc
381
382func Test_spellfile_value()
383  set spellfile=Xdir/Xtest.latin1.add
384  set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add
385endfunc
386
387func Test_region_error()
388  messages clear
389  call writefile(["/regions=usgbnz", "elequint/0"], "Xtest.latin1.add")
390  mkspell! Xtest.latin1.add.spl Xtest.latin1.add
391  call assert_match('Invalid region nr in Xtest.latin1.add line 2: 0', execute('messages'))
392  call delete('Xtest.latin1.add')
393  call delete('Xtest.latin1.add.spl')
394endfunc
395
396" Check using z= in new buffer (crash fixed by patch 7.4a.028).
397func Test_zeq_crash()
398  new
399  set maxmem=512 spell
400  call feedkeys('iasdz=:\"', 'tx')
401
402  bwipe!
403endfunc
404
405" Check handling a word longer than MAXWLEN.
406func Test_spell_long_word()
407  set enc=utf-8
408  new
409  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")
410  set spell spelllang=en
411  redraw
412  redraw!
413  bwipe!
414  set nospell
415endfunc
416
417func LoadAffAndDic(aff_contents, dic_contents)
418  set enc=latin1
419  set spellfile=
420  call writefile(a:aff_contents, "Xtest.aff")
421  call writefile(a:dic_contents, "Xtest.dic")
422  " Generate a .spl file from a .dic and .aff file.
423  mkspell! Xtest Xtest
424  " use that spell file
425  set spl=Xtest.latin1.spl spell
426endfunc
427
428func ListWords()
429  spelldump
430  %yank
431  quit
432  return split(@", "\n")
433endfunc
434
435func TestGoodBadBase()
436  exe '1;/^good:'
437  normal 0f:]s
438  let prevbad = ''
439  let result = []
440  while 1
441    let [bad, a] = spellbadword()
442    if bad == '' || bad == prevbad || bad == 'badend'
443      break
444    endif
445    let prevbad = bad
446    let lst = bad->spellsuggest(3)
447    normal mm
448
449    call add(result, [bad, lst])
450    normal `m]s
451  endwhile
452  return result
453endfunc
454
455func RunGoodBad(good, bad, expected_words, expected_bad_words)
456  bwipe!
457  call setline(1, ["good: ", a:good,  a:bad, " badend "])
458  let words = ListWords()
459  call assert_equal(a:expected_words, words[1:-1])
460  let bad_words = TestGoodBadBase()
461  call assert_equal(a:expected_bad_words, bad_words)
462  bwipe!
463endfunc
464
465func Test_spell_screendump()
466  CheckScreendump
467
468  let lines =<< trim END
469       call setline(1, [
470             \ "This is some text without any spell errors.  Everything",
471             \ "should just be black, nothing wrong here.",
472             \ "",
473             \ "This line has a sepll error. and missing caps.",
474             \ "And and this is the the duplication.",
475             \ "with missing caps here.",
476             \ ])
477       set spell spelllang=en_nz
478  END
479  call writefile(lines, 'XtestSpell')
480  let buf = RunVimInTerminal('-S XtestSpell', {'rows': 8})
481  call VerifyScreenDump(buf, 'Test_spell_1', {})
482
483  " clean up
484  call StopVimInTerminal(buf)
485  call delete('XtestSpell')
486endfunc
487
488let g:test_data_aff1 = [
489      \"SET ISO8859-1",
490      \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
491      \"",
492      \"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",
493      \"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",
494      \"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",
495      \"",
496      \"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",
497      \"SOFOTO   ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?",
498      \"",
499      \"MIDWORD\t'-",
500      \"",
501      \"KEP =",
502      \"RAR ?",
503      \"BAD !",
504      \"",
505      \"PFX I N 1",
506      \"PFX I 0 in .",
507      \"",
508      \"PFX O Y 1",
509      \"PFX O 0 out .",
510      \"",
511      \"SFX S Y 2",
512      \"SFX S 0 s [^s]",
513      \"SFX S 0 es s",
514      \"",
515      \"SFX N N 3",
516      \"SFX N 0 en [^n]",
517      \"SFX N 0 nen n",
518      \"SFX N 0 n .",
519      \"",
520      \"REP 3",
521      \"REP g ch",
522      \"REP ch g",
523      \"REP svp s.v.p.",
524      \"",
525      \"MAP 9",
526      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
527      \"MAP e\xE8\xE9\xEA\xEB",
528      \"MAP i\xEC\xED\xEE\xEF",
529      \"MAP o\xF2\xF3\xF4\xF5\xF6",
530      \"MAP u\xF9\xFA\xFB\xFC",
531      \"MAP n\xF1",
532      \"MAP c\xE7",
533      \"MAP y\xFF\xFD",
534      \"MAP s\xDF",
535      \ ]
536let g:test_data_dic1 = [
537      \"123456",
538      \"test/NO",
539      \"# comment",
540      \"wrong",
541      \"Comment",
542      \"OK",
543      \"uk",
544      \"put/ISO",
545      \"the end",
546      \"deol",
547      \"d\xE9\xF4r",
548      \ ]
549let g:test_data_aff2 = [
550      \"SET ISO8859-1",
551      \"",
552      \"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",
553      \"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",
554      \"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",
555      \"",
556      \"PFXPOSTPONE",
557      \"",
558      \"MIDWORD\t'-",
559      \"",
560      \"KEP =",
561      \"RAR ?",
562      \"BAD !",
563      \"",
564      \"PFX I N 1",
565      \"PFX I 0 in .",
566      \"",
567      \"PFX O Y 1",
568      \"PFX O 0 out [a-z]",
569      \"",
570      \"SFX S Y 2",
571      \"SFX S 0 s [^s]",
572      \"SFX S 0 es s",
573      \"",
574      \"SFX N N 3",
575      \"SFX N 0 en [^n]",
576      \"SFX N 0 nen n",
577      \"SFX N 0 n .",
578      \"",
579      \"REP 3",
580      \"REP g ch",
581      \"REP ch g",
582      \"REP svp s.v.p.",
583      \"",
584      \"MAP 9",
585      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
586      \"MAP e\xE8\xE9\xEA\xEB",
587      \"MAP i\xEC\xED\xEE\xEF",
588      \"MAP o\xF2\xF3\xF4\xF5\xF6",
589      \"MAP u\xF9\xFA\xFB\xFC",
590      \"MAP n\xF1",
591      \"MAP c\xE7",
592      \"MAP y\xFF\xFD",
593      \"MAP s\xDF",
594      \ ]
595let g:test_data_aff3 = [
596      \"SET ISO8859-1",
597      \"",
598      \"COMPOUNDMIN 3",
599      \"COMPOUNDRULE m*",
600      \"NEEDCOMPOUND x",
601      \ ]
602let g:test_data_dic3 = [
603      \"1234",
604      \"foo/m",
605      \"bar/mx",
606      \"m\xEF/m",
607      \"la/mx",
608      \ ]
609let g:test_data_aff4 = [
610      \"SET ISO8859-1",
611      \"",
612      \"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",
613      \"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",
614      \"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",
615      \"",
616      \"COMPOUNDRULE m+",
617      \"COMPOUNDRULE sm*e",
618      \"COMPOUNDRULE sm+",
619      \"COMPOUNDMIN 3",
620      \"COMPOUNDWORDMAX 3",
621      \"COMPOUNDFORBIDFLAG t",
622      \"",
623      \"COMPOUNDSYLMAX 5",
624      \"SYLLABLE a\xE1e\xE9i\xEDo\xF3\xF6\xF5u\xFA\xFC\xFBy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui",
625      \"",
626      \"MAP 9",
627      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
628      \"MAP e\xE8\xE9\xEA\xEB",
629      \"MAP i\xEC\xED\xEE\xEF",
630      \"MAP o\xF2\xF3\xF4\xF5\xF6",
631      \"MAP u\xF9\xFA\xFB\xFC",
632      \"MAP n\xF1",
633      \"MAP c\xE7",
634      \"MAP y\xFF\xFD",
635      \"MAP s\xDF",
636      \"",
637      \"NEEDAFFIX x",
638      \"",
639      \"PFXPOSTPONE",
640      \"",
641      \"MIDWORD '-",
642      \"",
643      \"SFX q N 1",
644      \"SFX q   0    -ok .",
645      \"",
646      \"SFX a Y 2",
647      \"SFX a 0 s .",
648      \"SFX a 0 ize/t .",
649      \"",
650      \"PFX p N 1",
651      \"PFX p 0 pre .",
652      \"",
653      \"PFX P N 1",
654      \"PFX P 0 nou .",
655      \ ]
656let g:test_data_dic4 = [
657      \"1234",
658      \"word/mP",
659      \"util/am",
660      \"pro/xq",
661      \"tomato/m",
662      \"bork/mp",
663      \"start/s",
664      \"end/e",
665      \ ]
666let g:test_data_aff5 = [
667      \"SET ISO8859-1",
668      \"",
669      \"FLAG long",
670      \"",
671      \"NEEDAFFIX !!",
672      \"",
673      \"COMPOUNDRULE ssmm*ee",
674      \"",
675      \"NEEDCOMPOUND xx",
676      \"COMPOUNDPERMITFLAG pp",
677      \"",
678      \"SFX 13 Y 1",
679      \"SFX 13 0 bork .",
680      \"",
681      \"SFX a1 Y 1",
682      \"SFX a1 0 a1 .",
683      \"",
684      \"SFX a\xE9 Y 1",
685      \"SFX a\xE9 0 a\xE9 .",
686      \"",
687      \"PFX zz Y 1",
688      \"PFX zz 0 pre/pp .",
689      \"",
690      \"PFX yy Y 1",
691      \"PFX yy 0 nou .",
692      \ ]
693let g:test_data_dic5 = [
694      \"1234",
695      \"foo/a1a\xE9!!",
696      \"bar/zz13ee",
697      \"start/ss",
698      \"end/eeyy",
699      \"middle/mmxx",
700      \ ]
701let g:test_data_aff6 = [
702      \"SET ISO8859-1",
703      \"",
704      \"FLAG caplong",
705      \"",
706      \"NEEDAFFIX A!",
707      \"",
708      \"COMPOUNDRULE sMm*Ee",
709      \"",
710      \"NEEDCOMPOUND Xx",
711      \"",
712      \"COMPOUNDPERMITFLAG p",
713      \"",
714      \"SFX N3 Y 1",
715      \"SFX N3 0 bork .",
716      \"",
717      \"SFX A1 Y 1",
718      \"SFX A1 0 a1 .",
719      \"",
720      \"SFX A\xE9 Y 1",
721      \"SFX A\xE9 0 a\xE9 .",
722      \"",
723      \"PFX Zz Y 1",
724      \"PFX Zz 0 pre/p .",
725      \ ]
726let g:test_data_dic6 = [
727      \"1234",
728      \"mee/A1A\xE9A!",
729      \"bar/ZzN3Ee",
730      \"lead/s",
731      \"end/Ee",
732      \"middle/MmXx",
733      \ ]
734let g:test_data_aff7 = [
735      \"SET ISO8859-1",
736      \"",
737      \"FLAG num",
738      \"",
739      \"NEEDAFFIX 9999",
740      \"",
741      \"COMPOUNDRULE 2,77*123",
742      \"",
743      \"NEEDCOMPOUND 1",
744      \"COMPOUNDPERMITFLAG 432",
745      \"",
746      \"SFX 61003 Y 1",
747      \"SFX 61003 0 meat .",
748      \"",
749      \"SFX 391 Y 1",
750      \"SFX 391 0 a1 .",
751      \"",
752      \"SFX 111 Y 1",
753      \"SFX 111 0 a\xE9 .",
754      \"",
755      \"PFX 17 Y 1",
756      \"PFX 17 0 pre/432 .",
757      \ ]
758let g:test_data_dic7 = [
759      \"1234",
760      \"mee/391,111,9999",
761      \"bar/17,61003,123",
762      \"lead/2",
763      \"tail/123",
764      \"middle/77,1",
765      \ ]
766let g:test_data_aff8 = [
767      \"SET ISO8859-1",
768      \"",
769      \"NOSPLITSUGS",
770      \ ]
771let g:test_data_dic8 = [
772      \"1234",
773      \"foo",
774      \"bar",
775      \"faabar",
776      \ ]
777let g:test_data_aff9 = [
778      \ ]
779let g:test_data_dic9 = [
780      \"1234",
781      \"foo",
782      \"bar",
783      \ ]
784let g:test_data_aff_sal = [
785      \"SET ISO8859-1",
786      \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
787      \"",
788      \"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",
789      \"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",
790      \"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",
791      \"",
792      \"MIDWORD\t'-",
793      \"",
794      \"KEP =",
795      \"RAR ?",
796      \"BAD !",
797      \"",
798      \"PFX I N 1",
799      \"PFX I 0 in .",
800      \"",
801      \"PFX O Y 1",
802      \"PFX O 0 out .",
803      \"",
804      \"SFX S Y 2",
805      \"SFX S 0 s [^s]",
806      \"SFX S 0 es s",
807      \"",
808      \"SFX N N 3",
809      \"SFX N 0 en [^n]",
810      \"SFX N 0 nen n",
811      \"SFX N 0 n .",
812      \"",
813      \"REP 3",
814      \"REP g ch",
815      \"REP ch g",
816      \"REP svp s.v.p.",
817      \"",
818      \"MAP 9",
819      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
820      \"MAP e\xE8\xE9\xEA\xEB",
821      \"MAP i\xEC\xED\xEE\xEF",
822      \"MAP o\xF2\xF3\xF4\xF5\xF6",
823      \"MAP u\xF9\xFA\xFB\xFC",
824      \"MAP n\xF1",
825      \"MAP c\xE7",
826      \"MAP y\xFF\xFD",
827      \"MAP s\xDF",
828      \"",
829      \"SAL AH(AEIOUY)-^         *H",
830      \"SAL AR(AEIOUY)-^         *R",
831      \"SAL A(HR)^               *",
832      \"SAL A^                   *",
833      \"SAL AH(AEIOUY)-          H",
834      \"SAL AR(AEIOUY)-          R",
835      \"SAL A(HR)                _",
836      \"SAL \xC0^                   *",
837      \"SAL \xC5^                   *",
838      \"SAL BB-                  _",
839      \"SAL B                    B",
840      \"SAL CQ-                  _",
841      \"SAL CIA                  X",
842      \"SAL CH                   X",
843      \"SAL C(EIY)-              S",
844      \"SAL CK                   K",
845      \"SAL COUGH^               KF",
846      \"SAL CC<                  C",
847      \"SAL C                    K",
848      \"SAL DG(EIY)              K",
849      \"SAL DD-                  _",
850      \"SAL D                    T",
851      \"SAL \xC9<                   E",
852      \"SAL EH(AEIOUY)-^         *H",
853      \"SAL ER(AEIOUY)-^         *R",
854      \"SAL E(HR)^               *",
855      \"SAL ENOUGH^$             *NF",
856      \"SAL E^                   *",
857      \"SAL EH(AEIOUY)-          H",
858      \"SAL ER(AEIOUY)-          R",
859      \"SAL E(HR)                _",
860      \"SAL FF-                  _",
861      \"SAL F                    F",
862      \"SAL GN^                  N",
863      \"SAL GN$                  N",
864      \"SAL GNS$                 NS",
865      \"SAL GNED$                N",
866      \"SAL GH(AEIOUY)-          K",
867      \"SAL GH                   _",
868      \"SAL GG9                  K",
869      \"SAL G                    K",
870      \"SAL H                    H",
871      \"SAL IH(AEIOUY)-^         *H",
872      \"SAL IR(AEIOUY)-^         *R",
873      \"SAL I(HR)^               *",
874      \"SAL I^                   *",
875      \"SAL ING6                 N",
876      \"SAL IH(AEIOUY)-          H",
877      \"SAL IR(AEIOUY)-          R",
878      \"SAL I(HR)                _",
879      \"SAL J                    K",
880      \"SAL KN^                  N",
881      \"SAL KK-                  _",
882      \"SAL K                    K",
883      \"SAL LAUGH^               LF",
884      \"SAL LL-                  _",
885      \"SAL L                    L",
886      \"SAL MB$                  M",
887      \"SAL MM                   M",
888      \"SAL M                    M",
889      \"SAL NN-                  _",
890      \"SAL N                    N",
891      \"SAL OH(AEIOUY)-^         *H",
892      \"SAL OR(AEIOUY)-^         *R",
893      \"SAL O(HR)^               *",
894      \"SAL O^                   *",
895      \"SAL OH(AEIOUY)-          H",
896      \"SAL OR(AEIOUY)-          R",
897      \"SAL O(HR)                _",
898      \"SAL PH                   F",
899      \"SAL PN^                  N",
900      \"SAL PP-                  _",
901      \"SAL P                    P",
902      \"SAL Q                    K",
903      \"SAL RH^                  R",
904      \"SAL ROUGH^               RF",
905      \"SAL RR-                  _",
906      \"SAL R                    R",
907      \"SAL SCH(EOU)-            SK",
908      \"SAL SC(IEY)-             S",
909      \"SAL SH                   X",
910      \"SAL SI(AO)-              X",
911      \"SAL SS-                  _",
912      \"SAL S                    S",
913      \"SAL TI(AO)-              X",
914      \"SAL TH                   @",
915      \"SAL TCH--                _",
916      \"SAL TOUGH^               TF",
917      \"SAL TT-                  _",
918      \"SAL T                    T",
919      \"SAL UH(AEIOUY)-^         *H",
920      \"SAL UR(AEIOUY)-^         *R",
921      \"SAL U(HR)^               *",
922      \"SAL U^                   *",
923      \"SAL UH(AEIOUY)-          H",
924      \"SAL UR(AEIOUY)-          R",
925      \"SAL U(HR)                _",
926      \"SAL V^                   W",
927      \"SAL V                    F",
928      \"SAL WR^                  R",
929      \"SAL WH^                  W",
930      \"SAL W(AEIOU)-            W",
931      \"SAL X^                   S",
932      \"SAL X                    KS",
933      \"SAL Y(AEIOU)-            Y",
934      \"SAL ZZ-                  _",
935      \"SAL Z                    S",
936      \ ]
937