-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
6 changed files
with
1,285 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
/.idea | ||
/vendor | ||
/build | ||
*.lua | ||
/*.lua | ||
.phpunit.result.cache |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,184 @@ | ||
-- $Id: testes/closure.lua $ | ||
-- See Copyright Notice in file all.lua | ||
|
||
print "testing closures" | ||
|
||
local A,B = 0,{g=10} | ||
function f(x) | ||
local a = {} | ||
for i=1,1000 do | ||
local y = 0 | ||
do | ||
a[i] = function () B.g = B.g+1; y = y+x; return y+A end | ||
end | ||
end | ||
local dummy = function () return a[A] end | ||
collectgarbage() | ||
A = 1; assert(dummy() == a[1]); A = 0; | ||
assert(a[1]() == x) | ||
assert(a[3]() == x) | ||
collectgarbage() | ||
assert(B.g == 12) | ||
return a | ||
end | ||
|
||
|
||
-- testing equality | ||
a = {} | ||
|
||
for i = 1, 5 do a[i] = function (x) return i + a + _ENV end end | ||
assert(a[3] ~= a[4] and a[4] ~= a[5]) | ||
|
||
do | ||
local a = function (x) return math.sin(_ENV[x]) end | ||
local function f() | ||
return a | ||
end | ||
assert(f() == f()) | ||
end | ||
|
||
|
||
-- testing closures with 'for' control variable | ||
a = {} | ||
for i=1,10 do | ||
a[i] = {set = function(x) i=x end, get = function () return i end} | ||
if i == 3 then break end | ||
end | ||
assert(a[4] == undef) | ||
a[1].set(10) | ||
assert(a[2].get() == 2) | ||
a[2].set('a') | ||
assert(a[3].get() == 3) | ||
assert(a[2].get() == 'a') | ||
|
||
a = {} | ||
local t = {"a", "b"} | ||
for i = 1, #t do | ||
local k = t[i] | ||
a[i] = {set = function(x, y) i=x; k=y end, | ||
get = function () return i, k end} | ||
if i == 2 then break end | ||
end | ||
a[1].set(10, 20) | ||
local r,s = a[2].get() | ||
assert(r == 2 and s == 'b') | ||
r,s = a[1].get() | ||
assert(r == 10 and s == 20) | ||
a[2].set('a', 'b') | ||
r,s = a[2].get() | ||
assert(r == "a" and s == "b") | ||
|
||
|
||
-- testing closures with 'for' control variable x break | ||
for i=1,3 do | ||
f = function () return i end | ||
break | ||
end | ||
assert(f() == 1) | ||
|
||
for k = 1, #t do | ||
local v = t[k] | ||
f = function () return k, v end | ||
break | ||
end | ||
assert(({f()})[1] == 1) | ||
assert(({f()})[2] == "a") | ||
|
||
|
||
-- testing closure x break x return x errors | ||
|
||
local b | ||
function f(x) | ||
local first = 1 | ||
while 1 do | ||
if x == 3 and not first then return end | ||
local a = 'xuxu' | ||
b = function (op, y) | ||
if op == 'set' then | ||
a = x+y | ||
else | ||
return a | ||
end | ||
end | ||
if x == 1 then do break end | ||
elseif x == 2 then return | ||
else if x ~= 3 then error() end | ||
end | ||
first = nil | ||
end | ||
end | ||
|
||
for i=1,3 do | ||
f(i) | ||
assert(b('get') == 'xuxu') | ||
b('set', 10); assert(b('get') == 10+i) | ||
b = nil | ||
end | ||
|
||
pcall(f, 4); | ||
assert(b('get') == 'xuxu') | ||
b('set', 10); assert(b('get') == 14) | ||
|
||
|
||
local w | ||
-- testing multi-level closure | ||
function f(x) | ||
return function (y) | ||
return function (z) return w+x+y+z end | ||
end | ||
end | ||
|
||
y = f(10) | ||
w = 1.345 | ||
assert(y(20)(30) == 60+w) | ||
|
||
|
||
print(X,Y) | ||
-- testing closures x break | ||
do | ||
local X, Y | ||
local a = math.sin(0) | ||
|
||
print(a) | ||
while a do | ||
local b = 10 | ||
X = function () return b end -- closure with upvalue | ||
if a then break end | ||
end | ||
|
||
do | ||
local b = 20 | ||
Y = function () return b end -- closure with upvalue | ||
end | ||
|
||
-- upvalues must be different | ||
print(X,Y) | ||
assert(X() == 10 and Y() == 20) | ||
end | ||
|
||
|
||
-- testing closures x repeat-until | ||
|
||
local a = {} | ||
local i = 1 | ||
repeat | ||
local x = i | ||
a[i] = function () i = x+1; return x end | ||
until i > 10 or a[i]() ~= x | ||
assert(i == 11 and a[1]() == 1 and a[3]() == 3 and i == 4) | ||
|
||
|
||
print'+' | ||
|
||
|
||
-- test for correctly closing upvalues in tail calls of vararg functions | ||
local function t () | ||
local function c(a,b) assert(a=="test" and b=="OK") end | ||
local function v(f, ...) c("test", f() ~= 1 and "FAILED" or "OK") end | ||
local x = 1 | ||
return v(function() return x end) | ||
end | ||
t() | ||
|
||
|
||
print'OK' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
-- $Id: testes/locals.lua $ | ||
-- See Copyright Notice in file all.lua | ||
|
||
print('testing local variables and environments') | ||
|
||
|
||
-- bug in 5.1: | ||
|
||
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) | ||
|
||
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') | ||
|
||
|
||
|
||
print'+' | ||
|
Oops, something went wrong.