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 }