test_spell_utf8.vim (25965B)
1 " Test for spell checking with 'encoding' set to utf-8 2 3 source check.vim 4 CheckFeature spell 5 6 scriptencoding utf-8 7 8 func TearDown() 9 set nospell 10 call delete('Xtest.aff') 11 call delete('Xtest.dic') 12 call delete('Xtest.utf-8.add') 13 call delete('Xtest.utf-8.add.spl') 14 call delete('Xtest.utf-8.spl') 15 call delete('Xtest.utf-8.sug') 16 " set 'encoding' to clear the word list 17 set encoding=utf-8 18 endfunc 19 20 let g:test_data_aff1 = [ 21 \"SET ISO8859-1", 22 \"TRY esianrtolcdugmphbyfvkwjkqxz-ëéèêïîäàâöüû'ESIANRTOLCDUGMPHBYFVKWJKQXZ", 23 \"", 24 \"FOL àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ", 25 \"LOW àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþßÿ", 26 \"UPP ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßÿ", 27 \"", 28 \"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", 29 \"SOFOTO ebctefghejklnnepkrstevvkesebctefghejklnnepkrstevvkeseeeeeeeceeeeeeeedneeeeeeeeeeepseeeeeeeeceeeeeeeedneeeeeeeeeeep?", 30 \"", 31 \"MIDWORD\t'-", 32 \"", 33 \"KEP =", 34 \"RAR ?", 35 \"BAD !", 36 \"", 37 \"PFX I N 1", 38 \"PFX I 0 in .", 39 \"", 40 \"PFX O Y 1", 41 \"PFX O 0 out .", 42 \"", 43 \"SFX S Y 2", 44 \"SFX S 0 s [^s]", 45 \"SFX S 0 es s", 46 \"", 47 \"SFX N N 3", 48 \"SFX N 0 en [^n]", 49 \"SFX N 0 nen n", 50 \"SFX N 0 n .", 51 \"", 52 \"REP 3", 53 \"REP g ch", 54 \"REP ch g", 55 \"REP svp s.v.p.", 56 \"", 57 \"MAP 9", 58 \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5", 59 \"MAP e\xE8\xE9\xEA\xEB", 60 \"MAP i\xEC\xED\xEE\xEF", 61 \"MAP o\xF2\xF3\xF4\xF5\xF6", 62 \"MAP u\xF9\xFA\xFB\xFC", 63 \"MAP n\xF1", 64 \"MAP c\xE7", 65 \"MAP y\xFF\xFD", 66 \"MAP s\xDF" 67 \ ] 68 let g:test_data_dic1 = [ 69 \"123456", 70 \"test/NO", 71 \"# comment", 72 \"wrong", 73 \"Comment", 74 \"OK", 75 \"uk", 76 \"put/ISO", 77 \"the end", 78 \"deol", 79 \"d\xE9\xF4r", 80 \ ] 81 let g:test_data_aff2 = [ 82 \"SET ISO8859-1", 83 \"", 84 \"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", 85 \"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", 86 \"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", 87 \"", 88 \"PFXPOSTPONE", 89 \"", 90 \"MIDWORD\t'-", 91 \"", 92 \"KEP =", 93 \"RAR ?", 94 \"BAD !", 95 \"", 96 \"PFX I N 1", 97 \"PFX I 0 in .", 98 \"", 99 \"PFX O Y 1", 100 \"PFX O 0 out [a-z]", 101 \"", 102 \"SFX S Y 2", 103 \"SFX S 0 s [^s]", 104 \"SFX S 0 es s", 105 \"", 106 \"SFX N N 3", 107 \"SFX N 0 en [^n]", 108 \"SFX N 0 nen n", 109 \"SFX N 0 n .", 110 \"", 111 \"REP 3", 112 \"REP g ch", 113 \"REP ch g", 114 \"REP svp s.v.p.", 115 \"", 116 \"MAP 9", 117 \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5", 118 \"MAP e\xE8\xE9\xEA\xEB", 119 \"MAP i\xEC\xED\xEE\xEF", 120 \"MAP o\xF2\xF3\xF4\xF5\xF6", 121 \"MAP u\xF9\xFA\xFB\xFC", 122 \"MAP n\xF1", 123 \"MAP c\xE7", 124 \"MAP y\xFF\xFD", 125 \"MAP s\xDF", 126 \ ] 127 let g:test_data_aff3 = [ 128 \"SET ISO8859-1", 129 \"", 130 \"COMPOUNDMIN 3", 131 \"COMPOUNDRULE m*", 132 \"NEEDCOMPOUND x", 133 \ ] 134 let g:test_data_dic3 = [ 135 \"1234", 136 \"foo/m", 137 \"bar/mx", 138 \"m\xEF/m", 139 \"la/mx", 140 \ ] 141 let g:test_data_aff4 = [ 142 \"SET ISO8859-1", 143 \"", 144 \"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", 145 \"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", 146 \"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", 147 \"", 148 \"COMPOUNDRULE m+", 149 \"COMPOUNDRULE sm*e", 150 \"COMPOUNDRULE sm+", 151 \"COMPOUNDMIN 3", 152 \"COMPOUNDWORDMAX 3", 153 \"COMPOUNDFORBIDFLAG t", 154 \"", 155 \"COMPOUNDSYLMAX 5", 156 \"SYLLABLE a\xE1e\xE9i\xEDo\xF3\xF6\xF5u\xFA\xFC\xFBy/aa/au/ea/ee/ei/ie/oa/oe/oo/ou/uu/ui", 157 \"", 158 \"MAP 9", 159 \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5", 160 \"MAP e\xE8\xE9\xEA\xEB", 161 \"MAP i\xEC\xED\xEE\xEF", 162 \"MAP o\xF2\xF3\xF4\xF5\xF6", 163 \"MAP u\xF9\xFA\xFB\xFC", 164 \"MAP n\xF1", 165 \"MAP c\xE7", 166 \"MAP y\xFF\xFD", 167 \"MAP s\xDF", 168 \"", 169 \"NEEDAFFIX x", 170 \"", 171 \"PFXPOSTPONE", 172 \"", 173 \"MIDWORD '-", 174 \"", 175 \"SFX q N 1", 176 \"SFX q 0 -ok .", 177 \"", 178 \"SFX a Y 2", 179 \"SFX a 0 s .", 180 \"SFX a 0 ize/t .", 181 \"", 182 \"PFX p N 1", 183 \"PFX p 0 pre .", 184 \"", 185 \"PFX P N 1", 186 \"PFX P 0 nou .", 187 \ ] 188 let g:test_data_dic4 = [ 189 \"1234", 190 \"word/mP", 191 \"util/am", 192 \"pro/xq", 193 \"tomato/m", 194 \"bork/mp", 195 \"start/s", 196 \"end/e", 197 \ ] 198 let g:test_data_aff5 = [ 199 \"SET ISO8859-1", 200 \"", 201 \"FLAG long", 202 \"", 203 \"NEEDAFFIX !!", 204 \"", 205 \"COMPOUNDRULE ssmm*ee", 206 \"", 207 \"NEEDCOMPOUND xx", 208 \"COMPOUNDPERMITFLAG pp", 209 \"", 210 \"SFX 13 Y 1", 211 \"SFX 13 0 bork .", 212 \"", 213 \"SFX a1 Y 1", 214 \"SFX a1 0 a1 .", 215 \"", 216 \"SFX a\xE9 Y 1", 217 \"SFX a\xE9 0 a\xE9 .", 218 \"", 219 \"PFX zz Y 1", 220 \"PFX zz 0 pre/pp .", 221 \"", 222 \"PFX yy Y 1", 223 \"PFX yy 0 nou .", 224 \ ] 225 let g:test_data_dic5 = [ 226 \"1234", 227 \"foo/a1a\xE9!!", 228 \"bar/zz13ee", 229 \"start/ss", 230 \"end/eeyy", 231 \"middle/mmxx", 232 \ ] 233 let g:test_data_aff6 = [ 234 \"SET ISO8859-1", 235 \"", 236 \"FLAG caplong", 237 \"", 238 \"NEEDAFFIX A!", 239 \"", 240 \"COMPOUNDRULE sMm*Ee", 241 \"", 242 \"NEEDCOMPOUND Xx", 243 \"", 244 \"COMPOUNDPERMITFLAG p", 245 \"", 246 \"SFX N3 Y 1", 247 \"SFX N3 0 bork .", 248 \"", 249 \"SFX A1 Y 1", 250 \"SFX A1 0 a1 .", 251 \"", 252 \"SFX A\xE9 Y 1", 253 \"SFX A\xE9 0 a\xE9 .", 254 \"", 255 \"PFX Zz Y 1", 256 \"PFX Zz 0 pre/p .", 257 \ ] 258 let g:test_data_dic6 = [ 259 \"1234", 260 \"mee/A1A\xE9A!", 261 \"bar/ZzN3Ee", 262 \"lead/s", 263 \"end/Ee", 264 \"middle/MmXx", 265 \ ] 266 let g:test_data_aff7 = [ 267 \"SET ISO8859-1", 268 \"", 269 \"FLAG num", 270 \"", 271 \"NEEDAFFIX 9999", 272 \"", 273 \"COMPOUNDRULE 2,77*123", 274 \"", 275 \"NEEDCOMPOUND 1", 276 \"COMPOUNDPERMITFLAG 432", 277 \"", 278 \"SFX 61003 Y 1", 279 \"SFX 61003 0 meat .", 280 \"", 281 \"SFX 0 Y 1", 282 \"SFX 0 0 zero .", 283 \"", 284 \"SFX 391 Y 1", 285 \"SFX 391 0 a1 .", 286 \"", 287 \"SFX 111 Y 1", 288 \"SFX 111 0 a\xE9 .", 289 \"", 290 \"PFX 17 Y 1", 291 \"PFX 17 0 pre/432 .", 292 \ ] 293 let g:test_data_dic7 = [ 294 \"1234", 295 \"mee/0,391,111,9999", 296 \"bar/17,61003,123", 297 \"lead/2", 298 \"tail/123", 299 \"middle/77,1", 300 \ ] 301 let g:test_data_aff8 = [ 302 \"SET ISO8859-1", 303 \"", 304 \"NOSPLITSUGS", 305 \ ] 306 let g:test_data_dic8 = [ 307 \"1234", 308 \"foo", 309 \"bar", 310 \"faabar", 311 \ ] 312 let g:test_data_aff9 = [ 313 \ ] 314 let g:test_data_dic9 = [ 315 \"1234", 316 \"foo", 317 \"bar", 318 \ ] 319 let g:test_data_aff10 = [ 320 \"COMPOUNDRULE se", 321 \"COMPOUNDPERMITFLAG p", 322 \"", 323 \"SFX A Y 1", 324 \"SFX A 0 able/Mp .", 325 \"", 326 \"SFX M Y 1", 327 \"SFX M 0 s .", 328 \ ] 329 let g:test_data_dic10 = [ 330 \"1234", 331 \"drink/As", 332 \"table/e", 333 \ ] 334 let g:test_data_aff_sal = [ 335 \"SET ISO8859-1", 336 \"TRY esianrtolcdugmphbyfvkwjkqxz-\xEB\xE9\xE8\xEA\xEF\xEE\xE4\xE0\xE2\xF6\xFC\xFB'ESIANRTOLCDUGMPHBYFVKWJKQXZ", 337 \"", 338 \"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", 339 \"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", 340 \"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", 341 \"", 342 \"MIDWORD\t'-", 343 \"", 344 \"KEP =", 345 \"RAR ?", 346 \"BAD !", 347 \"", 348 \"PFX I N 1", 349 \"PFX I 0 in .", 350 \"", 351 \"PFX O Y 1", 352 \"PFX O 0 out .", 353 \"", 354 \"SFX S Y 2", 355 \"SFX S 0 s [^s]", 356 \"SFX S 0 es s", 357 \"", 358 \"SFX N N 3", 359 \"SFX N 0 en [^n]", 360 \"SFX N 0 nen n", 361 \"SFX N 0 n .", 362 \"", 363 \"REP 3", 364 \"REP g ch", 365 \"REP ch g", 366 \"REP svp s.v.p.", 367 \"", 368 \"MAP 9", 369 \"MAP a\xE0\xE1\xE2\xE3\xE4\xE5", 370 \"MAP e\xE8\xE9\xEA\xEB", 371 \"MAP i\xEC\xED\xEE\xEF", 372 \"MAP o\xF2\xF3\xF4\xF5\xF6", 373 \"MAP u\xF9\xFA\xFB\xFC", 374 \"MAP n\xF1", 375 \"MAP c\xE7", 376 \"MAP y\xFF\xFD", 377 \"MAP s\xDF", 378 \"", 379 \"SAL AH(AEIOUY)-^ *H", 380 \"SAL AR(AEIOUY)-^ *R", 381 \"SAL A(HR)^ *", 382 \"SAL A^ *", 383 \"SAL AH(AEIOUY)- H", 384 \"SAL AR(AEIOUY)- R", 385 \"SAL A(HR) _", 386 \"SAL \xC0^ *", 387 \"SAL \xC5^ *", 388 \"SAL BB- _", 389 \"SAL B B", 390 \"SAL CQ- _", 391 \"SAL CIA X", 392 \"SAL CH X", 393 \"SAL C(EIY)- S", 394 \"SAL CK K", 395 \"SAL COUGH^ KF", 396 \"SAL CC< C", 397 \"SAL C K", 398 \"SAL DG(EIY) K", 399 \"SAL DD- _", 400 \"SAL D T", 401 \"SAL \xC9< E", 402 \"SAL EH(AEIOUY)-^ *H", 403 \"SAL ER(AEIOUY)-^ *R", 404 \"SAL E(HR)^ *", 405 \"SAL ENOUGH^$ *NF", 406 \"SAL E^ *", 407 \"SAL EH(AEIOUY)- H", 408 \"SAL ER(AEIOUY)- R", 409 \"SAL E(HR) _", 410 \"SAL FF- _", 411 \"SAL F F", 412 \"SAL GN^ N", 413 \"SAL GN$ N", 414 \"SAL GNS$ NS", 415 \"SAL GNED$ N", 416 \"SAL GH(AEIOUY)- K", 417 \"SAL GH _", 418 \"SAL GG9 K", 419 \"SAL G K", 420 \"SAL H H", 421 \"SAL IH(AEIOUY)-^ *H", 422 \"SAL IR(AEIOUY)-^ *R", 423 \"SAL I(HR)^ *", 424 \"SAL I^ *", 425 \"SAL ING6 N", 426 \"SAL IH(AEIOUY)- H", 427 \"SAL IR(AEIOUY)- R", 428 \"SAL I(HR) _", 429 \"SAL J K", 430 \"SAL KN^ N", 431 \"SAL KK- _", 432 \"SAL K K", 433 \"SAL LAUGH^ LF", 434 \"SAL LL- _", 435 \"SAL L L", 436 \"SAL MB$ M", 437 \"SAL MM M", 438 \"SAL M M", 439 \"SAL NN- _", 440 \"SAL N N", 441 \"SAL OH(AEIOUY)-^ *H", 442 \"SAL OR(AEIOUY)-^ *R", 443 \"SAL O(HR)^ *", 444 \"SAL O^ *", 445 \"SAL OH(AEIOUY)- H", 446 \"SAL OR(AEIOUY)- R", 447 \"SAL O(HR) _", 448 \"SAL PH F", 449 \"SAL PN^ N", 450 \"SAL PP- _", 451 \"SAL P P", 452 \"SAL Q K", 453 \"SAL RH^ R", 454 \"SAL ROUGH^ RF", 455 \"SAL RR- _", 456 \"SAL R R", 457 \"SAL SCH(EOU)- SK", 458 \"SAL SC(IEY)- S", 459 \"SAL SH X", 460 \"SAL SI(AO)- X", 461 \"SAL SS- _", 462 \"SAL S S", 463 \"SAL TI(AO)- X", 464 \"SAL TH @", 465 \"SAL TCH-- _", 466 \"SAL TOUGH^ TF", 467 \"SAL TT- _", 468 \"SAL T T", 469 \"SAL UH(AEIOUY)-^ *H", 470 \"SAL UR(AEIOUY)-^ *R", 471 \"SAL U(HR)^ *", 472 \"SAL U^ *", 473 \"SAL UH(AEIOUY)- H", 474 \"SAL UR(AEIOUY)- R", 475 \"SAL U(HR) _", 476 \"SAL V^ W", 477 \"SAL V F", 478 \"SAL WR^ R", 479 \"SAL WH^ W", 480 \"SAL W(AEIOU)- W", 481 \"SAL X^ S", 482 \"SAL X KS", 483 \"SAL Y(AEIOU)- Y", 484 \"SAL ZZ- _", 485 \"SAL Z S", 486 \ ] 487 488 func LoadAffAndDic(aff_contents, dic_contents) 489 set spellfile= 490 call writefile(a:aff_contents, "Xtest.aff") 491 call writefile(a:dic_contents, "Xtest.dic") 492 " Generate a .spl file from a .dic and .aff file. 493 mkspell! Xtest Xtest 494 " use that spell file 495 set spl=Xtest.utf-8.spl spell 496 endfunc 497 498 func ListWords() 499 spelldump 500 %yank 501 quit 502 return split(@", "\n") 503 endfunc 504 505 func TestGoodBadBase() 506 exe '1;/^good:' 507 normal 0f:]s 508 let prevbad = '' 509 let result = [] 510 while 1 511 let [bad, a] = spellbadword() 512 if bad == '' || bad == prevbad || bad == 'badend' 513 break 514 endif 515 let prevbad = bad 516 let lst = bad->spellsuggest(3) 517 normal mm 518 519 call add(result, [bad, lst]) 520 normal `m]s 521 endwhile 522 return result 523 endfunc 524 525 func RunGoodBad(good, bad, expected_words, expected_bad_words) 526 %bwipe! 527 call setline(1, ['', "good: ", a:good, a:bad, " badend "]) 528 let words = ListWords() 529 call assert_equal(a:expected_words, words[1:-1]) 530 let bad_words = TestGoodBadBase() 531 call assert_equal(a:expected_bad_words, bad_words) 532 %bwipe! 533 endfunc 534 535 func Test_spell_basic() 536 call LoadAffAndDic(g:test_data_aff1, g:test_data_dic1) 537 call RunGoodBad("wrong OK puts. Test the end", 538 \ "bad: inputs comment ok Ok. test d\u00E9\u00F4l end the", 539 \["Comment", "deol", "d\u00E9\u00F4r", "input", "OK", "output", "outputs", "outtest", "put", "puts", 540 \ "test", "testen", "testn", "the end", "uk", "wrong"], 541 \[ 542 \ ["bad", ["put", "uk", "OK"]], 543 \ ["inputs", ["input", "puts", "outputs"]], 544 \ ["comment", ["Comment", "outtest", "the end"]], 545 \ ["ok", ["OK", "uk", "put"]], 546 \ ["Ok", ["OK", "Uk", "Put"]], 547 \ ["test", ["Test", "testn", "testen"]], 548 \ ["d\u00E9\u00F4l", ["deol", "d\u00E9\u00F4r", "test"]], 549 \ ["end", ["put", "uk", "test"]], 550 \ ["the", ["put", "uk", "test"]], 551 \ ] 552 \ ) 553 554 call assert_equal("gebletegek", soundfold('goobledygoook')) 555 call assert_equal("kepereneven", 'kóopërÿnôven'->soundfold()) 556 call assert_equal("everles gesvets etele", soundfold('oeverloos gezwets edale')) 557 endfunc 558 559 " Postponed prefixes 560 func Test_spell_prefixes() 561 call LoadAffAndDic(g:test_data_aff2, g:test_data_dic1) 562 call RunGoodBad("puts", 563 \ "bad: inputs comment ok Ok end the. test d\u00E9\u00F4l", 564 \ ["Comment", "deol", "d\u00E9\u00F4r", "OK", "put", "input", "output", "puts", "outputs", "test", "outtest", "testen", "testn", "the end", "uk", "wrong"], 565 \ [ 566 \ ["bad", ["put", "uk", "OK"]], 567 \ ["inputs", ["input", "puts", "outputs"]], 568 \ ["comment", ["Comment"]], 569 \ ["ok", ["OK", "uk", "put"]], 570 \ ["Ok", ["OK", "Uk", "Put"]], 571 \ ["end", ["put", "uk", "deol"]], 572 \ ["the", ["put", "uk", "test"]], 573 \ ["test", ["Test", "testn", "testen"]], 574 \ ["d\u00E9\u00F4l", ["deol", "d\u00E9\u00F4r", "test"]], 575 \ ]) 576 endfunc 577 578 "Compound words 579 func Test_spell_compound() 580 call LoadAffAndDic(g:test_data_aff3, g:test_data_dic3) 581 call RunGoodBad("foo m\u00EF foobar foofoobar barfoo barbarfoo", 582 \ "bad: bar la foom\u00EF barm\u00EF m\u00EFfoo m\u00EFbar m\u00EFm\u00EF lala m\u00EFla lam\u00EF foola labar", 583 \ ["foo", "m\u00EF"], 584 \ [ 585 \ ["bad", ["foo", "m\u00EF"]], 586 \ ["bar", ["barfoo", "foobar", "foo"]], 587 \ ["la", ["m\u00EF", "foo"]], 588 \ ["foom\u00EF", ["foo m\u00EF", "foo", "foofoo"]], 589 \ ["barm\u00EF", ["barfoo", "m\u00EF", "barbar"]], 590 \ ["m\u00EFfoo", ["m\u00EF foo", "foo", "foofoo"]], 591 \ ["m\u00EFbar", ["foobar", "barbar", "m\u00EF"]], 592 \ ["m\u00EFm\u00EF", ["m\u00EF m\u00EF", "m\u00EF"]], 593 \ ["lala", []], 594 \ ["m\u00EFla", ["m\u00EF", "m\u00EF m\u00EF"]], 595 \ ["lam\u00EF", ["m\u00EF", "m\u00EF m\u00EF"]], 596 \ ["foola", ["foo", "foobar", "foofoo"]], 597 \ ["labar", ["barbar", "foobar"]], 598 \ ]) 599 600 call LoadAffAndDic(g:test_data_aff4, g:test_data_dic4) 601 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", 602 \ "bad: wordutilize pro borkborkborkborkborkbork tomatotomatotomato endstart endend startstart wordend wordstart preborkprebork preborkpreborkbork startwordwordwordwordend borkpreborkpreborkbork utilsbork startnouword", 603 \ ["bork", "prebork", "end", "pro-ok", "start", "tomato", "util", "utilize", "utils", "word", "nouword"], 604 \ [ 605 \ ["bad", ["end", "bork", "word"]], 606 \ ["wordutilize", ["word utilize", "wordutils", "wordutil"]], 607 \ ["pro", ["bork", "word", "end"]], 608 \ ["borkborkborkborkborkbork", ["bork borkborkborkborkbork", "borkbork borkborkborkbork", "borkborkbork borkborkbork"]], 609 \ ["tomatotomatotomato", ["tomato tomatotomato", "tomatotomato tomato", "tomato tomato tomato"]], 610 \ ["endstart", ["end start", "start"]], 611 \ ["endend", ["end end", "end"]], 612 \ ["startstart", ["start start"]], 613 \ ["wordend", ["word end", "word", "wordword"]], 614 \ ["wordstart", ["word start", "bork start"]], 615 \ ["preborkprebork", ["prebork prebork", "preborkbork", "preborkborkbork"]], 616 \ ["preborkpreborkbork", ["prebork preborkbork", "preborkborkbork", "preborkborkborkbork"]], 617 \ ["startwordwordwordwordend", ["startwordwordwordword end", "startwordwordwordword", "start wordwordwordword end"]], 618 \ ["borkpreborkpreborkbork", ["bork preborkpreborkbork", "bork prebork preborkbork", "bork preborkprebork bork"]], 619 \ ["utilsbork", ["utilbork", "utils bork", "util bork"]], 620 \ ["startnouword", ["start nouword", "startword", "startborkword"]], 621 \ ]) 622 623 endfunc 624 625 " Test affix flags with two characters 626 func Test_spell_affix() 627 call LoadAffAndDic(g:test_data_aff5, g:test_data_dic5) 628 call RunGoodBad("fooa1 fooa\u00E9 bar prebar barbork prebarbork startprebar start end startend startmiddleend nouend", 629 \ "bad: foo fooa2 prabar probarbirk middle startmiddle middleend endstart startprobar startnouend", 630 \ ["bar", "barbork", "end", "fooa1", "fooa\u00E9", "nouend", "prebar", "prebarbork", "start"], 631 \ [ 632 \ ["bad", ["bar", "end", "fooa1"]], 633 \ ["foo", ["fooa1", "bar", "end"]], 634 \ ["fooa2", ["fooa1", "fooa\u00E9", "bar"]], 635 \ ["prabar", ["prebar", "bar", "bar bar"]], 636 \ ["probarbirk", ["prebarbork"]], 637 \ ["middle", []], 638 \ ["startmiddle", ["startmiddleend", "startmiddlebar"]], 639 \ ["middleend", []], 640 \ ["endstart", ["end start", "start"]], 641 \ ["startprobar", ["startprebar", "start prebar", "startbar"]], 642 \ ["startnouend", ["start nouend", "startend"]], 643 \ ]) 644 645 call LoadAffAndDic(g:test_data_aff6, g:test_data_dic6) 646 call RunGoodBad("meea1 meea\u00E9 bar prebar barbork prebarbork leadprebar lead end leadend leadmiddleend", 647 \ "bad: mee meea2 prabar probarbirk middle leadmiddle middleend endlead leadprobar", 648 \ ["bar", "barbork", "end", "lead", "meea1", "meea\u00E9", "prebar", "prebarbork"], 649 \ [ 650 \ ["bad", ["bar", "end", "lead"]], 651 \ ["mee", ["meea1", "bar", "end"]], 652 \ ["meea2", ["meea1", "meea\u00E9", "lead"]], 653 \ ["prabar", ["prebar", "bar", "leadbar"]], 654 \ ["probarbirk", ["prebarbork"]], 655 \ ["middle", []], 656 \ ["leadmiddle", ["leadmiddleend", "leadmiddlebar"]], 657 \ ["middleend", []], 658 \ ["endlead", ["end lead", "lead", "end end"]], 659 \ ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]], 660 \ ]) 661 662 call LoadAffAndDic(g:test_data_aff7, g:test_data_dic7) 663 call RunGoodBad("meea1 meezero meea\u00E9 bar prebar barmeat prebarmeat leadprebar lead tail leadtail leadmiddletail", 664 \ "bad: mee meea2 prabar probarmaat middle leadmiddle middletail taillead leadprobar", 665 \ ["bar", "barmeat", "lead", "meea1", "meea\u00E9", "meezero", "prebar", "prebarmeat", "tail"], 666 \ [ 667 \ ["bad", ["bar", "lead", "tail"]], 668 \ ["mee", ["meea1", "bar", "lead"]], 669 \ ["meea2", ["meea1", "meea\u00E9", "lead"]], 670 \ ["prabar", ["prebar", "bar", "leadbar"]], 671 \ ["probarmaat", ["prebarmeat"]], 672 \ ["middle", []], 673 \ ["leadmiddle", ["leadmiddlebar"]], 674 \ ["middletail", []], 675 \ ["taillead", ["tail lead", "tail"]], 676 \ ["leadprobar", ["leadprebar", "lead prebar", "leadbar"]], 677 \ ]) 678 endfunc 679 680 func Test_spell_NOSLITSUGS() 681 call LoadAffAndDic(g:test_data_aff8, g:test_data_dic8) 682 call RunGoodBad("foo bar faabar", "bad: foobar barfoo", 683 \ ["bar", "faabar", "foo"], 684 \ [ 685 \ ["bad", ["bar", "foo"]], 686 \ ["foobar", ["faabar", "foo bar", "bar"]], 687 \ ["barfoo", ["bar foo", "bar", "foo"]], 688 \ ]) 689 endfunc 690 691 " Numbers 692 func Test_spell_Numbers() 693 call LoadAffAndDic(g:test_data_aff9, g:test_data_dic9) 694 call RunGoodBad("0b1011 0777 1234 0x01ff", "", 695 \ ["bar", "foo"], 696 \ [ 697 \ ]) 698 endfunc 699 700 " Affix flags 701 func Test_spell_affix_flags() 702 call LoadAffAndDic(g:test_data_aff10, g:test_data_dic10) 703 call RunGoodBad("drink drinkable drinkables drinktable drinkabletable", 704 \ "bad: drinks drinkstable drinkablestable", 705 \ ["drink", "drinkable", "drinkables", "table"], 706 \ [['bad', []], 707 \ ['drinks', ['drink']], 708 \ ['drinkstable', ['drinktable', 'drinkable', 'drink table']], 709 \ ['drinkablestable', ['drinkabletable', 'drinkables table', 'drinkable table']], 710 \ ]) 711 endfunc 712 713 function FirstSpellWord() 714 call feedkeys("/^start:\n", 'tx') 715 normal ]smm 716 let [str, a] = spellbadword() 717 return str 718 endfunc 719 720 function SecondSpellWord() 721 normal `m]s 722 let [str, a] = spellbadword() 723 return str 724 endfunc 725 726 " Test with SAL instead of SOFO items; test automatic reloading 727 func Test_spell_sal_and_addition() 728 set spellfile= 729 call writefile(g:test_data_dic1, "Xtest.dic", 'D') 730 call writefile(g:test_data_aff_sal, "Xtest.aff", 'D') 731 mkspell! Xtest Xtest 732 set spl=Xtest.utf-8.spl spell 733 call assert_equal('kbltykk', soundfold('goobledygoook')) 734 call assert_equal('kprnfn', soundfold('kóopërÿnôven')) 735 call assert_equal('*fls kswts tl', soundfold('oeverloos gezwets edale')) 736 737 "also use an addition file 738 call writefile(["/regions=usgbnz", "elequint/2", "elekwint/3"], "Xtest.utf-8.add", 'D') 739 mkspell! Xtest.utf-8.add.spl Xtest.utf-8.add 740 741 bwipe! 742 call setline(1, ["start: elequint test elekwint test elekwent asdf"]) 743 744 set spellfile=Xtest.utf-8.add 745 call assert_equal("elekwent", FirstSpellWord()) 746 747 set spl=Xtest_us.utf-8.spl 748 call assert_equal("elequint", FirstSpellWord()) 749 call assert_equal("elekwint", SecondSpellWord()) 750 751 set spl=Xtest_gb.utf-8.spl 752 call assert_equal("elekwint", FirstSpellWord()) 753 call assert_equal("elekwent", SecondSpellWord()) 754 755 set spl=Xtest_nz.utf-8.spl 756 call assert_equal("elequint", FirstSpellWord()) 757 call assert_equal("elekwent", SecondSpellWord()) 758 759 set spl=Xtest_ca.utf-8.spl 760 call assert_equal("elequint", FirstSpellWord()) 761 call assert_equal("elekwint", SecondSpellWord()) 762 763 bwipe! 764 set spellfile= 765 set spl& 766 endfunc 767 768 func Test_spellfile_value() 769 set spellfile=Xdir/Xtest.utf-8.add 770 set spellfile=Xdir/Xtest.utf-8.add,Xtest_other.add 771 set spellfile= 772 endfunc 773 774 func Test_no_crash_with_weird_text() 775 new 776 let lines =<< trim END 777 r<sfile> 778 779 780 781 782 END 783 call setline(1, lines) 784 try 785 exe "%norm \<C-v>ez=>\<C-v>wzG" 786 catch /E1280:/ 787 let caught = 'yes' 788 endtry 789 call assert_equal('yes', caught) 790 791 bwipe! 792 endfunc 793 794 " Invalid bytes may cause trouble when creating the word list. 795 func Test_check_for_valid_word() 796 call assert_fails("spellgood! 0\xac", 'E1280:') 797 endfunc 798 799 " This was going over the end of the word 800 func Test_word_index() 801 new 802 norm R0 803 spellgood! fl0 804 sil norm z= 805 806 bwipe! 807 call delete('Xtmpfile') 808 endfunc 809 810 func Test_check_empty_line() 811 " This was using freed memory 812 set spell 813 enew 814 spellgood! fl 815 norm z= 816 norm yy 817 sil! norm P]svc 818 norm P]s 819 set spell& 820 bwipe! 821 endfunc 822 823 func Test_spell_suggest_too_long() 824 " this was creating a word longer than MAXWLEN 825 new 826 call setline(1, 'a' .. repeat("\u0333", 150)) 827 norm! z= 828 bwipe! 829 endfunc 830 831 832 " vim: shiftwidth=2 sts=2 expandtab