123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- local t = require('test.testutil')
- local n = require('test.functional.testnvim')()
- local eq = t.eq
- local clear = n.clear
- local api = n.api
- local exc_exec = n.exc_exec
- local fn = n.fn
- local rmdir = n.rmdir
- local write_file = t.write_file
- local mkdir = t.mkdir
- local testdir = 'Xtest-functional-spell-spellfile.d'
- describe('spellfile', function()
- before_each(function()
- clear()
- rmdir(testdir)
- mkdir(testdir)
- mkdir(testdir .. '/spell')
- end)
- after_each(function()
- rmdir(testdir)
- end)
- -- ┌ Magic string (#VIMSPELLMAGIC)
- -- │ ┌ Spell file version (#VIMSPELLVERSION)
- local spellheader = 'VIMspell\050'
- it('errors out when prefcond section is truncated', function()
- api.nvim_set_option_value('runtimepath', testdir, {})
- -- stylua: ignore
- write_file(testdir .. '/spell/en.ascii.spl',
- -- ┌ Section identifier (#SN_PREFCOND)
- -- │ ┌ Section flags (#SNF_REQUIRED or zero)
- -- │ │ ┌ Section length (4 bytes, MSB first)
- spellheader .. '\003\001\000\000\000\003'
- -- ┌ Number of regexes in section (2 bytes, MSB first)
- -- │ ┌ Condition length (1 byte)
- -- │ │ ┌ Condition regex (missing!)
- .. '\000\001\001')
- api.nvim_set_option_value('spelllang', 'en', {})
- eq('Vim(set):E758: Truncated spell file', exc_exec('set spell'))
- end)
- it('errors out when prefcond regexp contains NUL byte', function()
- api.nvim_set_option_value('runtimepath', testdir, {})
- -- stylua: ignore
- write_file(testdir .. '/spell/en.ascii.spl',
- -- ┌ Section identifier (#SN_PREFCOND)
- -- │ ┌ Section flags (#SNF_REQUIRED or zero)
- -- │ │ ┌ Section length (4 bytes, MSB first)
- spellheader .. '\003\001\000\000\000\008'
- -- ┌ Number of regexes in section (2 bytes, MSB first)
- -- │ ┌ Condition length (1 byte)
- -- │ │ ┌ Condition regex
- -- │ │ │ ┌ End of sections marker
- .. '\000\001\005ab\000cd\255'
- -- ┌ LWORDTREE tree length (4 bytes)
- -- │ ┌ KWORDTREE tree length (4 bytes)
- -- │ │ ┌ PREFIXTREE tree length
- .. '\000\000\000\000\000\000\000\000\000\000\000\000')
- api.nvim_set_option_value('spelllang', 'en', {})
- eq('Vim(set):E759: Format error in spell file', exc_exec('set spell'))
- end)
- it('errors out when region contains NUL byte', function()
- api.nvim_set_option_value('runtimepath', testdir, {})
- -- stylua: ignore
- write_file(testdir .. '/spell/en.ascii.spl',
- -- ┌ Section identifier (#SN_REGION)
- -- │ ┌ Section flags (#SNF_REQUIRED or zero)
- -- │ │ ┌ Section length (4 bytes, MSB first)
- spellheader .. '\000\001\000\000\000\008'
- -- ┌ Regions ┌ End of sections marker
- .. '01234\00067\255'
- -- ┌ LWORDTREE tree length (4 bytes)
- -- │ ┌ KWORDTREE tree length (4 bytes)
- -- │ │ ┌ PREFIXTREE tree length
- .. '\000\000\000\000\000\000\000\000\000\000\000\000')
- api.nvim_set_option_value('spelllang', 'en', {})
- eq('Vim(set):E759: Format error in spell file', exc_exec('set spell'))
- end)
- it('errors out when SAL section contains NUL byte', function()
- api.nvim_set_option_value('runtimepath', testdir, {})
- -- stylua: ignore
- write_file(testdir .. '/spell/en.ascii.spl',
- -- ┌ Section identifier (#SN_SAL)
- -- │ ┌ Section flags (#SNF_REQUIRED or zero)
- -- │ │ ┌ Section length (4 bytes, MSB first)
- spellheader .. '\005\001\000\000\000\008'
- -- ┌ salflags
- -- │ ┌ salcount (2 bytes, MSB first)
- -- │ │ ┌ salfromlen (1 byte)
- -- │ │ │ ┌ Special character
- -- │ │ │ │┌ salfrom (should not contain NUL)
- -- │ │ │ ││ ┌ saltolen
- -- │ │ │ ││ │ ┌ salto
- -- │ │ │ ││ │ │┌ End of sections marker
- .. '\000\000\001\0024\000\0017\255'
- -- ┌ LWORDTREE tree length (4 bytes)
- -- │ ┌ KWORDTREE tree length (4 bytes)
- -- │ │ ┌ PREFIXTREE tree length
- .. '\000\000\000\000\000\000\000\000\000\000\000\000')
- api.nvim_set_option_value('spelllang', 'en', {})
- eq('Vim(set):E759: Format error in spell file', exc_exec('set spell'))
- end)
- it('errors out when spell header contains NUL bytes', function()
- api.nvim_set_option_value('runtimepath', testdir, {})
- write_file(testdir .. '/spell/en.ascii.spl', spellheader:sub(1, -3) .. '\000\000')
- api.nvim_set_option_value('spelllang', 'en', {})
- eq('Vim(set):E757: This does not look like a spell file', exc_exec('set spell'))
- end)
- it('can be set to a relative path', function()
- local fname = testdir .. '/spell/spell.add'
- api.nvim_set_option_value('spellfile', fname, {})
- end)
- it('can be set to an absolute path', function()
- local fname = fn.fnamemodify(testdir .. '/spell/spell.add', ':p')
- api.nvim_set_option_value('spellfile', fname, {})
- end)
- end)
|