--- /dev/null
+local eq = assert.are.same
+local diagnostics
+
+describe("ale.diagnostics.send", function()
+ local buffer_map
+ local signs_config
+ local diagnostic_set_calls
+
+ setup(function()
+ _G.vim = {
+ api = {
+ nvim_buf_get_var = function(buffer, key)
+ local buffer_table = buffer_map[buffer] or {}
+ local value = buffer_table[key]
+
+ if value == nil then
+ error(key .. " is missing")
+ end
+
+ return value
+ end,
+ nvim_create_namespace = function()
+ return 42
+ end,
+ },
+ diagnostic = {
+ severity = {ERROR = 1, WARN = 2, INFO = 3},
+ config = function()
+ return {signs = signs_config}
+ end,
+ set = function(namespace, bufnr, _diagnostics, opts)
+ table.insert(diagnostic_set_calls, {
+ namespace = namespace,
+ bufnr = bufnr,
+ diagnostics = _diagnostics,
+ opts = opts,
+ })
+ end,
+ },
+ tbl_extend = function(behavior, ...)
+ assert(behavior == "force", "We should only use `force`")
+
+ local merged = {}
+
+ for _, arg in ipairs({...}) do
+ for key, value in pairs(arg) do
+ merged[key] = value
+ end
+ end
+
+ return merged
+ end,
+ g = {},
+ }
+
+ diagnostics = require("ale.diagnostics")
+ end)
+
+ teardown(function()
+ _G.vim = nil
+ end)
+
+ before_each(function()
+ buffer_map = {}
+ diagnostic_set_calls = {}
+ signs_config = false
+ _G.vim.g = {}
+ end)
+
+ it("should set an empty list of diagnostics correctly", function()
+ diagnostics.send(7, {})
+
+ eq(
+ {
+ {
+ namespace = 42,
+ bufnr = 7,
+ diagnostics = {},
+ opts = {virtual_text = false}
+ },
+ },
+ diagnostic_set_calls
+ )
+ end)
+
+ it("should handle basic case with all fields", function()
+ diagnostics.send(1, {
+ {
+ bufnr = 1,
+ lnum = 2,
+ end_lnum = 3,
+ col = 4,
+ end_col = 5,
+ type = "W",
+ code = "123",
+ text = "Warning message",
+ linter_name = "eslint",
+ },
+ })
+ eq({
+ {
+ lnum = 1,
+ end_lnum = 2,
+ col = 3,
+ end_col = 5,
+ severity = vim.diagnostic.severity.WARN,
+ code = "123",
+ message = "Warning message",
+ source = "eslint",
+ },
+ }, diagnostic_set_calls[1].diagnostics)
+ end)
+
+ it("should default end_lnum to lnum when missing", function()
+ diagnostics.send(1, {
+ {
+ bufnr = 1,
+ lnum = 5,
+ col = 2,
+ end_col = 8,
+ type = "E",
+ text = "Error message",
+ linter_name = "mylinter",
+ },
+ })
+ eq({
+ {
+ lnum = 4,
+ end_lnum = 4,
+ col = 1,
+ end_col = 8,
+ severity = vim.diagnostic.severity.ERROR,
+ code = nil,
+ message = "Error message",
+ source = "mylinter",
+ },
+ }, diagnostic_set_calls[1].diagnostics)
+ end)
+
+ it("should default col to 0 when missing", function()
+ diagnostics.send(1, {
+ {
+ bufnr = 1,
+ lnum = 10,
+ end_lnum = 12,
+ end_col = 6,
+ type = "I",
+ text = "Info message",
+ },
+ })
+ eq({
+ {
+ lnum = 9,
+ end_lnum = 11,
+ col = 0,
+ end_col = 6,
+ severity = vim.diagnostic.severity.INFO,
+ code = nil,
+ message = "Info message",
+ source = nil,
+ },
+ }, diagnostic_set_calls[1].diagnostics)
+ end)
+
+ it("should ignore non-matching buffers", function()
+ diagnostics.send(1, {
+ {
+ bufnr = 2,
+ lnum = 1,
+ end_lnum = 2,
+ col = 1,
+ end_col = 4,
+ type = "W",
+ text = "Message",
+ },
+ })
+ eq({}, diagnostic_set_calls[1].diagnostics)
+ end)
+
+ for _, set_signs_value in ipairs {1, true} do
+ describe("signs with setting set_signs = " .. tostring(set_signs_value), function()
+ before_each(function()
+ _G.vim.g.ale_set_signs = set_signs_value
+ _G.vim.g.ale_sign_priority = 10
+ end)
+
+ it("and global config as `false` should enable signs with the given priority", function()
+ diagnostics.send(7, {})
+ eq({priority = 10}, diagnostic_set_calls[1].opts.signs)
+ end)
+
+ it("and global config as a table should enable signs with the given priority", function()
+ signs_config = {foo = "bar", priority = 5}
+ diagnostics.send(7, {})
+ eq(
+ {foo = "bar", priority = 10},
+ diagnostic_set_calls[1].opts.signs
+ )
+ end)
+
+ it("and global config as a function should enable signs with the given priority", function()
+ signs_config = function()
+ return {foo = "bar", priority = 5}
+ end
+ diagnostics.send(7, {})
+
+ local local_signs = diagnostic_set_calls[1].opts.signs
+
+ eq("function", type(local_signs))
+ eq({foo = "bar", priority = 10}, local_signs())
+ end)
+ end)
+ end
+
+ it("should toggle virtual_text correctly", function()
+ for _, value in ipairs({"all", "2", 2, "current", "1", 1, true}) do
+ diagnostic_set_calls = {}
+ _G.vim.g.ale_virtualtext_cursor = value
+ diagnostics.send(7, {})
+
+ eq({virtual_text = true}, diagnostic_set_calls[1].opts)
+ end
+
+ for _, value in ipairs({"disabled", "0", 0, false, nil}) do
+ diagnostic_set_calls = {}
+ _G.vim.g.ale_virtualtext_cursor = value
+ diagnostics.send(7, {})
+
+ eq({virtual_text = false}, diagnostic_set_calls[1].opts)
+ end
+ end)
+end)