local t0 = std.time.millis()
local ok1, err1 = pcall(function()
std.task.with_timeout(20, function(scope)
scope:spawn(function()
std.task.sleep(1000) end)
std.task.sleep(1000)
end)
end)
local elapsed1 = std.time.millis() - t0
print("timeout_abort_raises=" .. tostring((not ok1) and tostring(err1):find("exceeded") ~= nil))
print("timeout_abort_bounded=" .. tostring(elapsed1 < 300))
local a_grandchild_ran = false
local b_inner_child_ran = false
std.task.scope("outer", function(scope_outer)
scope_outer:spawn(function()
std.task.sleep(10)
std.task.yield()
local gh = std.task.spawn(function()
a_grandchild_ran = true
return "a_done"
end)
gh:join()
end)
scope_outer:spawn(function()
std.task.scope("inner_b", function(scope_inner)
scope_inner:spawn(function()
std.task.sleep(5)
b_inner_child_ran = true
end)
end)
end)
end)
print("a_grandchild_ran=" .. tostring(a_grandchild_ran))
print("b_inner_child_ran=" .. tostring(b_inner_child_ran))
local ok3, err3 = pcall(function()
std.task.spawn(function() return 1 end, { drivr = "coroutine" })
end)
print("unknown_opts_rejected=" .. tostring((not ok3) and tostring(err3):find("unknown opts key") ~= nil))
local ok4, err4 = pcall(function() std.task.sleep(1/0) end)
print("sleep_rejects_inf=" .. tostring((not ok4) and tostring(err4):find("invalid duration") ~= nil))
local cr_t0 = std.time.millis()
std.task.scope(function(scope)
scope:spawn(function()
coroutine.yield(1000) end, { driver = "coroutine" })
std.task.sleep(20)
scope:cancel()
end)
local cr_elapsed = std.time.millis() - cr_t0
print("coro_cancel_bounded=" .. tostring(cr_elapsed < 300))
local ok_nname, err_nname = pcall(function()
std.task.spawn(function() return 1 end, { name = 123 })
end)
print("opts_name_non_string_rejected=" .. tostring((not ok_nname) and tostring(err_nname):find("opts.name") ~= nil))
local ok_ndrv, err_ndrv = pcall(function()
std.task.spawn(function() return 1 end, { driver = 42 })
end)
print("opts_driver_non_string_rejected=" .. tostring((not ok_ndrv) and tostring(err_ndrv):find("opts.driver") ~= nil))
local ok_intk, err_intk = pcall(function()
std.task.spawn(function() return 1 end, { [1] = "foo" })
end)
print("opts_non_string_key_rejected=" .. tostring((not ok_intk) and tostring(err_intk):find("opts keys must be strings") ~= nil))
local h_afn = std.task.spawn(function() return 7 end, { driver = "async_fn" })
print("driver_async_fn_alias_ok=" .. tostring(h_afn:join() == 7))
local h_a = std.task.spawn(function() return 8 end, { driver = "async" })
print("driver_async_alias_ok=" .. tostring(h_a:join() == 8))
local gz_t0 = std.time.millis()
local ok_gz = pcall(function()
std.task.with_timeout(20, function(scope)
scope:spawn(function() std.task.sleep(1000) end)
std.task.sleep(1000)
end, { grace_ms = 0 })
end)
local gz_elapsed = std.time.millis() - gz_t0
print("grace_zero_raises=" .. tostring(not ok_gz))
print("grace_zero_bounded=" .. tostring(gz_elapsed < 100))
local cleanup_ran = false
pcall(function()
std.task.with_timeout(20, function(scope)
scope:spawn(function()
pcall(function() std.task.sleep(1000) end) cleanup_ran = true end)
std.task.sleep(1000)
end, { grace_ms = 200 })
end)
print("cleanup_ran=" .. tostring(cleanup_ran))
local ok_uo, err_uo = pcall(function()
std.task.with_timeout(10, function() end, { grac = 100 })
end)
print("timeout_unknown_opts_rejected=" .. tostring((not ok_uo) and tostring(err_uo):find("unknown opts key") ~= nil))
local ok_gt, err_gt = pcall(function()
std.task.with_timeout(10, function() end, { grace_ms = "abc" })
end)
print("grace_non_number_rejected=" .. tostring((not ok_gt) and tostring(err_gt):find("grace_ms") ~= nil))
local ok_ub, err_ub = pcall(function() std.task.sleep(1e20) end)
print("sleep_ms_out_of_range=" .. tostring((not ok_ub) and tostring(err_ub):find("out of range") ~= nil))
print("done")