local describe = require("lua_test.test").describe
local test = require("lua_test.test").test
local expect = require("lua_test.test").expect
local ACT = require("pasta.act")
local GLOBAL = require("pasta.global")
local function create_mock_ctx()
return {
actors = {},
save = {},
yield = function() end,
end_action = function() end,
}
end
describe("GLOBAL chaintalk function registration", function()
test("GLOBAL.チェイントーク が非 nil の関数として登録されている", function()
expect(GLOBAL["チェイントーク"]).not_:toBe(nil)
expect(type(GLOBAL["チェイントーク"])):toBe("function")
end)
test("GLOBAL.yield が非 nil の関数として登録されている", function()
expect(GLOBAL["yield"]).not_:toBe(nil)
expect(type(GLOBAL["yield"])):toBe("function")
end)
end)
describe("GLOBAL chaintalk L3 resolution and yield", function()
test("act:call で GLOBAL.チェイントーク が L3 解決される", function()
local ctx = create_mock_ctx()
local act = ACT.new(ctx)
local co = coroutine.create(function()
act:call("global", "チェイントーク", {})
end)
local ok, result = coroutine.resume(co)
expect(ok):toBe(true)
expect(coroutine.status(co)):toBe("suspended")
end)
test("act:call で GLOBAL.yield が L3 解決される", function()
local ctx = create_mock_ctx()
local act = ACT.new(ctx)
local co = coroutine.create(function()
act:call("global", "yield", {})
end)
local ok, result = coroutine.resume(co)
expect(ok):toBe(true)
expect(coroutine.status(co)):toBe("suspended")
end)
test("コルーチン内で act:yield() が正しく動作する(yield/resume サイクル)", function()
local ctx = create_mock_ctx()
local act = ACT.new(ctx)
local resumed_after_yield = false
local co = coroutine.create(function()
act:call("global", "チェイントーク", {})
resumed_after_yield = true
end)
local ok1, result1 = coroutine.resume(co)
expect(ok1):toBe(true)
expect(resumed_after_yield):toBe(false)
expect(coroutine.status(co)):toBe("suspended")
local ok2, result2 = coroutine.resume(co)
expect(ok2):toBe(true)
expect(resumed_after_yield):toBe(true)
expect(coroutine.status(co)):toBe("dead")
end)
test("yield 前のトークンが蓄積出力として返る", function()
local ctx = create_mock_ctx()
local act = ACT.new(ctx)
local co = coroutine.create(function()
act:talk("テスト出力")
act:call("global", "チェイントーク", {})
act:talk("後続出力")
end)
local ok, result = coroutine.resume(co)
expect(ok):toBe(true)
expect(result).not_:toBe(nil)
end)
end)