ffi_spec.lua 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. local t = require('test.testutil')
  2. local n = require('test.functional.testnvim')()
  3. local eq = t.eq
  4. local exec_lua = n.exec_lua
  5. local clear = n.clear
  6. before_each(clear)
  7. describe('ffi.cdef', function()
  8. it('can use Neovim core functions', function()
  9. if not exec_lua("return pcall(require, 'ffi')") then
  10. pending('missing LuaJIT FFI')
  11. end
  12. eq(
  13. 12,
  14. exec_lua(function()
  15. local ffi = require('ffi')
  16. ffi.cdef [[
  17. typedef struct window_S win_T;
  18. int win_col_off(win_T *wp);
  19. extern win_T *curwin;
  20. ]]
  21. vim.cmd('set number numberwidth=4 signcolumn=yes:4')
  22. return ffi.C.win_col_off(ffi.C.curwin)
  23. end)
  24. )
  25. eq(
  26. 20,
  27. exec_lua(function()
  28. local ffi = require('ffi')
  29. ffi.cdef [[
  30. typedef struct {} stl_hlrec_t;
  31. typedef struct {} StlClickRecord;
  32. typedef struct {} statuscol_T;
  33. typedef struct {} Error;
  34. win_T *find_window_by_handle(int Window, Error *err);
  35. int build_stl_str_hl(
  36. win_T *wp,
  37. char *out,
  38. size_t outlen,
  39. char *fmt,
  40. int opt_idx,
  41. int opt_scope,
  42. int fillchar,
  43. int maxwidth,
  44. stl_hlrec_t **hltab,
  45. StlClickRecord **tabtab,
  46. statuscol_T *scp
  47. );
  48. ]]
  49. return ffi.C.build_stl_str_hl(
  50. ffi.C.find_window_by_handle(0, ffi.new('Error')),
  51. ffi.new('char[1024]'),
  52. 1024,
  53. ffi.cast('char*', 'StatusLineOfLength20'),
  54. -1,
  55. 0,
  56. 0,
  57. 0,
  58. nil,
  59. nil,
  60. nil
  61. )
  62. end)
  63. )
  64. -- Check that extern symbols are exported and accessible
  65. eq(
  66. true,
  67. exec_lua(function()
  68. local ffi = require('ffi')
  69. ffi.cdef('uint64_t display_tick;')
  70. return ffi.C.display_tick >= 0
  71. end)
  72. )
  73. end)
  74. end)