diff options
Diffstat (limited to 'tests/test-suite/goto.js')
-rw-r--r-- | tests/test-suite/goto.js | 364 |
1 files changed, 0 insertions, 364 deletions
diff --git a/tests/test-suite/goto.js b/tests/test-suite/goto.js deleted file mode 100644 index dc52c73..0000000 --- a/tests/test-suite/goto.js +++ /dev/null @@ -1,364 +0,0 @@ -"use strict"; - -const test = require('tape'); - -const lua = require('../../src/lua.js'); -const lauxlib = require('../../src/lauxlib.js'); -const lualib = require('../../src/lualib.js'); -const {to_luastring} = require("../../src/fengaricore.js"); - -test("[test-suite] goto: error messages", function (t) { - let luaCode = ` - local function errmsg (code, m) - local st, msg = load(code) - assert(not st and string.find(msg, m)) - end - - -- cannot see label inside block - errmsg([[ goto l1; do ::l1:: end ]], "label 'l1'") - errmsg([[ do ::l1:: end goto l1; ]], "label 'l1'") - - -- repeated label - errmsg([[ ::l1:: ::l1:: ]], "label 'l1'") - - - -- undefined label - errmsg([[ goto l1; local aa ::l1:: ::l2:: print(3) ]], "local 'aa'") - - -- jumping over variable definition - errmsg([[ - do local bb, cc; goto l1; end - local aa - ::l1:: print(3) - ]], "local 'aa'") - - -- jumping into a block - errmsg([[ do ::l1:: end goto l1 ]], "label 'l1'") - errmsg([[ goto l1 do ::l1:: end ]], "label 'l1'") - - -- cannot continue a repeat-until with variables - errmsg([[ - repeat - if x then goto cont end - local xuxu = 10 - ::cont:: - until xuxu < x - ]], "local 'xuxu'") - `, L; - - t.plan(2); - - t.doesNotThrow(function () { - - L = lauxlib.luaL_newstate(); - - lualib.luaL_openlibs(L); - - lauxlib.luaL_loadstring(L, to_luastring(luaCode)); - - }, "Lua program loaded without error"); - - t.doesNotThrow(function () { - - lua.lua_call(L, 0, -1); - - }, "Lua program ran without error"); - -}); - - -test("[test-suite] goto", function (t) { - let luaCode = ` - -- simple gotos - local x - do - local y = 12 - goto l1 - ::l2:: x = x + 1; goto l3 - ::l1:: x = y; goto l2 - end - ::l3:: ::l3_1:: assert(x == 13) - - -- long labels - do - local prog = [[ - do - local a = 1 - goto l%sa; a = a + 1 - ::l%sa:: a = a + 10 - goto l%sb; a = a + 2 - ::l%sb:: a = a + 20 - return a - end - ]] - local label = string.rep("0123456789", 40) - prog = string.format(prog, label, label, label, label) - assert(assert(load(prog))() == 31) - end - - -- goto to correct label when nested - do goto l3; ::l3:: end -- does not loop jumping to previous label 'l3' - - -- ok to jump over local dec. to end of block - do - goto l1 - local a = 23 - x = a - ::l1::; - end - - while true do - goto l4 - goto l1 -- ok to jump over local dec. to end of block - goto l1 -- multiple uses of same label - local x = 45 - ::l1:: ;;; - end - ::l4:: assert(x == 13) - - if print then - goto l1 -- ok to jump over local dec. to end of block - error("should not be here") - goto l2 -- ok to jump over local dec. to end of block - local x - ::l1:: ; ::l2:: ;; - else end - `, L; - - t.plan(2); - - t.doesNotThrow(function () { - - L = lauxlib.luaL_newstate(); - - lualib.luaL_openlibs(L); - - lauxlib.luaL_loadstring(L, to_luastring(luaCode)); - - }, "Lua program loaded without error"); - - t.doesNotThrow(function () { - - lua.lua_call(L, 0, -1); - - }, "Lua program ran without error"); - -}); - - -test("[test-suite] goto: to repeat a label in a different function is OK", function (t) { - let luaCode = ` - local function foo () - local a = {} - goto l3 - ::l1:: a[#a + 1] = 1; goto l2; - ::l2:: a[#a + 1] = 2; goto l5; - ::l3:: - ::l3a:: a[#a + 1] = 3; goto l1; - ::l4:: a[#a + 1] = 4; goto l6; - ::l5:: a[#a + 1] = 5; goto l4; - ::l6:: assert(a[1] == 3 and a[2] == 1 and a[3] == 2 and - a[4] == 5 and a[5] == 4) - if not a[6] then a[6] = true; goto l3a end -- do it twice - end - - ::l6:: foo() - `, L; - - t.plan(2); - - t.doesNotThrow(function () { - - L = lauxlib.luaL_newstate(); - - lualib.luaL_openlibs(L); - - lauxlib.luaL_loadstring(L, to_luastring(luaCode)); - - }, "Lua program loaded without error"); - - t.doesNotThrow(function () { - - lua.lua_call(L, 0, -1); - - }, "Lua program ran without error"); - -}); - - -test("[test-suite] goto: bug in 5.2 -> 5.3.2", function (t) { - let luaCode = ` - do -- bug in 5.2 -> 5.3.2 - local x - ::L1:: - local y -- cannot join this SETNIL with previous one - assert(y == nil) - y = true - if x == nil then - x = 1 - goto L1 - else - x = x + 1 - end - assert(x == 2 and y == true) - end - `, L; - - t.plan(2); - - t.doesNotThrow(function () { - - L = lauxlib.luaL_newstate(); - - lualib.luaL_openlibs(L); - - lauxlib.luaL_loadstring(L, to_luastring(luaCode)); - - }, "Lua program loaded without error"); - - t.doesNotThrow(function () { - - lua.lua_call(L, 0, -1); - - }, "Lua program ran without error"); - -}); - - -test("[test-suite] goto: testing closing of upvalues", function (t) { - let luaCode = ` - local function foo () - local t = {} - do - local i = 1 - local a, b, c, d - t[1] = function () return a, b, c, d end - ::l1:: - local b - do - local c - t[#t + 1] = function () return a, b, c, d end -- t[2], t[4], t[6] - if i > 2 then goto l2 end - do - local d - t[#t + 1] = function () return a, b, c, d end -- t[3], t[5] - i = i + 1 - local a - goto l1 - end - end - end - ::l2:: return t - end - - local a = foo() - assert(#a == 6) - - -- all functions share same 'a' - for i = 2, 6 do - assert(debug.upvalueid(a[1], 1) == debug.upvalueid(a[i], 1)) - end - - -- 'b' and 'c' are shared among some of them - for i = 2, 6 do - -- only a[1] uses external 'b'/'b' - assert(debug.upvalueid(a[1], 2) ~= debug.upvalueid(a[i], 2)) - assert(debug.upvalueid(a[1], 3) ~= debug.upvalueid(a[i], 3)) - end - - for i = 3, 5, 2 do - -- inner functions share 'b'/'c' with previous ones - assert(debug.upvalueid(a[i], 2) == debug.upvalueid(a[i - 1], 2)) - assert(debug.upvalueid(a[i], 3) == debug.upvalueid(a[i - 1], 3)) - -- but not with next ones - assert(debug.upvalueid(a[i], 2) ~= debug.upvalueid(a[i + 1], 2)) - assert(debug.upvalueid(a[i], 3) ~= debug.upvalueid(a[i + 1], 3)) - end - - -- only external 'd' is shared - for i = 2, 6, 2 do - assert(debug.upvalueid(a[1], 4) == debug.upvalueid(a[i], 4)) - end - - -- internal 'd's are all different - for i = 3, 5, 2 do - for j = 1, 6 do - assert((debug.upvalueid(a[i], 4) == debug.upvalueid(a[j], 4)) - == (i == j)) - end - end - `, L; - - t.plan(2); - - t.doesNotThrow(function () { - - L = lauxlib.luaL_newstate(); - - lualib.luaL_openlibs(L); - - lauxlib.luaL_loadstring(L, to_luastring(luaCode)); - - }, "Lua program loaded without error"); - - t.doesNotThrow(function () { - - lua.lua_call(L, 0, -1); - - }, "Lua program ran without error"); - -}); - - -test("[test-suite] goto: testing if x goto optimizations", function (t) { - let luaCode = ` - local function testG (a) - if a == 1 then - goto l1 - error("should never be here!") - elseif a == 2 then goto l2 - elseif a == 3 then goto l3 - elseif a == 4 then - goto l1 -- go to inside the block - error("should never be here!") - ::l1:: a = a + 1 -- must go to 'if' end - else - goto l4 - ::l4a:: a = a * 2; goto l4b - error("should never be here!") - ::l4:: goto l4a - error("should never be here!") - ::l4b:: - end - do return a end - ::l2:: do return "2" end - ::l3:: do return "3" end - ::l1:: return "1" - end - - assert(testG(1) == "1") - assert(testG(2) == "2") - assert(testG(3) == "3") - assert(testG(4) == 5) - assert(testG(5) == 10) - `, L; - - t.plan(2); - - t.doesNotThrow(function () { - - L = lauxlib.luaL_newstate(); - - lualib.luaL_openlibs(L); - - lauxlib.luaL_loadstring(L, to_luastring(luaCode)); - - }, "Lua program loaded without error"); - - t.doesNotThrow(function () { - - lua.lua_call(L, 0, -1); - - }, "Lua program ran without error"); - -}); |