neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

testutil.lua (3198B)


      1 local t = require('test.unit.testutil')
      2 
      3 local ffi = t.ffi
      4 local cimport = t.cimport
      5 local kvi_new = t.kvi_new
      6 local kvi_init = t.kvi_init
      7 local conv_enum = t.conv_enum
      8 local make_enum_conv_tab = t.make_enum_conv_tab
      9 
     10 local lib = cimport('./src/nvim/viml/parser/expressions.h')
     11 
     12 local function new_pstate(strings)
     13  local strings_idx = 0
     14  local function get_line(_, ret_pline)
     15    strings_idx = strings_idx + 1
     16    local str = strings[strings_idx]
     17    local data, size
     18    if type(str) == 'string' then
     19      data = str
     20      size = #str
     21    elseif type(str) == 'nil' then
     22      data = nil
     23      size = 0
     24    elseif type(str) == 'table' then
     25      data = str.data
     26      size = str.size
     27    elseif type(str) == 'function' then
     28      data, size = str()
     29      size = size or 0
     30    end
     31    ret_pline.data = data
     32    ret_pline.size = size
     33    ret_pline.allocated = false
     34  end
     35  local state = {
     36    reader = {
     37      get_line = get_line,
     38      cookie = nil,
     39      conv = {
     40        vc_type = 0,
     41        vc_factor = 1,
     42        vc_fail = false,
     43      },
     44    },
     45    pos = { line = 0, col = 0 },
     46    colors = kvi_new('ParserHighlight'),
     47    can_continuate = false,
     48  }
     49  local ret = ffi.new('ParserState', state)
     50  kvi_init(ret.reader.lines)
     51  kvi_init(ret.stack)
     52  return ret
     53 end
     54 
     55 local function pline2lua(pline)
     56  return ffi.string(pline.data, pline.size)
     57 end
     58 
     59 local function pstate_str(pstate, start, len)
     60  local str = nil
     61  local err = nil
     62  if start.line < pstate.reader.lines.size then
     63    local pstr = pline2lua(pstate.reader.lines.items[start.line])
     64    if start.col >= #pstr then
     65      err = 'start.col >= #pstr'
     66    else
     67      str = pstr:sub(tonumber(start.col) + 1, tonumber(start.col + len))
     68    end
     69  else
     70    err = 'start.line >= pstate.reader.lines.size'
     71  end
     72  return str, err
     73 end
     74 
     75 local function pstate_set_str(pstate, start, len, ret)
     76  ret = ret or {}
     77  ret.start = {
     78    line = tonumber(start.line),
     79    col = tonumber(start.col),
     80  }
     81  ret.len = tonumber(len)
     82  ret.str, ret.error = pstate_str(pstate, start, len)
     83  return ret
     84 end
     85 
     86 local eltkn_cmp_type_tab
     87 make_enum_conv_tab(
     88  lib,
     89  {
     90    'kExprCmpEqual',
     91    'kExprCmpMatches',
     92    'kExprCmpGreater',
     93    'kExprCmpGreaterOrEqual',
     94    'kExprCmpIdentical',
     95  },
     96  'kExprCmp',
     97  function(ret)
     98    eltkn_cmp_type_tab = ret
     99  end
    100 )
    101 
    102 local function conv_cmp_type(typ)
    103  return conv_enum(eltkn_cmp_type_tab, typ)
    104 end
    105 
    106 local ccs_tab
    107 make_enum_conv_tab(
    108  lib,
    109  {
    110    'kCCStrategyUseOption',
    111    'kCCStrategyMatchCase',
    112    'kCCStrategyIgnoreCase',
    113  },
    114  'kCCStrategy',
    115  function(ret)
    116    ccs_tab = ret
    117  end
    118 )
    119 
    120 local function conv_ccs(ccs)
    121  return conv_enum(ccs_tab, ccs)
    122 end
    123 
    124 local expr_asgn_type_tab
    125 make_enum_conv_tab(
    126  lib,
    127  {
    128    'kExprAsgnPlain',
    129    'kExprAsgnAdd',
    130    'kExprAsgnSubtract',
    131    'kExprAsgnConcat',
    132  },
    133  'kExprAsgn',
    134  function(ret)
    135    expr_asgn_type_tab = ret
    136  end
    137 )
    138 
    139 local function conv_expr_asgn_type(expr_asgn_type)
    140  return conv_enum(expr_asgn_type_tab, expr_asgn_type)
    141 end
    142 
    143 return {
    144  conv_ccs = conv_ccs,
    145  pline2lua = pline2lua,
    146  pstate_str = pstate_str,
    147  new_pstate = new_pstate,
    148  conv_cmp_type = conv_cmp_type,
    149  pstate_set_str = pstate_set_str,
    150  conv_expr_asgn_type = conv_expr_asgn_type,
    151 }