view src/testdir/test_spellfile.vim @ 21841:7a6ca887128d v8.2.1470

patch 8.2.1470: errors in spell file not tested Commit: https://github.com/vim/vim/commit/c0f8823ee4ca629db5446ba0a935f68d4a4fb193 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Aug 16 21:51:49 2020 +0200 patch 8.2.1470: errors in spell file not tested Problem: Errors in spell file not tested. Solution: Add test for spell file errors. (Yegappan Lakshmanan, closes #6721)
author Bram Moolenaar <Bram@vim.org>
date Sun, 16 Aug 2020 22:00:03 +0200
parents 08940efa6b4e
children 776c76599617
line wrap: on
line source

" Test for commands that operate on the spellfile.

source shared.vim
source check.vim

CheckFeature spell
CheckFeature syntax

func Test_spell_normal()
  new
  call append(0, ['1 good', '2 goood', '3 goood'])
  set spell spellfile=./Xspellfile.add spelllang=en
  let oldlang=v:lang
  lang C

  " Test for zg
  1
  norm! ]s
  call assert_equal('2 goood', getline('.'))
  norm! zg
  1
  let a=execute('unsilent :norm! ]s')
  call assert_equal('1 good', getline('.'))
  call assert_equal('search hit BOTTOM, continuing at TOP', a[1:])
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('goood', cnt[0])

  " Test for zw
  2
  norm! $zw
  1
  norm! ]s
  call assert_equal('2 goood', getline('.'))
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('#oood', cnt[0])
  call assert_equal('goood/!', cnt[1])

  " Test for :spellrare
  spellrare rare
  let cnt=readfile('./Xspellfile.add')
  call assert_equal(['#oood', 'goood/!', 'rare/?'], cnt)

  " Make sure :spellundo works for rare words.
  spellundo rare
  let cnt=readfile('./Xspellfile.add')
  call assert_equal(['#oood', 'goood/!', '#are/?'], cnt)

  " Test for zg in visual mode
  let a=execute('unsilent :norm! V$zg')
  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
  1
  norm! ]s
  call assert_equal('3 goood', getline('.'))
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('2 goood', cnt[3])
  " Remove "2 good" from spellfile
  2
  let a=execute('unsilent norm! V$zw')
  call assert_equal("Word '2 goood' added to ./Xspellfile.add", a[1:])
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('2 goood/!', cnt[4])

  " Test for zG
  let a=execute('unsilent norm! V$zG')
  call assert_match("Word '2 goood' added to .*", a)
  let fname=matchstr(a, 'to\s\+\zs\f\+$')
  let cnt=readfile(fname)
  call assert_equal('2 goood', cnt[0])

  " Test for zW
  let a=execute('unsilent norm! V$zW')
  call assert_match("Word '2 goood' added to .*", a)
  let cnt=readfile(fname)
  call assert_equal('# goood', cnt[0])
  call assert_equal('2 goood/!', cnt[1])

  " Test for zuW
  let a=execute('unsilent norm! V$zuW')
  call assert_match("Word '2 goood' removed from .*", a)
  let cnt=readfile(fname)
  call assert_equal('# goood', cnt[0])
  call assert_equal('# goood/!', cnt[1])

  " Test for zuG
  let a=execute('unsilent norm! $zG')
  call assert_match("Word 'goood' added to .*", a)
  let cnt=readfile(fname)
  call assert_equal('# goood', cnt[0])
  call assert_equal('# goood/!', cnt[1])
  call assert_equal('goood', cnt[2])
  let a=execute('unsilent norm! $zuG')
  let cnt=readfile(fname)
  call assert_match("Word 'goood' removed from .*", a)
  call assert_equal('# goood', cnt[0])
  call assert_equal('# goood/!', cnt[1])
  call assert_equal('#oood', cnt[2])
  " word not found in wordlist
  let a=execute('unsilent norm! V$zuG')
  let cnt=readfile(fname)
  call assert_match("", a)
  call assert_equal('# goood', cnt[0])
  call assert_equal('# goood/!', cnt[1])
  call assert_equal('#oood', cnt[2])

  " Test for zug
  call delete('./Xspellfile.add')
  2
  let a=execute('unsilent norm! $zg')
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('goood', cnt[0])
  let a=execute('unsilent norm! $zug')
  call assert_match("Word 'goood' removed from \./Xspellfile.add", a)
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('#oood', cnt[0])
  " word not in wordlist
  let a=execute('unsilent norm! V$zug')
  call assert_match('', a)
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('#oood', cnt[0])

  " Test for zuw
  call delete('./Xspellfile.add')
  2
  let a=execute('unsilent norm! Vzw')
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('2 goood/!', cnt[0])
  let a=execute('unsilent norm! Vzuw')
  call assert_match("Word '2 goood' removed from \./Xspellfile.add", a)
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('# goood/!', cnt[0])
  " word not in wordlist
  let a=execute('unsilent norm! $zug')
  call assert_match('', a)
  let cnt=readfile('./Xspellfile.add')
  call assert_equal('# goood/!', cnt[0])

  " add second entry to spellfile setting
  set spellfile=./Xspellfile.add,./Xspellfile2.add
  call delete('./Xspellfile.add')
  2
  let a=execute('unsilent norm! $2zg')
  let cnt=readfile('./Xspellfile2.add')
  call assert_match("Word 'goood' added to ./Xspellfile2.add", a)
  call assert_equal('goood', cnt[0])

  " Test for :spellgood!
  let temp = execute(':spe!0/0')
  call assert_match('Invalid region', temp)
  let spellfile = matchstr(temp, 'Invalid region nr in \zs.*\ze line \d: 0')
  call assert_equal(['# goood', '# goood/!', '#oood', '0/0'], readfile(spellfile))

  " Test for :spellrare!
  :spellrare! raare
  call assert_equal(['# goood', '# goood/!', '#oood', '0/0', 'raare/?'], readfile(spellfile))
  call delete(spellfile)

  " clean up
  exe "lang" oldlang
  call delete("./Xspellfile.add")
  call delete("./Xspellfile2.add")
  call delete("./Xspellfile.add.spl")
  call delete("./Xspellfile2.add.spl")

  " zux -> no-op
  2
  norm! $zux
  call assert_equal([], glob('Xspellfile.add',0,1))
  call assert_equal([], glob('Xspellfile2.add',0,1))

  set spellfile= spell& spelllang&
  bw!
