aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorJędrzej Boczar <yendreij@gmail.com>2021-04-22 23:46:30 +0200
committerKiyan <yazdani.kiyan@protonmail.com>2021-04-23 21:21:38 +0200
commitdbb1550aaf9223d85636b863468ba82d182c088b (patch)
tree7c5d888034db464625d5372c12757f1846cbd651 /tests
parenttests/indent: move the run helper functions to top-level (diff)
downloadnvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.tar
nvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.tar.gz
nvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.tar.bz2
nvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.tar.lz
nvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.tar.xz
nvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.tar.zst
nvim-treesitter-dbb1550aaf9223d85636b863468ba82d182c088b.zip
tests/indent: move common code out of main lua/ directory
Diffstat (limited to 'tests')
-rw-r--r--tests/indent/c_spec.lua4
-rw-r--r--tests/indent/common.lua125
-rw-r--r--tests/indent/cpp_spec.lua4
-rw-r--r--tests/indent/lua_spec.lua4
-rw-r--r--tests/indent/python_spec.lua4
-rw-r--r--tests/indent/rust_spec.lua4
6 files changed, 135 insertions, 10 deletions
diff --git a/tests/indent/c_spec.lua b/tests/indent/c_spec.lua
index 1089ee4eb..f93d7ee22 100644
--- a/tests/indent/c_spec.lua
+++ b/tests/indent/c_spec.lua
@@ -1,5 +1,5 @@
-local whole_file = require('nvim-treesitter.test_utils').indent_whole_file
-local new_line = require('nvim-treesitter.test_utils').indent_new_line
+local whole_file = require('tests.indent.common').indent_whole_file
+local new_line = require('tests.indent.common').indent_new_line
local scan_dir = require('plenary.scandir').scan_dir
local opts = {
diff --git a/tests/indent/common.lua b/tests/indent/common.lua
new file mode 100644
index 000000000..96caf17f9
--- /dev/null
+++ b/tests/indent/common.lua
@@ -0,0 +1,125 @@
+local M = {}
+
+local assert = require('luassert')
+local say = require('say')
+
+local function same_indent(state, arguments)
+ local before = arguments[1]
+ local after = arguments[2]
+
+ local ok = true
+ local errors = { before = {}, after = {} }
+ for line = 1,#before do
+ if before[line] ~= after[line] then
+ -- store the actual indentation length for each line
+ errors.before[line] = #string.match(before[line], '^%s*')
+ errors.after[line] = #string.match(after[line], '^%s*')
+ ok = false
+ end
+ end
+
+ -- we will always use only a single argument, passing the other one in fmtargs
+ arguments.fmtargs = { { errors = errors, other = after } }
+ arguments.fmtargs[2] = { errors = errors, other = after }
+
+ return ok
+end
+
+local function format_indent(arg, fmtargs)
+ -- find minimal width if any line is longer
+ local width = 40
+ for _, line in ipairs(fmtargs.other) do
+ width = #line > width and #line or width
+ end
+
+ width = width + 3
+ local header_fmt = '%8s %2s%-' .. tostring(width + 1) .. 's %s'
+ local fmt = '%8s %2s |%-' .. tostring(width) .. 's |%s'
+
+ local output = {header_fmt:format('', '', 'Found:', 'Expected:')}
+
+ for i, line in ipairs(arg) do
+ if fmtargs.errors.before[i] then
+ local indents = string.format('%d vs %d', fmtargs.errors.after[i], fmtargs.errors.before[i])
+ table.insert(output, fmt:format(indents, '=>', fmtargs.other[i], line))
+ else
+ table.insert(output, fmt:format('', '', fmtargs.other[i], line))
+ end
+ end
+
+ return table.concat(output, '\n')
+end
+
+say:set_namespace('en')
+say:set('assertion.same_indent.positive', 'Incorrect indentation\n%s')
+say:set('assertion.same_indent.negative', 'Incorrect indentation\n%s')
+assert:register('assertion', 'same_indent', same_indent,
+ 'assertion.same_indent.positive', 'assert.same_indent.negative')
+
+-- Custom assertion better suited for indentation diffs
+local function compare_indent(before, after)
+ assert:add_formatter(format_indent)
+ assert.is.same_indent(before, after)
+ assert:remove_formatter(format_indent)
+end
+
+local function set_buf_indent_opts(opts)
+ local optnames = {'tabstop', 'shiftwidth', 'softtabstop', 'expandtab', 'filetype'}
+ for _, opt in ipairs(optnames) do
+ if opts[opt] ~= nil then
+ vim.bo[opt] = opts[opt]
+ end
+ end
+end
+
+function M.run_indent_test(file, runner, opts)
+ assert.are.same(1, vim.fn.filereadable(file))
+
+ -- load reference file
+ vim.cmd(string.format('edit %s', file))
+ local before = vim.api.nvim_buf_get_lines(0, 0, -1, true)
+
+ assert.are.same('nvim_treesitter#indent()', vim.bo.indentexpr)
+ set_buf_indent_opts(opts)
+
+ -- perform the test
+ runner()
+
+ -- get file content after the test
+ local after = vim.api.nvim_buf_get_lines(0, 0, -1, true)
+
+ -- clear any changes to avoid 'No write since last change (add ! to override)'
+ vim.cmd 'edit!'
+
+ return before, after
+end
+
+function M.indent_whole_file(file, opts)
+ local before, after = M.run_indent_test(file, function()
+ vim.cmd 'silent normal gg=G'
+ end, opts)
+
+ compare_indent(before, after)
+end
+
+-- Open a file, use `normal o` to insert a new line and compare results
+-- @param file path to the initial file
+-- @param spec a table with keys:
+-- on_line: line on which `normal o` is executed
+-- text: text inserted in the new line
+-- indent: expected indent before the inserted text (string or int)
+-- @param opts buffer options passed to set_buf_indent_opts
+function M.indent_new_line(file, spec, opts)
+ local before, after = M.run_indent_test(file, function()
+ -- move to the line and input the new one
+ vim.cmd(string.format('normal! %dG', spec.on_line))
+ vim.cmd(string.format('normal! o%s', spec.text))
+ end, opts)
+
+ local indent = type(spec.indent) == 'string' and spec.indent or string.rep(' ', spec.indent)
+ table.insert(before, spec.on_line + 1, indent .. spec.text)
+
+ compare_indent(before, after)
+end
+
+return M
diff --git a/tests/indent/cpp_spec.lua b/tests/indent/cpp_spec.lua
index 261c00499..b3a7e7454 100644
--- a/tests/indent/cpp_spec.lua
+++ b/tests/indent/cpp_spec.lua
@@ -1,5 +1,5 @@
-local whole_file = require('nvim-treesitter.test_utils').indent_whole_file
-local new_line = require('nvim-treesitter.test_utils').indent_new_line
+local whole_file = require('tests.indent.common').indent_whole_file
+local new_line = require('tests.indent.common').indent_new_line
local scan_dir = require('plenary.scandir').scan_dir
local Path = require('plenary.path')
diff --git a/tests/indent/lua_spec.lua b/tests/indent/lua_spec.lua
index 0a6a3b29a..b1d3bfae2 100644
--- a/tests/indent/lua_spec.lua
+++ b/tests/indent/lua_spec.lua
@@ -1,5 +1,5 @@
-local whole_file = require('nvim-treesitter.test_utils').indent_whole_file
-local new_line = require('nvim-treesitter.test_utils').indent_new_line
+local whole_file = require('tests.indent.common').indent_whole_file
+local new_line = require('tests.indent.common').indent_new_line
local scan_dir = require('plenary.scandir').scan_dir
local opts = {
diff --git a/tests/indent/python_spec.lua b/tests/indent/python_spec.lua
index 85c3bc3bf..9bb80c2b2 100644
--- a/tests/indent/python_spec.lua
+++ b/tests/indent/python_spec.lua
@@ -1,5 +1,5 @@
-local whole_file = require('nvim-treesitter.test_utils').indent_whole_file
-local new_line = require('nvim-treesitter.test_utils').indent_new_line
+local whole_file = require('tests.indent.common').indent_whole_file
+local new_line = require('tests.indent.common').indent_new_line
local scan_dir = require('plenary.scandir').scan_dir
local opts = {
diff --git a/tests/indent/rust_spec.lua b/tests/indent/rust_spec.lua
index 6009c7fb8..468abe004 100644
--- a/tests/indent/rust_spec.lua
+++ b/tests/indent/rust_spec.lua
@@ -1,5 +1,5 @@
-local whole_file = require('nvim-treesitter.test_utils').indent_whole_file
-local new_line = require('nvim-treesitter.test_utils').indent_new_line
+local whole_file = require('tests.indent.common').indent_whole_file
+local new_line = require('tests.indent.common').indent_new_line
local scan_dir = require('plenary.scandir').scan_dir
local opts = {