changeset 21608:24cb89db078d v8.2.1354

patch 8.2.1354: test 59 is old style Commit: https://github.com/vim/vim/commit/aa970abd0a987de96321d33db82f70bbceac931b Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 2 16:10:39 2020 +0200 patch 8.2.1354: test 59 is old style Problem: Test 59 is old style. Solution: Convert into a new style test. (Yegappan Lakshmanan, closes https://github.com/vim/vim/issues/6604)
author Bram Moolenaar <Bram@vim.org>
date Sun, 02 Aug 2020 16:15:03 +0200
parents 2fd50654cfac
children 5f68185d8148
files runtime/doc/eval.txt src/Makefile src/testdir/Make_all.mak src/testdir/Make_vms.mms src/testdir/test59.in src/testdir/test59.ok src/testdir/test_spell_utf8.vim src/version.c
diffstat 8 files changed, 780 insertions(+), 932 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -1,4 +1,4 @@
-*eval.txt*	For Vim version 8.2.  Last change: 2020 Jul 21
+*eval.txt*	For Vim version 8.2.  Last change: 2020 Aug 01
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -4273,6 +4273,8 @@ expand({expr} [, {nosuf} [, {list}]])			
 					line number
 			<sflnum>	script file line number, also when in
 					a function
+			<SID>		"<SNR>123_"  where "123" is the
+					current script ID  |<SID>|
 			<cword>		word under the cursor
 			<cWORD>		WORD under the cursor
 			<client>	the {clientid} of the last received
@@ -12129,7 +12131,8 @@ text...
 {endmarker}
 			Set internal variable {var-name} to a |List|
 			containing the lines of text bounded by the string
-			{endmarker}.
+			{endmarker}. The lines of text is used as a
+			|literal-string|.
 			{endmarker} must not contain white space.
 			{endmarker} cannot start with a lower case character.
 			The last line should end only with the {endmarker}
--- a/src/Makefile
+++ b/src/Makefile
@@ -2310,7 +2310,7 @@ test_libvterm:
 
 # Run individual OLD style test.
 # These do not depend on the executable, compile it when needed.
-test1 test49 test59:
+test1 test49:
 	cd testdir; rm -f $@.out; $(MAKE) -f Makefile $@.out VIMPROG=../$(VIMTESTTARGET) $(GUI_TESTARG) SCRIPTSOURCE=../$(SCRIPTSOURCE)
 
 # Run individual NEW style test.
--- a/src/testdir/Make_all.mak
+++ b/src/testdir/Make_all.mak
@@ -20,7 +20,7 @@ SCRIPTS_MORE1 =
 SCRIPTS_MORE2 = test49.out
 
 # Tests that run on most systems, but not on VMS
-SCRIPTS_MORE4 = test59.out
+SCRIPTS_MORE4 =
 
 # Tests specifically for MS-Windows.
 SCRIPTS_WIN32 =
@@ -242,6 +242,7 @@ NEW_TESTS = \
 	test_source \
 	test_source_utf8 \
 	test_spell \
+	test_spell_utf8 \
 	test_spellfile \
 	test_startup \
 	test_startup_utf8 \
@@ -464,6 +465,7 @@ NEW_TESTS_RES = \
 	test_sound.res \
 	test_source.res \
 	test_spell.res \
+	test_spell_utf8.res \
 	test_spellfile.res \
 	test_startup.res \
 	test_stat.res \
--- a/src/testdir/Make_vms.mms
+++ b/src/testdir/Make_vms.mms
@@ -32,22 +32,6 @@
 # and directory handling.
 # WANT_UNIX = YES
 
-# Comment out if you want to run Win32 specific tests as well, but please
-# be aware, that on OpenVMS will fail, because of cat, rm, etc commands
-# and directory handling.
-# WANT_WIN = YES
-
-# Comment out if you want to run spell checker tests. 
-# They fail because VMS does not support file names.
-# WANT_SPELL = YES
-
-# Comment out if you want to run mzschema tests.
-# It fails because VMS does not support this feature yet.
-# WANT_MZSCH = YES
-
-# Comment out if you have ODS-5 file system
-# HAVE_ODS5 = YES
-
 # Comment out if you have gzip on your system
 # HAVE_GZIP = YES
 
@@ -75,12 +59,6 @@ VIMPROG = <->vim.exe
 
 SCRIPT = test1.out test49.out test77a.out
 
-# Known problems:
-#
-# test59: Failed/Hangs - VMS does not support spell files (file names
-# with too many dots).
-#
-
 .IFDEF WANT_GUI
 GUI_OPTION = -g
 .ENDIF
@@ -89,10 +67,6 @@ GUI_OPTION = -g
 SCRIPT_UNIX = test49.out
 .ENDIF
 
-.IFDEF WANT_SPELL
-SCRIPT_SPELL = test59.out 
-.ENDIF
-
 .in.out :
 	-@ !clean up before doing the test
 	-@ if "''F$SEARCH("test.out.*")'" .NES. "" then delete/noconfirm/nolog test.out.*
@@ -113,8 +87,7 @@ SCRIPT_SPELL = test59.out
 	-@ if "''F$SEARCH("Xdotest.*")'"  .NES. "" then delete/noconfirm/nolog Xdotest.*.*
 	-@ if "''F$SEARCH("Xtest.*")'"    .NES. "" then delete/noconfirm/nolog Xtest.*.*
 
-all : clean nolog $(START_WITH) $(SCRIPT) $(SCRIPT_UNIX) $(SCRIPT_SPELL) \
-    nolog
+all : clean nolog $(START_WITH) $(SCRIPT) $(SCRIPT_UNIX) nolog
 	-@ write sys$output " "
 	-@ write sys$output "-----------------------------------------------"
 	-@ write sys$output "                All done"
@@ -139,10 +112,6 @@ nolog :
 	-@ write sys$output "MAKE_VMS.MMS options:"
 	-@ write sys$output "   WANT_GUI   = ""$(WANT_GUI)"" "
 	-@ write sys$output "   WANT_UNIX  = ""$(WANT_UNIX)"" "
-	-@ write sys$output "   WANT_WIN   = ""$(WANT_WIN)"" "
-	-@ write sys$output "   WANT_SPELL = ""$(WANT_SPELL)"" "
-	-@ write sys$output "   WANT_MZSCH = ""$(WANT_MZSCH)"" "
-	-@ write sys$output "   HAVE_ODS5  = ""$(HAVE_ODS5)"" "
 	-@ write sys$output "   HAVE_GZIP  = ""$(HAVE_GZIP)"" "
 	-@ write sys$output "   HAVE_GDIFF = ""$(HAVE_GDIFF)"" "
 	-@ write sys$output "   HAVE_ICONV = ""$(HAVE_ICONV)"" "
