diff options
| -rw-r--r-- | lua/mason-core/installer/context/init.lua | 6 | ||||
| -rw-r--r-- | tests/mason-core/installer/context_spec.lua | 37 |
2 files changed, 43 insertions, 0 deletions
diff --git a/lua/mason-core/installer/context/init.lua b/lua/mason-core/installer/context/init.lua index 44490782..b22c562b 100644 --- a/lua/mason-core/installer/context/init.lua +++ b/lua/mason-core/installer/context/init.lua @@ -109,6 +109,12 @@ function InstallContext:chdir(rel_path, fn) end end +---@async +---@param fn fun(resolve: fun(result: any), reject: fun(error: any)) +function InstallContext:await(fn) + return a.wait(fn) +end + ---@param new_executable_rel_path string Relative path to the executable file to create. ---@param script_rel_path string Relative path to the Node.js script. function InstallContext:write_node_exec_wrapper(new_executable_rel_path, script_rel_path) diff --git a/tests/mason-core/installer/context_spec.lua b/tests/mason-core/installer/context_spec.lua index d753c05f..ad469e08 100644 --- a/tests/mason-core/installer/context_spec.lua +++ b/tests/mason-core/installer/context_spec.lua @@ -1,7 +1,9 @@ +local a = require "mason-core.async" local match = require "luassert.match" local path = require "mason-core.path" local pypi = require "mason-core.installer.managers.pypi" local registry = require "mason-registry" +local spy = require "luassert.spy" local stub = require "luassert.stub" local test_helpers = require "mason-test.helpers" @@ -247,4 +249,39 @@ cmd.exe /C echo %GREETING% %*]] assert.equals([[Cannot write PHP exec wrapper for path "some/obscure/path/cli.php" as it doesn't exist.]], err) assert.spy(ctx.write_shell_exec_wrapper).was_called(0) end) + + it("should await callback-style async function", function() + local value = a.run_blocking(function() + local ctx = test_helpers.create_context() + return ctx:execute(function() + return ctx:await(function(resolve, reject) + vim.defer_fn(function() + resolve "Value!" + end, 500) + end) + end) + end) + + assert.equals("Value!", value) + end) + + it("should propagate errors in callback-style async function", function() + local guard = spy.new() + local error = assert.has_error(function() + a.run_blocking(function() + local ctx = test_helpers.create_context() + return ctx:execute(function() + ctx:await(function(resolve, reject) + vim.defer_fn(function() + reject "Error!" + end, 500) + end) + guard() + end) + end) + end) + + assert.equals("Error!", error) + assert.spy(guard).was_called(0) + end) end) |
