diff options
| author | Jakob Schnitzer <mail@jakobschnitzer.de> | 2017-06-28 16:52:04 +0200 |
|---|---|---|
| committer | Jakob Schnitzer <mail@jakobschnitzer.de> | 2017-06-28 16:52:04 +0200 |
| commit | e8829710bc5f38208499e0ad38402eac24a67ac2 (patch) | |
| tree | 4e1ae954c2e301adadbfa7038b823ea9ea2fb08e /test/unit | |
| parent | ff8b2eb435c518f0eafd0e509afe1f5ee4a81fd1 (diff) | |
| parent | f0dafa89c2b7602cfedf0bd3409858e4c212b0a2 (diff) | |
| download | rneovim-e8829710bc5f38208499e0ad38402eac24a67ac2.tar.gz rneovim-e8829710bc5f38208499e0ad38402eac24a67ac2.tar.bz2 rneovim-e8829710bc5f38208499e0ad38402eac24a67ac2.zip | |
Merge branch 'master' into option-fixes
Diffstat (limited to 'test/unit')
| -rw-r--r-- | test/unit/eval/typval_spec.lua | 49 | ||||
| -rw-r--r-- | test/unit/os/env_spec.lua | 2 | ||||
| -rw-r--r-- | test/unit/os/fs_spec.lua | 52 | ||||
| -rw-r--r-- | test/unit/os/shell_spec.lua | 22 | ||||
| -rw-r--r-- | test/unit/path_spec.lua | 136 | ||||
| -rw-r--r-- | test/unit/strings_spec.lua | 39 |
6 files changed, 225 insertions, 75 deletions
diff --git a/test/unit/eval/typval_spec.lua b/test/unit/eval/typval_spec.lua index 6308ae7367..5d543f914f 100644 --- a/test/unit/eval/typval_spec.lua +++ b/test/unit/eval/typval_spec.lua @@ -1751,6 +1751,55 @@ describe('typval.c', function() eq('2', s) end) end) + describe('get_string_buf_chk()', function() + local function tv_dict_get_string_buf_chk(d, key, len, buf, def, emsg) + buf = buf or ffi.gc(lib.xmalloc(lib.NUMBUFLEN), lib.xfree) + def = def or ffi.gc(lib.xstrdup('DEFAULT'), lib.xfree) + len = len or #key + alloc_log:clear() + local ret = check_emsg(function() return lib.tv_dict_get_string_buf_chk(d, key, len, buf, def) end, + emsg) + local s_ret = (ret ~= nil) and ffi.string(ret) or nil + if not emsg then + alloc_log:check({}) + end + return s_ret, ret, buf, def + end + itp('works with NULL dict', function() + eq('DEFAULT', tv_dict_get_string_buf_chk(nil, 'test')) + end) + itp('works', function() + local lua_d = { + ['']={}, + t=1, + te=int(2), + tes=empty_list, + test='tset', + testt=5, + } + local d = dict(lua_d) + alloc_log:clear() + eq(lua_d, dct2tbl(d)) + alloc_log:check({}) + local s, r, b, def + s, r, b, def = tv_dict_get_string_buf_chk(d, 'test') + neq(r, b) + neq(r, def) + eq('tset', s) + s, r, b, def = tv_dict_get_string_buf_chk(d, 'test', 1, nil, nil, 'E806: using Float as a String') + neq(r, b) + neq(r, def) + eq(nil, s) + s, r, b, def = tv_dict_get_string_buf_chk(d, 'te') + eq(r, b) + neq(r, def) + eq('2', s) + s, r, b, def = tv_dict_get_string_buf_chk(d, 'TEST') + eq(r, def) + neq(r, b) + eq('DEFAULT', s) + end) + end) describe('get_callback()', function() local function tv_dict_get_callback(d, key, key_len, emsg) key_len = key_len or #key diff --git a/test/unit/os/env_spec.lua b/test/unit/os/env_spec.lua index 575787a25e..cefd0315b7 100644 --- a/test/unit/os/env_spec.lua +++ b/test/unit/os/env_spec.lua @@ -13,7 +13,7 @@ require('lfs') local cimp = cimport('./src/nvim/os/os.h') -describe('env function', function() +describe('env.c', function() local function os_setenv(name, value, override) return cimp.os_setenv(to_cstr(name), to_cstr(value), override) end diff --git a/test/unit/os/fs_spec.lua b/test/unit/os/fs_spec.lua index 860ebfdbcb..23eb05b4b8 100644 --- a/test/unit/os/fs_spec.lua +++ b/test/unit/os/fs_spec.lua @@ -35,7 +35,6 @@ for i = 0, 255 do end local fcontents = s:rep(16) -local buffer = "" local directory = nil local absolute_executable = nil local executable_name = nil @@ -65,7 +64,11 @@ local function os_getperm(filename) return tonumber(perm) end -describe('fs function', function() +describe('fs.c', function() + local function os_isdir(name) + return fs.os_isdir(to_cstr(name)) + end + before_each(function() lfs.mkdir('unit-test-directory'); @@ -91,32 +94,37 @@ describe('fs function', function() end) describe('os_dirname', function() - local length - - local function os_dirname(buf, len) - return fs.os_dirname(buf, len) - end - - before_each(function() - length = (string.len(lfs.currentdir())) + 1 - buffer = cstr(length, '') + itp('returns OK and writes current directory to the buffer', function() + local length = string.len(lfs.currentdir()) + 1 + local buf = cstr(length, '') + eq(OK, fs.os_dirname(buf, length)) + eq(lfs.currentdir(), ffi.string(buf)) end) - itp('returns OK and writes current directory into the buffer if it is large\n enough', function() - eq(OK, (os_dirname(buffer, length))) - eq(lfs.currentdir(), (ffi.string(buffer))) - end) - - -- What kind of other failing cases are possible? itp('returns FAIL if the buffer is too small', function() - local buf = cstr((length - 1), '') - eq(FAIL, (os_dirname(buf, (length - 1)))) + local length = string.len(lfs.currentdir()) + 1 + local buf = cstr(length - 1, '') + eq(FAIL, fs.os_dirname(buf, length - 1)) end) end) - local function os_isdir(name) - return fs.os_isdir((to_cstr(name))) - end + describe('os_chdir', function() + itp('fails with path="~"', function() + eq(false, os_isdir('~')) -- sanity check: no literal "~" directory. + local length = 4096 + local expected_cwd = cstr(length, '') + local cwd = cstr(length, '') + eq(OK, fs.os_dirname(expected_cwd, length)) + + -- os_chdir returns 0 for success, not OK (1). + neq(0, fs.os_chdir('~')) -- fail + neq(0, fs.os_chdir('~/')) -- fail + + eq(OK, fs.os_dirname(cwd, length)) + -- CWD did not change. + eq(ffi.string(expected_cwd), ffi.string(cwd)) + end) + end) describe('os_isdir', function() itp('returns false if an empty string is given', function() diff --git a/test/unit/os/shell_spec.lua b/test/unit/os/shell_spec.lua index e883301cfb..37274502de 100644 --- a/test/unit/os/shell_spec.lua +++ b/test/unit/os/shell_spec.lua @@ -15,7 +15,7 @@ local NULL = ffi.cast('void *', 0) describe('shell functions', function() before_each(function() -- os_system() can't work when the p_sh and p_shcf variables are unset - cimported.p_sh = to_cstr('/bin/bash') + cimported.p_sh = to_cstr('/bin/sh') cimported.p_shcf = to_cstr('-c') cimported.p_sxq = to_cstr('') cimported.p_sxe = to_cstr('') @@ -53,14 +53,14 @@ describe('shell functions', function() describe('os_system', function() itp('can echo some output (shell builtin)', function() - local cmd, text = 'echo -n', 'some text' + local cmd, text = 'printf "%s "', 'some text ' local status, output = os_system(cmd .. ' ' .. text) eq(text, output) eq(0, status) end) itp('can deal with empty output', function() - local cmd = 'echo -n' + local cmd = 'printf ""' local status, output = os_system(cmd) eq('', output) eq(0, status) @@ -81,19 +81,19 @@ describe('shell functions', function() describe('shell_build_argv', function() itp('works with NULL arguments', function() - eq({'/bin/bash'}, shell_build_argv(nil, nil)) + eq({'/bin/sh'}, shell_build_argv(nil, nil)) end) itp('works with cmd', function() - eq({'/bin/bash', '-c', 'abc def'}, shell_build_argv('abc def', nil)) + eq({'/bin/sh', '-c', 'abc def'}, shell_build_argv('abc def', nil)) end) itp('works with extra_args', function() - eq({'/bin/bash', 'ghi jkl'}, shell_build_argv(nil, 'ghi jkl')) + eq({'/bin/sh', 'ghi jkl'}, shell_build_argv(nil, 'ghi jkl')) end) itp('works with cmd and extra_args', function() - eq({'/bin/bash', 'ghi jkl', '-c', 'abc def'}, shell_build_argv('abc def', 'ghi jkl')) + eq({'/bin/sh', 'ghi jkl', '-c', 'abc def'}, shell_build_argv('abc def', 'ghi jkl')) end) itp('splits and unquotes &shell and &shellcmdflag', function() @@ -112,7 +112,7 @@ describe('shell functions', function() local argv = ffi.cast('char**', cimported.shell_build_argv(to_cstr('echo &|<>()@^'), nil)) - eq(ffi.string(argv[0]), '/bin/bash') + eq(ffi.string(argv[0]), '/bin/sh') eq(ffi.string(argv[1]), '-c') eq(ffi.string(argv[2]), '(echo ^&^|^<^>^(^)^@^^)') eq(nil, argv[3]) @@ -124,7 +124,7 @@ describe('shell functions', function() local argv = ffi.cast('char**', cimported.shell_build_argv( to_cstr('echo -n some text'), nil)) - eq(ffi.string(argv[0]), '/bin/bash') + eq(ffi.string(argv[0]), '/bin/sh') eq(ffi.string(argv[1]), '-c') eq(ffi.string(argv[2]), '"(echo -n some text)"') eq(nil, argv[3]) @@ -136,7 +136,7 @@ describe('shell functions', function() local argv = ffi.cast('char**', cimported.shell_build_argv( to_cstr('echo -n some text'), nil)) - eq(ffi.string(argv[0]), '/bin/bash') + eq(ffi.string(argv[0]), '/bin/sh') eq(ffi.string(argv[1]), '-c') eq(ffi.string(argv[2]), '"echo -n some text"') eq(nil, argv[3]) @@ -145,7 +145,7 @@ describe('shell functions', function() itp('with empty shellxquote/shellxescape', function() local argv = ffi.cast('char**', cimported.shell_build_argv( to_cstr('echo -n some text'), nil)) - eq(ffi.string(argv[0]), '/bin/bash') + eq(ffi.string(argv[0]), '/bin/sh') eq(ffi.string(argv[1]), '-c') eq(ffi.string(argv[2]), 'echo -n some text') eq(nil, argv[3]) diff --git a/test/unit/path_spec.lua b/test/unit/path_spec.lua index 470f971e68..a9cba7df84 100644 --- a/test/unit/path_spec.lua +++ b/test/unit/path_spec.lua @@ -13,12 +13,12 @@ local OK = helpers.OK local FAIL = helpers.FAIL cimport('string.h') -local path = cimport('./src/nvim/path.h') +local cimp = cimport('./src/nvim/os/os.h', './src/nvim/path.h') local length = 0 local buffer = nil -describe('path function', function() +describe('path.c', function() describe('path_full_dir_name', function() setup(function() lfs.mkdir('unit-test-directory') @@ -30,7 +30,7 @@ describe('path function', function() local function path_full_dir_name(directory, buf, len) directory = to_cstr(directory) - return path.path_full_dir_name(directory, buf, len) + return cimp.path_full_dir_name(directory, buf, len) end before_each(function() @@ -69,7 +69,7 @@ describe('path function', function() local function path_full_compare(s1, s2, cn) s1 = to_cstr(s1) s2 = to_cstr(s2) - return path.path_full_compare(s1, s2, cn or 0) + return cimp.path_full_compare(s1, s2, cn or 0) end local f1 = 'f1.o' @@ -86,31 +86,31 @@ describe('path function', function() end) itp('returns kEqualFiles when passed the same file', function() - eq(path.kEqualFiles, (path_full_compare(f1, f1))) + eq(cimp.kEqualFiles, (path_full_compare(f1, f1))) end) itp('returns kEqualFileNames when files that dont exist and have same name', function() - eq(path.kEqualFileNames, (path_full_compare('null.txt', 'null.txt', true))) + eq(cimp.kEqualFileNames, (path_full_compare('null.txt', 'null.txt', true))) end) itp('returns kBothFilesMissing when files that dont exist', function() - eq(path.kBothFilesMissing, (path_full_compare('null.txt', 'null.txt'))) + eq(cimp.kBothFilesMissing, (path_full_compare('null.txt', 'null.txt'))) end) itp('returns kDifferentFiles when passed different files', function() - eq(path.kDifferentFiles, (path_full_compare(f1, f2))) - eq(path.kDifferentFiles, (path_full_compare(f2, f1))) + eq(cimp.kDifferentFiles, (path_full_compare(f1, f2))) + eq(cimp.kDifferentFiles, (path_full_compare(f2, f1))) end) itp('returns kOneFileMissing if only one does not exist', function() - eq(path.kOneFileMissing, (path_full_compare(f1, 'null.txt'))) - eq(path.kOneFileMissing, (path_full_compare('null.txt', f1))) + eq(cimp.kOneFileMissing, (path_full_compare(f1, 'null.txt'))) + eq(cimp.kOneFileMissing, (path_full_compare('null.txt', f1))) end) end) describe('path_tail', function() local function path_tail(file) - local res = path.path_tail((to_cstr(file))) + local res = cimp.path_tail((to_cstr(file))) neq(NULL, res) return ffi.string(res) end @@ -126,7 +126,7 @@ describe('path function', function() describe('path_tail_with_sep', function() local function path_tail_with_sep(file) - local res = path.path_tail_with_sep((to_cstr(file))) + local res = cimp.path_tail_with_sep((to_cstr(file))) neq(NULL, res) return ffi.string(res) end @@ -159,11 +159,11 @@ describe('path function', function() -- strcmp. local function invocation_path_tail(invk) local plen = ffi.new('size_t[?]', 1) - local ptail = path.invocation_path_tail((to_cstr(invk)), plen) + local ptail = cimp.invocation_path_tail((to_cstr(invk)), plen) neq(NULL, ptail) -- it does not change the output if len==NULL - local tail2 = path.invocation_path_tail((to_cstr(invk)), NULL) + local tail2 = cimp.invocation_path_tail((to_cstr(invk)), NULL) neq(NULL, tail2) eq((ffi.string(ptail)), (ffi.string(tail2))) return ptail, plen[0] @@ -204,7 +204,7 @@ describe('path function', function() end) itp('is equivalent to path_tail when args do not contain a path separator', function() - local ptail = path.path_tail(to_cstr("a/b/c x y z")) + local ptail = cimp.path_tail(to_cstr("a/b/c x y z")) neq(NULL, ptail) local tail = ffi.string(ptail) local invk, _ = invocation_path_tail("a/b/c x y z") @@ -212,7 +212,7 @@ describe('path function', function() end) itp('is not equivalent to path_tail when args contain a path separator', function() - local ptail = path.path_tail(to_cstr("a/b/c x y/z")) + local ptail = cimp.path_tail(to_cstr("a/b/c x y/z")) neq(NULL, ptail) local invk, _ = invocation_path_tail("a/b/c x y/z") neq((ffi.string(ptail)), (ffi.string(invk))) @@ -221,7 +221,7 @@ describe('path function', function() describe('path_next_component', function() local function path_next_component(file) - local res = path.path_next_component((to_cstr(file))) + local res = cimp.path_next_component((to_cstr(file))) neq(NULL, res) return ffi.string(res) end @@ -238,25 +238,25 @@ describe('path function', function() describe('path_shorten_fname', function() itp('returns NULL if `full_path` is NULL', function() local dir = to_cstr('some/directory/file.txt') - eq(NULL, (path.path_shorten_fname(NULL, dir))) + eq(NULL, (cimp.path_shorten_fname(NULL, dir))) end) itp('returns NULL if the path and dir does not match', function() local dir = to_cstr('not/the/same') local full = to_cstr('as/this.txt') - eq(NULL, (path.path_shorten_fname(full, dir))) + eq(NULL, (cimp.path_shorten_fname(full, dir))) end) itp('returns NULL if the path is not separated properly', function() local dir = to_cstr('some/very/long/') local full = to_cstr('some/very/long/directory/file.txt') - eq(NULL, (path.path_shorten_fname(full, dir))) + eq(NULL, (cimp.path_shorten_fname(full, dir))) end) itp('shortens the filename if `dir_name` is the start of `full_path`', function() local full = to_cstr('some/very/long/directory/file.txt') local dir = to_cstr('some/very/long') - eq('directory/file.txt', (ffi.string(path.path_shorten_fname(full, dir)))) + eq('directory/file.txt', (ffi.string(cimp.path_shorten_fname(full, dir)))) end) end) end) @@ -277,23 +277,76 @@ describe('path_shorten_fname_if_possible', function() itp('returns shortened path if possible', function() lfs.chdir('ut_directory') local full = to_cstr(lfs.currentdir() .. '/subdir/file.txt') - eq('subdir/file.txt', (ffi.string(path.path_shorten_fname_if_possible(full)))) + eq('subdir/file.txt', (ffi.string(cimp.path_shorten_fname_if_possible(full)))) end) itp('returns `full_path` if a shorter version is not possible', function() local old = lfs.currentdir() lfs.chdir('ut_directory') local full = old .. '/subdir/file.txt' - eq(full, (ffi.string(path.path_shorten_fname_if_possible(to_cstr(full))))) + eq(full, (ffi.string(cimp.path_shorten_fname_if_possible(to_cstr(full))))) end) itp('returns NULL if `full_path` is NULL', function() - eq(NULL, (path.path_shorten_fname_if_possible(NULL))) + eq(NULL, (cimp.path_shorten_fname_if_possible(NULL))) end) end) end) -describe('more path function', function() +describe('path.c path_guess_exepath', function() + local cwd = lfs.currentdir() + + for _,name in ipairs({'./nvim', '.nvim', 'foo/nvim'}) do + itp('"'..name..'" returns name catenated with CWD', function() + local bufsize = 255 + local buf = cstr(bufsize, '') + cimp.path_guess_exepath(name, buf, bufsize) + eq(cwd..'/'..name, ffi.string(buf)) + end) + end + + itp('absolute path returns the name unmodified', function() + local name = '/foo/bar/baz' + local bufsize = 255 + local buf = cstr(bufsize, '') + cimp.path_guess_exepath(name, buf, bufsize) + eq(name, ffi.string(buf)) + end) + + itp('returns the name unmodified if not found in $PATH', function() + local name = '23u0293_not_in_path' + local bufsize = 255 + local buf = cstr(bufsize, '') + cimp.path_guess_exepath(name, buf, bufsize) + eq(name, ffi.string(buf)) + end) + + itp('does not crash if $PATH item exceeds MAXPATHL', function() + local orig_path_env = os.getenv('PATH') + local name = 'cat' -- Some executable in $PATH. + local bufsize = 255 + local buf = cstr(bufsize, '') + local insane_path = orig_path_env..':'..(("x/"):rep(4097)) + + cimp.os_setenv('PATH', insane_path, true) + cimp.path_guess_exepath(name, buf, bufsize) + eq('bin/' .. name, ffi.string(buf):sub(-#('bin/' .. name), -1)) + + -- Restore $PATH. + cimp.os_setenv('PATH', orig_path_env, true) + end) + + itp('returns full path found in $PATH', function() + local name = 'cat' -- Some executable in $PATH. + local bufsize = 255 + local buf = cstr(bufsize, '') + cimp.path_guess_exepath(name, buf, bufsize) + -- Usually "/bin/cat" on unix, "/path/to/nvim/cat" on Windows. + eq('bin/' .. name, ffi.string(buf):sub(-#('bin/' .. name), -1)) + end) +end) + +describe('path.c', function() setup(function() lfs.mkdir('unit-test-directory'); io.open('unit-test-directory/test.file', 'w').close() @@ -315,7 +368,7 @@ describe('more path function', function() describe('vim_FullName', function() local function vim_FullName(filename, buf, len, force) filename = to_cstr(filename) - return path.vim_FullName(filename, buf, len, force) + return cimp.vim_FullName(filename, buf, len, force) end before_each(function() @@ -326,7 +379,7 @@ describe('more path function', function() itp('fails if given filename is NULL', function() local force_expansion = 1 - local result = path.vim_FullName(NULL, buffer, length, force_expansion) + local result = cimp.vim_FullName(NULL, buffer, length, force_expansion) eq(FAIL, result) end) @@ -335,7 +388,7 @@ describe('more path function', function() local filename = 'foo/bar/bazzzzzzz/buz/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/a' local too_short_len = 8 local buf = cstr(too_short_len, '') - local result = path.vim_FullName(filename, buf, too_short_len, force_expansion) + local result = cimp.vim_FullName(filename, buf, too_short_len, force_expansion) local expected = string.sub(filename, 1, (too_short_len - 1)) eq(expected, (ffi.string(buf))) eq(FAIL, result) @@ -357,7 +410,7 @@ describe('more path function', function() eq(FAIL, result) end) - itp('concatenates given filename if it does not contain a slash', function() + itp('concatenates filename if it does not contain a slash', function() local force_expansion = 1 local result = vim_FullName('test.file', buffer, length, force_expansion) local expected = lfs.currentdir() .. '/test.file' @@ -365,7 +418,7 @@ describe('more path function', function() eq(OK, result) end) - itp('concatenates given filename if it is a directory but does not contain a\n slash', function() + itp('concatenates directory name if it does not contain a slash', function() local force_expansion = 1 local result = vim_FullName('..', buffer, length, force_expansion) local expected = lfs.currentdir() .. '/..' @@ -395,6 +448,7 @@ describe('more path function', function() end) itp('fails and uses filename when the path is relative to HOME', function() + eq(false, cimp.os_isdir('~')) -- sanity check: no literal "~" directory. local force_expansion = 1 local absolute_path = '~/home.file' local result = vim_FullName(absolute_path, buffer, length, force_expansion) @@ -414,7 +468,7 @@ describe('more path function', function() local filename = to_cstr('unit-test-directory/test.file') -- Don't use the wrapper here but pass a cstring directly to the c -- function. - local result = path.vim_FullName(filename, buffer, length, force_expansion) + local result = cimp.vim_FullName(filename, buffer, length, force_expansion) eq(lfs.currentdir() .. '/unit-test-directory/test.file', (ffi.string(buffer))) eq('unit-test-directory/test.file', (ffi.string(filename))) eq(OK, result) @@ -423,7 +477,7 @@ describe('more path function', function() itp('works with directories that have one path component', function() local force_expansion = 1 local filename = to_cstr('/tmp') - local result = path.vim_FullName(filename, buffer, length, force_expansion) + local result = cimp.vim_FullName(filename, buffer, length, force_expansion) eq('/tmp', ffi.string(buffer)) eq(OK, result) end) @@ -432,7 +486,7 @@ describe('more path function', function() describe('path_fix_case', function() local function fix_case(file) local c_file = to_cstr(file) - path.path_fix_case(c_file) + cimp.path_fix_case(c_file) return ffi.string(c_file) end @@ -456,41 +510,41 @@ describe('more path function', function() itp('joins given paths with a slash', function() local path1 = cstr(100, 'path1') local to_append = to_cstr('path2') - eq(OK, (path.append_path(path1, to_append, 100))) + eq(OK, (cimp.append_path(path1, to_append, 100))) eq("path1/path2", (ffi.string(path1))) end) itp('joins given paths without adding an unnecessary slash', function() local path1 = cstr(100, 'path1/') local to_append = to_cstr('path2') - eq(OK, path.append_path(path1, to_append, 100)) + eq(OK, cimp.append_path(path1, to_append, 100)) eq("path1/path2", (ffi.string(path1))) end) itp('fails and uses filename if there is not enough space left for to_append', function() local path1 = cstr(11, 'path1/') local to_append = to_cstr('path2') - eq(FAIL, (path.append_path(path1, to_append, 11))) + eq(FAIL, (cimp.append_path(path1, to_append, 11))) end) itp('does not append a slash if to_append is empty', function() local path1 = cstr(6, 'path1') local to_append = to_cstr('') - eq(OK, (path.append_path(path1, to_append, 6))) + eq(OK, (cimp.append_path(path1, to_append, 6))) eq('path1', (ffi.string(path1))) end) itp('does not append unnecessary dots', function() local path1 = cstr(6, 'path1') local to_append = to_cstr('.') - eq(OK, (path.append_path(path1, to_append, 6))) + eq(OK, (cimp.append_path(path1, to_append, 6))) eq('path1', (ffi.string(path1))) end) itp('copies to_append to path, if path is empty', function() local path1 = cstr(7, '') local to_append = to_cstr('/path2') - eq(OK, (path.append_path(path1, to_append, 7))) + eq(OK, (cimp.append_path(path1, to_append, 7))) eq('/path2', (ffi.string(path1))) end) end) @@ -498,7 +552,7 @@ describe('more path function', function() describe('path_is_absolute_path', function() local function path_is_absolute_path(filename) filename = to_cstr(filename) - return path.path_is_absolute_path(filename) + return cimp.path_is_absolute_path(filename) end itp('returns true if filename starts with a slash', function() diff --git a/test/unit/strings_spec.lua b/test/unit/strings_spec.lua index 3bc3dc7130..e54c82b26a 100644 --- a/test/unit/strings_spec.lua +++ b/test/unit/strings_spec.lua @@ -99,3 +99,42 @@ describe('vim_strnsave_unquoted()', function() eq('/Program\\nFiles/sh', vim_strnsave_unquoted('/Program"\\n"Files/sh')) end) end) + +describe('vim_strchr()', function() + local vim_strchr = function(s, c) + local str = to_cstr(s) + local res = strings.vim_strchr(str, c) + if res == nil then + return nil + else + return res - str + end + end + itp('handles NUL and <0 correctly', function() + eq(nil, vim_strchr('abc', 0)) + eq(nil, vim_strchr('abc', -1)) + end) + itp('works', function() + eq(0, vim_strchr('abc', ('a'):byte())) + eq(1, vim_strchr('abc', ('b'):byte())) + eq(2, vim_strchr('abc', ('c'):byte())) + eq(0, vim_strchr('a«b»c', ('a'):byte())) + eq(3, vim_strchr('a«b»c', ('b'):byte())) + eq(6, vim_strchr('a«b»c', ('c'):byte())) + + eq(nil, vim_strchr('«»', ('«'):byte())) + -- 0xAB == 171 == '«' + eq(nil, vim_strchr('\171', 0xAB)) + eq(0, vim_strchr('«»', 0xAB)) + eq(3, vim_strchr('„«»“', 0xAB)) + + eq(7, vim_strchr('„«»“', 0x201C)) + eq(nil, vim_strchr('„«»“', 0x201D)) + eq(0, vim_strchr('„«»“', 0x201E)) + + eq(0, vim_strchr('\244\143\188\128', 0x10FF00)) + eq(2, vim_strchr('«\244\143\188\128»', 0x10FF00)) + -- |0xDBFF |0xDF00 - surrogate pair for 0x10FF00 + eq(nil, vim_strchr('«\237\175\191\237\188\128»', 0x10FF00)) + end) +end) |