stdio_spec.lua
Branches > main > latest > files / nvim / pack / plugins / opt / conjure / lua / conjure-spec / client / scheme / stdio_spec.lua
-- [nfnl] fnl/conjure-spec/client/scheme/stdio_spec.fnl
local _local_1_ = require("conjure.nfnl.module")
local autoload = _local_1_.autoload
local _local_2_ = require("plenary.busted")
local describe = _local_2_.describe
local it = _local_2_.it
local assert = autoload("luassert.assert")
local a = autoload("conjure.nfnl.core")
local scheme = require("conjure.client.scheme.stdio")
local config = autoload("conjure.config")
local mock_stdio = require("conjure-spec.client.scheme.mock-stdio")
local mock_tsc = require("conjure-spec.mock-tree-sitter-completions")
local mock_log = require("conjure-spec.mock-log")
package.loaded["conjure.tree-sitter-completions"] = mock_tsc
package.loaded["conjure.log"] = mock_log
local function _3_()
package.loaded["conjure.remote.stdio"] = mock_stdio
local function _4_()
local function _5_()
return assert.same({"; (out) number after, with space: 1"}, scheme["format-msg"]({out = "number after, with space: 1"}))
end
it("preserves Chez output ending in a space and number", _5_)
local function _6_()
return assert.same({"; (out) first line", "; (out) 42"}, scheme["format-msg"](scheme.unbatch({{out = "first line\n"}, {out = "42"}})))
end
it("preserves a final numeric line in batched output", _6_)
local function _7_()
return assert.same({"42"}, scheme["format-msg"]({out = ";Value: 42"}))
end
return it("preserves numeric MIT Scheme values", _7_)
end
describe("format-msg", _4_)
local function _8_()
local key = "conjure#client#scheme#stdio#value_prefix_pattern"
local previous = vim.g[key]
vim.g[key] = false
local actual = scheme["format-msg"]({out = "number: 1\n42\n"})
vim.g[key] = previous
return assert.same({"number: 1", "42"}, actual)
end
it("preserves Chez numeric output with value prefixes disabled", _8_)
local function _9_()
local function _10_()
for _, prompt in ipairs({"1 ]=> ", "12 error> "}) do
for _0, split in ipairs({0, 1, 2, 3}) do
local msgs = {{out = ("number: 42\n" .. string.sub(prompt, 1, split))}, {out = string.sub(prompt, (split + 1))}}
local lines = scheme["format-msg"](scheme.unbatch(msgs))
assert.same({"; (out) number: 42"}, lines)
end
end
return nil
end
return it("removes normal and error prompt levels after joining split reads", _10_)
end
describe("prompt cleanup", _9_)
local function _11_()
return assert.same({"42"}, scheme["format-msg"](scheme.unbatch({{out = ";Value: 42\n\n1 "}, {out = "]=> "}})))
end
it("keeps the MIT value as the final result without a prompt blank line", _11_)
local function _12_()
local key = "conjure#client#scheme#stdio#prompt_pattern"
local previous = vim.g[key]
vim.g[key] = "^> "
scheme.start()
local opts = mock_stdio["get-last-opts"]()
local actual = scheme["format-msg"]({out = "number: 42"})
scheme.stop()
vim.g[key] = previous
assert.same("^> ", opts["prompt-pattern"])
assert.is_false(opts["preserve-prompt?"])
return assert.same({"; (out) number: 42"}, actual)
end
it("keeps custom prompt stripping in the transport", _12_)
local function _13_()
local command_key = "conjure#client#scheme#stdio#command"
local prompt_key = "conjure#client#scheme#stdio#prompt_pattern"
local previous_command = vim.g[command_key]
local previous_prompt = vim.g[prompt_key]
vim.g[command_key] = "petite"
vim.g[prompt_key] = "> $?"
scheme.start()
local opts = mock_stdio["get-last-opts"]()
local output = "number after, without space:1\nnumber after, with space: 1\n> "
local stripped = string.gsub(output, opts["prompt-pattern"], "")
local actual = scheme["format-msg"]({out = stripped})
scheme.stop()
vim.g[command_key] = previous_command
vim.g[prompt_key] = previous_prompt
assert.same("petite", opts.cmd)
assert.same("> $?", opts["prompt-pattern"])
assert.is_false(opts["preserve-prompt?"])
return assert.same({"; (out) number after, without space:1", "; (out) number after, with space: 1", "; (out) "}, actual)
end
it("preserves the reported output with the original Chez quick-start settings", _13_)
local function _14_()
local command_key = "conjure#client#scheme#stdio#command"
local prompt_key = "conjure#client#scheme#stdio#prompt_pattern"
local value_key = "conjure#client#scheme#stdio#value_prefix_pattern"
local previous_command = vim.g[command_key]
local previous_prompt = vim.g[prompt_key]
local previous_value = vim.g[value_key]
vim.g[command_key] = "petite"
vim.g[prompt_key] = ">+ "
vim.g[value_key] = false
scheme.start()
local opts = mock_stdio["get-last-opts"]()
local results
local function _15_(prompt)
return scheme["format-msg"]({out = string.gsub(("number after, without space:1\nnumber after, with space: 1\n" .. prompt), opts["prompt-pattern"], "")})
end
results = a.map(_15_, {"> ", ">> ", ">>> "})
scheme.stop()
vim.g[command_key] = previous_command
vim.g[prompt_key] = previous_prompt
vim.g[value_key] = previous_value
assert.is_false(opts["preserve-prompt?"])
for _, actual in ipairs(results) do
assert.same({"number after, without space:1", "number after, with space: 1"}, actual)
end
return nil
end
it("preserves numbers with nested Chez prompts and value prefixes disabled", _14_)
local function _16_()
local expected_code = "(some code)"
local send_calls = {}
local mock_send
local function _17_(val)
return table.insert(send_calls, val)
end
mock_send = _17_
local function _18_(_)
return true
end
scheme["valid-str?"] = _18_
mock_stdio["set-mock-send"](mock_send)
scheme.start()
assert.is_true(mock_stdio["get-last-opts"]()["preserve-prompt?"])
scheme["eval-str"]({code = expected_code})
scheme.stop()
return assert.same({(expected_code .. "\n")}, send_calls)
end
it("eval-str sends code to repl when parses", _16_)
local function _19_()
local send_calls = {}
local mock_send
local function _20_(val)
return table.insert(send_calls, val)
end
mock_send = _20_
local function _21_(_)
return false
end
scheme["valid-str?"] = _21_
mock_stdio["set-mock-send"](mock_send)
scheme.start()
scheme["eval-str"]({code = "(some invalid form"})
scheme.stop()
return assert.same({}, send_calls)
end
return it("eval-str does not send code to repl when valid-str? returns false", _19_)
end
local function _22_()
local function _23_()
local completion_results = {}
local completion_callback
local function _24_(res)
return table.insert(completion_results, res)
end
completion_callback = _24_
mock_tsc["set-mock-completions"]({})
scheme.completions({prefix = "dela", cb = completion_callback})
return assert.same({"delay"}, completion_results[1])
end
it("returns delay for prefix dela when no treesitter completions", _23_)
local function _25_()
local completion_results = {}
local completion_callback
local function _26_(res)
return table.insert(completion_results, res)
end
completion_callback = _26_
mock_tsc["set-mock-completions"]({"delta", "other"})
scheme.completions({prefix = "delt", cb = completion_callback})
return assert.same({"delta"}, completion_results[1])
end
it("returns delta for prefix delt when treesitter completion delta and other", _25_)
local function _27_()
local completion_results = {}
local completion_callback
local function _28_(res)
return table.insert(completion_results, res)
end
completion_callback = _28_
mock_tsc["set-mock-completions"]({"delay-more"})
scheme.completions({prefix = "dela", cb = completion_callback})
return assert.same({"delay-more", "delay"}, completion_results[1])
end
it("returns delay-more and delay for prefix dela when treesitter completion delay-more", _27_)
local function _29_()
local completion_results = {}
local completion_callback
local function _30_(res)
return table.insert(completion_results, res)
end
completion_callback = _30_
mock_tsc["set-mock-completions"]({"delta"})
scheme.completions({prefix = nil, cb = completion_callback})
return assert.same("delta", a["get-in"](completion_results, {1, 1}))
end
return it("returns delta as first result for prefix nil when treesitter completion delta", _29_)
end
local function _31_()
local function _32_()
config.merge({client = {scheme = {stdio = {enable_completions = false}}}}, {["overwrite?"] = true})
local completion_results = {}
local completion_callback
local function _33_(res)
return table.insert(completion_results, res)
end
completion_callback = _33_
mock_tsc["set-mock-completions"]({"delay"})
scheme.completions({prefix = "dela", cb = completion_callback})
return assert.same({}, completion_results[1])
end
it("returns empty list for completions when completions disabled", _32_)
local function _34_()
config.merge({client = {scheme = {stdio = {enable_completions = true}}}}, {["overwrite?"] = true})
local completion_results = {}
local completion_callback
local function _35_(res)
return table.insert(completion_results, res)
end
completion_callback = _35_
mock_tsc["set-mock-completions"]({"delay-more"})
scheme.completions({prefix = "dela", cb = completion_callback})
return assert.same({"delay-more", "delay"}, completion_results[1])
end
return it("returns delay delay-more for completions when completions enabled and tree sitter completion delay-more", _34_)
end
return describe("conjure.client.scheme.stdio", _3_, describe("completions", _22_), describe("config", _31_))