diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2017-11-26 10:18:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-26 10:18:01 +0100 |
commit | 207b7ca4bc16d52641eaa5244eef25a0dba91dbc (patch) | |
tree | a3422eceb6eeaa692a7baf7171dfa5fd81ad86b2 /test/functional/core/job_spec.lua | |
parent | b57d9a4ff08fc1ef8db79d422b441b792493ff4e (diff) | |
parent | 0de019b6a65c6dd5141b7e002343df3689065ce7 (diff) | |
download | rneovim-207b7ca4bc16d52641eaa5244eef25a0dba91dbc.tar.gz rneovim-207b7ca4bc16d52641eaa5244eef25a0dba91dbc.tar.bz2 rneovim-207b7ca4bc16d52641eaa5244eef25a0dba91dbc.zip |
Merge pull request #6844 from bfredl/channel
channels: support buffered output and bytes sockets/stdio
Diffstat (limited to 'test/functional/core/job_spec.lua')
-rw-r--r-- | test/functional/core/job_spec.lua | 50 |
1 files changed, 36 insertions, 14 deletions
diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua index 1b8a5b1b95..e957650c88 100644 --- a/test/functional/core/job_spec.lua +++ b/test/functional/core/job_spec.lua @@ -10,6 +10,7 @@ local wait = helpers.wait local iswin = helpers.iswin local get_pathsep = helpers.get_pathsep local nvim_set = helpers.nvim_set +local expect_twostreams = helpers.expect_twostreams local Screen = require('test.functional.ui.screen') describe('jobs', function() @@ -29,15 +30,14 @@ describe('jobs', function() \ ? map(a:data, 'substitute(v:val, "\r", "", "g")') \ : a:data endfunction - function! s:OnEvent(id, data, event) dict + function! OnEvent(id, data, event) dict let userdata = get(self, 'user') let data = Normalize(a:data) call rpcnotify(g:channel, a:event, userdata, data) endfunction let g:job_opts = { - \ 'on_stdout': function('s:OnEvent'), - \ 'on_stderr': function('s:OnEvent'), - \ 'on_exit': function('s:OnEvent'), + \ 'on_stdout': function('OnEvent'), + \ 'on_exit': function('OnEvent'), \ 'user': 0 \ } ]]) @@ -51,6 +51,7 @@ describe('jobs', function() nvim('command', "let j = jobstart('echo $VAR', g:job_opts)") end eq({'notification', 'stdout', {0, {'abc', ''}}}, next_msg()) + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -63,6 +64,7 @@ describe('jobs', function() end eq({'notification', 'stdout', {0, {(iswin() and [[C:\]] or '/'), ''}}}, next_msg()) + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -76,6 +78,7 @@ describe('jobs', function() nvim('command', "let j = jobstart('pwd', g:job_opts)") end eq({'notification', 'stdout', {0, {dir, ''}}}, next_msg()) + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) rmdir(dir) end) @@ -118,8 +121,12 @@ describe('jobs', function() it('invokes callbacks when the job writes and exits', function() -- TODO: hangs on Windows if helpers.pending_win32(pending) then return end + nvim('command', "let g:job_opts.on_stderr = function('OnEvent')") nvim('command', "call jobstart('echo', g:job_opts)") - eq({'notification', 'stdout', {0, {'', ''}}}, next_msg()) + expect_twostreams({{'notification', 'stdout', {0, {'', ''}}}, + {'notification', 'stdout', {0, {''}}}}, + {{'notification', 'stderr', {0, {''}}}}) + eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -134,6 +141,7 @@ describe('jobs', function() nvim('command', 'call jobsend(j, [123, "xyz", ""])') eq({'notification', 'stdout', {0, {'123', 'xyz', ''}}}, next_msg()) nvim('command', "call jobstop(j)") + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -145,6 +153,7 @@ describe('jobs', function() nvim('command', "let j = jobstart(['cat', '"..filename.."'], g:job_opts)") eq({'notification', 'stdout', {0, {'abc\ndef', ''}}}, next_msg()) + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) os.remove(filename) @@ -168,6 +177,7 @@ describe('jobs', function() nvim('command', 'call jobsend(j, "abc\\nxyz")') eq({'notification', 'stdout', {0, {'abc', 'xyz'}}}, next_msg()) nvim('command', "call jobstop(j)") + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -186,6 +196,7 @@ describe('jobs', function() eq({'notification', 'stdout', {0, {'\n123\n', 'abc\nxyz\n', ''}}}, next_msg()) nvim('command', "call jobstop(j)") + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -196,6 +207,7 @@ describe('jobs', function() eq({'notification', 'stdout', {0, {'some data', 'without\nfinal nl'}}}, next_msg()) nvim('command', "call jobstop(j)") + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -203,6 +215,7 @@ describe('jobs', function() if helpers.pending_win32(pending) then return end -- TODO: Need `cat`. nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)") nvim('command', 'call jobclose(j, "stdin")') + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) end) @@ -239,6 +252,7 @@ describe('jobs', function() local pid = eval('jobpid(j)') eq(0,os.execute('ps -p '..pid..' > /dev/null')) nvim('command', 'call jobstop(j)') + eq({'notification', 'stdout', {0, {''}}}, next_msg()) eq({'notification', 'exit', {0, 0}}, next_msg()) neq(0,os.execute('ps -p '..pid..' > /dev/null')) end) @@ -270,6 +284,7 @@ describe('jobs', function() nvim('command', [[call jobstart('echo "foo"', g:job_opts)]]) local data = {n = 5, s = 'str', l = {1}} eq({'notification', 'stdout', {data, {'foo', ''}}}, next_msg()) + eq({'notification', 'stdout', {data, {''}}}, next_msg()) eq({'notification', 'exit', {data, 0}}, next_msg()) end) @@ -283,7 +298,6 @@ describe('jobs', function() it('can omit data callbacks', function() nvim('command', 'unlet g:job_opts.on_stdout') - nvim('command', 'unlet g:job_opts.on_stderr') nvim('command', 'let g:job_opts.user = 5') nvim('command', [[call jobstart('echo "foo"', g:job_opts)]]) eq({'notification', 'exit', {5, 0}}, next_msg()) @@ -294,11 +308,13 @@ describe('jobs', function() nvim('command', 'let g:job_opts.user = 5') nvim('command', [[call jobstart('echo "foo"', g:job_opts)]]) eq({'notification', 'stdout', {5, {'foo', ''}}}, next_msg()) + eq({'notification', 'stdout', {5, {''}}}, next_msg()) end) it('will pass return code with the exit event', function() nvim('command', 'let g:job_opts.user = 5') nvim('command', "call jobstart('exit 55', g:job_opts)") + eq({'notification', 'stdout', {5, {''}}}, next_msg()) eq({'notification', 'exit', {5, 55}}, next_msg()) end) @@ -341,6 +357,14 @@ describe('jobs', function() end) it('requires funcrefs for script-local (s:) functions', function() + local screen = Screen.new(60, 5) + screen:attach() + screen:set_default_attr_ids({ + [1] = {bold = true, foreground = Screen.colors.Blue1}, + [2] = {foreground = Screen.colors.Grey100, background = Screen.colors.Red}, + [3] = {bold = true, foreground = Screen.colors.SeaGreen4} + }) + -- Pass job callback names _without_ `function(...)`. source([[ function! s:OnEvent(id, data, event) dict @@ -350,14 +374,10 @@ describe('jobs', function() \ 'on_stdout': 's:OnEvent', \ 'on_stderr': 's:OnEvent', \ 'on_exit': 's:OnEvent', - \ 'user': 2349 \ }) ]]) - -- The behavior is asynchronous, retry until a time limit. - helpers.retry(nil, 10000, function() - eq("E120:", string.match(eval("v:errmsg"), "E%d*:")) - end) + screen:expect("{2:E120: Using <SID> not in a script context: s:OnEvent}",nil,nil,nil,true) end) it('does not repeat output with slow output handlers', function() @@ -376,7 +396,7 @@ describe('jobs', function() call jobwait([jobstart(cmd, d)]) call rpcnotify(g:channel, 'data', d.data) ]]) - eq({'notification', 'data', {{{'1', ''}, {'2', ''}, {'3', ''}, {'4', ''}, {'5', ''}}}}, next_msg()) + eq({'notification', 'data', {{{'1', ''}, {'2', ''}, {'3', ''}, {'4', ''}, {'5', ''}, {''}}}}, next_msg()) end) it('jobstart() works with partial functions', function() @@ -497,7 +517,8 @@ describe('jobs', function() elseif self.state == 2 let self.state = 3 call jobsend(a:id, "line3\n") - else + elseif self.state == 3 + let self.state = 4 call rpcnotify(g:channel, 'w', printf('job %d closed', self.counter)) call jobclose(a:id, 'stdin') endif @@ -552,6 +573,7 @@ describe('jobs', function() -- FIXME need to wait until jobsend succeeds before calling jobstop pending('will only emit the "exit" event after "stdout" and "stderr"', function() + nvim('command', "let g:job_opts.on_stderr = function('s:OnEvent')") nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)") local jobid = nvim('eval', 'j') nvim('eval', 'jobsend(j, "abcdef")') @@ -638,7 +660,7 @@ describe('jobs', function() -- there won't be any more messages, and the test would hang. helpers.sleep(100) local err = exc_exec('call jobpid(j)') - eq('Vim(call):E900: Invalid job id', err) + eq('Vim(call):E900: Invalid channel id', err) -- cleanup eq(other_pid, eval('jobpid(' .. other_jobid .. ')')) |