diff --git a/.busted b/.busted new file mode 100644 index 0000000..eed67fb --- /dev/null +++ b/.busted @@ -0,0 +1,16 @@ +return { + _all = { + coverage = false, + lua = "./test/nvim-shim", + }, + default = { + verbose = true, + }, + unit = { + ROOT = { "./test/unit/" }, + }, + -- e2e = { + -- ROOT = {'./test/e2e/'}, + -- pattern = '', -- No fancy names for E2E tests + -- }, +} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..9b78f7e --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: test +on: [pull_request, workflow_dispatch] +jobs: + lua: + strategy: + matrix: + version: [stable, nightly] + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: neovim setup + uses: rhysd/action-setup-vim@v1 + with: + neovim: true + version: ${{ matrix.version }} + - uses: pkgxdev/setup@v1 + with: + +: luajit.org luarocks.org + - name: install busted + run: luarocks install busted + - name: run tests + run: make unit-test diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a76deee --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +test/xdg diff --git a/.luarc.json b/.luarc.json new file mode 100644 index 0000000..8c8662d --- /dev/null +++ b/.luarc.json @@ -0,0 +1,4 @@ +{ + "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", + "workspace.ignoreDir": ["test/xdg"] +} diff --git a/.nvimrc b/.nvimrc new file mode 100644 index 0000000..c7a30dc --- /dev/null +++ b/.nvimrc @@ -0,0 +1,2 @@ +" Use the custom shim as the busted binary for testing +let g:bustedprg='./test/busted' diff --git a/.pkgx.yml b/.pkgx.yml new file mode 100644 index 0000000..999e0ca --- /dev/null +++ b/.pkgx.yml @@ -0,0 +1,3 @@ +dependencies: + - luajit.org + - luarocks.org diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..5950d87 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +.PHONY: check unit-test e2e-test clean + +check: unit-test e2e-test + +unit-test: + @./test/busted --run unit + +# e2e-test: +# @./test/busted --run e2e + +clean: + @rm -rf test/xdg/local/state/nvim/* + @rm -rf test/xdg/local/share/nvim/site/pack/testing/start/nvim-treesitter/parser/* + @# The symlink might have been left over from a failed test run + @rm -rf test/xdg/local/share/nvim/site/pack/self-* diff --git a/test/busted b/test/busted new file mode 100755 index 0000000..f1b7ce3 --- /dev/null +++ b/test/busted @@ -0,0 +1,34 @@ +#!/bin/sh +# SPDX-License-Identifier: Unlicense + +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or distribute +# this software, either in source code form or as a compiled binary, for any +# purpose, commercial or non-commercial, and by any means. +# +# In jurisdictions that recognize copyright laws, the author or authors of +# this software dedicate any and all copyright interest in the software to +# the public domain. We make this dedication for the benefit of the public +# at large and to the detriment of our heirs and successors. We intend this +# dedication to be an overt act of relinquishment in perpetuity of all +# present and future rights to this software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# For more information, please refer to + +# A shim which acts as a command-line interface adapter for the busted test +# framework. If busted is installed using LuaRocks we cannot invoke it +# directly, but some tools might want to do so. This thin adapter can be used +# as a drop-in replacement for the busted executable. + +export LUA_PATH="./lua/?.lua;;" +export LUA_CPATH="./lua/?.so;;" + +eval $(luarocks path --lua-version 5.1 --bin) && $HOME/.luarocks/bin/busted $@ diff --git a/test/nvim-shim b/test/nvim-shim new file mode 100755 index 0000000..d53b4cf --- /dev/null +++ b/test/nvim-shim @@ -0,0 +1,71 @@ +#!/bin/sh +# SPDX-License-Identifier: Unlicense + +# This is free and unencumbered software released into the public domain. +# +# Anyone is free to copy, modify, publish, use, compile, sell, or distribute +# this software, either in source code form or as a compiled binary, for any +# purpose, commercial or non-commercial, and by any means. +# +# In jurisdictions that recognize copyright laws, the author or authors of +# this software dedicate any and all copyright interest in the software to +# the public domain. We make this dedication for the benefit of the public +# at large and to the detriment of our heirs and successors. We intend this +# dedication to be an overt act of relinquishment in perpetuity of all +# present and future rights to this software under copyright law. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# For more information, please refer to + + +# A shim which acts as a command-line interface adapter to use Neovim as a Lua +# interpreter. + +# Set custom XDG base directory paths to isolate the test Neovim from the +# user's own configuration and data files. +export XDG_CONFIG_HOME='test/xdg/config/' +export XDG_STATE_HOME='test/xdg/local/state/' +export XDG_DATA_HOME='test/xdg/local/share/' + +# Handle Lua command-line arguments; not all options are supported +while getopts 'ilEve:' opt; do + case $opt in + e) lua_expr=$OPTARG;; + v) nvim --version; exit;; + i | l | E) echo "Option '$opt' not supported by shim"; exit 1;; + esac +done + + +# We need to add this plugin to the custom configuration. The easiest way is +# to create a symlink. Why not always have a symlink in the project? The Lua +# language server will search for Lua files in every directory, so if it enters +# the symlink it will be trapped in a cycle. What we do instead is create the +# symlink only for the duration of a test session and remove it again +# afterwards. + +# We need separate symlinks if we want to run different tasks in parallel. +# Otherwise the one the finishes first would delete the symlink from underneath +# the one that is still running. +uuid=$(uuidgen) +mkdir -p ${XDG_DATA_HOME}/nvim/site/pack/self-${uuid}/start/ +ln -fs $(pwd) ${XDG_DATA_HOME}/nvim/site/pack/self-${uuid}/start/ + +if [ -n "$lua_expr" ]; then + nvim --headless -c "lua $lua_expr" -c 'quitall!' +else + # We have to explicitly enable plugins, see ':h -l' + nvim --cmd 'set loadplugins' -l $@ +fi + +exit_code=$? + +rm -rf ${XDG_DATA_HOME}/nvim/site/pack/self-${uuid}/ + +exit $exit_code diff --git a/test/unit/yolo_spec.lua b/test/unit/yolo_spec.lua new file mode 100644 index 0000000..3c1a9b6 --- /dev/null +++ b/test/unit/yolo_spec.lua @@ -0,0 +1,11 @@ +describe("Dummy test", function() + print(vim.fn.getcwd()) + + it("asserts not nil", function() + assert.is_not_nil(true) + end) + + it("asserts True", function() + assert.is_nil(true) + end) +end)