aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorZyX <kp-pav@yandex.ru>2015-07-26 01:52:50 +0300
committerZyX <kp-pav@yandex.ru>2015-10-08 22:00:15 +0300
commite2994a3c62265a26a632ed7cd4d11ce4fb711586 (patch)
treedbc0d392d00e93b7bdd4e7a592bfaa6118bf2d2d /test
parentb7ca976f730b4648d4f1cf48ea894ee0a8ae8e72 (diff)
downloadrneovim-e2994a3c62265a26a632ed7cd4d11ce4fb711586.tar.gz
rneovim-e2994a3c62265a26a632ed7cd4d11ce4fb711586.tar.bz2
rneovim-e2994a3c62265a26a632ed7cd4d11ce4fb711586.zip
shada,functests: Test how ShaDa support code reacts on errors
Some notes: - Replaced msgpack_unpacker usage with regular xmalloc’ed buffer. Also since msgpack_unpack_next (as well as msgpack_unpacker_next) is not ever going to return MSGPACK_UNPACK_EXTRA_BYTES this condition was checked manually. Function that does return this status is msgpack_unpack, but it is marked as obsolete. - Zero type is checked prior to main switch in shada_read_next_item because otherwise check would be skipped. - Zeroing entry at the start of shada_read_next_item makes it safer. - dedent('') does not work. - v:oldfiles list is only replaced with bang, if it is NULL or empty.
Diffstat (limited to 'test')
-rw-r--r--test/functional/helpers.lua7
-rw-r--r--test/functional/shada/errors_spec.lua399
-rw-r--r--test/functional/shada/helpers.lua19
-rw-r--r--test/functional/shada/marks_spec.lua12
4 files changed, 424 insertions, 13 deletions
diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua
index a6f4f7c2e5..23581ba4d2 100644
--- a/test/functional/helpers.lua
+++ b/test/functional/helpers.lua
@@ -220,9 +220,12 @@ local function execute(...)
end
-- Dedent the given text and write it to the file name.
-local function write_file(name, text)
+local function write_file(name, text, dont_dedent)
local file = io.open(name, 'w')
- file:write(dedent(text))
+ if not dont_dedent then
+ text = dedent(text)
+ end
+ file:write(text)
file:flush()
file:close()
end
diff --git a/test/functional/shada/errors_spec.lua b/test/functional/shada/errors_spec.lua
new file mode 100644
index 0000000000..5107273115
--- /dev/null
+++ b/test/functional/shada/errors_spec.lua
@@ -0,0 +1,399 @@
+-- ShaDa errors handling support
+local helpers = require('test.functional.helpers')
+local nvim, nvim_window, nvim_curwin, nvim_command, nvim_feed, nvim_eval, eq =
+ helpers.nvim, helpers.window, helpers.curwin, helpers.command, helpers.feed,
+ helpers.eval, helpers.eq
+local write_file = helpers.write_file
+
+local shada_helpers = require('test.functional.shada.helpers')
+local reset, set_additional_cmd, clear, exc_exec =
+ shada_helpers.reset, shada_helpers.set_additional_cmd,
+ shada_helpers.clear, shada_helpers.exc_exec
+
+local shada_fname = 'Xtest-functional-shada-errors.shada'
+local wshada = function(text)
+ write_file(shada_fname, text, true)
+end
+local sdrcmd = function(bang)
+ return 'rshada' .. (bang and '!' or '') .. ' ' .. shada_fname
+end
+
+describe('ShaDa error handling', function()
+ before_each(reset)
+ after_each(function()
+ clear()
+ os.remove(shada_fname)
+ local i = ('a'):byte()
+ while i < ('z'):byte() do
+ if not os.remove(shada_fname .. ('.tmp.%c'):format(i)) then
+ break
+ end
+ i = i + 1
+ end
+ end)
+
+ -- Note: most of tests have additional items like sX, mX, rX. These are for
+ -- valgrind tests, to check for memory leaks (i.e. whether error handling code
+ -- does (not) forget to call ga_clear). Not needed for array-based items like
+ -- history because they are not using ad_ga.
+
+ it('does not fail on empty file', function()
+ wshada('')
+ eq(0, exc_exec(sdrcmd()))
+ end)
+
+ it('fails on zero', function()
+ wshada('\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: expected positive integer at position 0, but got nothing', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on missing item', function()
+ wshada('\000\000\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: there is an item at position 0 that must not be there: Missing items are for internal uses only', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on -2 type', function()
+ wshada('\254\000\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: expected positive integer at position 0', exc_exec(sdrcmd()))
+ end)
+
+ it('does not fail on header with zero length', function()
+ -- Header items are skipped when reading.
+ wshada('\001\000\000')
+ eq(0, exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with zero length', function()
+ wshada('\002\000\000')
+ eq('Vim(rshada):E575: Failed to parse ShaDa file: incomplete msgpack string at position 0', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with -2 timestamp', function()
+ wshada('\002\254\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: expected positive integer at position 1', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with -2 length', function()
+ wshada('\002\000\254')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: expected positive integer at position 2', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with length greater then file length', function()
+ wshada('\002\000\002\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: last entry specified that it occupies 2 bytes, but file ended earlier', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with invalid byte', function()
+ -- 195 (== 0xC1) cannot start any valid messagepack entry (the only byte
+ -- that cannot do this). Specifically unpack_template.h contains
+ --
+ -- //case 0xc1: // string
+ -- // again_terminal_trail(NEXT_CS(p), p+1);
+ --
+ -- (literally: commented out code) which means that in place of this code
+ -- `goto _failed` is used from default: case. I do not know any other way to
+ -- get MSGPACK_UNPACK_PARSE_ERROR and not MSGPACK_UNPACK_CONTINUE or
+ -- MSGPACK_UNPACK_EXTRA_BYTES.
+ wshada('\002\000\001\193')
+ eq('Vim(rshada):E575: Failed to parse ShaDa file due to a msgpack parser error at position 0', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with incomplete map', function()
+ wshada('\002\000\001\129')
+ eq('Vim(rshada):E575: Failed to parse ShaDa file: incomplete msgpack string at position 0', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item without a pattern', function()
+ wshada('\002\000\005\129\162sX\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has no pattern', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern with extra bytes', function()
+ wshada('\002\000\002\128\000')
+ eq('Vim(rshada):E575: Failed to parse ShaDa file: extra bytes in msgpack string at position 0', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL value', function()
+ wshada('\002\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 is not a dictionary', exc_exec(sdrcmd()))
+ end)
+
+ -- sp entry is here because it causes an allocation.
+ it('fails on search pattern item with BIN key', function()
+ wshada('\002\000\014\131\162sp\196\001a\162sX\192\196\000\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has key which is not a string', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL magic key value', function()
+ wshada('\002\000\009\130\162sX\192\162sm\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has sm key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL smartcase key value', function()
+ wshada('\002\000\009\130\162sX\192\162sc\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has sc key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL has_line_offset key value', function()
+ wshada('\002\000\009\130\162sX\192\162sl\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has sl key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL place_cursor_at_end key value', function()
+ wshada('\002\000\009\130\162sX\192\162se\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has se key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL is_last_used key value', function()
+ wshada('\002\000\009\130\162sX\192\162su\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has su key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL is_substitute_pattern key value', function()
+ wshada('\002\000\009\130\162sX\192\162ss\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has ss key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL highlighted key value', function()
+ wshada('\002\000\009\130\162sX\192\162sh\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has sh key value which is not a boolean', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL offset key value', function()
+ wshada('\002\000\009\130\162sX\192\162so\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has so key value which is not an integer', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with NIL pat key value', function()
+ wshada('\002\000\009\130\162sX\192\162sp\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has sp key value which is not a binary', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search pattern item with STR pat key value', function()
+ wshada('\002\000\011\130\162sX\192\162sp\162sp')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search pattern entry at position 0 has sp key value which is not a binary', exc_exec(sdrcmd()))
+ end)
+
+ for _, v in ipairs({{name='global mark', mpack='\007'},
+ {name='jump', mpack='\008'},
+ {name='local mark', mpack='\010'},
+ {name='change', mpack='\011'},
+ }) do
+ local is_mark_test = ({['global mark']=true, ['local mark']=true})[v.name]
+
+ it('fails on ' .. v.name .. ' item with NIL value', function()
+ wshada(v.mpack .. '\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 is not a dictionary', exc_exec(sdrcmd()))
+ end)
+
+ -- f entry is here because it causes an allocation.
+ it('fails on ' .. v.name .. ' item with BIN key', function()
+ wshada(v.mpack .. '\000\013\131\161f\196\001/\162mX\192\196\000\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has key which is not a string', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item without f key', function()
+ wshada(v.mpack .. '\000\008\130\162mX\192\161l\001')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 is missing file name', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with zero l key', function()
+ wshada(v.mpack .. '\000\013\131\162mX\192\161f\196\001/\161l\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has invalid line number', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with negative l key', function()
+ wshada(v.mpack .. '\000\013\131\162mX\192\161f\196\001/\161l\255')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has invalid line number', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with negative c key', function()
+ wshada(v.mpack .. '\000\013\131\162mX\192\161f\196\001/\161c\255')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has invalid column number', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with STR n key value', function()
+ wshada(v.mpack .. '\000\011\130\162mX\192\161n\163spa')
+ eq(is_mark_test and 'Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has n key value which is not an unsigned integer' or 'Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has n key which is only valid for local and global mark entries', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with STR l key value', function()
+ wshada(v.mpack .. '\000\010\130\162mX\192\161l\162sp')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has l key value which is not an integer', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with STR c key value', function()
+ wshada(v.mpack .. '\000\010\130\162mX\192\161c\162sp')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has c key value which is not an integer', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on ' .. v.name .. ' item with STR f key value', function()
+ wshada(v.mpack .. '\000\010\130\162mX\192\161f\162sp')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: mark entry at position 0 has f key value which is not a binary', exc_exec(sdrcmd()))
+ end)
+ end
+
+ it('fails on register item with NIL value', function()
+ wshada('\005\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 is not a dictionary', exc_exec(sdrcmd()))
+ end)
+
+ -- rc entry is here because it causes an allocation
+ it('fails on register item with BIN key', function()
+ wshada('\005\000\015\131\162rc\145\196\001a\162rX\192\196\000\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has key which is not a string', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on register item with NIL rt key value', function()
+ wshada('\005\000\009\130\162rX\192\162rt\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has rt key value which is not an unsigned integer', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on register item with NIL rw key value', function()
+ wshada('\005\000\009\130\162rX\192\162rw\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has rw key value which is not an unsigned integer', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on register item with NIL rc key value', function()
+ wshada('\005\000\009\130\162rX\192\162rc\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has rc key with non-array value', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on register item with empty rc key value', function()
+ wshada('\005\000\009\130\162rX\192\162rc\144')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has rc key with empty array', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on register item with NIL in rc array', function()
+ wshada('\005\000\013\130\162rX\192\162rc\146\196\001a\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has rc array with non-binary value', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on register item without rc array', function()
+ wshada('\005\000\009\129\162rX\146\196\001a\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: register entry at position 0 has missing rc array', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on history item with NIL value', function()
+ wshada('\004\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: history entry at position 0 is not an array', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on history item with empty value', function()
+ wshada('\004\000\001\144')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: history entry at position 0 does not have enough elements', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on history item with single element value', function()
+ wshada('\004\000\002\145\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: history entry at position 0 does not have enough elements', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on history item with NIL first item', function()
+ wshada('\004\000\003\146\192\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: history entry at position 0 has wrong history type type', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on history item with FIXUINT second item', function()
+ wshada('\004\000\003\146\000\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: history entry at position 0 has wrong history string type', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on history item with second item with zero byte', function()
+ wshada('\004\000\007\146\000\196\003ab\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: history entry at position 0 contains string with zero byte inside', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search history item without third item', function()
+ wshada('\004\000\007\146\001\196\003abc')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search history entry at position 0 does not have separator character', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on search history item with NIL third item', function()
+ wshada('\004\000\007\147\001\196\002ab\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: search history entry at position 0 has wrong history separator type', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on variable item with NIL value', function()
+ wshada('\006\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: variable entry at position 0 is not an array', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on variable item with empty value', function()
+ wshada('\006\000\001\144')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: variable entry at position 0 does not have enough elements', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on variable item with single element value', function()
+ wshada('\006\000\002\145\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: variable entry at position 0 does not have enough elements', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on variable item with NIL first item', function()
+ wshada('\006\000\003\146\192\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: variable entry at position 0 has wrong variable name type', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on replacement item with NIL value', function()
+ wshada('\003\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: sub string entry at position 0 is not an array', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on replacement item with empty value', function()
+ wshada('\003\000\001\144')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: sub string entry at position 0 does not have enough elements', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on replacement item with NIL first item', function()
+ wshada('\003\000\002\145\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: sub string entry at position 0 has wrong sub string type', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with NIL value', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\001\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list entry at position 0 is not an array', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with NIL item in the array', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\008\146\129\161f\196\001/\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list at position 0 contains entry that is not a dictionary', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with empty item', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\008\146\129\161f\196\001/\128')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list at position 0 contains entry that does not have a file name', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with NIL l key', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\017\146\129\161f\196\001/\130\161f\196\002/a\161l\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list entry entry at position 0 has l key value which is not an integer', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with zero l key', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\017\146\129\161f\196\001/\130\161f\196\002/a\161l\000')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list at position 0 contains entry with invalid line number', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with negative l key', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\017\146\129\161f\196\001/\130\161f\196\002/a\161l\255')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list at position 0 contains entry with invalid line number', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with negative c key', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\017\146\129\161f\196\001/\130\161f\196\002/a\161c\255')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list at position 0 contains entry with invalid column number', exc_exec(sdrcmd()))
+ end)
+
+ it('fails on buffer list item with NIL c key', function()
+ nvim_command('set shada+=%')
+ wshada('\009\000\017\146\129\161f\196\001/\130\161f\196\002/a\161c\192')
+ eq('Vim(rshada):E575: Error while reading ShaDa file: buffer list entry entry at position 0 has c key value which is not an integer', exc_exec(sdrcmd()))
+ end)
+end)
diff --git a/test/functional/shada/helpers.lua b/test/functional/shada/helpers.lua
index 7e93fcb915..909fcd62e6 100644
--- a/test/functional/shada/helpers.lua
+++ b/test/functional/shada/helpers.lua
@@ -1,6 +1,7 @@
local helpers = require('test.functional.helpers')
-local spawn, set_session, nvim, nvim_prog =
- helpers.spawn, helpers.set_session, helpers.nvim, helpers.nvim_prog
+local spawn, set_session, nvim, nvim_prog, nvim_command, nvim_eval =
+ helpers.spawn, helpers.set_session, helpers.nvim, helpers.nvim_prog,
+ helpers.command, helpers.eval
local tmpname = os.tmpname()
local additional_cmd = ''
@@ -46,8 +47,22 @@ local clear = function()
set_additional_cmd('')
end
+local exc_exec = function(cmd)
+ nvim_command(([[
+ try
+ execute "%s"
+ catch
+ let g:__exception = v:exception
+ endtry
+ ]]):format(cmd:gsub('\n', '\\n'):gsub('[\\"]', '\\%0')))
+ local ret = nvim_eval('get(g:, "__exception", 0)')
+ nvim_command('unlet! g:__exception')
+ return ret
+end
+
return {
reset=reset,
set_additional_cmd=set_additional_cmd,
clear=clear,
+ exc_exec=exc_exec,
}
diff --git a/test/functional/shada/marks_spec.lua b/test/functional/shada/marks_spec.lua
index 4909ae608e..341ca2d647 100644
--- a/test/functional/shada/marks_spec.lua
+++ b/test/functional/shada/marks_spec.lua
@@ -5,9 +5,9 @@ local nvim, nvim_window, nvim_curwin, nvim_command, nvim_feed, nvim_eval, eq =
helpers.eval, helpers.eq
local shada_helpers = require('test.functional.shada.helpers')
-local reset, set_additional_cmd, clear =
+local reset, set_additional_cmd, clear, exc_exec =
shada_helpers.reset, shada_helpers.set_additional_cmd,
- shada_helpers.clear
+ shada_helpers.clear, shada_helpers.exc_exec
local nvim_current_line = function()
return nvim_window('get_cursor', nvim_curwin())[1]
@@ -57,13 +57,7 @@ describe('ShaDa support code', function()
nvim_command('wshada')
reset()
nvim_command('language C')
- nvim_command([[
- try
- execute "normal! `A"
- catch
- let exception = v:exception
- endtry]])
- eq('Vim(normal):E20: Mark not set', nvim('get_var', 'exception'))
+ eq('Vim(normal):E20: Mark not set', exc_exec('normal! `A'))
end)
it('does read back global mark even with `\'0` and `f0` in shada', function()