1" Test for commands that operate on the spellfile. 2 3source shared.vim 4source check.vim 5 6CheckFeature spell 7CheckFeature syntax 8 9func Test_spell_normal() 10 new 11 call append(0, ['1 good', '2 goood', '3 goood']) 12 set spell spellfile=./Xspellfile.add spelllang=en 13 let oldlang=v:lang 14 lang C 15 16 " Test for zg 17 1 18 norm! ]s 19 call assert_equal('2 goood', getline('.')) 20 norm! zg 21 1 22 let a=execute('unsilent :norm! ]s') 23 call assert_equal('1 good', getline('.')) 24 call assert_equal('search hit BOTTOM, continuing at TOP', a[1:]) 25 let cnt=readfile('./Xspellfile.add') 26 call assert_equal('goood', cnt[0]) 27 28 " zg should fail in operator-pending mode 29 call assert_beeps('norm! czg') 30 31 " zg fails in visual mode when not able to get the visual text 32 call assert_beeps('norm! ggVjzg') 33 norm! V 34 35 " zg fails for a non-identifier word 36 call append(line('$'), '###') 37 call assert_fails('norm! Gzg', 'E349:') 38 $d 39 40 " Test for zw 41 2 42 norm! $zw 43 1 44 norm! ]s 45 call assert_equal('2 goood', getline('.')) 46 let cnt=readfile('./Xspellfile.add') 47 call assert_equal('#oood', cnt[0]) 48 call assert_equal('goood/!', cnt[1]) 49 50 " Test for :spellrare 51 spellrare rare 52 let cnt=readfile('./Xspellfile.add') 53 call assert_equal(['#oood', 'goood/!', 'rare/?'], cnt) 54 55 " Make sure :spellundo works for rare words. 56 spellundo rare 57 let cnt=readfile('./Xspellfile.add') 58 call assert_equal(['#oood', 'goood/!', '#are/?'], cnt) 59 60 " Test for zg in visual mode 61 let a=execute('unsilent :norm! V$zg') 62 call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:]) 63 1 64 norm! ]s 65 call assert_equal('3 goood', getline('.')) 66 let cnt=readfile('./Xspellfile.add') 67 call assert_equal('2 goood', cnt[3]) 68 " Remove "2 good" from spellfile 69 2 70 let a=execute('unsilent norm! V$zw') 71 call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:]) 72 let cnt=readfile('./Xspellfile.add') 73 call assert_equal('2 goood/!', cnt[4]) 74 75 " Test for zG 76 let a=execute('unsilent norm! V$zG') 77 call assert_match("Word '2 goood' added to .*", a) 78 let fname=matchstr(a, 'to\s\+\zs\f\+$') 79 let cnt=readfile(fname) 80 call assert_equal('2 goood', cnt[0]) 81 82 " Test for zW 83 let a=execute('unsilent norm! V$zW') 84 call assert_match("Word '2 goood' added to .*", a) 85 let cnt=readfile(fname) 86 call assert_equal('# goood', cnt[0]) 87 call assert_equal('2 goood/!', cnt[1]) 88 89 " Test for zuW 90 let a=execute('unsilent norm! V$zuW') 91 call assert_match("Word '2 goood' removed from .*", a) 92 let cnt=readfile(fname) 93 call assert_equal('# goood', cnt[0]) 94 call assert_equal('# goood/!', cnt[1]) 95 96 " Test for zuG 97 let a=execute('unsilent norm! $zG') 98 call assert_match("Word 'goood' added to .*", a) 99 let cnt=readfile(fname) 100 call assert_equal('# goood', cnt[0]) 101 call assert_equal('# goood/!', cnt[1]) 102 call assert_equal('goood', cnt[2]) 103 let a=execute('unsilent norm! $zuG') 104 let cnt=readfile(fname) 105 call assert_match("Word 'goood' removed from .*", a) 106 call assert_equal('# goood', cnt[0]) 107 call assert_equal('# goood/!', cnt[1]) 108 call assert_equal('#oood', cnt[2]) 109 " word not found in wordlist 110 let a=execute('unsilent norm! V$zuG') 111 let cnt=readfile(fname) 112 call assert_match("", a) 113 call assert_equal('# goood', cnt[0]) 114 call assert_equal('# goood/!', cnt[1]) 115 call assert_equal('#oood', cnt[2]) 116 117 " Test for zug 118 call delete('./Xspellfile.add') 119 2 120 let a=execute('unsilent norm! $zg') 121 let cnt=readfile('./Xspellfile.add') 122 call assert_equal('goood', cnt[0]) 123 let a=execute('unsilent norm! $zug') 124 call assert_match("Word 'goood' removed from \./Xspellfile.add", a) 125 let cnt=readfile('./Xspellfile.add') 126 call assert_equal('#oood', cnt[0]) 127 " word not in wordlist 128 let a=execute('unsilent norm! V$zug') 129 call assert_match('', a) 130 let cnt=readfile('./Xspellfile.add') 131 call assert_equal('#oood', cnt[0]) 132 133 " Test for zuw 134 call delete('./Xspellfile.add') 135 2 136 let a=execute('unsilent norm! Vzw') 137 let cnt=readfile('./Xspellfile.add') 138 call assert_equal('2 goood/!', cnt[0]) 139 let a=execute('unsilent norm! Vzuw') 140 call assert_match("Word '2 goood' removed from \./Xspellfile.add", a) 141 let cnt=readfile('./Xspellfile.add') 142 call assert_equal('# goood/!', cnt[0]) 143 " word not in wordlist 144 let a=execute('unsilent norm! $zug') 145 call assert_match('', a) 146 let cnt=readfile('./Xspellfile.add') 147 call assert_equal('# goood/!', cnt[0]) 148 149 " add second entry to spellfile setting 150 set spellfile=./Xspellfile.add,./Xspellfile2.add 151 call delete('./Xspellfile.add') 152 2 153 let a=execute('unsilent norm! $2zg') 154 let cnt=readfile('./Xspellfile2.add') 155 call assert_match("Word 'goood' added to ./Xspellfile2.add", a) 156 call assert_equal('goood', cnt[0]) 157 158 " Test for :spellgood! 159 let temp = execute(':spe!0/0') 160 call assert_match('Invalid region', temp) 161 let spellfile = matchstr(temp, 'Invalid region nr in \zs.*\ze line \d: 0') 162 call assert_equal(['# goood', '# goood/!', '#oood', '0/0'], readfile(spellfile)) 163 164 " Test for :spellrare! 165 :spellrare! raare 166 call assert_equal(['# goood', '# goood/!', '#oood', '0/0', 'raare/?'], readfile(spellfile)) 167 call delete(spellfile) 168 169 " clean up 170 exe "lang" oldlang 171 call delete("./Xspellfile.add") 172 call delete("./Xspellfile2.add") 173 call delete("./Xspellfile.add.spl") 174 call delete("./Xspellfile2.add.spl") 175 176 " zux -> no-op 177 2 178 norm! $zux 179 call assert_equal([], glob('Xspellfile.add',0,1)) 180 call assert_equal([], glob('Xspellfile2.add',0,1)) 181 182 set spellfile= spell& spelllang& 183 bw! 184endfunc 185 186" Spell file content test. Write 'content' to the spell file prefixed by the 187" spell file header and then enable spell checking. If 'emsg' is not empty, 188" then check for error. 189func Spellfile_Test(content, emsg) 190 let splfile = './Xtest/spell/Xtest.utf-8.spl' 191 " Add the spell file header and version (VIMspell2) 192 let v = 0z56494D7370656C6C32 + a:content 193 call writefile(v, splfile, 'b') 194 195 " 'encoding' is set before each test to clear the previously loaded suggest 196 " file from memory. 197 set encoding=utf-8 198 199 set runtimepath=./Xtest 200 set spelllang=Xtest 201 if a:emsg != '' 202 call assert_fails('set spell', a:emsg) 203 else 204 " FIXME: With some invalid spellfile contents, there are no error 205 " messages. So don't know how to check for the test result. 206 set spell 207 endif 208 set nospell spelllang& rtp& 209endfunc 210 211" Test for spell file format errors. 212" The spell file format is described in spellfile.c 213func Test_spellfile_format_error() 214 let save_rtp = &rtp 215 call mkdir('Xtest/spell', 'p') 216 let splfile = './Xtest/spell/Xtest.utf-8.spl' 217 218 " empty spell file 219 call writefile([], splfile) 220 set runtimepath=./Xtest 221 set spelllang=Xtest 222 call assert_fails('set spell', 'E757:') 223 set nospell spelllang& 224 225 " invalid file ID 226 call writefile(0z56494D, splfile, 'b') 227 set runtimepath=./Xtest 228 set spelllang=Xtest 229 call assert_fails('set spell', 'E757:') 230 set nospell spelllang& 231 232 " missing version number 233 call writefile(0z56494D7370656C6C, splfile, 'b') 234 set runtimepath=./Xtest 235 set spelllang=Xtest 236 call assert_fails('set spell', 'E771:') 237 set nospell spelllang& 238 239 " invalid version number 240 call writefile(0z56494D7370656C6C7A, splfile, 'b') 241 set runtimepath=./Xtest 242 set spelllang=Xtest 243 call assert_fails('set spell', 'E772:') 244 set nospell spelllang& 245 246 " no sections 247 call Spellfile_Test(0z, 'E758:') 248 249 " missing section length 250 call Spellfile_Test(0z00, 'E758:') 251 252 " unsupported required section 253 call Spellfile_Test(0z7A0100000004, 'E770:') 254 255 " unsupported not-required section 256 call Spellfile_Test(0z7A0000000004, 'E758:') 257 258 " SN_REGION: invalid number of region names 259 call Spellfile_Test(0z0000000000FF, 'E759:') 260 261 " SN_CHARFLAGS: missing <charflagslen> length 262 call Spellfile_Test(0z010000000004, 'E758:') 263 264 " SN_CHARFLAGS: invalid <charflagslen> length 265 call Spellfile_Test(0z0100000000010201, '') 266 267 " SN_CHARFLAGS: charflagslen == 0 and folcharslen != 0 268 call Spellfile_Test(0z01000000000400000101, 'E759:') 269 270 " SN_CHARFLAGS: missing <folcharslen> length 271 call Spellfile_Test(0z01000000000100, 'E758:') 272 273 " SN_PREFCOND: invalid prefcondcnt 274 call Spellfile_Test(0z03000000000100, 'E759:') 275 276 " SN_PREFCOND: invalid condlen 277 call Spellfile_Test(0z0300000000020001, 'E759:') 278 279 " SN_REP: invalid repcount 280 call Spellfile_Test(0z04000000000100, 'E758:') 281 282 " SN_REP: missing rep 283 call Spellfile_Test(0z0400000000020004, 'E758:') 284 285 " SN_REP: zero repfromlen 286 call Spellfile_Test(0z040000000003000100, 'E759:') 287 288 " SN_REP: invalid reptolen 289 call Spellfile_Test(0z0400000000050001014101, '') 290 291 " SN_REP: zero reptolen 292 call Spellfile_Test(0z0400000000050001014100, 'E759:') 293 294 " SN_SAL: missing salcount 295 call Spellfile_Test(0z05000000000102, 'E758:') 296 297 " SN_SAL: missing salfromlen 298 call Spellfile_Test(0z050000000003080001, 'E758:') 299 300 " SN_SAL: missing saltolen 301 call Spellfile_Test(0z0500000000050400010161, 'E758:') 302 303 " SN_WORDS: non-NUL terminated word 304 call Spellfile_Test(0z0D000000000376696D, 'E758:') 305 306 " SN_WORDS: very long word 307 let v = eval('0z0D000000012C' .. repeat('41', 300)) 308 call Spellfile_Test(v, 'E759:') 309 310 " SN_SOFO: missing sofofromlen 311 call Spellfile_Test(0z06000000000100, 'E758:') 312 313 " SN_SOFO: missing sofotolen 314 call Spellfile_Test(0z06000000000400016100, 'E758:') 315 316 " SN_SOFO: missing sofoto 317 call Spellfile_Test(0z0600000000050001610000, 'E759:') 318 319 " SN_SOFO: empty sofofrom and sofoto 320 call Spellfile_Test(0z06000000000400000000FF000000000000000000000000, '') 321 322 " SN_SOFO: multi-byte characters in sofofrom and sofoto 323 call Spellfile_Test(0z0600000000080002CF810002CF82FF000000000000000000000000, '') 324 325 " SN_COMPOUND: compmax is less than 2 326 call Spellfile_Test(0z08000000000101, 'E759:') 327 328 " SN_COMPOUND: missing compsylmax and other options 329 call Spellfile_Test(0z0800000000020401, 'E759:') 330 331 " SN_COMPOUND: missing compoptions 332 call Spellfile_Test(0z080000000005040101, 'E758:') 333 334 " SN_COMPOUND: missing comppattern 335 call Spellfile_Test(0z08000000000704010100000001, 'E758:') 336 337 " SN_COMPOUND: incorrect comppatlen 338 call Spellfile_Test(0z080000000007040101000000020165, 'E758:') 339 340 " SN_INFO: missing info 341 call Spellfile_Test(0z0F0000000005040101, '') 342 343 " SN_MIDWORD: missing midword 344 call Spellfile_Test(0z0200000000040102, '') 345 346 " SN_MAP: missing midword 347 call Spellfile_Test(0z0700000000040102, '') 348 349 " SN_MAP: empty map string 350 call Spellfile_Test(0z070000000000FF000000000000000000000000, '') 351 352 " SN_MAP: duplicate multibyte character 353 call Spellfile_Test(0z070000000004DC81DC81, 'E783:') 354 355 " SN_SYLLABLE: missing SYLLABLE item 356 call Spellfile_Test(0z0900000000040102, '') 357 358 " SN_SYLLABLE: More than SY_MAXLEN size 359 let v = eval('0z090000000022612F' .. repeat('62', 32)) 360 call Spellfile_Test(v, '') 361 362 " LWORDTREE: missing 363 call Spellfile_Test(0zFF, 'E758:') 364 365 " LWORDTREE: missing tree node 366 call Spellfile_Test(0zFF00000004, 'E758:') 367 368 " LWORDTREE: missing tree node value 369 call Spellfile_Test(0zFF0000000402, 'E758:') 370 371 " LWORDTREE: incorrect sibling node count 372 call Spellfile_Test(0zFF00000001040000000000000000, 'E759:') 373 374 " KWORDTREE: missing tree node 375 call Spellfile_Test(0zFF0000000000000004, 'E758:') 376 377 " PREFIXTREE: missing tree node 378 call Spellfile_Test(0zFF000000000000000000000004, 'E758:') 379 380 " PREFIXTREE: incorrect prefcondnr 381 call Spellfile_Test(0zFF000000000000000000000002010200000020, 'E759:') 382 383 " PREFIXTREE: invalid nodeidx 384 call Spellfile_Test(0zFF00000000000000000000000201010000, 'E759:') 385 386 let &rtp = save_rtp 387 call delete('Xtest', 'rf') 388endfunc 389 390" Test for format errors in suggest file 391func Test_sugfile_format_error() 392 let save_rtp = &rtp 393 call mkdir('Xtest/spell', 'p') 394 let splfile = './Xtest/spell/Xtest.utf-8.spl' 395 let sugfile = './Xtest/spell/Xtest.utf-8.sug' 396 397 " create an empty spell file with a suggest timestamp 398 call writefile(0z56494D7370656C6C320B00000000080000000000000044FF000000000000000000000000, splfile, 'b') 399 400 " 'encoding' is set before each test to clear the previously loaded suggest 401 " file from memory. 402 403 " empty suggest file 404 set encoding=utf-8 405 call writefile([], sugfile) 406 set runtimepath=./Xtest 407 set spelllang=Xtest 408 set spell 409 call assert_fails("let s = spellsuggest('abc')", 'E778:') 410 set nospell spelllang& 411 412 " zero suggest version 413 set encoding=utf-8 414 call writefile(0z56494D73756700, sugfile) 415 set runtimepath=./Xtest 416 set spelllang=Xtest 417 set spell 418 call assert_fails("let s = spellsuggest('abc')", 'E779:') 419 set nospell spelllang& 420 421 " unsupported suggest version 422 set encoding=utf-8 423 call writefile(0z56494D7375671F, sugfile) 424 set runtimepath=./Xtest 425 set spelllang=Xtest 426 set spell 427 call assert_fails("let s = spellsuggest('abc')", 'E780:') 428 set nospell spelllang& 429 430 " missing suggest timestamp 431 set encoding=utf-8 432 call writefile(0z56494D73756701, sugfile) 433 set runtimepath=./Xtest 434 set spelllang=Xtest 435 set spell 436 call assert_fails("let s = spellsuggest('abc')", 'E781:') 437 set nospell spelllang& 438 439 " incorrect suggest timestamp 440 set encoding=utf-8 441 call writefile(0z56494D7375670100000000000000FF, sugfile) 442 set runtimepath=./Xtest 443 set spelllang=Xtest 444 set spell 445 call assert_fails("let s = spellsuggest('abc')", 'E781:') 446 set nospell spelllang& 447 448 " missing suggest wordtree 449 set encoding=utf-8 450 call writefile(0z56494D737567010000000000000044, sugfile) 451 set runtimepath=./Xtest 452 set spelllang=Xtest 453 set spell 454 call assert_fails("let s = spellsuggest('abc')", 'E782:') 455 set nospell spelllang& 456 457 " invalid suggest word count in SUGTABLE 458 set encoding=utf-8 459 call writefile(0z56494D7375670100000000000000440000000022, sugfile) 460 set runtimepath=./Xtest 461 set spelllang=Xtest 462 set spell 463 call assert_fails("let s = spellsuggest('abc')", 'E782:') 464 set nospell spelllang& 465 466 " missing sugline in SUGTABLE 467 set encoding=utf-8 468 call writefile(0z56494D7375670100000000000000440000000000000005, sugfile) 469 set runtimepath=./Xtest 470 set spelllang=Xtest 471 set spell 472 call assert_fails("let s = spellsuggest('abc')", 'E782:') 473 set nospell spelllang& 474 475 let &rtp = save_rtp 476 call delete('Xtest', 'rf') 477endfunc 478 479" Test for using :mkspell to create a spell file from a list of words 480func Test_wordlist_dic() 481 " duplicate encoding 482 let lines =<< trim [END] 483 # This is an example word list 484 485 /encoding=latin1 486 /encoding=latin1 487 example 488 [END] 489 call writefile(lines, 'Xwordlist.dic') 490 let output = execute('mkspell Xwordlist.spl Xwordlist.dic') 491 call assert_match('Duplicate /encoding= line ignored in Xwordlist.dic line 4: /encoding=latin1', output) 492 493 " multiple encoding for a word 494 let lines =<< trim [END] 495 example 496 /encoding=latin1 497 example 498 [END] 499 call writefile(lines, 'Xwordlist.dic') 500 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 501 call assert_match('/encoding= line after word ignored in Xwordlist.dic line 2: /encoding=latin1', output) 502 503 " unsupported encoding for a word 504 let lines =<< trim [END] 505 /encoding=Xtest 506 example 507 [END] 508 call writefile(lines, 'Xwordlist.dic') 509 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 510 call assert_match('Conversion in Xwordlist.dic not supported: from Xtest to utf-8', output) 511 512 " duplicate region 513 let lines =<< trim [END] 514 /regions=usca 515 /regions=usca 516 example 517 [END] 518 call writefile(lines, 'Xwordlist.dic') 519 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 520 call assert_match('Duplicate /regions= line ignored in Xwordlist.dic line 2: regions=usca', output) 521 522 " maximum regions 523 let lines =<< trim [END] 524 /regions=uscauscauscauscausca 525 example 526 [END] 527 call writefile(lines, 'Xwordlist.dic') 528 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 529 call assert_match('Too many regions in Xwordlist.dic line 1: uscauscauscauscausca', output) 530 531 " unsupported '/' value 532 let lines =<< trim [END] 533 /test=abc 534 example 535 [END] 536 call writefile(lines, 'Xwordlist.dic') 537 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 538 call assert_match('/ line ignored in Xwordlist.dic line 1: /test=abc', output) 539 540 " unsupported flag 541 let lines =<< trim [END] 542 example/+ 543 [END] 544 call writefile(lines, 'Xwordlist.dic') 545 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 546 call assert_match('Unrecognized flags in Xwordlist.dic line 1: +', output) 547 548 " non-ascii word 549 call writefile(["ʀʀ"], 'Xwordlist.dic') 550 let output = execute('mkspell! -ascii Xwordlist.spl Xwordlist.dic') 551 call assert_match('Ignored 1 words with non-ASCII characters', output) 552 553 " keep case of a word 554 let lines =<< trim [END] 555 example/= 556 [END] 557 call writefile(lines, 'Xwordlist.dic') 558 let output = execute('mkspell! Xwordlist.spl Xwordlist.dic') 559 call assert_match('Compressed keep-case:', output) 560 561 call delete('Xwordlist.spl') 562 call delete('Xwordlist.dic') 563endfunc 564 565" Test for the :mkspell command 566func Test_mkspell() 567 call assert_fails('mkspell Xtest_us.spl', 'E751:') 568 call assert_fails('mkspell Xtest.spl abc', 'E484:') 569 call assert_fails('mkspell a b c d e f g h i j k', 'E754:') 570 571 " create a .aff file but not the .dic file 572 call writefile([], 'Xtest.aff') 573 call assert_fails('mkspell Xtest.spl Xtest', 'E484:') 574 call delete('Xtest.aff') 575 576 call writefile([], 'Xtest.spl') 577 call writefile([], 'Xtest.dic') 578 call assert_fails('mkspell Xtest.spl Xtest.dic', 'E13:') 579 call delete('Xtest.spl') 580 call delete('Xtest.dic') 581 582 call mkdir('Xtest.spl') 583 call assert_fails('mkspell! Xtest.spl Xtest.dic', 'E17:') 584 call delete('Xtest.spl', 'rf') 585 586 " can't write the .spl file as its directory does not exist 587 call writefile([], 'Xtest.aff') 588 call writefile([], 'Xtest.dic') 589 call assert_fails('mkspell DOES_NOT_EXIT/Xtest.spl Xtest.dic', 'E484:') 590 call delete('Xtest.aff') 591 call delete('Xtest.dic') 592 593 call assert_fails('mkspell en en_US abc_xyz', 'E755:') 594endfunc 595 596" Tests for :mkspell with a .dic and .aff file 597func Test_aff_file_format_error() 598 " FIXME: For some reason, the :mkspell command below doesn't fail on the 599 " MS-Windows CI build. Disable this test on MS-Windows for now. 600 CheckNotMSWindows 601 602 " No word count in .dic file 603 call writefile([], 'Xtest.dic') 604 call writefile([], 'Xtest.aff') 605 call assert_fails('mkspell! Xtest.spl Xtest', 'E760:') 606 607 " create a .dic file for the tests below 608 call writefile(['1', 'work'], 'Xtest.dic') 609 610 " Invalid encoding in .aff file 611 call writefile(['# comment', 'SET Xinvalidencoding'], 'Xtest.aff') 612 let output = execute('mkspell! Xtest.spl Xtest') 613 call assert_match('Conversion in Xtest.aff not supported: from xinvalidencoding', output) 614 615 " Invalid flag in .aff file 616 call writefile(['FLAG xxx'], 'Xtest.aff') 617 let output = execute('mkspell! Xtest.spl Xtest') 618 call assert_match('Invalid value for FLAG in Xtest.aff line 1: xxx', output) 619 620 " set FLAGS after using flag for an affix 621 call writefile(['SFX L Y 1', 'SFX L 0 re [^x]', 'FLAG long'], 'Xtest.aff') 622 let output = execute('mkspell! Xtest.spl Xtest') 623 call assert_match('FLAG after using flags in Xtest.aff line 3: long', output) 624 625 " INFO in affix file 626 let save_encoding = &encoding 627 call mkdir('Xrtp/spell', 'p') 628 call writefile(['1', 'work'], 'Xrtp/spell/Xtest.dic') 629 call writefile(['NAME klingon', 'VERSION 1.4', 'AUTHOR Spock'], 630 \ 'Xrtp/spell/Xtest.aff') 631 silent mkspell! Xrtp/spell/Xtest.utf-8.spl Xrtp/spell/Xtest 632 let save_rtp = &rtp 633 set runtimepath=./Xrtp 634 set spelllang=Xtest 635 set spell 636 let output = split(execute('spellinfo'), "\n") 637 call assert_equal("NAME klingon", output[1]) 638 call assert_equal("VERSION 1.4", output[2]) 639 call assert_equal("AUTHOR Spock", output[3]) 640 let &rtp = save_rtp 641 call delete('Xrtp', 'rf') 642 set spell& spelllang& spellfile& 643 %bw! 644 " 'encoding' must be set again to clear the spell file in memory 645 let &encoding = save_encoding 646 647 " COMPOUNDFORBIDFLAG flag after PFX in an affix file 648 call writefile(['PFX L Y 1', 'PFX L 0 re x', 'COMPOUNDFLAG c', 'COMPOUNDFORBIDFLAG x'], 649 \ 'Xtest.aff') 650 let output = execute('mkspell! Xtest.spl Xtest') 651 call assert_match('Defining COMPOUNDFORBIDFLAG after PFX item may give wrong results in Xtest.aff line 4', output) 652 653 " COMPOUNDPERMITFLAG flag after PFX in an affix file 654 call writefile(['PFX L Y 1', 'PFX L 0 re x', 'COMPOUNDPERMITFLAG c'], 655 \ 'Xtest.aff') 656 let output = execute('mkspell! Xtest.spl Xtest') 657 call assert_match('Defining COMPOUNDPERMITFLAG after PFX item may give wrong results in Xtest.aff line 3', output) 658 659 " Wrong COMPOUNDRULES flag value in an affix file 660 call writefile(['COMPOUNDRULES a'], 'Xtest.aff') 661 let output = execute('mkspell! Xtest.spl Xtest') 662 call assert_match('Wrong COMPOUNDRULES value in Xtest.aff line 1: a', output) 663 664 " Wrong COMPOUNDWORDMAX flag value in an affix file 665 call writefile(['COMPOUNDWORDMAX 0'], 'Xtest.aff') 666 let output = execute('mkspell! Xtest.spl Xtest') 667 call assert_match('Wrong COMPOUNDWORDMAX value in Xtest.aff line 1: 0', output) 668 669 " Wrong COMPOUNDMIN flag value in an affix file 670 call writefile(['COMPOUNDMIN 0'], 'Xtest.aff') 671 let output = execute('mkspell! Xtest.spl Xtest') 672 call assert_match('Wrong COMPOUNDMIN value in Xtest.aff line 1: 0', output) 673 674 " Wrong COMPOUNDSYLMAX flag value in an affix file 675 call writefile(['COMPOUNDSYLMAX 0'], 'Xtest.aff') 676 let output = execute('mkspell! Xtest.spl Xtest') 677 call assert_match('Wrong COMPOUNDSYLMAX value in Xtest.aff line 1: 0', output) 678 679 " Wrong CHECKCOMPOUNDPATTERN flag value in an affix file 680 call writefile(['CHECKCOMPOUNDPATTERN 0'], 'Xtest.aff') 681 let output = execute('mkspell! Xtest.spl Xtest') 682 call assert_match('Wrong CHECKCOMPOUNDPATTERN value in Xtest.aff line 1: 0', output) 683 684 " Both compounding and NOBREAK specified 685 call writefile(['COMPOUNDFLAG c', 'NOBREAK'], 'Xtest.aff') 686 let output = execute('mkspell! Xtest.spl Xtest') 687 call assert_match('Warning: both compounding and NOBREAK specified', output) 688 689 " Duplicate affix entry in an affix file 690 call writefile(['PFX L Y 1', 'PFX L 0 re x', 'PFX L Y 1', 'PFX L 0 re x'], 691 \ 'Xtest.aff') 692 let output = execute('mkspell! Xtest.spl Xtest') 693 call assert_match('Duplicate affix in Xtest.aff line 3: L', output) 694 695 " Duplicate affix entry in an affix file 696 call writefile(['PFX L Y 1', 'PFX L Y 1'], 'Xtest.aff') 697 let output = execute('mkspell! Xtest.spl Xtest') 698 call assert_match('Unrecognized or duplicate item in Xtest.aff line 2: PFX', output) 699 700 " Different combining flags in an affix file 701 call writefile(['PFX L Y 1', 'PFX L 0 re x', 'PFX L N 1'], 'Xtest.aff') 702 let output = execute('mkspell! Xtest.spl Xtest') 703 call assert_match('Different combining flag in continued affix block in Xtest.aff line 3', output) 704 705 " Try to reuse a affix used for BAD flag 706 call writefile(['BAD x', 'PFX x Y 1', 'PFX x 0 re x'], 'Xtest.aff') 707 let output = execute('mkspell! Xtest.spl Xtest') 708 call assert_match('Affix also used for BAD/RARE/KEEPCASE/NEEDAFFIX/NEEDCOMPOUND/NOSUGGEST in Xtest.aff line 2: x', output) 709 710 " Trailing characters in an affix entry 711 call writefile(['PFX L Y 1 Test', 'PFX L 0 re x'], 'Xtest.aff') 712 let output = execute('mkspell! Xtest.spl Xtest') 713 call assert_match('Trailing text in Xtest.aff line 1: Test', output) 714 715 " Trailing characters in an affix entry 716 call writefile(['PFX L Y 1', 'PFX L 0 re x Test'], 'Xtest.aff') 717 let output = execute('mkspell! Xtest.spl Xtest') 718 call assert_match('Trailing text in Xtest.aff line 2: Test', output) 719 720 " Incorrect combine flag in an affix entry 721 call writefile(['PFX L X 1', 'PFX L 0 re x'], 'Xtest.aff') 722 let output = execute('mkspell! Xtest.spl Xtest') 723 call assert_match('Expected Y or N in Xtest.aff line 1: X', output) 724 725 " Invalid count for REP item 726 call writefile(['REP a'], 'Xtest.aff') 727 let output = execute('mkspell! Xtest.spl Xtest') 728 call assert_match('Expected REP(SAL) count in Xtest.aff line 1', output) 729 730 " Trailing characters in REP item 731 call writefile(['REP 1', 'REP f ph test'], 'Xtest.aff') 732 let output = execute('mkspell! Xtest.spl Xtest') 733 call assert_match('Trailing text in Xtest.aff line 2: test', output) 734 735 " Invalid count for MAP item 736 call writefile(['MAP a'], 'Xtest.aff') 737 let output = execute('mkspell! Xtest.spl Xtest') 738 call assert_match('Expected MAP count in Xtest.aff line 1', output) 739 740 " Duplicate character in a MAP item 741 call writefile(['MAP 2', 'MAP xx', 'MAP yy'], 'Xtest.aff') 742 let output = execute('mkspell! Xtest.spl Xtest') 743 call assert_match('Duplicate character in MAP in Xtest.aff line 2', output) 744 745 " Use COMPOUNDSYLMAX without SYLLABLE 746 call writefile(['COMPOUNDSYLMAX 2'], 'Xtest.aff') 747 let output = execute('mkspell! Xtest.spl Xtest') 748 call assert_match('COMPOUNDSYLMAX used without SYLLABLE', output) 749 750 " Missing SOFOTO 751 call writefile(['SOFOFROM abcdef'], 'Xtest.aff') 752 let output = execute('mkspell! Xtest.spl Xtest') 753 call assert_match('Missing SOFOTO line in Xtest.aff', output) 754 755 " Length of SOFOFROM and SOFOTO differ 756 call writefile(['SOFOFROM abcde', 'SOFOTO ABCD'], 'Xtest.aff') 757 call assert_fails('mkspell! Xtest.spl Xtest', 'E759:') 758 759 " Both SAL and SOFOFROM/SOFOTO items 760 call writefile(['SOFOFROM abcd', 'SOFOTO ABCD', 'SAL CIA X'], 'Xtest.aff') 761 let output = execute('mkspell! Xtest.spl Xtest') 762 call assert_match('Both SAL and SOFO lines in Xtest.aff', output) 763 764 " use an alphabet flag when FLAG is num 765 call writefile(['FLAG num', 'SFX L Y 1', 'SFX L 0 re [^x]'], 'Xtest.aff') 766 let output = execute('mkspell! Xtest.spl Xtest') 767 call assert_match('Flag is not a number in Xtest.aff line 2: L', output) 768 769 " use number and alphabet flag when FLAG is num 770 call writefile(['FLAG num', 'SFX 4f Y 1', 'SFX 4f 0 re [^x]'], 'Xtest.aff') 771 let output = execute('mkspell! Xtest.spl Xtest') 772 call assert_match('Affix name too long in Xtest.aff line 2: 4f', output) 773 774 " use a single character flag when FLAG is long 775 call writefile(['FLAG long', 'SFX L Y 1', 'SFX L 0 re [^x]'], 'Xtest.aff') 776 let output = execute('mkspell! Xtest.spl Xtest') 777 call assert_match('Illegal flag in Xtest.aff line 2: L', output) 778 779 " missing character in UPP entry. The character table is used only in a 780 " non-utf8 encoding 781 call writefile(['FOL abc', 'LOW abc', 'UPP A'], 'Xtest.aff') 782 let save_encoding = &encoding 783 set encoding=cp949 784 call assert_fails('mkspell! Xtest.spl Xtest', 'E761:') 785 let &encoding = save_encoding 786 787 " character range doesn't match between FOL and LOW entries 788 call writefile(["FOL \u0102bc", 'LOW abc', 'UPP ABC'], 'Xtest.aff') 789 let save_encoding = &encoding 790 set encoding=cp949 791 call assert_fails('mkspell! Xtest.spl Xtest', 'E762:') 792 let &encoding = save_encoding 793 794 " character range doesn't match between FOL and UPP entries 795 call writefile(["FOL \u0102bc", "LOW \u0102bc", 'UPP ABC'], 'Xtest.aff') 796 let save_encoding = &encoding 797 set encoding=cp949 798 call assert_fails('mkspell! Xtest.spl Xtest', 'E762:') 799 let &encoding = save_encoding 800 801 " additional characters in LOW and UPP entries 802 call writefile(["FOL ab", "LOW abc", 'UPP ABC'], 'Xtest.aff') 803 let save_encoding = &encoding 804 set encoding=cp949 805 call assert_fails('mkspell! Xtest.spl Xtest', 'E761:') 806 let &encoding = save_encoding 807 808 " missing UPP entry 809 call writefile(["FOL abc", "LOW abc"], 'Xtest.aff') 810 let save_encoding = &encoding 811 set encoding=cp949 812 let output = execute('mkspell! Xtest.spl Xtest') 813 call assert_match('Missing FOL/LOW/UPP line in Xtest.aff', output) 814 let &encoding = save_encoding 815 816 " duplicate word in the .dic file 817 call writefile(['2', 'good', 'good', 'good'], 'Xtest.dic') 818 call writefile(['NAME vim'], 'Xtest.aff') 819 let output = execute('mkspell! Xtest.spl Xtest') 820 call assert_match('First duplicate word in Xtest.dic line 3: good', output) 821 call assert_match('2 duplicate word(s) in Xtest.dic', output) 822 823 " use multiple .aff files with different values for COMPOUNDWORDMAX and 824 " MIDWORD (number and string) 825 call writefile(['1', 'world'], 'Xtest_US.dic') 826 call writefile(['1', 'world'], 'Xtest_CA.dic') 827 call writefile(["COMPOUNDWORDMAX 3", "MIDWORD '-"], 'Xtest_US.aff') 828 call writefile(["COMPOUNDWORDMAX 4", "MIDWORD '="], 'Xtest_CA.aff') 829 let output = execute('mkspell! Xtest.spl Xtest_US Xtest_CA') 830 call assert_match('COMPOUNDWORDMAX value differs from what is used in another .aff file', output) 831 call assert_match('MIDWORD value differs from what is used in another .aff file', output) 832 call delete('Xtest_US.dic') 833 call delete('Xtest_CA.dic') 834 call delete('Xtest_US.aff') 835 call delete('Xtest_CA.aff') 836 837 call delete('Xtest.dic') 838 call delete('Xtest.aff') 839 call delete('Xtest.spl') 840 call delete('Xtest.sug') 841endfunc 842 843func Test_spell_add_word() 844 set spellfile= 845 call assert_fails('spellgood abc', 'E764:') 846 847 set spellfile=Xtest.utf-8.add 848 call assert_fails('2spellgood abc', 'E765:') 849 850 edit Xtest.utf-8.add 851 call setline(1, 'sample') 852 call assert_fails('spellgood abc', 'E139:') 853 set spellfile& 854 %bw! 855endfunc 856 857func Test_spellfile_verbose() 858 call writefile(['1', 'one'], 'XtestVerbose.dic') 859 call writefile([], 'XtestVerbose.aff') 860 mkspell! XtestVerbose-utf8.spl XtestVerbose 861 set spell 862 863 " First time: the spl file should be read. 864 let a = execute('3verbose set spelllang=XtestVerbose-utf8.spl') 865 call assert_match('Reading spell file "XtestVerbose-utf8.spl"', a) 866 867 " Second time time: the spl file should not be read (already read). 868 let a = execute('3verbose set spelllang=XtestVerbose-utf8.spl') 869 call assert_notmatch('Reading spell file "XtestVerbose-utf8.spl"', a) 870 871 set spell& spelllang& 872 call delete('XtestVerbose.dic') 873 call delete('XtestVerbose.aff') 874 call delete('XtestVerbose-utf8.spl') 875endfunc 876 877" Test NOBREAK (see :help spell-NOBREAK) 878func Test_NOBREAK() 879 call writefile(['3', 'one', 'two', 'three' ], 'XtestNOBREAK.dic') 880 call writefile(['NOBREAK' ], 'XtestNOBREAK.aff') 881 882 mkspell! XtestNOBREAK-utf8.spl XtestNOBREAK 883 set spell spelllang=XtestNOBREAK-utf8.spl 884 885 call assert_equal(['', ''], spellbadword('One two three onetwo onetwothree threetwoone')) 886 887 call assert_equal(['x', 'bad'], spellbadword('x')) 888 call assert_equal(['y', 'bad'], spellbadword('yone')) 889 call assert_equal(['z', 'bad'], spellbadword('onez')) 890 call assert_equal(['zero', 'bad'], spellbadword('Onetwozerothree')) 891 892 new 893 call setline(1, 'Onetwwothree') 894 norm! fw1z= 895 call assert_equal('Onetwothree', getline(1)) 896 call setline(1, 'Onetwothre') 897 norm! fh1z= 898 call assert_equal('Onetwothree', getline(1)) 899 900 bw! 901 set spell& spelllang& 902 call delete('XtestNOBREAK.dic') 903 call delete('XtestNOBREAK.aff') 904 call delete('XtestNOBREAK-utf8.spl') 905endfunc 906 907" Test CHECKCOMPOUNDPATTERN (see :help spell-CHECKCOMPOUNDPATTERN) 908func Test_spellfile_CHECKCOMPOUNDPATTERN() 909 call writefile(['4', 910 \ 'one/c', 911 \ 'two/c', 912 \ 'three/c', 913 \ 'four'], 'XtestCHECKCOMPOUNDPATTERN.dic') 914 " Forbid compound words where first word ends with 'wo' and second starts with 'on'. 915 call writefile(['CHECKCOMPOUNDPATTERN 1', 916 \ 'CHECKCOMPOUNDPATTERN wo on', 917 \ 'COMPOUNDFLAG c'], 'XtestCHECKCOMPOUNDPATTERN.aff') 918 919 mkspell! XtestCHECKCOMPOUNDPATTERN-utf8.spl XtestCHECKCOMPOUNDPATTERN 920 set spell spelllang=XtestCHECKCOMPOUNDPATTERN-utf8.spl 921 922 " Check valid words with and without valid compounds. 923 for goodword in ['one', 'two', 'three', 'four', 924 \ 'oneone', 'onetwo', 'onethree', 925 \ 'twotwo', 'twothree', 926 \ 'threeone', 'threetwo', 'threethree', 927 \ 'onetwothree', 'onethreetwo', 'twothreeone', 'oneoneone'] 928 call assert_equal(['', ''], spellbadword(goodword), goodword) 929 endfor 930 931 " Compounds 'twoone' or 'threetwoone' should be forbidden by CHECKCOMPOUNPATTERN. 932 " 'four' does not have the 'c' flag in *.aff file so no compound. 933 " 'five' is not in the *.dic file. 934 for badword in ['five', 'onetwox', 935 \ 'twoone', 'threetwoone', 936 \ 'fourone', 'onefour'] 937 call assert_equal([badword, 'bad'], spellbadword(badword)) 938 endfor 939 940 set spell& spelllang& 941 call delete('XtestCHECKCOMPOUNDPATTERN.dic') 942 call delete('XtestCHECKCOMPOUNDPATTERN.aff') 943 call delete('XtestCHECKCOMPOUNDPATTERN-utf8.spl') 944endfunc 945 946" Test NOCOMPOUNDSUGS (see :help spell-NOCOMPOUNDSUGS) 947func Test_spellfile_NOCOMPOUNDSUGS() 948 call writefile(['3', 949 \ 'one/c', 950 \ 'two/c', 951 \ 'three/c'], 'XtestNOCOMPOUNDSUGS.dic') 952 953 " pass 0 tests without NOCOMPOUNDSUGS, pass 1 tests with NOCOMPOUNDSUGS 954 for pass in [0, 1] 955 if pass == 0 956 call writefile(['COMPOUNDFLAG c'], 'XtestNOCOMPOUNDSUGS.aff') 957 else 958 call writefile(['NOCOMPOUNDSUGS', 959 \ 'COMPOUNDFLAG c'], 'XtestNOCOMPOUNDSUGS.aff') 960 endif 961 962 mkspell! XtestNOCOMPOUNDSUGS-utf8.spl XtestNOCOMPOUNDSUGS 963 set spell spelllang=XtestNOCOMPOUNDSUGS-utf8.spl 964 965 for goodword in ['one', 'two', 'three', 966 \ 'oneone', 'onetwo', 'onethree', 967 \ 'twoone', 'twotwo', 'twothree', 968 \ 'threeone', 'threetwo', 'threethree', 969 \ 'onetwothree', 'onethreetwo', 'twothreeone', 'oneoneone'] 970 call assert_equal(['', ''], spellbadword(goodword), goodword) 971 endfor 972 973 for badword in ['four', 'onetwox', 'onexone'] 974 call assert_equal([badword, 'bad'], spellbadword(badword)) 975 endfor 976 977 if pass == 0 978 call assert_equal(['one', 'oneone'], spellsuggest('onne', 2)) 979 call assert_equal(['onethree', 'one three'], spellsuggest('onethre', 2)) 980 else 981 call assert_equal(['one', 'one one'], spellsuggest('onne', 2)) 982 call assert_equal(['one three'], spellsuggest('onethre', 2)) 983 endif 984 endfor 985 986 set spell& spelllang& 987 call delete('XtestNOCOMPOUNDSUGS.dic') 988 call delete('XtestNOCOMPOUNDSUGS.aff') 989 call delete('XtestNOCOMPOUNDSUGS-utf8.spl') 990endfunc 991 992" Test COMMON (better suggestions with common words, see :help spell-COMMON) 993func Test_spellfile_COMMON() 994 call writefile(['7', 995 \ 'and', 996 \ 'ant', 997 \ 'end', 998 \ 'any', 999 \ 'tee', 1000 \ 'the', 1001 \ 'ted'], 'XtestCOMMON.dic') 1002 call writefile(['COMMON the and'], 'XtestCOMMON.aff') 1003 1004 mkspell! XtestCOMMON-utf8.spl XtestCOMMON 1005 set spell spelllang=XtestCOMMON-utf8.spl 1006 1007 " COMMON words 'and' and 'the' should be the top suggestions. 1008 call assert_equal(['and', 'ant'], spellsuggest('anr', 2)) 1009 call assert_equal(['and', 'end'], spellsuggest('ond', 2)) 1010 call assert_equal(['the', 'ted'], spellsuggest('tha', 2)) 1011 call assert_equal(['the', 'tee'], spellsuggest('dhe', 2)) 1012 1013 set spell& spelllang& 1014 call delete('XtestCOMMON.dic') 1015 call delete('XtestCOMMON.aff') 1016 call delete('XtestCOMMON-utf8.spl') 1017endfunc 1018 1019" Test NOSUGGEST (see :help spell-COMMON) 1020func Test_spellfile_NOSUGGEST() 1021 call writefile(['2', 'foo/X', 'fog'], 'XtestNOSUGGEST.dic') 1022 call writefile(['NOSUGGEST X'], 'XtestNOSUGGEST.aff') 1023 1024 mkspell! XtestNOSUGGEST-utf8.spl XtestNOSUGGEST 1025 set spell spelllang=XtestNOSUGGEST-utf8.spl 1026 1027 for goodword in ['foo', 'Foo', 'FOO', 'fog', 'Fog', 'FOG'] 1028 call assert_equal(['', ''], spellbadword(goodword), goodword) 1029 endfor 1030 for badword in ['foO', 'fOO', 'fooo', 'foog', 'foofog', 'fogfoo'] 1031 call assert_equal([badword, 'bad'], spellbadword(badword)) 1032 endfor 1033 1034 call assert_equal(['fog'], spellsuggest('fooo', 1)) 1035 call assert_equal(['fog'], spellsuggest('fOo', 1)) 1036 call assert_equal(['fog'], spellsuggest('foG', 1)) 1037 call assert_equal(['fog'], spellsuggest('fogg', 1)) 1038 1039 set spell& spelllang& 1040 call delete('XtestNOSUGGEST.dic') 1041 call delete('XtestNOSUGGEST.aff') 1042 call delete('XtestNOSUGGEST-utf8.spl') 1043endfunc 1044 1045 1046" Test CIRCUMFIX (see: :help spell-CIRCUMFIX) 1047func Test_spellfile_CIRCUMFIX() 1048 " Example taken verbatim from https://github.com/hunspell/hunspell/tree/master/tests 1049 call writefile(['1', 1050 \ 'nagy/C po:adj'], 'XtestCIRCUMFIX.dic') 1051 call writefile(['# circumfixes: ~ obligate prefix/suffix combinations', 1052 \ '# superlative in Hungarian: leg- (prefix) AND -bb (suffix)', 1053 \ '', 1054 \ 'CIRCUMFIX X', 1055 \ '', 1056 \ 'PFX A Y 1', 1057 \ 'PFX A 0 leg/X .', 1058 \ '', 1059 \ 'PFX B Y 1', 1060 \ 'PFX B 0 legesleg/X .', 1061 \ '', 1062 \ 'SFX C Y 3', 1063 \ 'SFX C 0 obb . is:COMPARATIVE', 1064 \ 'SFX C 0 obb/AX . is:SUPERLATIVE', 1065 \ 'SFX C 0 obb/BX . is:SUPERSUPERLATIVE'], 'XtestCIRCUMFIX.aff') 1066 1067 mkspell! XtestCIRCUMFIX-utf8.spl XtestCIRCUMFIX 1068 set spell spelllang=XtestCIRCUMFIX-utf8.spl 1069 1070 " From https://catalog.ldc.upenn.edu/docs/LDC2008T01/acta04.pdf: 1071 " Hungarian English 1072 " --------- ------- 1073 " nagy great 1074 " nagyobb greater 1075 " legnagyobb greatest 1076 " legeslegnagyob most greatest 1077 call assert_equal(['', ''], spellbadword('nagy nagyobb legnagyobb legeslegnagyobb')) 1078 1079 for badword in ['legnagy', 'legeslegnagy', 'legobb', 'legeslegobb'] 1080 call assert_equal([badword, 'bad'], spellbadword(badword)) 1081 endfor 1082 1083 set spell& spelllang& 1084 call delete('XtestCIRCUMFIX.dic') 1085 call delete('XtestCIRCUMFIX.aff') 1086 call delete('XtestCIRCUMFIX-utf8.spl') 1087endfunc 1088 1089" Test SFX that strips/chops characters 1090func Test_spellfile_SFX_strip() 1091 " Simplified conjugation of Italian verbs ending in -are (first conjugation). 1092 call writefile(['SFX A Y 4', 1093 \ 'SFX A are iamo [^icg]are', 1094 \ 'SFX A are hiamo [cg]are', 1095 \ 'SFX A re mo iare', 1096 \ 'SFX A re vamo are'], 1097 \ 'XtestSFX.aff') 1098 " Examples of Italian verbs: 1099 " - cantare = to sing 1100 " - cercare = to search 1101 " - odiare = to hate 1102 call writefile(['3', 'cantare/A', 'cercare/A', 'odiare/A'], 'XtestSFX.dic') 1103 1104 mkspell! XtestSFX-utf8.spl XtestSFX 1105 set spell spelllang=XtestSFX-utf8.spl 1106 1107 " To sing, we're singing, we were singing. 1108 call assert_equal(['', ''], spellbadword('cantare cantiamo cantavamo')) 1109 1110 " To search, we're searching, we were searching. 1111 call assert_equal(['', ''], spellbadword('cercare cerchiamo cercavamo')) 1112 1113 " To hate, we hate, we were hating. 1114 call assert_equal(['', ''], spellbadword('odiare odiamo odiavamo')) 1115 1116 for badword in ['canthiamo', 'cerciamo', 'cantarevamo', 'odiiamo'] 1117 call assert_equal([badword, 'bad'], spellbadword(badword)) 1118 endfor 1119 1120 call assert_equal(['cantiamo'], spellsuggest('canthiamo', 1)) 1121 call assert_equal(['cerchiamo'], spellsuggest('cerciamo', 1)) 1122 call assert_equal(['cantavamo'], spellsuggest('cantarevamo', 1)) 1123 call assert_equal(['odiamo'], spellsuggest('odiiamo', 1)) 1124 1125 set spell& spelllang& 1126 call delete('XtestSFX.dic') 1127 call delete('XtestSFX.aff') 1128 call delete('XtestSFX-utf8.spl') 1129endfunc 1130 1131" When 'spellfile' is not set, adding a new good word will automatically set 1132" the 'spellfile' 1133func Test_init_spellfile() 1134 let save_rtp = &rtp 1135 let save_encoding = &encoding 1136 call mkdir('Xrtp/spell', 'p') 1137 call writefile(['vim'], 'Xrtp/spell/Xtest.dic') 1138 silent mkspell Xrtp/spell/Xtest.utf-8.spl Xrtp/spell/Xtest.dic 1139 set runtimepath=./Xrtp 1140 set spelllang=Xtest 1141 set spell 1142 silent spellgood abc 1143 call assert_equal('./Xrtp/spell/Xtest.utf-8.add', &spellfile) 1144 call assert_equal(['abc'], readfile('Xrtp/spell/Xtest.utf-8.add')) 1145 call assert_true(filereadable('Xrtp/spell/Xtest.utf-8.spl')) 1146 set spell& spelllang& spellfile& 1147 call delete('Xrtp', 'rf') 1148 let &encoding = save_encoding 1149 let &rtp = save_rtp 1150 %bw! 1151endfunc 1152 1153" Test for the 'mkspellmem' option 1154func Test_mkspellmem_opt() 1155 call assert_fails('set mkspellmem=1000', 'E474:') 1156 call assert_fails('set mkspellmem=1000,', 'E474:') 1157 call assert_fails('set mkspellmem=1000,50', 'E474:') 1158 call assert_fails('set mkspellmem=1000,50,', 'E474:') 1159 call assert_fails('set mkspellmem=1000,50,10,', 'E474:') 1160 call assert_fails('set mkspellmem=1000,50,0', 'E474:') 1161endfunc 1162 1163" vim: shiftwidth=2 sts=2 expandtab 1164