diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 3aef9cdc..4516645c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,28 +6,31 @@ on: - master jobs: - ubuntu: - runs-on: ubuntu-latest + test: + name: Run Test + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest] steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Setup build dependencies - run: | - sudo apt update && - sudo apt install -y ninja-build \ - gettext \ - cmake \ - g++ \ - unzip - - name: Run test with building Nvim - run: make test - macos: - runs-on: macos-latest - steps: - - name: Checkout sources - uses: actions/checkout@v3 - - name: Setup build dependencies - run: brew install ninja - - name: Run test with building Nvim - run: make test + - uses: actions/checkout@v3 + - uses: rhysd/action-setup-vim@v1 + id: vim + with: + neovim: true + version: nightly + - name: luajit + uses: leafo/gh-actions-lua@v8 + with: + luaVersion: "luajit-2.1.0-beta3" + + - name: luarocks + uses: leafo/gh-actions-luarocks@v4 + + - name: run test + shell: bash + run: | + luarocks install luacheck + luarocks install vusted + vusted ./test diff --git a/Makefile b/Makefile index 15aa212c..74715e6b 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ test: - sh ./scripts/run_test.sh + vusted ./test lint: @printf "\nRunning luacheck\n" diff --git a/scripts/run_test.sh b/scripts/run_test.sh deleted file mode 100644 index 7221ef80..00000000 --- a/scripts/run_test.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh - -PJ_ROOT=$(pwd) - -if [ ! -d ./neovim ]; then - git clone --depth 1 https://github.com/neovim/neovim -fi - -cd ./neovim - -make functionaltest \ - BUSTED_ARGS="--lpath=$PJ_ROOT/?.lua --lpath=$PJ_ROOT/lua/?.lua --lpath=$PJ_ROOT/lua/lspconfig/?.lua" \ - TEST_FILE="../test/lspconfig_spec.lua" diff --git a/selene.toml b/selene.toml index c85e792c..deeb3976 100644 --- a/selene.toml +++ b/selene.toml @@ -3,3 +3,4 @@ std = "neovim" [rules] global_usage = "allow" multiple_statements = "allow" +incorrect_standard_library_use = "allow" diff --git a/test/lspconfig_spec.lua b/test/lspconfig_spec.lua index 1df3464a..aab4f4ba 100644 --- a/test/lspconfig_spec.lua +++ b/test/lspconfig_spec.lua @@ -1,362 +1,282 @@ -local helpers = require 'test.functional.helpers'(after_each) -local clear = helpers.clear -local exec_lua = helpers.exec_lua -local eq = helpers.eq -local ok = helpers.ok - -before_each(function() - clear() - -- add plugin module path to package.path in Lua runtime in Nvim - exec_lua( - [[ - package.path = ... - ]], - package.path - ) -end) +local root = vim.fn.getcwd() describe('lspconfig', function() + local eq = assert.are.equal + local same = assert.are.same + + before_each(function() + vim.api.nvim_command('cd ' .. root) + end) + describe('util', function() describe('path', function() describe('escape_wildcards', function() it('doesnt escape if not needed', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - return lspconfig.util.path.escape_wildcards('/usr/local/test/fname.lua') == '/usr/local/test/fname.lua' - ]]) + local res = lspconfig.util.path.escape_wildcards '/usr/local/test/fname.lua' + eq('/usr/local/test/fname.lua', res) end) it('escapes if needed', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - return lspconfig.util.path.escape_wildcards('/usr/local/test/[sq brackets] fname?*.lua') == '/usr/local/test/\\[sq brackets\\] fname\\?\\*.lua' - ]]) + local res = lspconfig.util.path.escape_wildcards '/usr/local/test/[sq brackets] fname?*.lua' + eq('/usr/local/test/\\[sq brackets\\] fname\\?\\*.lua', res) end) end) describe('exists', function() it('is present directory', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - local cwd = vim.fn.getcwd() - return not (lspconfig.util.path.exists(cwd) == false) - ]]) + local cwd = vim.fn.getcwd() + eq(true, lspconfig.util.path.exists(cwd) ~= false) end) it('is not present directory', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - - local not_exist_dir = vim.fn.getcwd().."/not/exists" - return lspconfig.util.path.exists(not_exist_dir) == false - ]]) + local lspconfig = require 'lspconfig' + local not_exist_dir = vim.fn.getcwd() .. '/not/exists' + eq(true, lspconfig.util.path.exists(not_exist_dir) == false) end) it('is present file', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/") - local file = vim.fn.getcwd().."/root_marker.txt" - - return not (lspconfig.util.path.exists(file) == false) - ]]) + local lspconfig = require 'lspconfig' + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/' + local file = vim.fn.getcwd() .. '/root_marker.txt' + eq(true, lspconfig.util.path.exists(file) ~= false) end) it('is not present file', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/") - local file = vim.fn.getcwd().."/not_exists.txt" - - return lspconfig.util.path.exists(file) == false - ]]) + local lspconfig = require 'lspconfig' + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/' + local file = vim.fn.getcwd() .. '/not_exists.txt' + assert.is_false(lspconfig.util.path.exists(file)) end) end) describe('is_dir', function() it('is directory', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - - local cwd = vim.fn.getcwd() - return lspconfig.util.path.is_dir(cwd) - ]]) + local lspconfig = require 'lspconfig' + local cwd = vim.fn.getcwd() + assert.is_true(lspconfig.util.path.is_dir(cwd)) end) it('is not present directory', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - - local not_exist_dir = vim.fn.getcwd().."/not/exists" - return not lspconfig.util.path.is_dir(not_exist_dir) - ]]) + local lspconfig = require 'lspconfig' + local not_exist_dir = vim.fn.getcwd() .. '/not/exists' + eq(true, not lspconfig.util.path.is_dir(not_exist_dir)) end) it('is file', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/") - local file = vim.fn.getcwd().."/root_marker.txt" + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/' + local file = vim.fn.getcwd() .. '/root_marker.txt' - return not lspconfig.util.path.is_dir(file) - ]]) + eq(true, not lspconfig.util.path.is_dir(file)) end) end) describe('is_file', function() it('is file', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/") - local file = vim.fn.getcwd().."/root_marker.txt" + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/' + local file = vim.fn.getcwd() .. '/root_marker.txt' - return lspconfig.util.path.is_file(file) - ]]) + eq(true, lspconfig.util.path.is_file(file)) end) it('is not present file', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/") - local file = vim.fn.getcwd().."/not_exists.txt" + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/' + local file = vim.fn.getcwd() .. '/not_exists.txt' - return not lspconfig.util.path.is_file(file) - ]]) + eq(true, not lspconfig.util.path.is_file(file)) end) it('is directory', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - local cwd = vim.fn.getcwd() - return not lspconfig.util.path.is_file(cwd) - ]]) + local cwd = vim.fn.getcwd() + eq(true, not lspconfig.util.path.is_file(cwd)) end) end) describe('is_absolute', function() it('is absolute', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - return not (lspconfig.util.path.is_absolute("/foo/bar") == nil) - ]]) + local lspconfig = require 'lspconfig' + eq(true, lspconfig.util.path.is_absolute '/foo/bar' ~= nil) end) it('is not absolute', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - return lspconfig.util.path.is_absolute("foo/bar") == nil - ]]) - - ok(exec_lua [[ - local lspconfig = require("lspconfig") - return lspconfig.util.path.is_absolute("../foo/bar") == nil - ]]) + local lspconfig = require 'lspconfig' + assert.is_nil(lspconfig.util.path.is_absolute 'foo/bar') + assert.is_nil(lspconfig.util.path.is_absolute '../foo/bar') end) end) describe('join', function() it('', function() - eq( - exec_lua [[ - local lspconfig = require("lspconfig") - return lspconfig.util.path.join("foo", "bar", "baz") - ]], - 'foo/bar/baz' - ) + local lspconfig = require 'lspconfig' + local res = lspconfig.util.path.join('foo', 'bar', 'baz') + eq('foo/bar/baz', res) end) end) end) describe('root_pattern', function() it('resolves to a_marker.txt', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/a") - local cwd = vim.fn.getcwd() - return cwd == lspconfig.util.root_pattern({"root_marker.txt", "a_marker.txt"})(cwd) - ]]) + local lspconfig = require 'lspconfig' + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/a' + local cwd = vim.fn.getcwd() + eq(true, cwd == lspconfig.util.root_pattern { 'root_marker.txt', 'a_marker.txt' }(cwd)) end) it('resolves to root_marker.txt', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") + local lspconfig = require 'lspconfig' - -- change the working directory to test directory - vim.api.nvim_command("cd ../test/test_dir/a") + -- change the working directory to test directory + vim.api.nvim_command 'cd ./test/test_dir/a' - local cwd = vim.fn.getcwd() - local resolved = lspconfig.util.root_pattern({"root_marker.txt"})(cwd) - vim.api.nvim_command("cd ..") + local cwd = vim.fn.getcwd() + local resolved = lspconfig.util.root_pattern { 'root_marker.txt' }(cwd) + vim.api.nvim_command 'cd ..' - return vim.fn.getcwd() == resolved - ]]) + eq(true, vim.fn.getcwd() == resolved) end) end) describe('strip_archive_subpath', function() it('strips zipfile subpaths', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - return lspconfig.util.strip_archive_subpath("zipfile:///one/two.zip::three/four") == "/one/two.zip" - ]]) + local lspconfig = require 'lspconfig' + local res = lspconfig.util.strip_archive_subpath 'zipfile:///one/two.zip::three/four' + eq('/one/two.zip', res) end) it('strips tarfile subpaths', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - return lspconfig.util.strip_archive_subpath("tarfile:/one/two.tgz::three/four") == "/one/two.tgz" - ]]) + local lspconfig = require 'lspconfig' + local res = lspconfig.util.strip_archive_subpath 'tarfile:/one/two.tgz::three/four' + eq('/one/two.tgz', res) end) it('returns non-archive paths as-is', function() - ok(exec_lua [[ - local lspconfig = require("lspconfig") - return lspconfig.util.strip_archive_subpath("/one/two.zip") == "/one/two.zip" - ]]) + local lspconfig = require 'lspconfig' + local res = lspconfig.util.strip_archive_subpath '/one/two.zip' + eq('/one/two.zip', res) end) end) describe('user commands', function() it('should translate command definition to nvim_create_user_command options', function() - eq( - { - nargs = '*', - complete = 'custom,v:lua.some_global', - }, - exec_lua [[ - local util = require("lspconfig.util") - return util._parse_user_command_options({ - function () end, - "-nargs=* -complete=custom,v:lua.some_global" - }) - ]] - ) + local util = require 'lspconfig.util' + local res = util._parse_user_command_options { + function() end, + '-nargs=* -complete=custom,v:lua.some_global', + } - eq( - { - desc = 'My awesome description.', - nargs = '*', - complete = 'custom,v:lua.another_global', - }, - exec_lua [[ - local util = require("lspconfig.util") - return util._parse_user_command_options({ - function () end, - ["-nargs"] = "*", - "-complete=custom,v:lua.another_global", - description = "My awesome description." - }) - ]] - ) + same({ + nargs = '*', + complete = 'custom,v:lua.some_global', + }, res) + + res = util._parse_user_command_options { + function() end, + ['-nargs'] = '*', + '-complete=custom,v:lua.another_global', + description = 'My awesome description.', + } + same({ + desc = 'My awesome description.', + nargs = '*', + complete = 'custom,v:lua.another_global', + }, res) end) end) end) describe('config', function() it('normalizes user, server, and base default configs', function() - eq( - exec_lua [[ - local lspconfig = require("lspconfig") - local configs = require("lspconfig.configs") + local lspconfig = require 'lspconfig' + local configs = require 'lspconfig.configs' - local actual = nil - lspconfig.util.on_setup = function(config) - actual = config - end + local actual = nil + lspconfig.util.on_setup = function(config) + actual = config + end - lspconfig.util.default_config = { + lspconfig.util.default_config = { + foo = { + bar = { + val1 = 'base1', + val2 = 'base2', + }, + }, + } + + local server_config = { + default_config = { foo = { bar = { - val1 = 'base1', - val2 = 'base2', - }, - }, - } - - local server_config = { - default_config = { - foo = { - bar = { - val2 = 'server2', - val3 = 'server3', - }, - baz = 'baz', - }, - }, - } - - local user_config = { - foo = { - bar = { - val3 = 'user3', - val4 = 'user4', - } - }, - } - - configs['test'] = server_config - configs['test'].setup(user_config) - return actual - ]], - { - foo = { - bar = { - val1 = 'base1', val2 = 'server2', - val3 = 'user3', - val4 = 'user4', + val3 = 'server3', }, baz = 'baz', }, - name = 'test', - } - ) + }, + } + + local user_config = { + foo = { + bar = { + val3 = 'user3', + val4 = 'user4', + }, + }, + } + + configs['test'] = server_config + configs['test'].setup(user_config) + same({ + foo = { + bar = { + val1 = 'base1', + val2 = 'server2', + val3 = 'user3', + val4 = 'user4', + }, + baz = 'baz', + }, + name = 'test', + }, actual) + configs['test'] = nil end) it("excludes indexed server configs that haven't been set up", function() - eq( - exec_lua [[ - local lspconfig = require("lspconfig") - local actual = nil - local _ = lspconfig.lua_ls - local _ = lspconfig.tsserver - lspconfig.rust_analyzer.setup {} - return require("lspconfig.util").available_servers() - ]], - { 'rust_analyzer' } - ) + local lspconfig = require 'lspconfig' + local _ = lspconfig.lua_ls + local _ = lspconfig.tsserver + lspconfig.rust_analyzer.setup {} + same({ 'rust_analyzer' }, require('lspconfig.util').available_servers()) end) it('provides user_config to the on_setup hook', function() - eq( - exec_lua [[ - local lspconfig = require "lspconfig" - local util = require "lspconfig.util" - local user_config - util.on_setup = function (_, _user_config) - user_config = _user_config - end - lspconfig.rust_analyzer.setup { custom_user_config = "custom" } - return user_config - ]], - { - custom_user_config = 'custom', - } - ) + local lspconfig = require 'lspconfig' + local util = require 'lspconfig.util' + local user_config + util.on_setup = function(_, conf) + user_config = conf + end + lspconfig.rust_analyzer.setup { custom_user_config = 'custom' } + same({ + custom_user_config = 'custom', + }, user_config) end) end) end)