local t = require('test.testutil') local n = require('test.functional.testnvim')() local Screen = require('test.functional.ui.screen') local os = require('os') local describe, it, before_each = t.describe, t.it, t.before_each local after_each, finally = t.after_each, t.finally local clear, command, api, fn = n.clear, n.command, n.api, n.fn local eq, pcall_err, write_file = t.eq, t.pcall_err, t.write_file local exec, feed = n.exec, n.feed --- Joins lines "1".."count", with `overrides` (1-based row → text) substituted. --- @param count integer --- @param overrides table local function numbered_lines(count, overrides) local lines = {} --- @type string[] for i = 1, count do lines[i] = overrides[i] or tostring(i) end return table.concat(lines, '\n') end describe("'previewpopup'", function() before_each(function() clear() end) local function with_ext_multigrid(multigrid) local screen ---@type test.functional.ui.screen before_each(function() screen = Screen.new(40, 7, { ext_multigrid = multigrid }) screen:add_extra_attr_ids({ [100] = { foreground = Screen.colors.Magenta1, background = Screen.colors.Plum1, bold = true, }, }) end) it('validation', function() local err = pcall_err(n.exec_capture, 'set previewpopup=height:yes') eq( "nvim_exec2(), line 1: Vim(set):E474: 'height' requires a number: previewpopup=height:yes", err ) err = pcall_err(n.exec_capture, 'set previewpopup=width:yes') eq( "nvim_exec2(), line 1: Vim(set):E474: 'width' requires a number: previewpopup=width:yes", err ) err = pcall_err(n.exec_capture, 'set previewpopup=width:20,height;10') eq( "nvim_exec2(), line 1: Vim(set):E474: Unknown item 'height;10': previewpopup=width:20,height;10", err ) err = pcall_err(n.exec_capture, 'set previewpopup=border:fancy') eq( 'nvim_exec2(), line 1: Vim(set):E474: ' .. "'border' must be one of: double, single, shadow, rounded, solid, bold, none: " .. 'previewpopup=border:fancy', err ) -- height/width must be >= 1 (semantic check, not the schema). err = pcall_err(n.exec_capture, 'set previewpopup=height:0') eq('nvim_exec2(), line 1: Vim(set):E474: Invalid argument: previewpopup=height:0', err) end) -- oldtest: Test_previewpopup it('with tags and search', function() finally(function() os.remove('Xtags') os.remove('Xtagfile') os.remove('Xheader.h') end) screen:try_resize(40, 20) write_file( 'Xtags', t.dedent([[ !_TAG_FILE_ENCODING utf-8 // another Xtagfile /^this is another theword Xtagfile /^theword ]]) ) write_file( 'Xtagfile', numbered_lines(40, { [21] = 'theword is here', [28] = 'this is another place' }) ) write_file('Xheader.h', numbered_lines(20, { [11] = 'searched word is here' })) command('set tags=Xtags') api.nvim_buf_set_lines(0, 0, -1, false, { 'one', '#include "Xheader.h"', 'three', 'four', 'five', 'six', 'seven', 'find theword somewhere', 'nine', 'this is another word', 'very long line where the word is also another', }) command('set previewpopup=height:4,width:40') command('set winborder=single') command('set path=.') feed('/theword}') if multigrid then screen:expect({ grid = [[ ## grid 1 [2:----------------------------------------]|*19 [3:----------------------------------------]| ## grid 2 one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine | this is another word | very long line where the word is also an| other | {1:~ }|*7 ## grid 3 /theword | ## grid 4 {4:┌────────────}{100:Xtagfile}{4:────────────┐}| {4:│20 │}| {4:│}{10:theword}{4: is here │}| {4:│22 │}| {4:│23 │}| {4:└────────────────────────────────┘}| ]], win_pos = { [2] = { height = 19, startcol = 0, startrow = 0, width = 40, win = 1000 }, }, float_pos = { [4] = { 1001, 'NW', 1, 8, 6, true, 50, 1, 8, 6 }, }, }) else screen:expect([[ one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine {4:┌────────────}{100:Xtagfile}{4:────────────┐}| this i{4:│20 │}| very l{4:│}{10:theword}{4: is here │}| other {4:│22 │}| {1:~ }{4:│23 │}| {1:~ }{4:└────────────────────────────────┘}| {1:~ }|*5 /theword | ]]) end command('pclose') if multigrid then screen:expect({ grid = [[ ## grid 1 [2:----------------------------------------]|*19 [3:----------------------------------------]| ## grid 2 one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine | this is another word | very long line where the word is also an| other | {1:~ }|*7 ## grid 3 /theword | ]], win_pos = { [2] = { height = 19, startcol = 0, startrow = 0, width = 40, win = 1000 }, }, }) else screen:expect([[ one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine | this is another word | very long line where the word is also an| other | {1:~ }|*7 /theword | ]]) end command([[set include=^\s*#\s*include]]) command('pedit +/theword Xtagfile') if multigrid then screen:expect({ grid = [[ ## grid 1 [2:----------------------------------------]|*19 [3:----------------------------------------]| ## grid 2 one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine | this is another word | very long line where the word is also an| other | {1:~ }|*7 ## grid 3 /theword | ## grid 5 {4:┌────────────}{100:Xtagfile}{4:────────────┐}| {4:│20 │}| {4:│}{10:theword}{4: is here │}| {4:│22 │}| {4:│23 │}| {4:└────────────────────────────────┘}| ]], win_pos = { [2] = { height = 19, startcol = 0, startrow = 0, width = 40, win = 1000 }, }, float_pos = { [5] = { 1002, 'NW', 1, 8, 6, true, 50, 1, 8, 6 }, }, }) else screen:expect([[ one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine {4:┌────────────}{100:Xtagfile}{4:────────────┐}| this i{4:│20 │}| very l{4:│}{10:theword}{4: is here │}| other {4:│22 │}| {1:~ }{4:│23 │}| {1:~ }{4:└────────────────────────────────┘}| {1:~ }|*5 /theword | ]]) end command('pclose | psearch searched') if multigrid then screen:expect({ grid = [[ ## grid 1 [2:----------------------------------------]|*19 [3:----------------------------------------]| ## grid 2 one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine | this is another word | very long line where the word is also an| other | {1:~ }|*7 ## grid 3 /theword | ## grid 6 {4:┌───────────}{100:Xheader.h}{4:────────────┐}| {4:│10 │}| {4:│searched word is here │}| {4:│12 │}| {4:│13 │}| {4:└────────────────────────────────┘}| ]], win_pos = { [2] = { height = 19, startcol = 0, startrow = 0, width = 40, win = 1000 }, }, float_pos = { [6] = { 1003, 'NW', 1, 8, 6, true, 50, 1, 8, 6 }, }, }) else screen:expect([[ one | #include "Xheader.h" | three | four | five | six | seven | find {10:^theword} somewhere | nine {4:┌───────────}{100:Xheader.h}{4:────────────┐}| this i{4:│10 │}| very l{4:│searched word is here │}| other {4:│12 │}| {1:~ }{4:│13 │}| {1:~ }{4:└────────────────────────────────┘}| {1:~ }|*5 /theword | ]]) end end) describe('with pum', function() before_each(function() write_file( 'XpreviewText.vim', t.dedent([[ let a = 3 let b = 1 echo a echo b call system('echo hello') " the end ]]) ) end) after_each(function() os.remove('XpreviewText.vim') end) local expect_screen = [[ one other^ | t{4:le}{12: other }{4: }| t{4:le once }| o{4:ec only }| o{4:ec off }| o{4:ca one hello') }| o{4:" the end }| {1:~ }|*2 {5:-- }{6:match 1 of 5} | ]] -- oldtest: Test_previewpopup_pum_pedit it('pum pedit', function() screen:try_resize(30, 10) exec([[ call setline(1, ['one', 'two', 'three', 'other', 'once', 'only', 'off']) set previewpopup=height:6,width:40 ]]) command('pedit XpreviewText.vim') feed('A o') if not multigrid then screen:expect(expect_screen) end end) -- oldtest: Test_previewpopup_pum_pbuffer it('pum pbuffer', function() screen:try_resize(30, 10) exec([[ call setline(1, ['one', 'two', 'three', 'other', 'once', 'only', 'off']) set previewpopup=height:6,width:40 badd XpreviewText.vim ]]) command(fn.bufnr('$') .. 'pbuffer') feed('A o') if not multigrid then screen:expect(expect_screen) end end) end) it(':pedit and border overrides', function() command('call writefile(["bar"], "foo", "a")') finally(function() os.remove('foo') end) command('set winborder=single | set previewpopup=height:2,width:5 | pedit foo') if multigrid then screen:expect({ grid = [[ ## grid 1 [2:----------------------------------------]|*6 [3:----------------------------------------]| ## grid 2 ^ | {1:~ }|*5 ## grid 3 | ## grid 4 {4:┌─}{100:foo}{4:─┐}| {4:│bar │}| {4:│ │}| {4:└─────┘}| ]], win_pos = { [2] = { height = 6, startcol = 0, startrow = 0, width = 40, win = 1000, }, }, float_pos = { [4] = { 1001, 'NW', 1, 1, 1, true, 50, 1, 1, 1 }, }, win_viewport = { [2] = { win = 1000, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0, }, [4] = { win = 1001, topline = 0, botline = 2, curline = 0, curcol = 0, linecount = 1, sum_scroll_delta = 0, }, }, }) else screen:expect([[ ^ | {1:~}{4:┌─}{100:foo}{4:─┐}{1: }| {1:~}{4:│bar │}{1: }| {1:~}{4:│ │}{1: }| {1:~}{4:└─────┘}{1: }| {1:~ }| | ]]) end -- move floating preview window to current split window command('vs | wincmd p | pedit none_exist') if multigrid then screen:expect({ grid = [[ ## grid 1 [5:-------------------]│[2:--------------------]|*5 {2:[No Name] }{3:[No Name] }| [3:----------------------------------------]| ## grid 2 ^ | {1:~ }|*4 ## grid 3 | ## grid 4 {4:┌}{100: