diff options
Diffstat (limited to 'test/functional/ui/embed_spec.lua')
-rw-r--r-- | test/functional/ui/embed_spec.lua | 314 |
1 files changed, 236 insertions, 78 deletions
diff --git a/test/functional/ui/embed_spec.lua b/test/functional/ui/embed_spec.lua index 9729f65355..0445476780 100644 --- a/test/functional/ui/embed_spec.lua +++ b/test/functional/ui/embed_spec.lua @@ -1,56 +1,53 @@ -local uv = require'luv' +local uv = vim.uv local helpers = require('test.functional.helpers')(after_each) local Screen = require('test.functional.ui.screen') +local api = helpers.api local feed = helpers.feed local eq = helpers.eq local neq = helpers.neq local clear = helpers.clear local ok = helpers.ok -local funcs = helpers.funcs +local fn = helpers.fn local nvim_prog = helpers.nvim_prog local retry = helpers.retry +local write_file = helpers.write_file local function test_embed(ext_linegrid) local screen local function startup(...) - clear{args_rm={'--headless'}, args={...}} + clear { args_rm = { '--headless' }, args = { ... } } -- attach immediately after startup, for early UI screen = Screen.new(60, 8) - screen:attach{ext_linegrid=ext_linegrid} + screen:attach { ext_linegrid = ext_linegrid } screen:set_default_attr_ids({ - [1] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red}, - [2] = {bold = true, foreground = Screen.colors.SeaGreen4}, - [3] = {bold = true, foreground = Screen.colors.Blue1}, - [4] = {bold = true, foreground = Screen.colors.Green}, - [5] = {bold = true, reverse = true}, + [1] = { foreground = Screen.colors.Grey100, background = Screen.colors.Red }, + [2] = { bold = true, foreground = Screen.colors.SeaGreen4 }, + [3] = { bold = true, foreground = Screen.colors.Blue1 }, + [4] = { bold = true, foreground = Screen.colors.Green }, + [5] = { bold = true, reverse = true }, + [6] = { foreground = Screen.colors.NvimLightGrey3, background = Screen.colors.NvimDarkGrey3 }, + [7] = { foreground = Screen.colors.NvimDarkRed }, + [8] = { foreground = Screen.colors.NvimDarkCyan }, }) end it('can display errors', function() startup('--cmd', 'echoerr invalid+') screen:expect([[ - | - | - | - | - | - Error detected while processing pre-vimrc command line: | - E121: Undefined variable: invalid | - Press ENTER or type command to continue^ | + |*4 + {6: }| + {7:Error detected while processing pre-vimrc command line:} | + {7:E121: Undefined variable: invalid} | + {8:Press ENTER or type command to continue}^ | ]]) feed('<cr>') screen:expect([[ ^ | - {3:~ }| - {3:~ }| - {3:~ }| - {3:~ }| - {3:~ }| - {3:~ }| + {3:~ }|*6 | ]]) end) @@ -61,36 +58,39 @@ local function test_embed(ext_linegrid) end startup('--cmd', 'echoerr "foo"', '--cmd', 'color default', '--cmd', 'echoerr "bar"') screen:expect([[ - | - | - | - {5: }| - Error detected while processing pre-vimrc command line: | - foo | - {1:bar} | - {4:Press ENTER or type command to continue}^ | + |*3 + {6: }| + {7:Error detected while processing pre-vimrc command line:} | + {7:foo} | + {7:bar} | + {8:Press ENTER or type command to continue}^ | ]]) end) it("doesn't erase output when setting Normal colors", function() startup('--cmd', 'echoerr "foo"', '--cmd', 'hi Normal guibg=Green', '--cmd', 'echoerr "bar"') - screen:expect{grid=[[ - | - | - | - | - Error detected while processing pre-vimrc command line: | - foo | - bar | - Press ENTER or type command to continue^ | - ]], condition=function() - eq(Screen.colors.Green, screen.default_colors.rgb_bg) - end} + screen:expect { + grid = [[ + |*3 + {6: }| + {7:Error detected while processing pre-vimrc command line:} | + {7:foo} | + {7:bar} | + {8:Press ENTER or type command to continue}^ | + ]], + condition = function() + eq(Screen.colors.Green, screen.default_colors.rgb_bg) + end, + } end) end -describe('--embed UI on startup (ext_linegrid=true)', function() test_embed(true) end) -describe('--embed UI on startup (ext_linegrid=false)', function() test_embed(false) end) +describe('--embed UI on startup (ext_linegrid=true)', function() + test_embed(true) +end) +describe('--embed UI on startup (ext_linegrid=false)', function() + test_embed(false) +end) describe('--embed UI', function() it('can pass stdin', function() @@ -99,43 +99,186 @@ describe('--embed UI', function() local writer = assert(uv.new_pipe(false)) writer:open(pipe.write) - clear {args_rm={'--headless'}, io_extra=pipe.read} + clear { args_rm = { '--headless' }, io_extra = pipe.read } -- attach immediately after startup, for early UI local screen = Screen.new(40, 8) - screen.rpc_async = true -- Avoid hanging. #24888 - screen:attach {stdin_fd=3} + screen.rpc_async = true -- Avoid hanging. #24888 + screen:attach { stdin_fd = 3 } screen:set_default_attr_ids { - [1] = {bold = true, foreground = Screen.colors.Blue1}; - [2] = {bold = true}; + [1] = { bold = true, foreground = Screen.colors.Blue1 }, + [2] = { bold = true }, } - writer:write "hello nvim\nfrom external input\n" - writer:shutdown(function() writer:close() end) + writer:write 'hello nvim\nfrom external input\n' + writer:shutdown(function() + writer:close() + end) - screen:expect{grid=[[ + screen:expect [[ ^hello nvim | from external input | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*5 | - ]]} + ]] -- stdin (rpc input) still works feed 'o' - screen:expect{grid=[[ + screen:expect [[ hello nvim | ^ | from external input | - {1:~ }| - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*4 {2:-- INSERT --} | - ]]} + ]] + end) + + it('can pass stdin to -q - #17523', function() + write_file( + 'Xbadfile.c', + [[ + /* some file with an error */ + main() { + functionCall(arg; arg, arg); + return 666 + } + ]] + ) + finally(function() + os.remove('Xbadfile.c') + end) + + local pipe = assert(uv.pipe()) + + local writer = assert(uv.new_pipe(false)) + writer:open(pipe.write) + + clear { args_rm = { '--headless' }, args = { '-q', '-' }, io_extra = pipe.read } + + -- attach immediately after startup, for early UI + local screen = Screen.new(60, 8) + screen.rpc_async = true -- Avoid hanging. #24888 + screen:attach { stdin_fd = 3 } + screen:set_default_attr_ids { + [1] = { bold = true, foreground = Screen.colors.Blue1 }, + [2] = { bold = true }, + } + + writer:write [[Xbadfile.c:4:12: error: expected ';' before '}' token]] + writer:shutdown(function() + writer:close() + end) + + screen:expect [[ + /* some file with an error */ | + main() { | + functionCall(arg; arg, arg); | + return 66^6 | + } | + {1:~ }|*2 + (1 of 1): error: expected ';' before '}' token | + ]] + + -- stdin (rpc input) still works + feed 'A' + screen:expect [[ + /* some file with an error */ | + main() { | + functionCall(arg; arg, arg); | + return 666^ | + } | + {1:~ }|*2 + {2:-- INSERT --} | + ]] + + eq('-', api.nvim_get_option_value('errorfile', {})) + end) + + it('only sets background colors once even if overridden', function() + local screen, current, seen + local function handle_default_colors_set(_, _, rgb_bg, _, _, _) + seen[rgb_bg] = true + current = rgb_bg + end + local function startup(...) + seen = {} + current = nil + clear { args_rm = { '--headless' }, args = { ... } } + + -- attach immediately after startup, for early UI + screen = Screen.new(40, 8) + screen._handle_default_colors_set = handle_default_colors_set + screen:attach() + end + + startup() + screen:expect { + condition = function() + eq(16777215, current) + end, + } + eq({ [16777215] = true }, seen) + + -- NB: by accident how functional/helpers.lua currently handles the default color scheme, the + -- above is sufficient to test the behavior. But in case that workaround is removed, we need + -- a test with an explicit override like below, so do it to remain safe. + startup('--cmd', 'hi NORMAL guibg=#FF00FF') + screen:expect { + condition = function() + eq(16711935, current) + end, + } + eq({ [16711935] = true }, seen) -- we only saw the last one, despite 16777215 was set internally earlier + end) + + it('updates cwd of attached UI #21771', function() + clear { args_rm = { '--headless' } } + + local screen = Screen.new(40, 8) + screen:attach() + + screen:expect { + condition = function() + eq(helpers.paths.test_source_path, screen.pwd) + end, + } + + -- Change global cwd + helpers.command(string.format('cd %s/src/nvim', helpers.paths.test_source_path)) + + screen:expect { + condition = function() + eq(string.format('%s/src/nvim', helpers.paths.test_source_path), screen.pwd) + end, + } + + -- Split the window and change the cwd in the split + helpers.command('new') + helpers.command(string.format('lcd %s/test', helpers.paths.test_source_path)) + + screen:expect { + condition = function() + eq(string.format('%s/test', helpers.paths.test_source_path), screen.pwd) + end, + } + + -- Move to the original window + helpers.command('wincmd p') + + screen:expect { + condition = function() + eq(string.format('%s/src/nvim', helpers.paths.test_source_path), screen.pwd) + end, + } + + -- Change global cwd again + helpers.command(string.format('cd %s', helpers.paths.test_source_path)) + + screen:expect { + condition = function() + eq(helpers.paths.test_source_path, screen.pwd) + end, + } end) end) @@ -144,8 +287,18 @@ describe('--embed --listen UI', function() helpers.skip(helpers.is_os('win')) clear() local child_server = assert(helpers.new_pipename()) - funcs.jobstart({nvim_prog, '--embed', '--listen', child_server, '--clean'}) - retry(nil, nil, function() neq(nil, uv.fs_stat(child_server)) end) + fn.jobstart({ + nvim_prog, + '--embed', + '--listen', + child_server, + '--clean', + '--cmd', + 'colorscheme vim', + }) + retry(nil, nil, function() + neq(nil, uv.fs_stat(child_server)) + end) local child_session = helpers.connect(child_server) @@ -154,11 +307,15 @@ describe('--embed --listen UI', function() eq(2, #api_info) ok(api_info[1] > 2, 'channel_id > 2', api_info[1]) - child_session:request('nvim_exec2', [[ + child_session:request( + 'nvim_exec2', + [[ let g:evs = [] autocmd UIEnter * call add(g:evs, $"UIEnter:{v:event.chan}") autocmd VimEnter * call add(g:evs, "VimEnter") - ]], {}) + ]], + {} + ) -- VimEnter and UIEnter shouldn't be triggered until after attach local var_ok, var = child_session:request('nvim_get_var', 'evs') @@ -167,21 +324,22 @@ describe('--embed --listen UI', function() local child_screen = Screen.new(40, 6) child_screen:attach(nil, child_session) - child_screen:expect{grid=[[ + child_screen:expect { + grid = [[ ^ | - {1:~ }| - {1:~ }| - {1:~ }| + {1:~ }|*3 {2:[No Name] 0,0-1 All}| | - ]], attr_ids={ - [1] = {foreground = Screen.colors.Blue, bold = true}; - [2] = {reverse = true, bold = true}; - }} + ]], + attr_ids = { + [1] = { foreground = Screen.colors.Blue, bold = true }, + [2] = { reverse = true, bold = true }, + }, + } -- VimEnter and UIEnter should now be triggered var_ok, var = child_session:request('nvim_get_var', 'evs') ok(var_ok) - eq({'VimEnter', ('UIEnter:%d'):format(api_info[1])}, var) + eq({ 'VimEnter', ('UIEnter:%d'):format(api_info[1]) }, var) end) end) |