mirror of
https://github.com/neovim/neovim.git
synced 2026-08-29 18:41:48 +00:00
refactor(typval)!: remove distinction of binary and nonbinary strings
This is a breaking change which will make refactor of typval and shada code a lot easier. In particular, code that would use or check for v:msgpack_types.binary in the wild would be broken. This appears to be rarely used in existing plugins. Also some cases where v:msgpack_type.string would be used to represent a binary string of "string" type, we use a BLOB instead, which is vimscripts native type for binary blobs, and already was used for BIN formats when necessary. msgpackdump(msgpackparse(data)) no longer preserves the distinction of BIN and STR strings. This is very common behavior for language-specific msgpack bindings. Nvim uses msgpack as a tool to serialize its data. Nvim is not a tool to bit-perfectly manipulate arbitrary msgpack data out in the wild. The changed tests should indicate how behavior changes in various edge cases.
This commit is contained in:
@@ -1571,9 +1571,9 @@ describe('API', function()
|
||||
eq(val2, request('vim_del_var', 'lua'))
|
||||
end)
|
||||
|
||||
it('truncates values with NULs in them', function()
|
||||
it('preserves values with NULs in them', function()
|
||||
api.nvim_set_var('xxx', 'ab\0cd')
|
||||
eq('ab', api.nvim_get_var('xxx'))
|
||||
eq('ab\000cd', api.nvim_get_var('xxx'))
|
||||
end)
|
||||
end)
|
||||
|
||||
|
||||
@@ -72,9 +72,9 @@ describe('luaeval()', function()
|
||||
end)
|
||||
it('are successfully converted to special dictionaries in table keys', function()
|
||||
command([[let d = luaeval('{["\0"]=1}')]])
|
||||
eq({_TYPE={}, _VAL={{{_TYPE={}, _VAL={'\n'}}, 1}}}, api.nvim_get_var('d'))
|
||||
eq({_TYPE={}, _VAL={{'\000', 1}}}, api.nvim_get_var('d'))
|
||||
eq(1, fn.eval('d._TYPE is v:msgpack_types.map'))
|
||||
eq(1, fn.eval('d._VAL[0][0]._TYPE is v:msgpack_types.string'))
|
||||
eq(eval('v:t_blob'), fn.eval('type(d._VAL[0][0])'))
|
||||
end)
|
||||
it('are successfully converted to blobs from a list', function()
|
||||
command([[let l = luaeval('{"abc", "a\0b", "c\0d", "def"}')]])
|
||||
@@ -125,11 +125,11 @@ describe('luaeval()', function()
|
||||
local level = 30
|
||||
eq(nested_by_level[level].o, fn.luaeval(nested_by_level[level].s))
|
||||
|
||||
eq({_TYPE={}, _VAL={{{_TYPE={}, _VAL={'\n', '\n'}}, '\000\n\000\000'}}},
|
||||
eq({_TYPE={}, _VAL={{'\000\n\000', '\000\n\000\000'}}},
|
||||
fn.luaeval([[{['\0\n\0']='\0\n\0\0'}]]))
|
||||
eq(1, eval([[luaeval('{["\0\n\0"]="\0\n\0\0"}')._TYPE is v:msgpack_types.map]]))
|
||||
eq(1, eval([[luaeval('{["\0\n\0"]="\0\n\0\0"}')._VAL[0][0]._TYPE is v:msgpack_types.string]]))
|
||||
eq({nested={{_TYPE={}, _VAL={{{_TYPE={}, _VAL={'\n', '\n'}}, '\000\n\000\000'}}}}},
|
||||
eq(eval("v:t_blob"), eval([[type(luaeval('{["\0\n\0"]="\0\n\0\0"}')._VAL[0][0])]]))
|
||||
eq({nested={{_TYPE={}, _VAL={{'\000\n\000', '\000\n\000\000'}}}}},
|
||||
fn.luaeval([[{nested={{['\0\n\0']='\0\n\0\0'}}}]]))
|
||||
end)
|
||||
|
||||
@@ -177,12 +177,10 @@ describe('luaeval()', function()
|
||||
end
|
||||
|
||||
it('correctly passes special dictionaries', function()
|
||||
eq({0, '\000\n\000'}, luaevalarg(sp('binary', '["\\n", "\\n"]')))
|
||||
eq({0, '\000\n\000'}, luaevalarg(sp('string', '["\\n", "\\n"]')))
|
||||
eq({0, true}, luaevalarg(sp('boolean', 1)))
|
||||
eq({0, false}, luaevalarg(sp('boolean', 0)))
|
||||
eq({0, NIL}, luaevalarg(sp('nil', 0)))
|
||||
eq({0, {[""]=""}}, luaevalarg(mapsp(sp('binary', '[""]'), '""')))
|
||||
eq({0, {[""]=""}}, luaevalarg(mapsp(sp('string', '[""]'), '""')))
|
||||
end)
|
||||
|
||||
|
||||
@@ -58,23 +58,11 @@ describe('autoload/msgpack.vim', function()
|
||||
msgpack_eq(1, '"abc\\ndef"', '"abc\\ndef"')
|
||||
msgpack_eq(0, '"abc\\ndef"', '"abc\\nghi"')
|
||||
end)
|
||||
it('compares binary specials correctly', function()
|
||||
msgpack_eq(1, sp('binary', '["abc\\n", "def"]'), sp('binary', '["abc\\n", "def"]'))
|
||||
msgpack_eq(0, sp('binary', '["abc", "def"]'), sp('binary', '["abc\\n", "def"]'))
|
||||
end)
|
||||
it('compares binary specials with raw binaries correctly', function()
|
||||
msgpack_eq(1, sp('binary', '["abc", "def"]'), '"abc\\ndef"')
|
||||
msgpack_eq(0, sp('binary', '["abc", "def"]'), '"abcdef"')
|
||||
end)
|
||||
it('compares string specials correctly', function()
|
||||
msgpack_eq(1, sp('string', '["abc\\n", "def"]'), sp('string', '["abc\\n", "def"]'))
|
||||
msgpack_eq(0, sp('string', '["abc", "def"]'), sp('string', '["abc\\n", "def"]'))
|
||||
end)
|
||||
it('compares string specials with binary correctly', function()
|
||||
msgpack_eq(0, sp('string', '["abc\\n", "def"]'), sp('binary', '["abc\\n", "def"]'))
|
||||
msgpack_eq(0, sp('string', '["abc", "def"]'), '"abc\\ndef"')
|
||||
msgpack_eq(0, sp('binary', '["abc\\n", "def"]'), sp('string', '["abc\\n", "def"]'))
|
||||
msgpack_eq(0, '"abc\\ndef"', sp('string', '["abc", "def"]'))
|
||||
msgpack_eq(1, sp('string', '["abc", "def"]'), '"abc\\ndef"')
|
||||
msgpack_eq(1, '"abc\\ndef"', sp('string', '["abc", "def"]'))
|
||||
end)
|
||||
it('compares ext specials correctly', function()
|
||||
msgpack_eq(1, sp('ext', '[1, ["", "ac"]]'), sp('ext', '[1, ["", "ac"]]'))
|
||||
@@ -92,20 +80,16 @@ describe('autoload/msgpack.vim', function()
|
||||
end)
|
||||
it('compares map specials correctly', function()
|
||||
msgpack_eq(1, mapsp(), mapsp())
|
||||
msgpack_eq(1, mapsp(sp('binary', '[""]'), '""'), mapsp(sp('binary', '[""]'), '""'))
|
||||
msgpack_eq(
|
||||
1,
|
||||
mapsp(mapsp('1', '1'), mapsp('1', '1')),
|
||||
mapsp(mapsp('1', '1'), mapsp('1', '1'))
|
||||
)
|
||||
msgpack_eq(0, mapsp(), mapsp('1', '1'))
|
||||
msgpack_eq(0, mapsp(sp('binary', '["a"]'), '""'), mapsp(sp('binary', '[""]'), '""'))
|
||||
msgpack_eq(0, mapsp(sp('binary', '[""]'), '"a"'), mapsp(sp('binary', '[""]'), '""'))
|
||||
msgpack_eq(0, mapsp(sp('binary', '["a"]'), '"a"'), mapsp(sp('binary', '[""]'), '""'))
|
||||
msgpack_eq(
|
||||
0,
|
||||
mapsp(mapsp('1', '1'), mapsp('1', '1')),
|
||||
mapsp(sp('binary', '[""]'), mapsp('1', '1'))
|
||||
mapsp(sp('string', '[""]'), mapsp('1', '1'))
|
||||
)
|
||||
msgpack_eq(
|
||||
0,
|
||||
@@ -138,7 +122,7 @@ describe('autoload/msgpack.vim', function()
|
||||
msgpack_eq(1, mapsp(sp('string', '["1"]'), '1'), '{"1": 1}')
|
||||
msgpack_eq(1, mapsp(sp('string', '["1"]'), sp('integer', '[1, 0, 0, 1]')), '{"1": 1}')
|
||||
msgpack_eq(0, mapsp(sp('integer', '[1, 0, 0, 1]'), sp('string', '["1"]')), '{1: "1"}')
|
||||
msgpack_eq(0, mapsp('"1"', sp('integer', '[1, 0, 0, 1]')), '{"1": 1}')
|
||||
msgpack_eq(1, mapsp('"1"', sp('integer', '[1, 0, 0, 1]')), '{"1": 1}')
|
||||
msgpack_eq(0, mapsp(sp('string', '["1"]'), '1', sp('string', '["2"]'), '2'), '{"1": 1}')
|
||||
msgpack_eq(0, mapsp(sp('string', '["1"]'), '1'), '{"1": 1, "2": 2}')
|
||||
end)
|
||||
@@ -290,7 +274,6 @@ describe('autoload/msgpack.vim', function()
|
||||
|
||||
it('works for special dictionaries', function()
|
||||
type_eq('string', sp('string', '[""]'))
|
||||
type_eq('binary', sp('binary', '[""]'))
|
||||
type_eq('ext', sp('ext', '[1, [""]]'))
|
||||
type_eq('array', sp('array', '[]'))
|
||||
type_eq('map', sp('map', '[]'))
|
||||
@@ -301,7 +284,7 @@ describe('autoload/msgpack.vim', function()
|
||||
end)
|
||||
|
||||
it('works for regular values', function()
|
||||
type_eq('binary', '""')
|
||||
type_eq('string', '""')
|
||||
type_eq('array', '[]')
|
||||
type_eq('map', '{}')
|
||||
type_eq('integer', '1')
|
||||
@@ -319,7 +302,6 @@ describe('autoload/msgpack.vim', function()
|
||||
|
||||
it('works for special dictionaries', function()
|
||||
sp_type_eq('string', sp('string', '[""]'))
|
||||
sp_type_eq('binary', sp('binary', '[""]'))
|
||||
sp_type_eq('ext', sp('ext', '[1, [""]]'))
|
||||
sp_type_eq('array', sp('array', '[]'))
|
||||
sp_type_eq('map', sp('map', '[]'))
|
||||
@@ -347,12 +329,9 @@ describe('autoload/msgpack.vim', function()
|
||||
end
|
||||
|
||||
it('works for special dictionaries', function()
|
||||
string_eq('=""', sp('string', '[""]'))
|
||||
string_eq('="\\n"', sp('string', '["", ""]'))
|
||||
string_eq('="ab\\0c\\nde"', sp('string', '["ab\\nc", "de"]'))
|
||||
string_eq('""', sp('binary', '[""]'))
|
||||
string_eq('"\\n"', sp('binary', '["", ""]'))
|
||||
string_eq('"ab\\0c\\nde"', sp('binary', '["ab\\nc", "de"]'))
|
||||
string_eq('""', sp('string', '[""]'))
|
||||
string_eq('"\\n"', sp('string', '["", ""]'))
|
||||
string_eq('"ab\\0c\\nde"', sp('string', '["ab\\nc", "de"]'))
|
||||
string_eq('+(2)""', sp('ext', '[2, [""]]'))
|
||||
string_eq('+(2)"\\n"', sp('ext', '[2, ["", ""]]'))
|
||||
string_eq('+(2)"ab\\0c\\nde"', sp('ext', '[2, ["ab\\nc", "de"]]'))
|
||||
@@ -397,8 +376,8 @@ describe('autoload/msgpack.vim', function()
|
||||
string_eq('[]', '[]')
|
||||
string_eq('[[[{}]]]', '[[[{}]]]')
|
||||
string_eq('{}', '{}')
|
||||
string_eq('{="2": 10}', '{2: 10}')
|
||||
string_eq('{="2": [{}]}', '{2: [{}]}')
|
||||
string_eq('{"2": 10}', '{2: 10}')
|
||||
string_eq('{"2": [{}]}', '{2: [{}]}')
|
||||
string_eq('1', '1')
|
||||
string_eq('0.0', '0.0')
|
||||
string_eq('inf', '(1.0/0.0)')
|
||||
@@ -422,7 +401,6 @@ describe('autoload/msgpack.vim', function()
|
||||
nvim_command('let spflt = ' .. sp('float', '1.0'))
|
||||
nvim_command('let spext = ' .. sp('ext', '[2, ["abc", "def"]]'))
|
||||
nvim_command('let spstr = ' .. sp('string', '["abc", "def"]'))
|
||||
nvim_command('let spbin = ' .. sp('binary', '["abc", "def"]'))
|
||||
nvim_command('let spbln = ' .. sp('boolean', '0'))
|
||||
nvim_command('let spnil = ' .. sp('nil', '0'))
|
||||
|
||||
@@ -432,7 +410,6 @@ describe('autoload/msgpack.vim', function()
|
||||
nvim_command('let spflt2 = msgpack#deepcopy(spflt)')
|
||||
nvim_command('let spext2 = msgpack#deepcopy(spext)')
|
||||
nvim_command('let spstr2 = msgpack#deepcopy(spstr)')
|
||||
nvim_command('let spbin2 = msgpack#deepcopy(spbin)')
|
||||
nvim_command('let spbln2 = msgpack#deepcopy(spbln)')
|
||||
nvim_command('let spnil2 = msgpack#deepcopy(spnil)')
|
||||
|
||||
@@ -442,7 +419,6 @@ describe('autoload/msgpack.vim', function()
|
||||
eq('float', nvim_eval('msgpack#type(spflt2)'))
|
||||
eq('ext', nvim_eval('msgpack#type(spext2)'))
|
||||
eq('string', nvim_eval('msgpack#type(spstr2)'))
|
||||
eq('binary', nvim_eval('msgpack#type(spbin2)'))
|
||||
eq('boolean', nvim_eval('msgpack#type(spbln2)'))
|
||||
eq('nil', nvim_eval('msgpack#type(spnil2)'))
|
||||
|
||||
@@ -457,7 +433,6 @@ describe('autoload/msgpack.vim', function()
|
||||
nvim_command('let spext._VAL[0] = 3')
|
||||
nvim_command('let spext._VAL[1][0] = "gh"')
|
||||
nvim_command('let spstr._VAL[0] = "gh"')
|
||||
nvim_command('let spbin._VAL[0] = "gh"')
|
||||
nvim_command('let spbln._VAL = 1')
|
||||
nvim_command('let spnil._VAL = 1')
|
||||
|
||||
@@ -467,7 +442,6 @@ describe('autoload/msgpack.vim', function()
|
||||
eq({ _TYPE = {}, _VAL = 1.0 }, nvim_eval('spflt2'))
|
||||
eq({ _TYPE = {}, _VAL = { 2, { 'abc', 'def' } } }, nvim_eval('spext2'))
|
||||
eq({ _TYPE = {}, _VAL = { 'abc', 'def' } }, nvim_eval('spstr2'))
|
||||
eq({ _TYPE = {}, _VAL = { 'abc', 'def' } }, nvim_eval('spbin2'))
|
||||
eq({ _TYPE = {}, _VAL = 0 }, nvim_eval('spbln2'))
|
||||
eq({ _TYPE = {}, _VAL = 0 }, nvim_eval('spnil2'))
|
||||
|
||||
@@ -477,7 +451,6 @@ describe('autoload/msgpack.vim', function()
|
||||
nvim_command('let spflt._TYPE = []')
|
||||
nvim_command('let spext._TYPE = []')
|
||||
nvim_command('let spstr._TYPE = []')
|
||||
nvim_command('let spbin._TYPE = []')
|
||||
nvim_command('let spbln._TYPE = []')
|
||||
nvim_command('let spnil._TYPE = []')
|
||||
|
||||
@@ -487,7 +460,6 @@ describe('autoload/msgpack.vim', function()
|
||||
eq('float', nvim_eval('msgpack#special_type(spflt2)'))
|
||||
eq('ext', nvim_eval('msgpack#special_type(spext2)'))
|
||||
eq('string', nvim_eval('msgpack#special_type(spstr2)'))
|
||||
eq('binary', nvim_eval('msgpack#special_type(spbin2)'))
|
||||
eq('boolean', nvim_eval('msgpack#special_type(spbln2)'))
|
||||
eq('nil', nvim_eval('msgpack#special_type(spnil2)'))
|
||||
end)
|
||||
@@ -509,7 +481,7 @@ describe('autoload/msgpack.vim', function()
|
||||
eq('map', nvim_eval('msgpack#type(map2)'))
|
||||
eq('integer', nvim_eval('msgpack#type(int2)'))
|
||||
eq('float', nvim_eval('msgpack#type(flt2)'))
|
||||
eq('binary', nvim_eval('msgpack#type(bin2)'))
|
||||
eq('string', nvim_eval('msgpack#type(bin2)'))
|
||||
|
||||
nvim_command('call add(arr, 0)')
|
||||
nvim_command('call add(arr[0], 0)')
|
||||
@@ -566,21 +538,6 @@ describe('autoload/msgpack.vim', function()
|
||||
nvim_command('unlet g:__val')
|
||||
end
|
||||
|
||||
it('correctly loads binary strings', function()
|
||||
eval_eq('binary', { 'abcdef' }, '"abcdef"')
|
||||
eval_eq('binary', { 'abc', 'def' }, '"abc\\ndef"')
|
||||
eval_eq('binary', { 'abc\ndef' }, '"abc\\0def"')
|
||||
eval_eq('binary', { '\nabc\ndef\n' }, '"\\0abc\\0def\\0"')
|
||||
eval_eq('binary', { 'abc\n\n\ndef' }, '"abc\\0\\0\\0def"')
|
||||
eval_eq('binary', { 'abc\n', '\ndef' }, '"abc\\0\\n\\0def"')
|
||||
eval_eq('binary', { 'abc', '', '', 'def' }, '"abc\\n\\n\\ndef"')
|
||||
eval_eq('binary', { 'abc', '', '', 'def', '' }, '"abc\\n\\n\\ndef\\n"')
|
||||
eval_eq('binary', { '', 'abc', '', '', 'def' }, '"\\nabc\\n\\n\\ndef"')
|
||||
eval_eq('binary', { '' }, '""')
|
||||
eval_eq('binary', { '"' }, '"\\""')
|
||||
eval_eq('binary', { 'py3 print(sys.version_info)' }, '"py3 print(sys.version_info)"')
|
||||
end)
|
||||
|
||||
it('correctly loads strings', function()
|
||||
eval_eq('string', { 'abcdef' }, '="abcdef"')
|
||||
eval_eq('string', { 'abc', 'def' }, '="abc\\ndef"')
|
||||
|
||||
@@ -68,7 +68,7 @@ describe('autoload/shada.vim', function()
|
||||
endfor
|
||||
return ret
|
||||
elseif type(a:val) == type('')
|
||||
return {'_TYPE': v:msgpack_types.binary, '_VAL': split(a:val, "\n", 1)}
|
||||
return {'_TYPE': v:msgpack_types.string, '_VAL': split(a:val, "\n", 1)}
|
||||
else
|
||||
return a:val
|
||||
endif
|
||||
@@ -253,8 +253,7 @@ describe('autoload/shada.vim', function()
|
||||
' + sm magic value "TRUE"',
|
||||
' # Expected integer',
|
||||
' + so offset value "TRUE"',
|
||||
' # Expected binary string',
|
||||
' + sp pattern ="abc"',
|
||||
' + sp pattern "abc"',
|
||||
},
|
||||
([[ [{'type': 1, 'timestamp': 0, 'data': {
|
||||
'sm': 'TRUE',
|
||||
@@ -267,7 +266,7 @@ describe('autoload/shada.vim', function()
|
||||
'n': -0x40,
|
||||
'l': -10,
|
||||
'c': 'abc',
|
||||
'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["abc\ndef"]},
|
||||
'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["abc\ndef"]},
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -276,15 +275,14 @@ describe('autoload/shada.vim', function()
|
||||
' % Key Description Value',
|
||||
' # Expected no NUL bytes',
|
||||
' + f file name "abc\\0def"',
|
||||
' # Expected array of binary strings',
|
||||
' + rc contents ["abc", ="abc"]',
|
||||
' + rc contents ["abc", "abc"]',
|
||||
' # Expected integer',
|
||||
' + rt type "ABC"',
|
||||
},
|
||||
([[ [{'type': 1, 'timestamp': 0, 'data': {
|
||||
'rt': 'ABC',
|
||||
'rc': ["abc", {'_TYPE': v:msgpack_types.string, '_VAL': ["abc"]}],
|
||||
'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["abc\ndef"]},
|
||||
'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["abc\ndef"]},
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -295,7 +293,7 @@ describe('autoload/shada.vim', function()
|
||||
' + rc contents ["abc", "a\\nd\\0"]',
|
||||
},
|
||||
([[ [{'type': 1, 'timestamp': 0, 'data': {
|
||||
'rc': ["abc", {'_TYPE': v:msgpack_types.binary, '_VAL': ["a", "d\n"]}],
|
||||
'rc': ["abc", {'_TYPE': v:msgpack_types.string, '_VAL': ["a", "d\n"]}],
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
end)
|
||||
@@ -468,7 +466,7 @@ describe('autoload/shada.vim', function()
|
||||
sd2strings_eq({
|
||||
'Replacement string with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
}, { { type = 3, timestamp = 0, data = { a = { 10 } } } })
|
||||
sd2strings_eq(
|
||||
{
|
||||
@@ -498,7 +496,7 @@ describe('autoload/shada.vim', function()
|
||||
' - :s replacement string "abc\\0def"',
|
||||
},
|
||||
([[ [{'type': 3, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["abc\ndef"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["abc\ndef"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -508,7 +506,7 @@ describe('autoload/shada.vim', function()
|
||||
' - :s replacement string "abc\\ndef"',
|
||||
},
|
||||
([[ [{'type': 3, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["abc", "def"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["abc", "def"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -519,7 +517,7 @@ describe('autoload/shada.vim', function()
|
||||
' - 0',
|
||||
},
|
||||
([[ [{'type': 3, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["abc", "def"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["abc", "def"]},
|
||||
0,
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
@@ -529,7 +527,7 @@ describe('autoload/shada.vim', function()
|
||||
sd2strings_eq({
|
||||
'History entry with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
}, { { type = 4, timestamp = 0, data = { a = { 10 } } } })
|
||||
sd2strings_eq(
|
||||
{
|
||||
@@ -682,7 +680,7 @@ describe('autoload/shada.vim', function()
|
||||
},
|
||||
([[ [{'type': 4, 'timestamp': 0, 'data': [
|
||||
4,
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["abc\ndef"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["abc\ndef"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -909,7 +907,7 @@ describe('autoload/shada.vim', function()
|
||||
sd2strings_eq({
|
||||
'Variable with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
}, { { type = 6, timestamp = 0, data = { a = { 10 } } } })
|
||||
sd2strings_eq(
|
||||
{
|
||||
@@ -941,7 +939,7 @@ describe('autoload/shada.vim', function()
|
||||
' # Expected more elements in list',
|
||||
},
|
||||
([[ [{'type': 6, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["\n"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["\n"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -952,7 +950,7 @@ describe('autoload/shada.vim', function()
|
||||
' # Expected more elements in list',
|
||||
},
|
||||
([[ [{'type': 6, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["foo"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["foo"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -963,7 +961,7 @@ describe('autoload/shada.vim', function()
|
||||
' - value NIL',
|
||||
},
|
||||
([[ [{'type': 6, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["foo"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["foo"]},
|
||||
{'_TYPE': v:msgpack_types.nil, '_VAL': ["foo"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
@@ -976,7 +974,7 @@ describe('autoload/shada.vim', function()
|
||||
' - NIL',
|
||||
},
|
||||
([[ [{'type': 6, 'timestamp': 0, 'data': [
|
||||
{'_TYPE': v:msgpack_types.binary, '_VAL': ["foo"]},
|
||||
{'_TYPE': v:msgpack_types.string, '_VAL': ["foo"]},
|
||||
{'_TYPE': v:msgpack_types.nil, '_VAL': ["foo"]},
|
||||
{'_TYPE': v:msgpack_types.nil, '_VAL': ["foo"]},
|
||||
]}] ]]):gsub('\n', '')
|
||||
@@ -1041,7 +1039,7 @@ describe('autoload/shada.vim', function()
|
||||
},
|
||||
([[ [{'type': 7, 'timestamp': 0, 'data': {
|
||||
'n': -10,
|
||||
'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["\n"]},
|
||||
'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["\n"]},
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -1174,7 +1172,7 @@ describe('autoload/shada.vim', function()
|
||||
},
|
||||
([[ [{'type': 8, 'timestamp': 0, 'data': {
|
||||
'n': -10,
|
||||
'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["\n"]},
|
||||
'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["\n"]},
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -1237,7 +1235,7 @@ describe('autoload/shada.vim', function()
|
||||
sd2strings_eq({
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
}, { { type = 9, timestamp = 0, data = { a = { 10 } } } })
|
||||
sd2strings_eq({
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
@@ -1247,7 +1245,7 @@ describe('autoload/shada.vim', function()
|
||||
sd2strings_eq({
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Expected array of maps',
|
||||
' = [{="a": 10}, []]',
|
||||
' = [{"a": 10}, []]',
|
||||
}, { { type = 9, timestamp = 0, data = { { a = 10 }, {} } } })
|
||||
sd2strings_eq({
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
@@ -1322,7 +1320,7 @@ describe('autoload/shada.vim', function()
|
||||
},
|
||||
([[ [{'type': 9, 'timestamp': 0, 'data': [
|
||||
{'f': 10},
|
||||
{'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["\n"]}},
|
||||
{'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["\n"]}},
|
||||
]}] ]]):gsub('\n', '')
|
||||
)
|
||||
end)
|
||||
@@ -1385,7 +1383,7 @@ describe('autoload/shada.vim', function()
|
||||
},
|
||||
([[ [{'type': 10, 'timestamp': 0, 'data': {
|
||||
'n': -10,
|
||||
'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["\n"]},
|
||||
'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["\n"]},
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -1504,7 +1502,7 @@ describe('autoload/shada.vim', function()
|
||||
},
|
||||
([[ [{'type': 11, 'timestamp': 0, 'data': {
|
||||
'n': -10,
|
||||
'f': {'_TYPE': v:msgpack_types.binary, '_VAL': ["\n"]},
|
||||
'f': {'_TYPE': v:msgpack_types.string, '_VAL': ["\n"]},
|
||||
}}] ]]):gsub('\n', '')
|
||||
)
|
||||
sd2strings_eq(
|
||||
@@ -1616,7 +1614,7 @@ describe('autoload/shada.vim', function()
|
||||
timestamp = 0,
|
||||
data = {
|
||||
c = 'abc',
|
||||
f = { '!binary', { 'abc\ndef' } },
|
||||
f = { '!string', { 'abc\ndef' } },
|
||||
l = -10,
|
||||
n = -64,
|
||||
rc = '10',
|
||||
@@ -1711,7 +1709,7 @@ describe('autoload/shada.vim', function()
|
||||
timestamp = 0,
|
||||
data = {
|
||||
c = 'abc',
|
||||
f = { '!binary', { 'abc\ndef' } },
|
||||
f = { '!string', { 'abc\ndef' } },
|
||||
l = -10,
|
||||
n = -64,
|
||||
rc = '10',
|
||||
@@ -1892,7 +1890,7 @@ describe('autoload/shada.vim', function()
|
||||
} } }, {
|
||||
'Replacement string with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
})
|
||||
strings2sd_eq({ { type = 3, timestamp = 0, data = {} } }, {
|
||||
'Replacement string with timestamp ' .. epoch .. ':',
|
||||
@@ -1934,7 +1932,7 @@ describe('autoload/shada.vim', function()
|
||||
} } }, {
|
||||
'History entry with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
})
|
||||
strings2sd_eq({ { type = 4, timestamp = 0, data = {} } }, {
|
||||
'History entry with timestamp ' .. epoch .. ':',
|
||||
@@ -2184,7 +2182,7 @@ describe('autoload/shada.vim', function()
|
||||
} } }, {
|
||||
'Variable with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
})
|
||||
strings2sd_eq({ { type = 6, timestamp = 0, data = {} } }, {
|
||||
'Variable with timestamp ' .. epoch .. ':',
|
||||
@@ -2315,7 +2313,7 @@ describe('autoload/shada.vim', function()
|
||||
} } }, {
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Unexpected type: map instead of array',
|
||||
' = {="a": [10]}',
|
||||
' = {"a": [10]}',
|
||||
})
|
||||
strings2sd_eq(
|
||||
{ { type = 9, timestamp = 0, data = {
|
||||
@@ -2325,7 +2323,7 @@ describe('autoload/shada.vim', function()
|
||||
{
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Expected array of maps',
|
||||
' = [{="a": 10}, []]',
|
||||
' = [{"a": 10}, []]',
|
||||
}
|
||||
)
|
||||
strings2sd_eq({ { type = 9, timestamp = 0, data = {
|
||||
@@ -2421,7 +2419,7 @@ describe('autoload/shada.vim', function()
|
||||
timestamp = 0,
|
||||
data = {
|
||||
{ f = 10 },
|
||||
{ f = { '!binary', { '\n' } } },
|
||||
{ f = { '!string', { '\n' } } },
|
||||
},
|
||||
},
|
||||
}, {
|
||||
@@ -2955,7 +2953,7 @@ describe('ftplugin/shada.vim', function()
|
||||
' - :s replacement string "abc\\ndef"',
|
||||
' Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Expected array of maps',
|
||||
'= [{="a": 10}, []]',
|
||||
'= [{"a": 10}, []]',
|
||||
' Buffer list with timestamp ' .. epoch .. ':',
|
||||
' % Key Description Value',
|
||||
' # Expected binary string',
|
||||
@@ -2992,7 +2990,7 @@ describe('ftplugin/shada.vim', function()
|
||||
' - :s replacement string "abc\\ndef"',
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Expected array of maps',
|
||||
' = [{="a": 10}, []]',
|
||||
' = [{"a": 10}, []]',
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' % Key Description Value',
|
||||
' # Expected binary string',
|
||||
@@ -3083,7 +3081,7 @@ describe('syntax/shada.vim', function()
|
||||
' - :s replacement string DEBUG',
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' # Expected array of maps',
|
||||
' = [{="a": +(10)"ac\\0df\\ngi\\"tt\\.", TRUE: FALSE}, [NIL, +(-10)""]]',
|
||||
' = [{"a": +(10)"ac\\0df\\ngi\\"tt\\.", TRUE: FALSE}, [NIL, +(-10)""]]',
|
||||
'Buffer list with timestamp ' .. epoch .. ':',
|
||||
' % Key Description Value',
|
||||
'',
|
||||
@@ -3119,8 +3117,8 @@ describe('syntax/shada.vim', function()
|
||||
{1: -} {4::s replacement string} {1:DEBUG} |
|
||||
{1:Buffer list} with timestamp 1970{1:-}01{1:-}01{1:T}00{1::}00{1::}00: |
|
||||
{4: # Expected array of maps} |
|
||||
= {1:[{="}{3:a}{1:":} {1:+(}{5:10}{1:)"}{3:ac}{6:\0}{3:df}{6:\n}{3:gi}{6:\"}{3:tt\.}{1:",} {1:TRUE:} {1:FALSE},} {1:[NIL,} {1:+(}{5:-}|
|
||||
{5:10}{1:)""]]} |
|
||||
= {1:[{"}{3:a}{1:":} {1:+(}{5:10}{1:)"}{3:ac}{6:\0}{3:df}{6:\n}{3:gi}{6:\"}{3:tt\.}{1:",} {1:TRUE:} {1:FALSE},} {1:[NIL,} {1:+(}{5:-1}|
|
||||
{5:0}{1:)""]]} |
|
||||
{1:Buffer list} with timestamp 1970{1:-}01{1:-}01{1:T}00{1::}00{1::}00: |
|
||||
{2: % Key Description Value} |
|
||||
|
|
||||
@@ -3464,7 +3462,6 @@ describe('syntax/shada.vim', function()
|
||||
{ { 'ShaDaEntryRawMsgpack' }, ' = ' },
|
||||
{ { 'ShaDaMsgpackArray', 'ShaDaMsgpackArrayBraces' }, '[' },
|
||||
{ { 'ShaDaMsgpackArray', 'ShaDaMsgpackMap', 'ShaDaMsgpackMapBraces' }, '{' },
|
||||
{ { 'ShaDaMsgpackArray', 'ShaDaMsgpackMap', 'ShaDaMsgpackString' }, '=' },
|
||||
{
|
||||
{
|
||||
'ShaDaMsgpackArray',
|
||||
|
||||
@@ -502,9 +502,9 @@ describe('json_decode() function', function()
|
||||
end
|
||||
|
||||
it('parses strings with NUL properly', function()
|
||||
sp_decode_eq({ _TYPE = 'string', _VAL = { '\n' } }, '"\\u0000"')
|
||||
sp_decode_eq({ _TYPE = 'string', _VAL = { '\n', '\n' } }, '"\\u0000\\n\\u0000"')
|
||||
sp_decode_eq({ _TYPE = 'string', _VAL = { '\n«\n' } }, '"\\u0000\\u00AB\\u0000"')
|
||||
sp_decode_eq('\000', '"\\u0000"')
|
||||
sp_decode_eq('\000\n\000', '"\\u0000\\n\\u0000"')
|
||||
sp_decode_eq('\000«\000', '"\\u0000\\u00AB\\u0000"')
|
||||
end)
|
||||
|
||||
it('parses dictionaries with duplicate keys to special maps', function()
|
||||
@@ -580,14 +580,8 @@ describe('json_decode() function', function()
|
||||
end)
|
||||
|
||||
it('parses dictionaries with keys with NUL bytes to special maps', function()
|
||||
sp_decode_eq(
|
||||
{ _TYPE = 'map', _VAL = { { { _TYPE = 'string', _VAL = { 'a\n', 'b' } }, 4 } } },
|
||||
'{"a\\u0000\\nb": 4}'
|
||||
)
|
||||
sp_decode_eq(
|
||||
{ _TYPE = 'map', _VAL = { { { _TYPE = 'string', _VAL = { 'a\n', 'b', '' } }, 4 } } },
|
||||
'{"a\\u0000\\nb\\n": 4}'
|
||||
)
|
||||
sp_decode_eq({ _TYPE = 'map', _VAL = { { 'a\000\nb', 4 } } }, '{"a\\u0000\\nb": 4}')
|
||||
sp_decode_eq({ _TYPE = 'map', _VAL = { { 'a\000\nb\n', 4 } } }, '{"a\\u0000\\nb\\n": 4}')
|
||||
sp_decode_eq({
|
||||
_TYPE = 'map',
|
||||
_VAL = {
|
||||
@@ -595,10 +589,7 @@ describe('json_decode() function', function()
|
||||
{ 'a', 1 },
|
||||
{ 'c', 4 },
|
||||
{ 'd', 2 },
|
||||
{
|
||||
{ _TYPE = 'string', _VAL = { '\n' } },
|
||||
4,
|
||||
},
|
||||
{ '\000', 4 },
|
||||
},
|
||||
}, '{"b": 3, "a": 1, "c": 4, "d": 2, "\\u0000": 4}')
|
||||
end)
|
||||
@@ -738,22 +729,11 @@ describe('json_encode() function', function()
|
||||
eq('{"\\u0000": 1}', eval('json_encode(todump)'))
|
||||
end)
|
||||
|
||||
it('can dump generic mapping with BIN special key and NUL', function()
|
||||
command('let todump = {"_TYPE": v:msgpack_types.binary, "_VAL": ["\\n"]}')
|
||||
command('let todump = {"_TYPE": v:msgpack_types.map, "_VAL": [[todump, 1]]}')
|
||||
eq('{"\\u0000": 1}', eval('json_encode(todump)'))
|
||||
end)
|
||||
|
||||
it('can dump STR special mapping with NUL and NL', function()
|
||||
command('let todump = {"_TYPE": v:msgpack_types.string, "_VAL": ["\\n", ""]}')
|
||||
eq('"\\u0000\\n"', eval('json_encode(todump)'))
|
||||
end)
|
||||
|
||||
it('can dump BIN special mapping with NUL and NL', function()
|
||||
command('let todump = {"_TYPE": v:msgpack_types.binary, "_VAL": ["\\n", ""]}')
|
||||
eq('"\\u0000\\n"', eval('json_encode(todump)'))
|
||||
end)
|
||||
|
||||
it('cannot dump special ext mapping', function()
|
||||
command('let todump = {"_TYPE": v:msgpack_types.ext, "_VAL": [5, ["",""]]}')
|
||||
eq('Vim(call):E474: Unable to convert EXT string to JSON', exc_exec('call json_encode(todump)'))
|
||||
|
||||
@@ -371,13 +371,14 @@ describe('msgpack*() functions', function()
|
||||
eq(1, eval('dumped ==# dumped2'))
|
||||
end)
|
||||
|
||||
it('can restore and dump STR string with zero byte', function()
|
||||
it('can restore and dump STR string contents with zero byte', function()
|
||||
command('let dumped = ["\\xA1\\n"]')
|
||||
command('let parsed = msgpackparse(dumped)')
|
||||
command('let dumped2 = msgpackdump(parsed)')
|
||||
eq({ { _TYPE = {}, _VAL = { '\n' } } }, eval('parsed'))
|
||||
eq(1, eval('parsed[0]._TYPE is v:msgpack_types.string'))
|
||||
eq(1, eval('dumped ==# dumped2'))
|
||||
eq({ '\000' }, eval('parsed'))
|
||||
eq(eval('v:t_blob'), eval('type(parsed[0])'))
|
||||
-- type is not preserved: prefer BIN for binary contents
|
||||
eq(0, eval('dumped ==# dumped2'))
|
||||
end)
|
||||
|
||||
it('can restore and dump BIN string with NL', function()
|
||||
@@ -428,9 +429,8 @@ describe('msgpackparse() function', function()
|
||||
parse_eq({ true }, { '\195' })
|
||||
end)
|
||||
|
||||
it('restores FIXSTR as special dict', function()
|
||||
parse_eq({ { _TYPE = {}, _VAL = { 'ab' } } }, { '\162ab' })
|
||||
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.string'))
|
||||
it('restores FIXSTR as string', function()
|
||||
parse_eq({ 'ab' }, { '\162ab' })
|
||||
end)
|
||||
|
||||
it('restores BIN 8 as string', function()
|
||||
@@ -442,9 +442,8 @@ describe('msgpackparse() function', function()
|
||||
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.ext'))
|
||||
end)
|
||||
|
||||
it('restores MAP with BIN key as special dictionary', function()
|
||||
parse_eq({ { _TYPE = {}, _VAL = { { 'a', '' } } } }, { '\129\196\001a\196\n' })
|
||||
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.map'))
|
||||
it('restores MAP with BIN key as ordinary dictionary', function()
|
||||
parse_eq({ { a = '' } }, { '\129\196\001a\196\n' })
|
||||
end)
|
||||
|
||||
it('restores MAP with duplicate STR keys as special dictionary', function()
|
||||
@@ -455,14 +454,14 @@ describe('msgpackparse() function', function()
|
||||
{
|
||||
_TYPE = {},
|
||||
_VAL = {
|
||||
{ { _TYPE = {}, _VAL = { 'a' } }, '' },
|
||||
{ { _TYPE = {}, _VAL = { 'a' } }, '' },
|
||||
{ 'a', '' },
|
||||
{ 'a', '' },
|
||||
},
|
||||
},
|
||||
}, eval('parsed'))
|
||||
eq(1, eval('g:parsed[0]._TYPE is v:msgpack_types.map'))
|
||||
eq(1, eval('g:parsed[0]._VAL[0][0]._TYPE is v:msgpack_types.string'))
|
||||
eq(1, eval('g:parsed[0]._VAL[1][0]._TYPE is v:msgpack_types.string'))
|
||||
eq(eval('v:t_string'), eval('type(g:parsed[0]._VAL[0][0])'))
|
||||
eq(eval('v:t_string'), eval('type(g:parsed[0]._VAL[1][0])'))
|
||||
end)
|
||||
|
||||
it('restores MAP with MAP key as special dictionary', function()
|
||||
@@ -802,7 +801,7 @@ describe('msgpackdump() function', function()
|
||||
|
||||
it('can dump NULL string', function()
|
||||
dump_eq({ '\196\n' }, '[$XXX_UNEXISTENT_VAR_XXX]')
|
||||
dump_eq({ '\196\n' }, '[{"_TYPE": v:msgpack_types.binary, "_VAL": [$XXX_UNEXISTENT_VAR_XXX]}]')
|
||||
dump_eq({ '\196\n' }, '[v:_null_blob]')
|
||||
dump_eq({ '\160' }, '[{"_TYPE": v:msgpack_types.string, "_VAL": [$XXX_UNEXISTENT_VAR_XXX]}]')
|
||||
end)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user