diff --git a/test/unit/helpers.moon b/test/unit/helpers.moon index 5705db88a6..c12a6473f6 100644 --- a/test/unit/helpers.moon +++ b/test/unit/helpers.moon @@ -3,24 +3,27 @@ ffi = require 'ffi' -- load neovim shared library libnvim = ffi.load './build/src/libnvim-test.so' --- Luajit ffi parser only understands function signatures. --- This helper function normalizes headers, passes to ffi and returns the --- library pointer +-- Luajit ffi parser doesn't understand preprocessor directives, so +-- this helper function removes common directives before passing it the to ffi. +-- It will return a pointer to the library table, emulating 'requires' cimport = (path) -> - -- Can't parse some of vim types, perhaps need to define those before - -- automatically importing to ffi + header_file = io.open path, 'rb' - -- header_file = io.open path, 'rb' - -- header = header_file\read '*a' - -- header_file.close! - -- header = string.gsub header, '#include[^\n]*\n', '' - -- header = string.gsub header, '#ifndef[^\n]*\n', '' - -- header = string.gsub header, '#define[^\n]*\n', '' - -- header = string.gsub header, '#endif[^\n]*\n', '' - -- ffi.cdef header + if not header_file + error "cannot find #{path}" + + header = header_file\read '*a' + header_file.close! + header = string.gsub header, '#include[^\n]*\n', '' + header = string.gsub header, '#ifndef[^\n]*\n', '' + header = string.gsub header, '#define[^\n]*\n', '' + header = string.gsub header, '#endif[^\n]*\n', '' + ffi.cdef header return libnvim +cimport './src/types.h' + -- take a pointer to a C-allocated string and return an interned -- version while also freeing the memory internalize = (cdata) -> @@ -32,4 +35,6 @@ return { internalize: internalize eq: (expected, actual) -> assert.are.same expected, actual ffi: ffi + lib: libnvim + cstr: ffi.typeof 'char[?]' } diff --git a/test/unit/misc1.moon b/test/unit/misc1.moon index a795b03dd9..d67f867913 100644 --- a/test/unit/misc1.moon +++ b/test/unit/misc1.moon @@ -1,13 +1,21 @@ -{:cimport, :internalize, :eq, :ffi} = require 'test.unit.helpers' +{:cimport, :internalize, :eq, :ffi, :lib, :cstr} = require 'test.unit.helpers' -misc1 = cimport './src/misc1.h' -cstr = ffi.typeof 'char[?]' +--misc1 = cimport './src/misc1.h' --- TODO extract constants from vim.h +-- remove these statements once 'cimport' is working properly for misc1.h +misc1 = lib +ffi.cdef [[ +enum FPC { + FPC_SAME = 1, FPC_DIFF = 2, FPC_NOTX = 4, FPC_DIFFX = 6, FPC_SAMEX = 7 +}; +int fullpathcmp(char_u *s1, char_u *s2, int checkname); +]] + +-- import constants parsed by ffi +{:FPC_SAME, :FPC_DIFF, :FPC_NOTX, :FPC_DIFFX, :FPC_SAMEX} = lib describe 'misc1 function', -> describe 'fullpathcmp', -> - ffi.cdef 'int fullpathcmp(char *s1, char *s2, int checkname);' fullpathcmp = (s1, s2, cn) -> s1 = cstr (string.len s1) + 1, s1 @@ -17,12 +25,6 @@ describe 'misc1 function', -> f1 = 'f1.o' f2 = 'f2.o' - FPC_SAME = 1 - FPC_DIFF = 2 - FPC_NOTX = 4 - FPC_DIFFX = 6 - FPC_SAMEX = 7 - before_each -> -- create the three files that will be used in this spec (io.open f1, 'w').close! diff --git a/test/unit/os/fs.moon b/test/unit/os/fs.moon index 60805eb488..f9457b31ef 100644 --- a/test/unit/os/fs.moon +++ b/test/unit/os/fs.moon @@ -1,16 +1,22 @@ -{:cimport, :internalize, :eq, :ffi} = require 'test.unit.helpers' +{:cimport, :internalize, :eq, :ffi, :lib, :cstr} = require 'test.unit.helpers' require 'lfs' -fs = cimport './src/fs.h' -cstr = ffi.typeof 'char[?]' +-- fs = cimport './src/os/os.h' +-- remove these statements once 'cimport' is working properly for misc1.h +fs = lib +ffi.cdef [[ +enum OKFAIL { + OK = 1, FAIL = 0 +}; +int mch_dirname(char_u *buf, int len); +]] + +-- import constants parsed by ffi +{:OK, :FAIL} = lib describe 'fs function', -> - export OK = 1 - export FAIL = 0 - describe 'mch_dirname', -> - ffi.cdef 'int mch_dirname(char *buf, int len);' mch_dirname = (buf, len) -> fs.mch_dirname buf, len