diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..ad95f48 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,39 @@ +name: Run Tests + +on: + push: + branches: [ "*" ] + pull_request: + branches: [ main ] + +jobs: + test: + + runs-on: ubuntu-latest + + steps: + - name: Checkout Code + uses: actions/checkout@v3 + + - name: Install Make Dependencies + run: | + sudo apt-get update + sudo apt-get install libtool-bin autoconf automake cmake g++ pkg-config unzip gettext curl -y + + - name: Install Neovim + run: | + sudo snap install nvim --classic + + - name: Install Plenary + run: | + git clone https://github.com/nvim-lua/plenary.nvim.git + mkdir -p .local/share/nvim/lazy/ + mv plenary.nvim .local/share/nvim/lazy/ + + - name: Run Tests + env: + XDG_CONFIG_HOME: ${{ github.workspace }}/.config + XDG_DATA_HOME: ${{ github.workspace }}/.local/share + XDG_STATE_HOME: ${{ github.workspace }}/.local/state + XDG_CACHE_HOME: ${{ github.workspace }}/.cache + run: make test diff --git a/Makefile b/Makefile index fe134cd..3d8fa51 100644 --- a/Makefile +++ b/Makefile @@ -3,8 +3,6 @@ TESTS_DIR=tests .PHONY: test -# TODO I want test to contain a lua-language-server pass - test_nvim: @nvim \ --headless \ @@ -13,7 +11,7 @@ test_nvim: -c "PlenaryBustedDirectory ${TESTS_DIR} { minimal_init = '${TESTS_INIT}' }" test: - -$(MAKE) test_nvim || exit 1 + $(MAKE) test_nvim test-watch: - nodemon -e lua -x "$(MAKE) test" + nodemon -e lua -x "$(MAKE) test || exit 1" diff --git a/README.md b/README.md index 81a10cb..471f0de 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,8 @@ Moving slowly, showing each command { "aaronik/treewalker.nvim", opts = { - highlight = true -- default is false; can also be a duration + highlight = true -- briefly highlight the node after jumping to it + -- can be numeric to specify highlight duration instead } } ``` diff --git a/lua/treewalker/init.lua b/lua/treewalker/init.lua index 8a2365a..be56fad 100644 --- a/lua/treewalker/init.lua +++ b/lua/treewalker/init.lua @@ -8,8 +8,11 @@ local Treewalker = {} ---@alias Opts { highlight: boolean | integer } +-- Default setup() options ---@type Opts -Treewalker.opts = {} +Treewalker.opts = { + highlight = true +} ---@param opts Opts | nil function Treewalker.setup(opts) diff --git a/lua/treewalker/nodes.lua b/lua/treewalker/nodes.lua index 7fdc6db..eea05c2 100644 --- a/lua/treewalker/nodes.lua +++ b/lua/treewalker/nodes.lua @@ -102,6 +102,27 @@ function M.get_descendants(node) return descendants end +---@param node TSNode +---@return TSNode +function M.get_farthest_ancestor_with_same_srow(node) + local node_row = node:range() + local farthest_ancestor = node + local iter_row = node:range() + local iter = node:parent() + + + while iter do + iter_row = iter:range() + if iter_row ~= node_row then + break + end + farthest_ancestor = iter + iter = iter:parent() + end + + return farthest_ancestor +end + --- Take a list of nodes and unique them based on line start ---@param nodes TSNode[] ---@return TSNode[] diff --git a/lua/treewalker/util.lua b/lua/treewalker/util.lua index 5a9b25f..75110e9 100644 --- a/lua/treewalker/util.lua +++ b/lua/treewalker/util.lua @@ -98,12 +98,6 @@ M.guid = function() end) end ----@param env_key string ----@return boolean -M.has_env_var = function(env_key) - return type(os.getenv(env_key)) ~= type(nil) -end - ---reverse an array table ---@param t table M.reverse = function (t) diff --git a/plugin/init.lua b/plugin/init.lua index fc1a3f5..388e7ef 100644 --- a/plugin/init.lua +++ b/plugin/init.lua @@ -1,6 +1,5 @@ -local util = require "treewalker.util" - local function tw() + -- local util = require "treewalker.util" -- return util.R('treewalker') return require('treewalker') end diff --git a/tests/minimal_init.lua b/tests/minimal_init.lua index 1117c70..c8be46f 100644 --- a/tests/minimal_init.lua +++ b/tests/minimal_init.lua @@ -2,13 +2,6 @@ local lazypath = vim.fn.stdpath("data") .. "/lazy" vim.notify = print vim.opt.rtp:append(".") vim.opt.rtp:append(lazypath .. "/plenary.nvim") -vim.opt.rtp:append(lazypath .. "/nui.nvim") -vim.opt.rtp:append(lazypath .. "/telescope.nvim") --- vim.opt.rtp:append(lazypath .. "/nvim-nio") - --- -- Get all our normal plugins into the test env --- local suite = os.getenv("SUITE") --- vim.opt.rtp:append(suite .. "nvim") vim.opt.swapfile = false diff --git a/tests/treewalker/acceptance_spec.lua b/tests/treewalker/acceptance_spec.lua index 62feccd..c68abea 100644 --- a/tests/treewalker/acceptance_spec.lua +++ b/tests/treewalker/acceptance_spec.lua @@ -79,7 +79,8 @@ describe("Treewalker", function() end) it("respects highlight config option", function() - spy.on(ops, "highlight") + vim.wait(250 + 5) -- wait out potential "buf_clear" calls queue up from previous tests + local highlight = spy.on(ops, "highlight") local bufclear = spy.on(vim.api, "nvim_buf_clear_namespace") -- 'nvim_buf_clear_namespace' should be called times @@ -92,55 +93,62 @@ describe("Treewalker", function() assert.spy(bufclear).was.called(calls) end - treewalker.setup() + highlight:clear() + treewalker.setup() -- highlight defaults to true, doesn't blow up with empty setup vim.fn.cursor(23, 5) treewalker.move_out() treewalker.move_down() treewalker.move_up() treewalker.move_in() - assert.spy(ops.highlight).was.not_called() + assert.spy(highlight).was.called(4) + assert_bufclears_after(250, 4) + highlight:clear() treewalker.setup({ highlight = 0 }) vim.fn.cursor(23, 5) treewalker.move_out() treewalker.move_down() treewalker.move_up() treewalker.move_in() - assert.spy(ops.highlight).was.not_called() + assert.spy(highlight).was.not_called() + highlight:clear() treewalker.setup({ highlight = false }) vim.fn.cursor(23, 5) treewalker.move_out() treewalker.move_down() treewalker.move_up() treewalker.move_in() - assert.spy(ops.highlight).was.not_called() + assert.spy(highlight).was.not_called() + highlight:clear() treewalker.setup({ highlight = true }) vim.fn.cursor(23, 5) treewalker.move_out() treewalker.move_down() treewalker.move_up() treewalker.move_in() - assert.spy(ops.highlight).was.called(4) + assert.spy(highlight).was.called(4) assert_bufclears_after(250, 4) + highlight:clear() treewalker.setup({ highlight = 50 }) vim.fn.cursor(23, 5) treewalker.move_out() treewalker.move_down() treewalker.move_up() treewalker.move_in() - assert.spy(ops.highlight).was.called(8) + assert.spy(highlight).was.called(4) assert_bufclears_after(50, 4) + highlight:clear() treewalker.setup({ highlight = 500 }) vim.fn.cursor(23, 5) treewalker.move_out() treewalker.move_down() treewalker.move_up() treewalker.move_in() - assert.spy(ops.highlight).was.called(12) + assert.spy(highlight).was.called(4) assert_bufclears_after(500, 4) end) end) diff --git a/tests/treewalker/util_spec.lua b/tests/treewalker/util_spec.lua index 0e569ad..163941b 100644 --- a/tests/treewalker/util_spec.lua +++ b/tests/treewalker/util_spec.lua @@ -91,19 +91,6 @@ describe("util", function() end) end) - describe("ensure_env_var", function() - it("returns true", function() - -- always set - local res = util.has_env_var("SHELL") - assert.is_true(res) - end) - - it("returns false", function() - local res = util.has_env_var("IM_SUPER_SURE_THIS_ENV_VAR_WONT_BE_SET_FR_FR") - assert.is_false(res) - end) - end) - describe("reverse", function() it("reverses an array table", function() local t = { 1, 2, 3, 4, 5 }