aboutsummaryrefslogtreecommitdiff
path: root/test/lcorolib.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/lcorolib.test.js')
-rw-r--r--test/lcorolib.test.js143
1 files changed, 143 insertions, 0 deletions
diff --git a/test/lcorolib.test.js b/test/lcorolib.test.js
new file mode 100644
index 0000000..e9ad8ed
--- /dev/null
+++ b/test/lcorolib.test.js
@@ -0,0 +1,143 @@
+"use strict";
+
+const lua = require('../src/lua.js');
+const lauxlib = require('../src/lauxlib.js');
+const lualib = require('../src/lualib.js');
+const lstate = require('../src/lstate.js');
+const {to_luastring} = require("../src/fengaricore.js");
+
+test('coroutine.create, coroutine.yield, coroutine.resume', () => {
+ let L = lauxlib.luaL_newstate();
+ if (!L) throw Error("failed to create lua state");
+
+ let luaCode = `
+ local co = coroutine.create(function (start)
+ local b = coroutine.yield(start * start);
+ coroutine.yield(b * b)
+ end)
+
+ local success, pow = coroutine.resume(co, 5)
+ success, pow = coroutine.resume(co, pow)
+
+ return pow
+ `;
+ {
+ lualib.luaL_openlibs(L);
+ expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
+ lua.lua_call(L, 0, -1);
+ }
+
+ expect(lua.lua_tonumber(L, -1))
+ .toBe(625);
+});
+
+
+test('coroutine.status', () => {
+ let L = lauxlib.luaL_newstate();
+ if (!L) throw Error("failed to create lua state");
+
+ let luaCode = `
+ local co = coroutine.create(function (start)
+ local b = coroutine.yield(start * start);
+ coroutine.yield(b * b)
+ end)
+
+ local s1 = coroutine.status(co)
+
+ local success, pow = coroutine.resume(co, 5)
+ success, pow = coroutine.resume(co, pow)
+
+ coroutine.resume(co, pow)
+
+ local s2 = coroutine.status(co)
+
+ return s1, s2
+ `;
+ {
+ lualib.luaL_openlibs(L);
+ expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
+ lua.lua_call(L, 0, -1);
+ }
+
+ expect(lua.lua_tojsstring(L, -2))
+ .toBe("suspended");
+
+ expect(lua.lua_tojsstring(L, -1))
+ .toBe("dead");
+});
+
+
+test('coroutine.isyieldable', () => {
+ let L = lauxlib.luaL_newstate();
+ if (!L) throw Error("failed to create lua state");
+
+ let luaCode = `
+ local co = coroutine.create(function ()
+ coroutine.yield(coroutine.isyieldable());
+ end)
+
+ local succes, yieldable = coroutine.resume(co)
+
+ return yieldable, coroutine.isyieldable()
+ `;
+ {
+ lualib.luaL_openlibs(L);
+ expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
+ lua.lua_call(L, 0, -1);
+ }
+
+ expect(lua.lua_toboolean(L, -2)).toBe(true);
+ expect(lua.lua_toboolean(L, -1)).toBe(false);
+});
+
+
+test('coroutine.running', () => {
+ let L = lauxlib.luaL_newstate();
+ if (!L) throw Error("failed to create lua state");
+
+ let luaCode = `
+ local running, ismain
+
+ local co = coroutine.create(function ()
+ running, ismain = coroutine.running()
+ end)
+
+ coroutine.resume(co)
+
+ return running, ismain
+ `;
+ {
+ lualib.luaL_openlibs(L);
+ expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
+ lua.lua_call(L, 0, -1);
+ }
+
+ expect(lua.lua_tothread(L, -2)).toBeInstanceOf(lstate.lua_State);
+ expect(lua.lua_toboolean(L, -1)).toBe(false);
+});
+
+
+test('coroutine.wrap', () => {
+ let L = lauxlib.luaL_newstate();
+ if (!L) throw Error("failed to create lua state");
+
+ let luaCode = `
+ local co = coroutine.wrap(function (start)
+ local b = coroutine.yield(start * start);
+ coroutine.yield(b * b)
+ end)
+
+ pow = co(5)
+ pow = co(pow)
+
+ return pow
+ `;
+ {
+ lualib.luaL_openlibs(L);
+ expect(lauxlib.luaL_loadstring(L, to_luastring(luaCode))).toBe(lua.LUA_OK);
+ lua.lua_call(L, 0, -1);
+ }
+
+ expect(lua.lua_tonumber(L, -1))
+ .toBe(625);
+});