-- gonkgo test local M = {} local utils = require('go.utils') local log = utils.log local vfn = vim.fn local long_opts = { verbose = 'v', compile = 'c', tags = 't', bench = 'b', select = 's', floaterm = 'F', } local getopt = require('go.alt_getopt') local short_opts = 'vct:bsF' local function get_build_tags(args) local tags = {} local optarg = getopt.get_opts(args, short_opts, long_opts) if optarg['t'] then table.insert(tags, optarg['t']) end if _GO_NVIM_CFG.build_tags ~= '' then table.insert(tags, _GO_NVIM_CFG.build_tags) end if #tags == 0 then return '' end return [[-tags=]] .. table.concat(tags, ',') end local function find_describe(lines) local describe local pat = [[Describe%(%".*%",%sfunc]] local despat = [[%(%".*%"]] for i = #lines, 1, -1 do local line = lines[i] local fs, fe = string.find(line, pat) if fs then line = string.sub(line, fs + #'Describe', fe) fs, fe = string.find(line, despat) if fs ~= nil then if fe - fs <= 2 then return nil end describe = line:sub(fs + 2, fe - 1) return describe end end end -- It pat = [[It%(%".*%",%sfunc]] for i = #lines, 1, -1 do local line = lines[i] local fs, fe = string.find(line, pat) if fs then line = string.sub(line, fs + #'It', fe) fs, fe = string.find(line, despat) if fs ~= nil then if fe - fs <= 2 then return nil end describe = line:sub(fs + 2, fe - 1) return describe end end end pat = [[Context%(%".*%",%sfunc]] for i = #lines, 1, -1 do local line = lines[i] local fs, fe = string.find(line, pat) if fs then line = string.sub(line, fs + #'Context', fe) fs, fe = string.find(line, despat) if fs ~= nil then if fe - fs <= 2 then return nil end describe = line:sub(fs + 2, fe - 1) return describe end end end return nil end -- print(find_describe({ -- [[ var _ = Describe("Integration test hourly data EstimateCombinedRules without ws ID", func() { ]] -- })) -- Run with ginkgo Description M.test_func = function(...) local args = { ... } log(args) local optarg = getopt.get_opts(args, short_opts, long_opts) local fpath = vfn.expand('%:p:h') local row, col = unpack(vim.api.nvim_win_get_cursor(0)) row, col = row, col + 1 local fnum = row - 3 if fnum < 0 then fnum = 0 end local lines = vim.api.nvim_buf_get_lines(0, fnum, row + 1, true) local describe = find_describe(lines) log('testing: ', describe) if describe == nil then log('failed to find test function, test file instead') return M.test_file(args) end local test_runner = 'ginkgo' require('go.install').install(test_runner) -- local cmd = { test_runner, [[ --focus=']] .. describe .. [[']], get_build_tags(args), fpath } local cmd = { test_runner, [[ --focus-file=']] .. describe .. [[']], get_build_tags(args), fpath } log(cmd) if _GO_NVIM_CFG.run_in_floaterm then local term = require('go.term').run term({ cmd = cmd, autoclose = false }) return end cmd = [[setl makeprg=]] .. test_runner vim.cmd(cmd) args = { [[ --focus-file=']] .. describe .. [[']], get_build_tags(args), fpath } require('go.asyncmake').make(unpack(args)) utils.log('test cmd', cmd) return true end M.test_file = function(...) local args = { ... } log(args) -- require sed local fpath = vfn.expand('%:p:h') local fname = vfn.expand('%:p') log(fpath, fname) local workfolder = utils.work_path() fname = '.' .. fname:sub(#workfolder + 1) log(workfolder, fname) local test_runner = 'ginkgo' require('go.install').install(test_runner) local cmd_args = { -- [[--regexScansFilePath=true]], v1 get_build_tags(args), [[ --focus-file= ]], fname, fpath, } if _GO_NVIM_CFG.run_in_floaterm then table.insert(cmd_args, 1, test_runner) utils.log(args) local term = require('go.term').run term({ cmd = cmd_args, autoclose = false }) return end fname = utils.relative_to_cwd(fname) .. [[\ ]] vim.cmd('setl makeprg=ginkgo') utils.log('test cmd', cmd_args) require('go.asyncmake').make(unpack(cmd_args)) end return M