aboutsummaryrefslogtreecommitdiff
path: root/test/functional/editor/completion_spec.lua
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-11-19 22:57:13 +0000
committerJosh Rahm <joshuarahm@gmail.com>2024-11-19 22:57:13 +0000
commit9be89f131f87608f224f0ee06d199fcd09d32176 (patch)
tree11022dcfa9e08cb4ac5581b16734196128688d48 /test/functional/editor/completion_spec.lua
parentff7ed8f586589d620a806c3758fac4a47a8e7e15 (diff)
parent88085c2e80a7e3ac29aabb6b5420377eed99b8b6 (diff)
downloadrneovim-9be89f131f87608f224f0ee06d199fcd09d32176.tar.gz
rneovim-9be89f131f87608f224f0ee06d199fcd09d32176.tar.bz2
rneovim-9be89f131f87608f224f0ee06d199fcd09d32176.zip
Merge remote-tracking branch 'upstream/master' into mix_20240309
Diffstat (limited to 'test/functional/editor/completion_spec.lua')
-rw-r--r--test/functional/editor/completion_spec.lua718
1 files changed, 415 insertions, 303 deletions
diff --git a/test/functional/editor/completion_spec.lua b/test/functional/editor/completion_spec.lua
index 62bb7e19f3..d543de4acd 100644
--- a/test/functional/editor/completion_spec.lua
+++ b/test/functional/editor/completion_spec.lua
@@ -4,7 +4,7 @@ local Screen = require('test.functional.ui.screen')
local assert_alive = n.assert_alive
local clear, feed = n.clear, n.feed
-local eval, eq, neq = n.eval, t.eq, t.neq
+local eval, eq, neq, ok = n.eval, t.eq, t.neq, t.ok
local feed_command, source, expect = n.feed_command, n.source, n.expect
local fn = n.fn
local command = n.command
@@ -18,19 +18,10 @@ describe('completion', function()
clear()
screen = Screen.new(60, 8)
screen:attach()
- screen:set_default_attr_ids({
- [0] = { bold = true, foreground = Screen.colors.Blue },
- [1] = { background = Screen.colors.LightMagenta },
- [2] = { background = Screen.colors.Grey },
- [3] = { bold = true },
- [4] = { bold = true, foreground = Screen.colors.SeaGreen },
- [5] = { foreground = Screen.colors.Red },
- [6] = { background = Screen.colors.Black },
- [7] = { foreground = Screen.colors.White, background = Screen.colors.Red },
- [8] = { reverse = true },
- [9] = { bold = true, reverse = true },
- [10] = { foreground = Screen.colors.Grey0, background = Screen.colors.Yellow },
- })
+ screen:add_extra_attr_ids {
+ [100] = { foreground = Screen.colors.Gray0, background = Screen.colors.Yellow },
+ [101] = { background = Screen.colors.Gray0 },
+ }
end)
describe('v:completed_item', function()
@@ -42,15 +33,15 @@ describe('completion', function()
screen:expect([[
foo |
foo^ |
- {0:~ }|*5
- {3:-- Keyword Local completion (^N^P) The only match} |
+ {1:~ }|*5
+ {5:-- Keyword Local completion (^N^P) The only match} |
]])
feed('<C-e>')
screen:expect([[
foo |
^ |
- {0:~ }|*5
- {3:-- INSERT --} |
+ {1:~ }|*5
+ {5:-- INSERT --} |
]])
feed('<ESC>')
eq({}, eval('v:completed_item'))
@@ -104,10 +95,10 @@ describe('completion', function()
eq('foo', eval('getline(1)'))
screen:expect([[
foo^ |
- {2:bar foobaz baz }{0: }|
- {1:abbr kind menu }{0: }|
- {0:~ }|*4
- {3:-- Omni completion (^O^N^P) }{4:match 1 of 2} |
+ {12:bar foobaz baz }{1: }|
+ {4:abbr kind menu }{1: }|
+ {1:~ }|*4
+ {5:-- Omni completion (^O^N^P) }{6:match 1 of 2} |
]])
eq({
word = 'foo',
@@ -136,24 +127,24 @@ describe('completion', function()
screen:expect([[
foo |
^ |
- {0:~ }|*5
- {3:-- INSERT --} |
+ {1:~ }|*5
+ {5:-- INSERT --} |
]])
feed('<C-x>')
-- the ^X prompt, only test this once
screen:expect([[
foo |
^ |
- {0:~ }|*5
- {3:-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)} |
+ {1:~ }|*5
+ {5:-- ^X mode (^]^D^E^F^I^K^L^N^O^Ps^U^V^Y)} |
]])
feed('<C-n>')
screen:expect([[
foo |
foo^ |
- {2:foo }{0: }|
- {0:~ }|*4
- {3:-- Keyword Local completion (^N^P) The only match} |
+ {12:foo }{1: }|
+ {1:~ }|*4
+ {5:-- Keyword Local completion (^N^P) The only match} |
]])
feed('bar<ESC>')
eq('foobar', eval('getline(2)'))
@@ -162,9 +153,9 @@ describe('completion', function()
foo |
foobar |
foo^ |
- {2:foo }{0: }|
- {0:~ }|*3
- {3:-- INSERT --} |
+ {12:foo }{1: }|
+ {1:~ }|*3
+ {5:-- INSERT --} |
]])
eq('foo', eval('getline(3)'))
end)
@@ -174,16 +165,16 @@ describe('completion', function()
screen:expect([[
foo |
^ |
- {2:foo }{0: }|
- {0:~ }|*4
- {3:-- Keyword Local completion (^N^P) The only match} |
+ {12:foo }{1: }|
+ {1:~ }|*4
+ {5:-- Keyword Local completion (^N^P) The only match} |
]])
feed('<C-y>')
screen:expect([[
foo |
foo^ |
- {0:~ }|*5
- {3:-- INSERT --} |
+ {1:~ }|*5
+ {5:-- INSERT --} |
]])
feed('<ESC>')
eq('foo', eval('getline(2)'))
@@ -191,9 +182,9 @@ describe('completion', function()
screen:expect([[
foo |*2
^ |
- {2:foo }{0: }|
- {0:~ }|*3
- {3:-- INSERT --} |
+ {12:foo }{1: }|
+ {1:~ }|*3
+ {5:-- INSERT --} |
]])
feed('<C-y><ESC>')
eq('foo', eval('getline(3)'))
@@ -204,16 +195,16 @@ describe('completion', function()
screen:expect([[
foo |
^ |
- {1:foo }{0: }|
- {0:~ }|*4
- {3:-- Keyword Local completion (^N^P) }{5:Back at original} |
+ {4:foo }{1: }|
+ {1:~ }|*4
+ {5:-- Keyword Local completion (^N^P) }{19:Back at original} |
]])
feed('b')
screen:expect([[
foo |
b^ |
- {0:~ }|*5
- {3:-- Keyword Local completion (^N^P) }{5:Back at original} |
+ {1:~ }|*5
+ {5:-- Keyword Local completion (^N^P) }{19:Back at original} |
]])
feed('ar<ESC>')
eq('bar', eval('getline(2)'))
@@ -222,9 +213,9 @@ describe('completion', function()
foo |
bar |
^ |
- {1:foo }{0: }|
- {0:~ }|*3
- {3:-- INSERT --} |
+ {4:foo }{1: }|
+ {1:~ }|*3
+ {5:-- INSERT --} |
]])
feed('bar<ESC>')
eq('bar', eval('getline(3)'))
@@ -235,15 +226,15 @@ describe('completion', function()
screen:expect([[
foo |
^ |
- {1:foo }{0: }|
- {0:~ }|*4
- {3:-- Keyword Local completion (^N^P) }{5:Back at original} |
+ {4:foo }{1: }|
+ {1:~ }|*4
+ {5:-- Keyword Local completion (^N^P) }{19:Back at original} |
]])
feed('<ESC>')
screen:expect([[
foo |
^ |
- {0:~ }|*5
+ {1:~ }|*5
|
]])
eq('', eval('getline(2)'))
@@ -252,16 +243,16 @@ describe('completion', function()
foo |
|
^ |
- {1:foo }{0: }|
- {0:~ }|*3
- {3:-- INSERT --} |
+ {4:foo }{1: }|
+ {1:~ }|*3
+ {5:-- INSERT --} |
]])
feed('<ESC>')
screen:expect([[
foo |
|
^ |
- {0:~ }|*4
+ {1:~ }|*4
|
]])
eq('', eval('getline(3)'))
@@ -336,7 +327,7 @@ describe('completion', function()
end
end)
- describe('refresh:always', function()
+ describe('with refresh:always and noselect', function()
before_each(function()
source([[
function! TestCompletion(findstart, base) abort
@@ -367,44 +358,44 @@ describe('completion', function()
feed('i<C-x><C-u>')
screen:expect([[
^ |
- {1:January }{6: }{0: }|
- {1:February }{6: }{0: }|
- {1:March }{6: }{0: }|
- {1:April }{2: }{0: }|
- {1:May }{2: }{0: }|
- {1:June }{2: }{0: }|
- {3:-- User defined completion (^U^N^P) }{5:Back at original} |
+ {4:January }{101: }{1: }|
+ {4:February }{101: }{1: }|
+ {4:March }{101: }{1: }|
+ {4:April }{12: }{1: }|
+ {4:May }{12: }{1: }|
+ {4:June }{12: }{1: }|
+ {5:-- User defined completion (^U^N^P) }{19:Back at original} |
]])
feed('u')
screen:expect([[
u^ |
- {1:January }{0: }|
- {1:February }{0: }|
- {1:June }{0: }|
- {1:July }{0: }|
- {1:August }{0: }|
- {0:~ }|
- {3:-- User defined completion (^U^N^P) }{5:Back at original} |
+ {4:January }{1: }|
+ {4:February }{1: }|
+ {4:June }{1: }|
+ {4:July }{1: }|
+ {4:August }{1: }|
+ {1:~ }|
+ {5:-- User defined completion (^U^N^P) }{19:Back at original} |
]])
feed('g')
screen:expect([[
ug^ |
- {1:August }{0: }|
- {0:~ }|*5
- {3:-- User defined completion (^U^N^P) }{5:Back at original} |
+ {4:August }{1: }|
+ {1:~ }|*5
+ {5:-- User defined completion (^U^N^P) }{19:Back at original} |
]])
feed('<Down>')
screen:expect([[
ug^ |
- {2:August }{0: }|
- {0:~ }|*5
- {3:-- User defined completion (^U^N^P) The only match} |
+ {12:August }{1: }|
+ {1:~ }|*5
+ {5:-- User defined completion (^U^N^P) The only match} |
]])
feed('<C-y>')
screen:expect([[
August^ |
- {0:~ }|*6
- {3:-- INSERT --} |
+ {1:~ }|*6
+ {5:-- INSERT --} |
]])
expect('August')
end)
@@ -414,45 +405,45 @@ describe('completion', function()
screen:expect([[
|
Ja^ |
- {1:January }{0: }|
- {0:~ }|*4
- {3:-- User defined completion (^U^N^P) }{5:Back at original} |
+ {4:January }{1: }|
+ {1:~ }|*4
+ {5:-- User defined completion (^U^N^P) }{19:Back at original} |
]])
feed('<BS>')
screen:expect([[
|
J^ |
- {1:January }{0: }|
- {1:June }{0: }|
- {1:July }{0: }|
- {0:~ }|*2
- {3:-- User defined completion (^U^N^P) }{5:Back at original} |
+ {4:January }{1: }|
+ {4:June }{1: }|
+ {4:July }{1: }|
+ {1:~ }|*2
+ {5:-- User defined completion (^U^N^P) }{19:Back at original} |
]])
feed('<C-n>')
screen:expect([[
|
January^ |
- {2:January }{0: }|
- {1:June }{0: }|
- {1:July }{0: }|
- {0:~ }|*2
- {3:-- User defined completion (^U^N^P) }{4:match 1 of 3} |
+ {12:January }{1: }|
+ {4:June }{1: }|
+ {4:July }{1: }|
+ {1:~ }|*2
+ {5:-- User defined completion (^U^N^P) }{6:match 1 of 3} |
]])
feed('<C-n>')
screen:expect([[
|
June^ |
- {1:January }{0: }|
- {2:June }{0: }|
- {1:July }{0: }|
- {0:~ }|*2
- {3:-- User defined completion (^U^N^P) }{4:match 2 of 3} |
+ {4:January }{1: }|
+ {12:June }{1: }|
+ {4:July }{1: }|
+ {1:~ }|*2
+ {5:-- User defined completion (^U^N^P) }{6:match 2 of 3} |
]])
feed('<Esc>')
screen:expect([[
|
Jun^e |
- {0:~ }|*5
+ {1:~ }|*5
|
]])
feed('.')
@@ -460,7 +451,7 @@ describe('completion', function()
|
June |
Jun^e |
- {0:~ }|*4
+ {1:~ }|*4
|
]])
expect([[
@@ -468,6 +459,67 @@ describe('completion', function()
June
June]])
end)
+
+ it('Enter does not select original text', function()
+ feed('iJ<C-x><C-u>')
+ poke_eventloop()
+ feed('u')
+ poke_eventloop()
+ feed('<CR>')
+ expect([[
+ Ju
+ ]])
+ feed('J<C-x><C-u>')
+ poke_eventloop()
+ feed('<CR>')
+ expect([[
+ Ju
+ J
+ ]])
+ end)
+ end)
+
+ describe('with noselect but not refresh:always', function()
+ before_each(function()
+ source([[
+ function! TestCompletion(findstart, base) abort
+ if a:findstart
+ let line = getline('.')
+ let start = col('.') - 1
+ while start > 0 && line[start - 1] =~ '\a'
+ let start -= 1
+ endwhile
+ return start
+ else
+ let ret = []
+ for m in split("January February March April May June July August September October November December")
+ if m =~ a:base " match by regex
+ call add(ret, m)
+ endif
+ endfor
+ return {'words':ret}
+ endif
+ endfunction
+
+ set completeopt=menuone,noselect
+ set completefunc=TestCompletion
+ ]])
+ end)
+
+ it('Enter selects original text after adding leader', function()
+ feed('iJ<C-x><C-u>')
+ poke_eventloop()
+ feed('u')
+ poke_eventloop()
+ feed('<CR>')
+ expect('Ju')
+ feed('<Esc>')
+ poke_eventloop()
+ -- The behavior should be the same when completion has been interrupted,
+ -- which can happen interactively if the completion function is slow.
+ feed('SJ<C-x><C-u>u<CR>')
+ expect('Ju')
+ end)
end)
describe('with a lot of items', function()
@@ -485,46 +537,46 @@ describe('completion', function()
feed('i<C-r>=TestComplete()<CR>')
screen:expect([[
^ |
- {1:0 }{6: }{0: }|
- {1:1 }{2: }{0: }|
- {1:2 }{2: }{0: }|
- {1:3 }{2: }{0: }|
- {1:4 }{2: }{0: }|
- {1:5 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:0 }{101: }{1: }|
+ {4:1 }{12: }{1: }|
+ {4:2 }{12: }{1: }|
+ {4:3 }{12: }{1: }|
+ {4:4 }{12: }{1: }|
+ {4:5 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('7')
screen:expect([[
7^ |
- {1:7 }{6: }{0: }|
- {1:70 }{6: }{0: }|
- {1:71 }{6: }{0: }|
- {1:72 }{2: }{0: }|
- {1:73 }{2: }{0: }|
- {1:74 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:7 }{101: }{1: }|
+ {4:70 }{101: }{1: }|
+ {4:71 }{101: }{1: }|
+ {4:72 }{12: }{1: }|
+ {4:73 }{12: }{1: }|
+ {4:74 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<c-n>')
screen:expect([[
7^ |
- {2:7 }{6: }{0: }|
- {1:70 }{6: }{0: }|
- {1:71 }{6: }{0: }|
- {1:72 }{2: }{0: }|
- {1:73 }{2: }{0: }|
- {1:74 }{2: }{0: }|
- {3:-- INSERT --} |
+ {12:7 }{101: }{1: }|
+ {4:70 }{101: }{1: }|
+ {4:71 }{101: }{1: }|
+ {4:72 }{12: }{1: }|
+ {4:73 }{12: }{1: }|
+ {4:74 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<c-n>')
screen:expect([[
70^ |
- {1:7 }{6: }{0: }|
- {2:70 }{6: }{0: }|
- {1:71 }{6: }{0: }|
- {1:72 }{2: }{0: }|
- {1:73 }{2: }{0: }|
- {1:74 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:7 }{101: }{1: }|
+ {12:70 }{101: }{1: }|
+ {4:71 }{101: }{1: }|
+ {4:72 }{12: }{1: }|
+ {4:73 }{12: }{1: }|
+ {4:74 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
end)
@@ -532,107 +584,107 @@ describe('completion', function()
feed('i<C-r>=TestComplete()<CR>')
screen:expect([[
^ |
- {1:0 }{6: }{0: }|
- {1:1 }{2: }{0: }|
- {1:2 }{2: }{0: }|
- {1:3 }{2: }{0: }|
- {1:4 }{2: }{0: }|
- {1:5 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:0 }{101: }{1: }|
+ {4:1 }{12: }{1: }|
+ {4:2 }{12: }{1: }|
+ {4:3 }{12: }{1: }|
+ {4:4 }{12: }{1: }|
+ {4:5 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageDown>')
screen:expect([[
^ |
- {1:0 }{6: }{0: }|
- {1:1 }{2: }{0: }|
- {1:2 }{2: }{0: }|
- {2:3 }{0: }|
- {1:4 }{2: }{0: }|
- {1:5 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:0 }{101: }{1: }|
+ {4:1 }{12: }{1: }|
+ {4:2 }{12: }{1: }|
+ {12:3 }{1: }|
+ {4:4 }{12: }{1: }|
+ {4:5 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageDown>')
screen:expect([[
^ |
- {1:5 }{6: }{0: }|
- {1:6 }{2: }{0: }|
- {2:7 }{0: }|
- {1:8 }{2: }{0: }|
- {1:9 }{2: }{0: }|
- {1:10 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:5 }{101: }{1: }|
+ {4:6 }{12: }{1: }|
+ {12:7 }{1: }|
+ {4:8 }{12: }{1: }|
+ {4:9 }{12: }{1: }|
+ {4:10 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<Down>')
screen:expect([[
^ |
- {1:5 }{6: }{0: }|
- {1:6 }{2: }{0: }|
- {1:7 }{2: }{0: }|
- {2:8 }{0: }|
- {1:9 }{2: }{0: }|
- {1:10 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:5 }{101: }{1: }|
+ {4:6 }{12: }{1: }|
+ {4:7 }{12: }{1: }|
+ {12:8 }{1: }|
+ {4:9 }{12: }{1: }|
+ {4:10 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageUp>')
screen:expect([[
^ |
- {1:2 }{6: }{0: }|
- {1:3 }{2: }{0: }|
- {2:4 }{0: }|
- {1:5 }{2: }{0: }|
- {1:6 }{2: }{0: }|
- {1:7 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:2 }{101: }{1: }|
+ {4:3 }{12: }{1: }|
+ {12:4 }{1: }|
+ {4:5 }{12: }{1: }|
+ {4:6 }{12: }{1: }|
+ {4:7 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageUp>') -- stop on first item
screen:expect([[
^ |
- {2:0 }{6: }{0: }|
- {1:1 }{2: }{0: }|
- {1:2 }{2: }{0: }|
- {1:3 }{2: }{0: }|
- {1:4 }{2: }{0: }|
- {1:5 }{2: }{0: }|
- {3:-- INSERT --} |
+ {12:0 }{101: }{1: }|
+ {4:1 }{12: }{1: }|
+ {4:2 }{12: }{1: }|
+ {4:3 }{12: }{1: }|
+ {4:4 }{12: }{1: }|
+ {4:5 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageUp>') -- when on first item, unselect
screen:expect([[
^ |
- {1:0 }{6: }{0: }|
- {1:1 }{2: }{0: }|
- {1:2 }{2: }{0: }|
- {1:3 }{2: }{0: }|
- {1:4 }{2: }{0: }|
- {1:5 }{2: }{0: }|
- {3:-- INSERT --} |
+ {4:0 }{101: }{1: }|
+ {4:1 }{12: }{1: }|
+ {4:2 }{12: }{1: }|
+ {4:3 }{12: }{1: }|
+ {4:4 }{12: }{1: }|
+ {4:5 }{12: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageUp>') -- when unselected, select last item
screen:expect([[
^ |
- {1:95 }{2: }{0: }|
- {1:96 }{2: }{0: }|
- {1:97 }{2: }{0: }|
- {1:98 }{2: }{0: }|
- {1:99 }{2: }{0: }|
- {2:100 }{6: }{0: }|
- {3:-- INSERT --} |
+ {4:95 }{12: }{1: }|
+ {4:96 }{12: }{1: }|
+ {4:97 }{12: }{1: }|
+ {4:98 }{12: }{1: }|
+ {4:99 }{12: }{1: }|
+ {12:100 }{101: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<PageUp>')
screen:expect([[
^ |
- {1:94 }{2: }{0: }|
- {1:95 }{2: }{0: }|
- {2:96 }{0: }|
- {1:97 }{2: }{0: }|
- {1:98 }{2: }{0: }|
- {1:99 }{6: }{0: }|
- {3:-- INSERT --} |
+ {4:94 }{12: }{1: }|
+ {4:95 }{12: }{1: }|
+ {12:96 }{1: }|
+ {4:97 }{12: }{1: }|
+ {4:98 }{12: }{1: }|
+ {4:99 }{101: }{1: }|
+ {5:-- INSERT --} |
]])
feed('<cr>')
screen:expect([[
96^ |
- {0:~ }|*6
- {3:-- INSERT --} |
+ {1:~ }|*6
+ {5:-- INSERT --} |