aboutsummaryrefslogtreecommitdiff
path: root/test/functional/plugin
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-03-09 14:57:57 -0700
committerJosh Rahm <joshuarahm@gmail.com>2024-03-09 14:57:57 -0700
commitc324271b99eee4c621463f368914d57cd729bd9c (patch)
tree5d979d333a2d5f9c080991d5482fd5916f8579c6 /test/functional/plugin
parent931bffbda3668ddc609fc1da8f9eb576b170aa52 (diff)
parentade1b12f49c3b3914c74847d791eb90ea90b56b7 (diff)
downloadrneovim-c324271b99eee4c621463f368914d57cd729bd9c.tar.gz
rneovim-c324271b99eee4c621463f368914d57cd729bd9c.tar.bz2
rneovim-c324271b99eee4c621463f368914d57cd729bd9c.zip
Merge remote-tracking branch 'upstream/master' into userreg
Diffstat (limited to 'test/functional/plugin')
-rw-r--r--test/functional/plugin/cfilter_spec.lua18
-rw-r--r--test/functional/plugin/editorconfig_spec.lua16
-rw-r--r--test/functional/plugin/health_spec.lua255
-rw-r--r--test/functional/plugin/lsp/codelens_spec.lua43
-rw-r--r--test/functional/plugin/lsp/completion_spec.lua118
-rw-r--r--test/functional/plugin/lsp/diagnostic_spec.lua61
-rw-r--r--test/functional/plugin/lsp/handler_spec.lua19
-rw-r--r--test/functional/plugin/lsp/helpers.lua45
-rw-r--r--test/functional/plugin/lsp/incremental_sync_spec.lua430
-rw-r--r--test/functional/plugin/lsp/inlay_hint_spec.lua16
-rw-r--r--test/functional/plugin/lsp/semantic_tokens_spec.lua426
-rw-r--r--test/functional/plugin/lsp/utils_spec.lua117
-rw-r--r--test/functional/plugin/lsp/watchfiles_spec.lua222
-rw-r--r--test/functional/plugin/lsp_spec.lua2834
-rw-r--r--test/functional/plugin/man_spec.lua136
-rw-r--r--test/functional/plugin/matchparen_spec.lua17
-rw-r--r--test/functional/plugin/msgpack_spec.lua519
-rw-r--r--test/functional/plugin/shada_spec.lua3651
-rw-r--r--test/functional/plugin/tohtml_spec.lua372
-rw-r--r--test/functional/plugin/tutor_spec.lua6
-rw-r--r--test/functional/plugin/vim_syntax_spec.lua40
21 files changed, 5515 insertions, 3846 deletions
diff --git a/test/functional/plugin/cfilter_spec.lua b/test/functional/plugin/cfilter_spec.lua
index 8b1e75b495..37261d59df 100644
--- a/test/functional/plugin/cfilter_spec.lua
+++ b/test/functional/plugin/cfilter_spec.lua
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
local clear = helpers.clear
local command = helpers.command
local eq = helpers.eq
-local funcs = helpers.funcs
+local fn = helpers.fn
describe('cfilter.lua', function()
before_each(function()
@@ -13,16 +13,16 @@ describe('cfilter.lua', function()
for _, list in ipairs({
{
name = 'Cfilter',
- get = funcs.getqflist,
- set = funcs.setqflist,
+ get = fn.getqflist,
+ set = fn.setqflist,
},
{
name = 'Lfilter',
get = function()
- return funcs.getloclist(0)
+ return fn.getloclist(0)
end,
set = function(items)
- return funcs.setloclist(0, items)
+ return fn.setloclist(0, items)
end,
},
}) do
@@ -39,7 +39,7 @@ describe('cfilter.lua', function()
describe((':%s'):format(list.name), function()
it('does not error on empty list', function()
filter('nothing')
- eq({}, funcs.getqflist())
+ eq({}, fn.getqflist())
end)
it('requires an argument', function()
@@ -66,7 +66,7 @@ describe('cfilter.lua', function()
end
local toname = function(qflist)
- return funcs.map(qflist, 'v:val.text')
+ return fn.map(qflist, 'v:val.text')
end
test('filters with no matches', 'does not match', {})
@@ -83,7 +83,7 @@ describe('cfilter.lua', function()
{ filename = 'foo', lnum = 3, text = 'zed' },
})
- funcs.setreg('/', 'ba')
+ fn.setreg('/', 'ba')
filter('/')
eq({ 'bar', 'baz' }, toname(list.get()))
@@ -96,7 +96,7 @@ describe('cfilter.lua', function()
{ filename = 'foo', lnum = 3, text = 'zed' },
})
- funcs.setreg('/', 'ba')
+ fn.setreg('/', 'ba')
filter('/', true)
eq({ 'zed' }, toname(list.get()))
diff --git a/test/functional/plugin/editorconfig_spec.lua b/test/functional/plugin/editorconfig_spec.lua
index ac78003a8c..115c28fbf6 100644
--- a/test/functional/plugin/editorconfig_spec.lua
+++ b/test/functional/plugin/editorconfig_spec.lua
@@ -3,8 +3,8 @@ local clear = helpers.clear
local command = helpers.command
local eq = helpers.eq
local pathsep = helpers.get_pathsep()
-local funcs = helpers.funcs
-local meths = helpers.meths
+local fn = helpers.fn
+local api = helpers.api
local exec_lua = helpers.exec_lua
local testdir = 'Xtest-editorconfig'
@@ -13,7 +13,7 @@ local function test_case(name, expected)
local filename = testdir .. pathsep .. name
command('edit ' .. filename)
for opt, val in pairs(expected) do
- eq(val, meths.get_option_value(opt, {buf=0}), name)
+ eq(val, api.nvim_get_option_value(opt, { buf = 0 }), name)
end
end
@@ -195,15 +195,15 @@ But not this one
end)
it('can be disabled globally', function()
- meths.set_var('editorconfig', false)
- meths.set_option_value('shiftwidth', 42, {})
+ api.nvim_set_var('editorconfig', false)
+ api.nvim_set_option_value('shiftwidth', 42, {})
test_case('3_space.txt', { shiftwidth = 42 })
end)
it('can be disabled per-buffer', function()
- meths.set_option_value('shiftwidth', 42, {})
- local bufnr = funcs.bufadd(testdir .. pathsep .. '3_space.txt')
- meths.buf_set_var(bufnr, 'editorconfig', false)
+ api.nvim_set_option_value('shiftwidth', 42, {})
+ local bufnr = fn.bufadd(testdir .. pathsep .. '3_space.txt')
+ api.nvim_buf_set_var(bufnr, 'editorconfig', false)
test_case('3_space.txt', { shiftwidth = 42 })
test_case('4_space.py', { shiftwidth = 4 })
end)
diff --git a/test/functional/plugin/health_spec.lua b/test/functional/plugin/health_spec.lua
index 50b1d03f36..8564ec7c9b 100644
--- a/test/functional/plugin/health_spec.lua
+++ b/test/functional/plugin/health_spec.lua
@@ -5,12 +5,15 @@ local clear = helpers.clear
local curbuf_contents = helpers.curbuf_contents
local command = helpers.command
local eq, neq, matches = helpers.eq, helpers.neq, helpers.matches
-local getcompletion = helpers.funcs.getcompletion
+local getcompletion = helpers.fn.getcompletion
+local insert = helpers.insert
+local source = helpers.source
+local exec_lua = helpers.exec_lua
describe(':checkhealth', function()
- it("detects invalid $VIMRUNTIME", function()
+ it('detects invalid $VIMRUNTIME', function()
clear({
- env={ VIMRUNTIME='bogus', },
+ env = { VIMRUNTIME = 'bogus' },
})
local status, err = pcall(command, 'checkhealth')
eq(false, status)
@@ -23,32 +26,32 @@ describe(':checkhealth', function()
eq(false, status)
eq("Invalid 'runtimepath'", string.match(err, 'Invalid.*'))
end)
- it("detects invalid $VIM", function()
+ it('detects invalid $VIM', function()
clear()
-- Do this after startup, otherwise it just breaks $VIMRUNTIME.
command("let $VIM='zub'")
- command("checkhealth nvim")
+ command('checkhealth nvim')
matches('ERROR $VIM .* zub', curbuf_contents())
end)
it('completions can be listed via getcompletion()', function()
clear()
eq('nvim', getcompletion('nvim', 'checkhealth')[1])
- eq('provider', getcompletion('prov', 'checkhealth')[1])
+ eq('provider.clipboard', getcompletion('prov', 'checkhealth')[1])
eq('vim.lsp', getcompletion('vim.ls', 'checkhealth')[1])
- neq('vim', getcompletion('^vim', 'checkhealth')[1]) -- should not complete vim.health
+ neq('vim', getcompletion('^vim', 'checkhealth')[1]) -- should not complete vim.health
end)
end)
describe('health.vim', function()
before_each(function()
- clear{args={'-u', 'NORC'}}
+ clear { args = { '-u', 'NORC' } }
-- Provides healthcheck functions
- command("set runtimepath+=test/functional/fixtures")
+ command('set runtimepath+=test/functional/fixtures')
end)
- describe(":checkhealth", function()
- it("functions report_*() render correctly", function()
- command("checkhealth full_render")
+ describe(':checkhealth', function()
+ it('functions report_*() render correctly', function()
+ command('checkhealth full_render')
helpers.expect([[
==============================================================================
@@ -70,8 +73,8 @@ describe('health.vim', function()
]])
end)
- it("concatenates multiple reports", function()
- command("checkhealth success1 success2 test_plug")
+ it('concatenates multiple reports', function()
+ command('checkhealth success1 success2 test_plug')
helpers.expect([[
==============================================================================
@@ -100,8 +103,8 @@ describe('health.vim', function()
]])
end)
- it("lua plugins submodules", function()
- command("checkhealth test_plug.submodule")
+ it('lua plugins submodules', function()
+ command('checkhealth test_plug.submodule')
helpers.expect([[
==============================================================================
@@ -115,8 +118,8 @@ describe('health.vim', function()
]])
end)
- it("... including empty reports", function()
- command("checkhealth test_plug.submodule_empty")
+ it('... including empty reports', function()
+ command('checkhealth test_plug.submodule_empty')
helpers.expect([[
==============================================================================
@@ -126,7 +129,7 @@ describe('health.vim', function()
]])
end)
- it("highlights OK, ERROR", function()
+ it('highlights OK, ERROR', function()
local screen = Screen.new(50, 12)
screen:attach()
screen:set_default_attr_ids({
@@ -135,9 +138,10 @@ describe('health.vim', function()
Heading = { foreground = tonumber('0x6a0dad') },
Bar = { foreground = Screen.colors.LightGrey, background = Screen.colors.DarkGrey },
})
- command("checkhealth foo success1")
- command("set nofoldenable nowrap laststatus=0")
- screen:expect{grid=[[
+ command('checkhealth foo success1')
+ command('set nofoldenable nowrap laststatus=0')
+ screen:expect {
+ grid = [[
^ |
{Bar:──────────────────────────────────────────────────}|
{Heading:foo: } |
@@ -150,15 +154,17 @@ describe('health.vim', function()
{Heading:report 1} |
- {Ok:OK} everything is fine |
|
- ]]}
+ ]],
+ }
end)
- it("fold healthchecks", function()
+ it('fold healthchecks', function()
local screen = Screen.new(50, 7)
screen:attach()
- command("checkhealth foo success1")
- command("set nowrap laststatus=0")
- screen:expect{grid=[[
+ command('checkhealth foo success1')
+ command('set nowrap laststatus=0')
+ screen:expect {
+ grid = [[
^ |
──────────────────────────────────────────────────|
+WE 4 lines: foo: ·······························|
@@ -166,11 +172,12 @@ describe('health.vim', function()
+-- 8 lines: test_plug.success1: require("test_pl|
~ |
|
- ]]}
+ ]],
+ }
end)
- it("gracefully handles invalid healthcheck", function()
- command("checkhealth non_existent_healthcheck")
+ it('gracefully handles invalid healthcheck', function()
+ command('checkhealth non_existent_healthcheck')
-- luacheck: ignore 613
helpers.expect([[
@@ -181,9 +188,9 @@ describe('health.vim', function()
]])
end)
- it("does not use vim.health as a healtcheck", function()
+ it('does not use vim.health as a healtcheck', function()
-- vim.health is not a healthcheck
- command("checkhealth vim")
+ command('checkhealth vim')
helpers.expect([[
ERROR: No healthchecks found.]])
end)
@@ -200,3 +207,187 @@ describe(':checkhealth provider', function()
eq(nil, string.match(curbuf_contents(), 'WRONG!!!'))
end)
end)
+
+describe(':checkhealth window', function()
+ before_each(function()
+ clear { args = { '-u', 'NORC' } }
+ -- Provides healthcheck functions
+ command('set runtimepath+=test/functional/fixtures')
+ command('set nofoldenable nowrap laststatus=0')
+ end)
+
+ it('opens directly if no buffer created', function()
+ local screen = Screen.new(50, 12)
+ screen:attach({ ext_multigrid = true })
+ command('checkhealth success1')
+ screen:expect {
+ grid = [[
+ ## grid 1
+ [2:--------------------------------------------------]|*11
+ [3:--------------------------------------------------]|
+ ## grid 2
+ ^ |
+ ──────────────────────────────────────────────────|
+ ──────────────────────────── |
+ test_plug.success1: require("test_plug.success1. |
+ health").check() |
+ |
+ report 1 |
+ - OK everything is fine |
+ |
+ report 2 |
+ - OK nothing to see here |
+ ## grid 3
+ |
+ ]],
+ }
+ end)
+
+ local function test_health_vsplit(left, emptybuf, mods)
+ local screen = Screen.new(50, 20)
+ screen:attach({ ext_multigrid = true })
+ if not emptybuf then
+ insert('hello')
+ end
+ command(mods .. ' checkhealth success1')
+ screen:expect(
+ ([[
+ ## grid 1
+ %s
+ [3:--------------------------------------------------]|
+ ## grid 2
+ %s |
+ ~ |*18
+ ## grid 3
+ |
+ ## grid 4
+ ^ |
+ ─────────────────────────|*3
+ ─── |
+ test_plug.success1: |
+ require("test_plug. |
+ success1.health").check()|
+ |
+ report 1 |
+ - OK everything is fine |
+ |
+ report 2 |
+ - OK nothing to see here |
+ |
+ ~ |*4
+ ]]):format(
+ left and '[4:-------------------------]│[2:------------------------]|*19'
+ or '[2:------------------------]│[4:-------------------------]|*19',
+ emptybuf and ' ' or 'hello'
+ )
+ )
+ end
+
+ for _, mods in ipairs({ 'vertical', 'leftabove vertical', 'topleft vertical' }) do
+ it(('opens in left vsplit window with :%s and no buffer created'):format(mods), function()
+ test_health_vsplit(true, true, mods)
+ end)
+ it(('opens in left vsplit window with :%s and non-empty buffer'):format(mods), function()
+ test_health_vsplit(true, false, mods)
+ end)
+ end
+
+ for _, mods in ipairs({ 'rightbelow vertical', 'botright vertical' }) do
+ it(('opens in right vsplit window with :%s and no buffer created'):format(mods), function()
+ test_health_vsplit(false, true, mods)
+ end)
+ it(('opens in right vsplit window with :%s and non-empty buffer'):format(mods), function()
+ test_health_vsplit(false, false, mods)
+ end)
+ end
+
+ local function test_health_split(top, emptybuf, mods)
+ local screen = Screen.new(50, 25)
+ screen:attach({ ext_multigrid = true })
+ if not emptybuf then
+ insert('hello')
+ end
+ command(mods .. ' checkhealth success1')
+ screen:expect(
+ ([[
+ ## grid 1
+%s
+ [3:--------------------------------------------------]|
+ ## grid 2
+ %s |
+ ~ |*10
+ ## grid 3
+ |
+ ## grid 4
+ ^ |
+ ──────────────────────────────────────────────────|
+ ──────────────────────────── |
+ test_plug.success1: require("test_plug.success1. |
+ health").check() |
+ |
+ report 1 |
+ - OK everything is fine |
+ |
+ report 2 |
+ - OK nothing to see here |
+ |
+ ]]):format(
+ top
+ and [[
+ [4:--------------------------------------------------]|*12
+ health:// |
+ [2:--------------------------------------------------]|*11]]
+ or ([[
+ [2:--------------------------------------------------]|*11
+ [No Name] %s |
+ [4:--------------------------------------------------]|*12]]):format(
+ emptybuf and ' ' or '[+]'
+ ),
+ emptybuf and ' ' or 'hello'
+ )
+ )
+ end
+
+ for _, mods in ipairs({ 'horizontal', 'leftabove', 'topleft' }) do
+ it(('opens in top split window with :%s and no buffer created'):format(mods), function()
+ test_health_split(true, true, mods)
+ end)
+ it(('opens in top split window with :%s and non-empty buffer'):format(mods), function()
+ test_health_split(true, false, mods)
+ end)
+ end
+
+ for _, mods in ipairs({ 'rightbelow', 'botright' }) do
+ it(('opens in bottom split window with :%s and no buffer created'):format(mods), function()
+ test_health_split(false, true, mods)
+ end)
+ it(('opens in bottom split window with :%s and non-empty buffer'):format(mods), function()
+ test_health_split(false, false, mods)
+ end)
+ end
+
+ it('opens in tab', function()
+ -- create an empty buffer called "my_buff"
+ exec_lua 'vim.api.nvim_create_buf(false, true)'
+ command('file my_buff')
+ command('checkhealth success1')
+ -- define a function that collects all buffers in each tab
+ -- returns a dictionary like {tab1 = ["buf1", "buf2"], tab2 = ["buf3"]}
+ source([[
+ function CollectBuffersPerTab()
+ let buffs = {}
+ for i in range(tabpagenr('$'))
+ let key = 'tab' . (i + 1)
+ let value = []
+ for j in tabpagebuflist(i + 1)
+ call add(value, bufname(j))
+ endfor
+ let buffs[key] = value
+ endfor
+ return buffs
+ endfunction
+ ]])
+ local buffers_per_tab = exec_lua('return vim.fn.CollectBuffersPerTab()')
+ eq(buffers_per_tab, { tab1 = { 'my_buff' }, tab2 = { 'health://' } })
+ end)
+end)
diff --git a/test/functional/plugin/lsp/codelens_spec.lua b/test/functional/plugin/lsp/codelens_spec.lua
index 3d7a15a191..29daf7a066 100644
--- a/test/functional/plugin/lsp/codelens_spec.lua
+++ b/test/functional/plugin/lsp/codelens_spec.lua
@@ -11,17 +11,21 @@ describe('vim.lsp.codelens', function()
after_each(helpers.clear)
it('on_codelens_stores_and_displays_lenses', function()
- local fake_uri = "file:///fake/uri"
- local bufnr = exec_lua([[
+ local fake_uri = 'file:///fake/uri'
+ local bufnr = exec_lua(
+ [[
fake_uri = ...
local bufnr = vim.uri_to_bufnr(fake_uri)
local lines = {'So', 'many', 'lines'}
vim.fn.bufload(bufnr)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
return bufnr
- ]], fake_uri)
+ ]],
+ fake_uri
+ )
- exec_lua([[
+ exec_lua(
+ [[
local bufnr = ...
local lenses = {
{
@@ -33,14 +37,16 @@ describe('vim.lsp.codelens', function()
},
}
vim.lsp.codelens.on_codelens(nil, lenses, {method='textDocument/codeLens', client_id=1, bufnr=bufnr})
- ]], bufnr)
+ ]],
+ bufnr
+ )
local stored_lenses = exec_lua('return vim.lsp.codelens.get(...)', bufnr)
local expected = {
{
range = {
start = { line = 0, character = 0 },
- ['end'] = { line = 0, character = 0 }
+ ['end'] = { line = 0, character = 0 },
},
command = {
title = 'Lens1',
@@ -50,28 +56,35 @@ describe('vim.lsp.codelens', function()
}
eq(expected, stored_lenses)
- local virtual_text_chunks = exec_lua([[
+ local virtual_text_chunks = exec_lua(
+ [[
local bufnr = ...
local ns = vim.lsp.codelens.__namespaces[1]
local extmarks = vim.api.nvim_buf_get_extmarks(bufnr, ns, 0, -1, {})
return vim.api.nvim_buf_get_extmark_by_id(bufnr, ns, extmarks[1][1], { details = true })[3].virt_text
- ]], bufnr)
+ ]],
+ bufnr
+ )
- eq({[1] = {'Lens1', 'LspCodeLens'}}, virtual_text_chunks)
+ eq({ [1] = { 'Lens1', 'LspCodeLens' } }, virtual_text_chunks)
end)
it('can clear all lens', function()
- local fake_uri = "file:///fake/uri"
- local bufnr = exec_lua([[
+ local fake_uri = 'file:///fake/uri'
+ local bufnr = exec_lua(
+ [[
fake_uri = ...
local bufnr = vim.uri_to_bufnr(fake_uri)
local lines = {'So', 'many', 'lines'}
vim.fn.bufload(bufnr)
vim.api.nvim_buf_set_lines(bufnr, 0, -1, false, lines)
return bufnr
- ]], fake_uri)
+ ]],
+ fake_uri
+ )
- exec_lua([[
+ exec_lua(
+ [[
local bufnr = ...
local lenses = {
{
@@ -83,7 +96,9 @@ describe('vim.lsp.codelens', function()
},
}
vim.lsp.codelens.on_codelens(nil, lenses, {method='textDocument/codeLens', client_id=1, bufnr=bufnr})
- ]], bufnr)
+ ]],
+ bufnr
+ )
local stored_lenses = exec_lua('return vim.lsp.codelens.get(...)', bufnr)
eq(1, #stored_lenses)
diff --git a/test/functional/plugin/lsp/completion_spec.lua b/test/functional/plugin/lsp/completion_spec.lua
index 9354654afe..655eb76be6 100644
--- a/test/functional/plugin/lsp/completion_spec.lua
+++ b/test/functional/plugin/lsp/completion_spec.lua
@@ -3,7 +3,6 @@ local helpers = require('test.functional.helpers')(after_each)
local eq = helpers.eq
local exec_lua = helpers.exec_lua
-
--- Convert completion results.
---
---@param line string line contents. Mark cursor position with `|`
@@ -13,9 +12,10 @@ local exec_lua = helpers.exec_lua
local function complete(line, candidates, lnum)
lnum = lnum or 0
-- nvim_win_get_cursor returns 0 based column, line:find returns 1 based
- local cursor_col = line:find("|") - 1
- line = line:gsub("|", "")
- return exec_lua([[
+ local cursor_col = line:find('|') - 1
+ line = line:gsub('|', '')
+ return exec_lua(
+ [[
local line, cursor_col, lnum, result = ...
local line_to_cursor = line:sub(1, cursor_col)
local client_start_boundary = vim.fn.match(line_to_cursor, '\\k*$')
@@ -32,18 +32,22 @@ local function complete(line, candidates, lnum)
items = items,
server_start_boundary = server_start_boundary
}
- ]], line, cursor_col, lnum, candidates)
+ ]],
+ line,
+ cursor_col,
+ lnum,
+ candidates
+ )
end
-
-describe("vim.lsp._completion", function()
+describe('vim.lsp._completion', function()
before_each(helpers.clear)
-- https://microsoft.github.io/language-server-protocol/specifications/specification-current/#textDocument_completion
it('prefers textEdit over label as word', function()
local range0 = {
start = { line = 0, character = 0 },
- ["end"] = { line = 0, character = 0 },
+ ['end'] = { line = 0, character = 0 },
}
local completion_list = {
-- resolves into label
@@ -57,7 +61,12 @@ describe("vim.lsp._completion", function()
{ label = 'foocar', sortText = 'c', insertText = 'foobar' },
{ label = 'foocar', sortText = 'd', insertText = 'foobar' },
-- resolves into textEdit.newText
- { label = 'foocar', sortText = 'e', insertText = 'foodar', textEdit = { newText = 'foobar', range = range0 } },
+ {
+ label = 'foocar',
+ sortText = 'e',
+ insertText = 'foodar',
+ textEdit = { newText = 'foobar', range = range0 },
+ },
{ label = 'foocar', sortText = 'f', textEdit = { newText = 'foobar', range = range0 } },
-- real-world snippet text
{
@@ -65,7 +74,10 @@ describe("vim.lsp._completion", function()
sortText = 'g',
insertText = 'foodar',
insertTextFormat = 2,
- textEdit = { newText = 'foobar(${1:place holder}, ${2:more ...holder{\\}})', range = range0 },
+ textEdit = {
+ newText = 'foobar(${1:place holder}, ${2:more ...holder{\\}})',
+ range = range0,
+ },
},
{
label = 'foocar',
@@ -81,7 +93,7 @@ describe("vim.lsp._completion", function()
insertTextFormat = 2,
},
-- braced tabstop
- { label = 'foocar', sortText = 'j', insertText = 'foodar()${0}', insertTextFormat = 2},
+ { label = 'foocar', sortText = 'j', insertText = 'foodar()${0}', insertTextFormat = 2 },
-- plain text
{
label = 'foocar',
@@ -140,32 +152,32 @@ describe("vim.lsp._completion", function()
result = vim.tbl_map(function(x)
return {
abbr = x.abbr,
- word = x.word
+ word = x.word,
}
end, result.items)
eq(expected, result)
end)
- it("uses correct start boundary", function()
+ it('uses correct start boundary', function()
local completion_list = {
isIncomplete = false,
items = {
{
- filterText = "this_thread",
- insertText = "this_thread",
+ filterText = 'this_thread',
+ insertText = 'this_thread',
insertTextFormat = 1,
kind = 9,
- label = " this_thread",
+ label = ' this_thread',
score = 1.3205767869949,
- sortText = "4056f757this_thread",
+ sortText = '4056f757this_thread',
textEdit = {
- newText = "this_thread",
+ newText = 'this_thread',
range = {
start = { line = 0, character = 7 },
- ["end"] = { line = 0, character = 11 },
+ ['end'] = { line = 0, character = 11 },
},
- }
+ },
},
- }
+ },
}
local expected = {
abbr = ' this_thread',
@@ -176,50 +188,50 @@ describe("vim.lsp._completion", function()
menu = '',
word = 'this_thread',
}
- local result = complete(" std::this|", completion_list)
+ local result = complete(' std::this|', completion_list)
eq(7, result.server_start_boundary)
local item = result.items[1]
item.user_data = nil
eq(expected, item)
end)
- it("should search from start boundary to cursor position", function()
+ it('should search from start boundary to cursor position', function()
local completion_list = {
isIncomplete = false,
items = {
{
- filterText = "this_thread",
- insertText = "this_thread",
+ filterText = 'this_thread',
+ insertText = 'this_thread',
insertTextFormat = 1,
kind = 9,
- label = " this_thread",
+ label = ' this_thread',
score = 1.3205767869949,
- sortText = "4056f757this_thread",
+ sortText = '4056f757this_thread',
textEdit = {
- newText = "this_thread",
+ newText = 'this_thread',
range = {
start = { line = 0, character = 7 },
- ["end"] = { line = 0, character = 11 },
+ ['end'] = { line = 0, character = 11 },
},
- }
+ },
},
{
- filterText = "notthis_thread",
- insertText = "notthis_thread",
+ filterText = 'notthis_thread',
+ insertText = 'notthis_thread',
insertTextFormat = 1,
kind = 9,
- label = " notthis_thread",
+ label = ' notthis_thread',
score = 1.3205767869949,
- sortText = "4056f757this_thread",
+ sortText = '4056f757this_thread',
textEdit = {
- newText = "notthis_thread",
+ newText = 'notthis_thread',
range = {
start = { line = 0, character = 7 },
- ["end"] = { line = 0, character = 11 },
+ ['end'] = { line = 0, character = 11 },
},
- }
+ },
},
- }
+ },
}
local expected = {
abbr = ' this_thread',
@@ -230,10 +242,38 @@ describe("vim.lsp._completion", function()
menu = '',
word = 'this_thread',
}
- local result = complete(" std::this|is", completion_list)
+ local result = complete(' std::this|is', completion_list)
eq(1, #result.items)
local item = result.items[1]
item.user_data = nil
eq(expected, item)
end)
+
+ it('uses defaults from itemDefaults', function()
+ --- @type lsp.CompletionList
+ local completion_list = {
+ isIncomplete = false,
+ itemDefaults = {
+ editRange = {
+ start = { line = 1, character = 1 },
+ ['end'] = { line = 1, character = 4 },
+ },
+ insertTextFormat = 2,
+ data = 'foobar',
+ },
+ items = {
+ {
+ label = 'hello',
+ data = 'item-property-has-priority',
+ textEditText = 'hello',
+ },
+ },
+ }
+ local result = complete('|', completion_list)
+ eq(1, #result.items)
+ local item = result.items[1].user_data.nvim.lsp.completion_item --- @type lsp.CompletionItem
+ eq(2, item.insertTextFormat)
+ eq('item-property-has-priority', item.data)
+ eq({ line = 1, character = 1 }, item.textEdit.range.start)