diff options
Diffstat (limited to 'test/unit/os/shell_spec.lua')
-rw-r--r-- | test/unit/os/shell_spec.lua | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/test/unit/os/shell_spec.lua b/test/unit/os/shell_spec.lua new file mode 100644 index 0000000000..870034aad9 --- /dev/null +++ b/test/unit/os/shell_spec.lua @@ -0,0 +1,74 @@ +-- not all operating systems support the system()-tests, as of yet. +local allowed_os = { + Linux = true, + OSX = true, + BSD = true, + POSIX = true +} + +if allowed_os[jit.os] ~= true then + return +end + +local helpers = require('test.unit.helpers') +local shell = helpers.cimport( + './src/nvim/os/shell.h', + './src/nvim/option_defs.h', + './src/nvim/os/event.h', + './src/nvim/misc1.h' +) +local ffi, eq, neq = helpers.ffi, helpers.eq, helpers.neq +local intern = helpers.internalize +local to_cstr = helpers.to_cstr +local NULL = ffi.cast('void *', 0) + +describe('shell functions', function() + setup(function() + -- the logging functions are complain if I don't do this + shell.init_homedir() + + shell.event_init() + + -- os_system() can't work when the p_sh and p_shcf variables are unset + shell.p_sh = to_cstr('/bin/bash') + shell.p_shcf = to_cstr('-c') + end) + + teardown(function() + shell.event_teardown() + end) + + local function os_system(cmd, input) + local input_or = input and to_cstr(input) or NULL + local input_len = (input ~= nil) and string.len(input) or 0 + local output = ffi.new('char *[1]') + local nread = ffi.new('size_t[1]') + + local status = shell.os_system(to_cstr(cmd), input_or, input_len, output, nread) + + return status, intern(output[0], nread[0]) + end + + describe('os_system', function() + it('can echo some output (shell builtin)', function() + local cmd, text = 'echo -n', 'some text' + local status, output = os_system(cmd .. ' ' .. text) + eq(text, output) + eq(0, status) + end) + + it('can deal with empty output', function() + local cmd = 'echo -n' + local status, output = os_system(cmd) + eq('', output) + eq(0, status) + end) + + it('can pass input on stdin', function() + local cmd, input = 'cat -', 'some text\nsome other text' + local status, output = os_system(cmd, input) + eq(input, output) + eq(0, status) + end) + end) +end) |