diff options
Diffstat (limited to 'test/test-suite/locals.js')
-rw-r--r-- | test/test-suite/locals.js | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/test/test-suite/locals.js b/test/test-suite/locals.js new file mode 100644 index 0000000..d1dc3e4 --- /dev/null +++ b/test/test-suite/locals.js @@ -0,0 +1,249 @@ +"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] locals: bug in 5.1', function (t) { + let luaCode = ` + local function f(x) x = nil; return x end + assert(f(10) == nil) + + local function f() local x; return x end + assert(f(10) == nil) + + local function f(x) x = nil; local y; return x, y end + assert(f(10) == nil and select(2, f(20)) == nil) + `, 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] locals: local scope', function (t) { + let luaCode = ` + do + local i = 10 + do local i = 100; assert(i==100) end + do local i = 1000; assert(i==1000) end + assert(i == 10) + if i ~= 10 then + local i = 20 + else + local i = 30 + assert(i == 30) + end + end + + f = nil + + local f + x = 1 + + a = nil + load('local a = {}')() + assert(a == nil) + + function f (a) + local _1, _2, _3, _4, _5 + local _6, _7, _8, _9, _10 + local x = 3 + local b = a + local c,d = a,b + if (d == b) then + local x = 'q' + x = b + assert(x == 2) + else + assert(nil) + end + assert(x == 3) + local f = 10 + end + + local b=10 + local a; repeat local b; a,b=1,2; assert(a+1==b); until a+b==3 + + + assert(x == 1) + + f(2) + assert(type(f) == 'function') + `, 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"); + +}); + + +const getenv = ` + local function getenv (f) + local a,b = debug.getupvalue(f, 1) + assert(a == '_ENV') + return b + end +`; + + +test('[test-suite] locals: test for global table of loaded chunks', function (t) { + let luaCode = ` + assert(getenv(load"a=3") == _G) + local c = {}; local f = load("a = 3", nil, nil, c) + assert(getenv(f) == c) + assert(c.a == nil) + f() + assert(c.a == 3) + `, L; + + t.plan(2); + + t.doesNotThrow(function () { + + L = lauxlib.luaL_newstate(); + + lualib.luaL_openlibs(L); + + lauxlib.luaL_loadstring(L, to_luastring(getenv + luaCode)); + + }, "Lua program loaded without error"); + + t.doesNotThrow(function () { + + lua.lua_call(L, 0, -1); + + }, "Lua program ran without error"); + +}); + + +test('[test-suite] locals: old test for limits for special instructions (now just a generic test)', function (t) { + let luaCode = ` + do + local i = 2 + local p = 4 -- p == 2^i + repeat + for j=-3,3 do + assert(load(string.format([[local a=%s; + a=a+%s; + assert(a ==2^%s)]], j, p-j, i), '')) () + assert(load(string.format([[local a=%s; + a=a-%s; + assert(a==-2^%s)]], -j, p-j, i), '')) () + assert(load(string.format([[local a,b=0,%s; + a=b-%s; + assert(a==-2^%s)]], -j, p-j, i), '')) () + end + p = 2 * p; i = i + 1 + until p <= 0 + 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] locals: testing lexical environments', function (t) { + let luaCode = ` + assert(_ENV == _G) + + do + local dummy + local _ENV = (function (...) return ... end)(_G, dummy) -- { + + do local _ENV = {assert=assert}; assert(true) end + mt = {_G = _G} + local foo,x + A = false -- "declare" A + do local _ENV = mt + function foo (x) + A = x + do local _ENV = _G; A = 1000 end + return function (x) return A .. x end + end + end + assert(getenv(foo) == mt) + x = foo('hi'); assert(mt.A == 'hi' and A == 1000) + assert(x('*') == mt.A .. '*') + + do local _ENV = {assert=assert, A=10}; + do local _ENV = {assert=assert, A=20}; + assert(A==20);x=A + end + assert(A==10 and x==20) + end + assert(x==20) + end + `, L; + + t.plan(2); + + t.doesNotThrow(function () { + + L = lauxlib.luaL_newstate(); + + lualib.luaL_openlibs(L); + + lauxlib.luaL_loadstring(L, to_luastring(getenv + luaCode)); + + }, "Lua program loaded without error"); + + t.doesNotThrow(function () { + + lua.lua_call(L, 0, -1); + + }, "Lua program ran without error"); + +}); |