diff options
| -rw-r--r-- | test/unit/helpers.moon | 33 | ||||
| -rw-r--r-- | test/unit/misc1.moon | 24 | ||||
| -rw-r--r-- | test/unit/os/fs.moon | 20 | 
3 files changed, 45 insertions, 32 deletions
| 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 = 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 +  header_file = io.open path, 'rb' + +  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); +]] -describe 'fs function', -> +-- import constants parsed by ffi +{:OK, :FAIL} = lib -  export OK = 1 -  export FAIL = 0 +describe 'fs function', ->    describe 'mch_dirname', -> -    ffi.cdef 'int mch_dirname(char *buf, int len);'      mch_dirname = (buf, len) ->        fs.mch_dirname buf, len | 
