Files
neovim/test/functional/lua/utility_functions_spec.lua
Björn Linse 3a84e5be88 lua: expose full interface of vim.inspect and add test
Implement lazy loading for vim.submodule, this would be over-engineering
for inspect only, but we expect to use this solution also for more and
larger modules.
2019-01-14 20:12:57 +01:00

208 lines
7.4 KiB
Lua

-- Test suite for testing interactions with API bindings
local helpers = require('test.functional.helpers')(after_each)
local funcs = helpers.funcs
local meths = helpers.meths
local clear = helpers.clear
local eq = helpers.eq
before_each(clear)
describe('vim.stricmp', function()
-- İ: `tolower("İ")` is `i` which has length 1 while `İ` itself has
-- length 2 (in bytes).
-- Ⱥ: `tolower("Ⱥ")` is `ⱥ` which has length 2 while `Ⱥ` itself has
-- length 3 (in bytes).
--
-- Note: 'i' !=? 'İ' and 'ⱥ' !=? 'Ⱥ' on some systems.
-- Note: Built-in Nvim comparison (on systems lacking `strcasecmp`) works
-- only on ASCII characters.
it('works', function()
eq(0, funcs.luaeval('vim.stricmp("a", "A")'))
eq(0, funcs.luaeval('vim.stricmp("A", "a")'))
eq(0, funcs.luaeval('vim.stricmp("a", "a")'))
eq(0, funcs.luaeval('vim.stricmp("A", "A")'))
eq(0, funcs.luaeval('vim.stricmp("", "")'))
eq(0, funcs.luaeval('vim.stricmp("\\0", "\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0\\0", "\\0\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0", "\\0\\0\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0A", "\\0\\0\\0a")'))
eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0A")'))
eq(0, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0a")'))
eq(0, funcs.luaeval('vim.stricmp("a\\0", "A\\0")'))
eq(0, funcs.luaeval('vim.stricmp("A\\0", "a\\0")'))
eq(0, funcs.luaeval('vim.stricmp("a\\0", "a\\0")'))
eq(0, funcs.luaeval('vim.stricmp("A\\0", "A\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0a", "\\0A")'))
eq(0, funcs.luaeval('vim.stricmp("\\0A", "\\0a")'))
eq(0, funcs.luaeval('vim.stricmp("\\0a", "\\0a")'))
eq(0, funcs.luaeval('vim.stricmp("\\0A", "\\0A")'))
eq(0, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0A\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0a\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0a\\0")'))
eq(0, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0A\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("a", "B")'))
eq(-1, funcs.luaeval('vim.stricmp("A", "b")'))
eq(-1, funcs.luaeval('vim.stricmp("a", "b")'))
eq(-1, funcs.luaeval('vim.stricmp("A", "B")'))
eq(-1, funcs.luaeval('vim.stricmp("", "\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0", "\\0\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0\\0", "\\0\\0\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0\\0\\0A", "\\0\\0\\0b")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0B")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0\\0\\0a", "\\0\\0\\0b")'))
eq(-1, funcs.luaeval('vim.stricmp("a\\0", "B\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("A\\0", "b\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("a\\0", "b\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("A\\0", "B\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0a", "\\0B")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0A", "\\0b")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0a", "\\0b")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0A", "\\0B")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0B\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0b\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0a\\0", "\\0b\\0")'))
eq(-1, funcs.luaeval('vim.stricmp("\\0A\\0", "\\0B\\0")'))
eq(1, funcs.luaeval('vim.stricmp("c", "B")'))
eq(1, funcs.luaeval('vim.stricmp("C", "b")'))
eq(1, funcs.luaeval('vim.stricmp("c", "b")'))
eq(1, funcs.luaeval('vim.stricmp("C", "B")'))
eq(1, funcs.luaeval('vim.stricmp("\\0", "")'))
eq(1, funcs.luaeval('vim.stricmp("\\0\\0", "\\0")'))
eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0", "\\0\\0")'))
eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0\\0", "\\0\\0\\0")'))
eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0C", "\\0\\0\\0b")'))
eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0c", "\\0\\0\\0B")'))
eq(1, funcs.luaeval('vim.stricmp("\\0\\0\\0c", "\\0\\0\\0b")'))
eq(1, funcs.luaeval('vim.stricmp("c\\0", "B\\0")'))
eq(1, funcs.luaeval('vim.stricmp("C\\0", "b\\0")'))
eq(1, funcs.luaeval('vim.stricmp("c\\0", "b\\0")'))
eq(1, funcs.luaeval('vim.stricmp("C\\0", "B\\0")'))
eq(1, funcs.luaeval('vim.stricmp("c\\0", "B")'))
eq(1, funcs.luaeval('vim.stricmp("C\\0", "b")'))
eq(1, funcs.luaeval('vim.stricmp("c\\0", "b")'))
eq(1, funcs.luaeval('vim.stricmp("C\\0", "B")'))
eq(1, funcs.luaeval('vim.stricmp("\\0c", "\\0B")'))
eq(1, funcs.luaeval('vim.stricmp("\\0C", "\\0b")'))
eq(1, funcs.luaeval('vim.stricmp("\\0c", "\\0b")'))
eq(1, funcs.luaeval('vim.stricmp("\\0C", "\\0B")'))
eq(1, funcs.luaeval('vim.stricmp("\\0c\\0", "\\0B\\0")'))
eq(1, funcs.luaeval('vim.stricmp("\\0C\\0", "\\0b\\0")'))
eq(1, funcs.luaeval('vim.stricmp("\\0c\\0", "\\0b\\0")'))
eq(1, funcs.luaeval('vim.stricmp("\\0C\\0", "\\0B\\0")'))
end)
end)
describe("vim.split", function()
it("works", function()
local split = function(str, sep)
return meths.execute_lua('return vim.split(...)', {str, sep})
end
local tests = {
{ "a,b", ",", false, { 'a', 'b' } },
{ ":aa::bb:", ":", false, { '', 'aa', '', 'bb', '' } },
{ "::ee::ff:", ":", false, { '', '', 'ee', '', 'ff', '' } },
{ "ab", ".", false, { '', '', '' } },
{ "a1b2c", "[0-9]", false, { 'a', 'b', 'c' } },
{ "xy", "", false, { 'x', 'y' } },
{ "here be dragons", " ", false, { "here", "be", "dragons"} },
{ "axaby", "ab?", false, { '', 'x', 'y' } },
{ "f v2v v3v w2w ", "([vw])2%1", false, { 'f ', ' v3v ', ' ' } },
{ "x*yz*oo*l", "*", true, { 'x', 'yz', 'oo', 'l' } },
}
for _, t in ipairs(tests) do
eq(t[4], split(t[1], t[2], t[3]))
end
local loops = {
{ "abc", ".-" },
}
for _, t in ipairs(loops) do
local status, err = pcall(split, t[1], t[2])
eq(false, status)
assert(string.match(err, "Infinite loop detected"))
end
end)
end)
describe("vim.trim", function()
it('works', function()
local trim = function(s)
return meths.execute_lua('return vim.trim(...)', { s })
end
local trims = {
{ " a", "a" },
{ " b ", "b" },
{ "\tc" , "c" },
{ "r\n", "r" },
}
for _, t in ipairs(trims) do
assert(t[2], trim(t[1]))
end
local status, err = pcall(trim, 2)
eq(false, status)
assert(string.match(err, "Only strings can be trimmed"))
end)
end)
describe("vim.inspect", function()
it('works', function()
-- just make sure it basically works, it has its own test suite
local inspect = function(t, opts)
return meths.execute_lua('return vim.inspect(...)', { t, opts })
end
eq('2', inspect(2))
eq('{+a = {+b = 1+}+}',
inspect({ a = { b = 1 } }, { newline = '+', indent = '' }))
-- special value vim.inspect.KEY works
eq('{ KEY_a = "x", KEY_b = "y"}', meths.execute_lua([[
return vim.inspect({a="x", b="y"}, {newline = '', process = function(item, path)
if path[#path] == vim.inspect.KEY then
return 'KEY_'..item
end
return item
end})
]], {}))
end)
end)
describe("vim.deepcopy", function()
it("works", function()
local is_dc = meths.execute_lua([[
local a = { x = { 1, 2 }, y = 5}
local b = vim.deepcopy(a)
local count = 0
for _ in pairs(b) do count = count + 1 end
return b.x[1] == 1 and b.x[2] == 2 and b.y == 5 and count == 2
and tostring(a) ~= tostring(b)
]], {})
assert(is_dc)
end)
end)