endfunc

" Test for spell file format errors
func Test_spellfile_format_error()
  let save_rtp = &rtp
  call mkdir('Xtest/spell', 'p')

  " empty spell file
  call writefile([], './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E757:')
  set nospell spelllang&

  " invalid file ID
  call writefile(['vim'], './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E757:')
  set nospell spelllang&

  " missing version number
  call writefile(['VIMspell'], './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E771:')
  set nospell spelllang&

  " invalid version number
  call writefile(['VIMspellz'], './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E772:')
  set nospell spelllang&

  " no sections
  call writefile(0z56494D7370656C6C32, './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " missing section length
  call writefile(['VIMspell200'], './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " unsupported required section
  call writefile(['VIMspell2z' .. nr2char(1) .. '   ' .. nr2char(4)],
        \ './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E770:')
  set nospell spelllang&

  " unsupported not-required section
  call writefile(['VIMspell2z' .. nr2char(0) .. '   ' .. nr2char(4)],
        \ './Xtest/spell/Xtest.utf-8.spl')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " SN_REGION: invalid number of region names
  call writefile(0z56494D7370656C6C320000000000FF,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E759:')
  set nospell spelllang&

  " SN_CHARFLAGS: missing <charflagslen> length
  call writefile(0z56494D7370656C6C32010000000004,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " SN_CHARFLAGS: invalid <charflagslen> length
  call writefile(0z56494D7370656C6C320100000000010201,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  set spell
  " FIXME: There are no error messages. How to check for the test result?
  set nospell spelllang&

  " SN_CHARFLAGS: charflagslen == 0 and folcharslen != 0
  call writefile(0z56494D7370656C6C3201000000000400000101,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E759:')
  set nospell spelllang&

  " SN_CHARFLAGS: missing <folcharslen> length
  call writefile(0z56494D7370656C6C3201000000000100,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " SN_PREFCOND: invalid prefcondcnt
  call writefile(0z56494D7370656C6C3203000000000100,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E759:')
  set nospell spelllang&

  " SN_PREFCOND: invalid condlen
  call writefile(0z56494D7370656C6C320300000000020001,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E759:')
  set nospell spelllang&

  " SN_REP: invalid repcount
  call writefile(0z56494D7370656C6C3204000000000100,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " SN_REP: missing rep
  call writefile(0z56494D7370656C6C320400000000020004,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E758:')
  set nospell spelllang&

  " SN_REP: zero repfromlen
  call writefile(0z56494D7370656C6C32040000000003000100,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E759:')
  set nospell spelllang&

  " SN_REP: invalid reptolen
  call writefile(0z56494D7370656C6C320400000000050001014101,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  " FIXME: There are no error messages. How to check for the test result?
  set spell
  set nospell spelllang&

  " SN_REP: zero reptolen
  call writefile(0z56494D7370656C6C320400000000050001014100,
        \ './Xtest/spell/Xtest.utf-8.spl', 'b')
  set runtimepath=./Xtest
  set spelllang=Xtest
  call assert_fails('set spell', 'E759:')
  set nospell spelllang&

  let &rtp = save_rtp
  call delete('Xtest', 'rf')
endfunc

" vim: shiftwidth=2 sts=2 expandtab