deleted file mode 100644
--- a/src/testdir/test59.in
+++ /dev/null
@@ -1,626 +0,0 @@
-Tests for spell checking with 'encoding' set to "utf-8".  vim: set ft=vim :
-
-STARTTEST
-:so small.vim
-:so mbyte.vim
-:"
-:" Don't want to depend on the locale from the environment.  The .aff and .dic
-:" text is in latin1, the test text is utf-8.
-:set enc=latin1
-:e!
-:set enc=utf-8
-:set fenc=
-:"
-:" Function to test .aff/.dic with list of good and bad words.
-:func TestOne(aff, dic)
-  set spellfile=
-  $put =''
-  $put ='test '. a:aff . '-' . a:dic
-  " Generate a .spl file from a .dic and .aff file.
-  exe '1;/^' . a:aff . 'affstart/+1,/^' . a:aff . 'affend/-1w! Xtest.aff'
-  exe '1;/^' . a:dic . 'dicstart/+1,/^' . a:dic . 'dicend/-1w! Xtest.dic'
-  mkspell! Xtest Xtest
-  " use that spell file
-  set spl=Xtest.utf-8.spl spell
-  " list all valid words
-  spelldump
-  %yank
-  quit
-  $put
-  $put ='-------'
-  " find all bad words and suggestions for them
-  exe '1;/^' . a:aff . 'good:'
-  normal 0f:]s
-  let prevbad = ''
-  while 1
-    let [bad, a] = spellbadword()
-    if bad == '' || bad == prevbad || bad == 'badend'
-      break
-    endif
-    let prevbad = bad
-    let lst = spellsuggest(bad, 3)
-    normal mm
-    $put =bad
-    $put =string(lst)
-    normal `m]s
-  endwhile
-endfunc
-:"
-:call TestOne('1', '1')
-:$put =soundfold('goobledygoook')
-:$put =soundfold('kóopërÿnôven')
-:$put =soundfold('oeverloos gezwets edale')
-:"
-:"
-:" and now with SAL instead of SOFO items; test automatic reloading
-gg:/^affstart_sal/+1,/^affend_sal/-1w! Xtest.aff
-:mkspell! Xtest Xtest
-:$put =soundfold('goobledygoook')
-:$put =soundfold('kóopërÿnôven')
-:$put =soundfold('oeverloos gezwets edale')
-:"
-:" also use an addition file
-gg:/^addstart/+1,/^addend/-1w! Xtest.utf-8.add
-:mkspell! Xtest.utf-8.add.spl Xtest.utf-8.add
-:set spellfile=Xtest.utf-8.add
-/^test2:
-]s:let [str, a] = spellbadword()
-:$put =str
-:set spl=Xtest_us.utf-8.spl
-/^test2:
-]smm:let [str, a] = spellbadword()
-:$put =str
-`m]s:let [str, a] = spellbadword()
-:$put =str
-:set spl=Xtest_gb.utf-8.spl
-/^test2:
-]smm:let [str, a] = spellbadword()
-:$put =str
-`m]s:let [str, a] = spellbadword()
-:$put =str
-:set spl=Xtest_nz.utf-8.spl
-/^test2:
-]smm:let [str, a] = spellbadword()
-:$put =str
-`m]s:let [str, a] = spellbadword()
-:$put =str
-:set spl=Xtest_ca.utf-8.spl
-/^test2:
-]smm:let [str, a] = spellbadword()
-:$put =str
-`m]s:let [str, a] = spellbadword()
-:$put =str
-:unlet str a
-:"
-:" Postponed prefixes
-:call TestOne('2', '1')
-:"
-:" Compound words
-:call TestOne('3', '3')
-:call TestOne('4', '4')
-:call TestOne('5', '5')
-:call TestOne('6', '6')
-:call TestOne('7', '7')
-:"
-:" clean up for valgrind
-:delfunc TestOne
-:set spl= enc=latin1
-:"
-gg:/^test output:/,$wq! test.out
-ENDTEST
-
-1affstart
-SET ISO8859-1
-TRY esianrtolcdugmphbyfvkwjkqxz-'ESIANRTOLCDUGMPHBYFVKWJKQXZ
-
-FOL  
-LOW  
-UPP  
-
-SOFOFROM abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ޿
-SOFOTO   ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?
-
-MIDWORD	'-
-
-KEP =
-RAR ?
-BAD !
-
-#NOSPLITSUGS
-
-PFX I N 1
-PFX I 0 in .
-
-PFX O Y 1
-PFX O 0 out .
-
-SFX S Y 2
-SFX S 0 s [^s]
-SFX S 0 es s
-
-SFX N N 3
-SFX N 0 en [^n]
-SFX N 0 nen n
-SFX N 0 n .
-
-REP 3
-REP g ch
-REP ch g
-REP svp s.v.p.
-
-MAP 9
-MAP a
-MAP e
-MAP i
-MAP o
-MAP u
-MAP n
-MAP c
-MAP y
-MAP s
-1affend
-
-affstart_sal
-SET ISO8859-1
-TRY esianrtolcdugmphbyfvkwjkqxz-'ESIANRTOLCDUGMPHBYFVKWJKQXZ
-
-FOL  
-LOW  
-UPP  
-
-MIDWORD	'-
-
-KEP =
-RAR ?
-BAD !
-
-#NOSPLITSUGS
-
-PFX I N 1
-PFX I 0 in .
-
-PFX O Y 1
-PFX O 0 out .
-
-SFX S Y 2
-SFX S 0 s [^s]
-SFX S 0 es s
-
-SFX N N 3
-SFX N 0 en [^n]
-SFX N 0 nen n
-SFX N 0 n .
-
-REP 3
-REP g ch
-REP ch g
-REP svp s.v.p.
-
-MAP 9
-MAP a
-MAP e
-MAP i
-MAP o
-MAP u
-MAP n
-MAP c
-MAP y
-MAP s
-
-SAL AH(AEIOUY)-^         *H
-SAL AR(AEIOUY)-^         *R
-SAL A(HR)^               *
-SAL A^                   *
-SAL AH(AEIOUY)-          H
-SAL AR(AEIOUY)-          R
-SAL A(HR)                _
-SAL ^                   *
-SAL ^                   *
-SAL BB-                  _
-SAL B                    B
-SAL CQ-                  _
-SAL CIA                  X
-SAL CH                   X
-SAL C(EIY)-              S
-SAL CK                   K
-SAL COUGH^               KF
-SAL CC<                  C
-SAL C                    K
-SAL DG(EIY)              K
-SAL DD-                  _
-SAL D                    T
-SAL <                   E
-SAL EH(AEIOUY)-^         *H
-SAL ER(AEIOUY)-^         *R
-SAL E(HR)^               *
-SAL ENOUGH^$             *NF
-SAL E^                   *
-SAL EH(AEIOUY)-          H
-SAL ER(AEIOUY)-          R
-SAL E(HR)                _
-SAL FF-                  _
-SAL F                    F
-SAL GN^                  N
-SAL GN$                  N
-SAL GNS$                 NS
-SAL GNED$                N
-SAL GH(AEIOUY)-          K
-SAL GH                   _
-SAL GG9                  K
-SAL G                    K
-SAL H                    H
-SAL IH(AEIOUY)-^         *H
-SAL IR(AEIOUY)-^         *R
-SAL I(HR)^               *
-SAL I^                   *
-SAL ING6                 N
-SAL IH(AEIOUY)-          H
-SAL IR(AEIOUY)-          R
-SAL I(HR)                _
-SAL J                    K
-SAL KN^                  N
-SAL KK-                  _
-SAL K                    K
-SAL LAUGH^               LF
-SAL LL-                  _
-SAL L                    L
-SAL MB$                  M
-SAL MM                   M
-SAL M                    M
-SAL NN-                  _
-SAL N                    N
-SAL OH(AEIOUY)-^         *H
-SAL OR(AEIOUY)-^         *R
-SAL O(HR)^               *
-SAL O^                   *
-SAL OH(AEIOUY)-          H
-SAL OR(AEIOUY)-          R
-SAL O(HR)                _
-SAL PH                   F
-SAL PN^                  N
-SAL PP-                  _
-SAL P                    P
-SAL Q                    K
-SAL RH^                  R
-SAL ROUGH^               RF
-SAL RR-                  _
-SAL R                    R
-SAL SCH(EOU)-            SK
-SAL SC(IEY)-             S
-SAL SH                   X
-SAL SI(AO)-              X
-SAL SS-                  _
-SAL S                    S
-SAL TI(AO)-              X
-SAL TH                   @
-SAL TCH--                _
-SAL TOUGH^               TF
-SAL TT-                  _
-SAL T                    T
-SAL UH(AEIOUY)-^         *H
-SAL UR(AEIOUY)-^         *R
-SAL U(HR)^               *
-SAL U^                   *
-SAL UH(AEIOUY)-          H
-SAL UR(AEIOUY)-          R
-SAL U(HR)                _
-SAL V^                   W
-SAL V                    F
-SAL WR^                  R
-SAL WH^                  W
-SAL W(AEIOU)-            W
-SAL X^                   S
-SAL X                    KS
-SAL Y(AEIOU)-            Y
-SAL ZZ-                  _
-SAL Z                    S
-affend_sal
-
-2affstart
-SET ISO8859-1
-
-FOL  
-LOW  
-UPP  
-
-PFXPOSTPONE
-
-MIDWORD	'-
-
-KEP =
-RAR ?
-BAD !
-
-#NOSPLITSUGS
-
-PFX I N 1
-PFX I 0 in .
-
-PFX O Y 1
-PFX O 0 out [a-z]
-
-SFX S Y 2
-SFX S 0 s [^s]
-SFX S 0 es s
-
-SFX N N 3
-SFX N 0 en [^n]
-SFX N 0 nen n
-SFX N 0 n .
-
-REP 3
-REP g ch
-REP ch g
-REP svp s.v.p.
-
-MAP 9
-MAP a
-MAP e
-MAP i
-MAP o
-MAP u
-MAP n
-MAP c
-MAP y
-MAP s
-2affend
-
-1dicstart
-123456
-test/NO
-# comment
-wrong
-Comment
-OK
-uk
-put/ISO
-the end
-deol
-dr
-1dicend
-
-addstart
-/regions=usgbnz
-elequint/2
-elekwint/3
-addend
-
-1good: wrong OK puts. Test the end
-bad:  inputs comment ok Ok. test déôl end the
-badend
-
-2good: puts
-bad: inputs comment ok Ok end the. test déôl
-badend
-
-Test rules for compounding.
-
-3affstart
-SET ISO8859-1
-
-COMPOUNDMIN 3
-COMPOUNDRULE m*
-NEEDCOMPOUND x
-3affend
-
-3dicstart
-1234
-foo/m
-bar/mx
-m/m
-la/mx
-3dicend
-
-3good: foo mï foobar foofoobar barfoo barbarfoo
-bad: bar la foomï barmï mïfoo mïbar mïmï lala mïla lamï foola labar
-badend
-
-
-Tests for compounding.
-
-4affstart
-SET ISO8859-1
-
-FOL  
-LOW  
-UPP  
-
-COMPOUNDRULE m+
-COMPOUNDRULE sm*e
-COMPOUNDRULE sm+
-COMPOUNDMIN 3
-COMPOUNDWORDMAX 3
-COMPOUNDFORBIDFLAG t
-
-COMPOUNDSYLMAX 5
-SYLLABLE aeiouy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui
-
-MAP 9
-MAP a
-MAP e
-MAP i
-MAP o
-MAP u
-MAP n
-MAP c
-MAP y
-MAP s
-
-NEEDAFFIX x
-
-PFXPOSTPONE
-
-MIDWORD '-
-
-SFX q N 1
-SFX q   0    -ok .
-
-SFX a Y 2
-SFX a 0 s .
-SFX a 0 ize/t .
-
-PFX p N 1
-PFX p 0 pre .
-
-PFX P N 1
-PFX P 0 nou .
-4affend
-
-4dicstart
-1234
-word/mP
-util/am
-pro/xq
-tomato/m
-bork/mp
-start/s
-end/e
-4dicend
-
-4good: 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
-bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato
-	endstart endend startstart wordend wordstart
-	preborkprebork  preborkpreborkbork
- 	startwordwordwordwordend borkpreborkpreborkbork
-	utilsbork  startnouword
-badend
-
-test2:
-elequint test elekwint test elekwent asdf
-
-Test affix flags with two characters
-
-5affstart
-SET ISO8859-1
-
-FLAG long
-
-NEEDAFFIX !!
-
-COMPOUNDRULE ssmm*ee
-
-NEEDCOMPOUND xx
-COMPOUNDPERMITFLAG pp
-
-SFX 13 Y 1
-SFX 13 0 bork .
-
-SFX a1 Y 1
-SFX a1 0 a1 .
-
-SFX a Y 1
-SFX a 0 a .
-
-PFX zz Y 1
-PFX zz 0 pre/pp .
-
-PFX yy Y 1
-PFX yy 0 nou .
-5affend
-
-5dicstart
-1234
-foo/a1a!!
-bar/zz13ee
-start/ss
-end/eeyy
-middle/mmxx
-5dicend
-
-5good: fooa1 fooaé bar prebar barbork prebarbork  startprebar
-      start end startend  startmiddleend nouend
-bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart
-	startprobar startnouend
-badend
-
-6affstart
-SET ISO8859-1
-
-FLAG caplong
-
-NEEDAFFIX A!
-
-COMPOUNDRULE sMm*Ee
-
-NEEDCOMPOUND Xx
-
-COMPOUNDPERMITFLAG p
-
-SFX N3 Y 1
-SFX N3 0 bork .
-
-SFX A1 Y 1
-SFX A1 0 a1 .
-
-SFX A Y 1
-SFX A 0 a .
-
-PFX Zz Y 1
-PFX Zz 0 pre/p .
-6affend
-
-6dicstart
-1234
-mee/A1AA!
-bar/ZzN3Ee
-lead/s
-end/Ee
-middle/MmXx
-6dicend
-
-6good: meea1 meeaé bar prebar barbork prebarbork  leadprebar
-      lead end leadend  leadmiddleend
-bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead
-	leadprobar
-badend
-
-7affstart
-SET ISO8859-1
-
-FOL  
-LOW  
-UPP  
-
-FLAG num
-
-NEEDAFFIX 9999
-
-COMPOUNDRULE 2,77*123
-
-NEEDCOMPOUND 1
-COMPOUNDPERMITFLAG 432
-
-SFX 61003 Y 1
-SFX 61003 0 meat .
-
-SFX 391 Y 1
-SFX 391 0 a1 .
-
-SFX 111 Y 1
-SFX 111 0 a .
-
-PFX 17 Y 1
-PFX 17 0 pre/432 .
-7affend
-
-7dicstart
-1234
-mee/391,111,9999
-bar/17,61003,123
-lead/2
-tail/123
-middle/77,1
-7dicend
-
-7good: meea1 meeaé bar prebar barmeat prebarmeat  leadprebar
-      lead tail leadtail  leadmiddletail
-bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead
-	leadprobar
-badend
-
-test output:
deleted file mode 100644
--- a/src/testdir/test59.ok
+++ /dev/null
@@ -1,270 +0,0 @@
-test output:
-
-test 1-1
-# file: Xtest.utf-8.spl
-Comment
-deol
-déôr
-input
-OK
-output
-outputs
-outtest
-put
-puts
-test
-testen
-testn
-the end
-uk
-wrong
--------
-bad
-['put', 'uk', 'OK']
-inputs
-['input', 'puts', 'outputs']
-comment
-['Comment', 'outtest', 'the end']
-ok
-['OK', 'uk', 'put']
-Ok
-['OK', 'Uk', 'Put']
-test
-['Test', 'testn', 'testen']
-déôl
-['deol', 'déôr', 'test']
-end
-['put', 'uk', 'test']
-the
-['put', 'uk', 'test']
-gebletegek
-kepereneven
-everles gesvets etele
-kbltykk
-kprnfn
-*fls kswts tl
-elekwent
-elequint
-elekwint
-elekwint
-elekwent
-elequint
-elekwent
-elequint
-elekwint
-
-test 2-1
-# file: Xtest.utf-8.spl
-Comment
-deol
-déôr
-OK
-put
-input
-output
-puts
-outputs
-test
-outtest
-testen
-testn
-the end
-uk
-wrong
--------
-bad
-['put', 'uk', 'OK']
-inputs
-['input', 'puts', 'outputs']
-comment
-['Comment']
-ok
-['OK', 'uk', 'put']
-Ok
-['OK', 'Uk', 'Put']
-end
-['put', 'uk', 'deol']
-the
-['put', 'uk', 'test']
-test
-['Test', 'testn', 'testen']
-déôl
-['deol', 'déôr', 'test']
-
-test 3-3
-# file: Xtest.utf-8.spl
-foo
-mï
--------
-bad
-['foo', 'mï']
-bar
-['barfoo', 'foobar', 'foo']
-la
-['mï', 'foo']
-foomï
-['foo mï', 'foo', 'foofoo']
-barmï
-['barfoo', 'mï', 'barbar']
-mïfoo
-['mï foo', 'foo', 'foofoo']
-mïbar
-['foobar', 'barbar', 'mï']
-mïmï
-['mï mï', 'mï']
-lala
-[]
-mïla
-['mï', 'mï mï']
-lamï
-['mï', 'mï mï']
-foola
-['foo', 'foobar', 'foofoo']
-labar
-['barbar', 'foobar']
-
-test 4-4
-# file: Xtest.utf-8.spl
-bork
-prebork
-end
-pro-ok
-start
-tomato
-util
-utilize
-utils
-word
-nouword
--------
-bad
-['end', 'bork', 'word']
-wordutilize
-['word utilize', 'wordutils', 'wordutil']
-pro
-['bork', 'word', 'end']
-borkborkborkborkborkbork
-['bork borkborkborkborkbork', 'borkbork borkborkborkbork', 'borkborkbork borkborkbork']
-tomatotomatotomato
-['tomato tomatotomato', 'tomatotomato tomato', 'tomato tomato tomato']
-endstart
-['end start', 'start']
-endend
-['end end', 'end']
-startstart
-['start start']
-wordend
-['word end', 'word', 'wordword']
-wordstart
-['word start', 'bork start']
-preborkprebork
-['prebork prebork', 'preborkbork', 'preborkborkbork']
-preborkpreborkbork
-['prebork preborkbork', 'preborkborkbork', 'preborkborkborkbork']
-startwordwordwordwordend
-['startwordwordwordword end', 'startwordwordwordword', 'start wordwordwordword end']
-borkpreborkpreborkbork
-['bork preborkpreborkbork', 'bork prebork preborkbork', 'bork preborkprebork bork']
-utilsbork
-['utilbork', 'utils bork', 'util bork']
-startnouword
-['start nouword', 'startword', 'startborkword']
-
-test 5-5
-# file: Xtest.utf-8.spl
-bar
-barbork
-end
-fooa1
-fooaé
-nouend
-prebar
-prebarbork
-start
--------
-bad
-['bar', 'end', 'fooa1']
-foo
-['fooa1', 'fooaé', 'bar']
-fooa2
-['fooa1', 'fooaé', 'bar']
-prabar
-['prebar', 'bar', 'bar bar']
-probarbirk
-['prebarbork']
-middle
-[]
-startmiddle
-['startmiddleend', 'startmiddlebar']
-middleend
-[]
-endstart
-['end start', 'start']
-startprobar
-['startprebar', 'start prebar', 'startbar']
-startnouend
-['start nouend', 'startend']
-
-test 6-6
-# file: Xtest.utf-8.spl
-bar
-barbork
-end
-lead
-meea1
-meeaé
-prebar
-prebarbork
--------
-bad
-['bar', 'end', 'lead']
-mee
-['meea1', 'meeaé', 'bar']
-meea2
-['meea1', 'meeaé', 'lead']
-prabar
-['prebar', 'bar', 'leadbar']
-probarbirk
-['prebarbork']
-middle
-[]
-leadmiddle
-['leadmiddleend', 'leadmiddlebar']
-middleend
-[]
-endlead
-['end lead', 'lead', 'end end']
-leadprobar
-['leadprebar', 'lead prebar', 'leadbar']
-
-test 7-7
-# file: Xtest.utf-8.spl
-bar
-barmeat
-lead
-meea1
-meeaé
-prebar
-prebarmeat
-tail
--------
-bad
-['bar', 'lead', 'tail']
-mee
-['meea1', 'meeaé', 'bar']
-meea2
-['meea1', 'meeaé', 'lead']
-prabar
-['prebar', 'bar', 'leadbar']
-probarmaat
-['prebarmeat']
-middle
-[]
-leadmiddle
-['leadmiddlebar']
-middletail
-[]
-taillead
-['tail lead', 'tail']
-leadprobar
-['leadprebar', 'lead prebar', 'leadbar']
new file mode 100644
--- /dev/null
+++ b/src/testdir/test_spell_utf8.vim
@@ -0,0 +1,768 @@
+" Test for spell checking with 'encoding' set to utf-8
+
+source check.vim
+CheckFeature spell
+
+scriptencoding utf-8
+
+func TearDown()
+  set nospell
+  call delete('Xtest.aff')
+  call delete('Xtest.dic')
+  call delete('Xtest.utf-8.add')
+  call delete('Xtest.utf-8.add.spl')
+  call delete('Xtest.utf-8.spl')
+  call delete('Xtest.utf-8.sug')
+endfunc
+
+let g:test_data_aff1 = [
+      \"SET ISO8859-1",
+      \"TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
+      \"",
+      \"FOL  àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ",
+      \"LOW  àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ",
+      \"UPP  ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ",
+      \"",
+      \"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",
+      \"SOFOTO   ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?",
+      \"",
+      \"MIDWORD\t'-",
+      \"",
+      \"KEP =",
+      \"RAR ?",
+      \"BAD !",
+      \"",
+      \"PFX I N 1",
+      \"PFX I 0 in .",
+      \"",
+      \"PFX O Y 1",
+      \"PFX O 0 out .",
+      \"",
+      \"SFX S Y 2",
+      \"SFX S 0 s [^s]",
+      \"SFX S 0 es s",
+      \"",
+      \"SFX N N 3",
+      \"SFX N 0 en [^n]",
+      \"SFX N 0 nen n",
+      \"SFX N 0 n .",
+      \"",
+      \"REP 3",
+      \"REP g ch",
+      \"REP ch g",
+      \"REP svp s.v.p.",
+      \"",
+      \"MAP 9",
+      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+      \"MAP e\xE8\xE9\xEA\xEB",
+      \"MAP i\xEC\xED\xEE\xEF",
+      \"MAP o\xF2\xF3\xF4\xF5\xF6",
+      \"MAP u\xF9\xFA\xFB\xFC",
+      \"MAP n\xF1",
+      \"MAP c\xE7",
+      \"MAP y\xFF\xFD",
+      \"MAP s\xDF"
+      \ ]
+let g:test_data_dic1 = [
+      \"123456",
+      \"test/NO",
+      \"# comment",
+      \"wrong",
+      \"Comment",
+      \"OK",
+      \"uk",
+      \"put/ISO",
+      \"the end",
+      \"deol",
+      \"d\xE9\xF4r",
+      \ ]
+let g:test_data_aff2 = [
+      \"SET ISO8859-1",
+      \"",
+      \"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",
+      \"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",
+      \"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",
+      \"",
+      \"PFXPOSTPONE",
+      \"",
+      \"MIDWORD\t'-",
+      \"",
+      \"KEP =",
+      \"RAR ?",
+      \"BAD !",
+      \"",
+      \"PFX I N 1",
+      \"PFX I 0 in .",
+      \"",
+      \"PFX O Y 1",
+      \"PFX O 0 out [a-z]",
+      \"",
+      \"SFX S Y 2",
+      \"SFX S 0 s [^s]",
+      \"SFX S 0 es s",
+      \"",
+      \"SFX N N 3",
+      \"SFX N 0 en [^n]",
+      \"SFX N 0 nen n",
+      \"SFX N 0 n .",
+      \"",
+      \"REP 3",
+      \"REP g ch",
+      \"REP ch g",
+      \"REP svp s.v.p.",
+      \"",
+      \"MAP 9",
+      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+      \"MAP e\xE8\xE9\xEA\xEB",
+      \"MAP i\xEC\xED\xEE\xEF",
+      \"MAP o\xF2\xF3\xF4\xF5\xF6",
+      \"MAP u\xF9\xFA\xFB\xFC",
+      \"MAP n\xF1",
+      \"MAP c\xE7",
+      \"MAP y\xFF\xFD",
+      \"MAP s\xDF",
+      \ ]
+let g:test_data_aff3 = [
+      \"SET ISO8859-1",
+      \"",
+      \"COMPOUNDMIN 3",
+      \"COMPOUNDRULE m*",
+      \"NEEDCOMPOUND x",
+      \ ]
+let g:test_data_dic3 = [
+      \"1234",
+      \"foo/m",
+      \"bar/mx",
+      \"m\xEF/m",
+      \"la/mx",
+      \ ]
+let g:test_data_aff4 = [
+      \"SET ISO8859-1",
+      \"",
+      \"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",
+      \"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",
+      \"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",
+      \"",
+      \"COMPOUNDRULE m+",
+      \"COMPOUNDRULE sm*e",
+      \"COMPOUNDRULE sm+",
+      \"COMPOUNDMIN 3",
+      \"COMPOUNDWORDMAX 3",
+      \"COMPOUNDFORBIDFLAG t",
+      \"",
+      \"COMPOUNDSYLMAX 5",
+      \"SYLLABLE a\xE1e\xE9i\xEDo\xF3\xF6\xF5u\xFA\xFC\xFBy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui",
+      \"",
+      \"MAP 9",
+      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+      \"MAP e\xE8\xE9\xEA\xEB",
+      \"MAP i\xEC\xED\xEE\xEF",
+      \"MAP o\xF2\xF3\xF4\xF5\xF6",
+      \"MAP u\xF9\xFA\xFB\xFC",
+      \"MAP n\xF1",
+      \"MAP c\xE7",
+      \"MAP y\xFF\xFD",
+      \"MAP s\xDF",
+      \"",
+      \"NEEDAFFIX x",
+      \"",
+      \"PFXPOSTPONE",
+      \"",
+      \"MIDWORD '-",
+      \"",
+      \"SFX q N 1",
+      \"SFX q   0    -ok .",
+      \"",
+      \"SFX a Y 2",
+      \"SFX a 0 s .",
+      \"SFX a 0 ize/t .",
+      \"",
+      \"PFX p N 1",
+      \"PFX p 0 pre .",
+      \"",
+      \"PFX P N 1",
+      \"PFX P 0 nou .",
+      \ ]
+let g:test_data_dic4 = [
+      \"1234",
+      \"word/mP",
+      \"util/am",
+      \"pro/xq",
+      \"tomato/m",
+      \"bork/mp",
+      \"start/s",
+      \"end/e",
+      \ ]
+let g:test_data_aff5 = [
+      \"SET ISO8859-1",
+      \"",
+      \"FLAG long",
+      \"",
+      \"NEEDAFFIX !!",
+      \"",
+      \"COMPOUNDRULE ssmm*ee",
+      \"",
+      \"NEEDCOMPOUND xx",
+      \"COMPOUNDPERMITFLAG pp",
+      \"",
+      \"SFX 13 Y 1",
+      \"SFX 13 0 bork .",
+      \"",
+      \"SFX a1 Y 1",
+      \"SFX a1 0 a1 .",
+      \"",
+      \"SFX a\xE9 Y 1",
+      \"SFX a\xE9 0 a\xE9 .",
+      \"",
+      \"PFX zz Y 1",
+      \"PFX zz 0 pre/pp .",
+      \"",
+      \"PFX yy Y 1",
+      \"PFX yy 0 nou .",
+      \ ]
+let g:test_data_dic5 = [
+      \"1234",
+      \"foo/a1a\xE9!!",
+      \"bar/zz13ee",
+      \"start/ss",
+      \"end/eeyy",
+      \"middle/mmxx",
+      \ ]
+let g:test_data_aff6 = [
+      \"SET ISO8859-1",
+      \"",
+      \"FLAG caplong",
+      \"",
+      \"NEEDAFFIX A!",
+      \"",
+      \"COMPOUNDRULE sMm*Ee",
+      \"",
+      \"NEEDCOMPOUND Xx",
+      \"",
+      \"COMPOUNDPERMITFLAG p",
+      \"",
+      \"SFX N3 Y 1",
+      \"SFX N3 0 bork .",
+      \"",
+      \"SFX A1 Y 1",
+      \"SFX A1 0 a1 .",
+      \"",
+      \"SFX A\xE9 Y 1",
+      \"SFX A\xE9 0 a\xE9 .",
+      \"",
+      \"PFX Zz Y 1",
+      \"PFX Zz 0 pre/p .",
+      \ ]
+let g:test_data_dic6 = [
+      \"1234",
+      \"mee/A1A\xE9A!",
+      \"bar/ZzN3Ee",
+      \"lead/s",
+      \"end/Ee",
+      \"middle/MmXx",
+      \ ]
+let g:test_data_aff7 = [
+      \"SET ISO8859-1",
+      \"",
+      \"FLAG num",
+      \"",
+      \"NEEDAFFIX 9999",
+      \"",
+      \"COMPOUNDRULE 2,77*123",
+      \"",
+      \"NEEDCOMPOUND 1",
+      \"COMPOUNDPERMITFLAG 432",
+      \"",
+      \"SFX 61003 Y 1",
+      \"SFX 61003 0 meat .",
+      \"",
+      \"SFX 0 Y 1",
+      \"SFX 0 0 zero .",
+      \"",
+      \"SFX 391 Y 1",
+      \"SFX 391 0 a1 .",
+      \"",
+      \"SFX 111 Y 1",
+      \"SFX 111 0 a\xE9 .",
+      \"",
+      \"PFX 17 Y 1",
+      \"PFX 17 0 pre/432 .",
+      \ ]
+let g:test_data_dic7 = [
+      \"1234",
+      \"mee/0,391,111,9999",
+      \"bar/17,61003,123",
+      \"lead/2",
+      \"tail/123",
+      \"middle/77,1",
+      \ ]
+let g:test_data_aff8 = [
+      \"SET ISO8859-1",
+      \"",
+      \"NOSPLITSUGS",
+      \ ]
+let g:test_data_dic8 = [
+      \"1234",
+      \"foo",
+      \"bar",
+      \"faabar",
+      \ ]
+let g:test_data_aff9 = [
+      \ ]
+let g:test_data_dic9 = [
+      \"1234",
+      \"foo",
+      \"bar",
+      \ ]
+let g:test_data_aff10 = [
+      \"COMPOUNDRULE se",
+      \"COMPOUNDPERMITFLAG p",
+      \"",
+      \"SFX A Y 1",
+      \"SFX A 0 able/Mp .",
+      \"",
+      \"SFX M Y 1",
+      \"SFX M 0 s .",
+      \ ]
+let g:test_data_dic10 = [
+      \"1234",
+      \"drink/As",
+      \"table/e",
+      \ ]
+let g:test_data_aff_sal = [
+      \"SET ISO8859-1",
+      \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ",
+      \"",
+      \"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",
+      \"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",
+      \"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",
+      \"",
+      \"MIDWORD\t'-",
+      \"",
+      \"KEP =",
+      \"RAR ?",
+      \"BAD !",
+      \"",
+      \"PFX I N 1",
+      \"PFX I 0 in .",
+      \"",
+      \"PFX O Y 1",
+      \"PFX O 0 out .",
+      \"",
+      \"SFX S Y 2",
+      \"SFX S 0 s [^s]",
+      \"SFX S 0 es s",
+      \"",
+      \"SFX N N 3",
+      \"SFX N 0 en [^n]",
+      \"SFX N 0 nen n",
+      \"SFX N 0 n .",
+      \"",
+      \"REP 3",
+      \"REP g ch",
+      \"REP ch g",
+      \"REP svp s.v.p.",
+      \"",
+      \"MAP 9",
+      \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5",
+      \"MAP e\xE8\xE9\xEA\xEB",
+      \"MAP i\xEC\xED\xEE\xEF",
+      \"MAP o\xF2\xF3\xF4\xF5\xF6",
+      \"MAP u\xF9\xFA\xFB\xFC",
+      \"MAP n\xF1",
+      \"MAP c\xE7",
+      \"MAP y\xFF\xFD",
+      \"MAP s\xDF",
+      \"",
+      \"SAL AH(AEIOUY)-^         *H",
+      \"SAL AR(AEIOUY)-^         *R",
+      \"SAL A(HR)^               *",
+      \"SAL A^                   *",
+      \"SAL AH(AEIOUY)-          H",
+      \"SAL AR(AEIOUY)-          R",
+      \"SAL A(HR)                _",
+      \"SAL \xC0^                   *",
+      \"SAL \xC5^                   *",
+      \"SAL BB-                  _",
+      \"SAL B                    B",
+      \"SAL CQ-                  _",
+      \"SAL CIA                  X",
+      \"SAL CH                   X",
+      \"SAL C(EIY)-              S",
+      \"SAL CK                   K",
+      \"SAL COUGH^               KF",
+      \"SAL CC<                  C",
+      \"SAL C                    K",
+      \"SAL DG(EIY)              K",
+      \"SAL DD-                  _",
+      \"SAL D                    T",
+      \"SAL \xC9<                   E",
+      \"SAL EH(AEIOUY)-^         *H",
+      \"SAL ER(AEIOUY)-^         *R",
+      \"SAL E(HR)^               *",
+      \"SAL ENOUGH^$             *NF",
+      \"SAL E^                   *",
+      \"SAL EH(AEIOUY)-          H",
+      \"SAL ER(AEIOUY)-          R",
+      \"SAL E(HR)                _",
+      \"SAL FF-                  _",
+      \"SAL F                    F",
+      \"SAL GN^                  N",
+      \"SAL GN$                  N",
+      \"SAL GNS$                 NS",
+      \"SAL GNED$                N",
+      \"SAL GH(AEIOUY)-          K",
+      \"SAL GH                   _",
+      \"SAL GG9                  K",
+      \"SAL G                    K",
+      \"SAL H                    H",
+      \"SAL IH(AEIOUY)-^         *H",
+      \"SAL IR(AEIOUY)-^         *R",
+      \"SAL I(HR)^               *",
+      \"SAL I^                   *",
+      \"SAL ING6                 N",
+      \"SAL IH(AEIOUY)-          H",
+      \"SAL IR(AEIOUY)-          R",
+      \"SAL I(HR)                _",
+      \"SAL J                    K",
+      \"SAL KN^                  N",
+      \"SAL KK-                  _",
+      \"SAL K                    K",
+      \"SAL LAUGH^               LF",
+      \"SAL LL-                  _",
+      \"SAL L                    L",
+      \"SAL MB$                  M",
+      \"SAL MM                   M",
+      \"SAL M                    M",
+      \"SAL NN-                  _",
+      \"SAL N                    N",
+      \"SAL OH(AEIOUY)-^         *H",
+      \"SAL OR(AEIOUY)-^         *R",
+      \"SAL O(HR)^               *",
+      \"SAL O^                   *",
+      \"SAL OH(AEIOUY)-          H",
+      \"SAL OR(AEIOUY)-          R",
+      \"SAL O(HR)                _",
+      \"SAL PH                   F",
+      \"SAL PN^                  N",
+      \"SAL PP-                  _",
+      \"SAL P                    P",
+      \"SAL Q                    K",
+      \"SAL RH^                  R",
+      \"SAL ROUGH^               RF",
+      \"SAL RR-                  _",
+      \"SAL R                    R",
+      \"SAL SCH(EOU)-            SK",
+      \"SAL SC(IEY)-             S",
+      \"SAL SH                   X",
+      \"SAL SI(AO)-              X",
+      \"SAL SS-                  _",
+      \"SAL S                    S",
+      \"SAL TI(AO)-              X",
+      \"SAL TH                   @",
+      \"SAL TCH--                _",
+      \"SAL TOUGH^               TF",
+      \"SAL TT-                  _",
+      \"SAL T                    T",
+      \"SAL UH(AEIOUY)-^         *H",
+      \"SAL UR(AEIOUY)-^         *R",
+      \"SAL U(HR)^               *",
+      \"SAL U^                   *",
+      \"SAL UH(AEIOUY)-          H",
+      \"SAL UR(AEIOUY)-          R",
+      \"SAL U(HR)                _",
+      \"SAL V^                   W",
+      \"SAL V                    F",
+      \"SAL WR^                  R",
+      \"SAL WH^                  W",
+      \"SAL W(AEIOU)-            W",
+      \"SAL X^                   S",
+      \"SAL X                    KS",
+      \"SAL Y(AEIOU)-            Y",
+      \"SAL ZZ-                  _",
+      \"SAL Z                    S",
+      \ ]
+
+func LoadAffAndDic(aff_contents, dic_contents)
+  set enc=utf-8
+  set spellfile=
+  call writefile(a:aff_contents, "Xtest.aff")
+  call writefile(a:dic_contents, "Xtest.dic")
+  " Generate a .spl file from a .dic and .aff file.
+  mkspell! Xtest Xtest
+  " use that spell file
+  set spl=Xtest.utf-8.spl spell
+endfunc
+
+func ListWords()
+  spelldump
+  %yank
+  quit
+  return split(@", "\n")
+endfunc
+
+func TestGoodBadBase()
+  exe '1;/^good:'
+  normal 0f:]s
+  let prevbad = ''
+  let result = []
+  while 1
+    let [bad, a] = spellbadword()
+    if bad == '' || bad == prevbad || bad == 'badend'
+      break
+    endif
+    let prevbad = bad
+    let lst = bad->spellsuggest(3)
+    normal mm
+
+    call add(result, [bad, lst])
+    normal `m]s
+  endwhile
+  return result
+endfunc
+
+func RunGoodBad(good, bad, expected_words, expected_bad_words)
+  %bwipe!
+  call setline(1, ['', "good: ", a:good,  a:bad, " badend "])
+  let words = ListWords()
+  call assert_equal(a:expected_words, words[1:-1])
+  let bad_words = TestGoodBadBase()
+  call assert_equal(a:expected_bad_words, bad_words)
+  %bwipe!
+endfunc
+
+func Test_spell_basic()
+  call LoadAffAndDic(g:test_data_aff1, g:test_data_dic1)
+  call RunGoodBad("wrong OK puts. Test the end",
+        \ "bad: inputs comment ok Ok. test d\u00E9\u00F4l end the",
+        \["Comment", "deol", "d\u00E9\u00F4r", "input", "OK", "output", "outputs", "outtest", "put", "puts",
+        \  "test", "testen", "testn", "the end", "uk", "wrong"],
+        \[
+        \   ["bad", ["put", "uk", "OK"]],
+        \   ["inputs", ["input", "puts", "outputs"]],
+        \   ["comment", ["Comment", "outtest", "the end"]],
+        \   ["ok", ["OK", "uk", "put"]],
+        \   ["Ok", ["OK", "Uk", "Put"]],
+        \   ["test", ["Test", "testn", "testen"]],
+        \   ["d\u00E9\u00F4l", ["deol", "d\u00E9\u00F4r", "test"]],
+        \   ["end", ["put", "uk", "test"]],
+        \   ["the", ["put", "uk", "test"]],
+        \ ]
+        \ )
+
+  call assert_equal("gebletegek", soundfold('goobledygoook'))
+  call assert_equal("kepereneven", 'kóopërÿnôven'->soundfold())
+  call assert_equal("everles gesvets etele", soundfold('oeverloos gezwets edale'))
+endfunc
+
+" Postponed prefixes
+func Test_spell_prefixes()
+  call LoadAffAndDic(g:test_data_aff2, g:test_data_dic1)
+  call RunGoodBad("puts",
+        \ "bad: inputs comment ok Ok end the. test d\u00E9\u00F4l",
+        \ ["Comment", "deol", "d\u00E9\u00F4r", "OK", "put", "input", "output", "puts", "outputs", "test", "outtest", "testen", "testn", "the end", "uk", "wrong"],
+        \ [
+        \   ["bad", ["put", "uk", "OK"]],
+        \   ["inputs", ["input", "puts", "outputs"]],
+        \   ["comment", ["Comment"]],
+        \   ["ok", ["OK", "uk", "put"]],
+        \   ["Ok", ["OK", "Uk", "Put"]],
+        \   ["end", ["put", "uk", "deol"]],
+        \   ["the", ["put", "uk", "test"]],
+        \   ["test", ["Test", "testn", "testen"]],
+        \   ["d\u00E9\u00F4l", ["deol", "d\u00E9\u00F4r", "test"]],
+        \ ])
+endfunc
+
+"Compound words
+func Test_spell_compound()
+  call LoadAffAndDic(g:test_data_aff3, g:test_data_dic3)
+  call RunGoodBad("foo m\u00EF foobar foofoobar barfoo barbarfoo",
+        \ "bad: bar la foom\u00EF barm\u00EF m\u00EFfoo m\u00EFbar m\u00EFm\u00EF lala m\u00EFla lam\u00EF foola labar",
+        \ ["foo", "m\u00EF"],
+        \ [
+        \   ["bad", ["foo", "m\u00EF"]],
+        \   ["bar", ["barfoo", "foobar", "foo"]],
+        \   ["la", ["m\u00EF", "foo"]],
+        \   ["foom\u00EF", ["foo m\u00EF", "foo", "foofoo"]],
+        \   ["barm\u00EF", ["barfoo", "m\u00EF", "barbar"]],
+        \   ["m\u00EFfoo", ["m\u00EF foo", "foo", "foofoo"]],
+        \   ["m\u00EFbar", ["foobar", "barbar", "m\u00EF"]],
+        \   ["m\u00EFm\u00EF", ["m\u00EF m\u00EF", "m\u00EF"]],
+        \   ["lala", []],
+        \   ["m\u00EFla", ["m\u00EF", "m\u00EF m\u00EF"]],
+        \   ["lam\u00EF", ["m\u00EF", "m\u00EF m\u00EF"]],
+        \   ["foola", ["foo", "foobar", "foofoo"]],
+        \   ["labar", ["barbar", "foobar"]],
+        \ ])
+
+  call LoadAffAndDic(g:test_data_aff4, g:test_data_dic4)
+  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",
+        \ "bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato endstart endend startstart wordend wordstart preborkprebork  preborkpreborkbork startwordwordwordwordend borkpreborkpreborkbork utilsbork  startnouword",
+        \ ["bork", "prebork", "end", "pro-ok", "start", "tomato", "util", "utilize", "utils", "word", "nouword"],
+        \ [
+        \   ["bad", ["end", "bork", "word"]],
+        \   ["wordutilize", ["word utilize", "wordutils", "wordutil"]],
+        \   ["pro", ["bork", "word", "end"]],
+        \   ["borkborkborkborkborkbork", ["bork borkborkborkborkbork", "borkbork borkborkborkbork", "borkborkbork borkborkbork"]],
+        \   ["tomatotomatotomato", ["tomato tomatotomato", "tomatotomato tomato", "tomato tomato tomato"]],
+        \   ["endstart", ["end start", "start"]],
+        \   ["endend", ["end end", "end"]],
+        \   ["startstart", ["start start"]],
+        \   ["wordend", ["word end", "word", "wordword"]],
+        \   ["wordstart", ["word start", "bork start"]],
+        \   ["preborkprebork", ["prebork prebork", "preborkbork", "preborkborkbork"]],
+        \   ["preborkpreborkbork", ["prebork preborkbork", "preborkborkbork", "preborkborkborkbork"]],
+        \   ["startwordwordwordwordend", ["startwordwordwordword end", "startwordwordwordword", "start wordwordwordword end"]],
+        \   ["borkpreborkpreborkbork", ["bork preborkpreborkbork", "bork prebork preborkbork", "bork preborkprebork bork"]],
+        \   ["utilsbork", ["utilbork", "utils bork", "util bork"]],
+        \   ["startnouword", ["start nouword", "startword", "startborkword"]],
+        \ ])
+
+endfunc
+
+" Test affix flags with two characters
+func Test_spell_affix()
+  call LoadAffAndDic(g:test_data_aff5, g:test_data_dic5)
+  call RunGoodBad("fooa1 fooa\u00E9 bar prebar barbork prebarbork  startprebar start end startend  startmiddleend nouend",
+        \ "bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart startprobar startnouend",
+        \ ["bar", "barbork", "end", "fooa1", "fooa\u00E9", "nouend", "prebar", "prebarbork", "start"],
+        \ [
+        \   ["bad", ["bar", "end", "fooa1"]],
+        \   ["foo", ["fooa1", "fooa\u00E9", "bar"]],
+        \   ["fooa2", ["fooa1", "fooa\u00E9", "bar"]],
+        \   ["prabar", ["prebar", "bar", "bar bar"]],
+        \   ["probarbirk", ["prebarbork"]],
+        \   ["middle", []],
+        \   ["startmiddle", ["startmiddleend", "startmiddlebar"]],
+        \   ["middleend", []],
+        \   ["endstart", ["end start", "start"]],
+        \   ["startprobar", ["startprebar", "start prebar", "startbar"]],
+        \   ["startnouend", ["start nouend", "startend"]],
+        \ ])
+
+  call LoadAffAndDic(g:test_data_aff6, g:test_data_dic6)
+  call RunGoodBad("meea1 meea\u00E9 bar prebar barbork prebarbork  leadprebar lead end leadend  leadmiddleend",
+        \  "bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead leadprobar",
+        \ ["bar", "barbork", "end", "lead", "meea1", "meea\u00E9", "prebar", "prebarbork"],
+        \ [
+        \   ["bad", ["bar", "end", "lead"]],
+        \   ["mee", ["meea1", "meea\u00E9", "bar"]],
+        \   ["meea2", ["meea1", "meea\u00E9", "lead"]],
+        \   ["prabar", ["prebar", "bar", "leadbar"]],
+        \   ["probarbirk", ["prebarbork"]],
+        \   ["middle", []],
+        \   ["leadmiddle", ["leadmiddleend", "leadmiddlebar"]],
+        \   ["middleend", []],
+        \   ["endlead", ["end lead", "lead", "end end"]],
+        \   ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
+        \ ])
+
+  call LoadAffAndDic(g:test_data_aff7, g:test_data_dic7)
+  call RunGoodBad("meea1 meezero meea\u00E9 bar prebar barmeat prebarmeat  leadprebar lead tail leadtail  leadmiddletail",
+        \ "bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead leadprobar",
+        \ ["bar", "barmeat", "lead", "meea1", "meea\u00E9", "meezero", "prebar", "prebarmeat", "tail"],
+        \ [
+        \   ["bad", ["bar", "lead", "tail"]],
+        \   ["mee", ["meea1", "meea\u00E9", "bar"]],
+        \   ["meea2", ["meea1", "meea\u00E9", "lead"]],
+        \   ["prabar", ["prebar", "bar", "leadbar"]],
+        \   ["probarmaat", ["prebarmeat"]],
+        \   ["middle", []],
+        \   ["leadmiddle", ["leadmiddlebar"]],
+        \   ["middletail", []],
+        \   ["taillead", ["tail lead", "tail"]],
+        \   ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]],
+        \ ])
+endfunc
+
+func Test_spell_NOSLITSUGS()
+  call LoadAffAndDic(g:test_data_aff8, g:test_data_dic8)
+  call RunGoodBad("foo bar faabar", "bad: foobar barfoo",
+        \ ["bar", "faabar", "foo"],
+        \ [
+        \   ["bad", ["bar", "foo"]],
+        \   ["foobar", ["faabar", "foo bar", "bar"]],
+        \   ["barfoo", ["bar foo", "bar", "foo"]],
+        \ ])
+endfunc
+
+" Numbers
+func Test_spell_Numbers()
+  call LoadAffAndDic(g:test_data_aff9, g:test_data_dic9)
+  call RunGoodBad("0b1011 0777 1234 0x01ff", "",
+        \ ["bar", "foo"],
+        \ [
+        \ ])
+endfunc
+
+" Affix flags
+func Test_spell_affix_flags()
+  call LoadAffAndDic(g:test_data_aff10, g:test_data_dic10)
+  call RunGoodBad("drink drinkable drinkables drinktable drinkabletable",
+	\ "bad: drinks drinkstable drinkablestable",
+        \ ["drink", "drinkable", "drinkables", "table"],
+        \ [['bad', []],
+	\ ['drinks', ['drink']],
+	\ ['drinkstable', ['drinktable', 'drinkable', 'drink table']],
+        \ ['drinkablestable', ['drinkabletable', 'drinkables table', 'drinkable table']],
+	\ ])
+endfunc
+
+function FirstSpellWord()
+  call feedkeys("/^start:\n", 'tx')
+  normal ]smm
+  let [str, a] = spellbadword()
+  return str
+endfunc
+
+function SecondSpellWord()
+  normal `m]s
+  let [str, a] = spellbadword()
+  return str
+endfunc
+
+" Test with SAL instead of SOFO items; test automatic reloading
+func Test_spell_sal_and_addition()
+  set spellfile=
+  call writefile(g:test_data_dic1, "Xtest.dic")
+  call writefile(g:test_data_aff_sal, "Xtest.aff")
+  mkspell! Xtest Xtest
+  set spl=Xtest.utf-8.spl spell
+  call assert_equal('kbltykk', soundfold('goobledygoook'))
+  call assert_equal('kprnfn', soundfold('kóopërÿnôven'))
+  call assert_equal('*fls kswts tl', soundfold('oeverloos gezwets edale'))
+
+  "also use an addition file
+  call writefile(["/regions=usgbnz", "elequint/2", "elekwint/3"], "Xtest.utf-8.add")
+  mkspell! Xtest.utf-8.add.spl Xtest.utf-8.add
+
+  bwipe!
+  call setline(1, ["start: elequint test elekwint test elekwent asdf"])
+
+  set spellfile=Xtest.utf-8.add
+  call assert_equal("elekwent", FirstSpellWord())
+
+  set spl=Xtest_us.utf-8.spl
+  call assert_equal("elequint", FirstSpellWord())
+  call assert_equal("elekwint", SecondSpellWord())
+
+  set spl=Xtest_gb.utf-8.spl
+  call assert_equal("elekwint", FirstSpellWord())
+  call assert_equal("elekwent", SecondSpellWord())
+
+  set spl=Xtest_nz.utf-8.spl
+  call assert_equal("elequint", FirstSpellWord())
+  call assert_equal("elekwent", SecondSpellWord())
+
+  set spl=Xtest_ca.utf-8.spl
+  call assert_equal("elequint", FirstSpellWord())
+  call assert_equal("elekwint", SecondSpellWord())
+endfunc
+
+func Test_spellfile_value()
+  set spellfile=Xdir/Xtest.utf-8.add
+  set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add
+endfunc
+
+" vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1354,
+/**/
     1353,
 /**/
     1352,