[NOTHING CHANGED] Move to maven and massive clean and fixup #93
240
luaj-test/src/test/resources/compatibility/baselib.out
Normal file
240
luaj-test/src/test/resources/compatibility/baselib.out
Normal file
@@ -0,0 +1,240 @@
|
||||
|
||||
11
|
||||
abc 123 nil pqr
|
||||
F
|
||||
F
|
||||
T
|
||||
assert(true) true
|
||||
pcall(assert,true) true
|
||||
pcall(assert,false) false string
|
||||
pcall(assert,nil) false string
|
||||
pcall(assert,true,"msg") true
|
||||
pcall(assert,false,"msg") false string
|
||||
pcall(assert,nil,"msg") false string
|
||||
pcall(assert,false,"msg","msg2") false string
|
||||
collectgarbage("count") number
|
||||
collectgarbage("collect") number
|
||||
collectgarbage("count") number
|
||||
pcall(ipairs) false string
|
||||
pcall(ipairs,nil) false string
|
||||
pcall(ipairs,"a") false string
|
||||
pcall(ipairs,1) false string
|
||||
ipairs2 1 one
|
||||
ipairs2 2 two
|
||||
ipairs4 1 one
|
||||
ipairs4 2 two
|
||||
table loaded
|
||||
load: nil
|
||||
load("print(3+4); return 8") func.1 nil
|
||||
7
|
||||
load("print(3+4); return 8")() 8
|
||||
pcall(pairs) false string
|
||||
pcall(pairs,nil) false string
|
||||
pcall(pairs,"a") false string
|
||||
pcall(pairs,1) false string
|
||||
pairs2 1 one
|
||||
pairs2 2 two
|
||||
pairs3 aa aaa
|
||||
pairs4 1 one
|
||||
pairs4 2 two
|
||||
pairs4 aa aaa
|
||||
pairs5 20 30
|
||||
pairs5 30 20
|
||||
_G["abc"] (before) nil
|
||||
_G["abc"] (after) def
|
||||
type(nil) nil
|
||||
type("a") string
|
||||
type(1) number
|
||||
type(1.5) number
|
||||
type(function() end) function
|
||||
type({}) table
|
||||
type(true) boolean
|
||||
type(false) boolean
|
||||
pcall(type,type) function
|
||||
pcall(type) false string
|
||||
(function() return pcall(type) end)() false string
|
||||
la() false string
|
||||
ga() false string
|
||||
getmetatable(ta) nil
|
||||
getmetatable(tb) nil
|
||||
setmetatable(ta),{cc1="ccc1"} table
|
||||
setmetatable(tb),{dd1="ddd1"} table
|
||||
getmetatable(ta)["cc1"] ccc1
|
||||
getmetatable(tb)["dd1"] ddd1
|
||||
getmetatable(1) nil
|
||||
pcall(setmetatable,1) false string
|
||||
pcall(setmetatable,nil) false string
|
||||
pcall(setmetatable,"ABC") false string
|
||||
pcall(setmetatable,function() end) false string
|
||||
pcall(rawget) false string
|
||||
pcall(rawget,"a") false string
|
||||
pcall(rawget,s) false string
|
||||
pcall(rawget,t) false string
|
||||
s nil nil ccc ddd nil nil nil
|
||||
s nil nil ccc ddd nil nil nil
|
||||
t aaa bbb ccc ddd nil nil nil
|
||||
t nil nil ccc ddd nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
pcall(rawset,s,"aa","www") tbl.2
|
||||
s www nil ccc ddd nil nil nil
|
||||
s www nil ccc ddd nil nil nil
|
||||
t aaa bbb ccc ddd nil nil nil
|
||||
t nil nil ccc ddd nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
pcall(rawset,s,"cc","xxx") tbl.2
|
||||
s www nil xxx ddd nil nil nil
|
||||
s www nil xxx ddd nil nil nil
|
||||
t aaa bbb ccc ddd nil nil nil
|
||||
t nil nil ccc ddd nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
pcall(rawset,t,"aa","yyy") tbl.3
|
||||
s www nil xxx ddd nil nil nil
|
||||
s www nil xxx ddd nil nil nil
|
||||
t yyy bbb ccc ddd nil nil nil
|
||||
t yyy nil ccc ddd nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
pcall(rawset,t,"dd","zzz") tbl.3
|
||||
s www nil xxx ddd nil nil nil
|
||||
s www nil xxx ddd nil nil nil
|
||||
t yyy bbb ccc zzz nil nil nil
|
||||
t yyy nil ccc zzz nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
pcall(rawlen, {}) 0
|
||||
pcall(rawlen, {"a"}) 1
|
||||
pcall(rawlen, {"a","b"}) 2
|
||||
pcall(rawlen, "") 0
|
||||
pcall(rawlen, "a") 1
|
||||
pcall(rawlen, "ab") 2
|
||||
pcall(rawlen, 1) false string
|
||||
pcall(rawlen, nil) false string
|
||||
pcall(rawlen) false string
|
||||
s www nil xxx ddd nil nil nil
|
||||
s www nil xxx ddd nil nil nil
|
||||
t yyy bbb ccc zzz nil nil nil
|
||||
t yyy nil ccc zzz nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
s["ee"]="ppp"
|
||||
s www nil xxx ddd ppp nil nil
|
||||
s www nil xxx ddd ppp nil nil
|
||||
t yyy bbb ccc zzz nil nil nil
|
||||
t yyy nil ccc zzz nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
s["cc"]="qqq"
|
||||
s www nil qqq ddd ppp nil nil
|
||||
s www nil qqq ddd ppp nil nil
|
||||
t yyy bbb ccc zzz nil nil nil
|
||||
t yyy nil ccc zzz nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
mt aaa bbb nil nil nil nil nil
|
||||
t["ff"]="rrr"
|
||||
s www nil qqq ddd ppp nil nil
|
||||
s www nil qqq ddd ppp nil nil
|
||||
t yyy bbb ccc zzz nil rrr nil
|
||||
t yyy nil ccc zzz nil nil nil
|
||||
mt aaa bbb nil nil nil rrr nil
|
||||
mt aaa bbb nil nil nil rrr nil
|
||||
t["dd"]="sss"
|
||||
s www nil qqq ddd ppp nil nil
|
||||
s www nil qqq ddd ppp nil nil
|
||||
t yyy bbb ccc sss nil rrr nil
|
||||
t yyy nil ccc sss nil nil nil
|
||||
mt aaa bbb nil nil nil rrr nil
|
||||
mt aaa bbb nil nil nil rrr nil
|
||||
mt["gg"]="ttt"
|
||||
s www nil qqq ddd ppp nil nil
|
||||
s www nil qqq ddd ppp nil nil
|
||||
t yyy bbb ccc sss nil rrr ttt
|
||||
t yyy nil ccc sss nil nil nil
|
||||
mt aaa bbb nil nil nil rrr ttt
|
||||
mt aaa bbb nil nil nil rrr ttt
|
||||
pcall(select) false string
|
||||
select(1,11,22,33,44,55) 11 22 33 44 55
|
||||
select(2,11,22,33,44,55) 22 33 44 55
|
||||
select(3,11,22,33,44,55) 33 44 55
|
||||
select(4,11,22,33,44,55) 44 55
|
||||
pcall(select,5,11,22,33,44,55) 55
|
||||
pcall(select,6,11,22,33,44,55) nil
|
||||
pcall(select,7,11,22,33,44,55) nil
|
||||
pcall(select,0,11,22,33,44,55) false string
|
||||
pcall(select,-1,11,22,33,44,55) 55
|
||||
pcall(select,-2,11,22,33,44,55) 44
|
||||
pcall(select,-4,11,22,33,44,55) 22
|
||||
pcall(select,-5,11,22,33,44,55) 11
|
||||
pcall(select,-6,11,22,33,44,55) false string
|
||||
pcall(select,1) nil
|
||||
pcall(select,select) false string
|
||||
pcall(select,{}) false string
|
||||
pcall(select,"2",11,22,33) 22
|
||||
pcall(select,"abc",11,22,33) false string
|
||||
pcall(tonumber) nil
|
||||
pcall(tonumber,nil) nil
|
||||
pcall(tonumber,"abc") nil
|
||||
pcall(tonumber,"123") 123
|
||||
pcall(tonumber,"123",10) 123
|
||||
pcall(tonumber,"123",8) 83
|
||||
pcall(tonumber,"123",6) 51
|
||||
pcall(tonumber,"10101",4) 273
|
||||
pcall(tonumber,"10101",3) 91
|
||||
pcall(tonumber,"10101",2) 21
|
||||
pcall(tonumber,"1a1",16) 417
|
||||
pcall(tonumber,"1a1",32) 1345
|
||||
pcall(tonumber,"1a1",54) false string
|
||||
pcall(tonumber,"1a1",1) false string
|
||||
pcall(tonumber,"1a1",0) false string
|
||||
pcall(tonumber,"1a1",-1) false string
|
||||
pcall(tonumber,"1a1","32") 1345
|
||||
pcall(tonumber,"123","456") false string
|
||||
pcall(tonumber,"1a1",10) nil
|
||||
pcall(tonumber,"151",4) nil
|
||||
pcall(tonumber,"151",3) nil
|
||||
pcall(tonumber,"151",2) nil
|
||||
pcall(tonumber,"123",8,8) 83
|
||||
pcall(tonumber,123) 123
|
||||
pcall(tonumber,true) nil
|
||||
pcall(tonumber,false) nil
|
||||
pcall(tonumber,tonumber) nil
|
||||
pcall(tonumber,function() end) nil
|
||||
pcall(tonumber,{"one","two",a="aa",b="bb"}) nil
|
||||
pcall(tonumber,"123.456") 123.456
|
||||
pcall(tonumber," 123.456") 123.456
|
||||
pcall(tonumber," 234qwer") nil
|
||||
pcall(tonumber,"0x20") 32
|
||||
pcall(tonumber," 0x20") 32
|
||||
pcall(tonumber,"0x20 ") 32
|
||||
pcall(tonumber," 0x20 ") 32
|
||||
pcall(tonumber,"0X20") 32
|
||||
pcall(tonumber," 0X20") 32
|
||||
pcall(tonumber,"0X20 ") 32
|
||||
pcall(tonumber," 0X20 ") 32
|
||||
pcall(tonumber,"0x20",10) nil
|
||||
pcall(tonumber,"0x20",16) nil
|
||||
pcall(tonumber,"0x20",8) nil
|
||||
pcall(tostring) nil
|
||||
pcall(tostring,nil) nil
|
||||
pcall(tostring,"abc") abc
|
||||
pcall(tostring,"abc","def") abc
|
||||
pcall(tostring,123) 123
|
||||
pcall(tostring,true) true
|
||||
pcall(tostring,false) false
|
||||
tostring(tostring) string
|
||||
tostring(function() end) string
|
||||
tostring({"one","two",a="aa",b="bb"}) string
|
||||
_VERSION string
|
||||
pcall(badfunc) false string
|
||||
pcall(badfunc,errfunc) false string
|
||||
pcall(badfunc,badfunc) false string
|
||||
pcall(wrappedbad) nil
|
||||
pcall(wrappedbad,errfunc) nil
|
||||
pcall(xpcall(badfunc)) false string
|
||||
in errfunc string
|
||||
pcall(xpcall(badfunc,errfunc)) false
|
||||
pcall(xpcall(badfunc,badfunc)) false
|
||||
pcall(xpcall(wrappedbad)) false string
|
||||
xpcall(wrappedbad,errfunc) true
|
||||
74
luaj-test/src/test/resources/compatibility/coroutinelib.out
Normal file
74
luaj-test/src/test/resources/compatibility/coroutinelib.out
Normal file
@@ -0,0 +1,74 @@
|
||||
running is not nil
|
||||
co.status suspended
|
||||
co-body 1 10
|
||||
foo 2
|
||||
main true 4
|
||||
co.status suspended
|
||||
co-body r
|
||||
main true 11 -9
|
||||
co.status suspended
|
||||
co-body x y
|
||||
running is not nil
|
||||
co.status.inside running
|
||||
co.status.inside running
|
||||
co.status.inside2 normal
|
||||
main true 10 end
|
||||
co.status dead
|
||||
main false cannot resume dead coroutine
|
||||
co.status dead
|
||||
running is not nil
|
||||
co.status suspended
|
||||
co-body 1 10
|
||||
foo 2
|
||||
main true 4
|
||||
co.status suspended
|
||||
co-body nil nil
|
||||
main true 11 -9
|
||||
co.status suspended
|
||||
co-body x y
|
||||
main true 10 end
|
||||
co.status dead
|
||||
main false cannot resume dead coroutine
|
||||
co.status dead
|
||||
co-body 1 10
|
||||
foo 2
|
||||
g 4
|
||||
co-body r
|
||||
g 11 -9
|
||||
co-body x y
|
||||
g 10 end
|
||||
g cannot resume dead coroutine
|
||||
(main) sending args 111 222 333
|
||||
(echocr) first args 111 222 333
|
||||
(main) resume returns true 111 222 333
|
||||
(main) sending args
|
||||
(echoch) yield returns
|
||||
(main) resume returns true
|
||||
(main) sending args 111
|
||||
(echoch) yield returns 111
|
||||
(main) resume returns true 111
|
||||
(main) sending args 111 222 333
|
||||
(echoch) yield returns 111 222 333
|
||||
(main) resume returns true 111 222 333
|
||||
main-b suspended
|
||||
main-c suspended
|
||||
b-resumed main-arg-for-b true
|
||||
b-b running
|
||||
b-c suspended
|
||||
b-resume-b false cannot resume non-suspended coroutine
|
||||
c-resumed b-arg-for-c true
|
||||
c-b normal
|
||||
c-c running
|
||||
c-resume-b false cannot resume non-suspended coroutine
|
||||
c-resume-c false cannot resume non-suspended coroutine
|
||||
b-resume-c false attempt to yield across metamethod/C-call boundary
|
||||
main-resume-b false attempt to yield across metamethod/C-call boundary
|
||||
main-resume-c false cannot resume dead coroutine
|
||||
main-b dead
|
||||
main-c dead
|
||||
main-resume-b false cannot resume dead coroutine
|
||||
main-resume-c false cannot resume dead coroutine
|
||||
main-b dead
|
||||
main-c dead
|
||||
main-resume-b false cannot resume dead coroutine
|
||||
main-resume-c false cannot resume dead coroutine
|
||||
329
luaj-test/src/test/resources/compatibility/debuglib.out
Normal file
329
luaj-test/src/test/resources/compatibility/debuglib.out
Normal file
@@ -0,0 +1,329 @@
|
||||
has debug true
|
||||
----- debug.getlocal, debug.setlocal
|
||||
true h-3-0 -> 3-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,0,#} f locals=,3,0,#,4,5,6
|
||||
true h-3-1 -> 3-1 get=a,3 set=a,nil get=a,# g locals=7,8,9 tbl={3,1,#} f locals=,#,1,#,4,5,6
|
||||
true h-3-2 -> 3-2 get=b,2 set=b,nil get=b,# g locals=7,8,9 tbl={3,2,#} f locals=,3,#,#,4,5,6
|
||||
true h-3-3 -> 3-3 get=c,# set=c,nil get=c,# g locals=7,8,9 tbl={3,3,#} f locals=,3,3,#,4,5,6
|
||||
true h-3-4 -> 3-4 get=d,4 set=d,nil get=d,# g locals=7,8,9 tbl={3,4,#} f locals=,3,4,#,#,5,6
|
||||
true h-3-5 -> 3-5 get=e,5 set=e,nil get=e,# g locals=7,8,9 tbl={3,5,#} f locals=,3,5,#,4,#,6
|
||||
true h-3-6 -> 3-6 get=f,6 set=f,nil get=f,# g locals=7,8,9 tbl={3,6,#} f locals=,3,6,#,4,5,#
|
||||
true h-3-7 -> 3-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,7,#} f locals=,3,7,#,4,5,6
|
||||
true h-2-0 -> 2-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,0,#} f locals=,2,0,#,4,5,6
|
||||
true h-2-1 -> 2-1 get=p,7 set=p,nil get=p,# g locals=#,8,9 tbl={2,1,#} f locals=,2,1,#,4,5,6
|
||||
true h-2-2 -> 2-2 get=q,8 set=q,nil get=q,# g locals=7,#,9 tbl={2,2,#} f locals=,2,2,#,4,5,6
|
||||
true h-2-3 -> 2-3 get=r,9 set=r,nil get=r,# g locals=7,8,# tbl={2,3,#} f locals=,2,3,#,4,5,6
|
||||
true h-2-4 -> 2-4 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,4,#} f locals=,2,4,#,4,5,6
|
||||
true h-2-5 -> 2-5 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,5,#} f locals=,2,5,#,4,5,6
|
||||
true h-2-6 -> 2-6 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,6,#} f locals=,2,6,#,4,5,6
|
||||
true h-2-7 -> 2-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,7,#} f locals=,2,7,#,4,5,6
|
||||
true h-1-3 -> 1-3 get=n,# set=n,nil get=n,# g locals=7,8,9 tbl={1,3,#} f locals=,1,3,#,4,5,6
|
||||
true h-1-4 -> 1-4 get=#,nil set=x1,nil get=x1,# g locals=7,8,9 tbl={1,4,#} f locals=,1,4,#,4,5,6
|
||||
true h-1-5 -> 1-5 get=nil,# set=y1,nil get=y1,# g locals=7,8,9 tbl={1,5,#} f locals=,1,5,#,4,5,6
|
||||
true h-1-6 -> 1-6 get=nil,nil set=nil,nil get=x2,nil g locals=7,8,9 tbl={1,6,#} f locals=,1,6,#,4,5,6
|
||||
true h-1-7 -> 1-7 get=nil,nil set=nil,nil get=y2,nil g locals=7,8,9 tbl={1,7,#} f locals=,1,7,#,4,5,6
|
||||
----- debug.getupvalue, debug.setupvalue
|
||||
h 101 102 103 104 105 106 107 108 109
|
||||
f -> 1-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,101,102,103,104,105,106,107,108,109
|
||||
f -> 1-1 get=true,m,101 set=true,m,nil get=true,m,777001 tbl=true,777001,102,103,104,105,106,107,108,109
|
||||
f -> 1-2 get=true,n,102 set=true,n,nil get=true,n,777002 tbl=true,777001,777002,103,104,105,106,107,108,109
|
||||
f -> 1-3 get=true,o,103 set=true,o,nil get=true,o,777003 tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-4 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-5 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-6 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
g -> 2-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
g -> 2-1 get=true,m,777001 set=true,m,nil get=true,m,888001 tbl=true,888001,777002,777003,104,105,106,107,108,109
|
||||
g -> 2-2 get=true,n,777002 set=true,n,nil get=true,n,888002 tbl=true,888001,888002,777003,104,105,106,107,108,109
|
||||
g -> 2-3 get=true,o,777003 set=true,o,nil get=true,o,888003 tbl=true,888001,888002,888003,104,105,106,107,108,109
|
||||
g -> 2-4 get=true,p,104 set=true,p,nil get=true,p,888004 tbl=true,888001,888002,888003,888004,105,106,107,108,109
|
||||
g -> 2-5 get=true,q,105 set=true,q,nil get=true,q,888005 tbl=true,888001,888002,888003,888004,888005,106,107,108,109
|
||||
g -> 2-6 get=true,r,106 set=true,r,nil get=true,r,888006 tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-1 get=true,m,888001 set=true,m,nil get=true,m,999001 tbl=true,999001,888002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-2 get=true,n,888002 set=true,n,nil get=true,n,999002 tbl=true,999001,999002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-3 get=true,o,888003 set=true,o,nil get=true,o,999003 tbl=true,999001,999002,999003,888004,888005,888006,107,108,109
|
||||
h -> 3-4 get=true,p,888004 set=true,p,nil get=true,p,999004 tbl=true,999001,999002,999003,999004,888005,888006,107,108,109
|
||||
h -> 3-5 get=true,q,888005 set=true,q,nil get=true,q,999005 tbl=true,999001,999002,999003,999004,999005,888006,107,108,109
|
||||
h -> 3-6 get=true,r,888006 set=true,r,nil get=true,r,999006 tbl=true,999001,999002,999003,999004,999005,999006,107,108,109
|
||||
h -> 3-7 get=true,v,107 set=true,v,nil get=true,v,999007 tbl=true,999001,999002,999003,999004,999005,999006,999007,108,109
|
||||
h -> 3-8 get=true,w,108 set=true,w,nil get=true,w,999008 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,109
|
||||
h -> 3-9 get=true,x,109 set=true,x,nil get=true,x,999009 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
|
||||
h -> 3-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
|
||||
----- debug.setmetatable, debug.getmetatable
|
||||
a.a=bbb a.b=nil b.a=nil b.b=nil
|
||||
a.a=bbb a.b=ccc b.a=nil b.b=nil
|
||||
boolean table nil table
|
||||
boolean nil nil nil
|
||||
boolean table nil nil
|
||||
a.a=bbb a.b=nil b.a=nil b.b=nil
|
||||
boolean nil nil nil
|
||||
get=true,true,nil
|
||||
set=true,true,nil
|
||||
get=true,true,nil
|
||||
get=true,true,nil
|
||||
set=true,true,nil
|
||||
get=true,true,nil
|
||||
true nil
|
||||
true 1
|
||||
true 1
|
||||
----- debug.getinfo
|
||||
6
|
||||
---
|
||||
debug.getinfo(1)
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: 144
|
||||
linedefined: 141
|
||||
lastlinedefined: 155
|
||||
nups: 5
|
||||
func: function
|
||||
debug.getinfo(1,"")
|
||||
debug.getinfo(1,"l")
|
||||
currentline: 146
|
||||
debug.getinfo(1,"fL")
|
||||
func: function
|
||||
activelines: {}
|
||||
debug.getinfo(2)
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: 157
|
||||
linedefined: 135
|
||||
lastlinedefined: 159
|
||||
nups: 6
|
||||
func: function
|
||||
debug.getinfo(2,"l")
|
||||
currentline: 157
|
||||
debug.getinfo(2,"fL")
|
||||
func: function
|
||||
activelines: {}
|
||||
debug.getinfo(10,"")
|
||||
true
|
||||
debug.getinfo(-10,"")
|
||||
true
|
||||
---
|
||||
5
|
||||
e,f,g true function function
|
||||
debug.getinfo(f)
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 137
|
||||
lastlinedefined: 140
|
||||
nups: 1
|
||||
func: function
|
||||
debug.getinfo(f,"nSlufL")
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 137
|
||||
lastlinedefined: 140
|
||||
nups: 1
|
||||
func: function
|
||||
activelines: {}
|
||||
debug.getinfo(f,"n")
|
||||
true
|
||||
debug.getinfo(f,"S")
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
linedefined: 137
|
||||
lastlinedefined: 140
|
||||
debug.getinfo(f,"l")
|
||||
true
|
||||
currentline: -1
|
||||
debug.getinfo(f,"u")
|
||||
true
|
||||
nups: 1
|
||||
debug.getinfo(f,"f")
|
||||
true
|
||||
func: function
|
||||
debug.getinfo(f,"L")
|
||||
true
|
||||
activelines: {}
|
||||
debug.getinfo(g)
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 141
|
||||
lastlinedefined: 155
|
||||
nups: 5
|
||||
func: function
|
||||
debug.getinfo(test)
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 135
|
||||
lastlinedefined: 159
|
||||
nups: 6
|
||||
func: function
|
||||
----- debug.sethook, debug.gethook
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,177
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,176
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
hook = c -> result=true,nil,nil,nil,false,false,nil
|
||||
... in hook return nil
|
||||
info[2]=[C],-1
|
||||
... in hook return nil
|
||||
info[2]=[C],-1
|
||||
hook = r -> result=true,nil,nil,nil,false,false,nil
|
||||
... in hook line 192
|
||||
info[2]=debuglib.lua,192
|
||||
... in hook line 177
|
||||
info[2]=debuglib.lua,177
|
||||
... in hook line 178
|
||||
info[2]=debuglib.lua,178
|
||||
... in hook line 176
|
||||
info[2]=debuglib.lua,176
|
||||
... in hook line 195
|
||||
info[2]=debuglib.lua,195
|
||||
hook = l -> result=true,nil,nil,nil,false,false,nil
|
||||
... in hook return nil
|
||||
info[2]=[C],-1
|
||||
... in hook line 192
|
||||
info[2]=debuglib.lua,192
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,177
|
||||
... in hook line 177
|
||||
info[2]=debuglib.lua,177
|
||||
... in hook line 178
|
||||
info[2]=debuglib.lua,178
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,176
|
||||
... in hook line 176
|
||||
info[2]=debuglib.lua,176
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
... in hook return nil
|
||||
info[2]=[C],-1
|
||||
... in hook line 195
|
||||
info[2]=debuglib.lua,195
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
hook = crl -> result=true,nil,nil,nil,false,false,nil
|
||||
----- debug.traceback
|
||||
hi
|
||||
stack traceback:
|
||||
debuglib.lua:216: in function <debuglib.lua:215>
|
||||
[C]: in function 'pcall'
|
||||
debuglib.lua:219: in function 'b'
|
||||
debuglib.lua:222: in function 'c'
|
||||
debuglib.lua:225: in function '__index'
|
||||
debuglib.lua:227: in function 'e'
|
||||
debuglib.lua:231: in function 'g'
|
||||
debuglib.lua:235: in function 'i'
|
||||
debuglib.lua:238: in function <debuglib.lua:214>
|
||||
[C]: in function 'pcall'
|
||||
debuglib.lua:240: in main chunk
|
||||
[C]: in ?
|
||||
----- debug.upvalueid
|
||||
debug.getupvalue(a1,1) x 100
|
||||
debug.getupvalue(a1,2) y 200
|
||||
debug.getupvalue(a2,1) x 100
|
||||
debug.getupvalue(a2,2) y 200
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) false
|
||||
----- debug.upvaluejoin
|
||||
a1 101 201 301 401
|
||||
a2 102 202 501 601
|
||||
debug.upvaluejoin(a1,1,a2,2)
|
||||
debug.upvaluejoin(a1,3,a2,4)
|
||||
a1 203 203 602 402
|
||||
a2 103 204 502 603
|
||||
a1 205 205 604 403
|
||||
a2 104 206 503 605
|
||||
debug.getupvalue(a1,1) x 206
|
||||
debug.getupvalue(a2,1) x 104
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,2) true
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,4) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,4) false
|
||||
debug.getupvalue(a1,2) y 206
|
||||
debug.getupvalue(a2,2) y 206
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,2) true
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,2) true
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,2) true
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,2) true
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,4) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,4) false
|
||||
debug.getupvalue(a1,3) z 605
|
||||
debug.getupvalue(a2,3) z 503
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,3) true
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,3) true
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,4) true
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,4) false
|
||||
debug.getupvalue(a1,4) w 403
|
||||
debug.getupvalue(a2,4) w 605
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,3) true
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,4) true
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,4) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,4) true
|
||||
97
luaj-test/src/test/resources/compatibility/errors.out
Normal file
97
luaj-test/src/test/resources/compatibility/errors.out
Normal file
@@ -0,0 +1,97 @@
|
||||
a(error) false nil
|
||||
a(error,"msg") false string
|
||||
a(error,"msg",0) false string
|
||||
a(error,"msg",1) false string
|
||||
a(error,"msg",2) false string
|
||||
a(error,"msg",3) false string
|
||||
a(error,"msg",4) false string
|
||||
a(error,"msg",5) false string
|
||||
a(error,"msg",6) false string
|
||||
a(nil()) false string
|
||||
a(t()) false string
|
||||
a(s()) false string
|
||||
a(true()) false string
|
||||
a(nil+1) false string
|
||||
a(a+1) false string
|
||||
a(s+1) false string
|
||||
a(true+1) false string
|
||||
a(nil.x) false string
|
||||
a(a.x) false string
|
||||
a(s.x) true nil
|
||||
a(true.x) false string
|
||||
a(nil.x=5) false string
|
||||
a(a.x=5) false string
|
||||
a(s.x=5) false string
|
||||
a(true.x=5) false string
|
||||
a(#nil) false string
|
||||
a(#t) true 0
|
||||
a(#s) true 11
|
||||
a(#a) false string
|
||||
a(#true) false string
|
||||
a(nil>1) false string
|
||||
a(a>1) false string
|
||||
a(s>1) false string
|
||||
a(true>1) false string
|
||||
a(-nil) false string
|
||||
a(-a) false string
|
||||
a(-s) false string
|
||||
a(-true) false string
|
||||
-------- string concatenation
|
||||
"a".."b" true
|
||||
"a"..nil false
|
||||
nil.."b" false
|
||||
"a"..{} false
|
||||
{}.."b" false
|
||||
"a"..2 true
|
||||
2.."b" true
|
||||
"a"..print false
|
||||
print.."b" false
|
||||
"a"..true false
|
||||
true.."b" false
|
||||
nil..true false
|
||||
"a"..3.5 true
|
||||
3.5.."b" true
|
||||
-------- table concatenation
|
||||
"a".."b" true
|
||||
"a"..nil false
|
||||
nil.."b" false
|
||||
"a"..{} false
|
||||
{}.."b" false
|
||||
"a"..2 true
|
||||
2.."b" true
|
||||
"a"..print false
|
||||
print.."b" false
|
||||
"a"..true false
|
||||
true.."b" false
|
||||
nil..true false
|
||||
"a"..3.5 true
|
||||
3.5.."b" true
|
||||
-------- pairs tests
|
||||
a(pairs(nil)) false string
|
||||
a(pairs(a)) false string
|
||||
a(pairs(s)) false string
|
||||
a(pairs(t)) true func.1
|
||||
a(pairs(true)) false string
|
||||
-------- setmetatable tests
|
||||
a(setmetatable(nil)) false string
|
||||
a(setmetatable(a)) false string
|
||||
a(setmetatable(s)) false string
|
||||
a(setmetatable(true)) false string
|
||||
a(setmetatable(t)) true tbl.2
|
||||
a(getmetatable(t)) true tbl.3
|
||||
a(setmetatable(t*)) true tbl.2
|
||||
a(getmetatable(t)) true tbl.4
|
||||
a(setmetatable(t)) false string
|
||||
a(getmetatable(t)) true tbl.4
|
||||
a(setmetatable(t)) true tbl.5
|
||||
a(getmetatable(t)) true tbl.6
|
||||
a(setmetatable(t*)) true tbl.5
|
||||
a(getmetatable(t)) true some string
|
||||
a(setmetatable(t)) false string
|
||||
a(getmetatable(t)) true some string
|
||||
a(setmetatable(t,nil)) false string
|
||||
a(setmetatable(t)) false string
|
||||
a(setmetatable({},"abc")) false string
|
||||
error("msg","arg") false string
|
||||
loadfile("bogus.txt") true nil
|
||||
dofile("bogus.txt") false string
|
||||
68
luaj-test/src/test/resources/compatibility/functions.out
Normal file
68
luaj-test/src/test/resources/compatibility/functions.out
Normal file
@@ -0,0 +1,68 @@
|
||||
f0:
|
||||
f0:
|
||||
f0:
|
||||
f0:
|
||||
f0:
|
||||
f1: nil
|
||||
f1: a1/1
|
||||
f1: a1/2
|
||||
f1: a1/3
|
||||
f1: a1/4
|
||||
f2: nil nil
|
||||
f2: a1/1 nil
|
||||
f2: a1/2 a2/2
|
||||
f2: a1/3 a2/3
|
||||
f2: a1/4 a2/4
|
||||
f3: nil nil nil
|
||||
f3: a1/1 nil nil
|
||||
f3: a1/2 a2/2 nil
|
||||
f3: a1/3 a2/3 a3/3
|
||||
f3: a1/4 a2/4 a3/4
|
||||
f4: nil nil nil nil
|
||||
f4: a1/1 nil nil nil
|
||||
f4: a1/2 a2/2 nil nil
|
||||
f4: a1/3 a2/3 a3/3 nil
|
||||
f4: a1/4 a2/4 a3/4 a4/4
|
||||
z0: nil
|
||||
z2: c2.3/4
|
||||
z4: c4.1/4
|
||||
g0: nil nil nil nil (eol)
|
||||
g2: b2.3/4 b2.4/4 nil nil (eol)
|
||||
g4: b4.1/4 b4.2/4 b4.3/4 b4.4/4 (eol)
|
||||
11 12 13
|
||||
23 22 21
|
||||
32 45 58
|
||||
a nil
|
||||
...
|
||||
...,a nil nil
|
||||
a,... nil
|
||||
a q
|
||||
...
|
||||
...,a nil q
|
||||
a,... q
|
||||
a q
|
||||
... r
|
||||
...,a r q
|
||||
a,... q r
|
||||
a q
|
||||
... r s
|
||||
...,a r q
|
||||
a,... q r s
|
||||
third abc nil | nil nil nil
|
||||
third def nil | nil nil nil
|
||||
third def nil | nil nil nil
|
||||
third abc p | p nil nil
|
||||
third def nil | p nil nil
|
||||
third def nil | p nil nil
|
||||
third abc p | p q nil
|
||||
third def q | p q nil
|
||||
third def q | p q nil
|
||||
third abc p | p q r
|
||||
third def q | p q r
|
||||
third def q | p q r
|
||||
third abc p | p q r
|
||||
third def q | p q r
|
||||
third def q | p q r
|
||||
third abc nil | nil nil nil
|
||||
third def nil | nil nil nil
|
||||
third def nil | nil nil nil
|
||||
96
luaj-test/src/test/resources/compatibility/iolib.out
Normal file
96
luaj-test/src/test/resources/compatibility/iolib.out
Normal file
@@ -0,0 +1,96 @@
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
write file.0
|
||||
Thiswrite file.0
|
||||
is a pen.write file.0
|
||||
flush true
|
||||
f userdata
|
||||
file.1
|
||||
write file.2
|
||||
type(f) file.1
|
||||
close true
|
||||
type(f) closed file
|
||||
type("f") nil
|
||||
"abc" string
|
||||
----- 1
|
||||
"def" string
|
||||
----- 2
|
||||
"12345" number
|
||||
----- 3
|
||||
"678910" number
|
||||
----- 4
|
||||
" more\7aaaaaa\8bbbthe rest" string
|
||||
----- 5
|
||||
h file.1 file.4 nil
|
||||
write file.3
|
||||
close true
|
||||
j file.1
|
||||
seek 3
|
||||
read def 123
|
||||
seek 2
|
||||
read cdef 12
|
||||
seek 1
|
||||
read bcde f 1
|
||||
seek(cur,0) 8
|
||||
seek(cur,20) 28
|
||||
seek(end,-5) 73
|
||||
read(4) "text"
|
||||
read(4) "."
|
||||
read(4) "nil"
|
||||
close true
|
||||
f.type file.5
|
||||
f file.6
|
||||
write file.6
|
||||
type(f) file.5
|
||||
close true
|
||||
"line one"
|
||||
"line two"
|
||||
""
|
||||
"after blank line"
|
||||
"unterminated line"
|
||||
"line one"
|
||||
"line two"
|
||||
""
|
||||
"after blank line"
|
||||
"unterminated line"
|
||||
"line one"
|
||||
"line two"
|
||||
""
|
||||
"after blank line"
|
||||
"unterminated line"
|
||||
"line one"
|
||||
"line two"
|
||||
""
|
||||
"after blank line"
|
||||
"unterminated line"
|
||||
file.7
|
||||
file.7
|
||||
a:write file.8
|
||||
b:write file.9
|
||||
a:setvbuf true
|
||||
a:setvbuf true
|
||||
a:setvbuf true
|
||||
a:write file.8
|
||||
b:write file.9
|
||||
a:flush true
|
||||
b:flush true
|
||||
a:close true
|
||||
a:write false closed
|
||||
a:flush false closed
|
||||
a:read false closed
|
||||
a:lines false closed
|
||||
a:seek false closed
|
||||
a:setvbuf false closed
|
||||
a:close false closed
|
||||
io.type(a) true
|
||||
io.close() true
|
||||
io.close(io.output()) true
|
||||
io.close() true
|
||||
io.write false closed
|
||||
io.flush false closed
|
||||
io.close false closed
|
||||
io.read false closed
|
||||
io.lines false closed
|
||||
321
luaj-test/src/test/resources/compatibility/luajit/debuglib.out
Normal file
321
luaj-test/src/test/resources/compatibility/luajit/debuglib.out
Normal file
@@ -0,0 +1,321 @@
|
||||
has debug true
|
||||
----- debug.getlocal, debug.setlocal
|
||||
true h-3-0 -> 3-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,0,#} f locals=,3,0,#,4,5,6
|
||||
true h-3-1 -> 3-1 get=a,3 set=a,nil get=a,# g locals=7,8,9 tbl={3,1,#} f locals=,#,1,#,4,5,6
|
||||
true h-3-2 -> 3-2 get=b,2 set=b,nil get=b,# g locals=7,8,9 tbl={3,2,#} f locals=,3,#,#,4,5,6
|
||||
true h-3-3 -> 3-3 get=c,# set=c,nil get=c,# g locals=7,8,9 tbl={3,3,#} f locals=,3,3,#,4,5,6
|
||||
true h-3-4 -> 3-4 get=d,4 set=d,nil get=d,# g locals=7,8,9 tbl={3,4,#} f locals=,3,4,#,#,5,6
|
||||
true h-3-5 -> 3-5 get=e,5 set=e,nil get=e,# g locals=7,8,9 tbl={3,5,#} f locals=,3,5,#,4,#,6
|
||||
true h-3-6 -> 3-6 get=f,6 set=f,nil get=f,# g locals=7,8,9 tbl={3,6,#} f locals=,3,6,#,4,5,#
|
||||
true h-3-7 -> 3-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={3,7,#} f locals=,3,7,#,4,5,6
|
||||
true h-2-0 -> 2-0 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,0,#} f locals=,2,0,#,4,5,6
|
||||
true h-2-1 -> 2-1 get=p,7 set=p,nil get=p,# g locals=#,8,9 tbl={2,1,#} f locals=,2,1,#,4,5,6
|
||||
true h-2-2 -> 2-2 get=q,8 set=q,nil get=q,# g locals=7,#,9 tbl={2,2,#} f locals=,2,2,#,4,5,6
|
||||
true h-2-3 -> 2-3 get=r,9 set=r,nil get=r,# g locals=7,8,# tbl={2,3,#} f locals=,2,3,#,4,5,6
|
||||
true h-2-4 -> 2-4 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,4,#} f locals=,2,4,#,4,5,6
|
||||
true h-2-5 -> 2-5 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,5,#} f locals=,2,5,#,4,5,6
|
||||
true h-2-6 -> 2-6 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,6,#} f locals=,2,6,#,4,5,6
|
||||
true h-2-7 -> 2-7 get=nil,nil set=nil,nil get=nil,nil g locals=7,8,9 tbl={2,7,#} f locals=,2,7,#,4,5,6
|
||||
true h-1-3 -> 1-3 get=n,# set=n,nil get=n,# g locals=7,8,9 tbl={1,3,#} f locals=,1,3,#,4,5,6
|
||||
true h-1-4 -> 1-4 get=#,nil set=x1,nil get=x1,# g locals=7,8,9 tbl={1,4,#} f locals=,1,4,#,4,5,6
|
||||
true h-1-5 -> 1-5 get=nil,# set=y1,nil get=y1,# g locals=7,8,9 tbl={1,5,#} f locals=,1,5,#,4,5,6
|
||||
true h-1-6 -> 1-6 get=nil,nil set=nil,nil get=x2,nil g locals=7,8,9 tbl={1,6,#} f locals=,1,6,#,4,5,6
|
||||
true h-1-7 -> 1-7 get=nil,nil set=nil,nil get=y2,nil g locals=7,8,9 tbl={1,7,#} f locals=,1,7,#,4,5,6
|
||||
----- debug.getupvalue, debug.setupvalue
|
||||
h 101 102 103 104 105 106 107 108 109
|
||||
f -> 1-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,101,102,103,104,105,106,107,108,109
|
||||
f -> 1-1 get=true,m,101 set=true,m,nil get=true,m,777001 tbl=true,777001,102,103,104,105,106,107,108,109
|
||||
f -> 1-2 get=true,n,102 set=true,n,nil get=true,n,777002 tbl=true,777001,777002,103,104,105,106,107,108,109
|
||||
f -> 1-3 get=true,o,103 set=true,o,nil get=true,o,777003 tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-4 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-5 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-6 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
f -> 1-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
g -> 2-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,777001,777002,777003,104,105,106,107,108,109
|
||||
g -> 2-1 get=true,m,777001 set=true,m,nil get=true,m,888001 tbl=true,888001,777002,777003,104,105,106,107,108,109
|
||||
g -> 2-2 get=true,n,777002 set=true,n,nil get=true,n,888002 tbl=true,888001,888002,777003,104,105,106,107,108,109
|
||||
g -> 2-3 get=true,o,777003 set=true,o,nil get=true,o,888003 tbl=true,888001,888002,888003,104,105,106,107,108,109
|
||||
g -> 2-4 get=true,p,104 set=true,p,nil get=true,p,888004 tbl=true,888001,888002,888003,888004,105,106,107,108,109
|
||||
g -> 2-5 get=true,q,105 set=true,q,nil get=true,q,888005 tbl=true,888001,888002,888003,888004,888005,106,107,108,109
|
||||
g -> 2-6 get=true,r,106 set=true,r,nil get=true,r,888006 tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-7 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-8 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-9 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
g -> 2-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-0 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,888001,888002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-1 get=true,m,888001 set=true,m,nil get=true,m,999001 tbl=true,999001,888002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-2 get=true,n,888002 set=true,n,nil get=true,n,999002 tbl=true,999001,999002,888003,888004,888005,888006,107,108,109
|
||||
h -> 3-3 get=true,o,888003 set=true,o,nil get=true,o,999003 tbl=true,999001,999002,999003,888004,888005,888006,107,108,109
|
||||
h -> 3-4 get=true,p,888004 set=true,p,nil get=true,p,999004 tbl=true,999001,999002,999003,999004,888005,888006,107,108,109
|
||||
h -> 3-5 get=true,q,888005 set=true,q,nil get=true,q,999005 tbl=true,999001,999002,999003,999004,999005,888006,107,108,109
|
||||
h -> 3-6 get=true,r,888006 set=true,r,nil get=true,r,999006 tbl=true,999001,999002,999003,999004,999005,999006,107,108,109
|
||||
h -> 3-7 get=true,v,107 set=true,v,nil get=true,v,999007 tbl=true,999001,999002,999003,999004,999005,999006,999007,108,109
|
||||
h -> 3-8 get=true,w,108 set=true,w,nil get=true,w,999008 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,109
|
||||
h -> 3-9 get=true,x,109 set=true,x,nil get=true,x,999009 tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
|
||||
h -> 3-10 get=true,nil,nil set=true,nil,nil get=true,nil,nil tbl=true,999001,999002,999003,999004,999005,999006,999007,999008,999009
|
||||
----- debug.setmetatable, debug.getmetatable
|
||||
a.a=bbb a.b=nil b.a=nil b.b=nil
|
||||
a.a=bbb a.b=ccc b.a=nil b.b=nil
|
||||
boolean table nil table
|
||||
boolean nil nil nil
|
||||
boolean boolean nil nil
|
||||
a.a=bbb a.b=nil b.a=nil b.b=nil
|
||||
boolean nil nil nil
|
||||
get=true,true,nil
|
||||
set=true,false,nil
|
||||
get=true,true,nil
|
||||
get=true,true,nil
|
||||
set=true,false,nil
|
||||
get=true,true,nil
|
||||
true nil
|
||||
true true
|
||||
true true
|
||||
----- debug.getinfo
|
||||
6
|
||||
---
|
||||
debug.getinfo(1)
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: 144
|
||||
linedefined: 141
|
||||
lastlinedefined: 155
|
||||
nups: 4
|
||||
func: function
|
||||
debug.getinfo(1,"")
|
||||
debug.getinfo(1,"l")
|
||||
currentline: 146
|
||||
debug.getinfo(1,"fL")
|
||||
func: function
|
||||
activelines: {}
|
||||
debug.getinfo(2)
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: 157
|
||||
linedefined: 135
|
||||
lastlinedefined: 159
|
||||
nups: 5
|
||||
func: function
|
||||
debug.getinfo(2,"l")
|
||||
currentline: 157
|
||||
debug.getinfo(2,"fL")
|
||||
func: function
|
||||
activelines: {}
|
||||
debug.getinfo(10,"")
|
||||
true
|
||||
debug.getinfo(-10,"")
|
||||
true
|
||||
---
|
||||
5
|
||||
e,f,g true function function
|
||||
debug.getinfo(f)
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 137
|
||||
lastlinedefined: 140
|
||||
nups: 1
|
||||
func: function
|
||||
debug.getinfo(f,"nSlufL")
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 137
|
||||
lastlinedefined: 140
|
||||
nups: 1
|
||||
func: function
|
||||
activelines: {}
|
||||
debug.getinfo(f,"n")
|
||||
true
|
||||
debug.getinfo(f,"S")
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
linedefined: 137
|
||||
lastlinedefined: 140
|
||||
debug.getinfo(f,"l")
|
||||
true
|
||||
currentline: -1
|
||||
debug.getinfo(f,"u")
|
||||
true
|
||||
nups: 1
|
||||
debug.getinfo(f,"f")
|
||||
true
|
||||
func: function
|
||||
debug.getinfo(f,"L")
|
||||
true
|
||||
activelines: {}
|
||||
debug.getinfo(g)
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 141
|
||||
lastlinedefined: 155
|
||||
nups: 4
|
||||
func: function
|
||||
debug.getinfo(test)
|
||||
true
|
||||
source: @debuglib.lua
|
||||
short_src: debuglib.lua
|
||||
what: Lua
|
||||
currentline: -1
|
||||
linedefined: 135
|
||||
lastlinedefined: 159
|
||||
nups: 5
|
||||
func: function
|
||||
----- debug.sethook, debug.gethook
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,174
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,175
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
hook = c -> result=true,nil,nil,nil,false,false,nil
|
||||
hook = r -> result=true,nil,nil,nil,false,false,nil
|
||||
... in hook line 192
|
||||
info[2]=debuglib.lua,192
|
||||
... in hook line 177
|
||||
info[2]=debuglib.lua,177
|
||||
... in hook line 178
|
||||
info[2]=debuglib.lua,178
|
||||
... in hook line 176
|
||||
info[2]=debuglib.lua,176
|
||||
... in hook line 195
|
||||
info[2]=debuglib.lua,195
|
||||
hook = l -> result=true,nil,nil,nil,false,false,nil
|
||||
... in hook line 192
|
||||
info[2]=debuglib.lua,192
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,174
|
||||
... in hook line 177
|
||||
info[2]=debuglib.lua,177
|
||||
... in hook line 178
|
||||
info[2]=debuglib.lua,178
|
||||
... in hook call nil
|
||||
info[2]=debuglib.lua,175
|
||||
... in hook line 176
|
||||
info[2]=debuglib.lua,176
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
... in hook line 195
|
||||
info[2]=debuglib.lua,195
|
||||
... in hook call nil
|
||||
info[2]=[C],-1
|
||||
hook = crl -> result=true,nil,nil,nil,false,false,nil
|
||||
----- debug.traceback
|
||||
hi
|
||||
stack traceback:
|
||||
debuglib.lua:216: in function <debuglib.lua:215>
|
||||
[C]: in function 'pcall'
|
||||
debuglib.lua:219: in function 'b'
|
||||
debuglib.lua:222: in function 'c'
|
||||
debuglib.lua:225: in function '__index'
|
||||
debuglib.lua:227: in function 'e'
|
||||
debuglib.lua:231: in function 'g'
|
||||
debuglib.lua:235: in function 'i'
|
||||
debuglib.lua:238: in function <debuglib.lua:214>
|
||||
[C]: in function 'pcall'
|
||||
debuglib.lua:240: in main chunk
|
||||
[C]: at 0x55eaaf4e2f20
|
||||
----- debug.upvalueid
|
||||
debug.getupvalue(a1,1) x 100
|
||||
debug.getupvalue(a1,2) y 200
|
||||
debug.getupvalue(a2,1) x 100
|
||||
debug.getupvalue(a2,2) y 200
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) false
|
||||
----- debug.upvaluejoin
|
||||
a1 101 201 301 401
|
||||
a2 102 202 501 601
|
||||
debug.upvaluejoin(a1,1,a2,2)
|
||||
debug.upvaluejoin(a1,3,a2,4)
|
||||
a1 203 203 602 402
|
||||
a2 103 204 502 603
|
||||
a1 205 205 604 403
|
||||
a2 104 206 503 605
|
||||
debug.getupvalue(a1,1) x 206
|
||||
debug.getupvalue(a2,1) x 104
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,1) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,2) true
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,2) true
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a1,1) == debug.upvalueid(a2,4) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,1) == debug.upvalueid(a2,4) false
|
||||
debug.getupvalue(a1,2) y 206
|
||||
debug.getupvalue(a2,2) y 206
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,1) true
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,2) true
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,2) true
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,2) true
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,2) true
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a1,2) == debug.upvalueid(a2,4) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,2) == debug.upvalueid(a2,4) false
|
||||
debug.getupvalue(a1,3) z 605
|
||||
debug.getupvalue(a2,3) z 503
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,3) true
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,3) true
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a1,3) == debug.upvalueid(a2,4) true
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,3) == debug.upvalueid(a2,4) false
|
||||
debug.getupvalue(a1,4) w 403
|
||||
debug.getupvalue(a2,4) w 605
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,1) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,1) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,2) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,2) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,3) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,3) true
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,3) false
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a1,4) true
|
||||
debug.upvalueid(a1,4) == debug.upvalueid(a2,4) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a1,4) false
|
||||
debug.upvalueid(a2,4) == debug.upvalueid(a2,4) true
|
||||
1981
luaj-test/src/test/resources/compatibility/manyupvals.out
Normal file
1981
luaj-test/src/test/resources/compatibility/manyupvals.out
Normal file
File diff suppressed because it is too large
Load Diff
842
luaj-test/src/test/resources/compatibility/mathlib.out
Normal file
842
luaj-test/src/test/resources/compatibility/mathlib.out
Normal file
@@ -0,0 +1,842 @@
|
||||
---------- miscellaneous tests ----------
|
||||
math.sin( 0.0 ) true <zero>
|
||||
math.cos( math.pi ) true -1
|
||||
math.sqrt( 9.0 ) true 3
|
||||
math.modf( 5.25 ) true 5 0.25
|
||||
math.frexp(0.00625) true 0.8 -7
|
||||
-5 ^ 2 true -25
|
||||
-5 / 2 true -2.5
|
||||
-5 % 2 true 1
|
||||
---------- constants ----------
|
||||
math.huge true <pos-inf>
|
||||
math.pi true 3.1415
|
||||
---------- unary operator - ----------
|
||||
--2.5 true
|
||||
--2 true
|
||||
-0 true <zero>
|
||||
-2 true -2
|
||||
-2.5 true -2.5
|
||||
-'-2.5' true 2.5
|
||||
-'-2' true 2
|
||||
-'0' true <zero>
|
||||
-'2' true -2
|
||||
-'2.5' true -2.5
|
||||
---------- unary operator not ----------
|
||||
not -2.5 true false
|
||||
not -2 true false
|
||||
not 0 true false
|
||||
not 2 true false
|
||||
not 2.5 true false
|
||||
not '-2.5' true false
|
||||
not '-2' true false
|
||||
not '0' true false
|
||||
not '2' true false
|
||||
not '2.5' true false
|
||||
---------- binary operator + ----------
|
||||
2+0 true 2
|
||||
-2.5+0 true -2.5
|
||||
2+1 true 3
|
||||
5+2 true 7
|
||||
-5+2 true -3
|
||||
16+2 true 18
|
||||
-16+-2 true -18
|
||||
0.5+0 true 0.5
|
||||
0.5+1 true 1.5
|
||||
0.5+2 true 2.5
|
||||
0.5+-1 true -0.5
|
||||
0.5+2 true 2.5
|
||||
2.25+0 true 2.25
|
||||
2.25+2 true 4.25
|
||||
-2+0 true -2
|
||||
3+3 true 6
|
||||
'2'+'0' true 2
|
||||
'2.5'+'3' true 5.5
|
||||
'-2'+'1.5' true -0.5
|
||||
'-2.5'+'-1.5' true -4
|
||||
'3.0'+'3.0' true 6
|
||||
2.75+2.75 true 5.5
|
||||
'2.75'+'2.75' true 5.5
|
||||
3+'3' true 6
|
||||
'3'+3 true 6
|
||||
2.75+'2.75' true 5.5
|
||||
'2.75'+2.75 true 5.5
|
||||
-3+'-4' true -7
|
||||
'-3'+4 true 1
|
||||
-3+'4' true 1
|
||||
'-3'+-4 true -7
|
||||
-4.75+'2.75' true -2
|
||||
'-2.75'+1.75 true -1
|
||||
4.75+'-2.75' true 2
|
||||
'2.75'+-1.75 true 1
|
||||
---------- binary operator - ----------
|
||||
2-0 true 2
|
||||
-2.5-0 true -2.5
|
||||
2-1 true 1
|
||||
5-2 true 3
|
||||
-5-2 true -7
|
||||
16-2 true 14
|
||||
-16--2 true -14
|
||||
0.5-0 true 0.5
|
||||
0.5-1 true -0.5
|
||||
0.5-2 true -1.5
|
||||
0.5--1 true 1.5
|
||||
0.5-2 true -1.5
|
||||
2.25-0 true 2.25
|
||||
2.25-2 true 0.25
|
||||
-2-0 true -2
|
||||
3-3 true <zero>
|
||||
'2'-'0' true 2
|
||||
'2.5'-'3' true -0.5
|
||||
'-2'-'1.5' true -3.5
|
||||
'-2.5'-'-1.5' true -1
|
||||
'3.0'-'3.0' true <zero>
|
||||
2.75-2.75 true <zero>
|
||||
'2.75'-'2.75' true <zero>
|
||||
3-'3' true <zero>
|
||||
'3'-3 true <zero>
|
||||
2.75-'2.75' true <zero>
|
||||
'2.75'-2.75 true <zero>
|
||||
-3-'-4' true 1
|
||||
'-3'-4 true -7
|
||||
-3-'4' true -7
|
||||
'-3'--4 true 1
|
||||
-4.75-'2.75' true -7.5
|
||||
'-2.75'-1.75 true -4.5
|
||||
4.75-'-2.75' true 7.5
|
||||
'2.75'--1.75 true 4.5
|
||||
---------- binary operator * ----------
|
||||
2*0 true <zero>
|
||||
-2.5*0 true <zero>
|
||||
2*1 true 2
|
||||
5*2 true 10
|
||||
-5*2 true -10
|
||||
16*2 true 32
|
||||
-16*-2 true 32
|
||||
0.5*0 true <zero>
|
||||
0.5*1 true 0.5
|
||||
0.5*2 true 1
|
||||
0.5*-1 true -0.5
|
||||
0.5*2 true 1
|
||||
2.25*0 true <zero>
|
||||
2.25*2 true 4.5
|
||||
-2*0 true <zero>
|
||||
3*3 true 9
|
||||
'2'*'0' true <zero>
|
||||
'2.5'*'3' true 7.5
|
||||
'-2'*'1.5' true -3
|
||||
'-2.5'*'-1.5' true 3.75
|
||||
'3.0'*'3.0' true 9
|
||||
2.75*2.75 true 7.5625
|
||||
'2.75'*'2.75' true 7.5625
|
||||
3*'3' true 9
|
||||
'3'*3 true 9
|
||||
2.75*'2.75' true 7.5625
|
||||
'2.75'*2.75 true 7.5625
|
||||
-3*'-4' true 12
|
||||
'-3'*4 true -12
|
||||
-3*'4' true -12
|
||||
'-3'*-4 true 12
|
||||
-4.75*'2.75' true -13.06
|
||||
'-2.75'*1.75 true -4.812
|
||||
4.75*'-2.75' true -13.06
|
||||
'2.75'*-1.75 true -4.812
|
||||
---------- binary operator ^ ----------
|
||||
2^0 true 1
|
||||
-2.5^0 true 1
|
||||
2^1 true 2
|
||||
5^2 true 25
|
||||
-5^2 true 25
|
||||
16^2 true 256
|
||||
-16^-2 true 0.0039
|
||||
0.5^0 true 1
|
||||
0.5^1 true 0.5
|
||||
0.5^2 true 0.25
|
||||
0.5^-1 true 2
|
||||
0.5^2 true 0.25
|
||||
2.25^0 true 1
|
||||
2.25^2 true 5.0625
|
||||
-2^0 true 1
|
||||
3^3 true 27
|
||||
'2'^'0' true 1
|
||||
'2.5'^'3' true 15.625
|
||||
'-2'^'1.5' true <nan>
|
||||
'-2.5'^'-1.5' true <nan>
|
||||
'3.0'^'3.0' true 27
|
||||
2.75^2.75 true 16.149
|
||||
'2.75'^'2.75' true 16.149
|
||||
3^'3' true 27
|
||||
'3'^3 true 27
|
||||
2.75^'2.75' true 16.149
|
||||
'2.75'^2.75 true 16.149
|
||||
-3^'-4' true 0.0123
|
||||
'-3'^4 true 81
|
||||
-3^'4' true 81
|
||||
'-3'^-4 true 0.0123
|
||||
-4.75^'2.75' true <nan>
|
||||
'-2.75'^1.75 true <nan>
|
||||
4.75^'-2.75' true 0.0137
|
||||
'2.75'^-1.75 true 0.1702
|
||||
---------- binary operator / ----------
|
||||
2/0 true <pos-inf>
|
||||
-2.5/0 true <neg-inf>
|
||||
2/1 true 2
|
||||
5/2 true 2.5
|
||||
-5/2 true -2.5
|
||||
16/2 true 8
|
||||
-16/-2 true 8
|
||||
0.5/0 true <pos-inf>
|
||||
0.5/1 true 0.5
|
||||
0.5/2 true 0.25
|
||||
0.5/-1 true -0.5
|
||||
0.5/2 true 0.25
|
||||
2.25/0 true <pos-inf>
|
||||
2.25/2 true 1.125
|
||||
-2/0 true <neg-inf>
|
||||
3/3 true 1
|
||||
'2'/'0' true <pos-inf>
|
||||
'2.5'/'3' true 0.8333
|
||||
'-2'/'1.5' true -1.333
|
||||
'-2.5'/'-1.5' true 1.6666
|
||||
'3.0'/'3.0' true 1
|
||||
2.75/2.75 true 1
|
||||
'2.75'/'2.75' true 1
|
||||
3/'3' true 1
|
||||
'3'/3 true 1
|
||||
2.75/'2.75' true 1
|
||||
'2.75'/2.75 true 1
|
||||
-3/'-4' true 0.75
|
||||
'-3'/4 true -0.75
|
||||
-3/'4' true -0.75
|
||||
'-3'/-4 true 0.75
|
||||
-4.75/'2.75' true -1.727
|
||||
'-2.75'/1.75 true -1.571
|
||||
4.75/'-2.75' true -1.727
|
||||
'2.75'/-1.75 true -1.571
|
||||
---------- binary operator % ----------
|
||||
2%0 true <nan>
|
||||
-2.5%0 true <nan>
|
||||
2%1 true <zero>
|
||||
5%2 true 1
|
||||
-5%2 true 1
|
||||
16%2 true <zero>
|
||||
-16%-2 true <zero>
|
||||
0.5%0 true <nan>
|
||||
0.5%1 true 0.5
|
||||
0.5%2 true 0.5
|
||||
0.5%-1 true -0.5
|
||||
0.5%2 true 0.5
|
||||
2.25%0 true <nan>
|
||||
2.25%2 true 0.25
|
||||
-2%0 true <nan>
|
||||
3%3 true <zero>
|
||||
'2'%'0' true <nan>
|
||||
'2.5'%'3' true 2.5
|
||||
'-2'%'1.5' true 1
|
||||
'-2.5'%'-1.5' true -1
|
||||
'3.0'%'3.0' true <zero>
|
||||
2.75%2.75 true <zero>
|
||||
'2.75'%'2.75' true <zero>
|
||||
3%'3' true <zero>
|
||||
'3'%3 true <zero>
|
||||
2.75%'2.75' true <zero>
|
||||
'2.75'%2.75 true <zero>
|
||||
-3%'-4' true -3
|
||||
'-3'%4 true 1
|
||||
-3%'4' true 1
|
||||
'-3'%-4 true -3
|
||||
-4.75%'2.75' true 0.75
|
||||
'-2.75'%1.75 true 0.75
|
||||
4.75%'-2.75' true -0.75
|
||||
'2.75'%-1.75 true -0.75
|
||||
---------- binary operator == ----------
|
||||
2==0 true false
|
||||
-2.5==0 true false
|
||||
2==1 true false
|
||||
5==2 true false
|
||||
-5==2 true false
|
||||
16==2 true false
|
||||
-16==-2 true false
|
||||
0.5==0 true false
|
||||
0.5==1 true false
|
||||
0.5==2 true false
|
||||
0.5==-1 true false
|
||||
0.5==2 true false
|
||||
2.25==0 true false
|
||||
2.25==2 true false
|
||||
-2==0 true false
|
||||
3==3 true true
|
||||
'2'=='0' true false
|
||||
'2.5'=='3' true false
|
||||
'-2'=='1.5' true false
|
||||
'-2.5'=='-1.5' true false
|
||||
'3.0'=='3.0' true true
|
||||
2.75==2.75 true true
|
||||
'2.75'=='2.75' true true
|
||||
---------- binary operator ~= ----------
|
||||
2~=0 true true
|
||||
-2.5~=0 true true
|
||||
2~=1 true true
|
||||
5~=2 true true
|
||||
-5~=2 true true
|
||||
16~=2 true true
|
||||
-16~=-2 true true
|
||||
0.5~=0 true true
|
||||
0.5~=1 true true
|
||||
0.5~=2 true true
|
||||
0.5~=-1 true true
|
||||
0.5~=2 true true
|
||||
2.25~=0 true true
|
||||
2.25~=2 true true
|
||||
-2~=0 true true
|
||||
3~=3 true false
|
||||
'2'~='0' true true
|
||||
'2.5'~='3' true true
|
||||
'-2'~='1.5' true true
|
||||
'-2.5'~='-1.5' true true
|
||||
'3.0'~='3.0' true false
|
||||
2.75~=2.75 true false
|
||||
'2.75'~='2.75' true false
|
||||
---------- binary operator > ----------
|
||||
2>0 true true
|
||||
-2.5>0 true false
|
||||
2>1 true true
|
||||
5>2 true true
|
||||
-5>2 true false
|
||||
16>2 true true
|
||||
-16>-2 true false
|
||||
0.5>0 true true
|
||||
0.5>1 true false
|
||||
0.5>2 true false
|
||||
0.5>-1 true true
|
||||
0.5>2 true false
|
||||
2.25>0 true true
|
||||
2.25>2 true true
|
||||
-2>0 true false
|
||||
3>3 true false
|
||||
'2'>'0' true true
|
||||
'2.5'>'3' true false
|
||||
'-2'>'1.5' true false
|
||||
'-2.5'>'-1.5' true true
|
||||
'3.0'>'3.0' true false
|
||||
2.75>2.75 true false
|
||||
'2.75'>'2.75' true false
|
||||
---------- binary operator < ----------
|
||||
2<0 true false
|
||||
-2.5<0 true true
|
||||
2<1 true false
|
||||
5<2 true false
|
||||
-5<2 true true
|
||||
16<2 true false
|
||||
-16<-2 true true
|
||||
0.5<0 true false
|
||||
0.5<1 true true
|
||||
0.5<2 true true
|
||||
0.5<-1 true false
|
||||
0.5<2 true true
|
||||
2.25<0 true false
|
||||
2.25<2 true false
|
||||
-2<0 true true
|
||||
3<3 true false
|
||||
'2'<'0' true false
|
||||
'2.5'<'3' true true
|
||||
'-2'<'1.5' true true
|
||||
'-2.5'<'-1.5' true false
|
||||
'3.0'<'3.0' true false
|
||||
2.75<2.75 true false
|
||||
'2.75'<'2.75' true false
|
||||
---------- binary operator >= ----------
|
||||
2>=0 true true
|
||||
-2.5>=0 true false
|
||||
2>=1 true true
|
||||
5>=2 true true
|
||||
-5>=2 true false
|
||||
16>=2 true true
|
||||
-16>=-2 true false
|
||||
0.5>=0 true true
|
||||
0.5>=1 true false
|
||||
0.5>=2 true false
|
||||
0.5>=-1 true true
|
||||
0.5>=2 true false
|
||||
2.25>=0 true true
|
||||
2.25>=2 true true
|
||||
-2>=0 true false
|
||||
3>=3 true true
|
||||
'2'>='0' true true
|
||||
'2.5'>='3' true false
|
||||
'-2'>='1.5' true false
|
||||
'-2.5'>='-1.5' true true
|
||||
'3.0'>='3.0' true true
|
||||
2.75>=2.75 true true
|
||||
'2.75'>='2.75' true true
|
||||
---------- binary operator <= ----------
|
||||
2<=0 true false
|
||||
-2.5<=0 true true
|
||||
2<=1 true false
|
||||
5<=2 true false
|
||||
-5<=2 true true
|
||||
16<=2 true false
|
||||
-16<=-2 true true
|
||||
0.5<=0 true false
|
||||
0.5<=1 true true
|
||||
0.5<=2 true true
|
||||
0.5<=-1 true false
|
||||
0.5<=2 true true
|
||||
2.25<=0 true false
|
||||
2.25<=2 true false
|
||||
-2<=0 true true
|
||||
3<=3 true true
|
||||
'2'<='0' true false
|
||||
'2.5'<='3' true true
|
||||
'-2'<='1.5' true true
|
||||
'-2.5'<='-1.5' true false
|
||||
'3.0'<='3.0' true true
|
||||
2.75<=2.75 true true
|
||||
'2.75'<='2.75' true true
|
||||
---------- math.abs ----------
|
||||
math.abs(-2.5) true 2.5
|
||||
math.abs(-2) true 2
|
||||
math.abs(0) true <zero>
|
||||
math.abs(2) true 2
|
||||
math.abs(2.5) true 2.5
|
||||
math.abs('-2.5') true 2.5
|
||||
math.abs('-2') true 2
|
||||
math.abs('0') true <zero>
|
||||
math.abs('2') true 2
|
||||
math.abs('2.5') true 2.5
|
||||
---------- math.ceil ----------
|
||||
math.ceil(-2.5) true -2
|
||||
math.ceil(-2) true -2
|
||||
math.ceil(0) true <zero>
|
||||
math.ceil(2) true 2
|
||||
math.ceil(2.5) true 3
|
||||
math.ceil('-2.5') true -2
|
||||
math.ceil('-2') true -2
|
||||
math.ceil('0') true <zero>
|
||||
math.ceil('2') true 2
|
||||
math.ceil('2.5') true 3
|
||||
---------- math.cos ----------
|
||||
math.cos(-2.5) true -0.801
|
||||
math.cos(-2) true -0.416
|
||||
math.cos(0) true 1
|
||||
math.cos(2) true -0.416
|
||||
math.cos(2.5) true -0.801
|
||||
math.cos('-2.5') true -0.801
|
||||
math.cos('-2') true -0.416
|
||||
math.cos('0') true 1
|
||||
math.cos('2') true -0.416
|
||||
math.cos('2.5') true -0.801
|
||||
---------- math.deg ----------
|
||||
math.deg(-2.5) true -143.2
|
||||
math.deg(-2) true -114.5
|
||||
math.deg(0) true <zero>
|
||||
math.deg(2) true 114.59
|
||||
math.deg(2.5) true 143.23
|
||||
math.deg('-2.5') true -143.2
|
||||
math.deg('-2') true -114.5
|
||||
math.deg('0') true <zero>
|
||||
math.deg('2') true 114.59
|
||||
math.deg('2.5') true 143.23
|
||||
---------- math.exp ----------
|
||||
math.exp(-2.5) true 0.0820
|
||||
math.exp(-2) true 0.1353
|
||||
math.exp(0) true 1
|
||||
math.exp(2) true 7.3890
|
||||
math.exp(2.5) true 12.182
|
||||
math.exp('-2.5') true 0.0820
|
||||
math.exp('-2') true 0.1353
|
||||
math.exp('0') true 1
|
||||
math.exp('2') true 7.3890
|
||||
math.exp('2.5') true 12.182
|
||||
---------- math.floor ----------
|
||||
math.floor(-2.5) true -3
|
||||
math.floor(-2) true -2
|
||||
math.floor(0) true <zero>
|
||||
math.floor(2) true 2
|
||||
math.floor(2.5) true 2
|
||||
math.floor('-2.5') true -3
|
||||
math.floor('-2') true -2
|
||||
math.floor('0') true <zero>
|
||||
math.floor('2') true 2
|
||||
math.floor('2.5') true 2
|
||||
---------- math.frexp ----------
|
||||
math.frexp(-2.5) true -0.625 2
|
||||
math.frexp(-2) true -0.5 2
|
||||
math.frexp(0) true <zero> <zero>
|
||||
math.frexp(2) true 0.5 2
|
||||
math.frexp(2.5) true 0.625 2
|
||||
math.frexp('-2.5') true -0.625 2
|
||||
math.frexp('-2') true -0.5 2
|
||||
math.frexp('0') true <zero> <zero>
|
||||
math.frexp('2') true 0.5 2
|
||||
math.frexp('2.5') true 0.625 2
|
||||
---------- math.modf ----------
|
||||
math.modf(-2.5) true -2 -0.5
|
||||
math.modf(-2) true -2 <zero>
|
||||
math.modf(0) true <zero> <zero>
|
||||
math.modf(2) true 2 <zero>
|
||||
math.modf(2.5) true 2 0.5
|
||||
math.modf('-2.5') true -2 -0.5
|
||||
math.modf('-2') true -2 <zero>
|
||||
math.modf('0') true <zero> <zero>
|
||||
math.modf('2') true 2 <zero>
|
||||
math.modf('2.5') true 2 0.5
|
||||
---------- math.rad ----------
|
||||
math.rad(-2.5) true -0.043
|
||||
math.rad(-2) true -0.034
|
||||
math.rad(0) true <zero>
|
||||
math.rad(2) true 0.0349
|
||||
math.rad(2.5) true 0.0436
|
||||
math.rad('-2.5') true -0.043
|
||||
math.rad('-2') true -0.034
|
||||
math.rad('0') true <zero>
|
||||
math.rad('2') true 0.0349
|
||||
math.rad('2.5') true 0.0436
|
||||
---------- math.sin ----------
|
||||
math.sin(-2.5) true -0.598
|
||||
math.sin(-2) true -0.909
|
||||
math.sin(0) true <zero>
|
||||
math.sin(2) true 0.9092
|
||||
math.sin(2.5) true 0.5984
|
||||
math.sin('-2.5') true -0.598
|
||||
math.sin('-2') true -0.909
|
||||
math.sin('0') true <zero>
|
||||
math.sin('2') true 0.9092
|
||||
math.sin('2.5') true 0.5984
|
||||
---------- math.sqrt ----------
|
||||
math.sqrt(-2.5) true <nan>
|
||||
math.sqrt(-2) true <nan>
|
||||
math.sqrt(0) true <zero>
|
||||
math.sqrt(2) true 1.4142
|
||||
math.sqrt(2.5) true 1.5811
|
||||
math.sqrt('-2.5') true <nan>
|
||||
math.sqrt('-2') true <nan>
|
||||
math.sqrt('0') true <zero>
|
||||
math.sqrt('2') true 1.4142
|
||||
math.sqrt('2.5') true 1.5811
|
||||
---------- math.tan ----------
|
||||
math.tan(-2.5) true 0.7470
|
||||
math.tan(-2) true 2.1850
|
||||
math.tan(0) true <zero>
|
||||
math.tan(2) true -2.185
|
||||
math.tan(2.5) true -0.747
|
||||
math.tan('-2.5') true 0.7470
|
||||
math.tan('-2') true 2.1850
|
||||
math.tan('0') true <zero>
|
||||
math.tan('2') true -2.185
|
||||
math.tan('2.5') true -0.747
|
||||
---------- math.acos (jse only) ----------
|
||||
math.acos(-2.5) true <nan>
|
||||
math.acos(-2) true <nan>
|
||||
math.acos(0) true 1.5707
|
||||
math.acos(2) true <nan>
|
||||
math.acos(2.5) true <nan>
|
||||
math.acos('-2.5') true <nan>
|
||||
math.acos('-2') true <nan>
|
||||
math.acos('0') true 1.5707
|
||||
math.acos('2') true <nan>
|
||||
math.acos('2.5') true <nan>
|
||||
---------- math.asin (jse only) ----------
|
||||
math.asin(-2.5) true <nan>
|
||||
math.asin(-2) true <nan>
|
||||
math.asin(0) true <zero>
|
||||
math.asin(2) true <nan>
|
||||
math.asin(2.5) true <nan>
|
||||
math.asin('-2.5') true <nan>
|
||||
math.asin('-2') true <nan>
|
||||
math.asin('0') true <zero>
|
||||
math.asin('2') true <nan>
|
||||
math.asin('2.5') true <nan>
|
||||
---------- math.atan (jse only) ----------
|
||||
math.atan(-2.5) true -1.190
|
||||
math.atan(-2) true -1.107
|
||||
math.atan(0) true <zero>
|
||||
math.atan(2) true 1.1071
|
||||
math.atan(2.5) true 1.1902
|
||||
math.atan('-2.5') true -1.190
|
||||
math.atan('-2') true -1.107
|
||||
math.atan('0') true <zero>
|
||||
math.atan('2') true 1.1071
|
||||
math.atan('2.5') true 1.1902
|
||||
---------- math.cosh (jse only) ----------
|
||||
math.cosh(-2.5) true 6.1322
|
||||
math.cosh(-2) true 3.7621
|
||||
math.cosh(0) true 1
|
||||
math.cosh(2) true 3.7621
|
||||
math.cosh(2.5) true 6.1322
|
||||
math.cosh('-2.5') true 6.1322
|
||||
math.cosh('-2') true 3.7621
|
||||
math.cosh('0') true 1
|
||||
math.cosh('2') true 3.7621
|
||||
math.cosh('2.5') true 6.1322
|
||||
---------- math.log (jse only) ----------
|
||||
math.log(-2.5) true <nan>
|
||||
math.log(-2) true <nan>
|
||||
math.log(0) true <neg-inf>
|
||||
math.log(2) true 0.6931
|
||||
math.log(2.5) true 0.9162
|
||||
math.log('-2.5') true <nan>
|
||||
math.log('-2') true <nan>
|
||||
math.log('0') true <neg-inf>
|
||||
math.log('2') true 0.6931
|
||||
math.log('2.5') true 0.9162
|
||||
---------- math.sinh (jse only) ----------
|
||||
math.sinh(-2.5) true -6.050
|
||||
math.sinh(-2) true -3.626
|
||||
math.sinh(0) true <zero>
|
||||
math.sinh(2) true 3.6268
|
||||
math.sinh(2.5) true 6.0502
|
||||
math.sinh('-2.5') true -6.050
|
||||
math.sinh('-2') true -3.626
|
||||
math.sinh('0') true <zero>
|
||||
math.sinh('2') true 3.6268
|
||||
math.sinh('2.5') true 6.0502
|
||||
---------- math.tanh (jse only) ----------
|
||||
math.tanh(-2.5) true -0.986
|
||||
math.tanh(-2) true -0.964
|
||||
math.tanh(0) true <zero>
|
||||
math.tanh(2) true 0.9640
|
||||
math.tanh(2.5) true 0.9866
|
||||
math.tanh('-2.5') true -0.986
|
||||
math.tanh('-2') true -0.964
|
||||
math.tanh('0') true <zero>
|
||||
math.tanh('2') true 0.9640
|
||||
math.tanh('2.5') true 0.9866
|
||||
---------- math.fmod ----------
|
||||
math.fmod(2,0) true <nan>
|
||||
math.fmod(-2.5,0) true <nan>
|
||||
math.fmod(2,1) true <zero>
|
||||
math.fmod(5,2) true 1
|
||||
math.fmod(-5,2) true -1
|
||||
math.fmod(16,2) true <zero>
|
||||
math.fmod(-16,-2) true <zero>
|
||||
math.fmod(0.5,0) true <nan>
|
||||
math.fmod(0.5,1) true 0.5
|
||||
math.fmod(0.5,2) true 0.5
|
||||
math.fmod(0.5,-1) true 0.5
|
||||
math.fmod(0.5,2) true 0.5
|
||||
math.fmod(2.25,0) true <nan>
|
||||
math.fmod(2.25,2) true 0.25
|
||||
math.fmod(-2,0) true <nan>
|
||||
math.fmod(3,3) true <zero>
|
||||
math.fmod('2','0') true <nan>
|
||||
math.fmod('2.5','3') true 2.5
|
||||
math.fmod('-2','1.5') true -0.5
|
||||
math.fmod('-2.5','-1.5') true -1
|
||||
math.fmod('3.0','3.0') true <zero>
|
||||
math.fmod(2.75,2.75) true <zero>
|
||||
math.fmod('2.75','2.75') true <zero>
|
||||
math.fmod(3,'3') true <zero>
|
||||
math.fmod('3',3) true <zero>
|
||||
math.fmod(2.75,'2.75') true <zero>
|
||||
math.fmod('2.75',2.75) true <zero>
|
||||
math.fmod(-3,'-4') true -3
|
||||
math.fmod('-3',4) true -3
|
||||
math.fmod(-3,'4') true -3
|
||||
math.fmod('-3',-4) true -3
|
||||
math.fmod(-4.75,'2.75') true -2
|
||||
math.fmod('-2.75',1.75) true -1
|
||||
math.fmod(4.75,'-2.75') true 2
|
||||
math.fmod('2.75',-1.75) true 1
|
||||
---------- math.ldexp ----------
|
||||
math.ldexp(2,0) true 2
|
||||
math.ldexp(-2.5,0) true -2.5
|
||||
math.ldexp(2,1) true 4
|
||||
math.ldexp(5,2) true 20
|
||||
math.ldexp(-5,2) true -20
|
||||
math.ldexp(16,2) true 64
|
||||
math.ldexp(-16,-2) true -4
|
||||
math.ldexp(0.5,0) true 0.5
|
||||
math.ldexp(0.5,1) true 1
|
||||
math.ldexp(0.5,2) true 2
|
||||
math.ldexp(0.5,-1) true 0.25
|
||||
math.ldexp(0.5,2) true 2
|
||||
math.ldexp(2.25,0) true 2.25
|
||||
math.ldexp(2.25,2) true 9
|
||||
math.ldexp(-2,0) true -2
|
||||
math.ldexp(3,3) true 24
|
||||
math.ldexp('2','0') true 2
|
||||
math.ldexp('2.5','3') true 20
|
||||
math.ldexp('-2','1.5') true -4
|
||||
math.ldexp('-2.5','-1.5') true -1.25
|
||||
math.ldexp('3.0','3.0') true 24
|
||||
math.ldexp(2.75,2.75) true 11
|
||||
math.ldexp('2.75','2.75') true 11
|
||||
math.ldexp(3,'3') true 24
|
||||
math.ldexp('3',3) true 24
|
||||
math.ldexp(2.75,'2.75') true 11
|
||||
math.ldexp('2.75',2.75) true 11
|
||||
math.ldexp(-3,'-4') true -0.187
|
||||
math.ldexp('-3',4) true -48
|
||||
math.ldexp(-3,'4') true -48
|
||||
math.ldexp('-3',-4) true -0.187
|
||||
math.ldexp(-4.75,'2.75') true -19
|
||||
math.ldexp('-2.75',1.75) true -5.5
|
||||
math.ldexp(4.75,'-2.75') true 1.1875
|
||||
math.ldexp('2.75',-1.75) true 1.375
|
||||
---------- math.pow ----------
|
||||
math.pow(2,0) true 1
|
||||
math.pow(-2.5,0) true 1
|
||||
math.pow(2,1) true 2
|
||||
math.pow(5,2) true 25
|
||||
math.pow(-5,2) true 25
|
||||
math.pow(16,2) true 256
|
||||
math.pow(-16,-2) true 0.0039
|
||||
math.pow(0.5,0) true 1
|
||||
math.pow(0.5,1) true 0.5
|
||||
math.pow(0.5,2) true 0.25
|
||||
math.pow(0.5,-1) true 2
|
||||
math.pow(0.5,2) true 0.25
|
||||
math.pow(2.25,0) true 1
|
||||
math.pow(2.25,2) true 5.0625
|
||||
math.pow(-2,0) true 1
|
||||
math.pow(3,3) true 27
|
||||
math.pow('2','0') true 1
|
||||
math.pow('2.5','3') true 15.625
|
||||
math.pow('-2','1.5') true <nan>
|
||||
math.pow('-2.5','-1.5') true <nan>
|
||||
math.pow('3.0','3.0') true 27
|
||||
math.pow(2.75,2.75) true 16.149
|
||||
math.pow('2.75','2.75') true 16.149
|
||||
math.pow(3,'3') true 27
|
||||
math.pow('3',3) true 27
|
||||
math.pow(2.75,'2.75') true 16.149
|
||||
math.pow('2.75',2.75) true 16.149
|
||||
math.pow(-3,'-4') true 0.0123
|
||||
math.pow('-3',4) true 81
|
||||
math.pow(-3,'4') true 81
|
||||
math.pow('-3',-4) true 0.0123
|
||||
math.pow(-4.75,'2.75') true <nan>
|
||||
math.pow('-2.75',1.75) true <nan>
|
||||
math.pow(4.75,'-2.75') true 0.0137
|
||||
math.pow('2.75',-1.75) true 0.1702
|
||||
---------- math.atan2 (jse only) ----------
|
||||
math.atan2(2,0) true 1.5707
|
||||
math.atan2(-2.5,0) true -1.570
|
||||
math.atan2(2,1) true 1.1071
|
||||
math.atan2(5,2) true 1.1902
|
||||
math.atan2(-5,2) true -1.190
|
||||
math.atan2(16,2) true 1.4464
|
||||
math.atan2(-16,-2) true -1.695
|
||||
math.atan2(0.5,0) true 1.5707
|
||||
math.atan2(0.5,1) true 0.4636
|
||||
math.atan2(0.5,2) true 0.2449
|
||||
math.atan2(0.5,-1) true 2.6779
|
||||
math.atan2(0.5,2) true 0.2449
|
||||
math.atan2(2.25,0) true 1.5707
|
||||
math.atan2(2.25,2) true 0.8441
|
||||
math.atan2(-2,0) true -1.570
|
||||
math.atan2(3,3) true 0.7853
|
||||
math.atan2('2','0') true 1.5707
|
||||
math.atan2('2.5','3') true 0.6947
|
||||
math.atan2('-2','1.5') true -0.927
|
||||
math.atan2('-2.5','-1.5') true -2.111
|
||||
math.atan2('3.0','3.0') true 0.7853
|
||||
math.atan2(2.75,2.75) true 0.7853
|
||||
math.atan2('2.75','2.75') true 0.7853
|
||||
math.atan2(3,'3') true 0.7853
|
||||
math.atan2('3',3) true 0.7853
|
||||
math.atan2(2.75,'2.75') true 0.7853
|
||||
math.atan2('2.75',2.75) true 0.7853
|
||||
math.atan2(-3,'-4') true -2.498
|
||||
math.atan2('-3',4) true -0.643
|
||||
math.atan2(-3,'4') true -0.643
|
||||
math.atan2('-3',-4) true -2.498
|
||||
math.atan2(-4.75,'2.75') true -1.046
|
||||
math.atan2('-2.75',1.75) true -1.004
|
||||
math.atan2(4.75,'-2.75') true 2.0955
|
||||
math.atan2('2.75',-1.75) true 2.1375
|
||||
---------- math.max ----------
|
||||
math.max(4) true 4
|
||||
math.max(-4.5) true -4.5
|
||||
math.max('5.5') true 5.5
|
||||
math.max('-5') true -5
|
||||
math.max(4,'8') true 8
|
||||
math.max(-4.5,'-8') true -4.5
|
||||
math.max('5.5',2.2) true 5.5
|
||||
math.max('-5',-2.2) true -2.2
|
||||
math.max(111,222,333) true 333
|
||||
math.max(-222,-333,-111) true -111
|
||||
math.max(444,-111,-222) true 444
|
||||
---------- math.min ----------
|
||||
math.min(4) true 4
|
||||
math.min(-4.5) true -4.5
|
||||
math.min('5.5') true 5.5
|
||||
math.min('-5') true -5
|
||||
math.min(4,'8') true 4
|
||||
math.min(-4.5,'-8') true -8
|
||||
math.min('5.5',2.2) true 2.2
|
||||
math.min('-5',-2.2) true -5
|
||||
math.min(111,222,333) true 111
|
||||
math.min(-222,-333,-111) true -333
|
||||
math.min(444,-111,-222) true -222
|
||||
----------- Random number tests
|
||||
math.random() number true
|
||||
math.random() number true
|
||||
math.random() number true
|
||||
math.random() number true
|
||||
math.random() number true
|
||||
math.random(5,10) number true
|
||||
math.random(5,10) number true
|
||||
math.random(5,10) number true
|
||||
math.random(5,10) number true
|
||||
math.random(5,10) number true
|
||||
math.random(30) number true
|
||||
math.random(30) number true
|
||||
math.random(30) number true
|
||||
math.random(30) number true
|
||||
math.random(30) number true
|
||||
math.random(-4,-2) number true
|
||||
math.random(-4,-2) number true
|
||||
math.random(-4,-2) number true
|
||||
math.random(-4,-2) number true
|
||||
math.random(-4,-2) number true
|
||||
|
||||
-- comparing new numbers
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
false false
|
||||
-- resetting seed
|
||||
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
true
|
||||
----------- Tests involving -0 and NaN
|
||||
0 == -0 true
|
||||
t[-0] == t[0] true
|
||||
mz, z <zero> <zero>
|
||||
mz == z true
|
||||
a[z] == 1 and a[mz] == 1 true
|
||||
649
luaj-test/src/test/resources/compatibility/metatags.out
Normal file
649
luaj-test/src/test/resources/compatibility/metatags.out
Normal file
@@ -0,0 +1,649 @@
|
||||
---- __eq same types
|
||||
nil nil before true true
|
||||
nil nil before true false
|
||||
nil
|
||||
nil
|
||||
nil nil after true true
|
||||
nil nil after true false
|
||||
nil
|
||||
nil
|
||||
boolean boolean before true false
|
||||
boolean boolean before true true
|
||||
true
|
||||
false
|
||||
boolean boolean after true false
|
||||
boolean boolean after true true
|
||||
true
|
||||
false
|
||||
number number before true false
|
||||
number number before true true
|
||||
123
|
||||
456
|
||||
number number after true false
|
||||
number number after true true
|
||||
123
|
||||
456
|
||||
number number before true false
|
||||
number number before true true
|
||||
11
|
||||
5.5
|
||||
number number after true false
|
||||
number number after true true
|
||||
11
|
||||
5.5
|
||||
function function before true false
|
||||
function function before true true
|
||||
function.1
|
||||
function.2
|
||||
function function after true false
|
||||
function function after true true
|
||||
function.1
|
||||
function.2
|
||||
thread nil before true false
|
||||
thread nil before true true
|
||||
thread.3
|
||||
nil
|
||||
thread nil after true false
|
||||
thread nil after true true
|
||||
thread.3
|
||||
nil
|
||||
string string before true false
|
||||
string string before true true
|
||||
abc
|
||||
def
|
||||
string string after true false
|
||||
string string after true true
|
||||
abc
|
||||
def
|
||||
number string before true false
|
||||
number string before true true
|
||||
111
|
||||
111
|
||||
number string after true false
|
||||
number string after true true
|
||||
111
|
||||
111
|
||||
---- __eq, tables - should invoke metatag comparison
|
||||
table table before true false
|
||||
table table before true true
|
||||
table.4
|
||||
table.5
|
||||
mt.__eq() table.4 table.5
|
||||
table table after-a true true
|
||||
mt.__eq() table.4 table.5
|
||||
table table after-a true false
|
||||
table.4
|
||||
table.5
|
||||
nilmt nil
|
||||
boolmt nil
|
||||
number nil
|
||||
function nil
|
||||
thread nil
|
||||
---- __call
|
||||
number before false attempt to call
|
||||
111
|
||||
mt.__call() 111 nil
|
||||
number after true __call-result
|
||||
mt.__call() 111 a
|
||||
number after true __call-result
|
||||
mt.__call() 111 a
|
||||
number after true __call-result
|
||||
mt.__call() 111 a
|
||||
number after true __call-result
|
||||
mt.__call() 111 a
|
||||
number after true __call-result
|
||||
111
|
||||
boolean before false attempt to call
|
||||
false
|
||||
mt.__call() false nil
|
||||
boolean after true __call-result
|
||||
mt.__call() false a
|
||||
boolean after true __call-result
|
||||
mt.__call() false a
|
||||
boolean after true __call-result
|
||||
mt.__call() false a
|
||||
boolean after true __call-result
|
||||
mt.__call() false a
|
||||
boolean after true __call-result
|
||||
false
|
||||
function before true nil
|
||||
function.1
|
||||
function after true
|
||||
function after true
|
||||
function after true
|
||||
function after true
|
||||
function after true
|
||||
function.1
|
||||
thread before false attempt to call
|
||||
thread.3
|
||||
mt.__call() thread.3 nil
|
||||
thread after true __call-result
|
||||
mt.__call() thread.3 a
|
||||
thread after true __call-result
|
||||
mt.__call() thread.3 a
|
||||
thread after true __call-result
|
||||
mt.__call() thread.3 a
|
||||
thread after true __call-result
|
||||
mt.__call() thread.3 a
|
||||
thread after true __call-result
|
||||
thread.3
|
||||
table before false attempt to call
|
||||
table.4
|
||||
mt.__call() table.4 nil
|
||||
table after true __call-result
|
||||
mt.__call() table.4 a
|
||||
table after true __call-result
|
||||
mt.__call() table.4 a
|
||||
table after true __call-result
|
||||
mt.__call() table.4 a
|
||||
table after true __call-result
|
||||
mt.__call() table.4 a
|
||||
table after true __call-result
|
||||
table.4
|
||||
---- __add, __sub, __mul, __div, __pow, __mod
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
boolean boolean before false attempt to perform arithmetic
|
||||
false
|
||||
mt.__add() false false
|
||||
boolean boolean after true __add-result
|
||||
mt.__add() false false
|
||||
boolean boolean after true __add-result
|
||||
mt.__sub() false false
|
||||
boolean boolean after true __sub-result
|
||||
mt.__sub() false false
|
||||
boolean boolean after true __sub-result
|
||||
mt.__mul() false false
|
||||
boolean boolean after true __mul-result
|
||||
mt.__mul() false false
|
||||
boolean boolean after true __mul-result
|
||||
mt.__pow() false false
|
||||
boolean boolean after true __pow-result
|
||||
mt.__pow() false false
|
||||
boolean boolean after true __pow-result
|
||||
mt.__mod() false false
|
||||
boolean boolean after true __mod-result
|
||||
mt.__mod() false false
|
||||
boolean boolean after true __mod-result
|
||||
false
|
||||
false
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
boolean thread before false attempt to perform arithmetic
|
||||
false
|
||||
mt.__add() false thread.3
|
||||
boolean thread after true __add-result
|
||||
mt.__add() thread.3 false
|
||||
boolean thread after true __add-result
|
||||
mt.__sub() false thread.3
|
||||
boolean thread after true __sub-result
|
||||
mt.__sub() thread.3 false
|
||||
boolean thread after true __sub-result
|
||||
mt.__mul() false thread.3
|
||||
boolean thread after true __mul-result
|
||||
mt.__mul() thread.3 false
|
||||
boolean thread after true __mul-result
|
||||
mt.__pow() false thread.3
|
||||
boolean thread after true __pow-result
|
||||
mt.__pow() thread.3 false
|
||||
boolean thread after true __pow-result
|
||||
mt.__mod() false thread.3
|
||||
boolean thread after true __mod-result
|
||||
mt.__mod() thread.3 false
|
||||
boolean thread after true __mod-result
|
||||
false
|
||||
thread.3
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
boolean function before false attempt to perform arithmetic
|
||||
false
|
||||
mt.__add() false function.1
|
||||
boolean function after true __add-result
|
||||
mt.__add() function.1 false
|
||||
boolean function after true __add-result
|
||||
mt.__sub() false function.1
|
||||
boolean function after true __sub-result
|
||||
mt.__sub() function.1 false
|
||||
boolean function after true __sub-result
|
||||
mt.__mul() false function.1
|
||||
boolean function after true __mul-result
|
||||
mt.__mul() function.1 false
|
||||
boolean function after true __mul-result
|
||||
mt.__pow() false function.1
|
||||
boolean function after true __pow-result
|
||||
mt.__pow() function.1 false
|
||||
boolean function after true __pow-result
|
||||
mt.__mod() false function.1
|
||||
boolean function after true __mod-result
|
||||
mt.__mod() function.1 false
|
||||
boolean function after true __mod-result
|
||||
false
|
||||
function.1
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
boolean string before false attempt to perform arithmetic
|
||||
false
|
||||
mt.__add() false abc
|
||||
boolean string after true __add-result
|
||||
mt.__add() abc false
|
||||
boolean string after true __add-result
|
||||
mt.__sub() false abc
|
||||
boolean string after true __sub-result
|
||||
mt.__sub() abc false
|
||||
boolean string after true __sub-result
|
||||
mt.__mul() false abc
|
||||
boolean string after true __mul-result
|
||||
mt.__mul() abc false
|
||||
boolean string after true __mul-result
|
||||
mt.__pow() false abc
|
||||
boolean string after true __pow-result
|
||||
mt.__pow() abc false
|
||||
boolean string after true __pow-result
|
||||
mt.__mod() false abc
|
||||
boolean string after true __mod-result
|
||||
mt.__mod() abc false
|
||||
boolean string after true __mod-result
|
||||
false
|
||||
abc
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
boolean table before false attempt to perform arithmetic
|
||||
false
|
||||
mt.__add() false table.4
|
||||
boolean table after true __add-result
|
||||
mt.__add() table.4 false
|
||||
boolean table after true __add-result
|
||||
mt.__sub() false table.4
|
||||
boolean table after true __sub-result
|
||||
mt.__sub() table.4 false
|
||||
boolean table after true __sub-result
|
||||
mt.__mul() false table.4
|
||||
boolean table after true __mul-result
|
||||
mt.__mul() table.4 false
|
||||
boolean table after true __mul-result
|
||||
mt.__pow() false table.4
|
||||
boolean table after true __pow-result
|
||||
mt.__pow() table.4 false
|
||||
boolean table after true __pow-result
|
||||
mt.__mod() false table.4
|
||||
boolean table after true __mod-result
|
||||
mt.__mod() table.4 false
|
||||
boolean table after true __mod-result
|
||||
false
|
||||
table.4
|
||||
---- __len
|
||||
boolean before false attempt to get length of
|
||||
false
|
||||
mt.__len() false
|
||||
boolean after true __len-result
|
||||
false
|
||||
function before false attempt to get length of
|
||||
function.1
|
||||
mt.__len() function.1
|
||||
function after true __len-result
|
||||
function.1
|
||||
thread before false attempt to get length of
|
||||
thread.3
|
||||
mt.__len() thread.3
|
||||
thread after true __len-result
|
||||
thread.3
|
||||
number before false attempt to get length of
|
||||
111
|
||||
mt.__len() 111
|
||||
number after true __len-result
|
||||
111
|
||||
---- __neg
|
||||
nil before false attempt to perform arithmetic
|
||||
false
|
||||
mt.__unm() false
|
||||
nil after true __unm-result
|
||||
false
|
||||
nil before false attempt to perform arithmetic
|
||||
function.1
|
||||
mt.__unm() function.1
|
||||
nil after true __unm-result
|
||||
function.1
|
||||
nil before false attempt to perform arithmetic
|
||||
thread.3
|
||||
mt.__unm() thread.3
|
||||
nil after true __unm-result
|
||||
thread.3
|
||||
nil before false attempt to perform arithmetic
|
||||
abcd
|
||||
mt.__unm() abcd
|
||||
nil after true __unm-result
|
||||
abcd
|
||||
nil before false attempt to perform arithmetic
|
||||
table.4
|
||||
mt.__unm() table.4
|
||||
nil after true __unm-result
|
||||
table.4
|
||||
nil before true -111
|
||||
111
|
||||
nil after true -111
|
||||
111
|
||||
---- __lt, __le, same types
|
||||
boolean boolean before false attempt to compare
|
||||
boolean boolean before false attempt to compare
|
||||
boolean boolean before false attempt to compare
|
||||
boolean boolean before false attempt to compare
|
||||
true
|
||||
true
|
||||
mt.__lt() true true
|
||||
boolean boolean after true true
|
||||
mt.__le() true true
|
||||
boolean boolean after true true
|
||||
mt.__lt() true true
|
||||
boolean boolean after true true
|
||||
mt.__le() true true
|
||||
boolean boolean after true true
|
||||
true
|
||||
true
|
||||
boolean boolean before false attempt to compare
|
||||
boolean boolean before false attempt to compare
|
||||
boolean boolean before false attempt to compare
|
||||
boolean boolean before false attempt to compare
|
||||
true
|
||||
false
|
||||
mt.__lt() true false
|
||||
boolean boolean after true true
|
||||
mt.__le() true false
|
||||
boolean boolean after true true
|
||||
mt.__lt() false true
|
||||
boolean boolean after true true
|
||||
mt.__le() false true
|
||||
boolean boolean after true true
|
||||
true
|
||||
false
|
||||
function function before false attempt to compare
|
||||
function function before false attempt to compare
|
||||
function function before false attempt to compare
|
||||
function function before false attempt to compare
|
||||
function.1
|
||||
function.6
|
||||
mt.__lt() function.1 function.6
|
||||
function function after true true
|
||||
mt.__le() function.1 function.6
|
||||
function function after true true
|
||||
mt.__lt() function.6 function.1
|
||||
function function after true true
|
||||
mt.__le() function.6 function.1
|
||||
function function after true true
|
||||
function.1
|
||||
function.6
|
||||
thread thread before false attempt to compare
|
||||
thread thread before false attempt to compare
|
||||
thread thread before false attempt to compare
|
||||
thread thread before false attempt to compare
|
||||
thread.3
|
||||
thread.7
|
||||
mt.__lt() thread.3 thread.7
|
||||
thread thread after true true
|
||||
mt.__le() thread.3 thread.7
|
||||
thread thread after true true
|
||||
mt.__lt() thread.7 thread.3
|
||||
thread thread after true true
|
||||
mt.__le() thread.7 thread.3
|
||||
thread thread after true true
|
||||
thread.3
|
||||
thread.7
|
||||
table table before false attempt to compare
|
||||
table table before false attempt to compare
|
||||
table table before false attempt to compare
|
||||
table table before false attempt to compare
|
||||
table.4
|
||||
table.4
|
||||
mt.__lt() table.4 table.4
|
||||
table table after true true
|
||||
mt.__le() table.4 table.4
|
||||
table table after true true
|
||||
mt.__lt() table.4 table.4
|
||||
table table after true true
|
||||
mt.__le() table.4 table.4
|
||||
table table after true true
|
||||
table.4
|
||||
table.4
|
||||
table table before false attempt to compare
|
||||
table table before false attempt to compare
|
||||
table table before false attempt to compare
|
||||
table table before false attempt to compare
|
||||
table.4
|
||||
table.8
|
||||
mt.__lt() table.4 table.8
|
||||
table table after true true
|
||||
mt.__le() table.4 table.8
|
||||
table table after true true
|
||||
mt.__lt() table.8 table.4
|
||||
table table after true true
|
||||
mt.__le() table.8 table.4
|
||||
table table after true true
|
||||
table.4
|
||||
table.8
|
||||
---- __lt, __le, different types
|
||||
boolean thread before false attempt to compare
|
||||
boolean thread before false attempt to compare
|
||||
boolean thread before false attempt to compare
|
||||
boolean thread before false attempt to compare
|
||||
false
|
||||
thread.3
|
||||
mt.__lt() false thread.3
|
||||
boolean thread after-a true true
|
||||
mt.__le() false thread.3
|
||||
boolean thread after-a true true
|
||||
mt.__lt() thread.3 false
|
||||
boolean thread after-a true true
|
||||
mt.__le() thread.3 false
|
||||
boolean thread after-a true true
|
||||
false
|
||||
thread.3
|
||||
---- __tostring
|
||||
mt.__tostring(boolean)
|
||||
boolean after mt.__tostring(boolean) mt.__tostring(boolean)
|
||||
false
|
||||
function.1
|
||||
function after true mt.__tostring(function)
|
||||
function.1
|
||||
thread.3
|
||||
thread after true mt.__tostring(thread)
|
||||
thread.3
|
||||
table.4
|
||||
table after true mt.__tostring(table)
|
||||
table.4
|
||||
mt.__tostring(string)
|
||||
mt.__tostring(string) mt.__tostring(string) true mt.__tostring(string)
|
||||
abc
|
||||
---- __index, __newindex
|
||||
boolean before false attempt to index
|
||||
boolean before false attempt to index
|
||||
boolean before false index
|
||||
boolean before false index
|
||||
boolean before false attempt to index
|
||||
false
|
||||
mt.__index() false foo
|
||||
boolean after true __index-result
|
||||
mt.__index() false 123
|
||||
boolean after true __index-result
|
||||
mt.__newindex() false foo bar
|
||||
boolean after true
|
||||
mt.__newindex() false 123 bar
|
||||
boolean after true
|
||||
mt.__index() false foo
|
||||
boolean after false attempt to call
|
||||
false
|
||||
number before false attempt to index
|
||||
number before false attempt to index
|
||||
number before false index
|
||||
number before false index
|
||||
number before false attempt to index
|
||||
111
|
||||
mt.__index() 111 foo
|
||||
number after true __index-result
|
||||
mt.__index() 111 123
|
||||
number after true __index-result
|
||||
mt.__newindex() 111 foo bar
|
||||
number after true
|
||||
mt.__newindex() 111 123 bar
|
||||
number after true
|
||||
mt.__index() 111 foo
|
||||
number after false attempt to call
|
||||
111
|
||||
function before false attempt to index
|
||||
function before false attempt to index
|
||||
function before false index
|
||||
function before false index
|
||||
function before false attempt to index
|
||||
function.1
|
||||
mt.__index() function.1 foo
|
||||
function after true __index-result
|
||||
mt.__index() function.1 123
|
||||
function after true __index-result
|
||||
mt.__newindex() function.1 foo bar
|
||||
function after true
|
||||
mt.__newindex() function.1 123 bar
|
||||
function after true
|
||||
mt.__index() function.1 foo
|
||||
function after false attempt to call
|
||||
function.1
|
||||
thread before false attempt to index
|
||||
thread before false attempt to index
|
||||
thread before false index
|
||||
thread before false index
|
||||
thread before false attempt to index
|
||||
thread.3
|
||||
mt.__index() thread.3 foo
|
||||
thread after true __index-result
|
||||
mt.__index() thread.3 123
|
||||
thread after true __index-result
|
||||
mt.__newindex() thread.3 foo bar
|
||||
thread after true
|
||||
mt.__newindex() thread.3 123 bar
|
||||
thread after true
|
||||
mt.__index() thread.3 foo
|
||||
thread after false attempt to call
|
||||
thread.3
|
||||
---- __concat
|
||||
table function before false attempt to concatenate
|
||||
table function before false attempt to concatenate
|
||||
table string number before false attempt to concatenate
|
||||
string table number before false attempt to concatenate
|
||||
string number table before false attempt to concatenate
|
||||
table.4
|
||||
mt.__concat(table,function) table.4 function.1
|
||||
table function after true table.9
|
||||
mt.__concat(function,table) function.1 table.4
|
||||
table function after true table.9
|
||||
mt.__concat(table,string) table.4 sss777
|
||||
table string number before true table.9
|
||||
mt.__concat(table,number) table.4 777
|
||||
string table number before false attempt to concatenate
|
||||
mt.__concat(number,table) 777 table.4
|
||||
string number table before false attempt to concatenate
|
||||
table.4
|
||||
function.1
|
||||
function table before false attempt to concatenate
|
||||
function table before false attempt to concatenate
|
||||
function string number before false attempt to concatenate
|
||||
string function number before false attempt to concatenate
|
||||
string number function before false attempt to concatenate
|
||||
function.1
|
||||
mt.__concat(function,table) function.1 table.4
|
||||
function table after true table.9
|
||||
mt.__concat(table,function) table.4 function.1
|
||||
function table after true table.9
|
||||
mt.__concat(function,string) function.1 sss777
|
||||
function string number before true table.9
|
||||
mt.__concat(function,number) function.1 777
|
||||
string function number before false attempt to concatenate
|
||||
mt.__concat(number,function) 777 function.1
|
||||
string number function before false attempt to concatenate
|
||||
function.1
|
||||
table.4
|
||||
number nil before false attempt to concatenate
|
||||
number nil before false attempt to concatenate
|
||||
number string number before true 123sss777
|
||||
string number number before true sss123777
|
||||
string number number before true sss777123
|
||||
123
|
||||
mt.__concat(number,nil) 123 nil
|
||||
number nil after true table.9
|
||||
mt.__concat(nil,number) nil 123
|
||||
number nil after true table.9
|
||||
number string number before true 123sss777
|
||||
string number number before true sss123777
|
||||
string number number before true sss777123
|
||||
123
|
||||
nil
|
||||
nil number before false attempt to concatenate
|
||||
nil number before false attempt to concatenate
|
||||
nil string number before false attempt to concatenate
|
||||
string nil number before false attempt to concatenate
|
||||
string number nil before false attempt to concatenate
|
||||
nil
|
||||
mt.__concat(nil,number) nil 123
|
||||
nil number after true table.9
|
||||
mt.__concat(number,nil) 123 nil
|
||||
nil number after true table.9
|
||||
mt.__concat(nil,string) nil sss777
|
||||
nil string number before true table.9
|
||||
mt.__concat(nil,number) nil 777
|
||||
string nil number before false attempt to concatenate
|
||||
mt.__concat(number,nil) 777 nil
|
||||
string number nil before false attempt to concatenate
|
||||
nil
|
||||
123
|
||||
---- __metatable
|
||||
boolean before true nil nil
|
||||
false
|
||||
boolean after true table.10 table.11
|
||||
false
|
||||
function before true nil nil
|
||||
function.1
|
||||
function after true table.10 table.11
|
||||
function.1
|
||||
thread before true nil nil
|
||||
thread.3
|
||||
thread after true table.10 table.11
|
||||
thread.3
|
||||
table before true nil nil
|
||||
table.4
|
||||
table after true table.10 table.11
|
||||
table.4
|
||||
string before true table.12 table.12
|
||||
abc
|
||||
string after true table.10 table.11
|
||||
abc
|
||||
49
luaj-test/src/test/resources/compatibility/oslib.out
Normal file
49
luaj-test/src/test/resources/compatibility/oslib.out
Normal file
@@ -0,0 +1,49 @@
|
||||
os table
|
||||
os.clock() true number nil
|
||||
os.date() true string nil
|
||||
os.difftime(123000, 21500) true number nil
|
||||
os.getenv() false string nil
|
||||
os.getenv("bogus.key") true nil nil
|
||||
os.tmpname() true string
|
||||
os.tmpname() true string
|
||||
io.open true userdata
|
||||
write false string nil
|
||||
close false string nil
|
||||
os.rename(p,q) true boolean nil
|
||||
os.remove(q) true boolean nil
|
||||
os.remove(q) true nil string
|
||||
os.setlocale("C") true string nil
|
||||
os.exit function
|
||||
os.date('%a', 1281364496) true string nil
|
||||
os.date('%A', 1281364496) true string nil
|
||||
os.date('%b', 1281364496) true string nil
|
||||
os.date('%B', 1281364496) true string nil
|
||||
os.date('%c', 1281364496) true string nil
|
||||
os.date('%d', 1281364496) true string nil
|
||||
os.date('%H', 1281364496) true string nil
|
||||
os.date('%I', 1281364496) true string nil
|
||||
os.date('%j', 1281364496) true string nil
|
||||
os.date('%m', 1281364496) true string nil
|
||||
os.date('%M', 1281364496) true string nil
|
||||
os.date('%p', 1281364496) true string nil
|
||||
os.date('%S', 1281364496) true string nil
|
||||
os.date('%U', 1281364496) true string nil
|
||||
os.date('%w', 1281364496) true string nil
|
||||
os.date('%W', 1281364496) true string nil
|
||||
os.date('%x', 1281364496) true string nil
|
||||
os.date('%X', 1281364496) true string nil
|
||||
os.date('%y', 1281364496) true string nil
|
||||
os.date('%Y', 1281364496) true string nil
|
||||
os.date('%z', 1281364496) true string nil
|
||||
k string year v number 2010
|
||||
k string month v number 8
|
||||
k string day v number 9
|
||||
k string hour v number 7
|
||||
k string min v number 34
|
||||
k string sec v number 56
|
||||
k string wday v number 2
|
||||
k string yday v number 221
|
||||
k string isdst v boolean true
|
||||
type(os.time()) number
|
||||
os.time({year=1971, month=2, day=25}) 36360000
|
||||
os.time({year=1971, month=2, day=25, hour=11, min=22, sec=33}) 36357753
|
||||
BIN
luaj-test/src/test/resources/compatibility/stringlib.out
Normal file
BIN
luaj-test/src/test/resources/compatibility/stringlib.out
Normal file
Binary file not shown.
245
luaj-test/src/test/resources/compatibility/tablelib.out
Normal file
245
luaj-test/src/test/resources/compatibility/tablelib.out
Normal file
@@ -0,0 +1,245 @@
|
||||
2
|
||||
7
|
||||
-- concat tests
|
||||
onetwothree
|
||||
one--two--three
|
||||
two,three
|
||||
two
|
||||
|
||||
onetwothreefourfive
|
||||
one--two--three--four--five
|
||||
two,three,four,five
|
||||
two
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
-- insert, len tests
|
||||
{[1]=one,[2]=two,[3]=three,[a]=aaa,[b]=bbb,[c]=ccc} 3
|
||||
{[1]=one,[2]=two,[3]=three,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
|
||||
{[1]=seven,[2]=one,[3]=two,[4]=three,[5]=six,[a]=aaa,[b]=bbb,[c]=ccc} 5
|
||||
{[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[a]=aaa,[b]=bbb,[c]=ccc} 6
|
||||
{[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[7]=nine,[a]=aaa,[b]=bbb,[c]=ccc} 7
|
||||
{[10]=ten,[1]=seven,[2]=one,[3]=two,[4]=eight,[5]=three,[6]=six,[7]=nine,[a]=aaa,[b]=bbb,[c]=ccc} 7
|
||||
#{} 0
|
||||
#{"a"} 1
|
||||
#{"a","b"} 2
|
||||
#{"a",nil} 1
|
||||
#{nil,nil} 0
|
||||
#{nil,"b"} true
|
||||
#{"a","b","c"} 3
|
||||
#{"a","b",nil} 2
|
||||
#{"a",nil,nil} 1
|
||||
#{nil,nil,nil} 0
|
||||
#{nil,nil,"c"} true
|
||||
#{nil,"b","c"} true
|
||||
#{nil,"b",nil} true
|
||||
#{"a",nil,"c"} true
|
||||
-- remove tests
|
||||
{[10]=ten,[1]=one,[2]=two,[3]=three,[4]=four,[5]=five,[6]=six,[7]=seven,[a]=aaa,[b]=bbb,[c]=ccc} 7
|
||||
table.remove(t) seven
|
||||
{[10]=ten,[1]=one,[2]=two,[3]=three,[4]=four,[5]=five,[6]=six,[a]=aaa,[b]=bbb,[c]=ccc} 6
|
||||
table.remove(t,1) one
|
||||
{[10]=ten,[1]=two,[2]=three,[3]=four,[4]=five,[5]=six,[a]=aaa,[b]=bbb,[c]=ccc} 5
|
||||
table.remove(t,3) four
|
||||
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
|
||||
table.remove(t,5)
|
||||
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
|
||||
table.remove(t,10)
|
||||
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
|
||||
table.remove(t,-1)
|
||||
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
|
||||
table.remove(t,-1)
|
||||
{[10]=ten,[1]=two,[2]=three,[3]=five,[4]=six,[a]=aaa,[b]=bbb,[c]=ccc} 4
|
||||
-- sort tests
|
||||
one-two-three
|
||||
one-three-two
|
||||
www-vvv-uuu-ttt-sss-zzz-yyy-xxx
|
||||
sss-ttt-uuu-vvv-www-xxx-yyy-zzz
|
||||
www-vvv-uuu-ttt-sss-zzz-yyy-xxx
|
||||
zzz-yyy-xxx-www-vvv-uuu-ttt-sss
|
||||
----- unpack tests -------
|
||||
pcall(unpack) false
|
||||
pcall(unpack,nil) false
|
||||
pcall(unpack,"abc") false
|
||||
pcall(unpack,1) false
|
||||
unpack({"aa"}) aa
|
||||
unpack({"aa","bb"}) aa bb
|
||||
unpack({"aa","bb","cc"}) aa bb cc
|
||||
unpack -
|
||||
unpack a a
|
||||
unpack . nil
|
||||
unpack ab a b
|
||||
unpack .b nil b
|
||||
unpack a. a nil
|
||||
unpack abc a b c
|
||||
unpack .ab nil a b
|
||||
unpack a.b a nil b
|
||||
unpack ab. a b nil
|
||||
unpack ..b nil nil b
|
||||
unpack a.. a nil nil
|
||||
unpack .b. nil b nil
|
||||
unpack ... nil nil nil
|
||||
unpack (-)
|
||||
unpack (a) a
|
||||
unpack (.) nil
|
||||
unpack (ab) a b
|
||||
unpack (.b) nil b
|
||||
unpack (a.) a nil
|
||||
unpack (abc) a b c
|
||||
unpack (.ab) nil a b
|
||||
unpack (a.b) a nil b
|
||||
unpack (ab.) a b nil
|
||||
unpack (..b) nil nil b
|
||||
unpack (a..) a nil nil
|
||||
unpack (.b.) nil b nil
|
||||
unpack (...) nil nil nil
|
||||
pcall(unpack,t) true aa bb cc dd ee ff
|
||||
pcall(unpack,t,2) true bb cc dd ee ff
|
||||
pcall(unpack,t,2,5) true bb cc dd ee
|
||||
pcall(unpack,t,2,6) true bb cc dd ee ff
|
||||
pcall(unpack,t,2,7) true bb cc dd ee ff nil
|
||||
pcall(unpack,t,1) true aa bb cc dd ee ff
|
||||
pcall(unpack,t,1,5) true aa bb cc dd ee
|
||||
pcall(unpack,t,1,6) true aa bb cc dd ee ff
|
||||
pcall(unpack,t,1,7) true aa bb cc dd ee ff nil
|
||||
pcall(unpack,t,0) true nil aa bb cc dd ee ff
|
||||
pcall(unpack,t,0,5) true nil aa bb cc dd ee
|
||||
pcall(unpack,t,0,6) true nil aa bb cc dd ee ff
|
||||
pcall(unpack,t,0,7) true nil aa bb cc dd ee ff nil
|
||||
pcall(unpack,t,-1) true nil nil aa bb cc dd ee ff
|
||||
pcall(unpack,t,-1,5) true nil nil aa bb cc dd ee
|
||||
pcall(unpack,t,-1,6) true nil nil aa bb cc dd ee ff
|
||||
pcall(unpack,t,-1,7) true nil nil aa bb cc dd ee ff nil
|
||||
pcall(unpack,t,2,4) true bb cc dd
|
||||
pcall(unpack,t,2,5) true bb cc dd ee
|
||||
pcall(unpack,t,2,6) true bb cc dd ee ff
|
||||
pcall(unpack,t,2,7) true bb cc dd ee ff nil
|
||||
pcall(unpack,t,2,8) true bb cc dd ee ff nil nil
|
||||
pcall(unpack,t,2,2) true
|
||||
pcall(unpack,t,2,1) true
|
||||
pcall(unpack,t,2,0) true
|
||||
pcall(unpack,t,2,-1) true
|
||||
pcall(unpack,t,0) true zz aa bb cc dd ee ff
|
||||
pcall(unpack,t,2,0) true
|
||||
pcall(unpack,t,2,-1) true
|
||||
pcall(unpack,t,"3") true cc dd ee ff
|
||||
pcall(unpack,t,"a") false
|
||||
pcall(unpack,t,function() end) false
|
||||
----- misc table initializer tests -------
|
||||
3
|
||||
4
|
||||
4
|
||||
----- basic table operations -------
|
||||
------ basic table tests on basic table table
|
||||
t[1]=2 true
|
||||
t[1] true 2
|
||||
t[1]=nil true
|
||||
t[1] true nil
|
||||
t["a"]="b" true
|
||||
t["a"],t.a true b b
|
||||
t.a="c" true
|
||||
t["a"],t.a true c c
|
||||
t.a=nil true
|
||||
t["a"],t.a true nil nil
|
||||
t[nil]="d" false string
|
||||
t[nil] true nil
|
||||
t[nil]=nil false string
|
||||
t[nil] true nil
|
||||
------ basic table tests on function metatable on __index table
|
||||
t[1]=2 true
|
||||
t[1] true 2
|
||||
t[1]=nil true
|
||||
metatable call args table 1
|
||||
t[1] true dummy
|
||||
t["a"]="b" true
|
||||
t["a"],t.a true b b
|
||||
t.a="c" true
|
||||
t["a"],t.a true c c
|
||||
t.a=nil true
|
||||
metatable call args table a
|
||||
metatable call args table a
|
||||
t["a"],t.a true dummy dummy
|
||||
t[nil]="d" false string
|
||||
metatable call args table nil
|
||||
t[nil] true dummy
|
||||
t[nil]=nil false string
|
||||
metatable call args table nil
|
||||
t[nil] true dummy
|
||||
------ basic table tests on function metatable on __newindex table
|
||||
metatable call args table 1 2
|
||||
t[1]=2 true
|
||||
t[1] true nil
|
||||
metatable call args table 1 nil
|
||||
t[1]=nil true
|
||||
t[1] true nil
|
||||
metatable call args table a b
|
||||
t["a"]="b" true
|
||||
t["a"],t.a true nil nil
|
||||
metatable call args table a c
|
||||
t.a="c" true
|
||||
t["a"],t.a true nil nil
|
||||
metatable call args table a nil
|
||||
t.a=nil true
|
||||
t["a"],t.a true nil nil
|
||||
metatable call args table nil d
|
||||
t[nil]="d" true nil
|
||||
t[nil] true nil
|
||||
metatable call args table nil nil
|
||||
t[nil]=nil true nil
|
||||
t[nil] true nil
|
||||
------ basic table tests on plain metatable on __index table
|
||||
t[1]=2 true
|
||||
t[1] true 2
|
||||
t[1]=nil true
|
||||
t[1] true nil
|
||||
t["a"]="b" true
|
||||
t["a"],t.a true b b
|
||||
t.a="c" true
|
||||
t["a"],t.a true c c
|
||||
t.a=nil true
|
||||
t["a"],t.a true nil nil
|
||||
t[nil]="d" false string
|
||||
t[nil] true nil
|
||||
t[nil]=nil false string
|
||||
t[nil] true nil
|
||||
------ basic table tests on plain metatable on __newindex table
|
||||
t[1]=2 true
|
||||
t[1] true 2
|
||||
t[1]=nil true
|
||||
t[1] true nil
|
||||
t["a"]="b" true
|
||||
t["a"],t.a true b b
|
||||
t.a="c" true
|
||||
t["a"],t.a true c c
|
||||
t.a=nil true
|
||||
t["a"],t.a true nil nil
|
||||
t[nil]="d" false string
|
||||
t[nil] true nil
|
||||
t[nil]=nil false string
|
||||
t[nil] true nil
|
||||
-- sort tests
|
||||
default (lexical) comparator
|
||||
2-4-6-8-1-3-5-7
|
||||
1-2-3-4-5-6-7-8
|
||||
333-222-111
|
||||
111-222-333
|
||||
www-xxx-yyy-aaa-bbb-ccc
|
||||
aaa-bbb-ccc-www-xxx-yyy
|
||||
21-23-25-27-22-24-26-28
|
||||
sort failed
|
||||
custom (numerical) comparator
|
||||
2-4-6-8-1-3-5-7
|
||||
1-2-3-4-5-6-7-8
|
||||
333-222-111
|
||||
111-222-333
|
||||
www-xxx-yyy-aaa-bbb-ccc
|
||||
sort failed
|
||||
21-23-25-27-22-24-26-28
|
||||
21-22-23-24-25-26-27-28
|
||||
211
luaj-test/src/test/resources/compatibility/tailcalls.out
Normal file
211
luaj-test/src/test/resources/compatibility/tailcalls.out
Normal file
@@ -0,0 +1,211 @@
|
||||
true true
|
||||
b
|
||||
true true
|
||||
true true c
|
||||
--f, n, table.unpack(t) func.1 0
|
||||
true 0 0 0
|
||||
--f, n, table.unpack(t) func.1 0 1
|
||||
true 1 1 1
|
||||
--f, n, table.unpack(t) func.1 0 1 2
|
||||
true 1 3 3
|
||||
--f, n, table.unpack(t) func.1 0 1 2 3
|
||||
true 1 3 6
|
||||
--f, n, table.unpack(t) func.1 0 1 2 3 4
|
||||
true 1 3 6
|
||||
--f, n, table.unpack(t) func.1 1
|
||||
true 0 0 0
|
||||
--f, n, table.unpack(t) func.1 1 1
|
||||
true 1 2 3
|
||||
--f, n, table.unpack(t) func.1 1 1 2
|
||||
true 1 4 7
|
||||
--f, n, table.unpack(t) func.1 1 1 2 3
|
||||
true 1 4 10
|
||||
--f, n, table.unpack(t) func.1 1 1 2 3 4
|
||||
true 1 4 10
|
||||
--f, n, table.unpack(t) func.1 2
|
||||
true 0 0 0
|
||||
--f, n, table.unpack(t) func.1 2 1
|
||||
true 1 3 6
|
||||
--f, n, table.unpack(t) func.1 2 1 2
|
||||
true 1 5 12
|
||||
--f, n, table.unpack(t) func.1 2 1 2 3
|
||||
true 1 5 15
|
||||
--f, n, table.unpack(t) func.1 2 1 2 3 4
|
||||
true 1 5 15
|
||||
--f, n, table.unpack(t) func.1 3
|
||||
true 0 0 0
|
||||
--f, n, table.unpack(t) func.1 3 1
|
||||
true 1 4 10
|
||||
--f, n, table.unpack(t) func.1 3 1 2
|
||||
true 1 6 18
|
||||
--f, n, table.unpack(t) func.1 3 1 2 3
|
||||
true 1 6 21
|
||||
--f, n, table.unpack(t) func.1 3 1 2 3 4
|
||||
true 1 6 21
|
||||
--f, n, table.unpack(t) func.2 0
|
||||
--f2, n<=0, returning sum(...)
|
||||
true 0
|
||||
--f, n, table.unpack(t) func.2 0 1
|
||||
--f2, n<=0, returning sum(...) 1
|
||||
true 1
|
||||
--f, n, table.unpack(t) func.2 0 1 2
|
||||
--f2, n<=0, returning sum(...) 1 2
|
||||
true 3
|
||||
--f, n, table.unpack(t) func.2 0 1 2 3
|
||||
--f2, n<=0, returning sum(...) 1 2 3
|
||||
true 6
|
||||
--f, n, table.unpack(t) func.2 0 1 2 3 4
|
||||
--f2, n<=0, returning sum(...) 1 2 3 4
|
||||
true 10
|
||||
--f, n, table.unpack(t) func.2 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1
|
||||
--f2, n<=0, returning sum(...) 1
|
||||
true 1
|
||||
--f, n, table.unpack(t) func.2 1 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 1
|
||||
--f2, n<=0, returning sum(...) 1 1
|
||||
true 2
|
||||
--f, n, table.unpack(t) func.2 1 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 1 2
|
||||
--f2, n<=0, returning sum(...) 1 1 2
|
||||
true 4
|
||||
--f, n, table.unpack(t) func.2 1 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 1 2 3
|
||||
--f2, n<=0, returning sum(...) 1 1 2 3
|
||||
true 7
|
||||
--f, n, table.unpack(t) func.2 1 1 2 3 4
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 1 2 3 4
|
||||
--f2, n<=0, returning sum(...) 1 1 2 3 4
|
||||
true 11
|
||||
--f, n, table.unpack(t) func.2 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2
|
||||
--f2, n<=0, returning sum(...) 1 2
|
||||
true 3
|
||||
--f, n, table.unpack(t) func.2 2 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1
|
||||
--f2, n<=0, returning sum(...) 1 2 1
|
||||
true 4
|
||||
--f, n, table.unpack(t) func.2 2 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2
|
||||
--f2, n<=0, returning sum(...) 1 2 1 2
|
||||
true 6
|
||||
--f, n, table.unpack(t) func.2 2 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 3
|
||||
--f2, n<=0, returning sum(...) 1 2 1 2 3
|
||||
true 9
|
||||
--f, n, table.unpack(t) func.2 2 1 2 3 4
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 1 2 3 4
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 1 2 3 4
|
||||
--f2, n<=0, returning sum(...) 1 2 1 2 3 4
|
||||
true 13
|
||||
--f, n, table.unpack(t) func.2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3
|
||||
--f2, n<=0, returning sum(...) 1 2 3
|
||||
true 6
|
||||
--f, n, table.unpack(t) func.2 3 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 2 3 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1
|
||||
--f2, n<=0, returning sum(...) 1 2 3 1
|
||||
true 7
|
||||
--f, n, table.unpack(t) func.2 3 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 2 3 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2
|
||||
--f2, n<=0, returning sum(...) 1 2 3 1 2
|
||||
true 9
|
||||
--f, n, table.unpack(t) func.2 3 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 2 3 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 3
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 3
|
||||
--f2, n<=0, returning sum(...) 1 2 3 1 2 3
|
||||
true 12
|
||||
--f, n, table.unpack(t) func.2 3 1 2 3 4
|
||||
--f2, n>0, returning f2(n-1,n,...) 2 3 1 2 3 4
|
||||
--f2, n>0, returning f2(n-1,n,...) 1 2 3 1 2 3 4
|
||||
--f2, n>0, returning f2(n-1,n,...) 0 1 2 3 1 2 3 4
|
||||
--f2, n<=0, returning sum(...) 1 2 3 1 2 3 4
|
||||
true 16
|
||||
--f, n, table.unpack(t) func.3 0
|
||||
true 0
|
||||
--f, n, table.unpack(t) func.3 0 1
|
||||
true 1
|
||||
--f, n, table.unpack(t) func.3 0 1 2
|
||||
true 3
|
||||
--f, n, table.unpack(t) func.3 0 1 2 3
|
||||
true 6
|
||||
--f, n, table.unpack(t) func.3 0 1 2 3 4
|
||||
true 10
|
||||
--f, n, table.unpack(t) func.3 1
|
||||
f3,n-1,n,... func.3 0 1
|
||||
true true 1
|
||||
--f, n, table.unpack(t) func.3 1 1
|
||||
f3,n-1,n,... func.3 0 1 1
|
||||
true true 2
|
||||
--f, n, table.unpack(t) func.3 1 1 2
|
||||
f3,n-1,n,... func.3 0 1 1 2
|
||||
true true 4
|
||||
--f, n, table.unpack(t) func.3 1 1 2 3
|
||||
f3,n-1,n,... func.3 0 1 1 2 3
|
||||
true true 7
|
||||
--f, n, table.unpack(t) func.3 1 1 2 3 4
|
||||
f3,n-1,n,... func.3 0 1 1 2 3 4
|
||||
true true 11
|
||||
--f, n, table.unpack(t) func.3 2
|
||||
f3,n-1,n,... func.3 1 2
|
||||
f3,n-1,n,... func.3 0 1 2
|
||||
true true true 3
|
||||
--f, n, table.unpack(t) func.3 2 1
|
||||
f3,n-1,n,... func.3 1 2 1
|
||||
f3,n-1,n,... func.3 0 1 2 1
|
||||
true true true 4
|
||||
--f, n, table.unpack(t) func.3 2 1 2
|
||||
f3,n-1,n,... func.3 1 2 1 2
|
||||
f3,n-1,n,... func.3 0 1 2 1 2
|
||||
true true true 6
|
||||
--f, n, table.unpack(t) func.3 2 1 2 3
|
||||
f3,n-1,n,... func.3 1 2 1 2 3
|
||||
f3,n-1,n,... func.3 0 1 2 1 2 3
|
||||
true true true 9
|
||||
--f, n, table.unpack(t) func.3 2 1 2 3 4
|
||||
f3,n-1,n,... func.3 1 2 1 2 3 4
|
||||
f3,n-1,n,... func.3 0 1 2 1 2 3 4
|
||||
true true true 13
|
||||
--f, n, table.unpack(t) func.3 3
|
||||
f3,n-1,n,... func.3 2 3
|
||||
f3,n-1,n,... func.3 1 2 3
|
||||
f3,n-1,n,... func.3 0 1 2 3
|
||||
true true true true 6
|
||||
--f, n, table.unpack(t) func.3 3 1
|
||||
f3,n-1,n,... func.3 2 3 1
|
||||
f3,n-1,n,... func.3 1 2 3 1
|
||||
f3,n-1,n,... func.3 0 1 2 3 1
|
||||
true true true true 7
|
||||
--f, n, table.unpack(t) func.3 3 1 2
|
||||
f3,n-1,n,... func.3 2 3 1 2
|
||||
f3,n-1,n,... func.3 1 2 3 1 2
|
||||
f3,n-1,n,... func.3 0 1 2 3 1 2
|
||||
true true true true 9
|
||||
--f, n, table.unpack(t) func.3 3 1 2 3
|
||||
f3,n-1,n,... func.3 2 3 1 2 3
|
||||
f3,n-1,n,... func.3 1 2 3 1 2 3
|
||||
f3,n-1,n,... func.3 0 1 2 3 1 2 3
|
||||
true true true true 12
|
||||
--f, n, table.unpack(t) func.3 3 1 2 3 4
|
||||
f3,n-1,n,... func.3 2 3 1 2 3 4
|
||||
f3,n-1,n,... func.3 1 2 3 1 2 3 4
|
||||
f3,n-1,n,... func.3 0 1 2 3 1 2 3 4
|
||||
true true true true 16
|
||||
120
|
||||
120
|
||||
1234
|
||||
true 832040
|
||||
true 832040
|
||||
true inf
|
||||
1 1 2 3 5 8 13 21 34
|
||||
23
luaj-test/src/test/resources/compatibility/upvalues.out
Normal file
23
luaj-test/src/test/resources/compatibility/upvalues.out
Normal file
@@ -0,0 +1,23 @@
|
||||
-------- simple upvalues tests --------
|
||||
6
|
||||
5
|
||||
f1()= 6
|
||||
g1()= 5
|
||||
6
|
||||
5
|
||||
f2()= 6
|
||||
g2()= 5
|
||||
g1()= 4
|
||||
f1()= 5
|
||||
simplevalues result: true
|
||||
----------- upvalued in middle ------------
|
||||
x= 3
|
||||
y= 5
|
||||
z= 7
|
||||
x= x
|
||||
y= y
|
||||
z= z
|
||||
true
|
||||
--------- nested upvalues ----------
|
||||
10 20
|
||||
nestedupvaluestest result: true
|
||||
418
luaj-test/src/test/resources/compatibility/vm.out
Normal file
418
luaj-test/src/test/resources/compatibility/vm.out
Normal file
@@ -0,0 +1,418 @@
|
||||
-------- basic vm tests --------
|
||||
-- boolean tests
|
||||
true
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
false
|
||||
false
|
||||
true
|
||||
true
|
||||
false
|
||||
false
|
||||
true
|
||||
false
|
||||
true
|
||||
1
|
||||
0
|
||||
nil
|
||||
1
|
||||
0
|
||||
nil
|
||||
booleantests result: true
|
||||
------------- varargs
|
||||
---- function p()
|
||||
--p():
|
||||
a nil
|
||||
...
|
||||
...,a nil nil
|
||||
a,... nil
|
||||
-> true
|
||||
--p("q"):
|
||||
a q
|
||||
...
|
||||
...,a nil q
|
||||
a,... q
|
||||
-> true
|
||||
--p("q","r"):
|
||||
a q
|
||||
... r
|
||||
...,a r q
|
||||
a,... q r
|
||||
-> true
|
||||
--p("q","r","s"):
|
||||
a q
|
||||
... r s
|
||||
...,a r q
|
||||
a,... q r s
|
||||
-> true
|
||||
---- function q()
|
||||
--q():
|
||||
a,arg[1],arg[2],arg[3] nil nil global-1 global-2 global-3
|
||||
-> true
|
||||
--q("q"):
|
||||
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
|
||||
-> true
|
||||
--q("q","r"):
|
||||
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
|
||||
-> true
|
||||
--q("q","r","s"):
|
||||
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
|
||||
-> true
|
||||
---- function r()
|
||||
--r():
|
||||
a,arg[1],arg[2],arg[3] nil nil global-1 global-2 global-3
|
||||
a nil
|
||||
...
|
||||
...,a nil nil
|
||||
a,... nil
|
||||
-> true
|
||||
--r("q"):
|
||||
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
|
||||
a q
|
||||
...
|
||||
...,a nil q
|
||||
a,... q
|
||||
-> true
|
||||
--r("q","r"):
|
||||
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
|
||||
a q
|
||||
... r
|
||||
...,a r q
|
||||
a,... q r
|
||||
-> true
|
||||
--r("q","r","s"):
|
||||
a,arg[1],arg[2],arg[3] q nil global-1 global-2 global-3
|
||||
a q
|
||||
... r s
|
||||
...,a r q
|
||||
a,... q r s
|
||||
-> true
|
||||
---- function s()
|
||||
--s():
|
||||
a,arg[1],arg[2],arg[3] nil 1 2 3
|
||||
a nil
|
||||
-> true
|
||||
--s("q"):
|
||||
a,arg[1],arg[2],arg[3] q 1 2 3
|
||||
a q
|
||||
-> true
|
||||
--s("q","r"):
|
||||
a,arg[1],arg[2],arg[3] q 1 2 3
|
||||
a q
|
||||
-> true
|
||||
--s("q","r","s"):
|
||||
a,arg[1],arg[2],arg[3] q 1 2 3
|
||||
a q
|
||||
-> true
|
||||
---- function t()
|
||||
--t():
|
||||
a,arg[1],arg[2],arg[3] nil 1 2 3
|
||||
a nil
|
||||
...
|
||||
...,a nil nil
|
||||
a,... nil
|
||||
-> true
|
||||
--t("q"):
|
||||
a,arg[1],arg[2],arg[3] q 1 2 3
|
||||
a q
|
||||
...
|
||||
...,a nil q
|
||||
a,... q
|
||||
-> true
|
||||
--t("q","r"):
|
||||
a,arg[1],arg[2],arg[3] q 1 2 3
|
||||
a q
|
||||
... r
|
||||
...,a r q
|
||||
a,... q r
|
||||
-> true
|
||||
--t("q","r","s"):
|
||||
a,arg[1],arg[2],arg[3] q 1 2 3
|
||||
a q
|
||||
... r s
|
||||
...,a r q
|
||||
a,... q r s
|
||||
-> true
|
||||
---- function u()
|
||||
--u():
|
||||
arg nil
|
||||
-> true
|
||||
--u("q"):
|
||||
arg q
|
||||
-> true
|
||||
--u("q","r"):
|
||||
arg q
|
||||
-> true
|
||||
--u("q","r","s"):
|
||||
arg q
|
||||
-> true
|
||||
---- function v()
|
||||
--v():
|
||||
arg nil
|
||||
...
|
||||
arg,... nil
|
||||
-> true
|
||||
--v("q"):
|
||||
arg q
|
||||
...
|
||||
arg,... q
|
||||
-> true
|
||||
--v("q","r"):
|
||||
arg q
|
||||
... r
|
||||
arg,... q r
|
||||
-> true
|
||||
--v("q","r","s"):
|
||||
arg q
|
||||
... r s
|
||||
arg,... q r s
|
||||
-> true
|
||||
varargstest result: true
|
||||
---------- metatable tests
|
||||
ell
|
||||
set{} tbl.1 tbl.2 tbl.1 nil
|
||||
set-nil tbl.1 nil tbl.1 nil
|
||||
set{} tbl.1 tbl.3 tbl.1 nil
|
||||
set tbl.1 tbl.3 false string
|
||||
set{} tbl.1 tbl.4 tbl.1 nil
|
||||
set{} tbl.1 tbl.5 tbl.1 nil
|
||||
set{}{} tbl.1 tbl.6 tbl.1 nil
|
||||
set-nil tbl.1 nil tbl.1 nil
|
||||
set{__} tbl.1 tbl.7 tbl.1 nil
|
||||
set{} tbl.1 tbl.7 false string
|
||||
set-nil tbl.1 tbl.7 false string
|
||||
set{} tbl.8 tbl.9 tbl.8 nil
|
||||
set-nil tbl.8 nil tbl.8 nil
|
||||
set{__} tbl.8 abc tbl.8 nil
|
||||
set{} tbl.8 abc false string
|
||||
set-nil tbl.8 abc false string
|
||||
t.a 1234
|
||||
t.b 1235
|
||||
t.a 1234
|
||||
t.b 1235
|
||||
t.c 1236
|
||||
t.a 1234
|
||||
t.b 1235
|
||||
t.c 1236
|
||||
t.d 1237
|
||||
metatabletests result: true
|
||||
------------ huge tables
|
||||
#t= 100 t[1,50,51,59] 1 1 1 1
|
||||
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
|
||||
#t2= 70 t[1,50,51,59] 1 1 1 1
|
||||
0,3,4,7,9,8,12,15,23,5,10,13,14,17,19,18,112,115,123,15,20,33,24,27,29,28,212,215,223,25,40,43,44,47,49,48,412,415,423,45,50,53,54,57,59,58,512,515,523,55,60,63,64,67,69,68,612,615,623,65,70,73,74,77,79,78,72,715,723,75
|
||||
t[2000] a
|
||||
t[2001] b
|
||||
t[2002] c
|
||||
t[2003] d
|
||||
t[2004] e
|
||||
t[2005] f
|
||||
t[2006] g
|
||||
t[2007] h
|
||||
t[2008] i
|
||||
t[2009] j
|
||||
t[3000] a
|
||||
t[3001] b
|
||||
t[3002] c
|
||||
t[3003] d
|
||||
t[3004] e
|
||||
t[3005] f
|
||||
t[3006] g
|
||||
t[3007] h
|
||||
t[3008] i
|
||||
t[3009] j
|
||||
t[4000] a
|
||||
t[4001] b
|
||||
t[4002] c
|
||||
t[4003] d
|
||||
t[4004] e
|
||||
t[4005] f
|
||||
t[4006] g
|
||||
t[4007] h
|
||||
t[4008] i
|
||||
t[4009] j
|
||||
t[5000] a
|
||||
t[5001] b
|
||||
t[5002] c
|
||||
t[5003] d
|
||||
t[5004] e
|
||||
t[5005] f
|
||||
t[5006] g
|
||||
t[5007] h
|
||||
t[5008] i
|
||||
t[5009] j
|
||||
t[6000] a
|
||||
t[6001] b
|
||||
t[6002] c
|
||||
t[6003] d
|
||||
t[6004] e
|
||||
t[6005] f
|
||||
t[6006] g
|
||||
t[6007] h
|
||||
t[6008] i
|
||||
t[6009] j
|
||||
t[7000] a
|
||||
t[7001] b
|
||||
t[7002] c
|
||||
t[7003] d
|
||||
t[7004] e
|
||||
t[7005] f
|
||||
t[7006] g
|
||||
t[7007] h
|
||||
t[7008] i
|
||||
t[7009] j
|
||||
t[8000] a
|
||||
t[8001] b
|
||||
t[8002] c
|
||||
t[8003] d
|
||||
t[8004] e
|
||||
t[8005] f
|
||||
t[8006] g
|
||||
t[8007] h
|
||||
t[8008] i
|
||||
t[8009] j
|
||||
hugetables result: true
|
||||
--------- many locals
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
a a
|
||||
b b
|
||||
c c
|
||||
d d
|
||||
e e
|
||||
f f
|
||||
g g
|
||||
h h
|
||||
i i
|
||||
j j
|
||||
manylocals result: true
|
||||
530
luaj-test/src/test/resources/errors/baselibargs.out
Normal file
530
luaj-test/src/test/resources/errors/baselibargs.out
Normal file
@@ -0,0 +1,530 @@
|
||||
====== assert ======
|
||||
--- checkallpass
|
||||
- assert(true,nil) true
|
||||
- assert(123,nil) 123
|
||||
- assert(true,'abc') true,'abc'
|
||||
- assert(123,'abc') 123,'abc'
|
||||
- assert(true,1.25) true,1.25
|
||||
- assert(123,1.25) 123,1.25
|
||||
- assert(true,true) true,true
|
||||
- assert(123,true) 123,true
|
||||
- assert(true,<table>) true,<table>
|
||||
- assert(123,<table>) 123,<table>
|
||||
- assert(true,<function>) true,<function>
|
||||
- assert(123,<function>) 123,<function>
|
||||
- assert(true,<thread>) true,<thread>
|
||||
- assert(123,<thread>) 123,<thread>
|
||||
--- checkallerrors
|
||||
- assert(nil,nil) ...assertion failed...
|
||||
- assert(false,nil) ...assertion failed...
|
||||
--- checkallerrors
|
||||
- assert(nil,'message') ...message...
|
||||
- assert(false,'message') ...message...
|
||||
====== collectgarbage ======
|
||||
--- checkallpass
|
||||
- collectgarbage('collect') number
|
||||
- collectgarbage('count') number,number
|
||||
--- checkallerrors
|
||||
- collectgarbage('abc') ...bad argument...
|
||||
- collectgarbage(1.25) ...bad argument...
|
||||
--- checkallerrors
|
||||
- collectgarbage(true) ...string expected...
|
||||
- collectgarbage(<table>) ...string expected...
|
||||
- collectgarbage(<function>) ...string expected...
|
||||
- collectgarbage(<thread>) ...string expected...
|
||||
====== dofile ======
|
||||
====== error ======
|
||||
====== getmetatable ======
|
||||
--- checkallpass
|
||||
- getmetatable('abc') <table>
|
||||
- getmetatable(1.25)
|
||||
- getmetatable(true)
|
||||
- getmetatable(<table>)
|
||||
- getmetatable(<function>)
|
||||
- getmetatable(<thread>)
|
||||
--- checkallerrors
|
||||
- getmetatable() ...bad argument...
|
||||
====== ipairs ======
|
||||
--- checkallpass
|
||||
- ipairs(<table>) <function>,<table>,0
|
||||
--- checkallerrors
|
||||
- ipairs(nil) ...bad argument...
|
||||
- ipairs('abc') ...bad argument...
|
||||
- ipairs(1.25) ...bad argument...
|
||||
- ipairs(true) ...bad argument...
|
||||
- ipairs(<function>) ...bad argument...
|
||||
- ipairs(<thread>) ...bad argument...
|
||||
====== load ======
|
||||
--- checkallpass
|
||||
- load(<function>,nil) <function>
|
||||
- load(<function>,'abc') <function>
|
||||
--- checkallerrors
|
||||
- load(nil,nil) ...bad argument...
|
||||
needcheck load('abc',nil) nil
|
||||
needcheck load(1.25,nil) nil
|
||||
- load(true,nil) ...bad argument...
|
||||
- load(<table>,nil) ...bad argument...
|
||||
- load(<thread>,nil) ...bad argument...
|
||||
- load(nil,'abc') ...bad argument...
|
||||
needcheck load('abc','abc') nil
|
||||
needcheck load(1.25,'abc') nil
|
||||
- load(true,'abc') ...bad argument...
|
||||
- load(<table>,'abc') ...bad argument...
|
||||
- load(<thread>,'abc') ...bad argument...
|
||||
- load(nil,1.25) ...bad argument...
|
||||
needcheck load('abc',1.25) nil
|
||||
needcheck load(1.25,1.25) nil
|
||||
- load(true,1.25) ...bad argument...
|
||||
- load(<table>,1.25) ...bad argument...
|
||||
- load(<thread>,1.25) ...bad argument...
|
||||
--- checkallerrors
|
||||
- load(<function>,<function>) ...bad argument...
|
||||
- load(<function>,<table>) ...bad argument...
|
||||
====== loadfile ======
|
||||
====== load ======
|
||||
--- checkallpass
|
||||
- load('return') <function>
|
||||
--- checkallpass
|
||||
- load('return','mychunk') <function>
|
||||
--- checkallpass
|
||||
- load('return a ... b','mychunk') nil,string
|
||||
--- checkallerrors
|
||||
- load(nil,nil) ...bad argument...
|
||||
- load(true,nil) ...bad argument...
|
||||
- load(<table>,nil) ...bad argument...
|
||||
needcheck load(<function>,nil) function: 0x10011ba00
|
||||
- load(<thread>,nil) ...bad argument...
|
||||
- load(nil,'abc') ...bad argument...
|
||||
- load(true,'abc') ...bad argument...
|
||||
- load(<table>,'abc') ...bad argument...
|
||||
needcheck load(<function>,'abc') function: 0x10011c780
|
||||
- load(<thread>,'abc') ...bad argument...
|
||||
- load(nil,1.25) ...bad argument...
|
||||
- load(true,1.25) ...bad argument...
|
||||
- load(<table>,1.25) ...bad argument...
|
||||
needcheck load(<function>,1.25) function: 0x10011d560
|
||||
- load(<thread>,1.25) ...bad argument...
|
||||
--- checkallerrors
|
||||
- load('return',<function>) ...bad argument...
|
||||
- load('return',<table>) ...bad argument...
|
||||
====== next ======
|
||||
--- checkallpass
|
||||
- next(<table>,'aa')
|
||||
--- checkallerrors
|
||||
- next(nil,nil) ...bad argument...
|
||||
- next('abc',nil) ...bad argument...
|
||||
- next(1.25,nil) ...bad argument...
|
||||
- next(true,nil) ...bad argument...
|
||||
- next(<function>,nil) ...bad argument...
|
||||
- next(<thread>,nil) ...bad argument...
|
||||
- next(nil,1) ...bad argument...
|
||||
- next('abc',1) ...bad argument...
|
||||
- next(1.25,1) ...bad argument...
|
||||
- next(true,1) ...bad argument...
|
||||
- next(<function>,1) ...bad argument...
|
||||
- next(<thread>,1) ...bad argument...
|
||||
--- checkallerrors
|
||||
- next(<table>,'abc') ...invalid key...
|
||||
- next(<table>,1.25) ...invalid key...
|
||||
- next(<table>,true) ...invalid key...
|
||||
- next(<table>,<table>) ...invalid key...
|
||||
- next(<table>,<function>) ...invalid key...
|
||||
====== pairs ======
|
||||
--- checkallpass
|
||||
- pairs(<table>) <function>,<table>
|
||||
--- checkallerrors
|
||||
- pairs(nil) ...bad argument...
|
||||
- pairs('abc') ...bad argument...
|
||||
- pairs(1.25) ...bad argument...
|
||||
- pairs(true) ...bad argument...
|
||||
- pairs(<function>) ...bad argument...
|
||||
- pairs(<thread>) ...bad argument...
|
||||
====== pcall ======
|
||||
--- checkallpass
|
||||
- pcall('abc',nil) boolean,string
|
||||
- pcall(1.25,nil) boolean,string
|
||||
- pcall(true,nil) boolean,string
|
||||
- pcall(<table>,nil) boolean,string
|
||||
- pcall(<function>,nil) boolean
|
||||
- pcall(<thread>,nil) boolean,string
|
||||
- pcall('abc','abc') boolean,string
|
||||
- pcall(1.25,'abc') boolean,string
|
||||
- pcall(true,'abc') boolean,string
|
||||
- pcall(<table>,'abc') boolean,string
|
||||
- pcall(<function>,'abc') boolean
|
||||
- pcall(<thread>,'abc') boolean,string
|
||||
- pcall('abc',1.25) boolean,string
|
||||
- pcall(1.25,1.25) boolean,string
|
||||
- pcall(true,1.25) boolean,string
|
||||
- pcall(<table>,1.25) boolean,string
|
||||
- pcall(<function>,1.25) boolean
|
||||
- pcall(<thread>,1.25) boolean,string
|
||||
- pcall('abc',true) boolean,string
|
||||
- pcall(1.25,true) boolean,string
|
||||
- pcall(true,true) boolean,string
|
||||
- pcall(<table>,true) boolean,string
|
||||
- pcall(<function>,true) boolean
|
||||
- pcall(<thread>,true) boolean,string
|
||||
- pcall('abc',<table>) boolean,string
|
||||
- pcall(1.25,<table>) boolean,string
|
||||
- pcall(true,<table>) boolean,string
|
||||
- pcall(<table>,<table>) boolean,string
|
||||
- pcall(<function>,<table>) boolean
|
||||
- pcall(<thread>,<table>) boolean,string
|
||||
- pcall('abc',<function>) boolean,string
|
||||
- pcall(1.25,<function>) boolean,string
|
||||
- pcall(true,<function>) boolean,string
|
||||
- pcall(<table>,<function>) boolean,string
|
||||
- pcall(<function>,<function>) boolean
|
||||
- pcall(<thread>,<function>) boolean,string
|
||||
- pcall('abc',<thread>) boolean,string
|
||||
- pcall(1.25,<thread>) boolean,string
|
||||
- pcall(true,<thread>) boolean,string
|
||||
- pcall(<table>,<thread>) boolean,string
|
||||
- pcall(<function>,<thread>) boolean
|
||||
- pcall(<thread>,<thread>) boolean,string
|
||||
--- checkallerrors
|
||||
- pcall() ...bad argument...
|
||||
====== print ======
|
||||
--- checkallpass
|
||||
|
||||
- print()
|
||||
--- checkallpass
|
||||
nil
|
||||
- print(nil)
|
||||
abc
|
||||
- print('abc')
|
||||
1.25
|
||||
- print(1.25)
|
||||
true
|
||||
- print(true)
|
||||
====== rawequal ======
|
||||
--- checkallpass
|
||||
- rawequal('abc','abc') true
|
||||
- rawequal(1.25,'abc') false
|
||||
- rawequal(true,'abc') false
|
||||
- rawequal(<table>,'abc') false
|
||||
- rawequal(<function>,'abc') false
|
||||
- rawequal(<thread>,'abc') false
|
||||
- rawequal('abc',1.25) false
|
||||
- rawequal(1.25,1.25) true
|
||||
- rawequal(true,1.25) false
|
||||
- rawequal(<table>,1.25) false
|
||||
- rawequal(<function>,1.25) false
|
||||
- rawequal(<thread>,1.25) false
|
||||
- rawequal('abc',true) false
|
||||
- rawequal(1.25,true) false
|
||||
- rawequal(true,true) true
|
||||
- rawequal(<table>,true) false
|
||||
- rawequal(<function>,true) false
|
||||
- rawequal(<thread>,true) false
|
||||
- rawequal('abc',<table>) false
|
||||
- rawequal(1.25,<table>) false
|
||||
- rawequal(true,<table>) false
|
||||
- rawequal(<table>,<table>) true
|
||||
- rawequal(<function>,<table>) false
|
||||
- rawequal(<thread>,<table>) false
|
||||
- rawequal('abc',<function>) false
|
||||
- rawequal(1.25,<function>) false
|
||||
- rawequal(true,<function>) false
|
||||
- rawequal(<table>,<function>) false
|
||||
- rawequal(<function>,<function>) true
|
||||
- rawequal(<thread>,<function>) false
|
||||
- rawequal('abc',<thread>) false
|
||||
- rawequal(1.25,<thread>) false
|
||||
- rawequal(true,<thread>) false
|
||||
- rawequal(<table>,<thread>) false
|
||||
- rawequal(<function>,<thread>) false
|
||||
- rawequal(<thread>,<thread>) true
|
||||
--- checkallerrors
|
||||
- rawequal() ...bad argument...
|
||||
--- checkallerrors
|
||||
- rawequal('abc') ...bad argument...
|
||||
- rawequal(1.25) ...bad argument...
|
||||
- rawequal(true) ...bad argument...
|
||||
- rawequal(<table>) ...bad argument...
|
||||
- rawequal(<function>) ...bad argument...
|
||||
- rawequal(<thread>) ...bad argument...
|
||||
====== rawget ======
|
||||
--- checkallpass
|
||||
- rawget(<table>,'aa') 456
|
||||
--- checkallpass
|
||||
- rawget(<table>,'abc')
|
||||
- rawget(<table>,1.25)
|
||||
- rawget(<table>,true)
|
||||
- rawget(<table>,<table>)
|
||||
- rawget(<table>,<function>)
|
||||
--- checkallerrors
|
||||
--- checkallerrors
|
||||
- rawget(nil,'abc') ...bad argument...
|
||||
- rawget('abc','abc') ...bad argument...
|
||||
- rawget(1.25,'abc') ...bad argument...
|
||||
- rawget(true,'abc') ...bad argument...
|
||||
- rawget(<function>,'abc') ...bad argument...
|
||||
- rawget(<thread>,'abc') ...bad argument...
|
||||
- rawget(nil,1.25) ...bad argument...
|
||||
- rawget('abc',1.25) ...bad argument...
|
||||
- rawget(1.25,1.25) ...bad argument...
|
||||
- rawget(true,1.25) ...bad argument...
|
||||
- rawget(<function>,1.25) ...bad argument...
|
||||
- rawget(<thread>,1.25) ...bad argument...
|
||||
- rawget(nil,true) ...bad argument...
|
||||
- rawget('abc',true) ...bad argument...
|
||||
- rawget(1.25,true) ...bad argument...
|
||||
- rawget(true,true) ...bad argument...
|
||||
- rawget(<function>,true) ...bad argument...
|
||||
- rawget(<thread>,true) ...bad argument...
|
||||
- rawget(nil,<table>) ...bad argument...
|
||||
- rawget('abc',<table>) ...bad argument...
|
||||
- rawget(1.25,<table>) ...bad argument...
|
||||
- rawget(true,<table>) ...bad argument...
|
||||
- rawget(<function>,<table>) ...bad argument...
|
||||
- rawget(<thread>,<table>) ...bad argument...
|
||||
- rawget(nil,<function>) ...bad argument...
|
||||
- rawget('abc',<function>) ...bad argument...
|
||||
- rawget(1.25,<function>) ...bad argument...
|
||||
- rawget(true,<function>) ...bad argument...
|
||||
- rawget(<function>,<function>) ...bad argument...
|
||||
- rawget(<thread>,<function>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- rawget() ...bad argument...
|
||||
====== rawset ======
|
||||
--- checkallpass
|
||||
- rawset(<table>,'aa','abc') <table>
|
||||
- rawset(<table>,'aa',1.25) <table>
|
||||
- rawset(<table>,'aa',true) <table>
|
||||
- rawset(<table>,'aa',<table>) <table>
|
||||
- rawset(<table>,'aa',<function>) <table>
|
||||
- rawset(<table>,'aa',<thread>) <table>
|
||||
--- checkallpass
|
||||
- rawset(<table>,'abc','abc') <table>
|
||||
- rawset(<table>,1.25,'abc') <table>
|
||||
- rawset(<table>,true,'abc') <table>
|
||||
- rawset(<table>,<table>,'abc') <table>
|
||||
- rawset(<table>,<function>,'abc') <table>
|
||||
- rawset(<table>,'abc',1.25) <table>
|
||||
- rawset(<table>,1.25,1.25) <table>
|
||||
- rawset(<table>,true,1.25) <table>
|
||||
- rawset(<table>,<table>,1.25) <table>
|
||||
- rawset(<table>,<function>,1.25) <table>
|
||||
- rawset(<table>,'abc',true) <table>
|
||||
- rawset(<table>,1.25,true) <table>
|
||||
- rawset(<table>,true,true) <table>
|
||||
- rawset(<table>,<table>,true) <table>
|
||||
- rawset(<table>,<function>,true) <table>
|
||||
- rawset(<table>,'abc',<table>) <table>
|
||||
- rawset(<table>,1.25,<table>) <table>
|
||||
- rawset(<table>,true,<table>) <table>
|
||||
- rawset(<table>,<table>,<table>) <table>
|
||||
- rawset(<table>,<function>,<table>) <table>
|
||||
- rawset(<table>,'abc',<function>) <table>
|
||||
- rawset(<table>,1.25,<function>) <table>
|
||||
- rawset(<table>,true,<function>) <table>
|
||||
- rawset(<table>,<table>,<function>) <table>
|
||||
- rawset(<table>,<function>,<function>) <table>
|
||||
- rawset(<table>,'abc',<thread>) <table>
|
||||
- rawset(<table>,1.25,<thread>) <table>
|
||||
- rawset(<table>,true,<thread>) <table>
|
||||
- rawset(<table>,<table>,<thread>) <table>
|
||||
- rawset(<table>,<function>,<thread>) <table>
|
||||
--- checkallerrors
|
||||
--- checkallerrors
|
||||
- rawset() ...bad argument...
|
||||
--- checkallerrors
|
||||
- rawset(nil,'abc','abc') ...bad argument...
|
||||
- rawset('abc','abc','abc') ...bad argument...
|
||||
- rawset(1.25,'abc','abc') ...bad argument...
|
||||
- rawset(true,'abc','abc') ...bad argument...
|
||||
- rawset(<function>,'abc','abc') ...bad argument...
|
||||
- rawset(<thread>,'abc','abc') ...bad argument...
|
||||
- rawset(nil,1.25,'abc') ...bad argument...
|
||||
- rawset('abc',1.25,'abc') ...bad argument...
|
||||
- rawset(1.25,1.25,'abc') ...bad argument...
|
||||
- rawset(true,1.25,'abc') ...bad argument...
|
||||
- rawset(<function>,1.25,'abc') ...bad argument...
|
||||
- rawset(<thread>,1.25,'abc') ...bad argument...
|
||||
- rawset(nil,'abc',1.25) ...bad argument...
|
||||
- rawset('abc','abc',1.25) ...bad argument...
|
||||
- rawset(1.25,'abc',1.25) ...bad argument...
|
||||
- rawset(true,'abc',1.25) ...bad argument...
|
||||
- rawset(<function>,'abc',1.25) ...bad argument...
|
||||
- rawset(<thread>,'abc',1.25) ...bad argument...
|
||||
- rawset(nil,1.25,1.25) ...bad argument...
|
||||
- rawset('abc',1.25,1.25) ...bad argument...
|
||||
- rawset(1.25,1.25,1.25) ...bad argument...
|
||||
- rawset(true,1.25,1.25) ...bad argument...
|
||||
- rawset(<function>,1.25,1.25) ...bad argument...
|
||||
- rawset(<thread>,1.25,1.25) ...bad argument...
|
||||
--- checkallerrors
|
||||
- rawset(<table>,'aa') ...bad argument...
|
||||
====== select ======
|
||||
--- checkallpass
|
||||
- select(1.25,nil)
|
||||
- select('#',nil) 1
|
||||
- select(1.25,'abc') 'abc'
|
||||
- select('#','abc') 1
|
||||
- select(1.25,1.25) 1.25
|
||||
- select('#',1.25) 1
|
||||
- select(1.25,true) true
|
||||
- select('#',true) 1
|
||||
- select(1.25,<table>) <table>
|
||||
- select('#',<table>) 1
|
||||
- select(1.25,<function>) <function>
|
||||
- select('#',<function>) 1
|
||||
- select(1.25,<thread>) <thread>
|
||||
- select('#',<thread>) 1
|
||||
--- checkallerrors
|
||||
- select(nil) ...bad argument...
|
||||
- select('abc') ...bad argument...
|
||||
- select(true) ...bad argument...
|
||||
- select(<table>) ...bad argument...
|
||||
- select(<function>) ...bad argument...
|
||||
- select(<thread>) ...bad argument...
|
||||
====== setmetatable ======
|
||||
--- checkallpass
|
||||
- setmetatable(<table>,<table>) <table>
|
||||
--- checkallpass
|
||||
--- checkallerrors
|
||||
- setmetatable(nil,<table>) ...bad argument...
|
||||
- setmetatable('abc',<table>) ...bad argument...
|
||||
- setmetatable(1.25,<table>) ...bad argument...
|
||||
- setmetatable(true,<table>) ...bad argument...
|
||||
- setmetatable(<function>,<table>) ...bad argument...
|
||||
- setmetatable(<thread>,<table>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- setmetatable(<table>,'abc') ...bad argument...
|
||||
- setmetatable(<table>,1.25) ...bad argument...
|
||||
- setmetatable(<table>,true) ...bad argument...
|
||||
- setmetatable(<table>,<function>) ...bad argument...
|
||||
- setmetatable(<table>,<thread>) ...bad argument...
|
||||
====== tonumber ======
|
||||
--- checkallpass
|
||||
- tonumber(1.25,nil) 1.25
|
||||
- tonumber('789',nil) 789
|
||||
- tonumber(1.25,2)
|
||||
- tonumber('789',2)
|
||||
- tonumber(1.25,10)
|
||||
- tonumber('789',10) 789
|
||||
- tonumber(1.25,36)
|
||||
- tonumber('789',36) 9369
|
||||
--- checkallpass
|
||||
- tonumber('abc',nil)
|
||||
- tonumber(1.25,nil) 1.25
|
||||
- tonumber(true,nil)
|
||||
- tonumber(<table>,nil)
|
||||
- tonumber(<function>,nil)
|
||||
- tonumber(<thread>,nil)
|
||||
- tonumber('abc',10)
|
||||
- tonumber(1.25,10)
|
||||
fail tonumber(true,10) 'bad argument #1 to '_G.tonumber' (string expected, got boolean)'
|
||||
fail tonumber(<table>,10) 'bad argument #1 to '_G.tonumber' (string expected, got table)'
|
||||
fail tonumber(<function>,10) 'bad argument #1 to '_G.tonumber' (string expected, got function)'
|
||||
fail tonumber(<thread>,10) 'bad argument #1 to '_G.tonumber' (string expected, got thread)'
|
||||
--- checkallerrors
|
||||
- tonumber(nil,2) ...bad argument...
|
||||
- tonumber(<function>,2) ...bad argument...
|
||||
- tonumber(<table>,2) ...bad argument...
|
||||
- tonumber(nil,9) ...bad argument...
|
||||
- tonumber(<function>,9) ...bad argument...
|
||||
- tonumber(<table>,9) ...bad argument...
|
||||
- tonumber(nil,11) ...bad argument...
|
||||
- tonumber(<function>,11) ...bad argument...
|
||||
- tonumber(<table>,11) ...bad argument...
|
||||
- tonumber(nil,36) ...bad argument...
|
||||
- tonumber(<function>,36) ...bad argument...
|
||||
- tonumber(<table>,36) ...bad argument...
|
||||
--- checkallerrors
|
||||
- tonumber(1.25,1) ...bad argument...
|
||||
- tonumber('789',1) ...bad argument...
|
||||
- tonumber(1.25,37) ...bad argument...
|
||||
- tonumber('789',37) ...bad argument...
|
||||
- tonumber(1.25,<table>) ...bad argument...
|
||||
- tonumber('789',<table>) ...bad argument...
|
||||
- tonumber(1.25,<function>) ...bad argument...
|
||||
- tonumber('789',<function>) ...bad argument...
|
||||
- tonumber(1.25,true) ...bad argument...
|
||||
- tonumber('789',true) ...bad argument...
|
||||
====== tostring ======
|
||||
--- checkallpass
|
||||
- tostring('abc') 'abc'
|
||||
- tostring(1.25) '1.25'
|
||||
- tostring(true) 'true'
|
||||
--- checkallpass
|
||||
- tostring(<table>) string
|
||||
- tostring(<function>) string
|
||||
- tostring(<thread>) string
|
||||
--- checkallpass
|
||||
- tostring('abc','anchor') 'abc'
|
||||
- tostring(1.25,'anchor') '1.25'
|
||||
- tostring(true,'anchor') 'true'
|
||||
--- checkallpass
|
||||
- tostring(<table>,'anchor') string
|
||||
- tostring(<function>,'anchor') string
|
||||
- tostring(<thread>,'anchor') string
|
||||
--- checkallerrors
|
||||
- tostring() ...bad argument...
|
||||
====== type ======
|
||||
--- checkallpass
|
||||
- type('abc') 'string'
|
||||
- type(1.25) 'number'
|
||||
- type(true) 'boolean'
|
||||
- type(<table>) 'table'
|
||||
- type(<function>) 'function'
|
||||
- type(<thread>) 'thread'
|
||||
--- checkallpass
|
||||
- type(nil,'anchor') 'nil'
|
||||
- type('abc','anchor') 'string'
|
||||
- type(1.25,'anchor') 'number'
|
||||
- type(true,'anchor') 'boolean'
|
||||
- type(<table>,'anchor') 'table'
|
||||
- type(<function>,'anchor') 'function'
|
||||
- type(<thread>,'anchor') 'thread'
|
||||
--- checkallerrors
|
||||
- type() ...bad argument...
|
||||
====== xpcall ======
|
||||
--- checkallpass
|
||||
- xpcall('abc','abc') false,'error in error handling'
|
||||
- xpcall(1.25,'abc') false,'error in error handling'
|
||||
- xpcall(true,'abc') false,'error in error handling'
|
||||
- xpcall(<table>,'abc') false,'error in error handling'
|
||||
- xpcall(<function>,'abc') true
|
||||
- xpcall(<thread>,'abc') false,'error in error handling'
|
||||
- xpcall('abc',1.25) false,'error in error handling'
|
||||
- xpcall(1.25,1.25) false,'error in error handling'
|
||||
- xpcall(true,1.25) false,'error in error handling'
|
||||
- xpcall(<table>,1.25) false,'error in error handling'
|
||||
- xpcall(<function>,1.25) true
|
||||
- xpcall(<thread>,1.25) false,'error in error handling'
|
||||
- xpcall('abc',true) false,'error in error handling'
|
||||
- xpcall(1.25,true) false,'error in error handling'
|
||||
- xpcall(true,true) false,'error in error handling'
|
||||
- xpcall(<table>,true) false,'error in error handling'
|
||||
- xpcall(<function>,true) true
|
||||
- xpcall(<thread>,true) false,'error in error handling'
|
||||
- xpcall('abc',<table>) false,'error in error handling'
|
||||
- xpcall(1.25,<table>) false,'error in error handling'
|
||||
- xpcall(true,<table>) false,'error in error handling'
|
||||
- xpcall(<table>,<table>) false,'error in error handling'
|
||||
- xpcall(<function>,<table>) true
|
||||
- xpcall(<thread>,<table>) false,'error in error handling'
|
||||
- xpcall('abc',<thread>) false,'error in error handling'
|
||||
- xpcall(1.25,<thread>) false,'error in error handling'
|
||||
- xpcall(true,<thread>) false,'error in error handling'
|
||||
- xpcall(<table>,<thread>) false,'error in error handling'
|
||||
- xpcall(<function>,<thread>) true
|
||||
- xpcall(<thread>,<thread>) false,'error in error handling'
|
||||
--- checkallpass
|
||||
- xpcall('abc',<function>) false,'aaa'
|
||||
- xpcall(1.25,<function>) false,'aaa'
|
||||
- xpcall(true,<function>) false,'aaa'
|
||||
- xpcall(<table>,<function>) false,'aaa'
|
||||
- xpcall(<function>,<function>) true
|
||||
- xpcall(<thread>,<function>) false,'aaa'
|
||||
--- checkallerrors
|
||||
- xpcall(nil) ...bad argument...
|
||||
- xpcall('abc') ...bad argument...
|
||||
- xpcall(1.25) ...bad argument...
|
||||
- xpcall(true) ...bad argument...
|
||||
- xpcall(<table>) ...bad argument...
|
||||
- xpcall(<function>) ...bad argument...
|
||||
- xpcall(<thread>) ...bad argument...
|
||||
65
luaj-test/src/test/resources/errors/coroutinelibargs.out
Normal file
65
luaj-test/src/test/resources/errors/coroutinelibargs.out
Normal file
@@ -0,0 +1,65 @@
|
||||
====== coroutine.create ======
|
||||
--- checkallpass
|
||||
- coroutine.create(<function>) <thread>
|
||||
--- checkallerrors
|
||||
- coroutine.create(nil) ...bad argument...
|
||||
- coroutine.create('abc') ...bad argument...
|
||||
- coroutine.create(1.25) ...bad argument...
|
||||
- coroutine.create(true) ...bad argument...
|
||||
- coroutine.create(<table>) ...bad argument...
|
||||
- coroutine.create(<thread>) ...bad argument...
|
||||
====== coroutine.resume ======
|
||||
--- checkallpass
|
||||
- coroutine.resume(<thread>,nil) true
|
||||
- coroutine.resume(<thread>,'abc') true
|
||||
- coroutine.resume(<thread>,1.25) true
|
||||
- coroutine.resume(<thread>,true) true
|
||||
- coroutine.resume(<thread>,<table>) true
|
||||
- coroutine.resume(<thread>,<function>) true
|
||||
- coroutine.resume(<thread>,<thread>) true
|
||||
--- checkallerrors
|
||||
- coroutine.resume(nil) ...bad argument...
|
||||
- coroutine.resume('abc') ...bad argument...
|
||||
- coroutine.resume(1.25) ...bad argument...
|
||||
- coroutine.resume(true) ...bad argument...
|
||||
- coroutine.resume(<table>) ...bad argument...
|
||||
- coroutine.resume(<function>) ...bad argument...
|
||||
====== coroutine.running ======
|
||||
--- checkallpass
|
||||
- coroutine.running(nil) <thread>,true
|
||||
- coroutine.running('abc') <thread>,true
|
||||
- coroutine.running(1.25) <thread>,true
|
||||
- coroutine.running(true) <thread>,true
|
||||
- coroutine.running(<table>) <thread>,true
|
||||
- coroutine.running(<function>) <thread>,true
|
||||
- coroutine.running(<thread>) <thread>,true
|
||||
====== coroutine.status ======
|
||||
--- checkallpass
|
||||
- coroutine.status(<thread>) 'suspended'
|
||||
--- checkallerrors
|
||||
- coroutine.status(nil) ...bad argument...
|
||||
- coroutine.status('abc') ...bad argument...
|
||||
- coroutine.status(1.25) ...bad argument...
|
||||
- coroutine.status(true) ...bad argument...
|
||||
- coroutine.status(<table>) ...bad argument...
|
||||
- coroutine.status(<function>) ...bad argument...
|
||||
====== coroutine.wrap ======
|
||||
--- checkallpass
|
||||
- coroutine.wrap(<function>) <function>
|
||||
--- checkallerrors
|
||||
- coroutine.wrap(nil) ...bad argument...
|
||||
- coroutine.wrap('abc') ...bad argument...
|
||||
- coroutine.wrap(1.25) ...bad argument...
|
||||
- coroutine.wrap(true) ...bad argument...
|
||||
- coroutine.wrap(<table>) ...bad argument...
|
||||
- coroutine.wrap(<thread>) ...bad argument...
|
||||
====== coroutine.yield ======
|
||||
status suspended
|
||||
true
|
||||
status suspended
|
||||
yield abc 1.25
|
||||
true abc 1.25 true
|
||||
status suspended
|
||||
yield abc 1.25
|
||||
false error within coroutine thread
|
||||
status dead
|
||||
452
luaj-test/src/test/resources/errors/debuglibargs.out
Normal file
452
luaj-test/src/test/resources/errors/debuglibargs.out
Normal file
@@ -0,0 +1,452 @@
|
||||
====== debug.debug - no tests ======
|
||||
====== debug.gethook ======
|
||||
--- checkallpass
|
||||
- debug.gethook() nil,'',0
|
||||
====== debug.getinfo ======
|
||||
--- checkallpass
|
||||
- debug.getinfo(<function>) <table>
|
||||
- debug.getinfo(25)
|
||||
- debug.getinfo('25')
|
||||
--- checkallpass
|
||||
- debug.getinfo(<function>) <table>
|
||||
- debug.getinfo(25)
|
||||
- debug.getinfo('25')
|
||||
--- checkallpass
|
||||
- debug.getinfo(<function>,'') <table>
|
||||
- debug.getinfo(25,'')
|
||||
- debug.getinfo('25','')
|
||||
- debug.getinfo(<function>,'n') <table>
|
||||
- debug.getinfo(25,'n')
|
||||
- debug.getinfo('25','n')
|
||||
- debug.getinfo(<function>,'flnStu') <table>
|
||||
- debug.getinfo(25,'flnStu')
|
||||
- debug.getinfo('25','flnStu')
|
||||
--- checkallpass
|
||||
fail debug.getinfo('') 'bad argument #1 to 'debug.getinfo' (function or level expected)'
|
||||
fail debug.getinfo('n') 'bad argument #1 to 'debug.getinfo' (function or level expected)'
|
||||
fail debug.getinfo('flnStu') 'bad argument #1 to 'debug.getinfo' (function or level expected)'
|
||||
--- checkallerrors
|
||||
- debug.getinfo() ...function or level...
|
||||
--- checkallerrors
|
||||
- debug.getinfo(nil) ...function or level...
|
||||
- debug.getinfo('abc') ...function or level...
|
||||
- debug.getinfo(true) ...function or level...
|
||||
- debug.getinfo(<thread>) ...function or level...
|
||||
--- checkallerrors
|
||||
- debug.getinfo(<function>,true) ...string expected...
|
||||
- debug.getinfo(<function>,<table>) ...string expected...
|
||||
- debug.getinfo(<function>,<function>) ...string expected...
|
||||
- debug.getinfo(<function>,<thread>) ...string expected...
|
||||
--- checkallerrors
|
||||
- debug.getinfo(nil,<function>) ...string expected...
|
||||
- debug.getinfo('abc',<function>) ...string expected...
|
||||
- debug.getinfo(true,<function>) ...string expected...
|
||||
--- checkallerrors
|
||||
- debug.getinfo('abc',<function>,'abc') ...string expected...
|
||||
- debug.getinfo(1.25,<function>,'abc') ...string expected...
|
||||
- debug.getinfo(true,<function>,'abc') ...string expected...
|
||||
- debug.getinfo(<table>,<function>,'abc') ...string expected...
|
||||
- debug.getinfo(<function>,<function>,'abc') ...string expected...
|
||||
--- checkallerrors
|
||||
badmsg debug.getinfo('qzQZ') template='invalid option' actual='bad argument #1 to 'debug.getinfo' (function or level expected)'
|
||||
====== debug.getlocal ======
|
||||
f: x,y,a,b,p,q 1 2 nil nil p q
|
||||
--- checkallpass
|
||||
- debug.getlocal(<function>,1) 'x'
|
||||
- debug.getlocal(1,1) '(*temporary)'
|
||||
- debug.getlocal(<function>,'2') 'y'
|
||||
- debug.getlocal(1,'2')
|
||||
--- checkallpass
|
||||
- debug.getlocal(<thread>,<function>,1) 'x'
|
||||
--- checkallerrors
|
||||
- debug.getlocal() ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.getlocal(<function>,nil) ...number expected...
|
||||
- debug.getlocal(25,nil) ...number expected...
|
||||
- debug.getlocal('25',nil) ...number expected...
|
||||
- debug.getlocal(<function>,'abc') ...number expected...
|
||||
- debug.getlocal(25,'abc') ...number expected...
|
||||
- debug.getlocal('25','abc') ...number expected...
|
||||
- debug.getlocal(<function>,true) ...number expected...
|
||||
- debug.getlocal(25,true) ...number expected...
|
||||
- debug.getlocal('25',true) ...number expected...
|
||||
- debug.getlocal(<function>,<table>) ...number expected...
|
||||
- debug.getlocal(25,<table>) ...number expected...
|
||||
- debug.getlocal('25',<table>) ...number expected...
|
||||
- debug.getlocal(<function>,<function>) ...number expected...
|
||||
- debug.getlocal(25,<function>) ...number expected...
|
||||
- debug.getlocal('25',<function>) ...number expected...
|
||||
- debug.getlocal(<function>,<thread>) ...number expected...
|
||||
- debug.getlocal(25,<thread>) ...number expected...
|
||||
- debug.getlocal('25',<thread>) ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.getlocal(nil,1.25) ...number expected...
|
||||
- debug.getlocal('abc',1.25) ...number expected...
|
||||
- debug.getlocal(true,1.25) ...number expected...
|
||||
- debug.getlocal(<thread>,1.25) ...number expected...
|
||||
- debug.getlocal(nil,'789') ...number expected...
|
||||
- debug.getlocal('abc','789') ...number expected...
|
||||
- debug.getlocal(true,'789') ...number expected...
|
||||
- debug.getlocal(<thread>,'789') ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.getlocal(<thread>,<function>) ...got no value...
|
||||
- debug.getlocal(<thread>,25) ...got no value...
|
||||
- debug.getlocal(<thread>,'25') ...got no value...
|
||||
--- checkallerrors
|
||||
- debug.getlocal('abc',<function>,1) ...number expected...
|
||||
- debug.getlocal(1.25,<function>,1) ...number expected...
|
||||
- debug.getlocal(true,<function>,1) ...number expected...
|
||||
- debug.getlocal(<table>,<function>,1) ...number expected...
|
||||
- debug.getlocal(<function>,<function>,1) ...number expected...
|
||||
- debug.getlocal('abc',<function>,'2') ...number expected...
|
||||
- debug.getlocal(1.25,<function>,'2') ...number expected...
|
||||
- debug.getlocal(true,<function>,'2') ...number expected...
|
||||
- debug.getlocal(<table>,<function>,'2') ...number expected...
|
||||
- debug.getlocal(<function>,<function>,'2') ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.getlocal(<thread>,100,1) ...level out of range...
|
||||
====== debug.getmetatable ======
|
||||
--- checkallpass
|
||||
- debug.getmetatable(nil)
|
||||
- debug.getmetatable('abc') <table>
|
||||
- debug.getmetatable(1.25)
|
||||
- debug.getmetatable(true)
|
||||
- debug.getmetatable(<table>)
|
||||
- debug.getmetatable(<function>)
|
||||
- debug.getmetatable(<thread>)
|
||||
--- checkallerrors
|
||||
- debug.getmetatable() ...value expected...
|
||||
====== debug.getregistry ======
|
||||
--- checkallpass
|
||||
- debug.getregistry() <table>
|
||||
--- checkallpass
|
||||
- debug.getregistry(nil) <table>
|
||||
- debug.getregistry('abc') <table>
|
||||
- debug.getregistry(1.25) <table>
|
||||
- debug.getregistry(true) <table>
|
||||
- debug.getregistry(<table>) <table>
|
||||
- debug.getregistry(<function>) <table>
|
||||
- debug.getregistry(<thread>) <table>
|
||||
====== debug.getupvalue ======
|
||||
--- checkallpass
|
||||
- debug.getupvalue(<function>,1) '_ENV',<table>
|
||||
- debug.getupvalue(<function>,'2') 'p','p'
|
||||
--- checkallerrors
|
||||
- debug.getupvalue() ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.getupvalue(nil,1) ...function expected...
|
||||
- debug.getupvalue('abc',1) ...function expected...
|
||||
- debug.getupvalue(1.25,1) ...function expected...
|
||||
- debug.getupvalue(true,1) ...function expected...
|
||||
- debug.getupvalue(<table>,1) ...function expected...
|
||||
- debug.getupvalue(<thread>,1) ...function expected...
|
||||
- debug.getupvalue(nil,'2') ...function expected...
|
||||
- debug.getupvalue('abc','2') ...function expected...
|
||||
- debug.getupvalue(1.25,'2') ...function expected...
|
||||
- debug.getupvalue(true,'2') ...function expected...
|
||||
- debug.getupvalue(<table>,'2') ...function expected...
|
||||
- debug.getupvalue(<thread>,'2') ...function expected...
|
||||
--- checkallerrors
|
||||
- debug.getupvalue(<function>,nil) ...number expected...
|
||||
- debug.getupvalue(<function>,'abc') ...number expected...
|
||||
- debug.getupvalue(<function>,true) ...number expected...
|
||||
- debug.getupvalue(<function>,<table>) ...number expected...
|
||||
- debug.getupvalue(<function>,<function>) ...number expected...
|
||||
- debug.getupvalue(<function>,<thread>) ...number expected...
|
||||
--- checkallpass
|
||||
- debug.getuservalue()
|
||||
--- checkallpass
|
||||
- debug.getuservalue(nil)
|
||||
- debug.getuservalue('abc')
|
||||
- debug.getuservalue(1.25)
|
||||
- debug.getuservalue(true)
|
||||
- debug.getuservalue(<table>)
|
||||
- debug.getuservalue(<function>)
|
||||
- debug.getuservalue(<thread>)
|
||||
--- checkallpass
|
||||
- debug.sethook()
|
||||
--- checkallpass
|
||||
--- checkallpass
|
||||
- debug.sethook(<function>,'cr')
|
||||
- debug.sethook(<function>,'l')
|
||||
--- checkallpass
|
||||
- debug.sethook(nil,<function>,'cr')
|
||||
- debug.sethook(<thread>,<function>,'cr')
|
||||
- debug.sethook(nil,<function>,'l')
|
||||
- debug.sethook(<thread>,<function>,'l')
|
||||
--- checkallerrors
|
||||
- debug.sethook('abc') ...string expected...
|
||||
- debug.sethook(<function>) ...string expected...
|
||||
- debug.sethook(true) ...string expected...
|
||||
--- checkallerrors
|
||||
- debug.sethook('abc',nil,'cr') ...string expected...
|
||||
- debug.sethook(<function>,nil,'cr') ...string expected...
|
||||
- debug.sethook(true,nil,'cr') ...string expected...
|
||||
- debug.sethook('abc',<function>,'cr') ...string expected...
|
||||
- debug.sethook(<function>,<function>,'cr') ...string expected...
|
||||
- debug.sethook(true,<function>,'cr') ...string expected...
|
||||
- debug.sethook('abc',nil,'l') ...string expected...
|
||||
- debug.sethook(<function>,nil,'l') ...string expected...
|
||||
- debug.sethook(true,nil,'l') ...string expected...
|
||||
- debug.sethook('abc',<function>,'l') ...string expected...
|
||||
- debug.sethook(<function>,<function>,'l') ...string expected...
|
||||
- debug.sethook(true,<function>,'l') ...string expected...
|
||||
====== debug.setlocal ======
|
||||
f: x,y,a,b,p,q 1 2 nil nil p q
|
||||
--- checkallpass
|
||||
- debug.setlocal(1,1,nil) '(*temporary)'
|
||||
- debug.setlocal(1,1,'foo') '(*temporary)'
|
||||
f: x,y,a,b,p,q 1 2 1 2 p q
|
||||
--- checkallpass
|
||||
- debug.setlocal(<thread>,1,2,nil)
|
||||
- debug.setlocal(<thread>,1,2,'bar')
|
||||
f: x,y,a,b,p,q 1 2 1 2 p q
|
||||
--- checkallerrors
|
||||
- debug.setlocal() ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(1) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(1,1) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(<thread>,1,2) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(<table>,1) ...number expected...
|
||||
- debug.setlocal('abc',1) ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(1,'abc') ...value expected...
|
||||
- debug.setlocal(1,true) ...value expected...
|
||||
- debug.setlocal(1,<table>) ...value expected...
|
||||
- debug.setlocal(1,<function>) ...value expected...
|
||||
- debug.setlocal(1,<thread>) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(<table>,1,1,nil) ...number expected...
|
||||
- debug.setlocal('abc',1,1,nil) ...number expected...
|
||||
- debug.setlocal(<table>,1,1,'foo') ...number expected...
|
||||
- debug.setlocal('abc',1,1,'foo') ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.setlocal(10,1,'foo') ...level out of range...
|
||||
====== debug.setmetatable ======
|
||||
--- checkallpass
|
||||
- debug.setmetatable(nil,<table>)
|
||||
- debug.setmetatable('abc',<table>) 'abc'
|
||||
- debug.setmetatable(1.25,<table>) 1.25
|
||||
- debug.setmetatable(true,<table>) true
|
||||
- debug.setmetatable(<table>,<table>) <table>
|
||||
- debug.setmetatable(<function>,<table>) <function>
|
||||
- debug.setmetatable(<thread>,<table>) <thread>
|
||||
- debug.setmetatable(nil,nil)
|
||||
- debug.setmetatable('abc',nil) 'abc'
|
||||
- debug.setmetatable(1.25,nil) 1.25
|
||||
- debug.setmetatable(true,nil) true
|
||||
- debug.setmetatable(<table>,nil) <table>
|
||||
- debug.setmetatable(<function>,nil) <function>
|
||||
- debug.setmetatable(<thread>,nil) <thread>
|
||||
--- checkallerrors
|
||||
- debug.setmetatable() ...nil or table...
|
||||
--- checkallerrors
|
||||
- debug.setmetatable(nil) ...nil or table...
|
||||
- debug.setmetatable('abc') ...nil or table...
|
||||
- debug.setmetatable(1.25) ...nil or table...
|
||||
- debug.setmetatable(true) ...nil or table...
|
||||
- debug.setmetatable(<table>) ...nil or table...
|
||||
- debug.setmetatable(<function>) ...nil or table...
|
||||
- debug.setmetatable(<thread>) ...nil or table...
|
||||
====== debug.setupvalue ======
|
||||
--- checkallpass
|
||||
- debug.setupvalue(<function>,2,nil) 'p'
|
||||
- debug.setupvalue(<function>,'3',nil) 'q'
|
||||
- debug.setupvalue(<function>,2,true) 'p'
|
||||
- debug.setupvalue(<function>,'3',true) 'q'
|
||||
- debug.setupvalue(<function>,2,'abc') 'p'
|
||||
- debug.setupvalue(<function>,'3','abc') 'q'
|
||||
p,q abc abc
|
||||
--- checkallerrors
|
||||
- debug.setupvalue() ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setupvalue(<function>) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setupvalue(<function>,2) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setupvalue(nil,2) ...value expected...
|
||||
- debug.setupvalue('abc',2) ...value expected...
|
||||
- debug.setupvalue(1.25,2) ...value expected...
|
||||
- debug.setupvalue(true,2) ...value expected...
|
||||
- debug.setupvalue(<table>,2) ...value expected...
|
||||
- debug.setupvalue(<thread>,2) ...value expected...
|
||||
--- checkallerrors
|
||||
- debug.setupvalue(<function>,nil) ...value expected...
|
||||
- debug.setupvalue(<function>,'abc') ...value expected...
|
||||
- debug.setupvalue(<function>,true) ...value expected...
|
||||
- debug.setupvalue(<function>,<table>) ...value expected...
|
||||
- debug.setupvalue(<function>,<function>) ...value expected...
|
||||
- debug.setupvalue(<function>,<thread>) ...value expected...
|
||||
====== debug.setuservalue ======
|
||||
--- checkallerrors
|
||||
- debug.setuservalue() ...userdata expected...
|
||||
--- checkallerrors
|
||||
- debug.setuservalue(nil) ...userdata expected...
|
||||
- debug.setuservalue('abc') ...userdata expected...
|
||||
- debug.setuservalue(1.25) ...userdata expected...
|
||||
- debug.setuservalue(true) ...userdata expected...
|
||||
- debug.setuservalue(<table>) ...userdata expected...
|
||||
- debug.setuservalue(<function>) ...userdata expected...
|
||||
- debug.setuservalue(<thread>) ...userdata expected...
|
||||
--- checkallerrors
|
||||
- debug.setuservalue(nil,'abc') ...userdata expected...
|
||||
- debug.setuservalue('abc','abc') ...userdata expected...
|
||||
- debug.setuservalue(1.25,'abc') ...userdata expected...
|
||||
- debug.setuservalue(true,'abc') ...userdata expected...
|
||||
- debug.setuservalue(<table>,'abc') ...userdata expected...
|
||||
- debug.setuservalue(<function>,'abc') ...userdata expected...
|
||||
- debug.setuservalue(<thread>,'abc') ...userdata expected...
|
||||
- debug.setuservalue(nil,1.25) ...userdata expected...
|
||||
- debug.setuservalue('abc',1.25) ...userdata expected...
|
||||
- debug.setuservalue(1.25,1.25) ...userdata expected...
|
||||
- debug.setuservalue(true,1.25) ...userdata expected...
|
||||
- debug.setuservalue(<table>,1.25) ...userdata expected...
|
||||
- debug.setuservalue(<function>,1.25) ...userdata expected...
|
||||
- debug.setuservalue(<thread>,1.25) ...userdata expected...
|
||||
====== debug.traceback ======
|
||||
--- checkallpass
|
||||
- debug.traceback() 'stack traceback:
|
||||
[C]: in function 'pcall'
|
||||
args.lua:143: in function 'invoke'
|
||||
args.lua:167: in function 'checkallpass'
|
||||
debuglibargs.lua:127: in main chunk
|
||||
[C]: in ?'
|
||||
--- checkallpass
|
||||
- debug.traceback('abc') 'abc
|
||||
stack traceback:
|
||||
[C]: in function 'pcall'
|
||||
args.lua:143: in function 'invoke'
|
||||
args.lua:167: in function 'checkallpass'
|
||||
debuglibargs.lua:128: in main chunk
|
||||
[C]: in ?'
|
||||
--- checkallpass
|
||||
- debug.traceback('abc',1.25) 'abc
|
||||
stack traceback:
|
||||
[C]: in function 'pcall'
|
||||
args.lua:143: in function 'invoke'
|
||||
args.lua:167: in function 'checkallpass'
|
||||
debuglibargs.lua:129: in main chunk
|
||||
[C]: in ?'
|
||||
--- checkallpass
|
||||
- debug.traceback(<thread>) 'stack traceback:
|
||||
[C]: in function 'pcall'
|
||||
args.lua:143: in function 'invoke'
|
||||
args.lua:167: in function 'checkallpass'
|
||||
debuglibargs.lua:130: in main chunk
|
||||
[C]: in ?'
|
||||
--- checkallpass
|
||||
- debug.traceback(<thread>,'abc') 'abc
|
||||
stack traceback:
|
||||
[C]: in function 'pcall'
|
||||
args.lua:143: in function 'invoke'
|
||||
args.lua:167: in function 'checkallpass'
|
||||
debuglibargs.lua:131: in main chunk
|
||||
[C]: in ?'
|
||||
--- checkallpass
|
||||
- debug.traceback(<thread>,'abc',1.25) 'abc
|
||||
stack traceback:
|
||||
[C]: in function 'pcall'
|
||||
args.lua:143: in function 'invoke'
|
||||
args.lua:167: in function 'checkallpass'
|
||||
debuglibargs.lua:132: in main chunk
|
||||
[C]: in ?'
|
||||
--- checkallpass
|
||||
- debug.traceback(<function>) <function>
|
||||
- debug.traceback(true) true
|
||||
- debug.traceback(<table>) <table>
|
||||
--- checkallpass
|
||||
- debug.traceback(<function>,nil) <function>
|
||||
- debug.traceback(true,nil) true
|
||||
- debug.traceback(<table>,nil) <table>
|
||||
- debug.traceback(<function>,'abc') <function>
|
||||
- debug.traceback(true,'abc') true
|
||||
- debug.traceback(<table>,'abc') <table>
|
||||
- debug.traceback(<function>,true) <function>
|
||||
- debug.traceback(true,true) true
|
||||
- debug.traceback(<table>,true) <table>
|
||||
- debug.traceback(<function>,<table>) <function>
|
||||
- debug.traceback(true,<table>) true
|
||||
- debug.traceback(<table>,<table>) <table>
|
||||
- debug.traceback(<function>,<function>) <function>
|
||||
- debug.traceback(true,<function>) true
|
||||
- debug.traceback(<table>,<function>) <table>
|
||||
- debug.traceback(<function>,<thread>) <function>
|
||||
- debug.traceback(true,<thread>) true
|
||||
- debug.traceback(<table>,<thread>) <table>
|
||||
====== debug.upvalueid ======
|
||||
--- checkallpass
|
||||
- debug.upvalueid(<function>,1) <userdata>
|
||||
- debug.upvalueid(<function>,'2') <userdata>
|
||||
--- checkallerrors
|
||||
- debug.upvalueid() ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.upvalueid(nil,1) ...function expected...
|
||||
- debug.upvalueid('abc',1) ...function expected...
|
||||
- debug.upvalueid(1.25,1) ...function expected...
|
||||
- debug.upvalueid(true,1) ...function expected...
|
||||
- debug.upvalueid(<table>,1) ...function expected...
|
||||
- debug.upvalueid(<thread>,1) ...function expected...
|
||||
- debug.upvalueid(nil,'2') ...function expected...
|
||||
- debug.upvalueid('abc','2') ...function expected...
|
||||
- debug.upvalueid(1.25,'2') ...function expected...
|
||||
- debug.upvalueid(true,'2') ...function expected...
|
||||
- debug.upvalueid(<table>,'2') ...function expected...
|
||||
- debug.upvalueid(<thread>,'2') ...function expected...
|
||||
--- checkallerrors
|
||||
- debug.upvalueid(<function>,nil) ...number expected...
|
||||
- debug.upvalueid(<function>,'abc') ...number expected...
|
||||
- debug.upvalueid(<function>,true) ...number expected...
|
||||
- debug.upvalueid(<function>,<table>) ...number expected...
|
||||
- debug.upvalueid(<function>,<function>) ...number expected...
|
||||
- debug.upvalueid(<function>,<thread>) ...number expected...
|
||||
====== debug.upvaluejoin ======
|
||||
--- checkallpass
|
||||
- debug.upvaluejoin(<function>,1,<function>,1)
|
||||
- debug.upvaluejoin(<function>,'2',<function>,1)
|
||||
- debug.upvaluejoin(<function>,1,<function>,'2')
|
||||
- debug.upvaluejoin(<function>,'2',<function>,'2')
|
||||
--- checkallerrors
|
||||
- debug.upvaluejoin() ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.upvaluejoin(nil,1) ...function expected...
|
||||
- debug.upvaluejoin('abc',1) ...function expected...
|
||||
- debug.upvaluejoin(1.25,1) ...function expected...
|
||||
- debug.upvaluejoin(true,1) ...function expected...
|
||||
- debug.upvaluejoin(<table>,1) ...function expected...
|
||||
- debug.upvaluejoin(<thread>,1) ...function expected...
|
||||
- debug.upvaluejoin(nil,'2') ...function expected...
|
||||
- debug.upvaluejoin('abc','2') ...function expected...
|
||||
- debug.upvaluejoin(1.25,'2') ...function expected...
|
||||
- debug.upvaluejoin(true,'2') ...function expected...
|
||||
- debug.upvaluejoin(<table>,'2') ...function expected...
|
||||
- debug.upvaluejoin(<thread>,'2') ...function expected...
|
||||
--- checkallerrors
|
||||
- debug.upvaluejoin(<function>,nil) ...number expected...
|
||||
- debug.upvaluejoin(<function>,'abc') ...number expected...
|
||||
- debug.upvaluejoin(<function>,true) ...number expected...
|
||||
- debug.upvaluejoin(<function>,<table>) ...number expected...
|
||||
- debug.upvaluejoin(<function>,<function>) ...number expected...
|
||||
- debug.upvaluejoin(<function>,<thread>) ...number expected...
|
||||
--- checkallerrors
|
||||
- debug.upvaluejoin(<function>,1,nil,1) ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,'abc',1) ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,1.25,1) ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,true,1) ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,<table>,1) ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,<thread>,1) ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,nil,'2') ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,'abc','2') ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,1.25,'2') ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,true,'2') ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,<table>,'2') ...function expected...
|
||||
- debug.upvaluejoin(<function>,1,<thread>,'2') ...function expected...
|
||||
--- checkallerrors
|
||||
- debug.upvaluejoin(<function>,1,<function>,nil) ...number expected...
|
||||
- debug.upvaluejoin(<function>,1,<function>,'abc') ...number expected...
|
||||
- debug.upvaluejoin(<function>,1,<function>,true) ...number expected...
|
||||
- debug.upvaluejoin(<function>,1,<function>,<table>) ...number expected...
|
||||
- debug.upvaluejoin(<function>,1,<function>,<function>) ...number expected...
|
||||
- debug.upvaluejoin(<function>,1,<function>,<thread>) ...number expected...
|
||||
202
luaj-test/src/test/resources/errors/iolibargs.out
Normal file
202
luaj-test/src/test/resources/errors/iolibargs.out
Normal file
@@ -0,0 +1,202 @@
|
||||
====== io.close ======
|
||||
--- checkallpass
|
||||
- io.close(<userdata>) true
|
||||
--- checkallerrors
|
||||
- io.close('abc') ...bad argument...
|
||||
- io.close(1.25) ...bad argument...
|
||||
- io.close(true) ...bad argument...
|
||||
- io.close(<table>) ...bad argument...
|
||||
- io.close(<function>) ...bad argument...
|
||||
- io.close(<thread>) ...bad argument...
|
||||
====== io.input ======
|
||||
--- checkallpass
|
||||
- io.input(nil) <userdata>
|
||||
- io.input(<userdata>) <userdata>
|
||||
- io.input('abc.txt') <userdata>
|
||||
--- checkallerrors
|
||||
- io.input(true) ...bad argument...
|
||||
- io.input(<table>) ...bad argument...
|
||||
- io.input(<function>) ...bad argument...
|
||||
- io.input(<thread>) ...bad argument...
|
||||
====== io.lines ======
|
||||
--- checkallpass
|
||||
- io.lines('abc.txt') <function>
|
||||
--- checkallerrors
|
||||
- io.lines(<userdata>) ...bad argument...
|
||||
--- checkallerrors
|
||||
needcheck io.lines(nil) function: 0x100112cf0
|
||||
- io.lines(true) ...bad argument...
|
||||
- io.lines(<table>) ...bad argument...
|
||||
- io.lines(<function>) ...bad argument...
|
||||
- io.lines(<thread>) ...bad argument...
|
||||
====== io.open ======
|
||||
--- checkallpass
|
||||
- io.open('abc.txt',nil) <userdata>
|
||||
- io.open('abc.txt','r') <userdata>
|
||||
- io.open('abc.txt','w') <userdata>
|
||||
- io.open('abc.txt','a') <userdata>
|
||||
- io.open('abc.txt','r+') <userdata>
|
||||
- io.open('abc.txt','w+') <userdata>
|
||||
- io.open('abc.txt','a+') <userdata>
|
||||
--- checkallerrors
|
||||
- io.open(nil) ...bad argument...
|
||||
- io.open(true) ...bad argument...
|
||||
- io.open(<table>) ...bad argument...
|
||||
- io.open(<function>) ...bad argument...
|
||||
- io.open(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- io.open('abc.txt',<table>) ...bad argument...
|
||||
====== io.output ======
|
||||
--- checkallpass
|
||||
- io.output(nil) <userdata>
|
||||
- io.output(<userdata>) <userdata>
|
||||
- io.output('abc.txt') <userdata>
|
||||
--- checkallerrors
|
||||
- io.output(true) ...bad argument...
|
||||
- io.output(<table>) ...bad argument...
|
||||
- io.output(<function>) ...bad argument...
|
||||
- io.output(<thread>) ...bad argument...
|
||||
====== io.popen ======
|
||||
--- checkallerrors
|
||||
- io.popen(nil) ...bad argument...
|
||||
- io.popen(true) ...bad argument...
|
||||
- io.popen(<table>) ...bad argument...
|
||||
- io.popen(<function>) ...bad argument...
|
||||
- io.popen(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- io.popen('hostname',<table>) ...bad argument...
|
||||
====== io.read ======
|
||||
--- checkallpass
|
||||
- io.read()
|
||||
--- checkallpass
|
||||
- io.read(2)
|
||||
- io.read('*n')
|
||||
- io.read('*a') ''
|
||||
- io.read('*l')
|
||||
--- checkallpass
|
||||
- io.read(2,2)
|
||||
- io.read('*n',2)
|
||||
- io.read('*a',2) ''
|
||||
- io.read('*l',2)
|
||||
- io.read(2,'*a')
|
||||
- io.read('*n','*a')
|
||||
- io.read('*a','*a') '',''
|
||||
- io.read('*l','*a')
|
||||
- io.read(2,'*l')
|
||||
- io.read('*n','*l')
|
||||
- io.read('*a','*l') ''
|
||||
- io.read('*l','*l')
|
||||
--- checkallerrors
|
||||
- io.read(true) ...bad argument...
|
||||
- io.read(<function>) ...bad argument...
|
||||
- io.read(<table>) ...bad argument...
|
||||
- io.read('3') ...bad argument...
|
||||
====== io.write ======
|
||||
--- checkallpass
|
||||
- io.write() <userdata>
|
||||
--- checkallpass
|
||||
- io.write('abc') <userdata>
|
||||
- io.write(1.25) <userdata>
|
||||
--- checkallpass
|
||||
- io.write('abc','abc') <userdata>
|
||||
- io.write(1.25,'abc') <userdata>
|
||||
- io.write('abc',1.25) <userdata>
|
||||
- io.write(1.25,1.25) <userdata>
|
||||
--- checkallerrors
|
||||
- io.write(true) ...bad argument...
|
||||
- io.write(<table>) ...bad argument...
|
||||
- io.write(<function>) ...bad argument...
|
||||
- io.write(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- io.write('abc',true) ...bad argument...
|
||||
- io.write(1.25,true) ...bad argument...
|
||||
- io.write('abc',<table>) ...bad argument...
|
||||
- io.write(1.25,<table>) ...bad argument...
|
||||
- io.write('abc',<function>) ...bad argument...
|
||||
- io.write(1.25,<function>) ...bad argument...
|
||||
- io.write('abc',<thread>) ...bad argument...
|
||||
- io.write(1.25,<thread>) ...bad argument...
|
||||
====== file:write ======
|
||||
--- checkallpass
|
||||
- file.write(<userdata>,'abc') <userdata>
|
||||
- file.write(<userdata>,1.25) <userdata>
|
||||
--- checkallpass
|
||||
- file.write(<userdata>,'abc','abc') <userdata>
|
||||
- file.write(<userdata>,1.25,'abc') <userdata>
|
||||
- file.write(<userdata>,'abc',1.25) <userdata>
|
||||
- file.write(<userdata>,1.25,1.25) <userdata>
|
||||
--- checkallerrors
|
||||
- file.write() ...bad argument...
|
||||
--- checkallerrors
|
||||
- file.write(<userdata>,true) ...bad argument...
|
||||
- file.write(<userdata>,<table>) ...bad argument...
|
||||
- file.write(<userdata>,<function>) ...bad argument...
|
||||
- file.write(<userdata>,<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- file.write(<userdata>,'abc',true) ...bad argument...
|
||||
- file.write(<userdata>,1.25,true) ...bad argument...
|
||||
- file.write(<userdata>,'abc',<table>) ...bad argument...
|
||||
- file.write(<userdata>,1.25,<table>) ...bad argument...
|
||||
- file.write(<userdata>,'abc',<function>) ...bad argument...
|
||||
- file.write(<userdata>,1.25,<function>) ...bad argument...
|
||||
- file.write(<userdata>,'abc',<thread>) ...bad argument...
|
||||
- file.write(<userdata>,1.25,<thread>) ...bad argument...
|
||||
====== file:seek ======
|
||||
--- checkallpass
|
||||
- file.seek(<userdata>) 0
|
||||
--- checkallpass
|
||||
- file.seek(<userdata>,'set') 0
|
||||
- file.seek(<userdata>,'cur') 0
|
||||
- file.seek(<userdata>,'end') 63
|
||||
--- checkallpass
|
||||
- file.seek(<userdata>,'set',2) 2
|
||||
- file.seek(<userdata>,'cur',2) 4
|
||||
- file.seek(<userdata>,'end',2) 65
|
||||
- file.seek(<userdata>,'set','3') 3
|
||||
- file.seek(<userdata>,'cur','3') 6
|
||||
- file.seek(<userdata>,'end','3') 66
|
||||
--- checkallerrors
|
||||
- file.seek() ...bad argument...
|
||||
--- checkallerrors
|
||||
- file.seek(<userdata>,true) ...bad argument...
|
||||
- file.seek(<userdata>,<table>) ...bad argument...
|
||||
- file.seek(<userdata>,<function>) ...bad argument...
|
||||
- file.seek(<userdata>,<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- file.seek(<userdata>,'set','abc') ...bad argument...
|
||||
- file.seek(<userdata>,'cur','abc') ...bad argument...
|
||||
- file.seek(<userdata>,'end','abc') ...bad argument...
|
||||
- file.seek(<userdata>,'set',true) ...bad argument...
|
||||
- file.seek(<userdata>,'cur',true) ...bad argument...
|
||||
- file.seek(<userdata>,'end',true) ...bad argument...
|
||||
- file.seek(<userdata>,'set',<table>) ...bad argument...
|
||||
- file.seek(<userdata>,'cur',<table>) ...bad argument...
|
||||
- file.seek(<userdata>,'end',<table>) ...bad argument...
|
||||
- file.seek(<userdata>,'set',<function>) ...bad argument...
|
||||
- file.seek(<userdata>,'cur',<function>) ...bad argument...
|
||||
- file.seek(<userdata>,'end',<function>) ...bad argument...
|
||||
- file.seek(<userdata>,'set',<thread>) ...bad argument...
|
||||
- file.seek(<userdata>,'cur',<thread>) ...bad argument...
|
||||
- file.seek(<userdata>,'end',<thread>) ...bad argument...
|
||||
====== file:setvbuf ======
|
||||
--- checkallpass
|
||||
- file.setvbuf(<userdata>,'no') true
|
||||
- file.setvbuf(<userdata>,'full') true
|
||||
- file.setvbuf(<userdata>,'line') true
|
||||
--- checkallpass
|
||||
- file.setvbuf(<userdata>,'full',1024) true
|
||||
- file.setvbuf(<userdata>,'full','512') true
|
||||
--- checkallerrors
|
||||
- file.setvbuf() ...bad argument...
|
||||
--- checkallerrors
|
||||
- file.setvbuf(<userdata>,nil) ...bad argument...
|
||||
- file.setvbuf(<userdata>,true) ...bad argument...
|
||||
- file.setvbuf(<userdata>,<table>) ...bad argument...
|
||||
- file.setvbuf(<userdata>,<function>) ...bad argument...
|
||||
- file.setvbuf(<userdata>,<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- file.setvbuf(<userdata>,'full','abc') ...bad argument...
|
||||
- file.setvbuf(<userdata>,'full',true) ...bad argument...
|
||||
- file.setvbuf(<userdata>,'full',<table>) ...bad argument...
|
||||
- file.setvbuf(<userdata>,'full',<function>) ...bad argument...
|
||||
- file.setvbuf(<userdata>,'full',<thread>) ...bad argument...
|
||||
750
luaj-test/src/test/resources/errors/mathlibargs.out
Normal file
750
luaj-test/src/test/resources/errors/mathlibargs.out
Normal file
@@ -0,0 +1,750 @@
|
||||
====== math.abs ======
|
||||
--- checkallpass
|
||||
- math.abs(1) 1
|
||||
- math.abs(0.75) 0.75
|
||||
- math.abs('-1') 1
|
||||
- math.abs('-0.25') 0.25
|
||||
--- checkallerrors
|
||||
- math.abs(nil) ...bad argument...
|
||||
- math.abs('abc') ...bad argument...
|
||||
- math.abs(true) ...bad argument...
|
||||
- math.abs(<function>) ...bad argument...
|
||||
- math.abs(<table>) ...bad argument...
|
||||
- math.abs(<thread>) ...bad argument...
|
||||
====== math.acos ======
|
||||
--- checkallpass
|
||||
- math.acos(1) 0
|
||||
- math.acos(0.75) 0.722...
|
||||
- math.acos('-1') 3.141...
|
||||
- math.acos('-0.25') 1.823...
|
||||
--- checkallerrors
|
||||
- math.acos(nil) ...bad argument...
|
||||
- math.acos('abc') ...bad argument...
|
||||
- math.acos(true) ...bad argument...
|
||||
- math.acos(<function>) ...bad argument...
|
||||
- math.acos(<table>) ...bad argument...
|
||||
- math.acos(<thread>) ...bad argument...
|
||||
====== math.asin ======
|
||||
--- checkallpass
|
||||
- math.asin(1) 1.570...
|
||||
- math.asin(0.75) 0.848...
|
||||
- math.asin('-1') -1.57...
|
||||
- math.asin('-0.25') -0.25...
|
||||
--- checkallerrors
|
||||
- math.asin(nil) ...bad argument...
|
||||
- math.asin('abc') ...bad argument...
|
||||
- math.asin(true) ...bad argument...
|
||||
- math.asin(<function>) ...bad argument...
|
||||
- math.asin(<table>) ...bad argument...
|
||||
- math.asin(<thread>) ...bad argument...
|
||||
====== math.atan ======
|
||||
--- checkallpass
|
||||
- math.atan(1) 0.785...
|
||||
- math.atan(0.75) 0.643...
|
||||
- math.atan('-1') -0.78...
|
||||
- math.atan('-0.25') -0.24...
|
||||
--- checkallerrors
|
||||
- math.atan(nil) ...bad argument...
|
||||
- math.atan('abc') ...bad argument...
|
||||
- math.atan(true) ...bad argument...
|
||||
- math.atan(<function>) ...bad argument...
|
||||
- math.atan(<table>) ...bad argument...
|
||||
- math.atan(<thread>) ...bad argument...
|
||||
====== math.cos ======
|
||||
--- checkallpass
|
||||
- math.cos(1) 0.540...
|
||||
- math.cos(0.75) 0.731...
|
||||
- math.cos('-1') 0.540...
|
||||
- math.cos('-0.25') 0.968...
|
||||
--- checkallerrors
|
||||
- math.cos(nil) ...bad argument...
|
||||
- math.cos('abc') ...bad argument...
|
||||
- math.cos(true) ...bad argument...
|
||||
- math.cos(<function>) ...bad argument...
|
||||
- math.cos(<table>) ...bad argument...
|
||||
- math.cos(<thread>) ...bad argument...
|
||||
====== math.cosh ======
|
||||
--- checkallpass
|
||||
- math.cosh(1) 1.543...
|
||||
- math.cosh(0.75) 1.294...
|
||||
- math.cosh('-1') 1.543...
|
||||
- math.cosh('-0.25') 1.031...
|
||||
--- checkallerrors
|
||||
- math.cosh(nil) ...bad argument...
|
||||
- math.cosh('abc') ...bad argument...
|
||||
- math.cosh(true) ...bad argument...
|
||||
- math.cosh(<function>) ...bad argument...
|
||||
- math.cosh(<table>) ...bad argument...
|
||||
- math.cosh(<thread>) ...bad argument...
|
||||
====== math.deg ======
|
||||
--- checkallpass
|
||||
- math.deg(1) 57.29...
|
||||
- math.deg(0.75) 42.97...
|
||||
- math.deg('-1') -57.2...
|
||||
- math.deg('-0.25') -14.3...
|
||||
--- checkallerrors
|
||||
- math.deg(nil) ...bad argument...
|
||||
- math.deg('abc') ...bad argument...
|
||||
- math.deg(true) ...bad argument...
|
||||
- math.deg(<function>) ...bad argument...
|
||||
- math.deg(<table>) ...bad argument...
|
||||
- math.deg(<thread>) ...bad argument...
|
||||
====== math.exp ======
|
||||
--- checkallpass
|
||||
- math.exp(1) 2.718...
|
||||
- math.exp(0.75) 2.117...
|
||||
- math.exp('-1') 0.367...
|
||||
- math.exp('-0.25') 0.778...
|
||||
--- checkallerrors
|
||||
- math.exp(nil) ...bad argument...
|
||||
- math.exp('abc') ...bad argument...
|
||||
- math.exp(true) ...bad argument...
|
||||
- math.exp(<function>) ...bad argument...
|
||||
- math.exp(<table>) ...bad argument...
|
||||
- math.exp(<thread>) ...bad argument...
|
||||
====== math.floor ======
|
||||
--- checkallpass
|
||||
- math.floor(1) 1
|
||||
- math.floor(0.75) 0
|
||||
- math.floor('-1') -1
|
||||
- math.floor('-0.25') -1
|
||||
--- checkallerrors
|
||||
- math.floor(nil) ...bad argument...
|
||||
- math.floor('abc') ...bad argument...
|
||||
- math.floor(true) ...bad argument...
|
||||
- math.floor(<function>) ...bad argument...
|
||||
- math.floor(<table>) ...bad argument...
|
||||
- math.floor(<thread>) ...bad argument...
|
||||
====== math.rad ======
|
||||
--- checkallpass
|
||||
- math.rad(1) 0.017...
|
||||
- math.rad(0.75) 0.013...
|
||||
- math.rad('-1') -0.01...
|
||||
- math.rad('-0.25') -0.00...
|
||||
--- checkallerrors
|
||||
- math.rad(nil) ...bad argument...
|
||||
- math.rad('abc') ...bad argument...
|
||||
- math.rad(true) ...bad argument...
|
||||
- math.rad(<function>) ...bad argument...
|
||||
- math.rad(<table>) ...bad argument...
|
||||
- math.rad(<thread>) ...bad argument...
|
||||
====== math.randomseed ======
|
||||
--- checkallpass
|
||||
- math.randomseed(1)
|
||||
- math.randomseed(0.75)
|
||||
- math.randomseed('-1')
|
||||
- math.randomseed('-0.25')
|
||||
--- checkallerrors
|
||||
- math.randomseed(nil) ...bad argument...
|
||||
- math.randomseed('abc') ...bad argument...
|
||||
- math.randomseed(true) ...bad argument...
|
||||
- math.randomseed(<function>) ...bad argument...
|
||||
- math.randomseed(<table>) ...bad argument...
|
||||
- math.randomseed(<thread>) ...bad argument...
|
||||
====== math.sin ======
|
||||
--- checkallpass
|
||||
- math.sin(1) 0.841...
|
||||
- math.sin(0.75) 0.681...
|
||||
- math.sin('-1') -0.84...
|
||||
- math.sin('-0.25') -0.24...
|
||||
--- checkallerrors
|
||||
- math.sin(nil) ...bad argument...
|
||||
- math.sin('abc') ...bad argument...
|
||||
- math.sin(true) ...bad argument...
|
||||
- math.sin(<function>) ...bad argument...
|
||||
- math.sin(<table>) ...bad argument...
|
||||
- math.sin(<thread>) ...bad argument...
|
||||
====== math.sinh ======
|
||||
--- checkallpass
|
||||
- math.sinh(1) 1.175...
|
||||
- math.sinh(0.75) 0.822...
|
||||
- math.sinh('-1') -1.17...
|
||||
- math.sinh('-0.25') -0.25...
|
||||
--- checkallerrors
|
||||
- math.sinh(nil) ...bad argument...
|
||||
- math.sinh('abc') ...bad argument...
|
||||
- math.sinh(true) ...bad argument...
|
||||
- math.sinh(<function>) ...bad argument...
|
||||
- math.sinh(<table>) ...bad argument...
|
||||
- math.sinh(<thread>) ...bad argument...
|
||||
====== math.tan ======
|
||||
--- checkallpass
|
||||
- math.tan(1) 1.557...
|
||||
- math.tan(0.75) 0.931...
|
||||
- math.tan('-1') -1.55...
|
||||
- math.tan('-0.25') -0.25...
|
||||
--- checkallerrors
|
||||
- math.tan(nil) ...bad argument...
|
||||
- math.tan('abc') ...bad argument...
|
||||
- math.tan(true) ...bad argument...
|
||||
- math.tan(<function>) ...bad argument...
|
||||
- math.tan(<table>) ...bad argument...
|
||||
- math.tan(<thread>) ...bad argument...
|
||||
====== math.tanh ======
|
||||
--- checkallpass
|
||||
- math.tanh(1) 0.761...
|
||||
- math.tanh(0.75) 0.635...
|
||||
- math.tanh('-1') -0.76...
|
||||
- math.tanh('-0.25') -0.24...
|
||||
--- checkallerrors
|
||||
- math.tanh(nil) ...bad argument...
|
||||
- math.tanh('abc') ...bad argument...
|
||||
- math.tanh(true) ...bad argument...
|
||||
- math.tanh(<function>) ...bad argument...
|
||||
- math.tanh(<table>) ...bad argument...
|
||||
- math.tanh(<thread>) ...bad argument...
|
||||
====== math.frexp ======
|
||||
--- checkallpass
|
||||
- math.frexp(1) 0.5,1
|
||||
- math.frexp(0.75) 0.75,0
|
||||
- math.frexp('-1') -0.5,1
|
||||
- math.frexp('-0.25') -0.5,-1
|
||||
--- checkallerrors
|
||||
- math.frexp(nil) ...bad argument...
|
||||
- math.frexp('abc') ...bad argument...
|
||||
- math.frexp(true) ...bad argument...
|
||||
- math.frexp(<function>) ...bad argument...
|
||||
- math.frexp(<table>) ...bad argument...
|
||||
- math.frexp(<thread>) ...bad argument...
|
||||
====== math.log ======
|
||||
--- checkallpass
|
||||
- math.log(1) 0
|
||||
- math.log(0.75) -0.28...
|
||||
- math.log('2') 0.693...
|
||||
- math.log('2.5') 0.916...
|
||||
--- checkallerrors
|
||||
- math.log(nil) ...bad argument...
|
||||
- math.log('abc') ...bad argument...
|
||||
- math.log(true) ...bad argument...
|
||||
- math.log(<function>) ...bad argument...
|
||||
- math.log(<table>) ...bad argument...
|
||||
- math.log(<thread>) ...bad argument...
|
||||
====== math.sqrt ======
|
||||
--- checkallpass
|
||||
- math.sqrt(1) 1
|
||||
- math.sqrt(0.75) 0.866...
|
||||
- math.sqrt('2') 1.414...
|
||||
- math.sqrt('2.5') 1.581...
|
||||
--- checkallerrors
|
||||
- math.sqrt(nil) ...bad argument...
|
||||
- math.sqrt('abc') ...bad argument...
|
||||
- math.sqrt(true) ...bad argument...
|
||||
- math.sqrt(<function>) ...bad argument...
|
||||
- math.sqrt(<table>) ...bad argument...
|
||||
- math.sqrt(<thread>) ...bad argument...
|
||||
====== math.ceil ======
|
||||
--- checkallpass
|
||||
- math.ceil(1) 1
|
||||
- math.ceil(0.75) 1
|
||||
- math.ceil('2') 2
|
||||
- math.ceil('2.5') 3
|
||||
--- checkallerrors
|
||||
- math.ceil(nil) ...bad argument...
|
||||
- math.ceil('abc') ...bad argument...
|
||||
- math.ceil(true) ...bad argument...
|
||||
- math.ceil(<function>) ...bad argument...
|
||||
- math.ceil(<table>) ...bad argument...
|
||||
- math.ceil(<thread>) ...bad argument...
|
||||
====== math.atan2 ======
|
||||
--- checkallpass
|
||||
- math.atan2(1,1) 0.785...
|
||||
- math.atan2(0.75,1) 0.643...
|
||||
- math.atan2('-1',1) -0.78...
|
||||
- math.atan2('-0.25',1) -0.24...
|
||||
- math.atan2(1,0.75) 0.927...
|
||||
- math.atan2(0.75,0.75) 0.785...
|
||||
- math.atan2('-1',0.75) -0.92...
|
||||
- math.atan2('-0.25',0.75) -0.32...
|
||||
- math.atan2(1,'-1') 2.356...
|
||||
- math.atan2(0.75,'-1') 2.498...
|
||||
- math.atan2('-1','-1') -2.35...
|
||||
- math.atan2('-0.25','-1') -2.89...
|
||||
- math.atan2(1,'-0.25') 1.815...
|
||||
- math.atan2(0.75,'-0.25') 1.892...
|
||||
- math.atan2('-1','-0.25') -1.81...
|
||||
- math.atan2('-0.25','-0.25') -2.35...
|
||||
--- checkallerrors
|
||||
- math.atan2() ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.atan2(nil) ...bad argument...
|
||||
- math.atan2('abc') ...bad argument...
|
||||
- math.atan2(true) ...bad argument...
|
||||
- math.atan2(<function>) ...bad argument...
|
||||
- math.atan2(<table>) ...bad argument...
|
||||
- math.atan2(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.atan2(nil,1) ...bad argument...
|
||||
- math.atan2('abc',1) ...bad argument...
|
||||
- math.atan2(true,1) ...bad argument...
|
||||
- math.atan2(<function>,1) ...bad argument...
|
||||
- math.atan2(<table>,1) ...bad argument...
|
||||
- math.atan2(<thread>,1) ...bad argument...
|
||||
- math.atan2(nil,0.75) ...bad argument...
|
||||
- math.atan2('abc',0.75) ...bad argument...
|
||||
- math.atan2(true,0.75) ...bad argument...
|
||||
- math.atan2(<function>,0.75) ...bad argument...
|
||||
- math.atan2(<table>,0.75) ...bad argument...
|
||||
- math.atan2(<thread>,0.75) ...bad argument...
|
||||
- math.atan2(nil,'-1') ...bad argument...
|
||||
- math.atan2('abc','-1') ...bad argument...
|
||||
- math.atan2(true,'-1') ...bad argument...
|
||||
- math.atan2(<function>,'-1') ...bad argument...
|
||||
- math.atan2(<table>,'-1') ...bad argument...
|
||||
- math.atan2(<thread>,'-1') ...bad argument...
|
||||
- math.atan2(nil,'-0.25') ...bad argument...
|
||||
- math.atan2('abc','-0.25') ...bad argument...
|
||||
- math.atan2(true,'-0.25') ...bad argument...
|
||||
- math.atan2(<function>,'-0.25') ...bad argument...
|
||||
- math.atan2(<table>,'-0.25') ...bad argument...
|
||||
- math.atan2(<thread>,'-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.atan2(1) ...bad argument...
|
||||
- math.atan2(0.75) ...bad argument...
|
||||
- math.atan2('-1') ...bad argument...
|
||||
- math.atan2('-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.atan2(1,nil) ...bad argument...
|
||||
- math.atan2(0.75,nil) ...bad argument...
|
||||
- math.atan2('-1',nil) ...bad argument...
|
||||
- math.atan2('-0.25',nil) ...bad argument...
|
||||
- math.atan2(1,'abc') ...bad argument...
|
||||
- math.atan2(0.75,'abc') ...bad argument...
|
||||
- math.atan2('-1','abc') ...bad argument...
|
||||
- math.atan2('-0.25','abc') ...bad argument...
|
||||
- math.atan2(1,true) ...bad argument...
|
||||
- math.atan2(0.75,true) ...bad argument...
|
||||
- math.atan2('-1',true) ...bad argument...
|
||||
- math.atan2('-0.25',true) ...bad argument...
|
||||
- math.atan2(1,<function>) ...bad argument...
|
||||
- math.atan2(0.75,<function>) ...bad argument...
|
||||
- math.atan2('-1',<function>) ...bad argument...
|
||||
- math.atan2('-0.25',<function>) ...bad argument...
|
||||
- math.atan2(1,<table>) ...bad argument...
|
||||
- math.atan2(0.75,<table>) ...bad argument...
|
||||
- math.atan2('-1',<table>) ...bad argument...
|
||||
- math.atan2('-0.25',<table>) ...bad argument...
|
||||
- math.atan2(1,<thread>) ...bad argument...
|
||||
- math.atan2(0.75,<thread>) ...bad argument...
|
||||
- math.atan2('-1',<thread>) ...bad argument...
|
||||
- math.atan2('-0.25',<thread>) ...bad argument...
|
||||
====== math.pow ======
|
||||
--- checkallpass
|
||||
- math.pow(1,1) 1
|
||||
- math.pow(0.75,1) 0.75
|
||||
- math.pow('2',1) 2
|
||||
- math.pow('2.5',1) 2.5
|
||||
- math.pow(1,0.75) 1
|
||||
- math.pow(0.75,0.75) 0.805...
|
||||
- math.pow('2',0.75) 1.681...
|
||||
- math.pow('2.5',0.75) 1.988...
|
||||
- math.pow(1,'-1') 1
|
||||
- math.pow(0.75,'-1') 1.333...
|
||||
- math.pow('2','-1') 0.5
|
||||
- math.pow('2.5','-1') 0.4
|
||||
- math.pow(1,'-0.25') 1
|
||||
- math.pow(0.75,'-0.25') 1.074...
|
||||
- math.pow('2','-0.25') 0.840...
|
||||
- math.pow('2.5','-0.25') 0.795...
|
||||
--- checkallerrors
|
||||
- math.pow() ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.pow(nil) ...bad argument...
|
||||
- math.pow('abc') ...bad argument...
|
||||
- math.pow(true) ...bad argument...
|
||||
- math.pow(<function>) ...bad argument...
|
||||
- math.pow(<table>) ...bad argument...
|
||||
- math.pow(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.pow(nil,1) ...bad argument...
|
||||
- math.pow('abc',1) ...bad argument...
|
||||
- math.pow(true,1) ...bad argument...
|
||||
- math.pow(<function>,1) ...bad argument...
|
||||
- math.pow(<table>,1) ...bad argument...
|
||||
- math.pow(<thread>,1) ...bad argument...
|
||||
- math.pow(nil,0.75) ...bad argument...
|
||||
- math.pow('abc',0.75) ...bad argument...
|
||||
- math.pow(true,0.75) ...bad argument...
|
||||
- math.pow(<function>,0.75) ...bad argument...
|
||||
- math.pow(<table>,0.75) ...bad argument...
|
||||
- math.pow(<thread>,0.75) ...bad argument...
|
||||
- math.pow(nil,'-1') ...bad argument...
|
||||
- math.pow('abc','-1') ...bad argument...
|
||||
- math.pow(true,'-1') ...bad argument...
|
||||
- math.pow(<function>,'-1') ...bad argument...
|
||||
- math.pow(<table>,'-1') ...bad argument...
|
||||
- math.pow(<thread>,'-1') ...bad argument...
|
||||
- math.pow(nil,'-0.25') ...bad argument...
|
||||
- math.pow('abc','-0.25') ...bad argument...
|
||||
- math.pow(true,'-0.25') ...bad argument...
|
||||
- math.pow(<function>,'-0.25') ...bad argument...
|
||||
- math.pow(<table>,'-0.25') ...bad argument...
|
||||
- math.pow(<thread>,'-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.pow(1) ...bad argument...
|
||||
- math.pow(0.75) ...bad argument...
|
||||
- math.pow('-1') ...bad argument...
|
||||
- math.pow('-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.pow(1,nil) ...bad argument...
|
||||
- math.pow(0.75,nil) ...bad argument...
|
||||
- math.pow('-1',nil) ...bad argument...
|
||||
- math.pow('-0.25',nil) ...bad argument...
|
||||
- math.pow(1,'abc') ...bad argument...
|
||||
- math.pow(0.75,'abc') ...bad argument...
|
||||
- math.pow('-1','abc') ...bad argument...
|
||||
- math.pow('-0.25','abc') ...bad argument...
|
||||
- math.pow(1,true) ...bad argument...
|
||||
- math.pow(0.75,true) ...bad argument...
|
||||
- math.pow('-1',true) ...bad argument...
|
||||
- math.pow('-0.25',true) ...bad argument...
|
||||
- math.pow(1,<function>) ...bad argument...
|
||||
- math.pow(0.75,<function>) ...bad argument...
|
||||
- math.pow('-1',<function>) ...bad argument...
|
||||
- math.pow('-0.25',<function>) ...bad argument...
|
||||
- math.pow(1,<table>) ...bad argument...
|
||||
- math.pow(0.75,<table>) ...bad argument...
|
||||
- math.pow('-1',<table>) ...bad argument...
|
||||
- math.pow('-0.25',<table>) ...bad argument...
|
||||
- math.pow(1,<thread>) ...bad argument...
|
||||
- math.pow(0.75,<thread>) ...bad argument...
|
||||
- math.pow('-1',<thread>) ...bad argument...
|
||||
- math.pow('-0.25',<thread>) ...bad argument...
|
||||
====== math.fmod ======
|
||||
--- checkallpass
|
||||
- math.fmod(1,1) 0
|
||||
- math.fmod(0.75,1) 0.75
|
||||
- math.fmod('2',1) 0
|
||||
- math.fmod('2.5',1) 0.5
|
||||
- math.fmod(1,0.75) 0.25
|
||||
- math.fmod(0.75,0.75) 0
|
||||
- math.fmod('2',0.75) 0.5
|
||||
- math.fmod('2.5',0.75) 0.25
|
||||
- math.fmod(1,'-1') 0
|
||||
- math.fmod(0.75,'-1') 0.75
|
||||
- math.fmod('2','-1') 0
|
||||
- math.fmod('2.5','-1') 0.5
|
||||
- math.fmod(1,'-0.25') 0
|
||||
- math.fmod(0.75,'-0.25') 0
|
||||
- math.fmod('2','-0.25') 0
|
||||
- math.fmod('2.5','-0.25') 0
|
||||
--- checkallerrors
|
||||
- math.fmod() ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.fmod(nil) ...bad argument...
|
||||
- math.fmod('abc') ...bad argument...
|
||||
- math.fmod(true) ...bad argument...
|
||||
- math.fmod(<function>) ...bad argument...
|
||||
- math.fmod(<table>) ...bad argument...
|
||||
- math.fmod(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.fmod(nil,1) ...bad argument...
|
||||
- math.fmod('abc',1) ...bad argument...
|
||||
- math.fmod(true,1) ...bad argument...
|
||||
- math.fmod(<function>,1) ...bad argument...
|
||||
- math.fmod(<table>,1) ...bad argument...
|
||||
- math.fmod(<thread>,1) ...bad argument...
|
||||
- math.fmod(nil,0.75) ...bad argument...
|
||||
- math.fmod('abc',0.75) ...bad argument...
|
||||
- math.fmod(true,0.75) ...bad argument...
|
||||
- math.fmod(<function>,0.75) ...bad argument...
|
||||
- math.fmod(<table>,0.75) ...bad argument...
|
||||
- math.fmod(<thread>,0.75) ...bad argument...
|
||||
- math.fmod(nil,'-1') ...bad argument...
|
||||
- math.fmod('abc','-1') ...bad argument...
|
||||
- math.fmod(true,'-1') ...bad argument...
|
||||
- math.fmod(<function>,'-1') ...bad argument...
|
||||
- math.fmod(<table>,'-1') ...bad argument...
|
||||
- math.fmod(<thread>,'-1') ...bad argument...
|
||||
- math.fmod(nil,'-0.25') ...bad argument...
|
||||
- math.fmod('abc','-0.25') ...bad argument...
|
||||
- math.fmod(true,'-0.25') ...bad argument...
|
||||
- math.fmod(<function>,'-0.25') ...bad argument...
|
||||
- math.fmod(<table>,'-0.25') ...bad argument...
|
||||
- math.fmod(<thread>,'-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.fmod(1) ...bad argument...
|
||||
- math.fmod(0.75) ...bad argument...
|
||||
- math.fmod('-1') ...bad argument...
|
||||
- math.fmod('-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.fmod(1,nil) ...bad argument...
|
||||
- math.fmod(0.75,nil) ...bad argument...
|
||||
- math.fmod('-1',nil) ...bad argument...
|
||||
- math.fmod('-0.25',nil) ...bad argument...
|
||||
- math.fmod(1,'abc') ...bad argument...
|
||||
- math.fmod(0.75,'abc') ...bad argument...
|
||||
- math.fmod('-1','abc') ...bad argument...
|
||||
- math.fmod('-0.25','abc') ...bad argument...
|
||||
- math.fmod(1,true) ...bad argument...
|
||||
- math.fmod(0.75,true) ...bad argument...
|
||||
- math.fmod('-1',true) ...bad argument...
|
||||
- math.fmod('-0.25',true) ...bad argument...
|
||||
- math.fmod(1,<function>) ...bad argument...
|
||||
- math.fmod(0.75,<function>) ...bad argument...
|
||||
- math.fmod('-1',<function>) ...bad argument...
|
||||
- math.fmod('-0.25',<function>) ...bad argument...
|
||||
- math.fmod(1,<table>) ...bad argument...
|
||||
- math.fmod(0.75,<table>) ...bad argument...
|
||||
- math.fmod('-1',<table>) ...bad argument...
|
||||
- math.fmod('-0.25',<table>) ...bad argument...
|
||||
- math.fmod(1,<thread>) ...bad argument...
|
||||
- math.fmod(0.75,<thread>) ...bad argument...
|
||||
- math.fmod('-1',<thread>) ...bad argument...
|
||||
- math.fmod('-0.25',<thread>) ...bad argument...
|
||||
====== math.max ======
|
||||
--- checkallpass
|
||||
- math.max(1) 1
|
||||
- math.max(0.75) 0.75
|
||||
- math.max('-1') -1
|
||||
- math.max('-0.25') -0.25...
|
||||
--- checkallpass
|
||||
- math.max(1,1) 1
|
||||
- math.max(0.75,1) 1
|
||||
- math.max('-1',1) 1
|
||||
- math.max('-0.25',1) 1
|
||||
- math.max(1,0.75) 1
|
||||
- math.max(0.75,0.75) 0.75
|
||||
- math.max('-1',0.75) 0.75
|
||||
- math.max('-0.25',0.75) 0.75
|
||||
- math.max(1,'-1') 1
|
||||
- math.max(0.75,'-1') 0.75
|
||||
- math.max('-1','-1') -1
|
||||
- math.max('-0.25','-1') -0.25...
|
||||
- math.max(1,'-0.25') 1
|
||||
- math.max(0.75,'-0.25') 0.75
|
||||
- math.max('-1','-0.25') -0.25...
|
||||
- math.max('-0.25','-0.25') -0.25...
|
||||
--- checkallerrors
|
||||
- math.max() ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.max('abc') ...bad argument...
|
||||
- math.max(true) ...bad argument...
|
||||
- math.max(<function>) ...bad argument...
|
||||
- math.max(<table>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.max(1,'abc') ...bad argument...
|
||||
- math.max(0.75,'abc') ...bad argument...
|
||||
- math.max('-1','abc') ...bad argument...
|
||||
- math.max('-0.25','abc') ...bad argument...
|
||||
- math.max(1,true) ...bad argument...
|
||||
- math.max(0.75,true) ...bad argument...
|
||||
- math.max('-1',true) ...bad argument...
|
||||
- math.max('-0.25',true) ...bad argument...
|
||||
- math.max(1,<function>) ...bad argument...
|
||||
- math.max(0.75,<function>) ...bad argument...
|
||||
- math.max('-1',<function>) ...bad argument...
|
||||
- math.max('-0.25',<function>) ...bad argument...
|
||||
- math.max(1,<table>) ...bad argument...
|
||||
- math.max(0.75,<table>) ...bad argument...
|
||||
- math.max('-1',<table>) ...bad argument...
|
||||
- math.max('-0.25',<table>) ...bad argument...
|
||||
====== math.min ======
|
||||
--- checkallpass
|
||||
- math.min(1) 1
|
||||
- math.min(0.75) 0.75
|
||||
- math.min('-1') -1
|
||||
- math.min('-0.25') -0.25...
|
||||
--- checkallpass
|
||||
- math.min(1,1) 1
|
||||
- math.min(0.75,1) 0.75
|
||||
- math.min('-1',1) -1
|
||||
- math.min('-0.25',1) -0.25...
|
||||
- math.min(1,0.75) 0.75
|
||||
- math.min(0.75,0.75) 0.75
|
||||
- math.min('-1',0.75) -1
|
||||
- math.min('-0.25',0.75) -0.25...
|
||||
- math.min(1,'-1') -1
|
||||
- math.min(0.75,'-1') -1
|
||||
- math.min('-1','-1') -1
|
||||
- math.min('-0.25','-1') -1
|
||||
- math.min(1,'-0.25') -0.25...
|
||||
- math.min(0.75,'-0.25') -0.25...
|
||||
- math.min('-1','-0.25') -1
|
||||
- math.min('-0.25','-0.25') -0.25...
|
||||
--- checkallerrors
|
||||
- math.min() ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.min('abc') ...bad argument...
|
||||
- math.min(true) ...bad argument...
|
||||
- math.min(<function>) ...bad argument...
|
||||
- math.min(<table>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.min(1,'abc') ...bad argument...
|
||||
- math.min(0.75,'abc') ...bad argument...
|
||||
- math.min('-1','abc') ...bad argument...
|
||||
- math.min('-0.25','abc') ...bad argument...
|
||||
- math.min(1,true) ...bad argument...
|
||||
- math.min(0.75,true) ...bad argument...
|
||||
- math.min('-1',true) ...bad argument...
|
||||
- math.min('-0.25',true) ...bad argument...
|
||||
- math.min(1,<function>) ...bad argument...
|
||||
- math.min(0.75,<function>) ...bad argument...
|
||||
- math.min('-1',<function>) ...bad argument...
|
||||
- math.min('-0.25',<function>) ...bad argument...
|
||||
- math.min(1,<table>) ...bad argument...
|
||||
- math.min(0.75,<table>) ...bad argument...
|
||||
- math.min('-1',<table>) ...bad argument...
|
||||
- math.min('-0.25',<table>) ...bad argument...
|
||||
====== math.random ======
|
||||
--- checkallpass
|
||||
- math.random() number
|
||||
--- checkallpass
|
||||
- math.random(3) number
|
||||
- math.random(4.5) number
|
||||
- math.random('6.7') number
|
||||
--- checkallpass
|
||||
- math.random(3,8) number
|
||||
- math.random(4.5,8) number
|
||||
- math.random('6.7',8) number
|
||||
- math.random(3,9.1) number
|
||||
- math.random(4.5,9.1) number
|
||||
- math.random('6.7',9.1) number
|
||||
- math.random(3,'12.34') number
|
||||
- math.random(4.5,'12.34') number
|
||||
- math.random('6.7','12.34') number
|
||||
--- checkallpass
|
||||
- math.random(-4,-1) number
|
||||
- math.random(-5.6,-1) number
|
||||
- math.random('-7',-1) number
|
||||
- math.random('-8.9',-1) number
|
||||
- math.random(-4,100) number
|
||||
- math.random(-5.6,100) number
|
||||
- math.random('-7',100) number
|
||||
- math.random('-8.9',100) number
|
||||
- math.random(-4,23.45...) number
|
||||
- math.random(-5.6,23.45...) number
|
||||
- math.random('-7',23.45...) number
|
||||
- math.random('-8.9',23.45...) number
|
||||
- math.random(-4,'-1.23') number
|
||||
- math.random(-5.6,'-1.23') number
|
||||
- math.random('-7','-1.23') number
|
||||
- math.random('-8.9','-1.23') number
|
||||
--- checkallerrors
|
||||
- math.random(-4) ...interval is empty...
|
||||
- math.random(-5.6) ...interval is empty...
|
||||
- math.random('-7') ...interval is empty...
|
||||
- math.random('-8.9') ...interval is empty...
|
||||
--- checkallerrors
|
||||
- math.random(8,3) ...interval is empty...
|
||||
- math.random(9.1,3) ...interval is empty...
|
||||
- math.random('12.34',3) ...interval is empty...
|
||||
- math.random(8,4.5) ...interval is empty...
|
||||
- math.random(9.1,4.5) ...interval is empty...
|
||||
- math.random('12.34',4.5) ...interval is empty...
|
||||
- math.random(8,'6.7') ...interval is empty...
|
||||
- math.random(9.1,'6.7') ...interval is empty...
|
||||
- math.random('12.34','6.7') ...interval is empty...
|
||||
--- checkallerrors
|
||||
- math.random('abc',8) ...bad argument...
|
||||
- math.random(true,8) ...bad argument...
|
||||
- math.random(<table>,8) ...bad argument...
|
||||
- math.random(<function>,8) ...bad argument...
|
||||
- math.random('abc',9.1) ...bad argument...
|
||||
- math.random(true,9.1) ...bad argument...
|
||||
- math.random(<table>,9.1) ...bad argument...
|
||||
- math.random(<function>,9.1) ...bad argument...
|
||||
- math.random('abc','12.34') ...bad argument...
|
||||
- math.random(true,'12.34') ...bad argument...
|
||||
- math.random(<table>,'12.34') ...bad argument...
|
||||
- math.random(<function>,'12.34') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.random(3,'abc') ...bad argument...
|
||||
- math.random(4.5,'abc') ...bad argument...
|
||||
- math.random('6.7','abc') ...bad argument...
|
||||
- math.random(3,true) ...bad argument...
|
||||
- math.random(4.5,true) ...bad argument...
|
||||
- math.random('6.7',true) ...bad argument...
|
||||
- math.random(3,<table>) ...bad argument...
|
||||
- math.random(4.5,<table>) ...bad argument...
|
||||
- math.random('6.7',<table>) ...bad argument...
|
||||
- math.random(3,<function>) ...bad argument...
|
||||
- math.random(4.5,<function>) ...bad argument...
|
||||
- math.random('6.7',<function>) ...bad argument...
|
||||
====== math.ldexp ======
|
||||
--- checkallpass
|
||||
- math.ldexp(1,-3) 0.125...
|
||||
- math.ldexp(0.75,-3) 0.093...
|
||||
- math.ldexp('-1',-3) -0.12...
|
||||
- math.ldexp('-0.25',-3) -0.03...
|
||||
- math.ldexp(1,0) 1
|
||||
- math.ldexp(0.75,0) 0.75
|
||||
- math.ldexp('-1',0) -1
|
||||
- math.ldexp('-0.25',0) -0.25...
|
||||
- math.ldexp(1,3) 8
|
||||
- math.ldexp(0.75,3) 6
|
||||
- math.ldexp('-1',3) -8
|
||||
- math.ldexp('-0.25',3) -2
|
||||
- math.ldexp(1,9.1) 512
|
||||
- math.ldexp(0.75,9.1) 384
|
||||
- math.ldexp('-1',9.1) -512
|
||||
- math.ldexp('-0.25',9.1) -128
|
||||
- math.ldexp(1,'12.34') 4096
|
||||
- math.ldexp(0.75,'12.34') 3072
|
||||
- math.ldexp('-1','12.34') -4096...
|
||||
- math.ldexp('-0.25','12.34') -1024...
|
||||
--- checkallerrors
|
||||
- math.ldexp() ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.ldexp(nil) ...bad argument...
|
||||
- math.ldexp('abc') ...bad argument...
|
||||
- math.ldexp(true) ...bad argument...
|
||||
- math.ldexp(<function>) ...bad argument...
|
||||
- math.ldexp(<table>) ...bad argument...
|
||||
- math.ldexp(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.ldexp(nil,-3) ...bad argument...
|
||||
- math.ldexp('abc',-3) ...bad argument...
|
||||
- math.ldexp(true,-3) ...bad argument...
|
||||
- math.ldexp(<function>,-3) ...bad argument...
|
||||
- math.ldexp(<table>,-3) ...bad argument...
|
||||
- math.ldexp(<thread>,-3) ...bad argument...
|
||||
- math.ldexp(nil,0) ...bad argument...
|
||||
- math.ldexp('abc',0) ...bad argument...
|
||||
- math.ldexp(true,0) ...bad argument...
|
||||
- math.ldexp(<function>,0) ...bad argument...
|
||||
- math.ldexp(<table>,0) ...bad argument...
|
||||
- math.ldexp(<thread>,0) ...bad argument...
|
||||
- math.ldexp(nil,3) ...bad argument...
|
||||
- math.ldexp('abc',3) ...bad argument...
|
||||
- math.ldexp(true,3) ...bad argument...
|
||||
- math.ldexp(<function>,3) ...bad argument...
|
||||
- math.ldexp(<table>,3) ...bad argument...
|
||||
- math.ldexp(<thread>,3) ...bad argument...
|
||||
- math.ldexp(nil,9.1) ...bad argument...
|
||||
- math.ldexp('abc',9.1) ...bad argument...
|
||||
- math.ldexp(true,9.1) ...bad argument...
|
||||
- math.ldexp(<function>,9.1) ...bad argument...
|
||||
- math.ldexp(<table>,9.1) ...bad argument...
|
||||
- math.ldexp(<thread>,9.1) ...bad argument...
|
||||
- math.ldexp(nil,'12.34') ...bad argument...
|
||||
- math.ldexp('abc','12.34') ...bad argument...
|
||||
- math.ldexp(true,'12.34') ...bad argument...
|
||||
- math.ldexp(<function>,'12.34') ...bad argument...
|
||||
- math.ldexp(<table>,'12.34') ...bad argument...
|
||||
- math.ldexp(<thread>,'12.34') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.ldexp(1) ...bad argument...
|
||||
- math.ldexp(0.75) ...bad argument...
|
||||
- math.ldexp('-1') ...bad argument...
|
||||
- math.ldexp('-0.25') ...bad argument...
|
||||
--- checkallerrors
|
||||
- math.ldexp(1,nil) ...bad argument...
|
||||
- math.ldexp(0.75,nil) ...bad argument...
|
||||
- math.ldexp('-1',nil) ...bad argument...
|
||||
- math.ldexp('-0.25',nil) ...bad argument...
|
||||
- math.ldexp(1,'abc') ...bad argument...
|
||||
- math.ldexp(0.75,'abc') ...bad argument...
|
||||
- math.ldexp('-1','abc') ...bad argument...
|
||||
- math.ldexp('-0.25','abc') ...bad argument...
|
||||
- math.ldexp(1,true) ...bad argument...
|
||||
- math.ldexp(0.75,true) ...bad argument...
|
||||
- math.ldexp('-1',true) ...bad argument...
|
||||
- math.ldexp('-0.25',true) ...bad argument...
|
||||
- math.ldexp(1,<table>) ...bad argument...
|
||||
- math.ldexp(0.75,<table>) ...bad argument...
|
||||
- math.ldexp('-1',<table>) ...bad argument...
|
||||
- math.ldexp('-0.25',<table>) ...bad argument...
|
||||
- math.ldexp(1,<function>) ...bad argument...
|
||||
- math.ldexp(0.75,<function>) ...bad argument...
|
||||
- math.ldexp('-1',<function>) ...bad argument...
|
||||
- math.ldexp('-0.25',<function>) ...bad argument...
|
||||
33
luaj-test/src/test/resources/errors/modulelibargs.out
Normal file
33
luaj-test/src/test/resources/errors/modulelibargs.out
Normal file
@@ -0,0 +1,33 @@
|
||||
====== require ======
|
||||
--- checkallpass
|
||||
- require('math') table
|
||||
- require('coroutine') table
|
||||
- require('package') table
|
||||
- require('string') table
|
||||
- require('table') table
|
||||
--- checkallerrors
|
||||
- require(1.25) ...not found...
|
||||
--- checkallerrors
|
||||
- require(nil) ...bad argument...
|
||||
- require(true) ...bad argument...
|
||||
- require(<function>) ...bad argument...
|
||||
- require(<table>) ...bad argument...
|
||||
====== package.loadlib ======
|
||||
--- checkallpass
|
||||
- package.loadlib('foo','bar') nil,string,string
|
||||
--- checkallerrors
|
||||
- package.loadlib(nil) ...bad argument...
|
||||
- package.loadlib(true) ...bad argument...
|
||||
- package.loadlib(<table>) ...bad argument...
|
||||
- package.loadlib(<function>) ...bad argument...
|
||||
- package.loadlib(<thread>) ...bad argument...
|
||||
====== package.seeall ======
|
||||
--- checkallpass
|
||||
fail package.seeall(<table>) 'attempt to call a nil value'
|
||||
--- checkallerrors
|
||||
badmsg package.seeall(nil) template='bad argument' actual='attempt to call a nil value'
|
||||
badmsg package.seeall('abc') template='bad argument' actual='attempt to call a nil value'
|
||||
badmsg package.seeall(1.25) template='bad argument' actual='attempt to call a nil value'
|
||||
badmsg package.seeall(true) template='bad argument' actual='attempt to call a nil value'
|
||||
badmsg package.seeall(<function>) template='bad argument' actual='attempt to call a nil value'
|
||||
badmsg package.seeall(<thread>) template='bad argument' actual='attempt to call a nil value'
|
||||
837
luaj-test/src/test/resources/errors/operators.out
Normal file
837
luaj-test/src/test/resources/errors/operators.out
Normal file
@@ -0,0 +1,837 @@
|
||||
====== unary - ======
|
||||
--- checkallpass
|
||||
- negative(1.25) -1.25
|
||||
- negative('789') -789
|
||||
--- checkallerrors
|
||||
- negative(nil) ...attempt to perform arithmetic...
|
||||
- negative('abc') ...attempt to perform arithmetic...
|
||||
- negative(true) ...attempt to perform arithmetic...
|
||||
- negative(<table>) ...attempt to perform arithmetic...
|
||||
- negative(<function>) ...attempt to perform arithmetic...
|
||||
- negative(<thread>) ...attempt to perform arithmetic...
|
||||
====== # ======
|
||||
--- checkallpass
|
||||
- lengthop(<table>) 0
|
||||
--- checkallerrors
|
||||
- lengthop(nil) ...attempt to get length of...
|
||||
needcheck lengthop('abc') 3
|
||||
- lengthop(1.25) ...attempt to get length of...
|
||||
- lengthop(true) ...attempt to get length of...
|
||||
- lengthop(<function>) ...attempt to get length of...
|
||||
- lengthop(<thread>) ...attempt to get length of...
|
||||
====== not ======
|
||||
--- checkallpass
|
||||
- notop(1.25) false
|
||||
- notop('789') false
|
||||
--- checkallpass
|
||||
- notop(nil) true
|
||||
- notop('abc') false
|
||||
- notop(true) false
|
||||
- notop(<table>) false
|
||||
- notop(<function>) false
|
||||
- notop(<thread>) false
|
||||
====== () ======
|
||||
--- checkallpass
|
||||
- funcop(<function>)
|
||||
--- checkallerrors
|
||||
- funcop(nil) ...attempt to call...
|
||||
- funcop('abc') ...attempt to call...
|
||||
- funcop(1.25) ...attempt to call...
|
||||
- funcop(true) ...attempt to call...
|
||||
- funcop(<table>) ...attempt to call...
|
||||
- funcop(<thread>) ...attempt to call...
|
||||
====== .. ======
|
||||
--- checkallpass
|
||||
- concatop('abc','abc') 'abcabc'
|
||||
- concatop(1.25,'abc') '1.25abc'
|
||||
- concatop('abc',1.25) 'abc1.25'
|
||||
- concatop(1.25,1.25) '1.251.25'
|
||||
--- checkallerrors
|
||||
- concatop(nil,'abc') ...attempt to concatenate...
|
||||
- concatop(true,'abc') ...attempt to concatenate...
|
||||
- concatop(<table>,'abc') ...attempt to concatenate...
|
||||
- concatop(<function>,'abc') ...attempt to concatenate...
|
||||
- concatop(<thread>,'abc') ...attempt to concatenate...
|
||||
- concatop(nil,1.25) ...attempt to concatenate...
|
||||
- concatop(true,1.25) ...attempt to concatenate...
|
||||
- concatop(<table>,1.25) ...attempt to concatenate...
|
||||
- concatop(<function>,1.25) ...attempt to concatenate...
|
||||
- concatop(<thread>,1.25) ...attempt to concatenate...
|
||||
--- checkallerrors
|
||||
- concatop('abc',nil) ...attempt to concatenate...
|
||||
- concatop(1.25,nil) ...attempt to concatenate...
|
||||
- concatop('abc',true) ...attempt to concatenate...
|
||||
- concatop(1.25,true) ...attempt to concatenate...
|
||||
- concatop('abc',<table>) ...attempt to concatenate...
|
||||
- concatop(1.25,<table>) ...attempt to concatenate...
|
||||
- concatop('abc',<function>) ...attempt to concatenate...
|
||||
- concatop(1.25,<function>) ...attempt to concatenate...
|
||||
- concatop('abc',<thread>) ...attempt to concatenate...
|
||||
- concatop(1.25,<thread>) ...attempt to concatenate...
|
||||
====== + ======
|
||||
--- checkallpass
|
||||
- plusop(1.25,1.25) 2.5
|
||||
- plusop('789',1.25) 790.25
|
||||
- plusop(1.25,'789') 790.25
|
||||
- plusop('789','789') 1578
|
||||
--- checkallerrors
|
||||
- plusop(nil,1.25) ...attempt to perform arithmetic...
|
||||
- plusop('abc',1.25) ...attempt to perform arithmetic...
|
||||
- plusop(true,1.25) ...attempt to perform arithmetic...
|
||||
- plusop(<table>,1.25) ...attempt to perform arithmetic...
|
||||
- plusop(<function>,1.25) ...attempt to perform arithmetic...
|
||||
- plusop(<thread>,1.25) ...attempt to perform arithmetic...
|
||||
- plusop(nil,'789') ...attempt to perform arithmetic...
|
||||
- plusop('abc','789') ...attempt to perform arithmetic...
|
||||
- plusop(true,'789') ...attempt to perform arithmetic...
|
||||
- plusop(<table>,'789') ...attempt to perform arithmetic...
|
||||
- plusop(<function>,'789') ...attempt to perform arithmetic...
|
||||
- plusop(<thread>,'789') ...attempt to perform arithmetic...
|
||||
--- checkallerrors
|
||||
- plusop(1.25,nil) ...attempt to perform arithmetic...
|
||||
- plusop('789',nil) ...attempt to perform arithmetic...
|
||||
- plusop(1.25,'abc') ...attempt to perform arithmetic...
|
||||
- plusop('789','abc') ...attempt to perform arithmetic...
|
||||
- plusop(1.25,true) ...attempt to perform arithmetic...
|
||||
- plusop('789',true) ...attempt to perform arithmetic...
|
||||
- plusop(1.25,<table>) ...attempt to perform arithmetic...
|
||||
- plusop('789',<table>) ...attempt to perform arithmetic...
|
||||
- plusop(1.25,<function>) ...attempt to perform arithmetic...
|
||||
- plusop('789',<function>) ...attempt to perform arithmetic...
|
||||
- plusop(1.25,<thread>) ...attempt to perform arithmetic...
|
||||
- plusop('789',<thread>) ...attempt to perform arithmetic...
|
||||
====== - ======
|
||||
--- checkallpass
|
||||
- minusop(1.25,1.25) 0
|
||||
- minusop('789',1.25) 787.75
|
||||
- minusop(1.25,'789') -787.75
|
||||
- minusop('789','789') 0
|
||||
--- checkallerrors
|
||||
- minusop(nil,1.25) ...attempt to perform arithmetic...
|
||||
- minusop('abc',1.25) ...attempt to perform arithmetic...
|
||||
- minusop(true,1.25) ...attempt to perform arithmetic...
|
||||
- minusop(<table>,1.25) ...attempt to perform arithmetic...
|
||||
- minusop(<function>,1.25) ...attempt to perform arithmetic...
|
||||
- minusop(<thread>,1.25) ...attempt to perform arithmetic...
|
||||
- minusop(nil,'789') ...attempt to perform arithmetic...
|
||||
- minusop('abc','789') ...attempt to perform arithmetic...
|
||||
- minusop(true,'789') ...attempt to perform arithmetic...
|
||||
- minusop(<table>,'789') ...attempt to perform arithmetic...
|
||||
- minusop(<function>,'789') ...attempt to perform arithmetic...
|
||||
- minusop(<thread>,'789') ...attempt to perform arithmetic...
|
||||
--- checkallerrors
|
||||
- minusop(1.25,nil) ...attempt to perform arithmetic...
|
||||
- minusop('789',nil) ...attempt to perform arithmetic...
|
||||
- minusop(1.25,'abc') ...attempt to perform arithmetic...
|
||||
- minusop('789','abc') ...attempt to perform arithmetic...
|
||||
- minusop(1.25,true) ...attempt to perform arithmetic...
|
||||
- minusop('789',true) ...attempt to perform arithmetic...
|
||||
- minusop(1.25,<table>) ...attempt to perform arithmetic...
|
||||
- minusop('789',<table>) ...attempt to perform arithmetic...
|
||||
- minusop(1.25,<function>) ...attempt to perform arithmetic...
|
||||
- minusop('789',<function>) ...attempt to perform arithmetic...
|
||||
- minusop(1.25,<thread>) ...attempt to perform arithmetic...
|
||||
- minusop('789',<thread>) ...attempt to perform arithmetic...
|
||||
====== * ======
|
||||
--- checkallpass
|
||||
- timesop(1.25,1.25) 1.5625
|
||||
- timesop('789',1.25) 986.25
|
||||
- timesop(1.25,'789') 986.25
|
||||
- timesop('789','789') 622521
|
||||
--- checkallerrors
|
||||
- timesop(nil,1.25) ...attempt to perform arithmetic...
|
||||
- timesop('abc',1.25) ...attempt to perform arithmetic...
|
||||
- timesop(true,1.25) ...attempt to perform arithmetic...
|
||||
- timesop(<table>,1.25) ...attempt to perform arithmetic...
|
||||
- timesop(<function>,1.25) ...attempt to perform arithmetic...
|
||||
- timesop(<thread>,1.25) ...attempt to perform arithmetic...
|
||||
- timesop(nil,'789') ...attempt to perform arithmetic...
|
||||
- timesop('abc','789') ...attempt to perform arithmetic...
|
||||
- timesop(true,'789') ...attempt to perform arithmetic...
|
||||
- timesop(<table>,'789') ...attempt to perform arithmetic...
|
||||
- timesop(<function>,'789') ...attempt to perform arithmetic...
|
||||
- timesop(<thread>,'789') ...attempt to perform arithmetic...
|
||||
--- checkallerrors
|
||||
- timesop(1.25,nil) ...attempt to perform arithmetic...
|
||||
- timesop('789',nil) ...attempt to perform arithmetic...
|
||||
- timesop(1.25,'abc') ...attempt to perform arithmetic...
|
||||
- timesop('789','abc') ...attempt to perform arithmetic...
|
||||
- timesop(1.25,true) ...attempt to perform arithmetic...
|
||||
- timesop('789',true) ...attempt to perform arithmetic...
|
||||
- timesop(1.25,<table>) ...attempt to perform arithmetic...
|
||||
- timesop('789',<table>) ...attempt to perform arithmetic...
|
||||
- timesop(1.25,<function>) ...attempt to perform arithmetic...
|
||||
- timesop('789',<function>) ...attempt to perform arithmetic...
|
||||
- timesop(1.25,<thread>) ...attempt to perform arithmetic...
|
||||
- timesop('789',<thread>) ...attempt to perform arithmetic...
|
||||
====== / ======
|
||||
--- checkallpass
|
||||
- divideop(1.25,1.25) 1
|
||||
- divideop('789',1.25) 631.2
|
||||
- divideop(1.25,'789') 0.001584...
|
||||
- divideop('789','789') 1
|
||||
--- checkallerrors
|
||||
- divideop(nil,1.25) ...attempt to perform arithmetic...
|
||||
- divideop('abc',1.25) ...attempt to perform arithmetic...
|
||||
- divideop(true,1.25) ...attempt to perform arithmetic...
|
||||
- divideop(<table>,1.25) ...attempt to perform arithmetic...
|
||||
- divideop(<function>,1.25) ...attempt to perform arithmetic...
|
||||
- divideop(<thread>,1.25) ...attempt to perform arithmetic...
|
||||
- divideop(nil,'789') ...attempt to perform arithmetic...
|
||||
- divideop('abc','789') ...attempt to perform arithmetic...
|
||||
- divideop(true,'789') ...attempt to perform arithmetic...
|
||||
- divideop(<table>,'789') ...attempt to perform arithmetic...
|
||||
- divideop(<function>,'789') ...attempt to perform arithmetic...
|
||||
- divideop(<thread>,'789') ...attempt to perform arithmetic...
|
||||
--- checkallerrors
|
||||
- divideop(1.25,nil) ...attempt to perform arithmetic...
|
||||
- divideop('789',nil) ...attempt to perform arithmetic...
|
||||
- divideop(1.25,'abc') ...attempt to perform arithmetic...
|
||||
- divideop('789','abc') ...attempt to perform arithmetic...
|
||||
- divideop(1.25,true) ...attempt to perform arithmetic...
|
||||
- divideop('789',true) ...attempt to perform arithmetic...
|
||||
- divideop(1.25,<table>) ...attempt to perform arithmetic...
|
||||
- divideop('789',<table>) ...attempt to perform arithmetic...
|
||||
- divideop(1.25,<function>) ...attempt to perform arithmetic...
|
||||
- divideop('789',<function>) ...attempt to perform arithmetic...
|
||||
- divideop(1.25,<thread>) ...attempt to perform arithmetic...
|
||||
- divideop('789',<thread>) ...attempt to perform arithmetic...
|
||||
====== % ======
|
||||
--- checkallpass
|
||||
- modop(1.25,1.25) 0
|
||||
- modop('789',1.25) 0.25
|
||||
- modop(1.25,'789') 1.25
|
||||
- modop('789','789') 0
|
||||
--- checkallerrors
|
||||
- modop(nil,1.25) ...attempt to perform arithmetic...
|
||||
- modop('abc',1.25) ...attempt to perform arithmetic...
|
||||
- modop(true,1.25) ...attempt to perform arithmetic...
|
||||
- modop(<table>,1.25) ...attempt to perform arithmetic...
|
||||
- modop(<function>,1.25) ...attempt to perform arithmetic...
|
||||
- modop(<thread>,1.25) ...attempt to perform arithmetic...
|
||||
- modop(nil,'789') ...attempt to perform arithmetic...
|
||||
- modop('abc','789') ...attempt to perform arithmetic...
|
||||
- modop(true,'789') ...attempt to perform arithmetic...
|
||||
- modop(<table>,'789') ...attempt to perform arithmetic...
|
||||
- modop(<function>,'789') ...attempt to perform arithmetic...
|
||||
- modop(<thread>,'789') ...attempt to perform arithmetic...
|
||||
--- checkallerrors
|
||||
- modop(1.25,nil) ...attempt to perform arithmetic...
|
||||
- modop('789',nil) ...attempt to perform arithmetic...
|
||||
- modop(1.25,'abc') ...attempt to perform arithmetic...
|
||||
- modop('789','abc') ...attempt to perform arithmetic...
|
||||
- modop(1.25,true) ...attempt to perform arithmetic...
|
||||
- modop('789',true) ...attempt to perform arithmetic...
|
||||
- modop(1.25,<table>) ...attempt to perform arithmetic...
|
||||
- modop('789',<table>) ...attempt to perform arithmetic...
|
||||
- modop(1.25,<function>) ...attempt to perform arithmetic...
|
||||
- modop('789',<function>) ...attempt to perform arithmetic...
|
||||
- modop(1.25,<thread>) ...attempt to perform arithmetic...
|
||||
- modop('789',<thread>) ...attempt to perform arithmetic...
|
||||
====== ^ ======
|
||||
--- checkallpass
|
||||
- powerop(2,3) 8
|
||||
- powerop('2.5',3) 15.625
|
||||
- powerop(2,'3.5') 11.31370...
|
||||
- powerop('2.5','3.5') 24.70529...
|
||||
--- checkallerrors
|
||||
- powerop(nil,3) ...attempt to perform arithmetic...
|
||||
- powerop('abc',3) ...attempt to perform arithmetic...
|
||||
- powerop(true,3) ...attempt to perform arithmetic...
|
||||
- powerop(<table>,3) ...attempt to perform arithmetic...
|
||||
- powerop(<function>,3) ...attempt to perform arithmetic...
|
||||
- powerop(<thread>,3) ...attempt to perform arithmetic...
|
||||
- powerop(nil,'3.1') ...attempt to perform arithmetic...
|
||||
- powerop('abc','3.1') ...attempt to perform arithmetic...
|
||||
- powerop(true,'3.1') ...attempt to perform arithmetic...
|
||||
- powerop(<table>,'3.1') ...attempt to perform arithmetic...
|
||||
- powerop(<function>,'3.1') ...attempt to perform arithmetic...
|
||||
- powerop(<thread>,'3.1') ...attempt to perform arithmetic...
|
||||
--- checkallerrors
|
||||
- powerop(2,nil) ...attempt to perform arithmetic...
|
||||
- powerop('2.1',nil) ...attempt to perform arithmetic...
|
||||
- powerop(2,'abc') ...attempt to perform arithmetic...
|
||||
- powerop('2.1','abc') ...attempt to perform arithmetic...
|
||||
- powerop(2,true) ...attempt to perform arithmetic...
|
||||
- powerop('2.1',true) ...attempt to perform arithmetic...
|
||||
- powerop(2,<table>) ...attempt to perform arithmetic...
|
||||
- powerop('2.1',<table>) ...attempt to perform arithmetic...
|
||||
- powerop(2,<function>) ...attempt to perform arithmetic...
|
||||
- powerop('2.1',<function>) ...attempt to perform arithmetic...
|
||||
- powerop(2,<thread>) ...attempt to perform arithmetic...
|
||||
- powerop('2.1',<thread>) ...attempt to perform arithmetic...
|
||||
====== == ======
|
||||
--- checkallpass
|
||||
- equalsop(nil,nil) true
|
||||
- equalsop('abc',nil) false
|
||||
- equalsop(1.25,nil) false
|
||||
- equalsop(true,nil) false
|
||||
- equalsop(<table>,nil) false
|
||||
- equalsop(<function>,nil) false
|
||||
- equalsop(<thread>,nil) false
|
||||
- equalsop(nil,'abc') false
|
||||
- equalsop('abc','abc') true
|
||||
- equalsop(1.25,'abc') false
|
||||
- equalsop(true,'abc') false
|
||||
- equalsop(<table>,'abc') false
|
||||
- equalsop(<function>,'abc') false
|
||||
- equalsop(<thread>,'abc') false
|
||||
- equalsop(nil,1.25) false
|
||||
- equalsop('abc',1.25) false
|
||||
- equalsop(1.25,1.25) true
|
||||
- equalsop(true,1.25) false
|
||||
- equalsop(<table>,1.25) false
|
||||
- equalsop(<function>,1.25) false
|
||||
- equalsop(<thread>,1.25) false
|
||||
- equalsop(nil,true) false
|
||||
- equalsop('abc',true) false
|
||||
- equalsop(1.25,true) false
|
||||
- equalsop(true,true) true
|
||||
- equalsop(<table>,true) false
|
||||
- equalsop(<function>,true) false
|
||||
- equalsop(<thread>,true) false
|
||||
- equalsop(nil,<table>) false
|
||||
- equalsop('abc',<table>) false
|
||||
- equalsop(1.25,<table>) false
|
||||
- equalsop(true,<table>) false
|
||||
- equalsop(<table>,<table>) true
|
||||
- equalsop(<function>,<table>) false
|
||||
- equalsop(<thread>,<table>) false
|
||||
- equalsop(nil,<function>) false
|
||||
- equalsop('abc',<function>) false
|
||||
- equalsop(1.25,<function>) false
|
||||
- equalsop(true,<function>) false
|
||||
- equalsop(<table>,<function>) false
|
||||
- equalsop(<function>,<function>) true
|
||||
- equalsop(<thread>,<function>) false
|
||||
- equalsop(nil,<thread>) false
|
||||
- equalsop('abc',<thread>) false
|
||||
- equalsop(1.25,<thread>) false
|
||||
- equalsop(true,<thread>) false
|
||||
- equalsop(<table>,<thread>) false
|
||||
- equalsop(<function>,<thread>) false
|
||||
- equalsop(<thread>,<thread>) true
|
||||
====== ~= ======
|
||||
--- checkallpass
|
||||
- noteqop(nil,nil) false
|
||||
- noteqop('abc',nil) true
|
||||
- noteqop(1.25,nil) true
|
||||
- noteqop(true,nil) true
|
||||
- noteqop(<table>,nil) true
|
||||
- noteqop(<function>,nil) true
|
||||
- noteqop(<thread>,nil) true
|
||||
- noteqop(nil,'abc') true
|
||||
- noteqop('abc','abc') false
|
||||
- noteqop(1.25,'abc') true
|
||||
- noteqop(true,'abc') true
|
||||
- noteqop(<table>,'abc') true
|
||||
- noteqop(<function>,'abc') true
|
||||
- noteqop(<thread>,'abc') true
|
||||
- noteqop(nil,1.25) true
|
||||
- noteqop('abc',1.25) true
|
||||
- noteqop(1.25,1.25) false
|
||||
- noteqop(true,1.25) true
|
||||
- noteqop(<table>,1.25) true
|
||||
- noteqop(<function>,1.25) true
|
||||
- noteqop(<thread>,1.25) true
|
||||
- noteqop(nil,true) true
|
||||
- noteqop('abc',true) true
|
||||
- noteqop(1.25,true) true
|
||||
- noteqop(true,true) false
|
||||
- noteqop(<table>,true) true
|
||||
- noteqop(<function>,true) true
|
||||
- noteqop(<thread>,true) true
|
||||
- noteqop(nil,<table>) true
|
||||
- noteqop('abc',<table>) true
|
||||
- noteqop(1.25,<table>) true
|
||||
- noteqop(true,<table>) true
|
||||
- noteqop(<table>,<table>) false
|
||||
- noteqop(<function>,<table>) true
|
||||
- noteqop(<thread>,<table>) true
|
||||
- noteqop(nil,<function>) true
|
||||
- noteqop('abc',<function>) true
|
||||
- noteqop(1.25,<function>) true
|
||||
- noteqop(true,<function>) true
|
||||
- noteqop(<table>,<function>) true
|
||||
- noteqop(<function>,<function>) false
|
||||
- noteqop(<thread>,<function>) true
|
||||
- noteqop(nil,<thread>) true
|
||||
- noteqop('abc',<thread>) true
|
||||
- noteqop(1.25,<thread>) true
|
||||
- noteqop(true,<thread>) true
|
||||
- noteqop(<table>,<thread>) true
|
||||
- noteqop(<function>,<thread>) true
|
||||
- noteqop(<thread>,<thread>) false
|
||||
====== <= ======
|
||||
--- checkallpass
|
||||
- leop(1.25,1.25) true
|
||||
--- checkallpass
|
||||
- leop('abc','abc') true
|
||||
- leop('789','abc') true
|
||||
- leop('abc','789') false
|
||||
- leop('789','789') true
|
||||
--- checkallerrors
|
||||
- leop(nil,1.25) ...attempt to compare...
|
||||
- leop('abc',1.25) ...attempt to compare...
|
||||
- leop(true,1.25) ...attempt to compare...
|
||||
- leop(<table>,1.25) ...attempt to compare...
|
||||
- leop(<function>,1.25) ...attempt to compare...
|
||||
- leop(<thread>,1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- leop('789',1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- leop(nil,'abc') ...attempt to compare...
|
||||
- leop(true,'abc') ...attempt to compare...
|
||||
- leop(<table>,'abc') ...attempt to compare...
|
||||
- leop(<function>,'abc') ...attempt to compare...
|
||||
- leop(<thread>,'abc') ...attempt to compare...
|
||||
- leop(nil,'789') ...attempt to compare...
|
||||
- leop(true,'789') ...attempt to compare...
|
||||
- leop(<table>,'789') ...attempt to compare...
|
||||
- leop(<function>,'789') ...attempt to compare...
|
||||
- leop(<thread>,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- leop(1.25,nil) ...attempt to compare...
|
||||
- leop(1.25,'abc') ...attempt to compare...
|
||||
- leop(1.25,true) ...attempt to compare...
|
||||
- leop(1.25,<table>) ...attempt to compare...
|
||||
- leop(1.25,<function>) ...attempt to compare...
|
||||
- leop(1.25,<thread>) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- leop(1.25,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- leop('abc',nil) ...attempt to compare...
|
||||
- leop('789',nil) ...attempt to compare...
|
||||
- leop('abc',true) ...attempt to compare...
|
||||
- leop('789',true) ...attempt to compare...
|
||||
- leop('abc',<table>) ...attempt to compare...
|
||||
- leop('789',<table>) ...attempt to compare...
|
||||
- leop('abc',<function>) ...attempt to compare...
|
||||
- leop('789',<function>) ...attempt to compare...
|
||||
- leop('abc',<thread>) ...attempt to compare...
|
||||
- leop('789',<thread>) ...attempt to compare...
|
||||
====== >= ======
|
||||
--- checkallpass
|
||||
- geop(1.25,1.25) true
|
||||
--- checkallpass
|
||||
- geop('abc','abc') true
|
||||
- geop('789','abc') false
|
||||
- geop('abc','789') true
|
||||
- geop('789','789') true
|
||||
--- checkallerrors
|
||||
- geop(nil,1.25) ...attempt to compare...
|
||||
- geop('abc',1.25) ...attempt to compare...
|
||||
- geop(true,1.25) ...attempt to compare...
|
||||
- geop(<table>,1.25) ...attempt to compare...
|
||||
- geop(<function>,1.25) ...attempt to compare...
|
||||
- geop(<thread>,1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- geop('789',1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- geop(nil,'abc') ...attempt to compare...
|
||||
- geop(true,'abc') ...attempt to compare...
|
||||
- geop(<table>,'abc') ...attempt to compare...
|
||||
- geop(<function>,'abc') ...attempt to compare...
|
||||
- geop(<thread>,'abc') ...attempt to compare...
|
||||
- geop(nil,'789') ...attempt to compare...
|
||||
- geop(true,'789') ...attempt to compare...
|
||||
- geop(<table>,'789') ...attempt to compare...
|
||||
- geop(<function>,'789') ...attempt to compare...
|
||||
- geop(<thread>,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- geop(1.25,nil) ...attempt to compare...
|
||||
- geop(1.25,'abc') ...attempt to compare...
|
||||
- geop(1.25,true) ...attempt to compare...
|
||||
- geop(1.25,<table>) ...attempt to compare...
|
||||
- geop(1.25,<function>) ...attempt to compare...
|
||||
- geop(1.25,<thread>) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- geop(1.25,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- geop('abc',nil) ...attempt to compare...
|
||||
- geop('789',nil) ...attempt to compare...
|
||||
- geop('abc',true) ...attempt to compare...
|
||||
- geop('789',true) ...attempt to compare...
|
||||
- geop('abc',<table>) ...attempt to compare...
|
||||
- geop('789',<table>) ...attempt to compare...
|
||||
- geop('abc',<function>) ...attempt to compare...
|
||||
- geop('789',<function>) ...attempt to compare...
|
||||
- geop('abc',<thread>) ...attempt to compare...
|
||||
- geop('789',<thread>) ...attempt to compare...
|
||||
====== < ======
|
||||
--- checkallpass
|
||||
- ltop(1.25,1.25) false
|
||||
--- checkallpass
|
||||
- ltop('abc','abc') false
|
||||
- ltop('789','abc') true
|
||||
- ltop('abc','789') false
|
||||
- ltop('789','789') false
|
||||
--- checkallerrors
|
||||
- ltop(nil,1.25) ...attempt to compare...
|
||||
- ltop('abc',1.25) ...attempt to compare...
|
||||
- ltop(true,1.25) ...attempt to compare...
|
||||
- ltop(<table>,1.25) ...attempt to compare...
|
||||
- ltop(<function>,1.25) ...attempt to compare...
|
||||
- ltop(<thread>,1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- ltop('789',1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- ltop(nil,'abc') ...attempt to compare...
|
||||
- ltop(true,'abc') ...attempt to compare...
|
||||
- ltop(<table>,'abc') ...attempt to compare...
|
||||
- ltop(<function>,'abc') ...attempt to compare...
|
||||
- ltop(<thread>,'abc') ...attempt to compare...
|
||||
- ltop(nil,'789') ...attempt to compare...
|
||||
- ltop(true,'789') ...attempt to compare...
|
||||
- ltop(<table>,'789') ...attempt to compare...
|
||||
- ltop(<function>,'789') ...attempt to compare...
|
||||
- ltop(<thread>,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- ltop(1.25,nil) ...attempt to compare...
|
||||
- ltop(1.25,'abc') ...attempt to compare...
|
||||
- ltop(1.25,true) ...attempt to compare...
|
||||
- ltop(1.25,<table>) ...attempt to compare...
|
||||
- ltop(1.25,<function>) ...attempt to compare...
|
||||
- ltop(1.25,<thread>) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- ltop(1.25,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- ltop('abc',nil) ...attempt to compare...
|
||||
- ltop('789',nil) ...attempt to compare...
|
||||
- ltop('abc',true) ...attempt to compare...
|
||||
- ltop('789',true) ...attempt to compare...
|
||||
- ltop('abc',<table>) ...attempt to compare...
|
||||
- ltop('789',<table>) ...attempt to compare...
|
||||
- ltop('abc',<function>) ...attempt to compare...
|
||||
- ltop('789',<function>) ...attempt to compare...
|
||||
- ltop('abc',<thread>) ...attempt to compare...
|
||||
- ltop('789',<thread>) ...attempt to compare...
|
||||
====== > ======
|
||||
--- checkallpass
|
||||
- gtop(1.25,1.25) false
|
||||
--- checkallpass
|
||||
- gtop('abc','abc') false
|
||||
- gtop('789','abc') false
|
||||
- gtop('abc','789') true
|
||||
- gtop('789','789') false
|
||||
--- checkallerrors
|
||||
- gtop(nil,1.25) ...attempt to compare...
|
||||
- gtop('abc',1.25) ...attempt to compare...
|
||||
- gtop(true,1.25) ...attempt to compare...
|
||||
- gtop(<table>,1.25) ...attempt to compare...
|
||||
- gtop(<function>,1.25) ...attempt to compare...
|
||||
- gtop(<thread>,1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- gtop('789',1.25) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- gtop(nil,'abc') ...attempt to compare...
|
||||
- gtop(true,'abc') ...attempt to compare...
|
||||
- gtop(<table>,'abc') ...attempt to compare...
|
||||
- gtop(<function>,'abc') ...attempt to compare...
|
||||
- gtop(<thread>,'abc') ...attempt to compare...
|
||||
- gtop(nil,'789') ...attempt to compare...
|
||||
- gtop(true,'789') ...attempt to compare...
|
||||
- gtop(<table>,'789') ...attempt to compare...
|
||||
- gtop(<function>,'789') ...attempt to compare...
|
||||
- gtop(<thread>,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- gtop(1.25,nil) ...attempt to compare...
|
||||
- gtop(1.25,'abc') ...attempt to compare...
|
||||
- gtop(1.25,true) ...attempt to compare...
|
||||
- gtop(1.25,<table>) ...attempt to compare...
|
||||
- gtop(1.25,<function>) ...attempt to compare...
|
||||
- gtop(1.25,<thread>) ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- gtop(1.25,'789') ...attempt to compare...
|
||||
--- checkallerrors
|
||||
- gtop('abc',nil) ...attempt to compare...
|
||||
- gtop('789',nil) ...attempt to compare...
|
||||
- gtop('abc',true) ...attempt to compare...
|
||||
- gtop('789',true) ...attempt to compare...
|
||||
- gtop('abc',<table>) ...attempt to compare...
|
||||
- gtop('789',<table>) ...attempt to compare...
|
||||
- gtop('abc',<function>) ...attempt to compare...
|
||||
- gtop('789',<function>) ...attempt to compare...
|
||||
- gtop('abc',<thread>) ...attempt to compare...
|
||||
- gtop('789',<thread>) ...attempt to compare...
|
||||
====== [] ======
|
||||
--- checkallpass
|
||||
- bracketop(<table>,'abc')
|
||||
- bracketop(<table>,1.25)
|
||||
- bracketop(<table>,true)
|
||||
- bracketop(<table>,<table>)
|
||||
- bracketop(<table>,<function>)
|
||||
- bracketop(<table>,<thread>)
|
||||
--- checkallerrors
|
||||
- bracketop(nil,'abc') ...attempt to index...
|
||||
needcheck bracketop('abc','abc') nil
|
||||
- bracketop(1.25,'abc') ...attempt to index...
|
||||
- bracketop(true,'abc') ...attempt to index...
|
||||
- bracketop(<function>,'abc') ...attempt to index...
|
||||
- bracketop(<thread>,'abc') ...attempt to index...
|
||||
- bracketop(nil,1.25) ...attempt to index...
|
||||
needcheck bracketop('abc',1.25) nil
|
||||
- bracketop(1.25,1.25) ...attempt to index...
|
||||
- bracketop(true,1.25) ...attempt to index...
|
||||
- bracketop(<function>,1.25) ...attempt to index...
|
||||
- bracketop(<thread>,1.25) ...attempt to index...
|
||||
- bracketop(nil,true) ...attempt to index...
|
||||
needcheck bracketop('abc',true) nil
|
||||
- bracketop(1.25,true) ...attempt to index...
|
||||
- bracketop(true,true) ...attempt to index...
|
||||
- bracketop(<function>,true) ...attempt to index...
|
||||
- bracketop(<thread>,true) ...attempt to index...
|
||||
- bracketop(nil,<table>) ...attempt to index...
|
||||
needcheck bracketop('abc',<table>) nil
|
||||
- bracketop(1.25,<table>) ...attempt to index...
|
||||
- bracketop(true,<table>) ...attempt to index...
|
||||
- bracketop(<function>,<table>) ...attempt to index...
|
||||
- bracketop(<thread>,<table>) ...attempt to index...
|
||||
- bracketop(nil,<function>) ...attempt to index...
|
||||
needcheck bracketop('abc',<function>) nil
|
||||
- bracketop(1.25,<function>) ...attempt to index...
|
||||
- bracketop(true,<function>) ...attempt to index...
|
||||
- bracketop(<function>,<function>) ...attempt to index...
|
||||
- bracketop(<thread>,<function>) ...attempt to index...
|
||||
- bracketop(nil,<thread>) ...attempt to index...
|
||||
needcheck bracketop('abc',<thread>) nil
|
||||
- bracketop(1.25,<thread>) ...attempt to index...
|
||||
- bracketop(true,<thread>) ...attempt to index...
|
||||
- bracketop(<function>,<thread>) ...attempt to index...
|
||||
- bracketop(<thread>,<thread>) ...attempt to index...
|
||||
--- checkallerrors
|
||||
needcheck bracketop(<table>) nil
|
||||
====== . ======
|
||||
--- checkallpass
|
||||
- dotop(<table>,'abc')
|
||||
- dotop(<table>,1.25)
|
||||
- dotop(<table>,true)
|
||||
- dotop(<table>,<table>)
|
||||
- dotop(<table>,<function>)
|
||||
- dotop(<table>,<thread>)
|
||||
--- checkallerrors
|
||||
- dotop(nil,'abc') ...attempt to index...
|
||||
needcheck dotop('abc','abc') nil
|
||||
- dotop(1.25,'abc') ...attempt to index...
|
||||
- dotop(true,'abc') ...attempt to index...
|
||||
- dotop(<function>,'abc') ...attempt to index...
|
||||
- dotop(<thread>,'abc') ...attempt to index...
|
||||
- dotop(nil,1.25) ...attempt to index...
|
||||
needcheck dotop('abc',1.25) nil
|
||||
- dotop(1.25,1.25) ...attempt to index...
|
||||
- dotop(true,1.25) ...attempt to index...
|
||||
- dotop(<function>,1.25) ...attempt to index...
|
||||
- dotop(<thread>,1.25) ...attempt to index...
|
||||
- dotop(nil,true) ...attempt to index...
|
||||
needcheck dotop('abc',true) nil
|
||||
- dotop(1.25,true) ...attempt to index...
|
||||
- dotop(true,true) ...attempt to index...
|
||||
- dotop(<function>,true) ...attempt to index...
|
||||
- dotop(<thread>,true) ...attempt to index...
|
||||
- dotop(nil,<table>) ...attempt to index...
|
||||
needcheck dotop('abc',<table>) nil
|
||||
- dotop(1.25,<table>) ...attempt to index...
|
||||
- dotop(true,<table>) ...attempt to index...
|
||||
- dotop(<function>,<table>) ...attempt to index...
|
||||
- dotop(<thread>,<table>) ...attempt to index...
|
||||
- dotop(nil,<function>) ...attempt to index...
|
||||
needcheck dotop('abc',<function>) nil
|
||||
- dotop(1.25,<function>) ...attempt to index...
|
||||
- dotop(true,<function>) ...attempt to index...
|
||||
- dotop(<function>,<function>) ...attempt to index...
|
||||
- dotop(<thread>,<function>) ...attempt to index...
|
||||
- dotop(nil,<thread>) ...attempt to index...
|
||||
needcheck dotop('abc',<thread>) nil
|
||||
- dotop(1.25,<thread>) ...attempt to index...
|
||||
- dotop(true,<thread>) ...attempt to index...
|
||||
- dotop(<function>,<thread>) ...attempt to index...
|
||||
- dotop(<thread>,<thread>) ...attempt to index...
|
||||
--- checkallerrors
|
||||
needcheck dotop(<table>) nil
|
||||
====== and ======
|
||||
--- checkallpass
|
||||
- andop(nil,nil)
|
||||
- andop('abc',nil)
|
||||
- andop(1.25,nil)
|
||||
- andop(true,nil)
|
||||
- andop(<table>,nil)
|
||||
- andop(<function>,nil)
|
||||
- andop(<thread>,nil)
|
||||
- andop(nil,'abc')
|
||||
- andop('abc','abc') 'abc'
|
||||
- andop(1.25,'abc') 'abc'
|
||||
- andop(true,'abc') 'abc'
|
||||
- andop(<table>,'abc') 'abc'
|
||||
- andop(<function>,'abc') 'abc'
|
||||
- andop(<thread>,'abc') 'abc'
|
||||
- andop(nil,1.25)
|
||||
- andop('abc',1.25) 1.25
|
||||
- andop(1.25,1.25) 1.25
|
||||
- andop(true,1.25) 1.25
|
||||
- andop(<table>,1.25) 1.25
|
||||
- andop(<function>,1.25) 1.25
|
||||
- andop(<thread>,1.25) 1.25
|
||||
- andop(nil,true)
|
||||
- andop('abc',true) true
|
||||
- andop(1.25,true) true
|
||||
- andop(true,true) true
|
||||
- andop(<table>,true) true
|
||||
- andop(<function>,true) true
|
||||
- andop(<thread>,true) true
|
||||
- andop(nil,<table>)
|
||||
- andop('abc',<table>) 'table'
|
||||
- andop(1.25,<table>) 'table'
|
||||
- andop(true,<table>) 'table'
|
||||
- andop(<table>,<table>) 'table'
|
||||
- andop(<function>,<table>) 'table'
|
||||
- andop(<thread>,<table>) 'table'
|
||||
- andop(nil,<function>)
|
||||
- andop('abc',<function>) 'function'
|
||||
- andop(1.25,<function>) 'function'
|
||||
- andop(true,<function>) 'function'
|
||||
- andop(<table>,<function>) 'function'
|
||||
- andop(<function>,<function>) 'function'
|
||||
- andop(<thread>,<function>) 'function'
|
||||
- andop(nil,<thread>)
|
||||
- andop('abc',<thread>) 'thread'
|
||||
- andop(1.25,<thread>) 'thread'
|
||||
- andop(true,<thread>) 'thread'
|
||||
- andop(<table>,<thread>) 'thread'
|
||||
- andop(<function>,<thread>) 'thread'
|
||||
- andop(<thread>,<thread>) 'thread'
|
||||
====== or ======
|
||||
--- checkallpass
|
||||
- orop(nil,nil)
|
||||
- orop('abc',nil) 'abc'
|
||||
- orop(1.25,nil) 1.25
|
||||
- orop(true,nil) true
|
||||
- orop(<table>,nil) 'table'
|
||||
- orop(<function>,nil) 'function'
|
||||
- orop(<thread>,nil) 'thread'
|
||||
- orop(nil,'abc') 'abc'
|
||||
- orop('abc','abc') 'abc'
|
||||
- orop(1.25,'abc') 1.25
|
||||
- orop(true,'abc') true
|
||||
- orop(<table>,'abc') 'table'
|
||||
- orop(<function>,'abc') 'function'
|
||||
- orop(<thread>,'abc') 'thread'
|
||||
- orop(nil,1.25) 1.25
|
||||
- orop('abc',1.25) 'abc'
|
||||
- orop(1.25,1.25) 1.25
|
||||
- orop(true,1.25) true
|
||||
- orop(<table>,1.25) 'table'
|
||||
- orop(<function>,1.25) 'function'
|
||||
- orop(<thread>,1.25) 'thread'
|
||||
- orop(nil,true) true
|
||||
- orop('abc',true) 'abc'
|
||||
- orop(1.25,true) 1.25
|
||||
- orop(true,true) true
|
||||
- orop(<table>,true) 'table'
|
||||
- orop(<function>,true) 'function'
|
||||
- orop(<thread>,true) 'thread'
|
||||
- orop(nil,<table>) 'table'
|
||||
- orop('abc',<table>) 'abc'
|
||||
- orop(1.25,<table>) 1.25
|
||||
- orop(true,<table>) true
|
||||
- orop(<table>,<table>) 'table'
|
||||
- orop(<function>,<table>) 'function'
|
||||
- orop(<thread>,<table>) 'thread'
|
||||
- orop(nil,<function>) 'function'
|
||||
- orop('abc',<function>) 'abc'
|
||||
- orop(1.25,<function>) 1.25
|
||||
- orop(true,<function>) true
|
||||
- orop(<table>,<function>) 'table'
|
||||
- orop(<function>,<function>) 'function'
|
||||
- orop(<thread>,<function>) 'thread'
|
||||
- orop(nil,<thread>) 'thread'
|
||||
- orop('abc',<thread>) 'abc'
|
||||
- orop(1.25,<thread>) 1.25
|
||||
- orop(true,<thread>) true
|
||||
- orop(<table>,<thread>) 'table'
|
||||
- orop(<function>,<thread>) 'function'
|
||||
- orop(<thread>,<thread>) 'thread'
|
||||
====== for x=a,b,c ======
|
||||
--- checkallpass
|
||||
- forop(1,10,2)
|
||||
- forop('1.1',10,2)
|
||||
- forop(1,'10.1',2)
|
||||
- forop('1.1','10.1',2)
|
||||
- forop(1,10,'2.1')
|
||||
- forop('1.1',10,'2.1')
|
||||
- forop(1,'10.1','2.1')
|
||||
- forop('1.1','10.1','2.1')
|
||||
--- checkallerrors
|
||||
- forop(nil,10,2) ...'for' initial value must be a number...
|
||||
- forop('abc',10,2) ...'for' initial value must be a number...
|
||||
- forop(true,10,2) ...'for' initial value must be a number...
|
||||
- forop(<table>,10,2) ...'for' initial value must be a number...
|
||||
- forop(<function>,10,2) ...'for' initial value must be a number...
|
||||
- forop(<thread>,10,2) ...'for' initial value must be a number...
|
||||
- forop(nil,'10.1',2) ...'for' initial value must be a number...
|
||||
- forop('abc','10.1',2) ...'for' initial value must be a number...
|
||||
- forop(true,'10.1',2) ...'for' initial value must be a number...
|
||||
- forop(<table>,'10.1',2) ...'for' initial value must be a number...
|
||||
- forop(<function>,'10.1',2) ...'for' initial value must be a number...
|
||||
- forop(<thread>,'10.1',2) ...'for' initial value must be a number...
|
||||
- forop(nil,10,'2.1') ...'for' initial value must be a number...
|
||||
- forop('abc',10,'2.1') ...'for' initial value must be a number...
|
||||
- forop(true,10,'2.1') ...'for' initial value must be a number...
|
||||
- forop(<table>,10,'2.1') ...'for' initial value must be a number...
|
||||
- forop(<function>,10,'2.1') ...'for' initial value must be a number...
|
||||
- forop(<thread>,10,'2.1') ...'for' initial value must be a number...
|
||||
- forop(nil,'10.1','2.1') ...'for' initial value must be a number...
|
||||
- forop('abc','10.1','2.1') ...'for' initial value must be a number...
|
||||
- forop(true,'10.1','2.1') ...'for' initial value must be a number...
|
||||
- forop(<table>,'10.1','2.1') ...'for' initial value must be a number...
|
||||
- forop(<function>,'10.1','2.1') ...'for' initial value must be a number...
|
||||
- forop(<thread>,'10.1','2.1') ...'for' initial value must be a number...
|
||||
--- checkallerrors
|
||||
- forop(1,nil,2) ...'for' limit must be a number...
|
||||
- forop('1.1',nil,2) ...'for' limit must be a number...
|
||||
- forop(1,'abc',2) ...'for' limit must be a number...
|
||||
- forop('1.1','abc',2) ...'for' limit must be a number...
|
||||
- forop(1,true,2) ...'for' limit must be a number...
|
||||
- forop('1.1',true,2) ...'for' limit must be a number...
|
||||
- forop(1,<table>,2) ...'for' limit must be a number...
|
||||
- forop('1.1',<table>,2) ...'for' limit must be a number...
|
||||
- forop(1,<function>,2) ...'for' limit must be a number...
|
||||
- forop('1.1',<function>,2) ...'for' limit must be a number...
|
||||
- forop(1,<thread>,2) ...'for' limit must be a number...
|
||||
- forop('1.1',<thread>,2) ...'for' limit must be a number...
|
||||
- forop(1,nil,'2.1') ...'for' limit must be a number...
|
||||
- forop('1.1',nil,'2.1') ...'for' limit must be a number...
|
||||
- forop(1,'abc','2.1') ...'for' limit must be a number...
|
||||
- forop('1.1','abc','2.1') ...'for' limit must be a number...
|
||||
- forop(1,true,'2.1') ...'for' limit must be a number...
|
||||
- forop('1.1',true,'2.1') ...'for' limit must be a number...
|
||||
- forop(1,<table>,'2.1') ...'for' limit must be a number...
|
||||
- forop('1.1',<table>,'2.1') ...'for' limit must be a number...
|
||||
- forop(1,<function>,'2.1') ...'for' limit must be a number...
|
||||
- forop('1.1',<function>,'2.1') ...'for' limit must be a number...
|
||||
- forop(1,<thread>,'2.1') ...'for' limit must be a number...
|
||||
- forop('1.1',<thread>,'2.1') ...'for' limit must be a number...
|
||||
--- checkallerrors
|
||||
- forop(1,10,nil) ...'for' step must be a number...
|
||||
- forop('1.1',10,nil) ...'for' step must be a number...
|
||||
- forop(1,'10.1',nil) ...'for' step must be a number...
|
||||
- forop('1.1','10.1',nil) ...'for' step must be a number...
|
||||
- forop(1,10,'abc') ...'for' step must be a number...
|
||||
- forop('1.1',10,'abc') ...'for' step must be a number...
|
||||
- forop(1,'10.1','abc') ...'for' step must be a number...
|
||||
- forop('1.1','10.1','abc') ...'for' step must be a number...
|
||||
- forop(1,10,true) ...'for' step must be a number...
|
||||
- forop('1.1',10,true) ...'for' step must be a number...
|
||||
- forop(1,'10.1',true) ...'for' step must be a number...
|
||||
- forop('1.1','10.1',true) ...'for' step must be a number...
|
||||
- forop(1,10,<table>) ...'for' step must be a number...
|
||||
- forop('1.1',10,<table>) ...'for' step must be a number...
|
||||
- forop(1,'10.1',<table>) ...'for' step must be a number...
|
||||
- forop('1.1','10.1',<table>) ...'for' step must be a number...
|
||||
- forop(1,10,<function>) ...'for' step must be a number...
|
||||
- forop('1.1',10,<function>) ...'for' step must be a number...
|
||||
- forop(1,'10.1',<function>) ...'for' step must be a number...
|
||||
- forop('1.1','10.1',<function>) ...'for' step must be a number...
|
||||
- forop(1,10,<thread>) ...'for' step must be a number...
|
||||
- forop('1.1',10,<thread>) ...'for' step must be a number...
|
||||
- forop(1,'10.1',<thread>) ...'for' step must be a number...
|
||||
- forop('1.1','10.1',<thread>) ...'for' step must be a number...
|
||||
BIN
luaj-test/src/test/resources/errors/stringlibargs.out
Normal file
BIN
luaj-test/src/test/resources/errors/stringlibargs.out
Normal file
Binary file not shown.
283
luaj-test/src/test/resources/errors/tablelibargs.out
Normal file
283
luaj-test/src/test/resources/errors/tablelibargs.out
Normal file
@@ -0,0 +1,283 @@
|
||||
====== table.concat ======
|
||||
--- checkallpass
|
||||
- table.concat(<table>) '87654321'
|
||||
--- checkallpass
|
||||
- table.concat(<table>,',') '8,7,6,5,4,3,2,1'
|
||||
- table.concat(<table>,1.23) '81.2371.2361.2351.2341.2331.2321.231'
|
||||
--- checkallpass
|
||||
- table.concat(<table>,'-',2) '7-6-5-4-3-2-1'
|
||||
- table.concat(<table>,'-','2') '7-6-5-4-3-2-1'
|
||||
- table.concat(<table>,'-','2.2') '7-6-5-4-3-2-1'
|
||||
--- checkallpass
|
||||
- table.concat(<table>,'-',2,4) '7-6-5'
|
||||
- table.concat(<table>,'-',2,'4') '7-6-5'
|
||||
- table.concat(<table>,'-',2,'4.4') '7-6-5'
|
||||
--- checkallerrors
|
||||
- table.concat(nil) ...bad argument...
|
||||
- table.concat('abc') ...bad argument...
|
||||
- table.concat(1.25) ...bad argument...
|
||||
- table.concat(true) ...bad argument...
|
||||
- table.concat(<function>) ...bad argument...
|
||||
- table.concat(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.concat(<table>) ...boolean...
|
||||
--- checkallerrors
|
||||
- table.concat(<table>,true) ...bad argument...
|
||||
- table.concat(<table>,<table>) ...bad argument...
|
||||
- table.concat(<table>,<function>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.concat(<table>,'-','abc') ...bad argument...
|
||||
- table.concat(<table>,'-',true) ...bad argument...
|
||||
- table.concat(<table>,'-',<table>) ...bad argument...
|
||||
- table.concat(<table>,'-',<function>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.concat(<table>,'-',2,'abc') ...bad argument...
|
||||
- table.concat(<table>,'-',2,true) ...bad argument...
|
||||
- table.concat(<table>,'-',2,<table>) ...bad argument...
|
||||
- table.concat(<table>,'-',2,<function>) ...bad argument...
|
||||
====== table.insert ======
|
||||
--- checkallpass
|
||||
- table.insert(<table>,'abc')
|
||||
- table.insert(<table>,1.25)
|
||||
- table.insert(<table>,true)
|
||||
- table.insert(<table>,<table>)
|
||||
- table.insert(<table>,<function>)
|
||||
- table.insert(<table>,<thread>)
|
||||
--- checkallpass
|
||||
- table.insert(<table>,2,'abc')
|
||||
- table.insert(<table>,'2','abc')
|
||||
- table.insert(<table>,'2.2','abc')
|
||||
- table.insert(<table>,2,1.25)
|
||||
- table.insert(<table>,'2',1.25)
|
||||
- table.insert(<table>,'2.2',1.25)
|
||||
- table.insert(<table>,2,true)
|
||||
- table.insert(<table>,'2',true)
|
||||
- table.insert(<table>,'2.2',true)
|
||||
- table.insert(<table>,2,<table>)
|
||||
- table.insert(<table>,'2',<table>)
|
||||
- table.insert(<table>,'2.2',<table>)
|
||||
- table.insert(<table>,2,<function>)
|
||||
- table.insert(<table>,'2',<function>)
|
||||
- table.insert(<table>,'2.2',<function>)
|
||||
- table.insert(<table>,2,<thread>)
|
||||
- table.insert(<table>,'2',<thread>)
|
||||
- table.insert(<table>,'2.2',<thread>)
|
||||
--- checkallerrors
|
||||
- table.insert(nil,'abc') ...bad argument...
|
||||
- table.insert('abc','abc') ...bad argument...
|
||||
- table.insert(1.25,'abc') ...bad argument...
|
||||
- table.insert(true,'abc') ...bad argument...
|
||||
- table.insert(<function>,'abc') ...bad argument...
|
||||
- table.insert(<thread>,'abc') ...bad argument...
|
||||
- table.insert(nil,1.25) ...bad argument...
|
||||
- table.insert('abc',1.25) ...bad argument...
|
||||
- table.insert(1.25,1.25) ...bad argument...
|
||||
- table.insert(true,1.25) ...bad argument...
|
||||
- table.insert(<function>,1.25) ...bad argument...
|
||||
- table.insert(<thread>,1.25) ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.insert(<table>,'abc','abc') ...bad argument...
|
||||
- table.insert(<table>,true,'abc') ...bad argument...
|
||||
- table.insert(<table>,<table>,'abc') ...bad argument...
|
||||
- table.insert(<table>,<function>,'abc') ...bad argument...
|
||||
- table.insert(<table>,'abc',1.25) ...bad argument...
|
||||
- table.insert(<table>,true,1.25) ...bad argument...
|
||||
- table.insert(<table>,<table>,1.25) ...bad argument...
|
||||
- table.insert(<table>,<function>,1.25) ...bad argument...
|
||||
- table.insert(<table>,'abc',true) ...bad argument...
|
||||
- table.insert(<table>,true,true) ...bad argument...
|
||||
- table.insert(<table>,<table>,true) ...bad argument...
|
||||
- table.insert(<table>,<function>,true) ...bad argument...
|
||||
- table.insert(<table>,'abc',<table>) ...bad argument...
|
||||
- table.insert(<table>,true,<table>) ...bad argument...
|
||||
- table.insert(<table>,<table>,<table>) ...bad argument...
|
||||
- table.insert(<table>,<function>,<table>) ...bad argument...
|
||||
- table.insert(<table>,'abc',<function>) ...bad argument...
|
||||
- table.insert(<table>,true,<function>) ...bad argument...
|
||||
- table.insert(<table>,<table>,<function>) ...bad argument...
|
||||
- table.insert(<table>,<function>,<function>) ...bad argument...
|
||||
- table.insert(<table>,'abc',<thread>) ...bad argument...
|
||||
- table.insert(<table>,true,<thread>) ...bad argument...
|
||||
- table.insert(<table>,<table>,<thread>) ...bad argument...
|
||||
- table.insert(<table>,<function>,<thread>) ...bad argument...
|
||||
====== table.remove ======
|
||||
--- checkallpass
|
||||
- table.remove(<table>) <thread>
|
||||
--- checkallpass
|
||||
- table.remove(<table>,2) <thread>
|
||||
- table.remove(<table>,'2') <thread>
|
||||
- table.remove(<table>,'2.2') <thread>
|
||||
--- checkallerrors
|
||||
- table.remove(nil) ...bad argument...
|
||||
- table.remove('abc') ...bad argument...
|
||||
- table.remove(1.25) ...bad argument...
|
||||
- table.remove(true) ...bad argument...
|
||||
- table.remove(<function>) ...bad argument...
|
||||
- table.remove(<thread>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.remove(nil,2) ...bad argument...
|
||||
- table.remove('abc',2) ...bad argument...
|
||||
- table.remove(1.25,2) ...bad argument...
|
||||
- table.remove(true,2) ...bad argument...
|
||||
- table.remove(<function>,2) ...bad argument...
|
||||
- table.remove(<thread>,2) ...bad argument...
|
||||
- table.remove(nil,'2') ...bad argument...
|
||||
- table.remove('abc','2') ...bad argument...
|
||||
- table.remove(1.25,'2') ...bad argument...
|
||||
- table.remove(true,'2') ...bad argument...
|
||||
- table.remove(<function>,'2') ...bad argument...
|
||||
- table.remove(<thread>,'2') ...bad argument...
|
||||
- table.remove(nil,'2.2') ...bad argument...
|
||||
- table.remove('abc','2.2') ...bad argument...
|
||||
- table.remove(1.25,'2.2') ...bad argument...
|
||||
- table.remove(true,'2.2') ...bad argument...
|
||||
- table.remove(<function>,'2.2') ...bad argument...
|
||||
- table.remove(<thread>,'2.2') ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.remove(<table>,'abc') ...bad argument...
|
||||
- table.remove(<table>,true) ...bad argument...
|
||||
- table.remove(<table>,<table>) ...bad argument...
|
||||
- table.remove(<table>,<function>) ...bad argument...
|
||||
====== table.sort ======
|
||||
--- checkallpass
|
||||
- table.sort(<table>,nil)
|
||||
- table.sort(<table>,<function>)
|
||||
--- checkallerrors
|
||||
- table.sort(<table>) ...attempt to...
|
||||
--- checkallerrors
|
||||
- table.sort(nil,nil) ...bad argument...
|
||||
- table.sort('abc',nil) ...bad argument...
|
||||
- table.sort(1.25,nil) ...bad argument...
|
||||
- table.sort(true,nil) ...bad argument...
|
||||
- table.sort(<function>,nil) ...bad argument...
|
||||
- table.sort(<thread>,nil) ...bad argument...
|
||||
- table.sort(nil,<function>) ...bad argument...
|
||||
- table.sort('abc',<function>) ...bad argument...
|
||||
- table.sort(1.25,<function>) ...bad argument...
|
||||
- table.sort(true,<function>) ...bad argument...
|
||||
- table.sort(<function>,<function>) ...bad argument...
|
||||
- table.sort(<thread>,<function>) ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.sort(<table>,'abc') ...bad argument...
|
||||
- table.sort(<table>,1.25) ...bad argument...
|
||||
- table.sort(<table>,true) ...bad argument...
|
||||
- table.sort(<table>,<table>) ...bad argument...
|
||||
====== table_get - tbl[key] ======
|
||||
--- checkallpass
|
||||
- table_get(<table>,nil)
|
||||
- table_get(<table>,'abc')
|
||||
- table_get(<table>,1.25)
|
||||
- table_get(<table>,true)
|
||||
- table_get(<table>,<table>)
|
||||
- table_get(<table>,<function>)
|
||||
- table_get(<table>,<thread>)
|
||||
====== table_set - tbl[key]=val ======
|
||||
--- checkallpass
|
||||
- table_set(<table>,'abc',nil)
|
||||
- table_set(<table>,1.25,nil)
|
||||
- table_set(<table>,true,nil)
|
||||
- table_set(<table>,<table>,nil)
|
||||
- table_set(<table>,<function>,nil)
|
||||
- table_set(<table>,<thread>,nil)
|
||||
- table_set(<table>,'abc','abc')
|
||||
- table_set(<table>,1.25,'abc')
|
||||
- table_set(<table>,true,'abc')
|
||||
- table_set(<table>,<table>,'abc')
|
||||
- table_set(<table>,<function>,'abc')
|
||||
- table_set(<table>,<thread>,'abc')
|
||||
- table_set(<table>,'abc',1.25)
|
||||
- table_set(<table>,1.25,1.25)
|
||||
- table_set(<table>,true,1.25)
|
||||
- table_set(<table>,<table>,1.25)
|
||||
- table_set(<table>,<function>,1.25)
|
||||
- table_set(<table>,<thread>,1.25)
|
||||
- table_set(<table>,'abc',true)
|
||||
- table_set(<table>,1.25,true)
|
||||
- table_set(<table>,true,true)
|
||||
- table_set(<table>,<table>,true)
|
||||
- table_set(<table>,<function>,true)
|
||||
- table_set(<table>,<thread>,true)
|
||||
- table_set(<table>,'abc',<table>)
|
||||
- table_set(<table>,1.25,<table>)
|
||||
- table_set(<table>,true,<table>)
|
||||
- table_set(<table>,<table>,<table>)
|
||||
- table_set(<table>,<function>,<table>)
|
||||
- table_set(<table>,<thread>,<table>)
|
||||
- table_set(<table>,'abc',<function>)
|
||||
- table_set(<table>,1.25,<function>)
|
||||
- table_set(<table>,true,<function>)
|
||||
- table_set(<table>,<table>,<function>)
|
||||
- table_set(<table>,<function>,<function>)
|
||||
- table_set(<table>,<thread>,<function>)
|
||||
- table_set(<table>,'abc',<thread>)
|
||||
- table_set(<table>,1.25,<thread>)
|
||||
- table_set(<table>,true,<thread>)
|
||||
- table_set(<table>,<table>,<thread>)
|
||||
- table_set(<table>,<function>,<thread>)
|
||||
- table_set(<table>,<thread>,<thread>)
|
||||
--- checkallerrors
|
||||
- table_set_nil_key(<table>,nil) ...table index...
|
||||
- table_set_nil_key(<table>,'abc') ...table index...
|
||||
- table_set_nil_key(<table>,1.25) ...table index...
|
||||
- table_set_nil_key(<table>,true) ...table index...
|
||||
- table_set_nil_key(<table>,<table>) ...table index...
|
||||
- table_set_nil_key(<table>,<function>) ...table index...
|
||||
- table_set_nil_key(<table>,<thread>) ...table index...
|
||||
====== table.unpack ======
|
||||
--- checkallpass
|
||||
- table.unpack(<table>) 'abc',<function>,<function>,<function>,<table>,<table>,<table>,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,<table>,<function>
|
||||
--- checkallpass
|
||||
- table.unpack(<table>,3) <function>,<function>,<table>,<table>,<table>,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,<table>,<function>
|
||||
- table.unpack(<table>,'5') <table>,<table>,<table>,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,<table>,<function>
|
||||
--- checkallpass
|
||||
- table.unpack(<table>,3,1.25)
|
||||
- table.unpack(<table>,'5',1.25)
|
||||
- table.unpack(<table>,3,'7') <function>,<function>,<table>,<table>,<table>
|
||||
- table.unpack(<table>,'5','7') <table>,<table>,<table>
|
||||
--- checkallerrors
|
||||
- table.unpack(nil,1.25,1.25) ...bad argument...
|
||||
- table.unpack('abc',1.25,1.25) ...bad argument...
|
||||
- table.unpack(1.25,1.25,1.25) ...bad argument...
|
||||
- table.unpack(true,1.25,1.25) ...bad argument...
|
||||
- table.unpack(<function>,1.25,1.25) ...bad argument...
|
||||
- table.unpack(<thread>,1.25,1.25) ...bad argument...
|
||||
- table.unpack(nil,'789',1.25) ...bad argument...
|
||||
- table.unpack('abc','789',1.25) ...bad argument...
|
||||
- table.unpack(1.25,'789',1.25) ...bad argument...
|
||||
- table.unpack(true,'789',1.25) ...bad argument...
|
||||
- table.unpack(<function>,'789',1.25) ...bad argument...
|
||||
- table.unpack(<thread>,'789',1.25) ...bad argument...
|
||||
- table.unpack(nil,1.25,'789') ...bad argument...
|
||||
- table.unpack('abc',1.25,'789') ...bad argument...
|
||||
- table.unpack(1.25,1.25,'789') ...bad argument...
|
||||
- table.unpack(true,1.25,'789') ...bad argument...
|
||||
- table.unpack(<function>,1.25,'789') ...bad argument...
|
||||
- table.unpack(<thread>,1.25,'789') ...bad argument...
|
||||
- table.unpack(nil,'789','789') ...bad argument...
|
||||
- table.unpack('abc','789','789') ...bad argument...
|
||||
- table.unpack(1.25,'789','789') ...bad argument...
|
||||
- table.unpack(true,'789','789') ...bad argument...
|
||||
- table.unpack(<function>,'789','789') ...bad argument...
|
||||
- table.unpack(<thread>,'789','789') ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.unpack(<table>,'abc',1.25) ...bad argument...
|
||||
- table.unpack(<table>,true,1.25) ...bad argument...
|
||||
- table.unpack(<table>,<table>,1.25) ...bad argument...
|
||||
- table.unpack(<table>,<function>,1.25) ...bad argument...
|
||||
- table.unpack(<table>,<thread>,1.25) ...bad argument...
|
||||
- table.unpack(<table>,'abc','789') ...bad argument...
|
||||
- table.unpack(<table>,true,'789') ...bad argument...
|
||||
- table.unpack(<table>,<table>,'789') ...bad argument...
|
||||
- table.unpack(<table>,<function>,'789') ...bad argument...
|
||||
- table.unpack(<table>,<thread>,'789') ...bad argument...
|
||||
--- checkallerrors
|
||||
- table.unpack(<table>,1.25,'abc') ...bad argument...
|
||||
- table.unpack(<table>,'789','abc') ...bad argument...
|
||||
- table.unpack(<table>,1.25,true) ...bad argument...
|
||||
- table.unpack(<table>,'789',true) ...bad argument...
|
||||
- table.unpack(<table>,1.25,<table>) ...bad argument...
|
||||
- table.unpack(<table>,'789',<table>) ...bad argument...
|
||||
- table.unpack(<table>,1.25,<function>) ...bad argument...
|
||||
- table.unpack(<table>,'789',<function>) ...bad argument...
|
||||
- table.unpack(<table>,1.25,<thread>) ...bad argument...
|
||||
- table.unpack(<table>,'789',<thread>) ...bad argument...
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/all.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/all.lc
Normal file
Binary file not shown.
236
luaj-test/src/test/resources/lua5.2.1-tests/all.lua
Normal file
236
luaj-test/src/test/resources/lua5.2.1-tests/all.lua
Normal file
@@ -0,0 +1,236 @@
|
||||
#!../lua
|
||||
|
||||
local version = "Lua 5.2"
|
||||
if _VERSION ~= version then
|
||||
io.stderr:write("\nThis test suite is for ", version, ", not for ", _VERSION,
|
||||
"\nExiting tests\n")
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
-- next variables control the execution of some tests
|
||||
-- true means no test (so an undefined variable does not skip a test)
|
||||
-- defaults are for Linux; test everything
|
||||
|
||||
_soft = false -- true to avoid long or memory consuming tests
|
||||
_port = false -- true to avoid non-portable tests
|
||||
_no32 = false -- true to avoid tests that assume 32 bits
|
||||
_nomsg = false -- true to avoid messages about tests not performed
|
||||
_noposix = false -- false assumes LUA_USE_POSIX
|
||||
_nolonglong = false -- false assumes LUA_USE_LONGLONG
|
||||
_noformatA = false -- false assumes LUA_USE_AFORMAT
|
||||
|
||||
|
||||
local usertests = rawget(_G, "_U")
|
||||
|
||||
if usertests then
|
||||
-- tests for sissies ;) Avoid problems
|
||||
_soft = true
|
||||
_port = true
|
||||
_no32 = true
|
||||
_nomsg = true
|
||||
_noposix = true
|
||||
_nolonglong = true
|
||||
_noformatA = true;
|
||||
end
|
||||
|
||||
-- no "internal" tests for user tests
|
||||
if usertests then T = nil end
|
||||
|
||||
T = rawget(_G, "T") -- avoid problems with 'strict' module
|
||||
|
||||
package.path = "?;./?.lua" .. package.path
|
||||
|
||||
math.randomseed(0)
|
||||
|
||||
collectgarbage("setstepmul", 200)
|
||||
collectgarbage("setpause", 200)
|
||||
|
||||
|
||||
--[=[
|
||||
example of a long [comment],
|
||||
[[spanning several [lines]]]
|
||||
|
||||
]=]
|
||||
|
||||
print("current path:\n****" .. package.path .. "****\n")
|
||||
|
||||
|
||||
local c = os.clock()
|
||||
|
||||
local collectgarbage = collectgarbage
|
||||
|
||||
do
|
||||
|
||||
-- track messages for tests not performed
|
||||
local msgs = {}
|
||||
function Message (m)
|
||||
if not _nomsg then
|
||||
print(m)
|
||||
msgs[#msgs+1] = string.sub(m, 3, -3)
|
||||
end
|
||||
end
|
||||
|
||||
assert(os.setlocale"C")
|
||||
|
||||
local T,print,format,write,assert,type,unpack,floor =
|
||||
T,print,string.format,io.write,assert,type,table.unpack,math.floor
|
||||
|
||||
-- use K for 1000 and M for 1000000 (not 2^10 -- 2^20)
|
||||
local function F (m)
|
||||
local function round (m)
|
||||
m = m + 0.04999
|
||||
return m - (m % 0.1) -- keep one decimal digit
|
||||
end
|
||||
if m < 1000 then return m
|
||||
else
|
||||
m = m / 1000
|
||||
if m < 1000 then return round(m).."K"
|
||||
else
|
||||
return round(m/1000).."M"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local showmem
|
||||
if not T then
|
||||
local max = 0
|
||||
showmem = function ()
|
||||
local m = collectgarbage("count") * 1024
|
||||
max = (m > max) and m or max
|
||||
print(format(" ---- total memory: %s, max memory: %s ----\n",
|
||||
F(m), F(max)))
|
||||
end
|
||||
else
|
||||
showmem = function ()
|
||||
T.checkmemory()
|
||||
local total, numblocks, maxmem = T.totalmem()
|
||||
local count = collectgarbage("count")
|
||||
print(format(
|
||||
"\n ---- total memory: %s (%.0fK), max use: %s, blocks: %d\n",
|
||||
F(total), count, F(maxmem), numblocks))
|
||||
print(format("\t(strings: %d, tables: %d, functions: %d, "..
|
||||
"\n\tudata: %d, threads: %d)",
|
||||
T.totalmem"string", T.totalmem"table", T.totalmem"function",
|
||||
T.totalmem"userdata", T.totalmem"thread"))
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
-- redefine dofile to run files through dump/undump
|
||||
--
|
||||
local function report (n) print("\n***** FILE '"..n.."'*****") end
|
||||
local olddofile = dofile
|
||||
dofile = function (n)
|
||||
showmem()
|
||||
report(n)
|
||||
local f = assert(loadfile(n))
|
||||
local b = string.dump(f)
|
||||
f = assert(load(b))
|
||||
return f()
|
||||
end
|
||||
|
||||
dofile('main.lua')
|
||||
|
||||
do
|
||||
local eph = setmetatable({}, {__mode = "k"}) -- create an ephemeron table
|
||||
local next, setmetatable, stderr = next, setmetatable, io.stderr
|
||||
local mt = {}
|
||||
-- each time a table is collected, create a new one to be
|
||||
-- collected next cycle
|
||||
mt.__gc = function (o)
|
||||
stderr:write'.' -- mark progress
|
||||
-- assert(eph[o]() == o and next(eph) == o and next(eph, o) == nil)
|
||||
local n = setmetatable({}, mt) -- replicate object
|
||||
eph[n] = function () return n end
|
||||
o = nil
|
||||
local a,b,c,d,e = nil -- erase 'o' from the stack
|
||||
end
|
||||
local n = setmetatable({}, mt) -- replicate object
|
||||
eph[n] = function () return n end
|
||||
end
|
||||
|
||||
report"gc.lua"
|
||||
local f = assert(loadfile('gc.lua'))
|
||||
f()
|
||||
|
||||
collectgarbage("generational")
|
||||
dofile('db.lua')
|
||||
assert(dofile('calls.lua') == deep and deep)
|
||||
olddofile('strings.lua')
|
||||
olddofile('literals.lua')
|
||||
assert(dofile('attrib.lua') == 27)
|
||||
|
||||
collectgarbage("incremental") -- redo some tests in incremental mode
|
||||
olddofile('strings.lua')
|
||||
olddofile('literals.lua')
|
||||
dofile('constructs.lua')
|
||||
dofile('api.lua')
|
||||
|
||||
collectgarbage("generational") -- back to generational mode
|
||||
collectgarbage("setpause", 200)
|
||||
collectgarbage("setmajorinc", 500)
|
||||
assert(dofile('locals.lua') == 5)
|
||||
dofile('constructs.lua')
|
||||
dofile('code.lua')
|
||||
if not _G._soft then
|
||||
report('big.lua')
|
||||
local f = coroutine.wrap(assert(loadfile('big.lua')))
|
||||
assert(f() == 'b')
|
||||
assert(f() == 'a')
|
||||
end
|
||||
dofile('nextvar.lua')
|
||||
dofile('pm.lua')
|
||||
dofile('api.lua')
|
||||
assert(dofile('events.lua') == 12)
|
||||
dofile('vararg.lua')
|
||||
dofile('closure.lua')
|
||||
dofile('coroutine.lua')
|
||||
dofile('goto.lua')
|
||||
dofile('errors.lua')
|
||||
dofile('math.lua')
|
||||
dofile('sort.lua')
|
||||
dofile('bitwise.lua')
|
||||
assert(dofile('verybig.lua') == 10); collectgarbage()
|
||||
dofile('files.lua')
|
||||
|
||||
if #msgs > 0 then
|
||||
print("\ntests not performed:")
|
||||
for i=1,#msgs do
|
||||
print(msgs[i])
|
||||
end
|
||||
print()
|
||||
end
|
||||
|
||||
print("final OK !!!")
|
||||
|
||||
local debug = require "debug"
|
||||
|
||||
debug.sethook(function (a) assert(type(a) == 'string') end, "cr")
|
||||
|
||||
-- to survive outside block
|
||||
_G.showmem = showmem
|
||||
|
||||
end
|
||||
|
||||
local _G, showmem, print, format, clock =
|
||||
_G, showmem, print, string.format, os.clock
|
||||
|
||||
-- erase (almost) all globals
|
||||
print('cleaning all!!!!')
|
||||
for n in pairs(_G) do
|
||||
if not ({___Glob = 1, tostring = 1})[n] then
|
||||
_G[n] = nil
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
collectgarbage();showmem()
|
||||
|
||||
print(format("\n\ntotal time: %.2f\n", clock()-c))
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/api.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/api.lc
Normal file
Binary file not shown.
1009
luaj-test/src/test/resources/lua5.2.1-tests/api.lua
Normal file
1009
luaj-test/src/test/resources/lua5.2.1-tests/api.lua
Normal file
File diff suppressed because it is too large
Load Diff
BIN
luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc
Normal file
Binary file not shown.
420
luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua
Normal file
420
luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua
Normal file
@@ -0,0 +1,420 @@
|
||||
-- The tests for 'require' assume some specific directories and libraries;
|
||||
-- better to avoid them in generic machines
|
||||
|
||||
if not _port then --[
|
||||
|
||||
print "testing require"
|
||||
|
||||
assert(require"string" == string)
|
||||
assert(require"math" == math)
|
||||
assert(require"table" == table)
|
||||
assert(require"io" == io)
|
||||
assert(require"os" == os)
|
||||
assert(require"coroutine" == coroutine)
|
||||
|
||||
assert(type(package.path) == "string")
|
||||
assert(type(package.cpath) == "string")
|
||||
assert(type(package.loaded) == "table")
|
||||
assert(type(package.preload) == "table")
|
||||
|
||||
assert(type(package.config) == "string")
|
||||
print("package config: "..string.gsub(package.config, "\n", "|"))
|
||||
|
||||
do
|
||||
-- create a path with 'max' templates,
|
||||
-- each with 1-10 repetitions of '?'
|
||||
local max = 2000
|
||||
local t = {}
|
||||
for i = 1,max do t[i] = string.rep("?", i%10 + 1) end
|
||||
t[#t + 1] = ";" -- empty template
|
||||
local path = table.concat(t, ";")
|
||||
-- use that path in a search
|
||||
local s, err = package.searchpath("xuxu", path)
|
||||
-- search fails; check that message has an occurence of
|
||||
-- '??????????' with ? replaced by xuxu and at least 'max' lines
|
||||
assert(not s and
|
||||
string.find(err, string.rep("xuxu", 10)) and
|
||||
#string.gsub(err, "[^\n]", "") >= max)
|
||||
-- path with one very long template
|
||||
local path = string.rep("?", max)
|
||||
local s, err = package.searchpath("xuxu", path)
|
||||
assert(not s and string.find(err, string.rep('xuxu', max)))
|
||||
end
|
||||
|
||||
do
|
||||
local oldpath = package.path
|
||||
package.path = {}
|
||||
local s, err = pcall(require, "no-such-file")
|
||||
assert(not s and string.find(err, "package.path"))
|
||||
package.path = oldpath
|
||||
end
|
||||
|
||||
print('+')
|
||||
|
||||
-- auxiliary directory with C modules and temporary files
|
||||
local DIR = "libs/"
|
||||
|
||||
-- prepend DIR to a name
|
||||
local function D (x) return DIR .. x end
|
||||
|
||||
|
||||
local function createfiles (files, preextras, posextras)
|
||||
for n,c in pairs(files) do
|
||||
io.output(D(n))
|
||||
io.write(string.format(preextras, n))
|
||||
io.write(c)
|
||||
io.write(string.format(posextras, n))
|
||||
io.close(io.output())
|
||||
end
|
||||
end
|
||||
|
||||
function removefiles (files)
|
||||
for n in pairs(files) do
|
||||
os.remove(D(n))
|
||||
end
|
||||
end
|
||||
|
||||
local files = {
|
||||
["names.lua"] = "do return {...} end\n",
|
||||
["err.lua"] = "B = 15; a = a + 1;",
|
||||
["A.lua"] = "",
|
||||
["B.lua"] = "assert(...=='B');require 'A'",
|
||||
["A.lc"] = "",
|
||||
["A"] = "",
|
||||
["L"] = "",
|
||||
["XXxX"] = "",
|
||||
["C.lua"] = "package.loaded[...] = 25; require'C'"
|
||||
}
|
||||
|
||||
AA = nil
|
||||
local extras = [[
|
||||
NAME = '%s'
|
||||
REQUIRED = ...
|
||||
return AA]]
|
||||
|
||||
createfiles(files, "", extras)
|
||||
|
||||
-- testing explicit "dir" separator in 'searchpath'
|
||||
assert(package.searchpath("C.lua", D"?", "", "") == D"C.lua")
|
||||
assert(package.searchpath("C.lua", D"?", ".", ".") == D"C.lua")
|
||||
assert(package.searchpath("--x-", D"?", "-", "X") == D"XXxX")
|
||||
assert(package.searchpath("---xX", D"?", "---", "XX") == D"XXxX")
|
||||
assert(package.searchpath(D"C.lua", "?", "/") == D"C.lua")
|
||||
assert(package.searchpath(".\\C.lua", D"?", "\\") == D"./C.lua")
|
||||
|
||||
local oldpath = package.path
|
||||
|
||||
package.path = string.gsub("D/?.lua;D/?.lc;D/?;D/??x?;D/L", "D/", DIR)
|
||||
|
||||
local try = function (p, n, r)
|
||||
NAME = nil
|
||||
local rr = require(p)
|
||||
assert(NAME == n)
|
||||
assert(REQUIRED == p)
|
||||
assert(rr == r)
|
||||
end
|
||||
|
||||
a = require"names"
|
||||
assert(a[1] == "names" and a[2] == D"names.lua")
|
||||
|
||||
_G.a = nil
|
||||
assert(not pcall(require, "err"))
|
||||
assert(B == 15)
|
||||
|
||||
assert(package.searchpath("C", package.path) == D"C.lua")
|
||||
assert(require"C" == 25)
|
||||
assert(require"C" == 25)
|
||||
AA = nil
|
||||
try('B', 'B.lua', true)
|
||||
assert(package.loaded.B)
|
||||
assert(require"B" == true)
|
||||
assert(package.loaded.A)
|
||||
assert(require"C" == 25)
|
||||
package.loaded.A = nil
|
||||
try('B', nil, true) -- should not reload package
|
||||
try('A', 'A.lua', true)
|
||||
package.loaded.A = nil
|
||||
os.remove(D'A.lua')
|
||||
AA = {}
|
||||
try('A', 'A.lc', AA) -- now must find second option
|
||||
assert(package.searchpath("A", package.path) == D"A.lc")
|
||||
assert(require("A") == AA)
|
||||
AA = false
|
||||
try('K', 'L', false) -- default option
|
||||
try('K', 'L', false) -- default option (should reload it)
|
||||
assert(rawget(_G, "_REQUIREDNAME") == nil)
|
||||
|
||||
AA = "x"
|
||||
try("X", "XXxX", AA)
|
||||
|
||||
|
||||
removefiles(files)
|
||||
|
||||
|
||||
-- testing require of sub-packages
|
||||
|
||||
local _G = _G
|
||||
|
||||
package.path = string.gsub("D/?.lua;D/?/init.lua", "D/", DIR)
|
||||
|
||||
files = {
|
||||
["P1/init.lua"] = "AA = 10",
|
||||
["P1/xuxu.lua"] = "AA = 20",
|
||||
}
|
||||
|
||||
createfiles(files, "_ENV = {}\n", "\nreturn _ENV\n")
|
||||
AA = 0
|
||||
|
||||
local m = assert(require"P1")
|
||||
assert(AA == 0 and m.AA == 10)
|
||||
assert(require"P1" == m)
|
||||
assert(require"P1" == m)
|
||||
|
||||
assert(package.searchpath("P1.xuxu", package.path) == D"P1/xuxu.lua")
|
||||
m.xuxu = assert(require"P1.xuxu")
|
||||
assert(AA == 0 and m.xuxu.AA == 20)
|
||||
assert(require"P1.xuxu" == m.xuxu)
|
||||
assert(require"P1.xuxu" == m.xuxu)
|
||||
assert(require"P1" == m and m.AA == 10)
|
||||
|
||||
|
||||
removefiles(files)
|
||||
|
||||
|
||||
package.path = ""
|
||||
assert(not pcall(require, "file_does_not_exist"))
|
||||
package.path = "??\0?"
|
||||
assert(not pcall(require, "file_does_not_exist1"))
|
||||
|
||||
package.path = oldpath
|
||||
|
||||
-- check 'require' error message
|
||||
local fname = "file_does_not_exist2"
|
||||
local m, err = pcall(require, fname)
|
||||
for t in string.gmatch(package.path..";"..package.cpath, "[^;]+") do
|
||||
t = string.gsub(t, "?", fname)
|
||||
assert(string.find(err, t, 1, true))
|
||||
end
|
||||
|
||||
|
||||
local function import(...)
|
||||
local f = {...}
|
||||
return function (m)
|
||||
for i=1, #f do m[f[i]] = _G[f[i]] end
|
||||
end
|
||||
end
|
||||
|
||||
-- cannot change environment of a C function
|
||||
assert(not pcall(module, 'XUXU'))
|
||||
|
||||
|
||||
|
||||
-- testing require of C libraries
|
||||
|
||||
|
||||
local p = "" -- On Mac OS X, redefine this to "_"
|
||||
|
||||
-- check whether loadlib works in this system
|
||||
local st, err, when = package.loadlib(D"lib1.so", "*")
|
||||
if not st then
|
||||
local f, err, when = package.loadlib("donotexist", p.."xuxu")
|
||||
assert(not f and type(err) == "string" and when == "absent")
|
||||
;(Message or print)('\a\n >>> cannot load dynamic library <<<\n\a')
|
||||
print(err, when)
|
||||
else
|
||||
-- tests for loadlib
|
||||
local f = assert(package.loadlib(D"lib1.so", p.."onefunction"))
|
||||
local a, b = f(15, 25)
|
||||
assert(a == 25 and b == 15)
|
||||
|
||||
f = assert(package.loadlib(D"lib1.so", p.."anotherfunc"))
|
||||
assert(f(10, 20) == "1020\n")
|
||||
|
||||
-- check error messages
|
||||
local f, err, when = package.loadlib(D"lib1.so", p.."xuxu")
|
||||
assert(not f and type(err) == "string" and when == "init")
|
||||
f, err, when = package.loadlib("donotexist", p.."xuxu")
|
||||
assert(not f and type(err) == "string" and when == "open")
|
||||
|
||||
-- symbols from 'lib1' must be visible to other libraries
|
||||
f = assert(package.loadlib(D"lib11.so", p.."luaopen_lib11"))
|
||||
assert(f() == "exported")
|
||||
|
||||
-- test C modules with prefixes in names
|
||||
package.cpath = D"?.so"
|
||||
local lib2 = require"v-lib2"
|
||||
-- check correct access to global environment and correct
|
||||
-- parameters
|
||||
assert(_ENV.x == "v-lib2" and _ENV.y == D"v-lib2.so")
|
||||
assert(lib2.id("x") == "x")
|
||||
|
||||
-- test C submodules
|
||||
local fs = require"lib1.sub"
|
||||
assert(_ENV.x == "lib1.sub" and _ENV.y == D"lib1.so")
|
||||
assert(fs.id(45) == 45)
|
||||
end
|
||||
|
||||
_ENV = _G
|
||||
|
||||
|
||||
-- testing preload
|
||||
|
||||
do
|
||||
local p = package
|
||||
package = {}
|
||||
p.preload.pl = function (...)
|
||||
local _ENV = {...}
|
||||
function xuxu (x) return x+20 end
|
||||
return _ENV
|
||||
end
|
||||
|
||||
local pl = require"pl"
|
||||
assert(require"pl" == pl)
|
||||
assert(pl.xuxu(10) == 30)
|
||||
assert(pl[1] == "pl" and pl[2] == nil)
|
||||
|
||||
package = p
|
||||
assert(type(package.path) == "string")
|
||||
end
|
||||
|
||||
print('+')
|
||||
|
||||
end --]
|
||||
|
||||
print("testing assignments, logical operators, and constructors")
|
||||
|
||||
local res, res2 = 27
|
||||
|
||||
a, b = 1, 2+3
|
||||
assert(a==1 and b==5)
|
||||
a={}
|
||||
function f() return 10, 11, 12 end
|
||||
a.x, b, a[1] = 1, 2, f()
|
||||
assert(a.x==1 and b==2 and a[1]==10)
|
||||
a[f()], b, a[f()+3] = f(), a, 'x'
|
||||
assert(a[10] == 10 and b == a and a[13] == 'x')
|
||||
|
||||
do
|
||||
local f = function (n) local x = {}; for i=1,n do x[i]=i end;
|
||||
return table.unpack(x) end;
|
||||
local a,b,c
|
||||
a,b = 0, f(1)
|
||||
assert(a == 0 and b == 1)
|
||||
A,b = 0, f(1)
|
||||
assert(A == 0 and b == 1)
|
||||
a,b,c = 0,5,f(4)
|
||||
assert(a==0 and b==5 and c==1)
|
||||
a,b,c = 0,5,f(0)
|
||||
assert(a==0 and b==5 and c==nil)
|
||||
end
|
||||
|
||||
a, b, c, d = 1 and nil, 1 or nil, (1 and (nil or 1)), 6
|
||||
assert(not a and b and c and d==6)
|
||||
|
||||
d = 20
|
||||
a, b, c, d = f()
|
||||
assert(a==10 and b==11 and c==12 and d==nil)
|
||||
a,b = f(), 1, 2, 3, f()
|
||||
assert(a==10 and b==1)
|
||||
|
||||
assert(a<b == false and a>b == true)
|
||||
assert((10 and 2) == 2)
|
||||
assert((10 or 2) == 10)
|
||||
assert((10 or assert(nil)) == 10)
|
||||
assert(not (nil and assert(nil)))
|
||||
assert((nil or "alo") == "alo")
|
||||
assert((nil and 10) == nil)
|
||||
assert((false and 10) == false)
|
||||
assert((true or 10) == true)
|
||||
assert((false or 10) == 10)
|
||||
assert(false ~= nil)
|
||||
assert(nil ~= false)
|
||||
assert(not nil == true)
|
||||
assert(not not nil == false)
|
||||
assert(not not 1 == true)
|
||||
assert(not not a == true)
|
||||
assert(not not (6 or nil) == true)
|
||||
assert(not not (nil and 56) == false)
|
||||
assert(not not (nil and true) == false)
|
||||
|
||||
assert({} ~= {})
|
||||
print('+')
|
||||
|
||||
a = {}
|
||||
a[true] = 20
|
||||
a[false] = 10
|
||||
assert(a[1<2] == 20 and a[1>2] == 10)
|
||||
|
||||
function f(a) return a end
|
||||
|
||||
local a = {}
|
||||
for i=3000,-3000,-1 do a[i] = i; end
|
||||
a[10e30] = "alo"; a[true] = 10; a[false] = 20
|
||||
assert(a[10e30] == 'alo' and a[not 1] == 20 and a[10<20] == 10)
|
||||
for i=3000,-3000,-1 do assert(a[i] == i); end
|
||||
a[print] = assert
|
||||
a[f] = print
|
||||
a[a] = a
|
||||
assert(a[a][a][a][a][print] == assert)
|
||||
a[print](a[a[f]] == a[print])
|
||||
assert(not pcall(function () a[nil] = 10 end))
|
||||
assert(a[nil] == nil)
|
||||
a = nil
|
||||
|
||||
a = {10,9,8,7,6,5,4,3,2; [-3]='a', [f]=print, a='a', b='ab'}
|
||||
a, a.x, a.y = a, a[-3]
|
||||
assert(a[1]==10 and a[-3]==a.a and a[f]==print and a.x=='a' and not a.y)
|
||||
a[1], f(a)[2], b, c = {['alo']=assert}, 10, a[1], a[f], 6, 10, 23, f(a), 2
|
||||
a[1].alo(a[2]==10 and b==10 and c==print)
|
||||
|
||||
a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12;
|
||||
a[2^32] = 13; a[-2^32] = 14; a[2^32+1] = 15; a[10^33] = 16;
|
||||
|
||||
assert(a[2^31] == 10 and a[2^31+1] == 11 and a[-2^31] == 12 and
|
||||
a[2^32] == 13 and a[-2^32] == 14 and a[2^32+1] == 15 and
|
||||
a[10^33] == 16)
|
||||
|
||||
a = nil
|
||||
|
||||
|
||||
-- test conflicts in multiple assignment
|
||||
do
|
||||
local a,i,j,b
|
||||
a = {'a', 'b'}; i=1; j=2; b=a
|
||||
i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i
|
||||
assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and
|
||||
b[3] == 1)
|
||||
end
|
||||
|
||||
-- repeat test with upvalues
|
||||
do
|
||||
local a,i,j,b
|
||||
a = {'a', 'b'}; i=1; j=2; b=a
|
||||
local function foo ()
|
||||
i, a[i], a, j, a[j], a[i+j] = j, i, i, b, j, i
|
||||
end
|
||||
foo()
|
||||
assert(i == 2 and b[1] == 1 and a == 1 and j == b and b[2] == 2 and
|
||||
b[3] == 1)
|
||||
local t = {}
|
||||
(function (a) t[a], a = 10, 20 end)(1);
|
||||
assert(t[1] == 10)
|
||||
end
|
||||
|
||||
-- bug in 5.2 beta
|
||||
local function foo ()
|
||||
local a
|
||||
return function ()
|
||||
local b
|
||||
a, b = 3, 14 -- local and upvalue have same index
|
||||
return a, b
|
||||
end
|
||||
end
|
||||
|
||||
local a, b = foo()()
|
||||
assert(a == 3 and b == 14)
|
||||
|
||||
print('OK')
|
||||
|
||||
return res
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/big.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/big.lc
Normal file
Binary file not shown.
79
luaj-test/src/test/resources/lua5.2.1-tests/big.lua
Normal file
79
luaj-test/src/test/resources/lua5.2.1-tests/big.lua
Normal file
@@ -0,0 +1,79 @@
|
||||
if _soft then
|
||||
return 'a'
|
||||
end
|
||||
|
||||
print "testing large tables"
|
||||
|
||||
local debug = require"debug"
|
||||
|
||||
local lim = 2^18 + 1000
|
||||
local prog = { "local y = {0" }
|
||||
for i = 1, lim do prog[#prog + 1] = i end
|
||||
prog[#prog + 1] = "}\n"
|
||||
prog[#prog + 1] = "X = y\n"
|
||||
prog[#prog + 1] = ("assert(X[%d] == %d)"):format(lim - 1, lim - 2)
|
||||
prog[#prog + 1] = "return 0"
|
||||
prog = table.concat(prog, ";")
|
||||
|
||||
local env = {string = string, assert = assert}
|
||||
local f = assert(load(prog, nil, nil, env))
|
||||
|
||||
f()
|
||||
assert(env.X[lim] == lim - 1 and env.X[lim + 1] == lim)
|
||||
for k in pairs(env) do env[k] = nil end
|
||||
|
||||
-- yields during accesses larger than K (in RK)
|
||||
setmetatable(env, {
|
||||
__index = function (t, n) coroutine.yield('g'); return _G[n] end,
|
||||
__newindex = function (t, n, v) coroutine.yield('s'); _G[n] = v end,
|
||||
})
|
||||
|
||||
X = nil
|
||||
co = coroutine.wrap(f)
|
||||
assert(co() == 's')
|
||||
assert(co() == 'g')
|
||||
assert(co() == 'g')
|
||||
assert(co() == 0)
|
||||
|
||||
assert(X[lim] == lim - 1 and X[lim + 1] == lim)
|
||||
|
||||
-- errors in accesses larger than K (in RK)
|
||||
getmetatable(env).__index = function () end
|
||||
getmetatable(env).__newindex = function () end
|
||||
local e, m = pcall(f)
|
||||
assert(not e and m:find("global 'X'"))
|
||||
|
||||
-- errors in metamethods
|
||||
getmetatable(env).__newindex = function () error("hi") end
|
||||
local e, m = xpcall(f, debug.traceback)
|
||||
assert(not e and m:find("'__newindex'"))
|
||||
|
||||
f, X = nil
|
||||
|
||||
coroutine.yield'b'
|
||||
|
||||
if not _no32 then -- {
|
||||
|
||||
print "testing string length overflow"
|
||||
|
||||
local repstrings = 192 -- number of strings to be concatenated
|
||||
local ssize = math.ceil(2^32 / repstrings) + 1 -- size of each string
|
||||
|
||||
assert(repstrings * ssize > 2^32) -- this should be larger than maximum size_t
|
||||
|
||||
local longs = string.rep("\0", ssize) -- create one long string
|
||||
|
||||
-- create function to concatentate 'repstrings' copies of its argument
|
||||
local rep = assert(load(
|
||||
"local a = ...; return " .. string.rep("a", repstrings, "..")))
|
||||
|
||||
local a, b = pcall(rep, longs) -- call that function
|
||||
|
||||
-- it should fail without creating string (result would be too large)
|
||||
assert(not a and string.find(b, "overflow"))
|
||||
|
||||
end -- }
|
||||
|
||||
print'OK'
|
||||
|
||||
return 'a'
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc
Normal file
Binary file not shown.
115
luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua
Normal file
115
luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua
Normal file
@@ -0,0 +1,115 @@
|
||||
print("testing bitwise operations")
|
||||
|
||||
assert(bit32.band() == bit32.bnot(0))
|
||||
assert(bit32.btest() == true)
|
||||
assert(bit32.bor() == 0)
|
||||
assert(bit32.bxor() == 0)
|
||||
|
||||
assert(bit32.band() == bit32.band(0xffffffff))
|
||||
assert(bit32.band(1,2) == 0)
|
||||
|
||||
|
||||
-- out-of-range numbers
|
||||
assert(bit32.band(-1) == 0xffffffff)
|
||||
assert(bit32.band(2^33 - 1) == 0xffffffff)
|
||||
assert(bit32.band(-2^33 - 1) == 0xffffffff)
|
||||
assert(bit32.band(2^33 + 1) == 1)
|
||||
assert(bit32.band(-2^33 + 1) == 1)
|
||||
assert(bit32.band(-2^40) == 0)
|
||||
assert(bit32.band(2^40) == 0)
|
||||
assert(bit32.band(-2^40 - 2) == 0xfffffffe)
|
||||
assert(bit32.band(2^40 - 4) == 0xfffffffc)
|
||||
|
||||
assert(bit32.lrotate(0, -1) == 0)
|
||||
assert(bit32.lrotate(0, 7) == 0)
|
||||
assert(bit32.lrotate(0x12345678, 4) == 0x23456781)
|
||||
assert(bit32.rrotate(0x12345678, -4) == 0x23456781)
|
||||
assert(bit32.lrotate(0x12345678, -8) == 0x78123456)
|
||||
assert(bit32.rrotate(0x12345678, 8) == 0x78123456)
|
||||
assert(bit32.lrotate(0xaaaaaaaa, 2) == 0xaaaaaaaa)
|
||||
assert(bit32.lrotate(0xaaaaaaaa, -2) == 0xaaaaaaaa)
|
||||
for i = -50, 50 do
|
||||
assert(bit32.lrotate(0x89abcdef, i) == bit32.lrotate(0x89abcdef, i%32))
|
||||
end
|
||||
|
||||
assert(bit32.lshift(0x12345678, 4) == 0x23456780)
|
||||
assert(bit32.lshift(0x12345678, 8) == 0x34567800)
|
||||
assert(bit32.lshift(0x12345678, -4) == 0x01234567)
|
||||
assert(bit32.lshift(0x12345678, -8) == 0x00123456)
|
||||
assert(bit32.lshift(0x12345678, 32) == 0)
|
||||
assert(bit32.lshift(0x12345678, -32) == 0)
|
||||
assert(bit32.rshift(0x12345678, 4) == 0x01234567)
|
||||
assert(bit32.rshift(0x12345678, 8) == 0x00123456)
|
||||
assert(bit32.rshift(0x12345678, 32) == 0)
|
||||
assert(bit32.rshift(0x12345678, -32) == 0)
|
||||
assert(bit32.arshift(0x12345678, 0) == 0x12345678)
|
||||
assert(bit32.arshift(0x12345678, 1) == 0x12345678 / 2)
|
||||
assert(bit32.arshift(0x12345678, -1) == 0x12345678 * 2)
|
||||
assert(bit32.arshift(-1, 1) == 0xffffffff)
|
||||
assert(bit32.arshift(-1, 24) == 0xffffffff)
|
||||
assert(bit32.arshift(-1, 32) == 0xffffffff)
|
||||
assert(bit32.arshift(-1, -1) == (-1 * 2) % 2^32)
|
||||
|
||||
print("+")
|
||||
-- some special cases
|
||||
local c = {0, 1, 2, 3, 10, 0x80000000, 0xaaaaaaaa, 0x55555555,
|
||||
0xffffffff, 0x7fffffff}
|
||||
|
||||
for _, b in pairs(c) do
|
||||
assert(bit32.band(b) == b)
|
||||
assert(bit32.band(b, b) == b)
|
||||
assert(bit32.btest(b, b) == (b ~= 0))
|
||||
assert(bit32.band(b, b, b) == b)
|
||||
assert(bit32.btest(b, b, b) == (b ~= 0))
|
||||
assert(bit32.band(b, bit32.bnot(b)) == 0)
|
||||
assert(bit32.bor(b, bit32.bnot(b)) == bit32.bnot(0))
|
||||
assert(bit32.bor(b) == b)
|
||||
assert(bit32.bor(b, b) == b)
|
||||
assert(bit32.bor(b, b, b) == b)
|
||||
assert(bit32.bxor(b) == b)
|
||||
assert(bit32.bxor(b, b) == 0)
|
||||
assert(bit32.bxor(b, 0) == b)
|
||||
assert(bit32.bnot(b) ~= b)
|
||||
assert(bit32.bnot(bit32.bnot(b)) == b)
|
||||
assert(bit32.bnot(b) == 2^32 - 1 - b)
|
||||
assert(bit32.lrotate(b, 32) == b)
|
||||
assert(bit32.rrotate(b, 32) == b)
|
||||
assert(bit32.lshift(bit32.lshift(b, -4), 4) == bit32.band(b, bit32.bnot(0xf)))
|
||||
assert(bit32.rshift(bit32.rshift(b, 4), -4) == bit32.band(b, bit32.bnot(0xf)))
|
||||
for i = -40, 40 do
|
||||
assert(bit32.lshift(b, i) == math.floor((b * 2^i) % 2^32))
|
||||
end
|
||||
end
|
||||
|
||||
assert(not pcall(bit32.band, {}))
|
||||
assert(not pcall(bit32.bnot, "a"))
|
||||
assert(not pcall(bit32.lshift, 45))
|
||||
assert(not pcall(bit32.lshift, 45, print))
|
||||
assert(not pcall(bit32.rshift, 45, print))
|
||||
|
||||
print("+")
|
||||
|
||||
|
||||
-- testing extract/replace
|
||||
|
||||
assert(bit32.extract(0x12345678, 0, 4) == 8)
|
||||
assert(bit32.extract(0x12345678, 4, 4) == 7)
|
||||
assert(bit32.extract(0xa0001111, 28, 4) == 0xa)
|
||||
assert(bit32.extract(0xa0001111, 31, 1) == 1)
|
||||
assert(bit32.extract(0x50000111, 31, 1) == 0)
|
||||
assert(bit32.extract(0xf2345679, 0, 32) == 0xf2345679)
|
||||
|
||||
assert(not pcall(bit32.extract, 0, -1))
|
||||
assert(not pcall(bit32.extract, 0, 32))
|
||||
assert(not pcall(bit32.extract, 0, 0, 33))
|
||||
assert(not pcall(bit32.extract, 0, 31, 2))
|
||||
|
||||
assert(bit32.replace(0x12345678, 5, 28, 4) == 0x52345678)
|
||||
assert(bit32.replace(0x12345678, 0x87654321, 0, 32) == 0x87654321)
|
||||
assert(bit32.replace(0, 1, 2) == 2^2)
|
||||
assert(bit32.replace(0, -1, 4) == 2^4)
|
||||
assert(bit32.replace(-1, 0, 31) == 2^31 - 1)
|
||||
assert(bit32.replace(-1, 0, 1, 2) == 2^32 - 7)
|
||||
|
||||
|
||||
print'OK'
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/calls.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/calls.lc
Normal file
Binary file not shown.
305
luaj-test/src/test/resources/lua5.2.1-tests/calls.lua
Normal file
305
luaj-test/src/test/resources/lua5.2.1-tests/calls.lua
Normal file
@@ -0,0 +1,305 @@
|
||||
print("testing functions and calls")
|
||||
|
||||
local debug = require "debug"
|
||||
|
||||
-- get the opportunity to test 'type' too ;)
|
||||
|
||||
assert(type(1<2) == 'boolean')
|
||||
assert(type(true) == 'boolean' and type(false) == 'boolean')
|
||||
assert(type(nil) == 'nil' and type(-3) == 'number' and type'x' == 'string' and
|
||||
type{} == 'table' and type(type) == 'function')
|
||||
|
||||
assert(type(assert) == type(print))
|
||||
f = nil
|
||||
function f (x) return a:x (x) end
|
||||
assert(type(f) == 'function')
|
||||
|
||||
|
||||
-- testing local-function recursion
|
||||
fact = false
|
||||
do
|
||||
local res = 1
|
||||
local function fact (n)
|
||||
if n==0 then return res
|
||||
else return n*fact(n-1)
|
||||
end
|
||||
end
|
||||
assert(fact(5) == 120)
|
||||
end
|
||||
assert(fact == false)
|
||||
|
||||
-- testing declarations
|
||||
a = {i = 10}
|
||||
self = 20
|
||||
function a:x (x) return x+self.i end
|
||||
function a.y (x) return x+self end
|
||||
|
||||
assert(a:x(1)+10 == a.y(1))
|
||||
|
||||
a.t = {i=-100}
|
||||
a["t"].x = function (self, a,b) return self.i+a+b end
|
||||
|
||||
assert(a.t:x(2,3) == -95)
|
||||
|
||||
do
|
||||
local a = {x=0}
|
||||
function a:add (x) self.x, a.y = self.x+x, 20; return self end
|
||||
assert(a:add(10):add(20):add(30).x == 60 and a.y == 20)
|
||||
end
|
||||
|
||||
local a = {b={c={}}}
|
||||
|
||||
function a.b.c.f1 (x) return x+1 end
|
||||
function a.b.c:f2 (x,y) self[x] = y end
|
||||
assert(a.b.c.f1(4) == 5)
|
||||
a.b.c:f2('k', 12); assert(a.b.c.k == 12)
|
||||
|
||||
print('+')
|
||||
|
||||
t = nil -- 'declare' t
|
||||
function f(a,b,c) local d = 'a'; t={a,b,c,d} end
|
||||
|
||||
f( -- this line change must be valid
|
||||
1,2)
|
||||
assert(t[1] == 1 and t[2] == 2 and t[3] == nil and t[4] == 'a')
|
||||
f(1,2, -- this one too
|
||||
3,4)
|
||||
assert(t[1] == 1 and t[2] == 2 and t[3] == 3 and t[4] == 'a')
|
||||
|
||||
function fat(x)
|
||||
if x <= 1 then return 1
|
||||
else return x*load("return fat(" .. x-1 .. ")")()
|
||||
end
|
||||
end
|
||||
|
||||
assert(load "load 'assert(fat(6)==720)' () ")()
|
||||
a = load('return fat(5), 3')
|
||||
a,b = a()
|
||||
assert(a == 120 and b == 3)
|
||||
print('+')
|
||||
|
||||
function err_on_n (n)
|
||||
if n==0 then error(); exit(1);
|
||||
else err_on_n (n-1); exit(1);
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
function dummy (n)
|
||||
if n > 0 then
|
||||
assert(not pcall(err_on_n, n))
|
||||
dummy(n-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
dummy(10)
|
||||
|
||||
function deep (n)
|
||||
if n>0 then deep(n-1) end
|
||||
end
|
||||
deep(10)
|
||||
deep(200)
|
||||
|
||||
-- testing tail call
|
||||
function deep (n) if n>0 then return deep(n-1) else return 101 end end
|
||||
assert(deep(30000) == 101)
|
||||
a = {}
|
||||
function a:deep (n) if n>0 then return self:deep(n-1) else return 101 end end
|
||||
assert(a:deep(30000) == 101)
|
||||
|
||||
print('+')
|
||||
|
||||
|
||||
a = nil
|
||||
(function (x) a=x end)(23)
|
||||
assert(a == 23 and (function (x) return x*2 end)(20) == 40)
|
||||
|
||||
|
||||
-- testing closures
|
||||
|
||||
-- fixed-point operator
|
||||
Z = function (le)
|
||||
local function a (f)
|
||||
return le(function (x) return f(f)(x) end)
|
||||
end
|
||||
return a(a)
|
||||
end
|
||||
|
||||
|
||||
-- non-recursive factorial
|
||||
|
||||
F = function (f)
|
||||
return function (n)
|
||||
if n == 0 then return 1
|
||||
else return n*f(n-1) end
|
||||
end
|
||||
end
|
||||
|
||||
fat = Z(F)
|
||||
|
||||
assert(fat(0) == 1 and fat(4) == 24 and Z(F)(5)==5*Z(F)(4))
|
||||
|
||||
local function g (z)
|
||||
local function f (a,b,c,d)
|
||||
return function (x,y) return a+b+c+d+a+x+y+z end
|
||||
end
|
||||
return f(z,z+1,z+2,z+3)
|
||||
end
|
||||
|
||||
f = g(10)
|
||||
assert(f(9, 16) == 10+11+12+13+10+9+16+10)
|
||||
|
||||
Z, F, f = nil
|
||||
print('+')
|
||||
|
||||
-- testing multiple returns
|
||||
|
||||
function unlpack (t, i)
|
||||
i = i or 1
|
||||
if (i <= #t) then
|
||||
return t[i], unlpack(t, i+1)
|
||||
end
|
||||
end
|
||||
|
||||
function equaltab (t1, t2)
|
||||
assert(#t1 == #t2)
|
||||
for i = 1, #t1 do
|
||||
assert(t1[i] == t2[i])
|
||||
end
|
||||
end
|
||||
|
||||
local pack = function (...) return (table.pack(...)) end
|
||||
|
||||
function f() return 1,2,30,4 end
|
||||
function ret2 (a,b) return a,b end
|
||||
|
||||
local a,b,c,d = unlpack{1,2,3}
|
||||
assert(a==1 and b==2 and c==3 and d==nil)
|
||||
a = {1,2,3,4,false,10,'alo',false,assert}
|
||||
equaltab(pack(unlpack(a)), a)
|
||||
equaltab(pack(unlpack(a), -1), {1,-1})
|
||||
a,b,c,d = ret2(f()), ret2(f())
|
||||
assert(a==1 and b==1 and c==2 and d==nil)
|
||||
a,b,c,d = unlpack(pack(ret2(f()), ret2(f())))
|
||||
assert(a==1 and b==1 and c==2 and d==nil)
|
||||
a,b,c,d = unlpack(pack(ret2(f()), (ret2(f()))))
|
||||
assert(a==1 and b==1 and c==nil and d==nil)
|
||||
|
||||
a = ret2{ unlpack{1,2,3}, unlpack{3,2,1}, unlpack{"a", "b"}}
|
||||
assert(a[1] == 1 and a[2] == 3 and a[3] == "a" and a[4] == "b")
|
||||
|
||||
|
||||
-- testing calls with 'incorrect' arguments
|
||||
rawget({}, "x", 1)
|
||||
rawset({}, "x", 1, 2)
|
||||
assert(math.sin(1,2) == math.sin(1))
|
||||
table.sort({10,9,8,4,19,23,0,0}, function (a,b) return a<b end, "extra arg")
|
||||
|
||||
|
||||
-- test for generic load
|
||||
local x = "-- a comment\0\0\0\n x = 10 + \n23; \
|
||||
local a = function () x = 'hi' end; \
|
||||
return '\0'"
|
||||
function read1 (x)
|
||||
local i = 0
|
||||
return function ()
|
||||
collectgarbage()
|
||||
i=i+1
|
||||
return string.sub(x, i, i)
|
||||
end
|
||||
end
|
||||
|
||||
function cannotload (msg, a,b)
|
||||
assert(not a and string.find(b, msg))
|
||||
end
|
||||
|
||||
a = assert(load(read1(x), "modname", "t", _G))
|
||||
assert(a() == "\0" and _G.x == 33)
|
||||
assert(debug.getinfo(a).source == "modname")
|
||||
-- cannot read text in binary mode
|
||||
cannotload("attempt to load a text chunk", load(read1(x), "modname", "b", {}))
|
||||
cannotload("attempt to load a text chunk", load(x, "modname", "b"))
|
||||
|
||||
a = assert(load(function () return nil end))
|
||||
a() -- empty chunk
|
||||
|
||||
assert(not load(function () return true end))
|
||||
|
||||
|
||||
-- small bug
|
||||
local t = {nil, "return ", "3"}
|
||||
f, msg = load(function () return table.remove(t, 1) end)
|
||||
assert(f() == nil) -- should read the empty chunk
|
||||
|
||||
x = string.dump(load("x = 1; return x"))
|
||||
a = assert(load(read1(x), nil, "b"))
|
||||
assert(a() == 1 and _G.x == 1)
|
||||
cannotload("attempt to load a binary chunk", load(read1(x), nil, "t"))
|
||||
cannotload("attempt to load a binary chunk", load(x, nil, "t"))
|
||||
|
||||
assert(not pcall(string.dump, print)) -- no dump of C functions
|
||||
|
||||
cannotload("unexpected symbol", load(read1("*a = 123")))
|
||||
cannotload("unexpected symbol", load("*a = 123"))
|
||||
cannotload("hhi", load(function () error("hhi") end))
|
||||
|
||||
-- any value is valid for _ENV
|
||||
assert(load("return _ENV", nil, nil, 123)() == 123)
|
||||
|
||||
|
||||
-- load when _ENV is not first upvalue
|
||||
local x; XX = 123
|
||||
local function h ()
|
||||
local y=x -- use 'x', so that it becomes 1st upvalue
|
||||
return XX -- global name
|
||||
end
|
||||
local d = string.dump(h)
|
||||
x = load(d, "", "b")
|
||||
assert(debug.getupvalue(x, 2) == '_ENV')
|
||||
debug.setupvalue(x, 2, _G)
|
||||
assert(x() == 123)
|
||||
|
||||
assert(assert(load("return XX + ...", nil, nil, {XX = 13}))(4) == 17)
|
||||
|
||||
|
||||
-- test generic load with nested functions
|
||||
x = [[
|
||||
return function (x)
|
||||
return function (y)
|
||||
return function (z)
|
||||
return x+y+z
|
||||
end
|
||||
end
|
||||
end
|
||||
]]
|
||||
|
||||
a = assert(load(read1(x)))
|
||||
assert(a()(2)(3)(10) == 15)
|
||||
|
||||
|
||||
-- test for dump/undump with upvalues
|
||||
local a, b = 20, 30
|
||||
x = load(string.dump(function (x)
|
||||
if x == "set" then a = 10+b; b = b+1 else
|
||||
return a
|
||||
end
|
||||
end))
|
||||
assert(x() == nil)
|
||||
assert(debug.setupvalue(x, 1, "hi") == "a")
|
||||
assert(x() == "hi")
|
||||
assert(debug.setupvalue(x, 2, 13) == "b")
|
||||
assert(not debug.setupvalue(x, 3, 10)) -- only 2 upvalues
|
||||
x("set")
|
||||
assert(x() == 23)
|
||||
x("set")
|
||||
assert(x() == 24)
|
||||
|
||||
|
||||
-- test for bug in parameter adjustment
|
||||
assert((function () return nil end)(4) == nil)
|
||||
assert((function () local a; return a end)(4) == nil)
|
||||
assert((function (a) return a end)() == nil)
|
||||
|
||||
print('OK')
|
||||
return deep
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/checktable.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/checktable.lc
Normal file
Binary file not shown.
77
luaj-test/src/test/resources/lua5.2.1-tests/checktable.lua
Normal file
77
luaj-test/src/test/resources/lua5.2.1-tests/checktable.lua
Normal file
@@ -0,0 +1,77 @@
|
||||
|
||||
assert(rawget(_G, "stat") == nil) -- module not loaded before
|
||||
|
||||
if T == nil then
|
||||
stat = function () print"`querytab' not active" end
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
function checktable (t)
|
||||
local asize, hsize, ff = T.querytab(t)
|
||||
local l = {}
|
||||
for i=0,hsize-1 do
|
||||
local key,val,next = T.querytab(t, i + asize)
|
||||
if key == nil then
|
||||
assert(l[i] == nil and val==nil and next==nil)
|
||||
elseif key == "<undef>" then
|
||||
assert(val==nil)
|
||||
else
|
||||
assert(t[key] == val)
|
||||
local mp = T.hash(key, t)
|
||||
if l[i] then
|
||||
assert(l[i] == mp)
|
||||
elseif mp ~= i then
|
||||
l[i] = mp
|
||||
else -- list head
|
||||
l[mp] = {mp} -- first element
|
||||
while next do
|
||||
assert(ff <= next and next < hsize)
|
||||
if l[next] then assert(l[next] == mp) else l[next] = mp end
|
||||
table.insert(l[mp], next)
|
||||
key,val,next = T.querytab(t, next)
|
||||
assert(key)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
l.asize = asize; l.hsize = hsize; l.ff = ff
|
||||
return l
|
||||
end
|
||||
|
||||
function mostra (t)
|
||||
local asize, hsize, ff = T.querytab(t)
|
||||
print(asize, hsize, ff)
|
||||
print'------'
|
||||
for i=0,asize-1 do
|
||||
local _, v = T.querytab(t, i)
|
||||
print(string.format("[%d] -", i), v)
|
||||
end
|
||||
print'------'
|
||||
for i=0,hsize-1 do
|
||||
print(i, T.querytab(t, i+asize))
|
||||
end
|
||||
print'-------------'
|
||||
end
|
||||
|
||||
function stat (t)
|
||||
t = checktable(t)
|
||||
local nelem, nlist = 0, 0
|
||||
local maxlist = {}
|
||||
for i=0,t.hsize-1 do
|
||||
if type(t[i]) == 'table' then
|
||||
local n = table.getn(t[i])
|
||||
nlist = nlist+1
|
||||
nelem = nelem + n
|
||||
if not maxlist[n] then maxlist[n] = 0 end
|
||||
maxlist[n] = maxlist[n]+1
|
||||
end
|
||||
end
|
||||
print(string.format("hsize=%d elements=%d load=%.2f med.len=%.2f (asize=%d)",
|
||||
t.hsize, nelem, nelem/t.hsize, nelem/nlist, t.asize))
|
||||
for i=1,table.getn(maxlist) do
|
||||
local n = maxlist[i] or 0
|
||||
print(string.format("%5d %10d %.2f%%", i, n, n*100/nlist))
|
||||
end
|
||||
end
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/closure.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/closure.lc
Normal file
Binary file not shown.
244
luaj-test/src/test/resources/lua5.2.1-tests/closure.lua
Normal file
244
luaj-test/src/test/resources/lua5.2.1-tests/closure.lua
Normal file
@@ -0,0 +1,244 @@
|
||||
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
|
||||
|
||||
local a = f(10)
|
||||
-- force a GC in this level
|
||||
local x = {[1] = {}} -- to detect a GC
|
||||
setmetatable(x, {__mode = 'kv'})
|
||||
while x[1] do -- repeat until GC
|
||||
local a = A..A..A..A -- create garbage
|
||||
A = A+1
|
||||
end
|
||||
assert(a[1]() == 20+A)
|
||||
assert(a[1]() == 30+A)
|
||||
assert(a[2]() == 10+A)
|
||||
collectgarbage()
|
||||
assert(a[2]() == 20+A)
|
||||
assert(a[2]() == 30+A)
|
||||
assert(a[3]() == 20+A)
|
||||
assert(a[8]() == 10+A)
|
||||
assert(getmetatable(x).__mode == 'kv')
|
||||
assert(B.g == 19)
|
||||
|
||||
|
||||
-- testing equality
|
||||
a = {}
|
||||
for i = 1, 5 do a[i] = function (x) return x + a + _ENV end end
|
||||
assert(a[3] == a[4] and a[4] == a[5])
|
||||
|
||||
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])
|
||||
|
||||
local function f()
|
||||
return function (x) return math.sin(_ENV[x]) end
|
||||
end
|
||||
assert(f() == f())
|
||||
|
||||
|
||||
-- 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] == nil)
|
||||
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)
|
||||
|
||||
-- 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)
|
||||
|
||||
|
||||
-- testing closures created in 'then' and 'else' parts of 'if's
|
||||
a = {}
|
||||
for i = 1, 10 do
|
||||
if i % 3 == 0 then
|
||||
local y = 0
|
||||
a[i] = function (x) local t = y; y = x; return t end
|
||||
elseif i % 3 == 1 then
|
||||
goto L1
|
||||
error'not here'
|
||||
::L1::
|
||||
local y = 1
|
||||
a[i] = function (x) local t = y; y = x; return t end
|
||||
elseif i % 3 == 2 then
|
||||
local t
|
||||
goto l4
|
||||
::l4a:: a[i] = t; goto l4b
|
||||
error("should never be here!")
|
||||
::l4::
|
||||
local y = 2
|
||||
t = function (x) local t = y; y = x; return t end
|
||||
goto l4a
|
||||
error("should never be here!")
|
||||
::l4b::
|
||||
end
|
||||
end
|
||||
|
||||
for i = 1, 10 do
|
||||
assert(a[i](i * 10) == i % 3 and a[i]() == i * 10)
|
||||
end
|
||||
|
||||
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()
|
||||
|
||||
|
||||
-- test for debug manipulation of upvalues
|
||||
local debug = require'debug'
|
||||
|
||||
do
|
||||
local a , b, c = 3, 5, 7
|
||||
foo1 = function () return a+b end;
|
||||
foo2 = function () return b+a end;
|
||||
do
|
||||
local a = 10
|
||||
foo3 = function () return a+b end;
|
||||
end
|
||||
end
|
||||
|
||||
assert(debug.upvalueid(foo1, 1))
|
||||
assert(debug.upvalueid(foo1, 2))
|
||||
assert(not pcall(debug.upvalueid, foo1, 3))
|
||||
assert(debug.upvalueid(foo1, 1) == debug.upvalueid(foo2, 2))
|
||||
assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo2, 1))
|
||||
assert(debug.upvalueid(foo3, 1))
|
||||
assert(debug.upvalueid(foo1, 1) ~= debug.upvalueid(foo3, 1))
|
||||
assert(debug.upvalueid(foo1, 2) == debug.upvalueid(foo3, 2))
|
||||
|
||||
assert(debug.upvalueid(string.gmatch("x", "x"), 1) ~= nil)
|
||||
|
||||
assert(foo1() == 3 + 5 and foo2() == 5 + 3)
|
||||
debug.upvaluejoin(foo1, 2, foo2, 2)
|
||||
assert(foo1() == 3 + 3 and foo2() == 5 + 3)
|
||||
assert(foo3() == 10 + 5)
|
||||
debug.upvaluejoin(foo3, 2, foo2, 1)
|
||||
assert(foo3() == 10 + 5)
|
||||
debug.upvaluejoin(foo3, 2, foo2, 2)
|
||||
assert(foo3() == 10 + 3)
|
||||
|
||||
assert(not pcall(debug.upvaluejoin, foo1, 3, foo2, 1))
|
||||
assert(not pcall(debug.upvaluejoin, foo1, 1, foo2, 3))
|
||||
assert(not pcall(debug.upvaluejoin, foo1, 0, foo2, 1))
|
||||
assert(not pcall(debug.upvaluejoin, print, 1, foo2, 1))
|
||||
assert(not pcall(debug.upvaluejoin, {}, 1, foo2, 1))
|
||||
assert(not pcall(debug.upvaluejoin, foo1, 1, print, 1))
|
||||
|
||||
print'OK'
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/code.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/code.lc
Normal file
Binary file not shown.
182
luaj-test/src/test/resources/lua5.2.1-tests/code.lua
Normal file
182
luaj-test/src/test/resources/lua5.2.1-tests/code.lua
Normal file
@@ -0,0 +1,182 @@
|
||||
if T==nil then
|
||||
(Message or print)('\a\n >>> testC not active: skipping opcode tests <<<\n\a')
|
||||
return
|
||||
end
|
||||
print "testing code generation and optimizations"
|
||||
|
||||
|
||||
-- this code gave an error for the code checker
|
||||
do
|
||||
local function f (a)
|
||||
for k,v,w in a do end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function check (f, ...)
|
||||
local arg = {...}
|
||||
local c = T.listcode(f)
|
||||
for i=1, #arg do
|
||||
-- print(arg[i], c[i])
|
||||
assert(string.find(c[i], '- '..arg[i]..' *%d'))
|
||||
end
|
||||
assert(c[#arg+2] == nil)
|
||||
end
|
||||
|
||||
|
||||
function checkequal (a, b)
|
||||
a = T.listcode(a)
|
||||
b = T.listcode(b)
|
||||
for i = 1, #a do
|
||||
a[i] = string.gsub(a[i], '%b()', '') -- remove line number
|
||||
b[i] = string.gsub(b[i], '%b()', '') -- remove line number
|
||||
assert(a[i] == b[i])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- some basic instructions
|
||||
check(function ()
|
||||
(function () end){f()}
|
||||
end, 'CLOSURE', 'NEWTABLE', 'GETTABUP', 'CALL', 'SETLIST', 'CALL', 'RETURN')
|
||||
|
||||
|
||||
-- sequence of LOADNILs
|
||||
check(function ()
|
||||
local a,b,c
|
||||
local d; local e;
|
||||
local f,g,h;
|
||||
d = nil; d=nil; b=nil; a=nil; c=nil;
|
||||
end, 'LOADNIL', 'RETURN')
|
||||
|
||||
check(function ()
|
||||
local a,b,c,d = 1,1,1,1
|
||||
d=nil;c=nil;b=nil;a=nil
|
||||
end, 'LOADK', 'LOADK', 'LOADK', 'LOADK', 'LOADNIL', 'RETURN')
|
||||
|
||||
do
|
||||
local a,b,c,d = 1,1,1,1
|
||||
d=nil;c=nil;b=nil;a=nil
|
||||
assert(a == nil and b == nil and c == nil and d == nil)
|
||||
end
|
||||
|
||||
|
||||
-- single return
|
||||
check (function (a,b,c) return a end, 'RETURN')
|
||||
|
||||
|
||||
-- infinite loops
|
||||
check(function () while true do local a = -1 end end,
|
||||
'LOADK', 'JMP', 'RETURN')
|
||||
|
||||
check(function () while 1 do local a = -1 end end,
|
||||
'LOADK', 'JMP', 'RETURN')
|
||||
|
||||
check(function () repeat local x = 1 until true end,
|
||||
'LOADK', 'RETURN')
|
||||
|
||||
|
||||
-- concat optimization
|
||||
check(function (a,b,c,d) return a..b..c..d end,
|
||||
'MOVE', 'MOVE', 'MOVE', 'MOVE', 'CONCAT', 'RETURN')
|
||||
|
||||
-- not
|
||||
check(function () return not not nil end, 'LOADBOOL', 'RETURN')
|
||||
check(function () return not not false end, 'LOADBOOL', 'RETURN')
|
||||
check(function () return not not true end, 'LOADBOOL', 'RETURN')
|
||||
check(function () return not not 1 end, 'LOADBOOL', 'RETURN')
|
||||
|
||||
-- direct access to locals
|
||||
check(function ()
|
||||
local a,b,c,d
|
||||
a = b*2
|
||||
c[4], a[b] = -((a + d/-20.5 - a[b]) ^ a.x), b
|
||||
end,
|
||||
'LOADNIL',
|
||||
'MUL',
|
||||
'DIV', 'ADD', 'GETTABLE', 'SUB', 'GETTABLE', 'POW',
|
||||
'UNM', 'SETTABLE', 'SETTABLE', 'RETURN')
|
||||
|
||||
|
||||
-- direct access to constants
|
||||
check(function ()
|
||||
local a,b
|
||||
a.x = 0
|
||||
a.x = b
|
||||
a[b] = 'y'
|
||||
a = 1 - a
|
||||
b = 1/a
|
||||
b = 5+4
|
||||
a[true] = false
|
||||
end,
|
||||
'LOADNIL',
|
||||
'SETTABLE', 'SETTABLE', 'SETTABLE', 'SUB', 'DIV', 'LOADK',
|
||||
'SETTABLE', 'RETURN')
|
||||
|
||||
-- constant folding
|
||||
local function f () return -((2^8 + -(-1)) % 8)/2 * 4 - 3 end
|
||||
|
||||
check(f, 'LOADK', 'RETURN')
|
||||
assert(f() == -5)
|
||||
|
||||
|
||||
-- bug in constant folding for 5.1
|
||||
check(function () return -nil end,
|
||||
'LOADNIL', 'UNM', 'RETURN')
|
||||
|
||||
|
||||
check(function ()
|
||||
local a,b,c
|
||||
b[c], a = c, b
|
||||
b[a], a = c, b
|
||||
a, b = c, a
|
||||
a = a
|
||||
end,
|
||||
'LOADNIL',
|
||||
'MOVE', 'MOVE', 'SETTABLE',
|
||||
'MOVE', 'MOVE', 'MOVE', 'SETTABLE',
|
||||
'MOVE', 'MOVE', 'MOVE',
|
||||
-- no code for a = a
|
||||
'RETURN')
|
||||
|
||||
|
||||
-- x == nil , x ~= nil
|
||||
checkequal(function () if (a==nil) then a=1 end; if a~=nil then a=1 end end,
|
||||
function () if (a==9) then a=1 end; if a~=9 then a=1 end end)
|
||||
|
||||
check(function () if a==nil then a=1 end end,
|
||||
'GETTABUP', 'EQ', 'JMP', 'SETTABUP', 'RETURN')
|
||||
|
||||
-- de morgan
|
||||
checkequal(function () local a; if not (a or b) then b=a end end,
|
||||
function () local a; if (not a and not b) then b=a end end)
|
||||
|
||||
checkequal(function (l) local a; return 0 <= a and a <= l end,
|
||||
function (l) local a; return not (not(a >= 0) or not(a <= l)) end)
|
||||
|
||||
|
||||
-- if-goto optimizations
|
||||
check(function (a)
|
||||
if a == 1 then goto l1
|
||||
elseif a == 2 then goto l2
|
||||
elseif a == 3 then goto l2
|
||||
else if a == 4 then goto l3
|
||||
else goto l3
|
||||
end
|
||||
end
|
||||
::l1:: ::l2:: ::l3:: ::l4::
|
||||
end, 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'EQ', 'JMP', 'JMP', 'RETURN')
|
||||
|
||||
checkequal(
|
||||
function (a) while a < 10 do a = a + 1 end end,
|
||||
function (a) ::L2:: if not(a < 10) then goto L1 end; a = a + 1;
|
||||
goto L2; ::L1:: end
|
||||
)
|
||||
|
||||
checkequal(
|
||||
function (a) while a < 10 do a = a + 1 end end,
|
||||
function (a) while true do if not(a < 10) then break end; a = a + 1; end end
|
||||
)
|
||||
|
||||
print 'OK'
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc
Normal file
Binary file not shown.
310
luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua
Normal file
310
luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua
Normal file
@@ -0,0 +1,310 @@
|
||||
;;print "testing syntax";;
|
||||
|
||||
local debug = require "debug"
|
||||
|
||||
-- testing semicollons
|
||||
do ;;; end
|
||||
; do ; a = 3; assert(a == 3) end;
|
||||
;
|
||||
|
||||
|
||||
-- testing priorities
|
||||
|
||||
assert(2^3^2 == 2^(3^2));
|
||||
assert(2^3*4 == (2^3)*4);
|
||||
assert(2^-2 == 1/4 and -2^- -2 == - - -4);
|
||||
assert(not nil and 2 and not(2>3 or 3<2));
|
||||
assert(-3-1-5 == 0+0-9);
|
||||
assert(-2^2 == -4 and (-2)^2 == 4 and 2*2-3-1 == 0);
|
||||
assert(2*1+3/3 == 3 and 1+2 .. 3*1 == "33");
|
||||
assert(not(2+1 > 3*1) and "a".."b" > "a");
|
||||
|
||||
assert(not ((true or false) and nil))
|
||||
assert( true or false and nil)
|
||||
|
||||
-- old bug
|
||||
assert((((1 or false) and true) or false) == true)
|
||||
assert((((nil and true) or false) and true) == false)
|
||||
|
||||
local a,b = 1,nil;
|
||||
assert(-(1 or 2) == -1 and (1 and 2)+(-1.25 or -4) == 0.75);
|
||||
x = ((b or a)+1 == 2 and (10 or a)+1 == 11); assert(x);
|
||||
x = (((2<3) or 1) == true and (2<3 and 4) == 4); assert(x);
|
||||
|
||||
x,y=1,2;
|
||||
assert((x>y) and x or y == 2);
|
||||
x,y=2,1;
|
||||
assert((x>y) and x or y == 2);
|
||||
|
||||
assert(1234567890 == tonumber('1234567890') and 1234567890+1 == 1234567891)
|
||||
|
||||
|
||||
-- silly loops
|
||||
repeat until 1; repeat until true;
|
||||
while false do end; while nil do end;
|
||||
|
||||
do -- test old bug (first name could not be an `upvalue')
|
||||
local a; function f(x) x={a=1}; x={x=1}; x={G=1} end
|
||||
end
|
||||
|
||||
function f (i)
|
||||
if type(i) ~= 'number' then return i,'jojo'; end;
|
||||
if i > 0 then return i, f(i-1); end;
|
||||
end
|
||||
|
||||
x = {f(3), f(5), f(10);};
|
||||
assert(x[1] == 3 and x[2] == 5 and x[3] == 10 and x[4] == 9 and x[12] == 1);
|
||||
assert(x[nil] == nil)
|
||||
x = {f'alo', f'xixi', nil};
|
||||
assert(x[1] == 'alo' and x[2] == 'xixi' and x[3] == nil);
|
||||
x = {f'alo'..'xixi'};
|
||||
assert(x[1] == 'aloxixi')
|
||||
x = {f{}}
|
||||
assert(x[2] == 'jojo' and type(x[1]) == 'table')
|
||||
|
||||
|
||||
local f = function (i)
|
||||
if i < 10 then return 'a';
|
||||
elseif i < 20 then return 'b';
|
||||
elseif i < 30 then return 'c';
|
||||
end;
|
||||
end
|
||||
|
||||
assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == nil)
|
||||
|
||||
for i=1,1000 do break; end;
|
||||
n=100;
|
||||
i=3;
|
||||
t = {};
|
||||
a=nil
|
||||
while not a do
|
||||
a=0; for i=1,n do for i=i,1,-1 do a=a+1; t[i]=1; end; end;
|
||||
end
|
||||
assert(a == n*(n+1)/2 and i==3);
|
||||
assert(t[1] and t[n] and not t[0] and not t[n+1])
|
||||
|
||||
function f(b)
|
||||
local x = 1;
|
||||
repeat
|
||||
local a;
|
||||
if b==1 then local b=1; x=10; break
|
||||
elseif b==2 then x=20; break;
|
||||
elseif b==3 then x=30;
|
||||
else local a,b,c,d=math.sin(1); x=x+1;
|
||||
end
|
||||
until x>=12;
|
||||
return x;
|
||||
end;
|
||||
|
||||
assert(f(1) == 10 and f(2) == 20 and f(3) == 30 and f(4)==12)
|
||||
|
||||
|
||||
local f = function (i)
|
||||
if i < 10 then return 'a'
|
||||
elseif i < 20 then return 'b'
|
||||
elseif i < 30 then return 'c'
|
||||
else return 8
|
||||
end
|
||||
end
|
||||
|
||||
assert(f(3) == 'a' and f(12) == 'b' and f(26) == 'c' and f(100) == 8)
|
||||
|
||||
local a, b = nil, 23
|
||||
x = {f(100)*2+3 or a, a or b+2}
|
||||
assert(x[1] == 19 and x[2] == 25)
|
||||
x = {f=2+3 or a, a = b+2}
|
||||
assert(x.f == 5 and x.a == 25)
|
||||
|
||||
a={y=1}
|
||||
x = {a.y}
|
||||
assert(x[1] == 1)
|
||||
|
||||
function f(i)
|
||||
while 1 do
|
||||
if i>0 then i=i-1;
|
||||
else return; end;
|
||||
end;
|
||||
end;
|
||||
|
||||
function g(i)
|
||||
while 1 do
|
||||
if i>0 then i=i-1
|
||||
else return end
|
||||
end
|
||||
end
|
||||
|
||||
f(10); g(10);
|
||||
|
||||
do
|
||||
function f () return 1,2,3; end
|
||||
local a, b, c = f();
|
||||
assert(a==1 and b==2 and c==3)
|
||||
a, b, c = (f());
|
||||
assert(a==1 and b==nil and c==nil)
|
||||
end
|
||||
|
||||
local a,b = 3 and f();
|
||||
assert(a==1 and b==nil)
|
||||
|
||||
function g() f(); return; end;
|
||||
assert(g() == nil)
|
||||
function g() return nil or f() end
|
||||
a,b = g()
|
||||
assert(a==1 and b==nil)
|
||||
|
||||
print'+';
|
||||
|
||||
|
||||
f = [[
|
||||
return function ( a , b , c , d , e )
|
||||
local x = a >= b or c or ( d and e ) or nil
|
||||
return x
|
||||
end , { a = 1 , b = 2 >= 1 , } or { 1 };
|
||||
]]
|
||||
f = string.gsub(f, "%s+", "\n"); -- force a SETLINE between opcodes
|
||||
f,a = load(f)();
|
||||
assert(a.a == 1 and a.b)
|
||||
|
||||
function g (a,b,c,d,e)
|
||||
if not (a>=b or c or d and e or nil) then return 0; else return 1; end;
|
||||
end
|
||||
|
||||
function h (a,b,c,d,e)
|
||||
while (a>=b or c or (d and e) or nil) do return 1; end;
|
||||
return 0;
|
||||
end;
|
||||
|
||||
assert(f(2,1) == true and g(2,1) == 1 and h(2,1) == 1)
|
||||
assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1)
|
||||
assert(f(1,2,'a')
|
||||
~= -- force SETLINE before nil
|
||||
nil, "")
|
||||
assert(f(1,2,'a') == 'a' and g(1,2,'a') == 1 and h(1,2,'a') == 1)
|
||||
assert(f(1,2,nil,1,'x') == 'x' and g(1,2,nil,1,'x') == 1 and
|
||||
h(1,2,nil,1,'x') == 1)
|
||||
assert(f(1,2,nil,nil,'x') == nil and g(1,2,nil,nil,'x') == 0 and
|
||||
h(1,2,nil,nil,'x') == 0)
|
||||
assert(f(1,2,nil,1,nil) == nil and g(1,2,nil,1,nil) == 0 and
|
||||
h(1,2,nil,1,nil) == 0)
|
||||
|
||||
assert(1 and 2<3 == true and 2<3 and 'a'<'b' == true)
|
||||
x = 2<3 and not 3; assert(x==false)
|
||||
x = 2<1 or (2>1 and 'a'); assert(x=='a')
|
||||
|
||||
|
||||
do
|
||||
local a; if nil then a=1; else a=2; end; -- this nil comes as PUSHNIL 2
|
||||
assert(a==2)
|
||||
end
|
||||
|
||||
function F(a)
|
||||
assert(debug.getinfo(1, "n").name == 'F')
|
||||
return a,2,3
|
||||
end
|
||||
|
||||
a,b = F(1)~=nil; assert(a == true and b == nil);
|
||||
a,b = F(nil)==nil; assert(a == true and b == nil)
|
||||
|
||||
----------------------------------------------------------------
|
||||
-- creates all combinations of
|
||||
-- [not] ([not] arg op [not] (arg op [not] arg ))
|
||||
-- and tests each one
|
||||
|
||||
function ID(x) return x end
|
||||
|
||||
function f(t, i)
|
||||
local b = t.n
|
||||
local res = math.fmod(math.floor(i/c), b)+1
|
||||
c = c*b
|
||||
return t[res]
|
||||
end
|
||||
|
||||
local arg = {" ( 1 < 2 ) ", " ( 1 >= 2 ) ", " F ( ) ", " nil "; n=4}
|
||||
|
||||
local op = {" and ", " or ", " == ", " ~= "; n=4}
|
||||
|
||||
local neg = {" ", " not "; n=2}
|
||||
|
||||
local i = 0
|
||||
repeat
|
||||
c = 1
|
||||
local s = f(neg, i)..'ID('..f(neg, i)..f(arg, i)..f(op, i)..
|
||||
f(neg, i)..'ID('..f(arg, i)..f(op, i)..f(neg, i)..f(arg, i)..'))'
|
||||
local s1 = string.gsub(s, 'ID', '')
|
||||
K,X,NX,WX1,WX2 = nil
|
||||
s = string.format([[
|
||||
local a = %s
|
||||
local b = not %s
|
||||
K = b
|
||||
local xxx;
|
||||
if %s then X = a else X = b end
|
||||
if %s then NX = b else NX = a end
|
||||
while %s do WX1 = a; break end
|
||||
while %s do WX2 = a; break end
|
||||
repeat if (%s) then break end; assert(b) until not(%s)
|
||||
]], s1, s, s1, s, s1, s, s1, s, s)
|
||||
assert(load(s))()
|
||||
assert(X and not NX and not WX1 == K and not WX2 == K)
|
||||
if math.fmod(i,4000) == 0 then print('+') end
|
||||
i = i+1
|
||||
until i==c
|
||||
|
||||
print '+'
|
||||
|
||||
------------------------------------------------------------------
|
||||
print 'testing short-circuit optimizations'
|
||||
|
||||
_ENV.GLOB1 = 1
|
||||
_ENV.GLOB2 = 2
|
||||
|
||||
local basiccases = {
|
||||
{"nil", nil},
|
||||
{"false", false},
|
||||
{"true", true},
|
||||
{"10", 10},
|
||||
{"(_ENV.GLOB1 < _ENV.GLOB2)", true},
|
||||
{"(_ENV.GLOB2 < _ENV.GLOB1)", false},
|
||||
}
|
||||
|
||||
|
||||
local binops = {
|
||||
{" and ", function (a,b) if not a then return a else return b end end},
|
||||
{" or ", function (a,b) if a then return a else return b end end},
|
||||
}
|
||||
|
||||
local mem = {basiccases} -- for memoization
|
||||
|
||||
local function allcases (n)
|
||||
if mem[n] then return mem[n] end
|
||||
local res = {}
|
||||
-- include all smaller cases
|
||||
for _, v in ipairs(allcases(n - 1)) do
|
||||
res[#res + 1] = v
|
||||
end
|
||||
for i = 1, n - 1 do
|
||||
for _, v1 in ipairs(allcases(i)) do
|
||||
for _, v2 in ipairs(allcases(n - i)) do
|
||||
for _, op in ipairs(binops) do
|
||||
res[#res + 1] = {
|
||||
"(" .. v1[1] .. op[1] .. v2[1] .. ")",
|
||||
op[2](v1[2], v2[2])
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
print('+')
|
||||
end
|
||||
mem[n] = res -- memoize
|
||||
return res
|
||||
end
|
||||
|
||||
-- do not do too many combinations for soft tests
|
||||
local level = _soft and 3 or 4
|
||||
|
||||
for _, v in pairs(allcases(level)) do
|
||||
local res = load("return " .. v[1])()
|
||||
assert(res == v[2])
|
||||
end
|
||||
------------------------------------------------------------------
|
||||
|
||||
print'OK'
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc
Normal file
Binary file not shown.
728
luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua
Normal file
728
luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua
Normal file
@@ -0,0 +1,728 @@
|
||||
print "testing coroutines"
|
||||
|
||||
local debug = require'debug'
|
||||
|
||||
local f
|
||||
|
||||
local main, ismain = coroutine.running()
|
||||
assert(type(main) == "thread" and ismain)
|
||||
assert(not coroutine.resume(main))
|
||||
assert(not pcall(coroutine.yield))
|
||||
|
||||
|
||||
|
||||
-- tests for multiple yield/resume arguments
|
||||
|
||||
local function eqtab (t1, t2)
|
||||
assert(#t1 == #t2)
|
||||
for i = 1, #t1 do
|
||||
local v = t1[i]
|
||||
assert(t2[i] == v)
|
||||
end
|
||||
end
|
||||
|
||||
_G.x = nil -- declare x
|
||||
function foo (a, ...)
|
||||
local x, y = coroutine.running()
|
||||
assert(x == f and y == false)
|
||||
assert(coroutine.status(f) == "running")
|
||||
local arg = {...}
|
||||
for i=1,#arg do
|
||||
_G.x = {coroutine.yield(table.unpack(arg[i]))}
|
||||
end
|
||||
return table.unpack(a)
|
||||
end
|
||||
|
||||
f = coroutine.create(foo)
|
||||
assert(type(f) == "thread" and coroutine.status(f) == "suspended")
|
||||
assert(string.find(tostring(f), "thread"))
|
||||
local s,a,b,c,d
|
||||
s,a,b,c,d = coroutine.resume(f, {1,2,3}, {}, {1}, {'a', 'b', 'c'})
|
||||
assert(s and a == nil and coroutine.status(f) == "suspended")
|
||||
s,a,b,c,d = coroutine.resume(f)
|
||||
eqtab(_G.x, {})
|
||||
assert(s and a == 1 and b == nil)
|
||||
s,a,b,c,d = coroutine.resume(f, 1, 2, 3)
|
||||
eqtab(_G.x, {1, 2, 3})
|
||||
assert(s and a == 'a' and b == 'b' and c == 'c' and d == nil)
|
||||
s,a,b,c,d = coroutine.resume(f, "xuxu")
|
||||
eqtab(_G.x, {"xuxu"})
|
||||
assert(s and a == 1 and b == 2 and c == 3 and d == nil)
|
||||
assert(coroutine.status(f) == "dead")
|
||||
s, a = coroutine.resume(f, "xuxu")
|
||||
assert(not s and string.find(a, "dead") and coroutine.status(f) == "dead")
|
||||
|
||||
|
||||
-- yields in tail calls
|
||||
local function foo (i) return coroutine.yield(i) end
|
||||
f = coroutine.wrap(function ()
|
||||
for i=1,10 do
|
||||
assert(foo(i) == _G.x)
|
||||
end
|
||||
return 'a'
|
||||
end)
|
||||
for i=1,10 do _G.x = i; assert(f(i) == i) end
|
||||
_G.x = 'xuxu'; assert(f('xuxu') == 'a')
|
||||
|
||||
-- recursive
|
||||
function pf (n, i)
|
||||
coroutine.yield(n)
|
||||
pf(n*i, i+1)
|
||||
end
|
||||
|
||||
f = coroutine.wrap(pf)
|
||||
local s=1
|
||||
for i=1,10 do
|
||||
assert(f(1, 1) == s)
|
||||
s = s*i
|
||||
end
|
||||
|
||||
-- sieve
|
||||
function gen (n)
|
||||
return coroutine.wrap(function ()
|
||||
for i=2,n do coroutine.yield(i) end
|
||||
end)
|
||||
end
|
||||
|
||||
|
||||
function filter (p, g)
|
||||
return coroutine.wrap(function ()
|
||||
while 1 do
|
||||
local n = g()
|
||||
if n == nil then return end
|
||||
if math.fmod(n, p) ~= 0 then coroutine.yield(n) end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local x = gen(100)
|
||||
local a = {}
|
||||
while 1 do
|
||||
local n = x()
|
||||
if n == nil then break end
|
||||
table.insert(a, n)
|
||||
x = filter(n, x)
|
||||
end
|
||||
|
||||
assert(#a == 25 and a[#a] == 97)
|
||||
|
||||
|
||||
-- yielding across C boundaries
|
||||
|
||||
co = coroutine.wrap(function()
|
||||
assert(not pcall(table.sort,{1,2,3}, coroutine.yield))
|
||||
coroutine.yield(20)
|
||||
return 30
|
||||
end)
|
||||
|
||||
assert(co() == 20)
|
||||
assert(co() == 30)
|
||||
|
||||
|
||||
local f = function (s, i) return coroutine.yield(i) end
|
||||
|
||||
local f1 = coroutine.wrap(function ()
|
||||
return xpcall(pcall, function (...) return ... end,
|
||||
function ()
|
||||
local s = 0
|
||||
for i in f, nil, 1 do pcall(function () s = s + i end) end
|
||||
error({s})
|
||||
end)
|
||||
end)
|
||||
|
||||
f1()
|
||||
for i = 1, 10 do assert(f1(i) == i) end
|
||||
local r1, r2, v = f1(nil)
|
||||
assert(r1 and not r2 and v[1] == (10 + 1)*10/2)
|
||||
|
||||
|
||||
function f (a, b) a = coroutine.yield(a); error{a + b} end
|
||||
function g(x) return x[1]*2 end
|
||||
|
||||
co = coroutine.wrap(function ()
|
||||
coroutine.yield(xpcall(f, g, 10, 20))
|
||||
end)
|
||||
|
||||
assert(co() == 10)
|
||||
r, msg = co(100)
|
||||
assert(not r and msg == 240)
|
||||
|
||||
|
||||
-- errors in coroutines
|
||||
function foo ()
|
||||
assert(debug.getinfo(1).currentline == debug.getinfo(foo).linedefined + 1)
|
||||
assert(debug.getinfo(2).currentline == debug.getinfo(goo).linedefined)
|
||||
coroutine.yield(3)
|
||||
error(foo)
|
||||
end
|
||||
|
||||
function goo() foo() end
|
||||
x = coroutine.wrap(goo)
|
||||
assert(x() == 3)
|
||||
local a,b = pcall(x)
|
||||
assert(not a and b == foo)
|
||||
|
||||
x = coroutine.create(goo)
|
||||
a,b = coroutine.resume(x)
|
||||
assert(a and b == 3)
|
||||
a,b = coroutine.resume(x)
|
||||
assert(not a and b == foo and coroutine.status(x) == "dead")
|
||||
a,b = coroutine.resume(x)
|
||||
assert(not a and string.find(b, "dead") and coroutine.status(x) == "dead")
|
||||
|
||||
|
||||
-- co-routines x for loop
|
||||
function all (a, n, k)
|
||||
if k == 0 then coroutine.yield(a)
|
||||
else
|
||||
for i=1,n do
|
||||
a[k] = i
|
||||
all(a, n, k-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local a = 0
|
||||
for t in coroutine.wrap(function () all({}, 5, 4) end) do
|
||||
a = a+1
|
||||
end
|
||||
assert(a == 5^4)
|
||||
|
||||
|
||||
-- access to locals of collected corroutines
|
||||
local C = {}; setmetatable(C, {__mode = "kv"})
|
||||
local x = coroutine.wrap (function ()
|
||||
local a = 10
|
||||
local function f () a = a+10; return a end
|
||||
while true do
|
||||
a = a+1
|
||||
coroutine.yield(f)
|
||||
end
|
||||
end)
|
||||
|
||||
C[1] = x;
|
||||
|
||||
local f = x()
|
||||
assert(f() == 21 and x()() == 32 and x() == f)
|
||||
x = nil
|
||||
collectgarbage()
|
||||
assert(C[1] == nil)
|
||||
assert(f() == 43 and f() == 53)
|
||||
|
||||
|
||||
-- old bug: attempt to resume itself
|
||||
|
||||
function co_func (current_co)
|
||||
assert(coroutine.running() == current_co)
|
||||
assert(coroutine.resume(current_co) == false)
|
||||
assert(coroutine.resume(current_co) == false)
|
||||
return 10
|
||||
end
|
||||
|
||||
local co = coroutine.create(co_func)
|
||||
local a,b = coroutine.resume(co, co)
|
||||
assert(a == true and b == 10)
|
||||
assert(coroutine.resume(co, co) == false)
|
||||
assert(coroutine.resume(co, co) == false)
|
||||
|
||||
|
||||
-- attempt to resume 'normal' coroutine
|
||||
co1 = coroutine.create(function () return co2() end)
|
||||
co2 = coroutine.wrap(function ()
|
||||
assert(coroutine.status(co1) == 'normal')
|
||||
assert(not coroutine.resume(co1))
|
||||
coroutine.yield(3)
|
||||
end)
|
||||
|
||||
a,b = coroutine.resume(co1)
|
||||
assert(a and b == 3)
|
||||
assert(coroutine.status(co1) == 'dead')
|
||||
|
||||
-- infinite recursion of coroutines
|
||||
a = function(a) coroutine.wrap(a)(a) end
|
||||
assert(not pcall(a, a))
|
||||
|
||||
|
||||
-- access to locals of erroneous coroutines
|
||||
local x = coroutine.create (function ()
|
||||
local a = 10
|
||||
_G.f = function () a=a+1; return a end
|
||||
error('x')
|
||||
end)
|
||||
|
||||
assert(not coroutine.resume(x))
|
||||
-- overwrite previous position of local `a'
|
||||
assert(not coroutine.resume(x, 1, 1, 1, 1, 1, 1, 1))
|
||||
assert(_G.f() == 11)
|
||||
assert(_G.f() == 12)
|
||||
|
||||
|
||||
if not T then
|
||||
(Message or print)('\a\n >>> testC not active: skipping yield/hook tests <<<\n\a')
|
||||
else
|
||||
print "testing yields inside hooks"
|
||||
|
||||
local turn
|
||||
|
||||
function fact (t, x)
|
||||
assert(turn == t)
|
||||
if x == 0 then return 1
|
||||
else return x*fact(t, x-1)
|
||||
end
|
||||
end
|
||||
|
||||
local A,B,a,b = 0,0,0,0
|
||||
|
||||
local x = coroutine.create(function ()
|
||||
T.sethook("yield 0", "", 2)
|
||||
A = fact("A", 10)
|
||||
end)
|
||||
|
||||
local y = coroutine.create(function ()
|
||||
T.sethook("yield 0", "", 3)
|
||||
B = fact("B", 11)
|
||||
end)
|
||||
|
||||
while A==0 or B==0 do
|
||||
if A==0 then turn = "A"; assert(T.resume(x)) end
|
||||
if B==0 then turn = "B"; assert(T.resume(y)) end
|
||||
end
|
||||
|
||||
assert(B/A == 11)
|
||||
|
||||
local line = debug.getinfo(1, "l").currentline + 2 -- get line number
|
||||
local function foo ()
|
||||
local x = 10 --<< this line is 'line'
|
||||
x = x + 10
|
||||
_G.XX = x
|
||||
end
|
||||
|
||||
-- testing yields in line hook
|
||||
local co = coroutine.wrap(function ()
|
||||
T.sethook("setglobal X; yield 0", "l", 0); foo(); return 10 end)
|
||||
|
||||
_G.XX = nil;
|
||||
_G.X = nil; co(); assert(_G.X == line)
|
||||
_G.X = nil; co(); assert(_G.X == line + 1)
|
||||
_G.X = nil; co(); assert(_G.X == line + 2 and _G.XX == nil)
|
||||
_G.X = nil; co(); assert(_G.X == line + 3 and _G.XX == 20)
|
||||
assert(co() == 10)
|
||||
|
||||
-- testing yields in count hook
|
||||
co = coroutine.wrap(function ()
|
||||
T.sethook("yield 0", "", 1); foo(); return 10 end)
|
||||
|
||||
_G.XX = nil;
|
||||
local c = 0
|
||||
repeat c = c + 1; local a = co() until a == 10
|
||||
assert(_G.XX == 20 and c == 10)
|
||||
|
||||
co = coroutine.wrap(function ()
|
||||
T.sethook("yield 0", "", 2); foo(); return 10 end)
|
||||
|
||||
_G.XX = nil;
|
||||
local c = 0
|
||||
repeat c = c + 1; local a = co() until a == 10
|
||||
assert(_G.XX == 20 and c == 5)
|
||||
_G.X = nil; _G.XX = nil
|
||||
|
||||
|
||||
print "testing coroutine API"
|
||||
|
||||
-- reusing a thread
|
||||
assert(T.testC([[
|
||||
newthread # create thread
|
||||
pushvalue 2 # push body
|
||||
pushstring 'a a a' # push argument
|
||||
xmove 0 3 2 # move values to new thread
|
||||
resume -1, 1 # call it first time
|
||||
pushstatus
|
||||
xmove 3 0 0 # move results back to stack
|
||||
setglobal X # result
|
||||
setglobal Y # status
|
||||
pushvalue 2 # push body (to call it again)
|
||||
pushstring 'b b b'
|
||||
xmove 0 3 2
|
||||
resume -1, 1 # call it again
|
||||
pushstatus
|
||||
xmove 3 0 0
|
||||
return 1 # return result
|
||||
]], function (...) return ... end) == 'b b b')
|
||||
|
||||
assert(X == 'a a a' and Y == 'OK')
|
||||
|
||||
|
||||
-- resuming running coroutine
|
||||
C = coroutine.create(function ()
|
||||
return T.testC([[
|
||||
pushnum 10;
|
||||
pushnum 20;
|
||||
resume -3 2;
|
||||
pushstatus
|
||||
gettop;
|
||||
return 3]], C)
|
||||
end)
|
||||
local a, b, c, d = coroutine.resume(C)
|
||||
assert(a == true and string.find(b, "non%-suspended") and
|
||||
c == "ERRRUN" and d == 4)
|
||||
|
||||
a, b, c, d = T.testC([[
|
||||
rawgeti R 1 # get main thread
|
||||
pushnum 10;
|
||||
pushnum 20;
|
||||
resume -3 2;
|
||||
pushstatus
|
||||
gettop;
|
||||
return 4]])
|
||||
assert(a == coroutine.running() and string.find(b, "non%-suspended") and
|
||||
c == "ERRRUN" and d == 4)
|
||||
|
||||
|
||||
-- using a main thread as a coroutine
|
||||
local state = T.newstate()
|
||||
T.loadlib(state)
|
||||
|
||||
assert(T.doremote(state, [[
|
||||
coroutine = require'coroutine';
|
||||
X = function (x) coroutine.yield(x, 'BB'); return 'CC' end;
|
||||
return 'ok']]))
|
||||
|
||||
t = table.pack(T.testC(state, [[
|
||||
rawgeti R 1 # get main thread
|
||||
pushstring 'XX'
|
||||
getglobal X # get function for body
|
||||
pushstring AA # arg
|
||||
resume 1 1 # 'resume' shadows previous stack!
|
||||
gettop
|
||||
setglobal T # top
|
||||
setglobal B # second yielded value
|
||||
setglobal A # fist yielded value
|
||||
rawgeti R 1 # get main thread
|
||||
pushnum 5 # arg (noise)
|
||||
resume 1 1 # after coroutine ends, previous stack is back
|
||||
pushstatus
|
||||
gettop
|
||||
return .
|
||||
]]))
|
||||
assert(t.n == 4 and t[2] == 'XX' and t[3] == 'CC' and t[4] == 'OK')
|
||||
assert(T.doremote(state, "return T") == '2')
|
||||
assert(T.doremote(state, "return A") == 'AA')
|
||||
assert(T.doremote(state, "return B") == 'BB')
|
||||
|
||||
T.closestate(state)
|
||||
|
||||
print'+'
|
||||
|
||||
end
|
||||
|
||||
|
||||
-- leaving a pending coroutine open
|
||||
_X = coroutine.wrap(function ()
|
||||
local a = 10
|
||||
local x = function () a = a+1 end
|
||||
coroutine.yield()
|
||||
end)
|
||||
|
||||
_X()
|
||||
|
||||
|
||||
if not _soft then
|
||||
-- bug (stack overflow)
|
||||
local j = 2^9
|
||||
local lim = 1000000 -- (C stack limit; assume 32-bit machine)
|
||||
local t = {lim - 10, lim - 5, lim - 1, lim, lim + 1}
|
||||
for i = 1, #t do
|
||||
local j = t[i]
|
||||
co = coroutine.create(function()
|
||||
local t = {}
|
||||
for i = 1, j do t[i] = i end
|
||||
return table.unpack(t)
|
||||
end)
|
||||
local r, msg = coroutine.resume(co)
|
||||
assert(not r)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
assert(coroutine.running() == main)
|
||||
|
||||
print"+"
|
||||
|
||||
|
||||
print"testing yields inside metamethods"
|
||||
|
||||
local mt = {
|
||||
__eq = function(a,b) coroutine.yield(nil, "eq"); return a.x == b.x end,
|
||||
__lt = function(a,b) coroutine.yield(nil, "lt"); return a.x < b.x end,
|
||||
__le = function(a,b) coroutine.yield(nil, "le"); return a - b <= 0 end,
|
||||
__add = function(a,b) coroutine.yield(nil, "add"); return a.x + b.x end,
|
||||
__sub = function(a,b) coroutine.yield(nil, "sub"); return a.x - b.x end,
|
||||
__concat = function(a,b)
|
||||
coroutine.yield(nil, "concat");
|
||||
a = type(a) == "table" and a.x or a
|
||||
b = type(b) == "table" and b.x or b
|
||||
return a .. b
|
||||
end,
|
||||
__index = function (t,k) coroutine.yield(nil, "idx"); return t.k[k] end,
|
||||
__newindex = function (t,k,v) coroutine.yield(nil, "nidx"); t.k[k] = v end,
|
||||
}
|
||||
|
||||
|
||||
local function new (x)
|
||||
return setmetatable({x = x, k = {}}, mt)
|
||||
end
|
||||
|
||||
|
||||
local a = new(10)
|
||||
local b = new(12)
|
||||
local c = new"hello"
|
||||
|
||||
local function run (f, t)
|
||||
local i = 1
|
||||
local c = coroutine.wrap(f)
|
||||
while true do
|
||||
local res, stat = c()
|
||||
if res then assert(t[i] == nil); return res, t end
|
||||
assert(stat == t[i])
|
||||
i = i + 1
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
assert(run(function () if (a>=b) then return '>=' else return '<' end end,
|
||||
{"le", "sub"}) == "<")
|
||||
-- '<=' using '<'
|
||||
mt.__le = nil
|
||||
assert(run(function () if (a<=b) then return '<=' else return '>' end end,
|
||||
{"lt"}) == "<=")
|
||||
assert(run(function () if (a==b) then return '==' else return '~=' end end,
|
||||
{"eq"}) == "~=")
|
||||
|
||||
assert(run(function () return a..b end, {"concat"}) == "1012")
|
||||
|
||||
assert(run(function() return a .. b .. c .. a end,
|
||||
{"concat", "concat", "concat"}) == "1012hello10")
|
||||
|
||||
assert(run(function() return "a" .. "b" .. a .. "c" .. c .. b .. "x" end,
|
||||
{"concat", "concat", "concat"}) == "ab10chello12x")
|
||||
|
||||
assert(run(function ()
|
||||
a.BB = print
|
||||
return a.BB
|
||||
end, {"nidx", "idx"}) == print)
|
||||
|
||||
-- getuptable & setuptable
|
||||
do local _ENV = _ENV
|
||||
f = function () AAA = BBB + 1; return AAA end
|
||||
end
|
||||
g = new(10); g.k.BBB = 10;
|
||||
debug.setupvalue(f, 1, g)
|
||||
assert(run(f, {"idx", "nidx", "idx"}) == 11)
|
||||
assert(g.k.AAA == 11)
|
||||
|
||||
print"+"
|
||||
|
||||
print"testing yields inside 'for' iterators"
|
||||
|
||||
local f = function (s, i)
|
||||
if i%2 == 0 then coroutine.yield(nil, "for") end
|
||||
if i < s then return i + 1 end
|
||||
end
|
||||
|
||||
assert(run(function ()
|
||||
local s = 0
|
||||
for i in f, 4, 0 do s = s + i end
|
||||
return s
|
||||
end, {"for", "for", "for"}) == 10)
|
||||
|
||||
|
||||
|
||||
-- tests for coroutine API
|
||||
if T==nil then
|
||||
(Message or print)('\a\n >>> testC not active: skipping coroutine API tests <<<\n\a')
|
||||
return
|
||||
end
|
||||
|
||||
print('testing coroutine API')
|
||||
|
||||
local function apico (...)
|
||||
local x = {...}
|
||||
return coroutine.wrap(function ()
|
||||
return T.testC(table.unpack(x))
|
||||
end)
|
||||
end
|
||||
|
||||
local a = {apico(
|
||||
[[
|
||||
pushstring errorcode
|
||||
pcallk 1 0 2;
|
||||
invalid command (should not arrive here)
|
||||
]],
|
||||
[[getctx; gettop; return .]],
|
||||
"stackmark",
|
||||
error
|
||||
)()}
|
||||
assert(#a == 6 and
|
||||
a[3] == "stackmark" and
|
||||
a[4] == "errorcode" and
|
||||
a[5] == "ERRRUN" and
|
||||
a[6] == 2) -- 'ctx' to pcallk
|
||||
|
||||
local co = apico(
|
||||
"pushvalue 2; pushnum 10; pcallk 1 2 3; invalid command;",
|
||||
coroutine.yield,
|
||||
"getctx; pushvalue 2; pushstring a; pcallk 1 0 4; invalid command",
|
||||
"getctx; gettop; return .")
|
||||
|
||||
assert(co() == 10)
|
||||
assert(co(20, 30) == 'a')
|
||||
a = {co()}
|
||||
assert(#a == 10 and
|
||||
a[2] == coroutine.yield and
|
||||
a[5] == 20 and a[6] == 30 and
|
||||
a[7] == "YIELD" and a[8] == 3 and
|
||||
a[9] == "YIELD" and a[10] == 4)
|
||||
assert(not pcall(co)) -- coroutine is dead now
|
||||
|
||||
|
||||
f = T.makeCfunc("pushnum 3; pushnum 5; yield 1;")
|
||||
co = coroutine.wrap(function ()
|
||||
assert(f() == 23); assert(f() == 23); return 10
|
||||
end)
|
||||
assert(co(23,16) == 5)
|
||||
assert(co(23,16) == 5)
|
||||
assert(co(23,16) == 10)
|
||||
|
||||
|
||||
-- testing coroutines with C bodies
|
||||
f = T.makeCfunc([[
|
||||
pushnum 102
|
||||
yieldk 1 U2
|
||||
return 2
|
||||
]],
|
||||
[[
|
||||
pushnum 23 # continuation
|
||||
gettop
|
||||
return .
|
||||
]])
|
||||
|
||||
x = coroutine.wrap(f)
|
||||
assert(x() == 102)
|
||||
assert(x() == 23)
|
||||
|
||||
|
||||
f = T.makeCfunc[[pushstring 'a'; pushnum 102; yield 2; ]]
|
||||
|
||||
a, b, c, d = T.testC([[newthread; pushvalue 2; xmove 0 3 1; resume 3 0;
|
||||
pushstatus; xmove 3 0 0; resume 3 0; pushstatus;
|
||||
return 4; ]], f)
|
||||
|
||||
assert(a == 'YIELD' and b == 'a' and c == 102 and d == 'OK')
|
||||
|
||||
|
||||
-- testing chain of suspendable C calls
|
||||
|
||||
local count = 3 -- number of levels
|
||||
|
||||
f = T.makeCfunc([[
|
||||
remove 1; # remove argument
|
||||
pushvalue U3; # get selection function
|
||||
call 0 1; # call it (result is 'f' or 'yield')
|
||||
pushstring hello # single argument for selected function
|
||||
pushupvalueindex 2; # index of continuation program
|
||||
callk 1 -1 .; # call selected function
|
||||
errorerror # should never arrive here
|
||||
]],
|
||||
[[
|
||||
# continuation program
|
||||
pushnum 34 # return value
|
||||
gettop
|
||||
return . # return all results
|
||||
]],
|
||||
function () -- selection function
|
||||
count = count - 1
|
||||
if count == 0 then return coroutine.yield
|
||||
else return f
|
||||
end
|
||||
end
|
||||
)
|
||||
|
||||
co = coroutine.wrap(function () return f(nil) end)
|
||||
assert(co() == "hello") -- argument to 'yield'
|
||||
a = {co()}
|
||||
-- three '34's (one from each pending C call)
|
||||
assert(#a == 3 and a[1] == a[2] and a[2] == a[3] and a[3] == 34)
|
||||
|
||||
|
||||
-- testing yields with continuations
|
||||
|
||||
co = coroutine.wrap(function (...) return
|
||||
T.testC([[
|
||||
getctx
|
||||
yieldk 3 2
|
||||
nonexec error
|
||||
]],
|
||||
[[ # continuation
|
||||
getctx
|
||||
yieldk 2 3
|
||||
]],
|
||||
[[ # continuation
|
||||
getctx
|
||||
yieldk 2 4
|
||||
]],
|
||||
[[ # continuation
|
||||
pushvalue 6; pushnum 10; pushnum 20;
|
||||
pcall 2 0 # call should throw an error and execution continues
|
||||
pop 1 # remove error message
|
||||
pushvalue 6
|
||||
getctx
|
||||
pcallk 2 2 5 # call should throw an error and jump to continuation
|
||||
cannot be here!
|
||||
]],
|
||||
[[ # continuation
|
||||
gettop
|
||||
return .
|
||||
]],
|
||||
function (a,b) x=a; y=b; error("errmsg") end,
|
||||
...
|
||||
)
|
||||
end)
|
||||
|
||||
local a = {co(3,4,6)}; assert(a[1] == 6 and a[2] == "OK" and a[3] == 0)
|
||||
a = {co()}; assert(a[1] == "YIELD" and a[2] == 2)
|
||||
a = {co()}; assert(a[1] == "YIELD" and a[2] == 3)
|
||||
a = {co(7,8)};
|
||||
-- original arguments
|
||||
assert(type(a[1]) == 'string' and type(a[2]) == 'string' and
|
||||
type(a[3]) == 'string' and type(a[4]) == 'string' and
|
||||
type(a[5]) == 'string' and type(a[6]) == 'function')
|
||||
-- arguments left from fist resume
|
||||
assert(a[7] == 3 and a[8] == 4)
|
||||
-- arguments to last resume
|
||||
assert(a[9] == 7 and a[10] == 8)
|
||||
-- error message and nothing more
|
||||
assert(a[11]:find("errmsg") and #a == 11)
|
||||
-- check arguments to pcallk
|
||||
assert(x == "YIELD" and y == 4)
|
||||
|
||||
assert(not pcall(co)) -- coroutine should be dead
|
||||
|
||||
-- testing ctx
|
||||
|
||||
a,b = T.testC(
|
||||
[[ pushstring print; pcallk 0 0 12 # error
|
||||
getctx; return 2 ]])
|
||||
assert(a == "OK" and b == 0) -- no ctx outside continuations
|
||||
|
||||
|
||||
-- bug in nCcalls
|
||||
local co = coroutine.wrap(function ()
|
||||
local a = {pcall(pcall,pcall,pcall,pcall,pcall,pcall,pcall,error,"hi")}
|
||||
return pcall(assert, table.unpack(a))
|
||||
end)
|
||||
|
||||
local a = {co()}
|
||||
assert(a[10] == "hi")
|
||||
|
||||
|
||||
print'OK'
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/db.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/db.lc
Normal file
Binary file not shown.
631
luaj-test/src/test/resources/lua5.2.1-tests/db.lua
Normal file
631
luaj-test/src/test/resources/lua5.2.1-tests/db.lua
Normal file
@@ -0,0 +1,631 @@
|
||||
-- testing debug library
|
||||
|
||||
debug = require "debug"
|
||||
|
||||
local function dostring(s) return assert(load(s))() end
|
||||
|
||||
print"testing debug library and debug information"
|
||||
|
||||
do
|
||||
local a=1
|
||||
end
|
||||
|
||||
function test (s, l, p)
|
||||
collectgarbage() -- avoid gc during trace
|
||||
local function f (event, line)
|
||||
assert(event == 'line')
|
||||
local l = table.remove(l, 1)
|
||||
if p then print(l, line) end
|
||||
assert(l == line, "wrong trace!!")
|
||||
end
|
||||
debug.sethook(f,"l"); load(s)(); debug.sethook()
|
||||
assert(#l == 0)
|
||||
end
|
||||
|
||||
|
||||
do
|
||||
assert(not pcall(debug.getinfo, print, "X")) -- invalid option
|
||||
assert(debug.getinfo(1000) == nil) -- out of range level
|
||||
assert(debug.getinfo(-1) == nil) -- out of range level
|
||||
local a = debug.getinfo(print)
|
||||
assert(a.what == "C" and a.short_src == "[C]")
|
||||
a = debug.getinfo(print, "L")
|
||||
assert(a.activelines == nil)
|
||||
local b = debug.getinfo(test, "SfL")
|
||||
assert(b.name == nil and b.what == "Lua" and b.linedefined == 13 and
|
||||
b.lastlinedefined == b.linedefined + 10 and
|
||||
b.func == test and not string.find(b.short_src, "%["))
|
||||
assert(b.activelines[b.linedefined + 1] and
|
||||
b.activelines[b.lastlinedefined])
|
||||
assert(not b.activelines[b.linedefined] and
|
||||
not b.activelines[b.lastlinedefined + 1])
|
||||
end
|
||||
|
||||
|
||||
-- test file and string names truncation
|
||||
a = "function f () end"
|
||||
local function dostring (s, x) return load(s, x)() end
|
||||
dostring(a)
|
||||
assert(debug.getinfo(f).short_src == string.format('[string "%s"]', a))
|
||||
dostring(a..string.format("; %s\n=1", string.rep('p', 400)))
|
||||
assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$'))
|
||||
dostring(a..string.format("; %s=1", string.rep('p', 400)))
|
||||
assert(string.find(debug.getinfo(f).short_src, '^%[string [^\n]*%.%.%."%]$'))
|
||||
dostring("\n"..a)
|
||||
assert(debug.getinfo(f).short_src == '[string "..."]')
|
||||
dostring(a, "")
|
||||
assert(debug.getinfo(f).short_src == '[string ""]')
|
||||
dostring(a, "@xuxu")
|
||||
assert(debug.getinfo(f).short_src == "xuxu")
|
||||
dostring(a, "@"..string.rep('p', 1000)..'t')
|
||||
assert(string.find(debug.getinfo(f).short_src, "^%.%.%.p*t$"))
|
||||
dostring(a, "=xuxu")
|
||||
assert(debug.getinfo(f).short_src == "xuxu")
|
||||
dostring(a, string.format("=%s", string.rep('x', 500)))
|
||||
assert(string.find(debug.getinfo(f).short_src, "^x*$"))
|
||||
dostring(a, "=")
|
||||
assert(debug.getinfo(f).short_src == "")
|
||||
a = nil; f = nil;
|
||||
|
||||
|
||||
repeat
|
||||
local g = {x = function ()
|
||||
local a = debug.getinfo(2)
|
||||
assert(a.name == 'f' and a.namewhat == 'local')
|
||||
a = debug.getinfo(1)
|
||||
assert(a.name == 'x' and a.namewhat == 'field')
|
||||
return 'xixi'
|
||||
end}
|
||||
local f = function () return 1+1 and (not 1 or g.x()) end
|
||||
assert(f() == 'xixi')
|
||||
g = debug.getinfo(f)
|
||||
assert(g.what == "Lua" and g.func == f and g.namewhat == "" and not g.name)
|
||||
|
||||
function f (x, name) -- local!
|
||||
name = name or 'f'
|
||||
local a = debug.getinfo(1)
|
||||
assert(a.name == name and a.namewhat == 'local')
|
||||
return x
|
||||
end
|
||||
|
||||
-- breaks in different conditions
|
||||
if 3>4 then break end; f()
|
||||
if 3<4 then a=1 else break end; f()
|
||||
while 1 do local x=10; break end; f()
|
||||
local b = 1
|
||||
if 3>4 then return math.sin(1) end; f()
|
||||
a = 3<4; f()
|
||||
a = 3<4 or 1; f()
|
||||
repeat local x=20; if 4>3 then f() else break end; f() until 1
|
||||
g = {}
|
||||
f(g).x = f(2) and f(10)+f(9)
|
||||
assert(g.x == f(19))
|
||||
function g(x) if not x then return 3 end return (x('a', 'x')) end
|
||||
assert(g(f) == 'a')
|
||||
until 1
|
||||
|
||||
test([[if
|
||||
math.sin(1)
|
||||
then
|
||||
a=1
|
||||
else
|
||||
a=2
|
||||
end
|
||||
]], {2,3,4,7})
|
||||
|
||||
test([[--
|
||||
if nil then
|
||||
a=1
|
||||
else
|
||||
a=2
|
||||
end
|
||||
]], {2,5,6})
|
||||
|
||||
test([[a=1
|
||||
repeat
|
||||
a=a+1
|
||||
until a==3
|
||||
]], {1,3,4,3,4})
|
||||
|
||||
test([[ do
|
||||
return
|
||||
end
|
||||
]], {2})
|
||||
|
||||
test([[local a
|
||||
a=1
|
||||
while a<=3 do
|
||||
a=a+1
|
||||
end
|
||||
]], {1,2,3,4,3,4,3,4,3,5})
|
||||
|
||||
test([[while math.sin(1) do
|
||||
if math.sin(1)
|
||||
then break
|
||||
end
|
||||
end
|
||||
a=1]], {1,2,3,6})
|
||||
|
||||
test([[for i=1,3 do
|
||||
a=i
|
||||
end
|
||||
]], {1,2,1,2,1,2,1,3})
|
||||
|
||||
test([[for i,v in pairs{'a','b'} do
|
||||
a=i..v
|
||||
end
|
||||
]], {1,2,1,2,1,3})
|
||||
|
||||
test([[for i=1,4 do a=1 end]], {1,1,1,1,1})
|
||||
|
||||
|
||||
|
||||
print'+'
|
||||
|
||||
-- invalid levels in [gs]etlocal
|
||||
assert(not pcall(debug.getlocal, 20, 1))
|
||||
assert(not pcall(debug.setlocal, -1, 1, 10))
|
||||
|
||||
|
||||
-- parameter names
|
||||
local function foo (a,b,...) local d, e end
|
||||
local co = coroutine.create(foo)
|
||||
|
||||
assert(debug.getlocal(foo, 1) == 'a')
|
||||
assert(debug.getlocal(foo, 2) == 'b')
|
||||
assert(debug.getlocal(foo, 3) == nil)
|
||||
assert(debug.getlocal(co, foo, 1) == 'a')
|
||||
assert(debug.getlocal(co, foo, 2) == 'b')
|
||||
assert(debug.getlocal(co, foo, 3) == nil)
|
||||
|
||||
assert(debug.getlocal(print, 1) == nil)
|
||||
|
||||
|
||||
-- varargs
|
||||
local function foo (a, ...)
|
||||
local t = table.pack(...)
|
||||
for i = 1, t.n do
|
||||
local n, v = debug.getlocal(1, -i)
|
||||
assert(n == "(*vararg)" and v == t[i])
|
||||
end
|
||||
assert(not debug.getlocal(1, -(t.n + 1)))
|
||||
assert(not debug.setlocal(1, -(t.n + 1), 30))
|
||||
if t.n > 0 then
|
||||
(function (x)
|
||||
assert(debug.setlocal(2, -1, x) == "(*vararg)")
|
||||
assert(debug.setlocal(2, -t.n, x) == "(*vararg)")
|
||||
end)(430)
|
||||
assert(... == 430)
|
||||
end
|
||||
end
|
||||
|
||||
foo()
|
||||
foo(print)
|
||||
foo(200, 3, 4)
|
||||
local a = {}
|
||||
for i = 1,1000 do a[i] = i end
|
||||
foo(table.unpack(a))
|
||||
a = nil
|
||||
|
||||
-- access to vararg in non-vararg function
|
||||
local function foo () return debug.getlocal(1, -1) end
|
||||
assert(foo(10) == nil)
|
||||
|
||||
|
||||
a = {}; L = nil
|
||||
local glob = 1
|
||||
local oldglob = glob
|
||||
debug.sethook(function (e,l)
|
||||
collectgarbage() -- force GC during a hook
|
||||
local f, m, c = debug.gethook()
|
||||
assert(m == 'crl' and c == 0)
|
||||
if e == "line" then
|
||||
if glob ~= oldglob then
|
||||
L = l-1 -- get the first line where "glob" has changed
|
||||
oldglob = glob
|
||||
end
|
||||
elseif e == "call" then
|
||||
local f = debug.getinfo(2, "f").func
|
||||
a[f] = 1
|
||||
else assert(e == "return")
|
||||
end
|
||||
end, "crl")
|
||||
|
||||
|
||||
function f(a,b)
|
||||
collectgarbage()
|
||||
local _, x = debug.getlocal(1, 1)
|
||||
local _, y = debug.getlocal(1, 2)
|
||||
assert(x == a and y == b)
|
||||
assert(debug.setlocal(2, 3, "pera") == "AA".."AA")
|
||||
assert(debug.setlocal(2, 4, "maçã") == "B")
|
||||
x = debug.getinfo(2)
|
||||
assert(x.func == g and x.what == "Lua" and x.name == 'g' and
|
||||
x.nups == 1 and string.find(x.source, "^@.*db%.lua$"))
|
||||
glob = glob+1
|
||||
assert(debug.getinfo(1, "l").currentline == L+1)
|
||||
assert(debug.getinfo(1, "l").currentline == L+2)
|
||||
end
|
||||
|
||||
function foo()
|
||||
glob = glob+1
|
||||
assert(debug.getinfo(1, "l").currentline == L+1)
|
||||
end; foo() -- set L
|
||||
-- check line counting inside strings and empty lines
|
||||
|
||||
_ = 'alo\
|
||||
alo' .. [[
|
||||
|
||||
]]
|
||||
--[[
|
||||
]]
|
||||
assert(debug.getinfo(1, "l").currentline == L+11) -- check count of lines
|
||||
|
||||
|
||||
function g(...)
|
||||
local arg = {...}
|
||||
do local a,b,c; a=math.sin(40); end
|
||||
local feijao
|
||||
local AAAA,B = "xuxu", "mamão"
|
||||
f(AAAA,B)
|
||||
assert(AAAA == "pera" and B == "maçã")
|
||||
do
|
||||
local B = 13
|
||||
local x,y = debug.getlocal(1,5)
|
||||
assert(x == 'B' and y == 13)
|
||||
end
|
||||
end
|
||||
|
||||
g()
|
||||
|
||||
|
||||
assert(a[f] and a[g] and a[assert] and a[debug.getlocal] and not a[print])
|
||||
|
||||
|
||||
-- tests for manipulating non-registered locals (C and Lua temporaries)
|
||||
|
||||
local n, v = debug.getlocal(0, 1)
|
||||
assert(v == 0 and n == "(*temporary)")
|
||||
local n, v = debug.getlocal(0, 2)
|
||||
assert(v == 2 and n == "(*temporary)")
|
||||
assert(not debug.getlocal(0, 3))
|
||||
assert(not debug.getlocal(0, 0))
|
||||
|
||||
function f()
|
||||
assert(select(2, debug.getlocal(2,3)) == 1)
|
||||
assert(not debug.getlocal(2,4))
|
||||
debug.setlocal(2, 3, 10)
|
||||
return 20
|
||||
end
|
||||
|
||||
function g(a,b) return (a+1) + f() end
|
||||
|
||||
assert(g(0,0) == 30)
|
||||
|
||||
|
||||
debug.sethook(nil);
|
||||
assert(debug.gethook() == nil)
|
||||
|
||||
|
||||
-- testing access to function arguments
|
||||
|
||||
X = nil
|
||||
a = {}
|
||||
function a:f (a, b, ...) local arg = {...}; local c = 13 end
|
||||
debug.sethook(function (e)
|
||||
assert(e == "call")
|
||||
dostring("XX = 12") -- test dostring inside hooks
|
||||
-- testing errors inside hooks
|
||||
assert(not pcall(load("a='joao'+1")))
|
||||
debug.sethook(function (e, l)
|
||||
assert(debug.getinfo(2, "l").currentline == l)
|
||||
local f,m,c = debug.gethook()
|
||||
assert(e == "line")
|
||||
assert(m == 'l' and c == 0)
|
||||
debug.sethook(nil) -- hook is called only once
|
||||
assert(not X) -- check that
|
||||
X = {}; local i = 1
|
||||
local x,y
|
||||
while 1 do
|
||||
x,y = debug.getlocal(2, i)
|
||||
if x==nil then break end
|
||||
X[x] = y
|
||||
i = i+1
|
||||
end
|
||||
end, "l")
|
||||
end, "c")
|
||||
|
||||
a:f(1,2,3,4,5)
|
||||
assert(X.self == a and X.a == 1 and X.b == 2 and X.c == nil)
|
||||
assert(XX == 12)
|
||||
assert(debug.gethook() == nil)
|
||||
|
||||
|
||||
-- testing upvalue access
|
||||
local function getupvalues (f)
|
||||
local t = {}
|
||||
local i = 1
|
||||
while true do
|
||||
local name, value = debug.getupvalue(f, i)
|
||||
if not name then break end
|
||||
assert(not t[name])
|
||||
t[name] = value
|
||||
i = i + 1
|
||||
end
|
||||
return t
|
||||
end
|
||||
|
||||
local a,b,c = 1,2,3
|
||||
local function foo1 (a) b = a; return c end
|
||||
local function foo2 (x) a = x; return c+b end
|
||||
assert(debug.getupvalue(foo1, 3) == nil)
|
||||
assert(debug.getupvalue(foo1, 0) == nil)
|
||||
assert(debug.setupvalue(foo1, 3, "xuxu") == nil)
|
||||
local t = getupvalues(foo1)
|
||||
assert(t.a == nil and t.b == 2 and t.c == 3)
|
||||
t = getupvalues(foo2)
|
||||
assert(t.a == 1 and t.b == 2 and t.c == 3)
|
||||
assert(debug.setupvalue(foo1, 1, "xuxu") == "b")
|
||||
assert(({debug.getupvalue(foo2, 3)})[2] == "xuxu")
|
||||
-- upvalues of C functions are allways "called" "" (the empty string)
|
||||
assert(debug.getupvalue(string.gmatch("x", "x"), 1) == "")
|
||||
|
||||
|
||||
-- testing count hooks
|
||||
local a=0
|
||||
debug.sethook(function (e) a=a+1 end, "", 1)
|
||||
a=0; for i=1,1000 do end; assert(1000 < a and a < 1012)
|
||||
debug.sethook(function (e) a=a+1 end, "", 4)
|
||||
a=0; for i=1,1000 do end; assert(250 < a and a < 255)
|
||||
local f,m,c = debug.gethook()
|
||||
assert(m == "" and c == 4)
|
||||
debug.sethook(function (e) a=a+1 end, "", 4000)
|
||||
a=0; for i=1,1000 do end; assert(a == 0)
|
||||
|
||||
if not _no32 then
|
||||
debug.sethook(print, "", 2^24 - 1) -- count upperbound
|
||||
local f,m,c = debug.gethook()
|
||||
assert(({debug.gethook()})[3] == 2^24 - 1)
|
||||
end
|
||||
|
||||
debug.sethook()
|
||||
|
||||
|
||||
-- tests for tail calls
|
||||
local function f (x)
|
||||
if x then
|
||||
assert(debug.getinfo(1, "S").what == "Lua")
|
||||
assert(debug.getinfo(1, "t").istailcall == true)
|
||||
local tail = debug.getinfo(2)
|
||||
assert(tail.func == g1 and tail.istailcall == true)
|
||||
assert(debug.getinfo(3, "S").what == "main")
|
||||
print"+"
|
||||
end
|
||||
end
|
||||
|
||||
function g(x) return f(x) end
|
||||
|
||||
function g1(x) g(x) end
|
||||
|
||||
local function h (x) local f=g1; return f(x) end
|
||||
|
||||
h(true)
|
||||
|
||||
local b = {}
|
||||
debug.sethook(function (e) table.insert(b, e) end, "cr")
|
||||
h(false)
|
||||
debug.sethook()
|
||||
local res = {"return", -- first return (from sethook)
|
||||
"call", "tail call", "call", "tail call",
|
||||
"return", "return",
|
||||
"call", -- last call (to sethook)
|
||||
}
|
||||
for i = 1, #res do assert(res[i] == table.remove(b, 1)) end
|
||||
|
||||
b = 0
|
||||
debug.sethook(function (e)
|
||||
if e == "tail call" then
|
||||
b = b + 1
|
||||
assert(debug.getinfo(2, "t").istailcall == true)
|
||||
else
|
||||
assert(debug.getinfo(2, "t").istailcall == false)
|
||||
end
|
||||
end, "c")
|
||||
h(false)
|
||||
debug.sethook()
|
||||
assert(b == 2) -- two tail calls
|
||||
|
||||
lim = 30000
|
||||
if _soft then limit = 3000 end
|
||||
local function foo (x)
|
||||
if x==0 then
|
||||
assert(debug.getinfo(2).what == "main")
|
||||
local info = debug.getinfo(1)
|
||||
assert(info.istailcall == true and info.func == foo)
|
||||
else return foo(x-1)
|
||||
end
|
||||
end
|
||||
|
||||
foo(lim)
|
||||
|
||||
|
||||
print"+"
|
||||
|
||||
|
||||
-- testing local function information
|
||||
co = load[[
|
||||
local A = function ()
|
||||
return x
|
||||
end
|
||||
return
|
||||
]]
|
||||
|
||||
local a = 0
|
||||
-- 'A' should be visible to debugger only after its complete definition
|
||||
debug.sethook(function (e, l)
|
||||
if l == 3 then a = a + 1; assert(debug.getlocal(2, 1) == "(*temporary)")
|
||||
elseif l == 4 then a = a + 1; assert(debug.getlocal(2, 1) == "A")
|
||||
end
|
||||
end, "l")
|
||||
co() -- run local function definition
|
||||
debug.sethook() -- turn off hook
|
||||
assert(a == 2) -- ensure all two lines where hooked
|
||||
|
||||
-- testing traceback
|
||||
|
||||
assert(debug.traceback(print) == print)
|
||||
assert(debug.traceback(print, 4) == print)
|
||||
assert(string.find(debug.traceback("hi", 4), "^hi\n"))
|
||||
assert(string.find(debug.traceback("hi"), "^hi\n"))
|
||||
assert(not string.find(debug.traceback("hi"), "'traceback'"))
|
||||
assert(string.find(debug.traceback("hi", 0), "'traceback'"))
|
||||
assert(string.find(debug.traceback(), "^stack traceback:\n"))
|
||||
|
||||
|
||||
-- testing nparams, nups e isvararg
|
||||
local t = debug.getinfo(print, "u")
|
||||
assert(t.isvararg == true and t.nparams == 0 and t.nups == 0)
|
||||
|
||||
t = debug.getinfo(function (a,b,c) end, "u")
|
||||
assert(t.isvararg == false and t.nparams == 3 and t.nups == 0)
|
||||
|
||||
t = debug.getinfo(function (a,b,...) return t[a] end, "u")
|
||||
assert(t.isvararg == true and t.nparams == 2 and t.nups == 1)
|
||||
|
||||
t = debug.getinfo(1) -- main
|
||||
assert(t.isvararg == true and t.nparams == 0 and t.nups == 1 and
|
||||
debug.getupvalue(t.func, 1) == "_ENV")
|
||||
|
||||
|
||||
-- testing debugging of coroutines
|
||||
|
||||
local function checktraceback (co, p, level)
|
||||
local tb = debug.traceback(co, nil, level)
|
||||
local i = 0
|
||||
for l in string.gmatch(tb, "[^\n]+\n?") do
|
||||
assert(i == 0 or string.find(l, p[i]))
|
||||
i = i+1
|
||||
end
|
||||
assert(p[i] == nil)
|
||||
end
|
||||
|
||||
|
||||
local function f (n)
|
||||
if n > 0 then f(n-1)
|
||||
else coroutine.yield() end
|
||||
end
|
||||
|
||||
local co = coroutine.create(f)
|
||||
coroutine.resume(co, 3)
|
||||
checktraceback(co, {"yield", "db.lua", "db.lua", "db.lua", "db.lua"})
|
||||
checktraceback(co, {"db.lua", "db.lua", "db.lua", "db.lua"}, 1)
|
||||
checktraceback(co, {"db.lua", "db.lua", "db.lua"}, 2)
|
||||
checktraceback(co, {"db.lua"}, 4)
|
||||
checktraceback(co, {}, 40)
|
||||
|
||||
|
||||
co = coroutine.create(function (x)
|
||||
local a = 1
|
||||
coroutine.yield(debug.getinfo(1, "l"))
|
||||
coroutine.yield(debug.getinfo(1, "l").currentline)
|
||||
return a
|
||||
end)
|
||||
|
||||
local tr = {}
|
||||
local foo = function (e, l) if l then table.insert(tr, l) end end
|
||||
debug.sethook(co, foo, "lcr")
|
||||
|
||||
local _, l = coroutine.resume(co, 10)
|
||||
local x = debug.getinfo(co, 1, "lfLS")
|
||||
assert(x.currentline == l.currentline and x.activelines[x.currentline])
|
||||
assert(type(x.func) == "function")
|
||||
for i=x.linedefined + 1, x.lastlinedefined do
|
||||
assert(x.activelines[i])
|
||||
x.activelines[i] = nil
|
||||
end
|
||||
assert(next(x.activelines) == nil) -- no 'extra' elements
|
||||
assert(debug.getinfo(co, 2) == nil)
|
||||
local a,b = debug.getlocal(co, 1, 1)
|
||||
assert(a == "x" and b == 10)
|
||||
a,b = debug.getlocal(co, 1, 2)
|
||||
assert(a == "a" and b == 1)
|
||||
debug.setlocal(co, 1, 2, "hi")
|
||||
assert(debug.gethook(co) == foo)
|
||||
assert(#tr == 2 and
|
||||
tr[1] == l.currentline-1 and tr[2] == l.currentline)
|
||||
|
||||
a,b,c = pcall(coroutine.resume, co)
|
||||
assert(a and b and c == l.currentline+1)
|
||||
checktraceback(co, {"yield", "in function <"})
|
||||
|
||||
a,b = coroutine.resume(co)
|
||||
assert(a and b == "hi")
|
||||
assert(#tr == 4 and tr[4] == l.currentline+2)
|
||||
assert(debug.gethook(co) == foo)
|
||||
assert(debug.gethook() == nil)
|
||||
checktraceback(co, {})
|
||||
|
||||
|
||||
-- check traceback of suspended (or dead with error) coroutines
|
||||
|
||||
function f(i) if i==0 then error(i) else coroutine.yield(); f(i-1) end end
|
||||
|
||||
co = coroutine.create(function (x) f(x) end)
|
||||
a, b = coroutine.resume(co, 3)
|
||||
t = {"'yield'", "'f'", "in function <"}
|
||||
while coroutine.status(co) == "suspended" do
|
||||
checktraceback(co, t)
|
||||
a, b = coroutine.resume(co)
|
||||
table.insert(t, 2, "'f'") -- one more recursive call to 'f'
|
||||
end
|
||||
t[1] = "'error'"
|
||||
checktraceback(co, t)
|
||||
|
||||
|
||||
-- test acessing line numbers of a coroutine from a resume inside
|
||||
-- a C function (this is a known bug in Lua 5.0)
|
||||
|
||||
local function g(x)
|
||||
coroutine.yield(x)
|
||||
end
|
||||
|
||||
local function f (i)
|
||||
debug.sethook(function () end, "l")
|
||||
for j=1,1000 do
|
||||
g(i+j)
|
||||
end
|
||||
end
|
||||
|
||||
local co = coroutine.wrap(f)
|
||||
co(10)
|
||||
pcall(co)
|
||||
pcall(co)
|
||||
|
||||
|
||||
assert(type(debug.getregistry()) == "table")
|
||||
|
||||
|
||||
-- test tagmethod information
|
||||
local a = {}
|
||||
local function f (t)
|
||||
local info = debug.getinfo(1);
|
||||
assert(info.namewhat == "metamethod")
|
||||
a.op = info.name
|
||||
return info.name
|
||||
end
|
||||
setmetatable(a, {
|
||||
__index = f; __add = f; __div = f; __mod = f; __concat = f; __pow = f;
|
||||
__eq = f; __le = f; __lt = f;
|
||||
})
|
||||
|
||||
local b = setmetatable({}, getmetatable(a))
|
||||
|
||||
assert(a[3] == "__index" and a^3 == "__pow" and a..a == "__concat")
|
||||
assert(a/3 == "__div" and 3%a == "__mod")
|
||||
assert (a==b and a.op == "__eq")
|
||||
assert (a>=b and a.op == "__le")
|
||||
assert (a>b and a.op == "__lt")
|
||||
|
||||
|
||||
print"OK"
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/errors.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/errors.lc
Normal file
Binary file not shown.
422
luaj-test/src/test/resources/lua5.2.1-tests/errors.lua
Normal file
422
luaj-test/src/test/resources/lua5.2.1-tests/errors.lua
Normal file
@@ -0,0 +1,422 @@
|
||||
print("testing errors")
|
||||
|
||||
local debug = require"debug"
|
||||
|
||||
-- avoid problems with 'strict' module (which may generate other error messages)
|
||||
local mt = getmetatable(_G) or {}
|
||||
local oldmm = mt.__index
|
||||
mt.__index = nil
|
||||
|
||||
function doit (s)
|
||||
local f, msg = load(s)
|
||||
if f == nil then return msg end
|
||||
local cond, msg = pcall(f)
|
||||
return (not cond) and msg
|
||||
end
|
||||
|
||||
|
||||
function checkmessage (prog, msg)
|
||||
local m = doit(prog)
|
||||
assert(string.find(m, msg, 1, true))
|
||||
end
|
||||
|
||||
function checksyntax (prog, extra, token, line)
|
||||
local msg = doit(prog)
|
||||
if not string.find(token, "^<%a") and not string.find(token, "^char%(")
|
||||
then token = "'"..token.."'" end
|
||||
token = string.gsub(token, "(%p)", "%%%1")
|
||||
local pt = string.format([[^%%[string ".*"%%]:%d: .- near %s$]],
|
||||
line, token)
|
||||
assert(string.find(msg, pt))
|
||||
assert(string.find(msg, msg, 1, true))
|
||||
end
|
||||
|
||||
|
||||
-- test error message with no extra info
|
||||
assert(doit("error('hi', 0)") == 'hi')
|
||||
|
||||
-- test error message with no info
|
||||
assert(doit("error()") == nil)
|
||||
|
||||
|
||||
-- test common errors/errors that crashed in the past
|
||||
if not _no32 then
|
||||
assert(doit("table.unpack({}, 1, n=2^30)"))
|
||||
end
|
||||
assert(doit("a=math.sin()"))
|
||||
assert(not doit("tostring(1)") and doit("tostring()"))
|
||||
assert(doit"tonumber()")
|
||||
assert(doit"repeat until 1; a")
|
||||
assert(doit"return;;")
|
||||
assert(doit"assert(false)")
|
||||
assert(doit"assert(nil)")
|
||||
assert(doit("function a (... , ...) end"))
|
||||
assert(doit("function a (, ...) end"))
|
||||
assert(doit("local t={}; t = t[#t] + 1"))
|
||||
|
||||
checksyntax([[
|
||||
local a = {4
|
||||
|
||||
]], "'}' expected (to close '{' at line 1)", "<eof>", 3)
|
||||
|
||||
|
||||
-- tests for better error messages
|
||||
|
||||
checkmessage("a=1; bbbb=2; a=math.sin(3)+bbbb(3)", "global 'bbbb'")
|
||||
checkmessage("a=1; local a,bbbb=2,3; a = math.sin(1) and bbbb(3)",
|
||||
"local 'bbbb'")
|
||||
checkmessage("a={}; do local a=1 end a:bbbb(3)", "method 'bbbb'")
|
||||
checkmessage("local a={}; a.bbbb(3)", "field 'bbbb'")
|
||||
assert(not string.find(doit"a={13}; local bbbb=1; a[bbbb](3)", "'bbbb'"))
|
||||
checkmessage("a={13}; local bbbb=1; a[bbbb](3)", "number")
|
||||
checkmessage("a=(1)..{}", "a table value")
|
||||
|
||||
aaa = nil
|
||||
checkmessage("aaa.bbb:ddd(9)", "global 'aaa'")
|
||||
checkmessage("local aaa={bbb=1}; aaa.bbb:ddd(9)", "field 'bbb'")
|
||||
checkmessage("local aaa={bbb={}}; aaa.bbb:ddd(9)", "method 'ddd'")
|
||||
checkmessage("local a,b,c; (function () a = b+1 end)()", "upvalue 'b'")
|
||||
assert(not doit"local aaa={bbb={ddd=next}}; aaa.bbb:ddd(nil)")
|
||||
|
||||
checkmessage("local _ENV = {x={}}; a = a + 1", "global 'a'")
|
||||
|
||||
checkmessage("b=1; local aaa='a'; x=aaa+b", "local 'aaa'")
|
||||
checkmessage("aaa={}; x=3/aaa", "global 'aaa'")
|
||||
checkmessage("aaa='2'; b=nil;x=aaa*b", "global 'b'")
|
||||
checkmessage("aaa={}; x=-aaa", "global 'aaa'")
|
||||
assert(not string.find(doit"aaa={}; x=(aaa or aaa)+(aaa and aaa)", "'aaa'"))
|
||||
assert(not string.find(doit"aaa={}; (aaa or aaa)()", "'aaa'"))
|
||||
|
||||
checkmessage("print(print < 10)", "function")
|
||||
checkmessage("print(print < print)", "two function")
|
||||
|
||||
|
||||
-- passing light userdata instead of full userdata
|
||||
_G.D = debug
|
||||
checkmessage([[
|
||||
-- create light udata
|
||||
local x = D.upvalueid(function () return debug end, 1)
|
||||
D.setuservalue(x, {})
|
||||
]], "light userdata")
|
||||
_G.D = nil
|
||||
|
||||
|
||||
-- global functions
|
||||
checkmessage("(io.write or print){}", "io.write")
|
||||
checkmessage("(collectgarbage or print){}", "collectgarbage")
|
||||
|
||||
-- tests for field accesses after RK limit
|
||||
local t = {}
|
||||
for i = 1, 1000 do
|
||||
t[i] = "a = x" .. i
|
||||
end
|
||||
local s = table.concat(t, "; ")
|
||||
t = nil
|
||||
checkmessage(s.."; a = bbb + 1", "global 'bbb'")
|
||||
checkmessage("local _ENV=_ENV;"..s.."; a = bbb + 1", "global 'bbb'")
|
||||
checkmessage(s.."; local t = {}; a = t.bbb + 1", "field 'bbb'")
|
||||
checkmessage(s.."; local t = {}; t:bbb()", "method 'bbb'")
|
||||
|
||||
checkmessage([[aaa=9
|
||||
repeat until 3==3
|
||||
local x=math.sin(math.cos(3))
|
||||
if math.sin(1) == x then return math.sin(1) end -- tail call
|
||||
local a,b = 1, {
|
||||
{x='a'..'b'..'c', y='b', z=x},
|
||||
{1,2,3,4,5} or 3+3<=3+3,
|
||||
3+1>3+1,
|
||||
{d = x and aaa[x or y]}}
|
||||
]], "global 'aaa'")
|
||||
|
||||
checkmessage([[
|
||||
local x,y = {},1
|
||||
if math.sin(1) == 0 then return 3 end -- return
|
||||
x.a()]], "field 'a'")
|
||||
|
||||
checkmessage([[
|
||||
prefix = nil
|
||||
insert = nil
|
||||
while 1 do
|
||||
local a
|
||||
if nil then break end
|
||||
insert(prefix, a)
|
||||
end]], "global 'insert'")
|
||||
|
||||
checkmessage([[ -- tail call
|
||||
return math.sin("a")
|
||||
]], "'sin'")
|
||||
|
||||
checkmessage([[collectgarbage("nooption")]], "invalid option")
|
||||
|
||||
checkmessage([[x = print .. "a"]], "concatenate")
|
||||
|
||||
checkmessage("getmetatable(io.stdin).__gc()", "no value")
|
||||
|
||||
checkmessage([[
|
||||
local Var
|
||||
local function main()
|
||||
NoSuchName (function() Var=0 end)
|
||||
end
|
||||
main()
|
||||
]], "global 'NoSuchName'")
|
||||
print'+'
|
||||
|
||||
a = {}; setmetatable(a, {__index = string})
|
||||
checkmessage("a:sub()", "bad self")
|
||||
checkmessage("string.sub('a', {})", "#2")
|
||||
checkmessage("('a'):sub{}", "#1")
|
||||
|
||||
checkmessage("table.sort({1,2,3}, table.sort)", "'table.sort'")
|
||||
-- next message may be 'setmetatable' or '_G.setmetatable'
|
||||
checkmessage("string.gsub('s', 's', setmetatable)", "setmetatable'")
|
||||
|
||||
-- tests for errors in coroutines
|
||||
|
||||
function f (n)
|
||||
local c = coroutine.create(f)
|
||||
local a,b = coroutine.resume(c)
|
||||
return b
|
||||
end
|
||||
assert(string.find(f(), "C stack overflow"))
|
||||
|
||||
checkmessage("coroutine.yield()", "outside a coroutine")
|
||||
|
||||
f1 = function () table.sort({1,2,3}, coroutine.yield) end
|
||||
f = coroutine.wrap(function () return pcall(f1) end)
|
||||
assert(string.find(select(2, f()), "yield across"))
|
||||
|
||||
|
||||
-- testing size of 'source' info; size of buffer for that info is
|
||||
-- LUA_IDSIZE, declared as 60 in luaconf. Get one position for '\0'.
|
||||
idsize = 60 - 1
|
||||
local function checksize (source)
|
||||
-- syntax error
|
||||
local _, msg = load("x", source)
|
||||
msg = string.match(msg, "^([^:]*):") -- get source (1st part before ':')
|
||||
assert(msg:len() <= idsize)
|
||||
end
|
||||
|
||||
for i = 60 - 10, 60 + 10 do -- check border cases around 60
|
||||
checksize("@" .. string.rep("x", i)) -- file names
|
||||
checksize(string.rep("x", i - 10)) -- string sources
|
||||
checksize("=" .. string.rep("x", i)) -- exact sources
|
||||
end
|
||||
|
||||
|
||||
-- testing line error
|
||||
|
||||
local function lineerror (s, l)
|
||||
local err,msg = pcall(load(s))
|
||||
local line = string.match(msg, ":(%d+):")
|
||||
assert((line and line+0) == l)
|
||||
end
|
||||
|
||||
lineerror("local a\n for i=1,'a' do \n print(i) \n end", 2)
|
||||
lineerror("\n local a \n for k,v in 3 \n do \n print(k) \n end", 3)
|
||||
lineerror("\n\n for k,v in \n 3 \n do \n print(k) \n end", 4)
|
||||
lineerror("function a.x.y ()\na=a+1\nend", 1)
|
||||
|
||||
lineerror("a = \na\n+\n{}", 3)
|
||||
lineerror("a = \n3\n+\n(\n4\n/\nprint)", 6)
|
||||
lineerror("a = \nprint\n+\n(\n4\n/\n7)", 3)
|
||||
|
||||
lineerror("a\n=\n-\n\nprint\n;", 3)
|
||||
|
||||
lineerror([[
|
||||
a
|
||||
(
|
||||
23)
|
||||
]], 1)
|
||||
|
||||
lineerror([[
|
||||
local a = {x = 13}
|
||||
a
|
||||
.
|
||||
x
|
||||
(
|
||||
23
|
||||
)
|
||||
]], 2)
|
||||
|
||||
lineerror([[
|
||||
local a = {x = 13}
|
||||
a
|
||||
.
|
||||
x
|
||||
(
|
||||
23 + a
|
||||
)
|
||||
]], 6)
|
||||
|
||||
local p = [[
|
||||
function g() f() end
|
||||
function f(x) error('a', X) end
|
||||
g()
|
||||
]]
|
||||
X=3;lineerror((p), 3)
|
||||
X=0;lineerror((p), nil)
|
||||
X=1;lineerror((p), 2)
|
||||
X=2;lineerror((p), 1)
|
||||
|
||||
|
||||
if not _soft then
|
||||
-- several tests that exaust the Lua stack
|
||||
C = 0
|
||||
local l = debug.getinfo(1, "l").currentline; function y () C=C+1; y() end
|
||||
|
||||
local function checkstackmessage (m)
|
||||
return (string.find(m, "^.-:%d+: stack overflow"))
|
||||
end
|
||||
-- repeated stack overflows (to check stack recovery)
|
||||
assert(checkstackmessage(doit('y()')))
|
||||
print('+')
|
||||
assert(checkstackmessage(doit('y()')))
|
||||
print('+')
|
||||
assert(checkstackmessage(doit('y()')))
|
||||
print('+')
|
||||
|
||||
|
||||
-- error lines in stack overflow
|
||||
C = 0
|
||||
local l1
|
||||
local function g(x)
|
||||
l1 = debug.getinfo(x, "l").currentline; y()
|
||||
end
|
||||
local _, stackmsg = xpcall(g, debug.traceback, 1)
|
||||
print('+')
|
||||
local stack = {}
|
||||
for line in string.gmatch(stackmsg, "[^\n]*") do
|
||||
local curr = string.match(line, ":(%d+):")
|
||||
if curr then table.insert(stack, tonumber(curr)) end
|
||||
end
|
||||
local i=1
|
||||
while stack[i] ~= l1 do
|
||||
assert(stack[i] == l)
|
||||
i = i+1
|
||||
end
|
||||
assert(i > 15)
|
||||
|
||||
|
||||
-- error in error handling
|
||||
local res, msg = xpcall(error, error)
|
||||
assert(not res and type(msg) == 'string')
|
||||
print('+')
|
||||
|
||||
local function f (x)
|
||||
if x==0 then error('a\n')
|
||||
else
|
||||
local aux = function () return f(x-1) end
|
||||
local a,b = xpcall(aux, aux)
|
||||
return a,b
|
||||
end
|
||||
end
|
||||
f(3)
|
||||
|
||||
local function loop (x,y,z) return 1 + loop(x, y, z) end
|
||||
|
||||
local res, msg = xpcall(loop, function (m)
|
||||
assert(string.find(m, "stack overflow"))
|
||||
local res, msg = pcall(loop)
|
||||
assert(string.find(msg, "error handling"))
|
||||
assert(math.sin(0) == 0)
|
||||
return 15
|
||||
end)
|
||||
assert(msg == 15)
|
||||
|
||||
res, msg = pcall(function ()
|
||||
for i = 999900, 1000000, 1 do table.unpack({}, 1, i) end
|
||||
end)
|
||||
assert(string.find(msg, "too many results"))
|
||||
|
||||
end
|
||||
|
||||
|
||||
-- non string messages
|
||||
function f() error{msg='x'} end
|
||||
res, msg = xpcall(f, function (r) return {msg=r.msg..'y'} end)
|
||||
assert(msg.msg == 'xy')
|
||||
|
||||
-- xpcall with arguments
|
||||
a, b, c = xpcall(string.find, error, "alo", "al")
|
||||
assert(a and b == 1 and c == 2)
|
||||
a, b, c = xpcall(string.find, function (x) return {} end, true, "al")
|
||||
assert(not a and type(b) == "table" and c == nil)
|
||||
|
||||
print('+')
|
||||
checksyntax("syntax error", "", "error", 1)
|
||||
checksyntax("1.000", "", "1.000", 1)
|
||||
checksyntax("[[a]]", "", "[[a]]", 1)
|
||||
checksyntax("'aa'", "", "'aa'", 1)
|
||||
|
||||
-- test 255 as first char in a chunk
|
||||
checksyntax("\255a = 1", "", "char(255)", 1)
|
||||
|
||||
doit('I = load("a=9+"); a=3')
|
||||
assert(a==3 and I == nil)
|
||||
print('+')
|
||||
|
||||
lim = 1000
|
||||
if _soft then lim = 100 end
|
||||
for i=1,lim do
|
||||
doit('a = ')
|
||||
doit('a = 4+nil')
|
||||
end
|
||||
|
||||
|
||||
-- testing syntax limits
|
||||
local function testrep (init, rep)
|
||||
local s = "local a; "..init .. string.rep(rep, 400)
|
||||
local a,b = load(s)
|
||||
assert(not a and string.find(b, "levels"))
|
||||
end
|
||||
testrep("a=", "{")
|
||||
testrep("a=", "(")
|
||||
testrep("", "a(")
|
||||
testrep("", "do ")
|
||||
testrep("", "while a do ")
|
||||
testrep("", "if a then else ")
|
||||
testrep("", "function foo () ")
|
||||
testrep("a=", "a..")
|
||||
testrep("a=", "a^")
|
||||
|
||||
local s = ("a,"):rep(200).."a=nil"
|
||||
local a,b = load(s)
|
||||
assert(not a and string.find(b, "levels"))
|
||||
|
||||
|
||||
-- testing other limits
|
||||
-- upvalues
|
||||
local lim = 127
|
||||
local s = "local function fooA ()\n local "
|
||||
for j = 1,lim do
|
||||
s = s.."a"..j..", "
|
||||
end
|
||||
s = s.."b,c\n"
|
||||
s = s.."local function fooB ()\n local "
|
||||
for j = 1,lim do
|
||||
s = s.."b"..j..", "
|
||||
end
|
||||
s = s.."b\n"
|
||||
s = s.."function fooC () return b+c"
|
||||
local c = 1+2
|
||||
for j = 1,lim do
|
||||
s = s.."+a"..j.."+b"..j
|
||||
c = c + 2
|
||||
end
|
||||
s = s.."\nend end end"
|
||||
local a,b = load(s)
|
||||
assert(c > 255 and string.find(b, "too many upvalues") and
|
||||
string.find(b, "line 5"))
|
||||
|
||||
-- local variables
|
||||
s = "\nfunction foo ()\n local "
|
||||
for j = 1,300 do
|
||||
s = s.."a"..j..", "
|
||||
end
|
||||
s = s.."b\n"
|
||||
local a,b = load(s)
|
||||
assert(string.find(b, "line 2"))
|
||||
|
||||
mt.__index = oldmm
|
||||
|
||||
print('OK')
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/events.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/events.lc
Normal file
Binary file not shown.
388
luaj-test/src/test/resources/lua5.2.1-tests/events.lua
Normal file
388
luaj-test/src/test/resources/lua5.2.1-tests/events.lua
Normal file
@@ -0,0 +1,388 @@
|
||||
print('testing metatables')
|
||||
|
||||
X = 20; B = 30
|
||||
|
||||
_ENV = setmetatable({}, {__index=_G})
|
||||
|
||||
collectgarbage()
|
||||
|
||||
X = X+10
|
||||
assert(X == 30 and _G.X == 20)
|
||||
B = false
|
||||
assert(B == false)
|
||||
B = nil
|
||||
assert(B == 30)
|
||||
|
||||
assert(getmetatable{} == nil)
|
||||
assert(getmetatable(4) == nil)
|
||||
assert(getmetatable(nil) == nil)
|
||||
a={}; setmetatable(a, {__metatable = "xuxu",
|
||||
__tostring=function(x) return x.name end})
|
||||
assert(getmetatable(a) == "xuxu")
|
||||
assert(tostring(a) == nil)
|
||||
-- cannot change a protected metatable
|
||||
assert(pcall(setmetatable, a, {}) == false)
|
||||
a.name = "gororoba"
|
||||
assert(tostring(a) == "gororoba")
|
||||
|
||||
local a, t = {10,20,30; x="10", y="20"}, {}
|
||||
assert(setmetatable(a,t) == a)
|
||||
assert(getmetatable(a) == t)
|
||||
assert(setmetatable(a,nil) == a)
|
||||
assert(getmetatable(a) == nil)
|
||||
assert(setmetatable(a,t) == a)
|
||||
|
||||
|
||||
function f (t, i, e)
|
||||
assert(not e)
|
||||
local p = rawget(t, "parent")
|
||||
return (p and p[i]+3), "dummy return"
|
||||
end
|
||||
|
||||
t.__index = f
|
||||
|
||||
a.parent = {z=25, x=12, [4] = 24}
|
||||
assert(a[1] == 10 and a.z == 28 and a[4] == 27 and a.x == "10")
|
||||
|
||||
collectgarbage()
|
||||
|
||||
a = setmetatable({}, t)
|
||||
function f(t, i, v) rawset(t, i, v-3) end
|
||||
setmetatable(t, t) -- causes a bug in 5.1 !
|
||||
t.__newindex = f
|
||||
a[1] = 30; a.x = "101"; a[5] = 200
|
||||
assert(a[1] == 27 and a.x == 98 and a[5] == 197)
|
||||
|
||||
|
||||
local c = {}
|
||||
a = setmetatable({}, t)
|
||||
t.__newindex = c
|
||||
a[1] = 10; a[2] = 20; a[3] = 90
|
||||
assert(c[1] == 10 and c[2] == 20 and c[3] == 90)
|
||||
|
||||
|
||||
do
|
||||
local a;
|
||||
a = setmetatable({}, {__index = setmetatable({},
|
||||
{__index = setmetatable({},
|
||||
{__index = function (_,n) return a[n-3]+4, "lixo" end})})})
|
||||
a[0] = 20
|
||||
for i=0,10 do
|
||||
assert(a[i*3] == 20 + i*4)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
do -- newindex
|
||||
local foi
|
||||
local a = {}
|
||||
for i=1,10 do a[i] = 0; a['a'..i] = 0; end
|
||||
setmetatable(a, {__newindex = function (t,k,v) foi=true; rawset(t,k,v) end})
|
||||
foi = false; a[1]=0; assert(not foi)
|
||||
foi = false; a['a1']=0; assert(not foi)
|
||||
foi = false; a['a11']=0; assert(foi)
|
||||
foi = false; a[11]=0; assert(foi)
|
||||
foi = false; a[1]=nil; assert(not foi)
|
||||
foi = false; a[1]=nil; assert(foi)
|
||||
end
|
||||
|
||||
|
||||
setmetatable(t, nil)
|
||||
function f (t, ...) return t, {...} end
|
||||
t.__call = f
|
||||
|
||||
do
|
||||
local x,y = a(table.unpack{'a', 1})
|
||||
assert(x==a and y[1]=='a' and y[2]==1 and y[3]==nil)
|
||||
x,y = a()
|
||||
assert(x==a and y[1]==nil)
|
||||
end
|
||||
|
||||
|
||||
local b = setmetatable({}, t)
|
||||
setmetatable(b,t)
|
||||
|
||||
function f(op)
|
||||
return function (...) cap = {[0] = op, ...} ; return (...) end
|
||||
end
|
||||
t.__add = f("add")
|
||||
t.__sub = f("sub")
|
||||
t.__mul = f("mul")
|
||||
t.__div = f("div")
|
||||
t.__mod = f("mod")
|
||||
t.__unm = f("unm")
|
||||
t.__pow = f("pow")
|
||||
t.__len = f("len")
|
||||
|
||||
assert(b+5 == b)
|
||||
assert(cap[0] == "add" and cap[1] == b and cap[2] == 5 and cap[3]==nil)
|
||||
assert(b+'5' == b)
|
||||
assert(cap[0] == "add" and cap[1] == b and cap[2] == '5' and cap[3]==nil)
|
||||
assert(5+b == 5)
|
||||
assert(cap[0] == "add" and cap[1] == 5 and cap[2] == b and cap[3]==nil)
|
||||
assert('5'+b == '5')
|
||||
assert(cap[0] == "add" and cap[1] == '5' and cap[2] == b and cap[3]==nil)
|
||||
b=b-3; assert(getmetatable(b) == t)
|
||||
assert(5-a == 5)
|
||||
assert(cap[0] == "sub" and cap[1] == 5 and cap[2] == a and cap[3]==nil)
|
||||
assert('5'-a == '5')
|
||||
assert(cap[0] == "sub" and cap[1] == '5' and cap[2] == a and cap[3]==nil)
|
||||
assert(a*a == a)
|
||||
assert(cap[0] == "mul" and cap[1] == a and cap[2] == a and cap[3]==nil)
|
||||
assert(a/0 == a)
|
||||
assert(cap[0] == "div" and cap[1] == a and cap[2] == 0 and cap[3]==nil)
|
||||
assert(a%2 == a)
|
||||
assert(cap[0] == "mod" and cap[1] == a and cap[2] == 2 and cap[3]==nil)
|
||||
assert(-a == a)
|
||||
assert(cap[0] == "unm" and cap[1] == a)
|
||||
assert(a^4 == a)
|
||||
assert(cap[0] == "pow" and cap[1] == a and cap[2] == 4 and cap[3]==nil)
|
||||
assert(a^'4' == a)
|
||||
assert(cap[0] == "pow" and cap[1] == a and cap[2] == '4' and cap[3]==nil)
|
||||
assert(4^a == 4)
|
||||
assert(cap[0] == "pow" and cap[1] == 4 and cap[2] == a and cap[3]==nil)
|
||||
assert('4'^a == '4')
|
||||
assert(cap[0] == "pow" and cap[1] == '4' and cap[2] == a and cap[3]==nil)
|
||||
assert(#a == a)
|
||||
assert(cap[0] == "len" and cap[1] == a)
|
||||
|
||||
|
||||
-- test for rawlen
|
||||
t = setmetatable({1,2,3}, {__len = function () return 10 end})
|
||||
assert(#t == 10 and rawlen(t) == 3)
|
||||
assert(rawlen"abc" == 3)
|
||||
assert(not pcall(rawlen, io.stdin))
|
||||
assert(not pcall(rawlen, 34))
|
||||
assert(not pcall(rawlen))
|
||||
|
||||
t = {}
|
||||
t.__lt = function (a,b,c)
|
||||
collectgarbage()
|
||||
assert(c == nil)
|
||||
if type(a) == 'table' then a = a.x end
|
||||
if type(b) == 'table' then b = b.x end
|
||||
return a<b, "dummy"
|
||||
end
|
||||
|
||||
function Op(x) return setmetatable({x=x}, t) end
|
||||
|
||||
local function test ()
|
||||
assert(not(Op(1)<Op(1)) and (Op(1)<Op(2)) and not(Op(2)<Op(1)))
|
||||
assert(not(1 < Op(1)) and (Op(1) < 2) and not(2 < Op(1)))
|
||||
assert(not(Op('a')<Op('a')) and (Op('a')<Op('b')) and not(Op('b')<Op('a')))
|
||||
assert(not('a' < Op('a')) and (Op('a') < 'b') and not(Op('b') < Op('a')))
|
||||
assert((Op(1)<=Op(1)) and (Op(1)<=Op(2)) and not(Op(2)<=Op(1)))
|
||||
assert((Op('a')<=Op('a')) and (Op('a')<=Op('b')) and not(Op('b')<=Op('a')))
|
||||
assert(not(Op(1)>Op(1)) and not(Op(1)>Op(2)) and (Op(2)>Op(1)))
|
||||
assert(not(Op('a')>Op('a')) and not(Op('a')>Op('b')) and (Op('b')>Op('a')))
|
||||
assert((Op(1)>=Op(1)) and not(Op(1)>=Op(2)) and (Op(2)>=Op(1)))
|
||||
assert((1 >= Op(1)) and not(1 >= Op(2)) and (Op(2) >= 1))
|
||||
assert((Op('a')>=Op('a')) and not(Op('a')>=Op('b')) and (Op('b')>=Op('a')))
|
||||
assert(('a' >= Op('a')) and not(Op('a') >= 'b') and (Op('b') >= Op('a')))
|
||||
end
|
||||
|
||||
test()
|
||||
|
||||
t.__le = function (a,b,c)
|
||||
assert(c == nil)
|
||||
if type(a) == 'table' then a = a.x end
|
||||
if type(b) == 'table' then b = b.x end
|
||||
return a<=b, "dummy"
|
||||
end
|
||||
|
||||
test() -- retest comparisons, now using both `lt' and `le'
|
||||
|
||||
|
||||
-- test `partial order'
|
||||
|
||||
local function Set(x)
|
||||
local y = {}
|
||||
for _,k in pairs(x) do y[k] = 1 end
|
||||
return setmetatable(y, t)
|
||||
end
|
||||
|
||||
t.__lt = function (a,b)
|
||||
for k in pairs(a) do
|
||||
if not b[k] then return false end
|
||||
b[k] = nil
|
||||
end
|
||||
return next(b) ~= nil
|
||||
end
|
||||
|
||||
t.__le = nil
|
||||
|
||||
assert(Set{1,2,3} < Set{1,2,3,4})
|
||||
assert(not(Set{1,2,3,4} < Set{1,2,3,4}))
|
||||
assert((Set{1,2,3,4} <= Set{1,2,3,4}))
|
||||
assert((Set{1,2,3,4} >= Set{1,2,3,4}))
|
||||
assert((Set{1,3} <= Set{3,5})) -- wrong!! model needs a `le' method ;-)
|
||||
|
||||
t.__le = function (a,b)
|
||||
for k in pairs(a) do
|
||||
if not b[k] then return false end
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
assert(not (Set{1,3} <= Set{3,5})) -- now its OK!
|
||||
assert(not(Set{1,3} <= Set{3,5}))
|
||||
assert(not(Set{1,3} >= Set{3,5}))
|
||||
|
||||
t.__eq = function (a,b)
|
||||
for k in pairs(a) do
|
||||
if not b[k] then return false end
|
||||
b[k] = nil
|
||||
end
|
||||
return next(b) == nil
|
||||
end
|
||||
|
||||
local s = Set{1,3,5}
|
||||
assert(s == Set{3,5,1})
|
||||
assert(not rawequal(s, Set{3,5,1}))
|
||||
assert(rawequal(s, s))
|
||||
assert(Set{1,3,5,1} == Set{3,5,1})
|
||||
assert(Set{1,3,5} ~= Set{3,5,1,6})
|
||||
t[Set{1,3,5}] = 1
|
||||
assert(t[Set{1,3,5}] == nil) -- `__eq' is not valid for table accesses
|
||||
|
||||
|
||||
t.__concat = function (a,b,c)
|
||||
assert(c == nil)
|
||||
if type(a) == 'table' then a = a.val end
|
||||
if type(b) == 'table' then b = b.val end
|
||||
if A then return a..b
|
||||
else
|
||||
return setmetatable({val=a..b}, t)
|
||||
end
|
||||
end
|
||||
|
||||
c = {val="c"}; setmetatable(c, t)
|
||||
d = {val="d"}; setmetatable(d, t)
|
||||
|
||||
A = true
|
||||
assert(c..d == 'cd')
|
||||
assert(0 .."a".."b"..c..d.."e".."f"..(5+3).."g" == "0abcdef8g")
|
||||
|
||||
A = false
|
||||
assert((c..d..c..d).val == 'cdcd')
|
||||
x = c..d
|
||||
assert(getmetatable(x) == t and x.val == 'cd')
|
||||
x = 0 .."a".."b"..c..d.."e".."f".."g"
|
||||
assert(x.val == "0abcdefg")
|
||||
|
||||
|
||||
-- concat metamethod x numbers (bug in 5.1.1)
|
||||
c = {}
|
||||
local x
|
||||
setmetatable(c, {__concat = function (a,b)
|
||||
assert(type(a) == "number" and b == c or type(b) == "number" and a == c)
|
||||
return c
|
||||
end})
|
||||
assert(c..5 == c and 5 .. c == c)
|
||||
assert(4 .. c .. 5 == c and 4 .. 5 .. 6 .. 7 .. c == c)
|
||||
|
||||
|
||||
-- test comparison compatibilities
|
||||
local t1, t2, c, d
|
||||
t1 = {}; c = {}; setmetatable(c, t1)
|
||||
d = {}
|
||||
t1.__eq = function () return true end
|
||||
t1.__lt = function () return true end
|
||||
setmetatable(d, t1)
|
||||
assert(c == d and c < d and not(d <= c))
|
||||
t2 = {}
|
||||
t2.__eq = t1.__eq
|
||||
t2.__lt = t1.__lt
|
||||
setmetatable(d, t2)
|
||||
assert(c == d and c < d and not(d <= c))
|
||||
|
||||
|
||||
|
||||
-- test for several levels of calls
|
||||
local i
|
||||
local tt = {
|
||||
__call = function (t, ...)
|
||||
i = i+1
|
||||
if t.f then return t.f(...)
|
||||
else return {...}
|
||||
end
|
||||
end
|
||||
}
|
||||
|
||||
local a = setmetatable({}, tt)
|
||||
local b = setmetatable({f=a}, tt)
|
||||
local c = setmetatable({f=b}, tt)
|
||||
|
||||
i = 0
|
||||
x = c(3,4,5)
|
||||
assert(i == 3 and x[1] == 3 and x[3] == 5)
|
||||
|
||||
|
||||
assert(_G.X == 20)
|
||||
|
||||
print'+'
|
||||
|
||||
local _g = _G
|
||||
_ENV = setmetatable({}, {__index=function (_,k) return _g[k] end})
|
||||
|
||||
|
||||
a = {}
|
||||
rawset(a, "x", 1, 2, 3)
|
||||
assert(a.x == 1 and rawget(a, "x", 3) == 1)
|
||||
|
||||
print '+'
|
||||
|
||||
-- testing metatables for basic types
|
||||
local debug = require'debug'
|
||||
mt = {}
|
||||
debug.setmetatable(10, mt)
|
||||
assert(getmetatable(-2) == mt)
|
||||
mt.__index = function (a,b) return a+b end
|
||||
assert((10)[3] == 13)
|
||||
assert((10)["3"] == 13)
|
||||
debug.setmetatable(23, nil)
|
||||
assert(getmetatable(-2) == nil)
|
||||
|
||||
debug.setmetatable(true, mt)
|
||||
assert(getmetatable(false) == mt)
|
||||
mt.__index = function (a,b) return a or b end
|
||||
assert((true)[false] == true)
|
||||
assert((false)[false] == false)
|
||||
debug.setmetatable(false, nil)
|
||||
assert(getmetatable(true) == nil)
|
||||
|
||||
debug.setmetatable(nil, mt)
|
||||
assert(getmetatable(nil) == mt)
|
||||
mt.__add = function (a,b) return (a or 0) + (b or 0) end
|
||||
assert(10 + nil == 10)
|
||||
assert(nil + 23 == 23)
|
||||
assert(nil + nil == 0)
|
||||
debug.setmetatable(nil, nil)
|
||||
assert(getmetatable(nil) == nil)
|
||||
|
||||
debug.setmetatable(nil, {})
|
||||
|
||||
|
||||
-- loops in delegation
|
||||
a = {}; setmetatable(a, a); a.__index = a; a.__newindex = a
|
||||
assert(not pcall(function (a,b) return a[b] end, a, 10))
|
||||
assert(not pcall(function (a,b,c) a[b] = c end, a, 10, true))
|
||||
|
||||
-- bug in 5.1
|
||||
T, K, V = nil
|
||||
grandparent = {}
|
||||
grandparent.__newindex = function(t,k,v) T=t; K=k; V=v end
|
||||
|
||||
parent = {}
|
||||
parent.__newindex = parent
|
||||
setmetatable(parent, grandparent)
|
||||
|
||||
child = setmetatable({}, parent)
|
||||
child.foo = 10 --> CRASH (on some machines)
|
||||
assert(T == parent and K == "foo" and V == 10)
|
||||
|
||||
print 'OK'
|
||||
|
||||
return 12
|
||||
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/files.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/files.lc
Normal file
Binary file not shown.
605
luaj-test/src/test/resources/lua5.2.1-tests/files.lua
Normal file
605
luaj-test/src/test/resources/lua5.2.1-tests/files.lua
Normal file
@@ -0,0 +1,605 @@
|
||||
debug = require "debug"
|
||||
|
||||
assert(type(os.getenv"PATH") == "string")
|
||||
|
||||
assert(io.input(io.stdin) == io.stdin)
|
||||
assert(not pcall(io.input, "non-existent-file"))
|
||||
assert(io.output(io.stdout) == io.stdout)
|
||||
|
||||
-- cannot close standard files
|
||||
assert(not io.close(io.stdin) and
|
||||
not io.stdout:close() and
|
||||
not io.stderr:close())
|
||||
|
||||
|
||||
assert(type(io.input()) == "userdata" and io.type(io.output()) == "file")
|
||||
assert(type(io.stdin) == "userdata" and io.type(io.stderr) == "file")
|
||||
assert(io.type(8) == nil)
|
||||
local a = {}; setmetatable(a, {})
|
||||
assert(io.type(a) == nil)
|
||||
|
||||
local a,b,c = io.open('xuxu_nao_existe')
|
||||
assert(not a and type(b) == "string" and type(c) == "number")
|
||||
|
||||
a,b,c = io.open('/a/b/c/d', 'w')
|
||||
assert(not a and type(b) == "string" and type(c) == "number")
|
||||
|
||||
local file = os.tmpname()
|
||||
local f, msg = io.open(file, "w")
|
||||
if not f then
|
||||
(Message or print)("'os.tmpname' file cannot be open; skipping file tests")
|
||||
|
||||
else --{ most tests here need tmpname
|
||||
f:close()
|
||||
|
||||
print('testing i/o')
|
||||
|
||||
local otherfile = os.tmpname()
|
||||
|
||||
assert(not pcall(io.open, file, "rw")) -- invalid mode
|
||||
assert(not pcall(io.open, file, "rb+")) -- invalid mode
|
||||
assert(not pcall(io.open, file, "r+bk")) -- invalid mode
|
||||
assert(not pcall(io.open, file, "")) -- invalid mode
|
||||
assert(not pcall(io.open, file, "+")) -- invalid mode
|
||||
assert(not pcall(io.open, file, "b")) -- invalid mode
|
||||
assert(io.open(file, "r+b")):close()
|
||||
assert(io.open(file, "r+")):close()
|
||||
assert(io.open(file, "rb")):close()
|
||||
|
||||
assert(os.setlocale('C', 'all'))
|
||||
|
||||
io.input(io.stdin); io.output(io.stdout);
|
||||
|
||||
os.remove(file)
|
||||
assert(loadfile(file) == nil)
|
||||
assert(io.open(file) == nil)
|
||||
io.output(file)
|
||||
assert(io.output() ~= io.stdout)
|
||||
|
||||
assert(io.output():seek() == 0)
|
||||
assert(io.write("alo alo"):seek() == string.len("alo alo"))
|
||||
assert(io.output():seek("cur", -3) == string.len("alo alo")-3)
|
||||
assert(io.write("joao"))
|
||||
assert(io.output():seek("end") == string.len("alo joao"))
|
||||
|
||||
assert(io.output():seek("set") == 0)
|
||||
|
||||
assert(io.write('"álo"', "{a}\n", "second line\n", "third line \n"))
|
||||
assert(io.write('çfourth_line'))
|
||||
io.output(io.stdout)
|
||||
collectgarbage() -- file should be closed by GC
|
||||
assert(io.input() == io.stdin and rawequal(io.output(), io.stdout))
|
||||
print('+')
|
||||
|
||||
-- test GC for files
|
||||
collectgarbage()
|
||||
for i=1,120 do
|
||||
for i=1,5 do
|
||||
io.input(file)
|
||||
assert(io.open(file, 'r'))
|
||||
io.lines(file)
|
||||
end
|
||||
collectgarbage()
|
||||
end
|
||||
|
||||
io.input():close()
|
||||
io.close()
|
||||
|
||||
assert(os.rename(file, otherfile))
|
||||
assert(os.rename(file, otherfile) == nil)
|
||||
|
||||
io.output(io.open(otherfile, "ab"))
|
||||
assert(io.write("\n\n\t\t 3450\n"));
|
||||
io.close()
|
||||
|
||||
-- test line generators
|
||||
assert(not pcall(io.lines, "non-existent-file"))
|
||||
assert(os.rename(otherfile, file))
|
||||
io.output(otherfile)
|
||||
local f = io.lines(file)
|
||||
while f() do end;
|
||||
assert(not pcall(f)) -- read lines after EOF
|
||||
assert(not pcall(f)) -- read lines after EOF
|
||||
-- copy from file to otherfile
|
||||
for l in io.lines(file) do io.write(l, "\n") end
|
||||
io.close()
|
||||
-- copy from otherfile back to file
|
||||
local f = assert(io.open(otherfile))
|
||||
assert(io.type(f) == "file")
|
||||
io.output(file)
|
||||
assert(io.output():read() == nil)
|
||||
for l in f:lines() do io.write(l, "\n") end
|
||||
assert(tostring(f):sub(1, 5) == "file ")
|
||||
assert(f:close()); io.close()
|
||||
assert(not pcall(io.close, f)) -- error trying to close again
|
||||
assert(tostring(f) == "file (closed)")
|
||||
assert(io.type(f) == "closed file")
|
||||
io.input(file)
|
||||
f = io.open(otherfile):lines()
|
||||
for l in io.lines() do assert(l == f()) end
|
||||
f = nil; collectgarbage()
|
||||
assert(os.remove(otherfile))
|
||||
|
||||
io.input(file)
|
||||
do -- test error returns
|
||||
local a,b,c = io.input():write("xuxu")
|
||||
assert(not a and type(b) == "string" and type(c) == "number")
|
||||
end
|
||||
assert(io.read(0) == "") -- not eof
|
||||
assert(io.read(5, '*l') == '"álo"')
|
||||
assert(io.read(0) == "")
|
||||
assert(io.read() == "second line")
|
||||
local x = io.input():seek()
|
||||
assert(io.read() == "third line ")
|
||||
assert(io.input():seek("set", x))
|
||||
assert(io.read('*L') == "third line \n")
|
||||
assert(io.read(1) == "ç")
|
||||
assert(io.read(string.len"fourth_line") == "fourth_line")
|
||||
assert(io.input():seek("cur", -string.len"fourth_line"))
|
||||
assert(io.read() == "fourth_line")
|
||||
assert(io.read() == "") -- empty line
|
||||
assert(io.read('*n') == 3450)
|
||||
assert(io.read(1) == '\n')
|
||||
assert(io.read(0) == nil) -- end of file
|
||||
assert(io.read(1) == nil) -- end of file
|
||||
assert(io.read(30000) == nil) -- end of file
|
||||
assert(({io.read(1)})[2] == nil)
|
||||
assert(io.read() == nil) -- end of file
|
||||
assert(({io.read()})[2] == nil)
|
||||
assert(io.read('*n') == nil) -- end of file
|
||||
assert(({io.read('*n')})[2] == nil)
|
||||
assert(io.read('*a') == '') -- end of file (OK for `*a')
|
||||
assert(io.read('*a') == '') -- end of file (OK for `*a')
|
||||
collectgarbage()
|
||||
print('+')
|
||||
io.close(io.input())
|
||||
assert(not pcall(io.read))
|
||||
|
||||
assert(os.remove(file))
|
||||
|
||||
local t = '0123456789'
|
||||
for i=1,12 do t = t..t; end
|
||||
assert(string.len(t) == 10*2^12)
|
||||
|
||||
io.output(file)
|
||||
io.write("alo"):write("\n")
|
||||
io.close()
|
||||
assert(not pcall(io.write))
|
||||
local f = io.open(file, "a+b")
|
||||
io.output(f)
|
||||
collectgarbage()
|
||||
|
||||
assert(io.write(' ' .. t .. ' '))
|
||||
assert(io.write(';', 'end of file\n'))
|
||||
f:flush(); io.flush()
|
||||
f:close()
|
||||
print('+')
|
||||
|
||||
io.input(file)
|
||||
assert(io.read() == "alo")
|
||||
assert(io.read(1) == ' ')
|
||||
assert(io.read(string.len(t)) == t)
|
||||
assert(io.read(1) == ' ')
|
||||
assert(io.read(0))
|
||||
assert(io.read('*a') == ';end of file\n')
|
||||
assert(io.read(0) == nil)
|
||||
assert(io.close(io.input()))
|
||||
|
||||
|
||||
-- test errors in read/write
|
||||
do
|
||||
local function ismsg (m)
|
||||
-- error message is not a code number
|
||||
return (type(m) == "string" and tonumber(m) == nil)
|
||||
end
|
||||
|
||||
-- read
|
||||
local f = io.open(file, "w")
|
||||
local r, m, c = f:read()
|
||||
assert(r == nil and ismsg(m) and type(c) == "number")
|
||||
assert(f:close())
|
||||
-- write
|
||||
f = io.open(file, "r")
|
||||
r, m, c = f:write("whatever")
|
||||
assert(r == nil and ismsg(m) and type(c) == "number")
|
||||
assert(f:close())
|
||||
-- lines
|
||||
f = io.open(file, "w")
|
||||
r, m = pcall(f:lines())
|
||||
assert(r == false and ismsg(m))
|
||||
assert(f:close())
|
||||
end
|
||||
|
||||
assert(os.remove(file))
|
||||
|
||||
-- test for *L format
|
||||
io.output(file); io.write"\n\nline\nother":close()
|
||||
io.input(file)
|
||||
assert(io.read"*L" == "\n")
|
||||
assert(io.read"*L" == "\n")
|
||||
assert(io.read"*L" == "line\n")
|
||||
assert(io.read"*L" == "other")
|
||||
assert(io.read"*L" == nil)
|
||||
io.input():close()
|
||||
|
||||
local f = assert(io.open(file))
|
||||
local s = ""
|
||||
for l in f:lines("*L") do s = s .. l end
|
||||
assert(s == "\n\nline\nother")
|
||||
f:close()
|
||||
|
||||
io.input(file)
|
||||
s = ""
|
||||
for l in io.lines(nil, "*L") do s = s .. l end
|
||||
assert(s == "\n\nline\nother")
|
||||
io.input():close()
|
||||
|
||||
s = ""
|
||||
for l in io.lines(file, "*L") do s = s .. l end
|
||||
assert(s == "\n\nline\nother")
|
||||
|
||||
s = ""
|
||||
for l in io.lines(file, "*l") do s = s .. l end
|
||||
assert(s == "lineother")
|
||||
|
||||
io.output(file); io.write"a = 10 + 34\na = 2*a\na = -a\n":close()
|
||||
local t = {}
|
||||
load(io.lines(file, "*L"), nil, nil, t)()
|
||||
assert(t.a == -((10 + 34) * 2))
|
||||
|
||||
|
||||
-- test for multipe arguments in 'lines'
|
||||
io.output(file); io.write"0123456789\n":close()
|
||||
for a,b in io.lines(file, 1, 1) do
|
||||
if a == "\n" then assert(b == nil)
|
||||
else assert(tonumber(a) == b - 1)
|
||||
end
|
||||
end
|
||||
|
||||
for a,b,c in io.lines(file, 1, 2, "*a") do
|
||||
assert(a == "0" and b == "12" and c == "3456789\n")
|
||||
end
|
||||
|
||||
for a,b,c in io.lines(file, "*a", 0, 1) do
|
||||
if a == "" then break end
|
||||
assert(a == "0123456789\n" and b == nil and c == nil)
|
||||
end
|
||||
collectgarbage() -- to close file in previous iteration
|
||||
|
||||
io.output(file); io.write"00\n10\n20\n30\n40\n":close()
|
||||
for a, b in io.lines(file, "*n", "*n") do
|
||||
if a == 40 then assert(b == nil)
|
||||
else assert(a == b - 10)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- test load x lines
|
||||
io.output(file);
|
||||
io.write[[
|
||||
local y
|
||||
= X
|
||||
X =
|
||||
X *
|
||||
2 +
|
||||
X;
|
||||
X =
|
||||
X
|
||||
- y;
|
||||
]]:close()
|
||||
_G.X = 1
|
||||
assert(not load(io.lines(file)))
|
||||
collectgarbage() -- to close file in previous iteration
|
||||
load(io.lines(file, "*L"))()
|
||||
assert(_G.X == 2)
|
||||
load(io.lines(file, 1))()
|
||||
assert(_G.X == 4)
|
||||
load(io.lines(file, 3))()
|
||||
assert(_G.X == 8)
|
||||
|
||||
print('+')
|
||||
|
||||
local x1 = "string\n\n\\com \"\"''coisas [[estranhas]] ]]'"
|
||||
io.output(file)
|
||||
assert(io.write(string.format("x2 = %q\n-- comment without ending EOS", x1)))
|
||||
io.close()
|
||||
assert(loadfile(file))()
|
||||
assert(x1 == x2)
|
||||
print('+')
|
||||
assert(os.remove(file))
|
||||
assert(os.remove(file) == nil)
|
||||
assert(os.remove(otherfile) == nil)
|
||||
|
||||
-- testing loadfile
|
||||
local function testloadfile (s, expres)
|
||||
io.output(file)
|
||||
if s then io.write(s) end
|
||||
io.close()
|
||||
local res = assert(loadfile(file))()
|
||||
assert(os.remove(file))
|
||||
assert(res == expres)
|
||||
end
|
||||
|
||||
-- loading empty file
|
||||
testloadfile(nil, nil)
|
||||
|
||||
-- loading file with initial comment without end of line
|
||||
testloadfile("# a non-ending comment", nil)
|
||||
|
||||
|
||||
-- checking Unicode BOM in files
|
||||
testloadfile("\xEF\xBB\xBF# some comment\nreturn 234", 234)
|
||||
testloadfile("\xEF\xBB\xBFreturn 239", 239)
|
||||
testloadfile("\xEF\xBB\xBF", nil) -- empty file with a BOM
|
||||
|
||||
|
||||
-- checking line numbers in files with initial comments
|
||||
testloadfile("# a comment\nreturn debug.getinfo(1).currentline", 2)
|
||||
|
||||
|
||||
-- loading binary file
|
||||
io.output(io.open(file, "wb"))
|
||||
assert(io.write(string.dump(function () return 10, '\0alo\255', 'hi' end)))
|
||||
io.close()
|
||||
a, b, c = assert(loadfile(file))()
|
||||
assert(a == 10 and b == "\0alo\255" and c == "hi")
|
||||
assert(os.remove(file))
|
||||
|
||||
|
||||
-- loading binary file with initial comment
|
||||
io.output(io.open(file, "wb"))
|
||||
assert(io.write("#this is a comment for a binary file\0\n",
|
||||
string.dump(function () return 20, '\0\0\0' end)))
|
||||
io.close()
|
||||
a, b, c = assert(loadfile(file))()
|
||||
assert(a == 20 and b == "\0\0\0" and c == nil)
|
||||
assert(os.remove(file))
|
||||
|
||||
|
||||
-- 'loadfile' with 'env'
|
||||
do
|
||||
local f = io.open(file, 'w')
|
||||
f:write[[
|
||||
if (...) then a = 15; return b, c, d
|
||||
else return _ENV
|
||||
end
|
||||
]]
|
||||
f:close()
|
||||
local t = {b = 12, c = "xuxu", d = print}
|
||||
local f = assert(loadfile(file, 't', t))
|
||||
local b, c, d = f(1)
|
||||
assert(t.a == 15 and b == 12 and c == t.c and d == print)
|
||||
assert(f() == t)
|
||||
f = assert(loadfile(file, 't', nil))
|
||||
assert(f() == nil)
|
||||
f = assert(loadfile(file))
|
||||
assert(f() == _G)
|
||||
assert(os.remove(file))
|
||||
end
|
||||
|
||||
|
||||
-- 'loadfile' x modes
|
||||
do
|
||||
io.open(file, 'w'):write("return 10"):close()
|
||||
local s, m = loadfile(file, 'b')
|
||||
assert(not s and string.find(m, "a text chunk"))
|
||||
io.open(file, 'w'):write("\27 return 10"):close()
|
||||
local s, m = loadfile(file, 't')
|
||||
assert(not s and string.find(m, "a binary chunk"))
|
||||
assert(os.remove(file))
|
||||
end
|
||||
|
||||
|
||||
io.output(file)
|
||||
assert(io.write("qualquer coisa\n"))
|
||||
assert(io.write("mais qualquer coisa"))
|
||||
io.close()
|
||||
assert(io.output(assert(io.open(otherfile, 'wb')))
|
||||
:write("outra coisa\0\1\3\0\0\0\0\255\0")
|
||||
:close())
|
||||
|
||||
local filehandle = assert(io.open(file, 'r+'))
|
||||
local otherfilehandle = assert(io.open(otherfile, 'rb'))
|
||||
assert(filehandle ~= otherfilehandle)
|
||||
assert(type(filehandle) == "userdata")
|
||||
assert(filehandle:read('*l') == "qualquer coisa")
|
||||
io.input(otherfilehandle)
|
||||
assert(io.read(string.len"outra coisa") == "outra coisa")
|
||||
assert(filehandle:read('*l') == "mais qualquer coisa")
|
||||
filehandle:close();
|
||||
assert(type(filehandle) == "userdata")
|
||||
io.input(otherfilehandle)
|
||||
assert(io.read(4) == "\0\1\3\0")
|
||||
assert(io.read(3) == "\0\0\0")
|
||||
assert(io.read(0) == "") -- 255 is not eof
|
||||
assert(io.read(1) == "\255")
|
||||
assert(io.read('*a') == "\0")
|
||||
assert(not io.read(0))
|
||||
assert(otherfilehandle == io.input())
|
||||
otherfilehandle:close()
|
||||
assert(os.remove(file))
|
||||
assert(os.remove(otherfile))
|
||||
collectgarbage()
|
||||
|
||||
io.output(file)
|
||||
:write[[
|
||||
123.4 -56e-2 not a number
|
||||
second line
|
||||
third line
|
||||
|
||||
and the rest of the file
|
||||
]]
|
||||
:close()
|
||||
io.input(file)
|
||||
local _,a,b,c,d,e,h,__ = io.read(1, '*n', '*n', '*l', '*l', '*l', '*a', 10)
|
||||
assert(io.close(io.input()))
|
||||
assert(_ == ' ' and __ == nil)
|
||||
assert(type(a) == 'number' and a==123.4 and b==-56e-2)
|
||||
assert(d=='second line' and e=='third line')
|
||||
assert(h==[[
|
||||
|
||||
and the rest of the file
|
||||
]])
|
||||
assert(os.remove(file))
|
||||
collectgarbage()
|
||||
|
||||
-- testing buffers
|
||||
do
|
||||
local f = assert(io.open(file, "w"))
|
||||
local fr = assert(io.open(file, "r"))
|
||||
assert(f:setvbuf("full", 2000))
|
||||
f:write("x")
|
||||
assert(fr:read("*all") == "") -- full buffer; output not written yet
|
||||
f:close()
|
||||
fr:seek("set")
|
||||
assert(fr:read("*all") == "x") -- `close' flushes it
|
||||
f = assert(io.open(file), "w")
|
||||
assert(f:setvbuf("no"))
|
||||
f:write("x")
|
||||
fr:seek("set")
|
||||
assert(fr:read("*all") == "x") -- no buffer; output is ready
|
||||
f:close()
|
||||
f = assert(io.open(file, "a"))
|
||||
assert(f:setvbuf("line"))
|
||||
f:write("x")
|
||||
fr:seek("set", 1)
|
||||
assert(fr:read("*all") == "") -- line buffer; no output without `\n'
|
||||
f:write("a\n"):seek("set", 1)
|
||||
assert(fr:read("*all") == "xa\n") -- now we have a whole line
|
||||
f:close(); fr:close()
|
||||
assert(os.remove(file))
|
||||
end
|
||||
|
||||
|
||||
if not _soft then
|
||||
print("testing large files (> BUFSIZ)")
|
||||
io.output(file)
|
||||
for i=1,5001 do io.write('0123456789123') end
|
||||
io.write('\n12346'):close()
|
||||
io.input(file)
|
||||
local x = io.read('*a')
|
||||
io.input():seek('set', 0)
|
||||
local y = io.read(30001)..io.read(1005)..io.read(0)..
|
||||
io.read(1)..io.read(100003)
|
||||
assert(x == y and string.len(x) == 5001*13 + 6)
|
||||
io.input():seek('set', 0)
|
||||
y = io.read() -- huge line
|
||||
assert(x == y..'\n'..io.read())
|
||||
assert(io.read() == nil)
|
||||
io.close(io.input())
|
||||
assert(os.remove(file))
|
||||
x = nil; y = nil
|
||||
end
|
||||
|
||||
if not _noposix then
|
||||
print("testing popen/pclose and execute")
|
||||
local tests = {
|
||||
-- command, what, code
|
||||
{"ls > /dev/null", "ok"},
|
||||
{"not-to-be-found-command", "exit"},
|
||||
{"exit 3", "exit", 3},
|
||||
{"exit 129", "exit", 129},
|
||||
{"kill -s HUP $$", "signal", 1},
|
||||
{"kill -s KILL $$", "signal", 9},
|
||||
{"sh -c 'kill -s HUP $$'", "exit"},
|
||||
{'lua -e "os.exit(20, true)"', "exit", 20},
|
||||
}
|
||||
print("\n(some error messages are expected now)")
|
||||
for _, v in ipairs(tests) do
|
||||
local x, y, z = io.popen(v[1]):close()
|
||||
local x1, y1, z1 = os.execute(v[1])
|
||||
assert(x == x1 and y == y1 and z == z1)
|
||||
if v[2] == "ok" then
|
||||
assert(x == true and y == 'exit' and z == 0)
|
||||
else
|
||||
assert(x == nil and y == v[2]) -- correct status and 'what'
|
||||
-- correct code if known (but always different from 0)
|
||||
assert((v[3] == nil and z > 0) or v[3] == z)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- testing tmpfile
|
||||
f = io.tmpfile()
|
||||
assert(io.type(f) == "file")
|
||||
f:write("alo")
|
||||
f:seek("set")
|
||||
assert(f:read"*a" == "alo")
|
||||
|
||||
end --}
|
||||
|
||||
print'+'
|
||||
|
||||
|
||||
assert(os.date("") == "")
|
||||
assert(os.date("!") == "")
|
||||
local x = string.rep("a", 10000)
|
||||
assert(os.date(x) == x)
|
||||
local t = os.time()
|
||||
T = os.date("*t", t)
|
||||
assert(os.date(string.rep("%d", 1000), t) ==
|
||||
string.rep(os.date("%d", t), 1000))
|
||||
assert(os.date(string.rep("%", 200)) == string.rep("%", 100))
|
||||
|
||||
local t = os.time()
|
||||
T = os.date("*t", t)
|
||||
load(os.date([[assert(T.year==%Y and T.month==%m and T.day==%d and
|
||||
T.hour==%H and T.min==%M and T.sec==%S and
|
||||
T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))()
|
||||
|
||||
assert(not pcall(os.date, "%9")) -- invalid conversion specifier
|
||||
assert(not pcall(os.date, "%")) -- invalid conversion specifier
|
||||
assert(not pcall(os.date, "%O")) -- invalid conversion specifier
|
||||
assert(not pcall(os.date, "%E")) -- invalid conversion specifier
|
||||
assert(not pcall(os.date, "%Ea")) -- invalid conversion specifier
|
||||
|
||||
if not _noposix then
|
||||
assert(type(os.date("%Ex")) == 'string')
|
||||
assert(type(os.date("%Oy")) == 'string')
|
||||
end
|
||||
|
||||
assert(os.time(T) == t)
|
||||
assert(not pcall(os.time, {hour = 12}))
|
||||
|
||||
T = os.date("!*t", t)
|
||||
load(os.date([[!assert(T.year==%Y and T.month==%m and T.day==%d and
|
||||
T.hour==%H and T.min==%M and T.sec==%S and
|
||||
T.wday==%w+1 and T.yday==%j and type(T.isdst) == 'boolean')]], t))()
|
||||
|
||||
do
|
||||
local T = os.date("*t")
|
||||
local t = os.time(T)
|
||||
assert(type(T.isdst) == 'boolean')
|
||||
T.isdst = nil
|
||||
local t1 = os.time(T)
|
||||
assert(t == t1) -- if isdst is absent uses correct default
|
||||
end
|
||||
|
||||
t = os.time(T)
|
||||
T.year = T.year-1;
|
||||
local t1 = os.time(T)
|
||||
-- allow for leap years
|
||||
assert(math.abs(os.difftime(t,t1)/(24*3600) - 365) < 2)
|
||||
|
||||
t = os.time()
|
||||
t1 = os.time(os.date("*t"))
|
||||
assert(os.difftime(t1,t) <= 2)
|
||||
|
||||
local t1 = os.time{year=2000, month=10, day=1, hour=23, min=12}
|
||||
local t2 = os.time{year=2000, month=10, day=1, hour=23, min=10, sec=19}
|
||||
assert(os.difftime(t1,t2) == 60*2-19)
|
||||
|
||||
io.output(io.stdout)
|
||||
local d = os.date('%d')
|
||||
local m = os.date('%m')
|
||||
local a = os.date('%Y')
|
||||
local ds = os.date('%w') + 1
|
||||
local h = os.date('%H')
|
||||
local min = os.date('%M')
|
||||
local s = os.date('%S')
|
||||
io.write(string.format('test done on %2.2d/%2.2d/%d', d, m, a))
|
||||
io.write(string.format(', at %2.2d:%2.2d:%2.2d\n', h, min, s))
|
||||
io.write(string.format('%s\n', _VERSION))
|
||||
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/gc.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/gc.lc
Normal file
Binary file not shown.
574
luaj-test/src/test/resources/lua5.2.1-tests/gc.lua
Normal file
574
luaj-test/src/test/resources/lua5.2.1-tests/gc.lua
Normal file
@@ -0,0 +1,574 @@
|
||||
print('testing garbage collection')
|
||||
|
||||
collectgarbage()
|
||||
|
||||
assert(collectgarbage("isrunning"))
|
||||
|
||||
local function gcinfo () return collectgarbage"count" * 1024 end
|
||||
|
||||
|
||||
-- test weird parameters
|
||||
do
|
||||
-- save original parameters
|
||||
local a = collectgarbage("setpause", 200)
|
||||
local b = collectgarbage("setstepmul", 200)
|
||||
local t = {0, 2, 10, 90, 100, 500, 5000, 30000}
|
||||
for i = 1, #t do
|
||||
local p = t[i]
|
||||
for j = 1, #t do
|
||||
local m = t[j]
|
||||
collectgarbage("setpause", p)
|
||||
collectgarbage("setstepmul", m)
|
||||
collectgarbage("step", 0)
|
||||
collectgarbage("step", 10000)
|
||||
end
|
||||
end
|
||||
-- restore original parameters
|
||||
collectgarbage("setpause", a)
|
||||
collectgarbage("setstepmul", b)
|
||||
end
|
||||
|
||||
|
||||
_G["while"] = 234
|
||||
|
||||
limit = 5000
|
||||
|
||||
|
||||
local function GC1 ()
|
||||
local u
|
||||
local b -- must be declared after 'u' (to be above it in the stack)
|
||||
local finish = false
|
||||
u = setmetatable({}, {__gc = function () finish = true end})
|
||||
b = {34}
|
||||
repeat u = {} until finish
|
||||
assert(b[1] == 34) -- 'u' was collected, but 'b' was not
|
||||
|
||||
finish = false; local i = 1
|
||||
u = setmetatable({}, {__gc = function () finish = true end})
|
||||
repeat i = i + 1; u = i .. i until finish
|
||||
assert(b[1] == 34) -- 'u' was collected, but 'b' was not
|
||||
|
||||
finish = false
|
||||
u = setmetatable({}, {__gc = function () finish = true end})
|
||||
repeat local i; u = function () return i end until finish
|
||||
assert(b[1] == 34) -- 'u' was collected, but 'b' was not
|
||||
end
|
||||
|
||||
local function GC() GC1(); GC1() end
|
||||
|
||||
|
||||
contCreate = 0
|
||||
|
||||
print('tables')
|
||||
while contCreate <= limit do
|
||||
local a = {}; a = nil
|
||||
contCreate = contCreate+1
|
||||
end
|
||||
|
||||
a = "a"
|
||||
|
||||
contCreate = 0
|
||||
print('strings')
|
||||
while contCreate <= limit do
|
||||
a = contCreate .. "b";
|
||||
a = string.gsub(a, '(%d%d*)', string.upper)
|
||||
a = "a"
|
||||
contCreate = contCreate+1
|
||||
end
|
||||
|
||||
|
||||
contCreate = 0
|
||||
|
||||
a = {}
|
||||
|
||||
print('functions')
|
||||
function a:test ()
|
||||
while contCreate <= limit do
|
||||
load(string.format("function temp(a) return 'a%d' end", contCreate))()
|
||||
assert(temp() == string.format('a%d', contCreate))
|
||||
contCreate = contCreate+1
|
||||
end
|
||||
end
|
||||
|
||||
a:test()
|
||||
|
||||
-- collection of functions without locals, globals, etc.
|
||||
do local f = function () end end
|
||||
|
||||
|
||||
print("functions with errors")
|
||||
prog = [[
|
||||
do
|
||||
a = 10;
|
||||
function foo(x,y)
|
||||
a = sin(a+0.456-0.23e-12);
|
||||
return function (z) return sin(%x+z) end
|
||||
end
|
||||
local x = function (w) a=a+w; end
|
||||
end
|
||||
]]
|
||||
do
|
||||
local step = 1
|
||||
if _soft then step = 13 end
|
||||
for i=1, string.len(prog), step do
|
||||
for j=i, string.len(prog), step do
|
||||
pcall(load(string.sub(prog, i, j)))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
foo = nil
|
||||
print('long strings')
|
||||
x = "01234567890123456789012345678901234567890123456789012345678901234567890123456789"
|
||||
assert(string.len(x)==80)
|
||||
s = ''
|
||||
n = 0
|
||||
k = 300
|
||||
while n < k do s = s..x; n=n+1; j=tostring(n) end
|
||||
assert(string.len(s) == k*80)
|
||||
s = string.sub(s, 1, 20000)
|
||||
s, i = string.gsub(s, '(%d%d%d%d)', math.sin)
|
||||
assert(i==20000/4)
|
||||
s = nil
|
||||
x = nil
|
||||
|
||||
assert(_G["while"] == 234)
|
||||
|
||||
local k,b = collectgarbage("count")
|
||||
assert(k*1024 == math.floor(k)*1024 + b)
|
||||
|
||||
print("steps")
|
||||
|
||||
local bytes = gcinfo()
|
||||
while 1 do
|
||||
local nbytes = gcinfo()
|
||||
if nbytes < bytes then break end -- run until gc
|
||||
bytes = nbytes
|
||||
a = {}
|
||||
end
|
||||
|
||||
print("steps (2)")
|
||||
|
||||
local function dosteps (siz)
|
||||
assert(not collectgarbage("isrunning"))
|
||||
collectgarbage()
|
||||
assert(not collectgarbage("isrunning"))
|
||||
local a = {}
|
||||
for i=1,100 do a[i] = {{}}; local b = {} end
|
||||
local x = gcinfo()
|
||||
local i = 0
|
||||
repeat -- do steps until it completes a collection cycle
|
||||
i = i+1
|
||||
until collectgarbage("step", siz)
|
||||
assert(gcinfo() < x)
|
||||
return i
|
||||
end
|
||||
|
||||
collectgarbage"stop"
|
||||
|
||||
if not _port then
|
||||
-- test the "size" of basic GC steps (whatever they mean...)
|
||||
assert(dosteps(0) > 10)
|
||||
assert(dosteps(10) < dosteps(2))
|
||||
end
|
||||
|
||||
-- collector should do a full collection with so many steps
|
||||
assert(dosteps(100000) == 1)
|
||||
assert(collectgarbage("step", 1000000) == true)
|
||||
assert(collectgarbage("step", 1000000) == true)
|
||||
|
||||
assert(not collectgarbage("isrunning"))
|
||||
collectgarbage"restart"
|
||||
assert(collectgarbage("isrunning"))
|
||||
|
||||
|
||||
if not _port then
|
||||
-- test the pace of the collector
|
||||
collectgarbage(); collectgarbage()
|
||||
local x = gcinfo()
|
||||
collectgarbage"stop"
|
||||
assert(not collectgarbage("isrunning"))
|
||||
repeat
|
||||
local a = {}
|
||||
until gcinfo() > 3 * x
|
||||
collectgarbage"restart"
|
||||
assert(collectgarbage("isrunning"))
|
||||
repeat
|
||||
local a = {}
|
||||
until gcinfo() <= x * 2
|
||||
end
|
||||
|
||||
|
||||
print("clearing tables")
|
||||
lim = 15
|
||||
a = {}
|
||||
-- fill a with `collectable' indices
|
||||
for i=1,lim do a[{}] = i end
|
||||
b = {}
|
||||
for k,v in pairs(a) do b[k]=v end
|
||||
-- remove all indices and collect them
|
||||
for n in pairs(b) do
|
||||
a[n] = nil
|
||||
assert(type(n) == 'table' and next(n) == nil)
|
||||
collectgarbage()
|
||||
end
|
||||
b = nil
|
||||
collectgarbage()
|
||||
for n in pairs(a) do error'cannot be here' end
|
||||
for i=1,lim do a[i] = i end
|
||||
for i=1,lim do assert(a[i] == i) end
|
||||
|
||||
|
||||
print('weak tables')
|
||||
a = {}; setmetatable(a, {__mode = 'k'});
|
||||
-- fill a with some `collectable' indices
|
||||
for i=1,lim do a[{}] = i end
|
||||
-- and some non-collectable ones
|
||||
for i=1,lim do a[i] = i end
|
||||
for i=1,lim do local s=string.rep('@', i); a[s] = s..'#' end
|
||||
collectgarbage()
|
||||
local i = 0
|
||||
for k,v in pairs(a) do assert(k==v or k..'#'==v); i=i+1 end
|
||||
assert(i == 2*lim)
|
||||
|
||||
a = {}; setmetatable(a, {__mode = 'v'});
|
||||
a[1] = string.rep('b', 21)
|
||||
collectgarbage()
|
||||
assert(a[1]) -- strings are *values*
|
||||
a[1] = nil
|
||||
-- fill a with some `collectable' values (in both parts of the table)
|
||||
for i=1,lim do a[i] = {} end
|
||||
for i=1,lim do a[i..'x'] = {} end
|
||||
-- and some non-collectable ones
|
||||
for i=1,lim do local t={}; a[t]=t end
|
||||
for i=1,lim do a[i+lim]=i..'x' end
|
||||
collectgarbage()
|
||||
local i = 0
|
||||
for k,v in pairs(a) do assert(k==v or k-lim..'x' == v); i=i+1 end
|
||||
assert(i == 2*lim)
|
||||
|
||||
a = {}; setmetatable(a, {__mode = 'vk'});
|
||||
local x, y, z = {}, {}, {}
|
||||
-- keep only some items
|
||||
a[1], a[2], a[3] = x, y, z
|
||||
a[string.rep('$', 11)] = string.rep('$', 11)
|
||||
-- fill a with some `collectable' values
|
||||
for i=4,lim do a[i] = {} end
|
||||
for i=1,lim do a[{}] = i end
|
||||
for i=1,lim do local t={}; a[t]=t end
|
||||
collectgarbage()
|
||||
assert(next(a) ~= nil)
|
||||
local i = 0
|
||||
for k,v in pairs(a) do
|
||||
assert((k == 1 and v == x) or
|
||||
(k == 2 and v == y) or
|
||||
(k == 3 and v == z) or k==v);
|
||||
i = i+1
|
||||
end
|
||||
assert(i == 4)
|
||||
x,y,z=nil
|
||||
collectgarbage()
|
||||
assert(next(a) == string.rep('$', 11))
|
||||
|
||||
|
||||
-- 'bug' in 5.1
|
||||
a = {}
|
||||
local t = {x = 10}
|
||||
local C = setmetatable({key = t}, {__mode = 'v'})
|
||||
local C1 = setmetatable({[t] = 1}, {__mode = 'k'})
|
||||
a.x = t -- this should not prevent 't' from being removed from
|
||||
-- weak table 'C' by the time 'a' is finalized
|
||||
|
||||
setmetatable(a, {__gc = function (u)
|
||||
assert(C.key == nil)
|
||||
assert(type(next(C1)) == 'table')
|
||||
end})
|
||||
|
||||
a, t = nil
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
assert(next(C) == nil and next(C1) == nil)
|
||||
C, C1 = nil
|
||||
|
||||
|
||||
-- ephemerons
|
||||
local mt = {__mode = 'k'}
|
||||
a = {10,20,30,40}; setmetatable(a, mt)
|
||||
x = nil
|
||||
for i = 1, 100 do local n = {}; a[n] = {k = {x}}; x = n end
|
||||
GC()
|
||||
local n = x
|
||||
local i = 0
|
||||
while n do n = a[n].k[1]; i = i + 1 end
|
||||
assert(i == 100)
|
||||
x = nil
|
||||
GC()
|
||||
for i = 1, 4 do assert(a[i] == i * 10); a[i] = nil end
|
||||
assert(next(a) == nil)
|
||||
|
||||
local K = {}
|
||||
a[K] = {}
|
||||
for i=1,10 do a[K][i] = {}; a[a[K][i]] = setmetatable({}, mt) end
|
||||
x = nil
|
||||
local k = 1
|
||||
for j = 1,100 do
|
||||
local n = {}; local nk = k%10 + 1
|
||||
a[a[K][nk]][n] = {x, k = k}; x = n; k = nk
|
||||
end
|
||||
GC()
|
||||
local n = x
|
||||
local i = 0
|
||||
while n do local t = a[a[K][k]][n]; n = t[1]; k = t.k; i = i + 1 end
|
||||
assert(i == 100)
|
||||
K = nil
|
||||
GC()
|
||||
assert(next(a) == nil)
|
||||
|
||||
|
||||
-- testing errors during GC
|
||||
do
|
||||
collectgarbage("stop") -- stop collection
|
||||
local u = {}
|
||||
local s = {}; setmetatable(s, {__mode = 'k'})
|
||||
setmetatable(u, {__gc = function (o)
|
||||
local i = s[o]
|
||||
s[i] = true
|
||||
assert(not s[i - 1]) -- check proper finalization order
|
||||
if i == 8 then error("here") end -- error during GC
|
||||
end})
|
||||
|
||||
for i = 6, 10 do
|
||||
local n = setmetatable({}, getmetatable(u))
|
||||
s[n] = i
|
||||
end
|
||||
|
||||
assert(not pcall(collectgarbage))
|
||||
for i = 8, 10 do assert(s[i]) end
|
||||
|
||||
for i = 1, 5 do
|
||||
local n = setmetatable({}, getmetatable(u))
|
||||
s[n] = i
|
||||
end
|
||||
|
||||
collectgarbage()
|
||||
for i = 1, 10 do assert(s[i]) end
|
||||
|
||||
getmetatable(u).__gc = false
|
||||
|
||||
|
||||
-- __gc errors with non-string messages
|
||||
setmetatable({}, {__gc = function () error{} end})
|
||||
local a, b = pcall(collectgarbage)
|
||||
assert(not a and type(b) == "string" and string.find(b, "error in __gc"))
|
||||
|
||||
end
|
||||
print '+'
|
||||
|
||||
|
||||
-- testing userdata
|
||||
if T==nil then
|
||||
(Message or print)('\a\n >>> testC not active: skipping userdata GC tests <<<\n\a')
|
||||
|
||||
else
|
||||
|
||||
local function newproxy(u)
|
||||
return debug.setmetatable(T.newuserdata(0), debug.getmetatable(u))
|
||||
end
|
||||
|
||||
collectgarbage("stop") -- stop collection
|
||||
local u = newproxy(nil)
|
||||
debug.setmetatable(u, {__gc = true})
|
||||
local s = 0
|
||||
local a = {[u] = 0}; setmetatable(a, {__mode = 'vk'})
|
||||
for i=1,10 do a[newproxy(u)] = i end
|
||||
for k in pairs(a) do assert(getmetatable(k) == getmetatable(u)) end
|
||||
local a1 = {}; for k,v in pairs(a) do a1[k] = v end
|
||||
for k,v in pairs(a1) do a[v] = k end
|
||||
for i =1,10 do assert(a[i]) end
|
||||
getmetatable(u).a = a1
|
||||
getmetatable(u).u = u
|
||||
do
|
||||
local u = u
|
||||
getmetatable(u).__gc = function (o)
|
||||
assert(a[o] == 10-s)
|
||||
assert(a[10-s] == nil) -- udata already removed from weak table
|
||||
assert(getmetatable(o) == getmetatable(u))
|
||||
assert(getmetatable(o).a[o] == 10-s)
|
||||
s=s+1
|
||||
end
|
||||
end
|
||||
a1, u = nil
|
||||
assert(next(a) ~= nil)
|
||||
collectgarbage()
|
||||
assert(s==11)
|
||||
collectgarbage()
|
||||
assert(next(a) == nil) -- finalized keys are removed in two cycles
|
||||
end
|
||||
|
||||
|
||||
-- __gc x weak tables
|
||||
local u = setmetatable({}, {__gc = true})
|
||||
-- __gc metamethod should be collected before running
|
||||
setmetatable(getmetatable(u), {__mode = "v"})
|
||||
getmetatable(u).__gc = function (o) os.exit(1) end -- cannot happen
|
||||
u = nil
|
||||
collectgarbage()
|
||||
|
||||
local u = setmetatable({}, {__gc = true})
|
||||
local m = getmetatable(u)
|
||||
m.x = {[{0}] = 1; [0] = {1}}; setmetatable(m.x, {__mode = "kv"});
|
||||
m.__gc = function (o)
|
||||
assert(next(getmetatable(o).x) == nil)
|
||||
m = 10
|
||||
end
|
||||
u, m = nil
|
||||
collectgarbage()
|
||||
assert(m==10)
|
||||
|
||||
|
||||
-- errors during collection
|
||||
u = setmetatable({}, {__gc = function () error "!!!" end})
|
||||
u = nil
|
||||
assert(not pcall(collectgarbage))
|
||||
|
||||
|
||||
if not _soft then
|
||||
print("deep structures")
|
||||
local a = {}
|
||||
for i = 1,200000 do
|
||||
a = {next = a}
|
||||
end
|
||||
collectgarbage()
|
||||
end
|
||||
|
||||
-- create many threads with self-references and open upvalues
|
||||
local thread_id = 0
|
||||
local threads = {}
|
||||
|
||||
local function fn (thread)
|
||||
local x = {}
|
||||
threads[thread_id] = function()
|
||||
thread = x
|
||||
end
|
||||
coroutine.yield()
|
||||
end
|
||||
|
||||
while thread_id < 1000 do
|
||||
local thread = coroutine.create(fn)
|
||||
coroutine.resume(thread, thread)
|
||||
thread_id = thread_id + 1
|
||||
end
|
||||
|
||||
do
|
||||
collectgarbage()
|
||||
collectgarbage"stop"
|
||||
local x = gcinfo()
|
||||
repeat
|
||||
for i=1,1000 do _ENV.a = {} end
|
||||
collectgarbage("step", 1) -- steps should not unblock the collector
|
||||
until gcinfo() > 2 * x
|
||||
collectgarbage"restart"
|
||||
end
|
||||
|
||||
|
||||
if T then -- tests for weird cases collecting upvalues
|
||||
local a = 1200
|
||||
local f = function () return a end -- create upvalue for 'a'
|
||||
assert(f() == 1200)
|
||||
|
||||
-- erase reference to upvalue 'a', mark it as dead, but does not collect it
|
||||
T.gcstate("pause"); collectgarbage("stop")
|
||||
f = nil
|
||||
T.gcstate("sweepstring")
|
||||
|
||||
-- this function will reuse that dead upvalue...
|
||||
f = function () return a end
|
||||
assert(f() == 1200)
|
||||
|
||||
-- create coroutine with local variable 'b'
|
||||
local co = coroutine.wrap(function()
|
||||
local b = 150
|
||||
coroutine.yield(function () return b end)
|
||||
end)
|
||||
|
||||
T.gcstate("pause")
|
||||
assert(co()() == 150) -- create upvalue for 'b'
|
||||
|
||||
-- mark upvalue 'b' as dead, but does not collect it
|
||||
T.gcstate("sweepstring")
|
||||
|
||||
co() -- finish coroutine, "closing" that dead upvalue
|
||||
|
||||
assert(f() == 1200)
|
||||
collectgarbage("restart")
|
||||
|
||||
print"+"
|
||||
end
|
||||
|
||||
|
||||
if T then
|
||||
local debug = require "debug"
|
||||
collectgarbage("generational"); collectgarbage("stop")
|
||||
x = T.newuserdata(0)
|
||||
T.gcstate("propagate") -- ensure 'x' is old
|
||||
T.gcstate("sweepstring")
|
||||
T.gcstate("propagate")
|
||||
assert(string.find(T.gccolor(x), "/old"))
|
||||
local y = T.newuserdata(0)
|
||||
debug.setmetatable(y, {__gc = true}) -- bless the new udata before...
|
||||
debug.setmetatable(x, {__gc = true}) -- ...the old one
|
||||
assert(string.find(T.gccolor(y), "white"))
|
||||
T.checkmemory()
|
||||
collectgarbage("incremental"); collectgarbage("restart")
|
||||
end
|
||||
|
||||
|
||||
if T then
|
||||
print("emergency collections")
|
||||
collectgarbage()
|
||||
collectgarbage()
|
||||
T.totalmem(T.totalmem() + 200)
|
||||
for i=1,200 do local a = {} end
|
||||
T.totalmem(1000000000)
|
||||
collectgarbage()
|
||||
local t = T.totalmem("table")
|
||||
local a = {{}, {}, {}} -- create 4 new tables
|
||||
assert(T.totalmem("table") == t + 4)
|
||||
t = T.totalmem("function")
|
||||
a = function () end -- create 1 new closure
|
||||
assert(T.totalmem("function") == t + 1)
|
||||
t = T.totalmem("thread")
|
||||
a = coroutine.create(function () end) -- create 1 new coroutine
|
||||
assert(T.totalmem("thread") == t + 1)
|
||||
end
|
||||
|
||||
-- create an object to be collected when state is closed
|
||||
do
|
||||
local setmetatable,assert,type,print,getmetatable =
|
||||
setmetatable,assert,type,print,getmetatable
|
||||
local tt = {}
|
||||
tt.__gc = function (o)
|
||||
assert(getmetatable(o) == tt)
|
||||
-- create new objects during GC
|
||||
local a = 'xuxu'..(10+3)..'joao', {}
|
||||
___Glob = o -- ressurect object!
|
||||
setmetatable({}, tt) -- creates a new one with same metatable
|
||||
print(">>> closing state " .. "<<<\n")
|
||||
end
|
||||
local u = setmetatable({}, tt)
|
||||
___Glob = {u} -- avoid object being collected before program end
|
||||
end
|
||||
|
||||
-- create several objects to raise errors when collected while closing state
|
||||
do
|
||||
local mt = {__gc = function (o) return o + 1 end}
|
||||
for i = 1,10 do
|
||||
-- create object and preserve it until the end
|
||||
table.insert(___Glob, setmetatable({}, mt))
|
||||
end
|
||||
end
|
||||
|
||||
-- just to make sure
|
||||
assert(collectgarbage'isrunning')
|
||||
|
||||
print('OK')
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/goto.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/goto.lc
Normal file
Binary file not shown.
173
luaj-test/src/test/resources/lua5.2.1-tests/goto.lua
Normal file
173
luaj-test/src/test/resources/lua5.2.1-tests/goto.lua
Normal file
@@ -0,0 +1,173 @@
|
||||
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'")
|
||||
|
||||
-- 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
|
||||
|
||||
-- to repeat a label in a different function is OK
|
||||
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()
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- testing closing of upvalues
|
||||
|
||||
local function foo ()
|
||||
local a = {}
|
||||
do
|
||||
local i = 1
|
||||
local k = 0
|
||||
a[0] = function (y) k = y end
|
||||
::l1:: do
|
||||
local x
|
||||
if i > 2 then goto l2 end
|
||||
a[i] = function (y) if y then x = y else return x + k end end
|
||||
i = i + 1
|
||||
goto l1
|
||||
end
|
||||
end
|
||||
::l2:: return a
|
||||
end
|
||||
|
||||
local a = foo()
|
||||
a[1](10); a[2](20)
|
||||
assert(a[1]() == 10 and a[2]() == 20 and a[3] == nil)
|
||||
a[0](13)
|
||||
assert(a[1]() == 23 and a[2]() == 33)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
-- testing if x goto optimizations
|
||||
|
||||
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)
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
|
||||
print'OK'
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/literals.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/literals.lc
Normal file
Binary file not shown.
258
luaj-test/src/test/resources/lua5.2.1-tests/literals.lua
Normal file
258
luaj-test/src/test/resources/lua5.2.1-tests/literals.lua
Normal file
@@ -0,0 +1,258 @@
|
||||
print('testing scanner')
|
||||
|
||||
debug = require "debug"
|
||||
|
||||
|
||||
local function dostring (x) return assert(load(x))() end
|
||||
|
||||
dostring("x \v\f = \t\r 'a\0a' \v\f\f")
|
||||
assert(x == 'a\0a' and string.len(x) == 3)
|
||||
|
||||
-- escape sequences
|
||||
assert('\n\"\'\\' == [[
|
||||
|
||||
"'\]])
|
||||
|
||||
assert(string.find("\a\b\f\n\r\t\v", "^%c%c%c%c%c%c%c$"))
|
||||
|
||||
-- assume ASCII just for tests:
|
||||
assert("\09912" == 'c12')
|
||||
assert("\99ab" == 'cab')
|
||||
assert("\099" == '\99')
|
||||
assert("\099\n" == 'c\10')
|
||||
assert('\0\0\0alo' == '\0' .. '\0\0' .. 'alo')
|
||||
|
||||
assert(010 .. 020 .. -030 == "1020-30")
|
||||
|
||||
-- hexadecimal escapes
|
||||
assert("\x00\x05\x10\x1f\x3C\xfF\xe8" == "\0\5\16\31\60\255\232")
|
||||
|
||||
local function lexstring (x, y, n)
|
||||
local f = assert(load('return '..x..', debug.getinfo(1).currentline'))
|
||||
local s, l = f()
|
||||
assert(s == y and l == n)
|
||||
end
|
||||
|
||||
lexstring("'abc\\z \n efg'", "abcefg", 2)
|
||||
lexstring("'abc\\z \n\n\n'", "abc", 4)
|
||||
lexstring("'\\z \n\t\f\v\n'", "", 3)
|
||||
lexstring("[[\nalo\nalo\n\n]]", "alo\nalo\n\n", 5)
|
||||
lexstring("[[\nalo\ralo\n\n]]", "alo\nalo\n\n", 5)
|
||||
lexstring("[[\nalo\ralo\r\n]]", "alo\nalo\n", 4)
|
||||
lexstring("[[\ralo\n\ralo\r\n]]", "alo\nalo\n", 4)
|
||||
lexstring("[[alo]\n]alo]]", "alo]\n]alo", 2)
|
||||
|
||||
assert("abc\z
|
||||
def\z
|
||||
ghi\z
|
||||
" == 'abcdefghi')
|
||||
|
||||
-- Error in escape sequences
|
||||
local function lexerror (s, err)
|
||||
local st, msg = load('return '..s)
|
||||
if err ~= '<eof>' then err = "'"..err.."'" end
|
||||
assert(not st and string.find(msg, "near "..err, 1, true))
|
||||
end
|
||||
lexerror([["abc\x"]], [[\x"]])
|
||||
lexerror([["abc\x]], [[\x]])
|
||||
lexerror([["\x]], [[\x]])
|
||||
lexerror([["\x5"]], [[\x5"]])
|
||||
lexerror([["\x5]], [[\x5]])
|
||||
lexerror([["\xr"]], [[\xr]])
|
||||
lexerror([["\xr]], [[\xr]])
|
||||
lexerror([["\x.]], [[\x.]])
|
||||
lexerror([["\x8%"]], [[\x8%]])
|
||||
lexerror([["\xAG]], [[\xAG]])
|
||||
lexerror([["\g"]], [[\g]])
|
||||
lexerror([["\g]], [[\g]])
|
||||
lexerror([["\."]], [[\.]])
|
||||
|
||||
lexerror([["\999"]], [[\999]])
|
||||
lexerror([["xyz\300"]], [[\300]])
|
||||
lexerror([[" \256"]], [[\256]])
|
||||
|
||||
|
||||
-- unfinished strings
|
||||
lexerror("[=[alo]]", "<eof>")
|
||||
lexerror("[=[alo]=", "<eof>")
|
||||
lexerror("[=[alo]", "<eof>")
|
||||
lexerror("'alo", "<eof>")
|
||||
lexerror("'alo \\z \n\n", "<eof>")
|
||||
lexerror("'alo \\z", "<eof>")
|
||||
lexerror([['alo \98]], "<eof>")
|
||||
|
||||
-- valid characters in variable names
|
||||
for i = 0, 255 do
|
||||
local s = string.char(i)
|
||||
assert(not string.find(s, "[a-zA-Z_]") == not load(s .. "=1"))
|
||||
assert(not string.find(s, "[a-zA-Z_0-9]") ==
|
||||
not load("a" .. s .. "1 = 1"))
|
||||
end
|
||||
|
||||
|
||||
-- long variable names
|
||||
|
||||
var = string.rep('a', 15000)
|
||||
prog = string.format("%s = 5", var)
|
||||
dostring(prog)
|
||||
assert(_G[var] == 5)
|
||||
var = nil
|
||||
print('+')
|
||||
|
||||
-- escapes --
|
||||
assert("\n\t" == [[
|
||||
|
||||
]])
|
||||
assert([[
|
||||
|
||||
$debug]] == "\n $debug")
|
||||
assert([[ [ ]] ~= [[ ] ]])
|
||||
-- long strings --
|
||||
b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789"
|
||||
assert(string.len(b) == 960)
|
||||
prog = [=[
|
||||
print('+')
|
||||
|
||||
a1 = [["isto e' um string com várias 'aspas'"]]
|
||||
a2 = "'aspas'"
|
||||
|
||||
assert(string.find(a1, a2) == 31)
|
||||
print('+')
|
||||
|
||||
a1 = [==[temp = [[um valor qualquer]]; ]==]
|
||||
assert(load(a1))()
|
||||
assert(temp == 'um valor qualquer')
|
||||
-- long strings --
|
||||
b = "001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789001234567890123456789012345678901234567891234567890123456789012345678901234567890012345678901234567890123456789012345678912345678901234567890123456789012345678900123456789012345678901234567890123456789123456789012345678901234567890123456789"
|
||||
assert(string.len(b) == 960)
|
||||
print('+')
|
||||
|
||||
a = [[00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
00123456789012345678901234567890123456789123456789012345678901234567890123456789
|
||||
]]
|
||||
assert(string.len(a) == 1863)
|
||||
assert(string.sub(a, 1, 40) == string.sub(b, 1, 40))
|
||||
x = 1
|
||||
]=]
|
||||
|
||||
print('+')
|
||||
x = nil
|
||||
dostring(prog)
|
||||
assert(x)
|
||||
|
||||
prog = nil
|
||||
a = nil
|
||||
b = nil
|
||||
|
||||
|
||||
-- testing line ends
|
||||
prog = [[
|
||||
a = 1 -- a comment
|
||||
b = 2
|
||||
|
||||
|
||||
x = [=[
|
||||
hi
|
||||
]=]
|
||||
y = "\
|
||||
hello\r\n\
|
||||
"
|
||||
return debug.getinfo(1).currentline
|
||||
]]
|
||||
|
||||
for _, n in pairs{"\n", "\r", "\n\r", "\r\n"} do
|
||||
local prog, nn = string.gsub(prog, "\n", n)
|
||||
assert(dostring(prog) == nn)
|
||||
assert(_G.x == "hi\n" and _G.y == "\nhello\r\n\n")
|
||||
end
|
||||
|
||||
|
||||
-- testing comments and strings with long brackets
|
||||
a = [==[]=]==]
|
||||
assert(a == "]=")
|
||||
|
||||
a = [==[[===[[=[]]=][====[]]===]===]==]
|
||||
assert(a == "[===[[=[]]=][====[]]===]===")
|
||||
|
||||
a = [====[[===[[=[]]=][====[]]===]===]====]
|
||||
assert(a == "[===[[=[]]=][====[]]===]===")
|
||||
|
||||
a = [=[]]]]]]]]]=]
|
||||
assert(a == "]]]]]]]]")
|
||||
|
||||
|
||||
--[===[
|
||||
x y z [==[ blu foo
|
||||
]==
|
||||
]
|
||||
]=]==]
|
||||
error error]=]===]
|
||||
|
||||
-- generate all strings of four of these chars
|
||||
local x = {"=", "[", "]", "\n"}
|
||||
local len = 4
|
||||
local function gen (c, n)
|
||||
if n==0 then coroutine.yield(c)
|
||||
else
|
||||
for _, a in pairs(x) do
|
||||
gen(c..a, n-1)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
for s in coroutine.wrap(function () gen("", len) end) do
|
||||
assert(s == load("return [====[\n"..s.."]====]")())
|
||||
end
|
||||
|
||||
|
||||
-- testing decimal point locale
|
||||
if os.setlocale("pt_BR") or os.setlocale("ptb") then
|
||||
assert(not load("á = 3")) -- parser still works with C locale
|
||||
assert(not load("a = (3,4)"))
|
||||
assert(tonumber("3,4") == 3.4 and tonumber"3.4" == nil)
|
||||
assert(assert(load("return 3.4"))() == 3.4)
|
||||
assert(assert(load("return .4,3"))() == .4)
|
||||
assert(assert(load("return 4."))() == 4.)
|
||||
assert(assert(load("return 4.+.5"))() == 4.5)
|
||||
local a,b = load("return 4.5.")
|
||||
assert(string.find(b, "'4%.5%.'"))
|
||||
assert(os.setlocale("C"))
|
||||
else
|
||||
(Message or print)(
|
||||
'\a\n >>> pt_BR locale not available: skipping decimal point tests <<<\n\a')
|
||||
end
|
||||
|
||||
|
||||
-- testing %q x line ends
|
||||
local s = "a string with \r and \n and \r\n and \n\r"
|
||||
local c = string.format("return %q", s)
|
||||
assert(assert(load(c))() == s)
|
||||
|
||||
-- testing errors
|
||||
assert(not load"a = 'non-ending string")
|
||||
assert(not load"a = 'non-ending string\n'")
|
||||
assert(not load"a = '\\345'")
|
||||
assert(not load"a = [=x]")
|
||||
|
||||
print('OK')
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/locals.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/locals.lc
Normal file
Binary file not shown.
157
luaj-test/src/test/resources/lua5.2.1-tests/locals.lua
Normal file
157
luaj-test/src/test/resources/lua5.2.1-tests/locals.lua
Normal file
@@ -0,0 +1,157 @@
|
||||
print('testing local variables and environments')
|
||||
|
||||
local debug = require"debug"
|
||||
|
||||
|
||||
-- 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')
|
||||
|
||||
|
||||
local function getenv (f)
|
||||
local a,b = debug.getupvalue(f, 1)
|
||||
assert(a == '_ENV')
|
||||
return b
|
||||
end
|
||||
|
||||
-- test for global table of loaded chunks
|
||||
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)
|
||||
|
||||
-- testing limits for special instructions
|
||||
|
||||
if not _soft then
|
||||
local a
|
||||
local p = 4
|
||||
for i=2,31 do
|
||||
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
|
||||
end
|
||||
end
|
||||
|
||||
print'+'
|
||||
|
||||
|
||||
if rawget(_G, "querytab") then
|
||||
-- testing clearing of dead elements from tables
|
||||
collectgarbage("stop") -- stop GC
|
||||
local a = {[{}] = 4, [3] = 0, alo = 1,
|
||||
a1234567890123456789012345678901234567890 = 10}
|
||||
|
||||
local t = querytab(a)
|
||||
|
||||
for k,_ in pairs(a) do a[k] = nil end
|
||||
collectgarbage() -- restore GC and collect dead fiels in `a'
|
||||
for i=0,t-1 do
|
||||
local k = querytab(a, i)
|
||||
assert(k == nil or type(k) == 'number' or k == 'alo')
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- testing lexical environments
|
||||
|
||||
assert(_ENV == _G)
|
||||
|
||||
do local _ENV = (function (...) return ... end)(_G, dummy)
|
||||
|
||||
do local _ENV = {assert=assert}; assert(true) end
|
||||
mt = {_G = _G}
|
||||
local foo,x
|
||||
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)
|
||||
|
||||
|
||||
print('OK')
|
||||
|
||||
return 5,f
|
||||
|
||||
end
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/main.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/main.lc
Normal file
Binary file not shown.
260
luaj-test/src/test/resources/lua5.2.1-tests/main.lua
Normal file
260
luaj-test/src/test/resources/lua5.2.1-tests/main.lua
Normal file
@@ -0,0 +1,260 @@
|
||||
# testing special comment on first line
|
||||
|
||||
-- most (all?) tests here assume a reasonable "Unix-like" shell
|
||||
if _port then return end
|
||||
|
||||
print ("testing lua.c options")
|
||||
|
||||
assert(os.execute()) -- machine has a system command
|
||||
|
||||
prog = os.tmpname()
|
||||
otherprog = os.tmpname()
|
||||
out = os.tmpname()
|
||||
|
||||
do
|
||||
local i = 0
|
||||
while arg[i] do i=i-1 end
|
||||
progname = arg[i+1]
|
||||
end
|
||||
print("progname: "..progname)
|
||||
|
||||
local prepfile = function (s, p)
|
||||
p = p or prog
|
||||
io.output(p)
|
||||
io.write(s)
|
||||
assert(io.close())
|
||||
end
|
||||
|
||||
function getoutput ()
|
||||
io.input(out)
|
||||
local t = io.read("*a")
|
||||
io.input():close()
|
||||
assert(os.remove(out))
|
||||
return t
|
||||
end
|
||||
|
||||
function checkprogout (s)
|
||||
local t = getoutput()
|
||||
for line in string.gmatch(s, ".-\n") do
|
||||
assert(string.find(t, line, 1, true))
|
||||
end
|
||||
end
|
||||
|
||||
function checkout (s)
|
||||
local t = getoutput()
|
||||
if s ~= t then print(string.format("'%s' - '%s'\n", s, t)) end
|
||||
assert(s == t)
|
||||
return t
|
||||
end
|
||||
|
||||
function auxrun (...)
|
||||
local s = string.format(...)
|
||||
s = string.gsub(s, "lua", '"'..progname..'"', 1)
|
||||
return os.execute(s)
|
||||
end
|
||||
|
||||
function RUN (...)
|
||||
assert(auxrun(...))
|
||||
end
|
||||
|
||||
function NoRun (...)
|
||||
assert(not auxrun(...))
|
||||
end
|
||||
|
||||
function NoRunMsg (...)
|
||||
print("\n(the next error is expected by the test)")
|
||||
return NoRun(...)
|
||||
end
|
||||
|
||||
-- test environment variables used by Lua
|
||||
prepfile("print(package.path)")
|
||||
|
||||
RUN("env LUA_INIT= LUA_PATH=x lua %s > %s", prog, out)
|
||||
checkout("x\n")
|
||||
|
||||
RUN("env LUA_INIT= LUA_PATH_5_2=y LUA_PATH=x lua %s > %s", prog, out)
|
||||
checkout("y\n")
|
||||
|
||||
prepfile("print(package.cpath)")
|
||||
|
||||
RUN("env LUA_INIT= LUA_CPATH=xuxu lua %s > %s", prog, out)
|
||||
checkout("xuxu\n")
|
||||
|
||||
RUN("env LUA_INIT= LUA_CPATH_5_2=yacc LUA_CPATH=x lua %s > %s", prog, out)
|
||||
checkout("yacc\n")
|
||||
|
||||
prepfile("print(X)")
|
||||
RUN('env LUA_INIT="X=3" lua %s > %s', prog, out)
|
||||
checkout("3\n")
|
||||
|
||||
prepfile("print(X)")
|
||||
RUN('env LUA_INIT_5_2="X=10" LUA_INIT="X=3" lua %s > %s', prog, out)
|
||||
checkout("10\n")
|
||||
|
||||
-- test option '-E'
|
||||
prepfile("print(package.path, package.cpath)")
|
||||
RUN('env LUA_INIT="error(10)" LUA_PATH=xxx LUA_CPATH=xxx lua -E %s > %s',
|
||||
prog, out)
|
||||
local defaultpath = getoutput()
|
||||
defaultpath = string.match(defaultpath, "^(.-)\t") -- remove tab
|
||||
assert(not string.find(defaultpath, "xxx") and string.find(defaultpath, "lua"))
|
||||
|
||||
|
||||
-- test replacement of ';;' to default path
|
||||
local function convert (p)
|
||||
prepfile("print(package.path)")
|
||||
RUN('env LUA_PATH="%s" lua %s > %s', p, prog, out)
|
||||
local expected = getoutput()
|
||||
expected = string.sub(expected, 1, -2) -- cut final end of line
|
||||
assert(string.gsub(p, ";;", ";"..defaultpath..";") == expected)
|
||||
end
|
||||
|
||||
convert(";")
|
||||
convert(";;")
|
||||
convert(";;;")
|
||||
convert(";;;;")
|
||||
convert(";;;;;")
|
||||
convert(";;a;;;bc")
|
||||
|
||||
|
||||
-- test 2 files
|
||||
prepfile("print(1); a=2; return {x=15}")
|
||||
prepfile(("print(a); print(_G['%s'].x)"):format(prog), otherprog)
|
||||
RUN('env LUA_PATH="?;;" lua -l %s -l%s -lstring -l io %s > %s', prog, otherprog, otherprog, out)
|
||||
checkout("1\n2\n15\n2\n15\n")
|
||||
|
||||
local a = [[
|
||||
assert(#arg == 3 and arg[1] == 'a' and
|
||||
arg[2] == 'b' and arg[3] == 'c')
|
||||
assert(arg[-1] == '--' and arg[-2] == "-e " and arg[-3] == '%s')
|
||||
assert(arg[4] == nil and arg[-4] == nil)
|
||||
local a, b, c = ...
|
||||
assert(... == 'a' and a == 'a' and b == 'b' and c == 'c')
|
||||
]]
|
||||
a = string.format(a, progname)
|
||||
prepfile(a)
|
||||
RUN('lua "-e " -- %s a b c', prog)
|
||||
|
||||
prepfile"assert(arg==nil)"
|
||||
prepfile("assert(arg)", otherprog)
|
||||
RUN('env LUA_PATH="?;;" lua -l%s - < %s', prog, otherprog)
|
||||
|
||||
prepfile""
|
||||
RUN("lua - < %s > %s", prog, out)
|
||||
checkout("")
|
||||
|
||||
-- test many arguments
|
||||
prepfile[[print(({...})[30])]]
|
||||
RUN("lua %s %s > %s", prog, string.rep(" a", 30), out)
|
||||
checkout("a\n")
|
||||
|
||||
RUN([[lua "-eprint(1)" -ea=3 -e "print(a)" > %s]], out)
|
||||
checkout("1\n3\n")
|
||||
|
||||
prepfile[[
|
||||
print(
|
||||
1, a
|
||||
)
|
||||
]]
|
||||
RUN("lua - < %s > %s", prog, out)
|
||||
checkout("1\tnil\n")
|
||||
|
||||
prepfile[[
|
||||
= (6*2-6) -- ===
|
||||
a
|
||||
= 10
|
||||
print(a)
|
||||
= a]]
|
||||
RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out)
|
||||
checkprogout("6\n10\n10\n\n")
|
||||
|
||||
prepfile("a = [[b\nc\nd\ne]]\n=a")
|
||||
print("temporary program file: "..prog)
|
||||
RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out)
|
||||
checkprogout("b\nc\nd\ne\n\n")
|
||||
|
||||
prompt = "alo"
|
||||
prepfile[[ --
|
||||
a = 2
|
||||
]]
|
||||
RUN([[lua "-e_PROMPT='%s'" -i < %s > %s]], prompt, prog, out)
|
||||
local t = getoutput()
|
||||
assert(string.find(t, prompt .. ".*" .. prompt .. ".*" .. prompt))
|
||||
|
||||
-- test for error objects
|
||||
prepfile[[
|
||||
debug = require "debug"
|
||||
m = {x=0}
|
||||
setmetatable(m, {__tostring = function(x)
|
||||
return debug.getinfo(4).currentline + x.x
|
||||
end})
|
||||
error(m)
|
||||
]]
|
||||
NoRun([[lua %s 2> %s]], prog, out) -- no message
|
||||
checkout(progname..": 6\n")
|
||||
|
||||
|
||||
s = [=[ --
|
||||
function f ( x )
|
||||
local a = [[
|
||||
xuxu
|
||||
]]
|
||||
local b = "\
|
||||
xuxu\n"
|
||||
if x == 11 then return 1 , 2 end --[[ test multiple returns ]]
|
||||
return x + 1
|
||||
--\\
|
||||
end
|
||||
=( f( 10 ) )
|
||||
assert( a == b )
|
||||
=f( 11 ) ]=]
|
||||
s = string.gsub(s, ' ', '\n\n')
|
||||
prepfile(s)
|
||||
RUN([[lua -e"_PROMPT='' _PROMPT2=''" -i < %s > %s]], prog, out)
|
||||
checkprogout("11\n1\t2\n\n")
|
||||
|
||||
prepfile[[#comment in 1st line without \n at the end]]
|
||||
RUN("lua %s", prog)
|
||||
|
||||
prepfile[[#test line number when file starts with comment line
|
||||
debug = require"debug"
|
||||
print(debug.getinfo(1).currentline)
|
||||
]]
|
||||
RUN("lua %s > %s", prog, out)
|
||||
checkprogout('3')
|
||||
|
||||
-- close Lua with an open file
|
||||
prepfile(string.format([[io.output(%q); io.write('alo')]], out))
|
||||
RUN("lua %s", prog)
|
||||
checkout('alo')
|
||||
|
||||
-- bug in 5.2 beta (extra \0 after version line)
|
||||
RUN([[lua -v -e'print"hello"' > %s]], out)
|
||||
t = getoutput()
|
||||
assert(string.find(t, "PUC%-Rio\nhello"))
|
||||
|
||||
|
||||
-- testing os.exit
|
||||
prepfile("os.exit(nil, true)")
|
||||
RUN("lua %s", prog)
|
||||
prepfile("os.exit(0, true)")
|
||||
RUN("lua %s", prog)
|
||||
prepfile("os.exit(true, true)")
|
||||
RUN("lua %s", prog)
|
||||
prepfile("os.exit(1, true)")
|
||||
NoRun("lua %s", prog) -- no message
|
||||
prepfile("os.exit(false, true)")
|
||||
NoRun("lua %s", prog) -- no message
|
||||
|
||||
assert(os.remove(prog))
|
||||
assert(os.remove(otherprog))
|
||||
assert(not os.remove(out))
|
||||
|
||||
RUN("lua -v")
|
||||
|
||||
NoRunMsg("lua -h")
|
||||
NoRunMsg("lua -e")
|
||||
NoRunMsg("lua -e a")
|
||||
NoRunMsg("lua -f")
|
||||
|
||||
print("OK")
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/math.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/math.lc
Normal file
Binary file not shown.
293
luaj-test/src/test/resources/lua5.2.1-tests/math.lua
Normal file
293
luaj-test/src/test/resources/lua5.2.1-tests/math.lua
Normal file
@@ -0,0 +1,293 @@
|
||||
print("testing numbers and math lib")
|
||||
|
||||
|
||||
-- basic float notation
|
||||
assert(0e12 == 0 and .0 == 0 and 0. == 0 and .2e2 == 20 and 2.E-1 == 0.2)
|
||||
|
||||
do
|
||||
local a,b,c = "2", " 3e0 ", " 10 "
|
||||
assert(a+b == 5 and -b == -3 and b+"2" == 5 and "10"-c == 0)
|
||||
assert(type(a) == 'string' and type(b) == 'string' and type(c) == 'string')
|
||||
assert(a == "2" and b == " 3e0 " and c == " 10 " and -c == -" 10 ")
|
||||
assert(c%a == 0 and a^b == 08)
|
||||
a = 0
|
||||
assert(a == -a)
|
||||
-- luaj folds -0 into 0
|
||||
-- assert(0 == -0)
|
||||
end
|
||||
|
||||
do
|
||||
local x = -1
|
||||
local mz = 0/x -- minus zero
|
||||
t = {[0] = 10, 20, 30, 40, 50}
|
||||
assert(t[mz] == t[0])
|
||||
-- luaj folds -0 into 0
|
||||
-- assert(t[-0] == t[0])
|
||||
end
|
||||
|
||||
do
|
||||
local a,b = math.modf(3.5)
|
||||
assert(a == 3 and b == 0.5)
|
||||
assert(math.huge > 10e30)
|
||||
assert(-math.huge < -10e30)
|
||||
end
|
||||
|
||||
function f(...)
|
||||
if select('#', ...) == 1 then
|
||||
return (...)
|
||||
else
|
||||
return "***"
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- testing numeric strings
|
||||
|
||||
assert("2" + 1 == 3)
|
||||
assert("2 " + 1 == 3)
|
||||
assert(" -2 " + 1 == -1)
|
||||
assert(" -0xa " + 1 == -9)
|
||||
|
||||
|
||||
-- testing 'tonumber'
|
||||
assert(tonumber{} == nil)
|
||||
assert(tonumber'+0.01' == 1/100 and tonumber'+.01' == 0.01 and
|
||||
tonumber'.01' == 0.01 and tonumber'-1.' == -1 and
|
||||
tonumber'+1.' == 1)
|
||||
assert(tonumber'+ 0.01' == nil and tonumber'+.e1' == nil and
|
||||
tonumber'1e' == nil and tonumber'1.0e+' == nil and
|
||||
tonumber'.' == nil)
|
||||
assert(tonumber('-012') == -010-2)
|
||||
assert(tonumber('-1.2e2') == - - -120)
|
||||
|
||||
assert(tonumber("0xffffffffffff") == 2^(4*12) - 1)
|
||||
assert(tonumber("0x"..string.rep("f", 150)) == 2^(4*150) - 1)
|
||||
assert(tonumber('0x3.' .. string.rep('0', 100)) == 3)
|
||||
assert(tonumber('0x0.' .. string.rep('0', 150).."1") == 2^(-4*151))
|
||||
|
||||
-- testing 'tonumber' with base
|
||||
assert(tonumber(' 001010 ', 2) == 10)
|
||||
assert(tonumber(' 001010 ', 10) == 001010)
|
||||
assert(tonumber(' -1010 ', 2) == -10)
|
||||
assert(tonumber('10', 36) == 36)
|
||||
assert(tonumber(' -10 ', 36) == -36)
|
||||
assert(tonumber(' +1Z ', 36) == 36 + 35)
|
||||
assert(tonumber(' -1z ', 36) == -36 + -35)
|
||||
assert(tonumber('-fFfa', 16) == -(10+(16*(15+(16*(15+(16*15)))))))
|
||||
assert(tonumber(string.rep('1', 42), 2) + 1 == 2^42)
|
||||
assert(tonumber(string.rep('1', 34), 2) + 1 == 2^34)
|
||||
assert(tonumber('ffffFFFF', 16)+1 == 2^32)
|
||||
assert(tonumber('0ffffFFFF', 16)+1 == 2^32)
|
||||
assert(tonumber('-0ffffffFFFF', 16) - 1 == -2^40)
|
||||
for i = 2,36 do
|
||||
assert(tonumber('\t10000000000\t', i) == i^10)
|
||||
end
|
||||
|
||||
-- testing 'tonumber' fo invalid formats
|
||||
assert(f(tonumber('fFfa', 15)) == nil)
|
||||
assert(f(tonumber('099', 8)) == nil)
|
||||
assert(f(tonumber('1\0', 2)) == nil)
|
||||
assert(f(tonumber('', 8)) == nil)
|
||||
assert(f(tonumber(' ', 9)) == nil)
|
||||
assert(f(tonumber(' ', 9)) == nil)
|
||||
assert(f(tonumber('0xf', 10)) == nil)
|
||||
|
||||
assert(f(tonumber('inf')) == nil)
|
||||
assert(f(tonumber(' INF ')) == nil)
|
||||
assert(f(tonumber('Nan')) == nil)
|
||||
assert(f(tonumber('nan')) == nil)
|
||||
|
||||
assert(f(tonumber(' ')) == nil)
|
||||
assert(f(tonumber('')) == nil)
|
||||
assert(f(tonumber('1 a')) == nil)
|
||||
assert(f(tonumber('1\0')) == nil)
|
||||
assert(f(tonumber('1 \0')) == nil)
|
||||
assert(f(tonumber('1\0 ')) == nil)
|
||||
assert(f(tonumber('e1')) == nil)
|
||||
assert(f(tonumber('e 1')) == nil)
|
||||
assert(f(tonumber(' 3.4.5 ')) == nil)
|
||||
|
||||
|
||||
-- testing 'tonumber' for invalid hexadecimal formats
|
||||
|
||||
assert(tonumber('0x') == nil)
|
||||
assert(tonumber('x') == nil)
|
||||
assert(tonumber('x3') == nil)
|
||||
assert(tonumber('00x2') == nil)
|
||||
assert(tonumber('0x 2') == nil)
|
||||
assert(tonumber('0 x2') == nil)
|
||||
assert(tonumber('23x') == nil)
|
||||
assert(tonumber('- 0xaa') == nil)
|
||||
|
||||
|
||||
-- testing hexadecimal numerals
|
||||
|
||||
assert(0x10 == 16 and 0xfff == 2^12 - 1 and 0XFB == 251)
|
||||
assert(0x0p12 == 0 and 0x.0p-3 == 0)
|
||||
assert(0xFFFFFFFF == 2^32 - 1)
|
||||
assert(tonumber('+0x2') == 2)
|
||||
assert(tonumber('-0xaA') == -170)
|
||||
assert(tonumber('-0xffFFFfff') == -2^32 + 1)
|
||||
|
||||
-- possible confusion with decimal exponent
|
||||
assert(0E+1 == 0 and 0xE+1 == 15 and 0xe-1 == 13)
|
||||
|
||||
|
||||
-- floating hexas
|
||||
|
||||
assert(tonumber(' 0x2.5 ') == 0x25/16)
|
||||
assert(tonumber(' -0x2.5 ') == -0x25/16)
|
||||
assert(tonumber(' +0x0.51p+8 ') == 0x51)
|
||||
assert(tonumber('0x0.51p') == nil)
|
||||
assert(tonumber('0x5p+-2') == nil)
|
||||
assert(0x.FfffFFFF == 1 - '0x.00000001')
|
||||
assert('0xA.a' + 0 == 10 + 10/16)
|
||||
assert(0xa.aP4 == 0XAA)
|
||||
assert(0x4P-2 == 1)
|
||||
assert(0x1.1 == '0x1.' + '+0x.1')
|
||||
|
||||
|
||||
assert(1.1 == 1.+.1)
|
||||
assert(100.0 == 1E2 and .01 == 1e-2)
|
||||
assert(1111111111111111-1111111111111110== 1000.00e-03)
|
||||
-- 1234567890123456
|
||||
assert(1.1 == '1.'+'.1')
|
||||
assert('1111111111111111'-'1111111111111110' == tonumber" +0.001e+3 \n\t")
|
||||
|
||||
function eq (a,b,limit)
|
||||
if not limit then limit = 10E-10 end
|
||||
return math.abs(a-b) <= limit
|
||||
end
|
||||
|
||||
assert(0.1e-30 > 0.9E-31 and 0.9E30 < 0.1e31)
|
||||
|
||||
assert(0.123456 > 0.123455)
|
||||
|
||||
assert(tonumber('+1.23E18') == 1.23*10^18)
|
||||
|
||||
-- testing order operators
|
||||
assert(not(1<1) and (1<2) and not(2<1))
|
||||
assert(not('a'<'a') and ('a'<'b') and not('b'<'a'))
|
||||
assert((1<=1) and (1<=2) and not(2<=1))
|
||||
assert(('a'<='a') and ('a'<='b') and not('b'<='a'))
|
||||
assert(not(1>1) and not(1>2) and (2>1))
|
||||
assert(not('a'>'a') and not('a'>'b') and ('b'>'a'))
|
||||
assert((1>=1) and not(1>=2) and (2>=1))
|
||||
assert(('a'>='a') and not('a'>='b') and ('b'>='a'))
|
||||
|
||||
-- testing mod operator
|
||||
assert(-4%3 == 2)
|
||||
assert(4%-3 == -2)
|
||||
assert(math.pi - math.pi % 1 == 3)
|
||||
assert(math.pi - math.pi % 0.001 == 3.141)
|
||||
|
||||
local function testbit(a, n)
|
||||
return a/2^n % 2 >= 1
|
||||
end
|
||||
|
||||
assert(eq(math.sin(-9.8)^2 + math.cos(-9.8)^2, 1))
|
||||
assert(eq(math.tan(math.pi/4), 1))
|
||||
assert(eq(math.sin(math.pi/2), 1) and eq(math.cos(math.pi/2), 0))
|
||||
assert(eq(math.atan(1), math.pi/4) and eq(math.acos(0), math.pi/2) and
|
||||
eq(math.asin(1), math.pi/2))
|
||||
assert(eq(math.deg(math.pi/2), 90) and eq(math.rad(90), math.pi/2))
|
||||
assert(math.abs(-10) == 10)
|
||||
assert(eq(math.atan2(1,0), math.pi/2))
|
||||
assert(math.ceil(4.5) == 5.0)
|
||||
assert(math.floor(4.5) == 4.0)
|
||||
assert(math.fmod(10,3) == 1)
|
||||
assert(eq(math.sqrt(10)^2, 10))
|
||||
assert(eq(math.log(2, 10), math.log(2)/math.log(10)))
|
||||
assert(eq(math.log(2, 2), 1))
|
||||
assert(eq(math.log(9, 3), 2))
|
||||
assert(eq(math.exp(0), 1))
|
||||
assert(eq(math.sin(10), math.sin(10%(2*math.pi))))
|
||||
local v,e = math.frexp(math.pi)
|
||||
assert(eq(math.ldexp(v,e), math.pi))
|
||||
|
||||
assert(eq(math.tanh(3.5), math.sinh(3.5)/math.cosh(3.5)))
|
||||
|
||||
assert(tonumber(' 1.3e-2 ') == 1.3e-2)
|
||||
assert(tonumber(' -1.00000000000001 ') == -1.00000000000001)
|
||||
|
||||
-- testing constant limits
|
||||
-- 2^23 = 8388608
|
||||
assert(8388609 + -8388609 == 0)
|
||||
assert(8388608 + -8388608 == 0)
|
||||
assert(8388607 + -8388607 == 0)
|
||||
|
||||
-- testing implicit convertions
|
||||
|
||||
local a,b = '10', '20'
|
||||
assert(a*b == 200 and a+b == 30 and a-b == -10 and a/b == 0.5 and -b == -20)
|
||||
assert(a == '10' and b == '20')
|
||||
|
||||
|
||||
if not _port then
|
||||
print("testing -0 and NaN")
|
||||
--[[ luaj folds -0 into 0
|
||||
local mz, z = -0, 0
|
||||
assert(mz == z)
|
||||
assert(1/mz < 0 and 0 < 1/z)
|
||||
local a = {[mz] = 1}
|
||||
assert(a[z] == 1 and a[mz] == 1)
|
||||
local inf = math.huge * 2 + 1
|
||||
--]]
|
||||
local mz, z = -1/inf, 1/inf
|
||||
assert(mz == z)
|
||||
assert(1/mz < 0 and 0 < 1/z)
|
||||
local NaN = inf - inf
|
||||
assert(NaN ~= NaN)
|
||||
assert(not (NaN < NaN))
|
||||
assert(not (NaN <= NaN))
|
||||
assert(not (NaN > NaN))
|
||||
assert(not (NaN >= NaN))
|
||||
assert(not (0 < NaN) and not (NaN < 0))
|
||||
local NaN1 = 0/0
|
||||
assert(NaN ~= NaN1 and not (NaN <= NaN1) and not (NaN1 <= NaN))
|
||||
local a = {}
|
||||
assert(not pcall(function () a[NaN] = 1 end))
|
||||
assert(a[NaN] == nil)
|
||||
a[1] = 1
|
||||
assert(not pcall(function () a[NaN] = 1 end))
|
||||
assert(a[NaN] == nil)
|
||||
-- string with same binary representation as 0.0 (may create problems
|
||||
-- for constant manipulation in the pre-compiler)
|
||||
-- local a1, a2, a3, a4, a5 = 0, 0, "\0\0\0\0\0\0\0\0", 0, "\0\0\0\0\0\0\0\0"
|
||||
-- assert(a1 == a2 and a2 == a4 and a1 ~= a3)
|
||||
-- assert(a3 == a5)
|
||||
end
|
||||
|
||||
|
||||
if not _port then
|
||||
print("testing 'math.random'")
|
||||
math.randomseed(0)
|
||||
|
||||
local function aux (x1, x2, p)
|
||||
local Max = -math.huge
|
||||
local Min = math.huge
|
||||
for i = 0, 20000 do
|
||||
local t = math.random(table.unpack(p))
|
||||
Max = math.max(Max, t)
|
||||
Min = math.min(Min, t)
|
||||
if eq(Max, x2, 0.001) and eq(Min, x1, 0.001) then
|
||||
goto ok
|
||||
end
|
||||
end
|
||||
-- loop ended without satisfing condition
|
||||
assert(false)
|
||||
::ok::
|
||||
assert(x1 <= Min and Max<=x2)
|
||||
end
|
||||
|
||||
aux(0, 1, {})
|
||||
aux(-10, 0, {-10,0})
|
||||
end
|
||||
|
||||
for i=1,10 do
|
||||
local t = math.random(5)
|
||||
assert(1 <= t and t <= 5)
|
||||
end
|
||||
|
||||
|
||||
print('OK')
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc
Normal file
Binary file not shown.
447
luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lua
Normal file
447
luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lua
Normal file
@@ -0,0 +1,447 @@
|
||||
print('testing tables, next, and for')
|
||||
|
||||
local a = {}
|
||||
|
||||
-- make sure table has lots of space in hash part
|
||||
for i=1,100 do a[i.."+"] = true end
|
||||
for i=1,100 do a[i.."+"] = nil end
|
||||
-- fill hash part with numeric indices testing size operator
|
||||
for i=1,100 do
|
||||
a[i] = true
|
||||
assert(#a == i)
|
||||
end
|
||||
|
||||
-- testing ipairs
|
||||
local x = 0
|
||||
for k,v in ipairs{10,20,30;x=12} do
|
||||
x = x + 1
|
||||
assert(k == x and v == x * 10)
|
||||
end
|
||||
|
||||
for _ in ipairs{x=12, y=24} do assert(nil) end
|
||||
|
||||
-- test for 'false' x ipair
|
||||
x = false
|
||||
local i = 0
|
||||
for k,v in ipairs{true,false,true,false} do
|
||||
i = i + 1
|
||||
x = not x
|
||||
assert(x == v)
|
||||
end
|
||||
assert(i == 4)
|
||||
|
||||
-- iterator function is always the same
|
||||
assert(type(ipairs{}) == 'function' and ipairs{} == ipairs{})
|
||||
|
||||
if T then --[
|
||||
-- testing table sizes
|
||||
|
||||
local function log2 (x) return math.log(x, 2) end
|
||||
|
||||
local function mp2 (n) -- minimum power of 2 >= n
|
||||
local mp = 2^math.ceil(log2(n))
|
||||
assert(n == 0 or (mp/2 < n and n <= mp))
|
||||
return mp
|
||||
end
|
||||
|
||||
local function fb (n)
|
||||
local r, nn = T.int2fb(n)
|
||||
assert(r < 256)
|
||||
return nn
|
||||
end
|
||||
|
||||
-- test fb function
|
||||
local a = 1
|
||||
local lim = 2^30
|
||||
while a < lim do
|
||||
local n = fb(a)
|
||||
assert(a <= n and n <= a*1.125)
|
||||
a = math.ceil(a*1.3)
|
||||
end
|
||||
|
||||
|
||||
local function check (t, na, nh)
|
||||
local a, h = T.querytab(t)
|
||||
if a ~= na or h ~= nh then
|
||||
print(na, nh, a, h)
|
||||
assert(nil)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- testing C library sizes
|
||||
do
|
||||
local s = 0
|
||||
for _ in pairs(math) do s = s + 1 end
|
||||
check(math, 0, mp2(s))
|
||||
end
|
||||
|
||||
|
||||
-- testing constructor sizes
|
||||
local lim = 40
|
||||
local s = 'return {'
|
||||
for i=1,lim do
|
||||
s = s..i..','
|
||||
local s = s
|
||||
for k=0,lim do
|
||||
local t = load(s..'}')()
|
||||
assert(#t == i)
|
||||
check(t, fb(i), mp2(k))
|
||||
s = string.format('%sa%d=%d,', s, k, k)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
-- tests with unknown number of elements
|
||||
local a = {}
|
||||
for i=1,lim do a[i] = i end -- build auxiliary table
|
||||
for k=0,lim do
|
||||
local a = {table.unpack(a,1,k)}
|
||||
assert(#a == k)
|
||||
check(a, k, 0)
|
||||
a = {1,2,3,table.unpack(a,1,k)}
|
||||
check(a, k+3, 0)
|
||||
assert(#a == k + 3)
|
||||
end
|
||||
|
||||
|
||||
-- testing tables dynamically built
|
||||
local lim = 130
|
||||
local a = {}; a[2] = 1; check(a, 0, 1)
|
||||
a = {}; a[0] = 1; check(a, 0, 1); a[2] = 1; check(a, 0, 2)
|
||||
a = {}; a[0] = 1; a[1] = 1; check(a, 1, 1)
|
||||
a = {}
|
||||
for i = 1,lim do
|
||||
a[i] = 1
|
||||
assert(#a == i)
|
||||
check(a, mp2(i), 0)
|
||||
end
|
||||
|
||||
a = {}
|
||||
for i = 1,lim do
|
||||
a['a'..i] = 1
|
||||
assert(#a == 0)
|
||||
check(a, 0, mp2(i))
|
||||
end
|
||||
|
||||
a = {}
|
||||
for i=1,16 do a[i] = i end
|
||||
check(a, 16, 0)
|
||||
if not _port then
|
||||
for i=1,11 do a[i] = nil end
|
||||
for i=30,50 do a[i] = nil end -- force a rehash (?)
|
||||
check(a, 0, 8) -- only 5 elements in the table
|
||||
a[10] = 1
|
||||
for i=30,50 do a[i] = nil end -- force a rehash (?)
|
||||
check(a, 0, 8) -- only 6 elements in the table
|
||||
for i=1,14 do a[i] = nil end
|
||||
for i=18,50 do a[i] = nil end -- force a rehash (?)
|
||||
check(a, 0, 4) -- only 2 elements ([15] and [16])
|
||||
end
|
||||
|
||||
-- reverse filling
|
||||
for i=1,lim do
|
||||
local a = {}
|
||||
for i=i,1,-1 do a[i] = i end -- fill in reverse
|
||||
check(a, mp2(i), 0)
|
||||
end
|
||||
|
||||
-- size tests for vararg
|
||||
lim = 35
|
||||
function foo (n, ...)
|
||||
local arg = {...}
|
||||
check(arg, n, 0)
|
||||
assert(select('#', ...) == n)
|
||||
arg[n+1] = true
|
||||
check(arg, mp2(n+1), 0)
|
||||
arg.x = true
|
||||
check(arg, mp2(n+1), 1)
|
||||
end
|
||||
local a = {}
|
||||
for i=1,lim do a[i] = true; foo(i, table.unpack(a)) end
|
||||
|
||||
end --]
|
||||
|
||||
|
||||
-- test size operation on empty tables
|
||||
assert(#{} == 0)
|
||||
assert(#{nil} == 0)
|
||||
assert(#{nil, nil} == 0)
|
||||
assert(#{nil, nil, nil} == 0)
|
||||
assert(#{nil, nil, nil, nil} == 0)
|
||||
print'+'
|
||||
|
||||
|
||||
local nofind = {}
|
||||
|
||||
a,b,c = 1,2,3
|
||||
a,b,c = nil
|
||||
|
||||
|
||||
-- next uses always the same iteraction function
|
||||
assert(next{} == next{})
|
||||
|
||||
local function find (name)
|
||||
local n,v
|
||||
while 1 do
|
||||
n,v = next(_G, n)
|
||||
if not n then return nofind end
|
||||
assert(v ~= nil)
|
||||
if n == name then return v end
|
||||
end
|
||||
end
|
||||
|
||||
local function find1 (name)
|
||||
for n,v in pairs(_G) do
|
||||
if n==name then return v end
|
||||
end
|
||||
return nil -- not found
|
||||
end
|
||||
|
||||
|
||||
assert(print==find("print") and print == find1("print"))
|
||||
assert(_G["print"]==find("print"))
|
||||
assert(assert==find1("assert"))
|
||||
assert(nofind==find("return"))
|
||||
assert(not find1("return"))
|
||||
_G["ret" .. "urn"] = nil
|
||||
assert(nofind==find("return"))
|
||||
_G["xxx"] = 1
|
||||
assert(xxx==find("xxx"))
|
||||
|
||||
print('+')
|
||||
|
||||
a = {}
|
||||
for i=0,10000 do
|
||||
if math.fmod(i,10) ~= 0 then
|
||||
a['x'..i] = i
|
||||
end
|
||||
end
|
||||
|
||||
n = {n=0}
|
||||
for i,v in pairs(a) do
|
||||
n.n = n.n+1
|
||||
assert(i and v and a[i] == v)
|
||||
end
|
||||
assert(n.n == 9000)
|
||||
a = nil
|
||||
|
||||
do -- clear global table
|
||||
local a = {}
|
||||
for n,v in pairs(_G) do a[n]=v end
|
||||
for n,v in pairs(a) do
|
||||
if not package.loaded[n] and type(v) ~= "function" and
|
||||
not string.find(n, "^[%u_]") then
|
||||
_G[n] = nil
|
||||
end
|
||||
collectgarbage()
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
--
|
||||
|
||||
local function checknext (a)
|
||||
local b = {}
|
||||
do local k,v = next(a); while k do b[k] = v; k,v = next(a,k) end end
|
||||
for k,v in pairs(b) do assert(a[k] == v) end
|
||||
for k,v in pairs(a) do assert(b[k] == v) end
|
||||
end
|
||||
|
||||
checknext{1,x=1,y=2,z=3}
|
||||
checknext{1,2,x=1,y=2,z=3}
|
||||
checknext{1,2,3,x=1,y=2,z=3}
|
||||
checknext{1,2,3,4,x=1,y=2,z=3}
|
||||
checknext{1,2,3,4,5,x=1,y=2,z=3}
|
||||
|
||||
assert(#{} == 0)
|
||||
assert(#{[-1] = 2} == 0)
|
||||
assert(#{1,2,3,nil,nil} == 3)
|
||||
for i=0,40 do
|
||||
local a = {}
|
||||
for j=1,i do a[j]=j end
|
||||
assert(#a == i)
|
||||
end
|
||||
|
||||
-- 'maxn' is now deprecated, but it is easily defined in Lua
|
||||
function table.maxn (t)
|
||||
local max = 0
|
||||
for k in pairs(t) do
|
||||
max = (type(k) == 'number') and math.max(max, k) or max
|
||||
end
|
||||
return max
|
||||
end
|
||||
|
||||
assert(table.maxn{} == 0)
|
||||
assert(table.maxn{["1000"] = true} == 0)
|
||||
assert(table.maxn{["1000"] = true, [24.5] = 3} == 24.5)
|
||||
assert(table.maxn{[1000] = true} == 1000)
|
||||
assert(table.maxn{[10] = true, [100*math.pi] = print} == 100*math.pi)
|
||||
|
||||
table.maxn = nil
|
||||
|
||||
-- int overflow
|
||||
a = {}
|
||||
for i=0,50 do a[math.pow(2,i)] = true end
|
||||
assert(a[#a])
|
||||
|
||||
print('+')
|
||||
|
||||
|
||||
-- erasing values
|
||||
local t = {[{1}] = 1, [{2}] = 2, [string.rep("x ", 4)] = 3,
|
||||
[100.3] = 4, [4] = 5}
|
||||
|
||||
local n = 0
|
||||
for k, v in pairs( t ) do
|
||||
n = n+1
|
||||
assert(t[k] == v)
|
||||
t[k] = nil
|
||||
collectgarbage()
|
||||
assert(t[k] == nil)
|
||||
end
|
||||
assert(n == 5)
|
||||
|
||||
|
||||
local function test (a)
|
||||
table.insert(a, 10); table.insert(a, 2, 20);
|
||||
table.insert(a, 1, -1); table.insert(a, 40);
|
||||
table.insert(a, #a+1, 50)
|
||||
table.insert(a, 2, -2)
|
||||
assert(table.remove(a,1) == -1)
|
||||
assert(table.remove(a,1) == -2)
|
||||
assert(table.remove(a,1) == 10)
|
||||
assert(table.remove(a,1) == 20)
|
||||
assert(table.remove(a,1) == 40)
|
||||
assert(table.remove(a,1) == 50)
|
||||
assert(table.remove(a,1) == nil)
|
||||
end
|
||||
|
||||
a = {n=0, [-7] = "ban"}
|
||||
test(a)
|
||||
assert(a.n == 0 and a[-7] == "ban")
|
||||
|
||||
a = {[-7] = "ban"};
|
||||
test(a)
|
||||
assert(a.n == nil and #a == 0 and a[-7] == "ban")
|
||||
|
||||
|
||||
table.insert(a, 1, 10); table.insert(a, 1, 20); table.insert(a, 1, -1)
|
||||
assert(table.remove(a) == 10)
|
||||
assert(table.remove(a) == 20)
|
||||
assert(table.remove(a) == -1)
|
||||
|
||||
a = {'c', 'd'}
|
||||
table.insert(a, 3, 'a')
|
||||
table.insert(a, 'b')
|
||||
assert(table.remove(a, 1) == 'c')
|
||||
assert(table.remove(a, 1) == 'd')
|
||||
assert(table.remove(a, 1) == 'a')
|
||||
assert(table.remove(a, 1) == 'b')
|
||||
assert(#a == 0 and a.n == nil)
|
||||
|
||||
a = {10,20,30,40}
|
||||
assert(table.remove(a, #a + 1) == nil and table.remove(a, 0) == nil)
|
||||
assert(a[#a] == 40)
|
||||
assert(table.remove(a, #a) == 40)
|
||||
assert(a[#a] == 30)
|
||||
assert(table.remove(a, 2) == 20)
|
||||
assert(a[#a] == 30 and #a == 2)
|
||||
print('+')
|
||||
|
||||
a = {}
|
||||
for i=1,1000 do
|
||||
a[i] = i; a[i-1] = nil
|
||||
end
|
||||
assert(next(a,nil) == 1000 and next(a,1000) == nil)
|
||||
|
||||
assert(next({}) == nil)
|
||||
assert(next({}, nil) == nil)
|
||||
|
||||
for a,b in pairs{} do error"not here" end
|
||||
for i=1,0 do error'not here' end
|
||||
for i=0,1,-1 do error'not here' end
|
||||
a = nil; for i=1,1 do assert(not a); a=1 end; assert(a)
|
||||
a = nil; for i=1,1,-1 do assert(not a); a=1 end; assert(a)
|
||||
|
||||
if not _port then
|
||||
print("testing precision in numeric for")
|
||||
local a = 0; for i=0, 1, 0.1 do a=a+1 end; assert(a==11)
|
||||
a = 0; for i=0, 0.999999999, 0.1 do a=a+1 end; assert(a==10)
|
||||
a = 0; for i=1, 1, 1 do a=a+1 end; assert(a==1)
|
||||
a = 0; for i=1e10, 1e10, -1 do a=a+1 end; assert(a==1)
|
||||
a = 0; for i=1, 0.99999, 1 do a=a+1 end; assert(a==0)
|
||||
a = 0; for i=99999, 1e5, -1 do a=a+1 end; assert(a==0)
|
||||
a = 0; for i=1, 0.99999, -1 do a=a+1 end; assert(a==1)
|
||||
end
|
||||
|
||||
-- conversion
|
||||
a = 0; for i="10","1","-2" do a=a+1 end; assert(a==5)
|
||||
|
||||
|
||||
collectgarbage()
|
||||
|
||||
|
||||
-- testing generic 'for'
|
||||
|
||||
local function f (n, p)
|
||||
local t = {}; for i=1,p do t[i] = i*10 end
|
||||
return function (_,n)
|
||||
if n > 0 then
|
||||
n = n-1
|
||||
return n, table.unpack(t)
|
||||
end
|
||||
end, nil, n
|
||||
end
|
||||
|
||||
local x = 0
|
||||
for n,a,b,c,d in f(5,3) do
|
||||
x = x+1
|
||||
assert(a == 10 and b == 20 and c == 30 and d == nil)
|
||||
end
|
||||
assert(x == 5)
|
||||
|
||||
|
||||
|
||||
-- testing __pairs and __ipairs metamethod
|
||||
a = {}
|
||||
do
|
||||
local x,y,z = pairs(a)
|
||||
assert(type(x) == 'function' and y == a and z == nil)
|
||||
end
|
||||
|
||||
local function foo (e,i)
|
||||
assert(e == a)
|
||||
if i <= 10 then return i+1, i+2 end
|
||||
end
|
||||
|
||||
local function foo1 (e,i)
|
||||
i = i + 1
|
||||
assert(e == a)
|
||||
if i <= e.n then return i,a[i] end
|
||||
end
|
||||
|
||||
setmetatable(a, {__pairs = function (x) return foo, x, 0 end})
|
||||
|
||||
local i = 0
|
||||
for k,v in pairs(a) do
|
||||
i = i + 1
|
||||
assert(k == i and v == k+1)
|
||||
end
|
||||
|
||||
a.n = 5
|
||||
a[3] = 30
|
||||
|
||||
a = {n=10}
|
||||
setmetatable(a, {__len = function (x) return x.n end,
|
||||
__ipairs = function (x) return function (e,i)
|
||||
if i < #e then return i+1 end
|
||||
end, x, 0 end})
|
||||
i = 0
|
||||
for k,v in ipairs(a) do
|
||||
i = i + 1
|
||||
assert(k == i and v == nil)
|
||||
end
|
||||
assert(i == a.n)
|
||||
|
||||
print"OK"
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/pm.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/pm.lc
Normal file
Binary file not shown.
319
luaj-test/src/test/resources/lua5.2.1-tests/pm.lua
Normal file
319
luaj-test/src/test/resources/lua5.2.1-tests/pm.lua
Normal file
@@ -0,0 +1,319 @@
|
||||
print('testing pattern matching')
|
||||
|
||||
function f(s, p)
|
||||
local i,e = string.find(s, p)
|
||||
if i then return string.sub(s, i, e) end
|
||||
end
|
||||
|
||||
function f1(s, p)
|
||||
p = string.gsub(p, "%%([0-9])", function (s) return "%" .. (s+1) end)
|
||||
p = string.gsub(p, "^(^?)", "%1()", 1)
|
||||
p = string.gsub(p, "($?)$", "()%1", 1)
|
||||
local t = {string.match(s, p)}
|
||||
return string.sub(s, t[1], t[#t] - 1)
|
||||
end
|
||||
|
||||
a,b = string.find('', '') -- empty patterns are tricky
|
||||
assert(a == 1 and b == 0);
|
||||
a,b = string.find('alo', '')
|
||||
assert(a == 1 and b == 0)
|
||||
a,b = string.find('a\0o a\0o a\0o', 'a', 1) -- first position
|
||||
assert(a == 1 and b == 1)
|
||||
a,b = string.find('a\0o a\0o a\0o', 'a\0o', 2) -- starts in the midle
|
||||
assert(a == 5 and b == 7)
|
||||
a,b = string.find('a\0o a\0o a\0o', 'a\0o', 9) -- starts in the midle
|
||||
assert(a == 9 and b == 11)
|
||||
a,b = string.find('a\0a\0a\0a\0\0ab', '\0ab', 2); -- finds at the end
|
||||
assert(a == 9 and b == 11);
|
||||
a,b = string.find('a\0a\0a\0a\0\0ab', 'b') -- last position
|
||||
assert(a == 11 and b == 11)
|
||||
assert(string.find('a\0a\0a\0a\0\0ab', 'b\0') == nil) -- check ending
|
||||
assert(string.find('', '\0') == nil)
|
||||
assert(string.find('alo123alo', '12') == 4)
|
||||
assert(string.find('alo123alo', '^12') == nil)
|
||||
|
||||
assert(f('aloALO', '%l*') == 'alo')
|
||||
assert(f('aLo_ALO', '%a*') == 'aLo')
|
||||
|
||||
assert(f(" \n\r*&\n\r xuxu \n\n", "%g%g%g+") == "xuxu")
|
||||
|
||||
assert(f('aaab', 'a*') == 'aaa');
|
||||
assert(f('aaa', '^.*$') == 'aaa');
|
||||
assert(f('aaa', 'b*') == '');
|
||||
assert(f('aaa', 'ab*a') == 'aa')
|
||||
assert(f('aba', 'ab*a') == 'aba')
|
||||
assert(f('aaab', 'a+') == 'aaa')
|
||||
assert(f('aaa', '^.+$') == 'aaa')
|
||||
assert(f('aaa', 'b+') == nil)
|
||||
assert(f('aaa', 'ab+a') == nil)
|
||||
assert(f('aba', 'ab+a') == 'aba')
|
||||
assert(f('a$a', '.$') == 'a')
|
||||
assert(f('a$a', '.%$') == 'a$')
|
||||
assert(f('a$a', '.$.') == 'a$a')
|
||||
assert(f('a$a', '$$') == nil)
|
||||
assert(f('a$b', 'a$') == nil)
|
||||
assert(f('a$a', '$') == '')
|
||||
assert(f('', 'b*') == '')
|
||||
assert(f('aaa', 'bb*') == nil)
|
||||
assert(f('aaab', 'a-') == '')
|
||||
assert(f('aaa', '^.-$') == 'aaa')
|
||||
assert(f('aabaaabaaabaaaba', 'b.*b') == 'baaabaaabaaab')
|
||||
assert(f('aabaaabaaabaaaba', 'b.-b') == 'baaab')
|
||||
assert(f('alo xo', '.o$') == 'xo')
|
||||
assert(f(' \n isto é assim', '%S%S*') == 'isto')
|
||||
assert(f(' \n isto é assim', '%S*$') == 'assim')
|
||||
assert(f(' \n isto é assim', '[a-z]*$') == 'assim')
|
||||
assert(f('um caracter ? extra', '[^%sa-z]') == '?')
|
||||
assert(f('', 'a?') == '')
|
||||
assert(f('á', 'á?') == 'á')
|
||||
assert(f('ábl', 'á?b?l?') == 'ábl')
|
||||
assert(f(' ábl', 'á?b?l?') == '')
|
||||
assert(f('aa', '^aa?a?a') == 'aa')
|
||||
assert(f(']]]áb', '[^]]') == 'á')
|
||||
assert(f("0alo alo", "%x*") == "0a")
|
||||
assert(f("alo alo", "%C+") == "alo alo")
|
||||
print('+')
|
||||
|
||||
assert(f1('alo alx 123 b\0o b\0o', '(..*) %1') == "b\0o b\0o")
|
||||
assert(f1('axz123= 4= 4 34', '(.+)=(.*)=%2 %1') == '3= 4= 4 3')
|
||||
assert(f1('=======', '^(=*)=%1$') == '=======')
|
||||
assert(string.match('==========', '^([=]*)=%1$') == nil)
|
||||
|
||||
local function range (i, j)
|
||||
if i <= j then
|
||||
return i, range(i+1, j)
|
||||
end
|
||||
end
|
||||
|
||||
local abc = string.char(range(0, 255));
|
||||
|
||||
assert(string.len(abc) == 256)
|
||||
|
||||
function strset (p)
|
||||
local res = {s=''}
|
||||
string.gsub(abc, p, function (c) res.s = res.s .. c end)
|
||||
return res.s
|
||||
end;
|
||||
|
||||
assert(string.len(strset('[\200-\210]')) == 11)
|
||||
|
||||
assert(strset('[a-z]') == "abcdefghijklmnopqrstuvwxyz")
|
||||
assert(strset('[a-z%d]') == strset('[%da-uu-z]'))
|
||||
assert(strset('[a-]') == "-a")
|
||||
assert(strset('[^%W]') == strset('[%w]'))
|
||||
assert(strset('[]%%]') == '%]')
|
||||
assert(strset('[a%-z]') == '-az')
|
||||
assert(strset('[%^%[%-a%]%-b]') == '-[]^ab')
|
||||
assert(strset('%Z') == strset('[\1-\255]'))
|
||||
assert(strset('.') == strset('[\1-\255%z]'))
|
||||
print('+');
|
||||
|
||||
assert(string.match("alo xyzK", "(%w+)K") == "xyz")
|
||||
assert(string.match("254 K", "(%d*)K") == "")
|
||||
assert(string.match("alo ", "(%w*)$") == "")
|
||||
assert(string.match("alo ", "(%w+)$") == nil)
|
||||
assert(string.find("(álo)", "%(á") == 1)
|
||||
local a, b, c, d, e = string.match("âlo alo", "^(((.).).* (%w*))$")
|
||||
assert(a == 'âlo alo' and b == 'âl' and c == 'â' and d == 'alo' and e == nil)
|
||||
a, b, c, d = string.match('0123456789', '(.+(.?)())')
|
||||
assert(a == '0123456789' and b == '' and c == 11 and d == nil)
|
||||
print('+')
|
||||
|
||||
assert(string.gsub('ülo ülo', 'ü', 'x') == 'xlo xlo')
|
||||
assert(string.gsub('alo úlo ', ' +$', '') == 'alo úlo') -- trim
|
||||
assert(string.gsub(' alo alo ', '^%s*(.-)%s*$', '%1') == 'alo alo') -- double trim
|
||||
assert(string.gsub('alo alo \n 123\n ', '%s+', ' ') == 'alo alo 123 ')
|
||||
t = "abç d"
|
||||
a, b = string.gsub(t, '(.)', '%1@')
|
||||
assert('@'..a == string.gsub(t, '', '@') and b == 5)
|
||||
a, b = string.gsub('abçd', '(.)', '%0@', 2)
|
||||
assert(a == 'a@b@çd' and b == 2)
|
||||
assert(string.gsub('alo alo', '()[al]', '%1') == '12o 56o')
|
||||
assert(string.gsub("abc=xyz", "(%w*)(%p)(%w+)", "%3%2%1-%0") ==
|
||||
"xyz=abc-abc=xyz")
|
||||
assert(string.gsub("abc", "%w", "%1%0") == "aabbcc")
|
||||
assert(string.gsub("abc", "%w+", "%0%1") == "abcabc")
|
||||
assert(string.gsub('áéí', '$', '\0óú') == 'áéí\0óú')
|
||||
assert(string.gsub('', '^', 'r') == 'r')
|
||||
assert(string.gsub('', '$', 'r') == 'r')
|
||||
print('+')
|
||||
|
||||
assert(string.gsub("um (dois) tres (quatro)", "(%(%w+%))", string.upper) ==
|
||||
"um (DOIS) tres (QUATRO)")
|
||||
|
||||
do
|
||||
local function setglobal (n,v) rawset(_G, n, v) end
|
||||
string.gsub("a=roberto,roberto=a", "(%w+)=(%w%w*)", setglobal)
|
||||
assert(_G.a=="roberto" and _G.roberto=="a")
|
||||
end
|
||||
|
||||
function f(a,b) return string.gsub(a,'.',b) end
|
||||
assert(string.gsub("trocar tudo em |teste|b| é |beleza|al|", "|([^|]*)|([^|]*)|", f) ==
|
||||
"trocar tudo em bbbbb é alalalalalal")
|
||||
|
||||
local function dostring (s) return load(s)() or "" end
|
||||
assert(string.gsub("alo $a=1$ novamente $return a$", "$([^$]*)%$", dostring) ==
|
||||
"alo novamente 1")
|
||||
|
||||
x = string.gsub("$x=string.gsub('alo', '.', string.upper)$ assim vai para $return x$",
|
||||
"$([^$]*)%$", dostring)
|
||||
assert(x == ' assim vai para ALO')
|
||||
|
||||
t = {}
|
||||
s = 'a alo jose joao'
|
||||
r = string.gsub(s, '()(%w+)()', function (a,w,b)
|
||||
assert(string.len(w) == b-a);
|
||||
t[a] = b-a;
|
||||
end)
|
||||
assert(s == r and t[1] == 1 and t[3] == 3 and t[7] == 4 and t[13] == 4)
|
||||
|
||||
|
||||
function isbalanced (s)
|
||||
return string.find(string.gsub(s, "%b()", ""), "[()]") == nil
|
||||
end
|
||||
|
||||
assert(isbalanced("(9 ((8))(\0) 7) \0\0 a b ()(c)() a"))
|
||||
assert(not isbalanced("(9 ((8) 7) a b (\0 c) a"))
|
||||
assert(string.gsub("alo 'oi' alo", "%b''", '"') == 'alo " alo')
|
||||
|
||||
|
||||
local t = {"apple", "orange", "lime"; n=0}
|
||||
assert(string.gsub("x and x and x", "x", function () t.n=t.n+1; return t[t.n] end)
|
||||
== "apple and orange and lime")
|
||||
|
||||
t = {n=0}
|
||||
string.gsub("first second word", "%w%w*", function (w) t.n=t.n+1; t[t.n] = w end)
|
||||
assert(t[1] == "first" and t[2] == "second" and t[3] == "word" and t.n == 3)
|
||||
|
||||
t = {n=0}
|
||||
assert(string.gsub("first second word", "%w+",
|
||||
function (w) t.n=t.n+1; t[t.n] = w end, 2) == "first second word")
|
||||
assert(t[1] == "first" and t[2] == "second" and t[3] == nil)
|
||||
|
||||
assert(not pcall(string.gsub, "alo", "(.", print))
|
||||
assert(not pcall(string.gsub, "alo", ".)", print))
|
||||
assert(not pcall(string.gsub, "alo", "(.", {}))
|
||||
assert(not pcall(string.gsub, "alo", "(.)", "%2"))
|
||||
assert(not pcall(string.gsub, "alo", "(%1)", "a"))
|
||||
assert(not pcall(string.gsub, "alo", "(%0)", "a"))
|
||||
|
||||
if not _soft then
|
||||
-- big strings
|
||||
local a = string.rep('a', 300000)
|
||||
assert(string.find(a, '^a*.?$'))
|
||||
assert(not string.find(a, '^a*.?b$'))
|
||||
assert(string.find(a, '^a-.?$'))
|
||||
|
||||
-- bug in 5.1.2
|
||||
a = string.rep('a', 10000) .. string.rep('b', 10000)
|
||||
assert(not pcall(string.gsub, a, 'b'))
|
||||
end
|
||||
|
||||
-- recursive nest of gsubs
|
||||
function rev (s)
|
||||
return string.gsub(s, "(.)(.+)", function (c,s1) return rev(s1)..c end)
|
||||
end
|
||||
|
||||
local x = "abcdef"
|
||||
assert(rev(rev(x)) == x)
|
||||
|
||||
|
||||
-- gsub with tables
|
||||
assert(string.gsub("alo alo", ".", {}) == "alo alo")
|
||||
assert(string.gsub("alo alo", "(.)", {a="AA", l=""}) == "AAo AAo")
|
||||
assert(string.gsub("alo alo", "(.).", {a="AA", l="K"}) == "AAo AAo")
|
||||
assert(string.gsub("alo alo", "((.)(.?))", {al="AA", o=false}) == "AAo AAo")
|
||||
|
||||
assert(string.gsub("alo alo", "().", {2,5,6}) == "256 alo")
|
||||
|
||||
t = {}; setmetatable(t, {__index = function (t,s) return string.upper(s) end})
|
||||
assert(string.gsub("a alo b hi", "%w%w+", t) == "a ALO b HI")
|
||||
|
||||
|
||||
-- tests for gmatch
|
||||
local a = 0
|
||||
for i in string.gmatch('abcde', '()') do assert(i == a+1); a=i end
|
||||
assert(a==6)
|
||||
|
||||
t = {n=0}
|
||||
for w in string.gmatch("first second word", "%w+") do
|
||||
t.n=t.n+1; t[t.n] = w
|
||||
end
|
||||
assert(t[1] == "first" and t[2] == "second" and t[3] == "word")
|
||||
|
||||
t = {3, 6, 9}
|
||||
for i in string.gmatch ("xuxx uu ppar r", "()(.)%2") do
|
||||
assert(i == table.remove(t, 1))
|
||||
end
|
||||
assert(#t == 0)
|
||||
|
||||
t = {}
|
||||
for i,j in string.gmatch("13 14 10 = 11, 15= 16, 22=23", "(%d+)%s*=%s*(%d+)") do
|
||||
t[i] = j
|
||||
end
|
||||
a = 0
|
||||
for k,v in pairs(t) do assert(k+1 == v+0); a=a+1 end
|
||||
assert(a == 3)
|
||||
|
||||
|
||||
-- tests for `%f' (`frontiers')
|
||||
|
||||
assert(string.gsub("aaa aa a aaa a", "%f[%w]a", "x") == "xaa xa x xaa x")
|
||||
assert(string.gsub("[[]] [][] [[[[", "%f[[].", "x") == "x[]] x]x] x[[[")
|
||||
assert(string.gsub("01abc45de3", "%f[%d]", ".") == ".01abc.45de.3")
|
||||
assert(string.gsub("01abc45 de3x", "%f[%D]%w", ".") == "01.bc45 de3.")
|
||||
assert(string.gsub("function", "%f[\1-\255]%w", ".") == ".unction")
|
||||
assert(string.gsub("function", "%f[^\1-\255]", ".") == "function.")
|
||||
|
||||
assert(string.find("a", "%f[a]") == 1)
|
||||
assert(string.find("a", "%f[^%z]") == 1)
|
||||
assert(string.find("a", "%f[^%l]") == 2)
|
||||
assert(string.find("aba", "%f[a%z]") == 3)
|
||||
assert(string.find("aba", "%f[%z]") == 4)
|
||||
assert(not string.find("aba", "%f[%l%z]"))
|
||||
assert(not string.find("aba", "%f[^%l%z]"))
|
||||
|
||||
local i, e = string.find(" alo aalo allo", "%f[%S].-%f[%s].-%f[%S]")
|
||||
assert(i == 2 and e == 5)
|
||||
local k = string.match(" alo aalo allo", "%f[%S](.-%f[%s].-%f[%S])")
|
||||
assert(k == 'alo ')
|
||||
|
||||
local a = {1, 5, 9, 14, 17,}
|
||||
for k in string.gmatch("alo alo th02 is 1hat", "()%f[%w%d]") do
|
||||
assert(table.remove(a, 1) == k)
|
||||
end
|
||||
assert(#a == 0)
|
||||
|
||||
|
||||
-- malformed patterns
|
||||
local function malform (p, m)
|
||||
m = m or "malformed"
|
||||
local r, msg = pcall(string.find, "a", p)
|
||||
assert(not r and string.find(msg, m))
|
||||
end
|
||||
|
||||
malform("[a")
|
||||
malform("[]")
|
||||
malform("[^]")
|
||||
malform("[a%]")
|
||||
malform("[a%")
|
||||
malform("%b")
|
||||
malform("%ba")
|
||||
malform("%")
|
||||
malform("%f", "missing")
|
||||
|
||||
-- \0 in patterns
|
||||
assert(string.match("ab\0\1\2c", "[\0-\2]+") == "\0\1\2")
|
||||
assert(string.match("ab\0\1\2c", "[\0-\0]+") == "\0")
|
||||
assert(string.find("b$a", "$\0?") == 2)
|
||||
assert(string.find("abc\0efg", "%\0") == 4)
|
||||
assert(string.match("abc\0efg\0\1e\1g", "%b\0\1") == "\0efg\0\1e\1")
|
||||
assert(string.match("abc\0\0\0", "%\0+") == "\0\0\0")
|
||||
assert(string.match("abc\0\0\0", "%\0%\0?") == "\0\0")
|
||||
|
||||
-- magic char after \0
|
||||
assert(string.find("abc\0\0","\0.") == 4)
|
||||
assert(string.find("abcx\0\0abc\0abc","x\0\0abc\0a.") == 4)
|
||||
|
||||
print('OK')
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/sort.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/sort.lc
Normal file
Binary file not shown.
167
luaj-test/src/test/resources/lua5.2.1-tests/sort.lua
Normal file
167
luaj-test/src/test/resources/lua5.2.1-tests/sort.lua
Normal file
@@ -0,0 +1,167 @@
|
||||
print "testing (parts of) table library"
|
||||
|
||||
print "testing unpack"
|
||||
|
||||
local unpack = table.unpack
|
||||
|
||||
local x,y,z,a,n
|
||||
a = {}; lim = 2000
|
||||
for i=1, lim do a[i]=i end
|
||||
assert(select(lim, unpack(a)) == lim and select('#', unpack(a)) == lim)
|
||||
x = unpack(a)
|
||||
assert(x == 1)
|
||||
x = {unpack(a)}
|
||||
assert(#x == lim and x[1] == 1 and x[lim] == lim)
|
||||
x = {unpack(a, lim-2)}
|
||||
assert(#x == 3 and x[1] == lim-2 and x[3] == lim)
|
||||
x = {unpack(a, 10, 6)}
|
||||
assert(next(x) == nil) -- no elements
|
||||
x = {unpack(a, 11, 10)}
|
||||
assert(next(x) == nil) -- no elements
|
||||
x,y = unpack(a, 10, 10)
|
||||
assert(x == 10 and y == nil)
|
||||
x,y,z = unpack(a, 10, 11)
|
||||
assert(x == 10 and y == 11 and z == nil)
|
||||
a,x = unpack{1}
|
||||
assert(a==1 and x==nil)
|
||||
a,x = unpack({1,2}, 1, 1)
|
||||
assert(a==1 and x==nil)
|
||||
|
||||
if not _no32 then
|
||||
assert(not pcall(unpack, {}, 0, 2^31-1))
|
||||
assert(not pcall(unpack, {}, 1, 2^31-1))
|
||||
assert(not pcall(unpack, {}, -(2^31), 2^31-1))
|
||||
assert(not pcall(unpack, {}, -(2^31 - 1), 2^31-1))
|
||||
assert(pcall(unpack, {}, 2^31-1, 0))
|
||||
assert(pcall(unpack, {}, 2^31-1, 1))
|
||||
pcall(unpack, {}, 1, 2^31)
|
||||
a, b = unpack({[2^31-1] = 20}, 2^31-1, 2^31-1)
|
||||
assert(a == 20 and b == nil)
|
||||
a, b = unpack({[2^31-1] = 20}, 2^31-2, 2^31-1)
|
||||
assert(a == nil and b == 20)
|
||||
end
|
||||
|
||||
print "testing pack"
|
||||
|
||||
a = table.pack()
|
||||
assert(a[1] == nil and a.n == 0)
|
||||
|
||||
a = table.pack(table)
|
||||
assert(a[1] == table and a.n == 1)
|
||||
|
||||
a = table.pack(nil, nil, nil, nil)
|
||||
assert(a[1] == nil and a.n == 4)
|
||||
|
||||
|
||||
print"testing sort"
|
||||
|
||||
|
||||
-- test checks for invalid order functions
|
||||
local function check (t)
|
||||
local function f(a, b) assert(a and b); return true end
|
||||
local s, e = pcall(table.sort, t, f)
|
||||
assert(not s and e:find("invalid order function"))
|
||||
end
|
||||
|
||||
check{1,2,3,4}
|
||||
check{1,2,3,4,5}
|
||||
check{1,2,3,4,5,6}
|
||||
|
||||
|
||||
function check (a, f)
|
||||
f = f or function (x,y) return x<y end;
|
||||
for n = #a, 2, -1 do
|
||||
assert(not f(a[n], a[n-1]))
|
||||
end
|
||||
end
|
||||
|
||||
a = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep",
|
||||
"Oct", "Nov", "Dec"}
|
||||
|
||||
table.sort(a)
|
||||
check(a)
|
||||
|
||||
function perm (s, n)
|
||||
n = n or #s
|
||||
if n == 1 then
|
||||
local t = {unpack(s)}
|
||||
table.sort(t)
|
||||
check(t)
|
||||
else
|
||||
for i = 1, n do
|
||||
s[i], s[n] = s[n], s[i]
|
||||
perm(s, n - 1)
|
||||
s[i], s[n] = s[n], s[i]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
perm{}
|
||||
perm{1}
|
||||
perm{1,2}
|
||||
perm{1,2,3}
|
||||
perm{1,2,3,4}
|
||||
perm{2,2,3,4}
|
||||
perm{1,2,3,4,5}
|
||||
perm{1,2,3,3,5}
|
||||
perm{1,2,3,4,5,6}
|
||||
perm{2,2,3,3,5,6}
|
||||
|
||||
limit = 30000
|
||||
if _soft then limit = 5000 end
|
||||
|
||||
a = {}
|
||||
for i=1,limit do
|
||||
a[i] = math.random()
|
||||
end
|
||||
|
||||
local x = os.clock()
|
||||
table.sort(a)
|
||||
print(string.format("Sorting %d elements in %.2f sec.", limit, os.clock()-x))
|
||||
check(a)
|
||||
|
||||
x = os.clock()
|
||||
table.sort(a)
|
||||
print(string.format("Re-sorting %d elements in %.2f sec.", limit, os.clock()-x))
|
||||
check(a)
|
||||
|
||||
a = {}
|
||||
for i=1,limit do
|
||||
a[i] = math.random()
|
||||
end
|
||||
|
||||
x = os.clock(); i=0
|
||||
table.sort(a, function(x,y) i=i+1; return y<x end)
|
||||
print(string.format("Invert-sorting other %d elements in %.2f sec., with %i comparisons",
|
||||
limit, os.clock()-x, i))
|
||||
check(a, function(x,y) return y<x end)
|
||||
|
||||
|
||||
table.sort{} -- empty array
|
||||
|
||||
for i=1,limit do a[i] = false end
|
||||
x = os.clock();
|
||||
table.sort(a, function(x,y) return nil end)
|
||||
print(string.format("Sorting %d equal elements in %.2f sec.", limit, os.clock()-x))
|
||||
check(a, function(x,y) return nil end)
|
||||
for i,v in pairs(a) do assert(not v or i=='n' and v==limit) end
|
||||
|
||||
A = {"álo", "\0first :-)", "alo", "then this one", "45", "and a new"}
|
||||
table.sort(A)
|
||||
check(A)
|
||||
|
||||
table.sort(A, function (x, y)
|
||||
load(string.format("A[%q] = ''", x))()
|
||||
collectgarbage()
|
||||
return x<y
|
||||
end)
|
||||
|
||||
|
||||
tt = {__lt = function (a,b) return a.val < b.val end}
|
||||
a = {}
|
||||
for i=1,10 do a[i] = {val=math.random(100)}; setmetatable(a[i], tt); end
|
||||
table.sort(a)
|
||||
check(a, tt.__lt)
|
||||
check(a)
|
||||
|
||||
print"OK"
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/strings.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/strings.lc
Normal file
Binary file not shown.
281
luaj-test/src/test/resources/lua5.2.1-tests/strings.lua
Normal file
281
luaj-test/src/test/resources/lua5.2.1-tests/strings.lua
Normal file
@@ -0,0 +1,281 @@
|
||||
print('testing strings and string library')
|
||||
|
||||
assert('alo' < 'alo1')
|
||||
assert('' < 'a')
|
||||
assert('alo\0alo' < 'alo\0b')
|
||||
assert('alo\0alo\0\0' > 'alo\0alo\0')
|
||||
assert('alo' < 'alo\0')
|
||||
assert('alo\0' > 'alo')
|
||||
assert('\0' < '\1')
|
||||
assert('\0\0' < '\0\1')
|
||||
assert('\1\0a\0a' <= '\1\0a\0a')
|
||||
assert(not ('\1\0a\0b' <= '\1\0a\0a'))
|
||||
assert('\0\0\0' < '\0\0\0\0')
|
||||
assert(not('\0\0\0\0' < '\0\0\0'))
|
||||
assert('\0\0\0' <= '\0\0\0\0')
|
||||
assert(not('\0\0\0\0' <= '\0\0\0'))
|
||||
assert('\0\0\0' <= '\0\0\0')
|
||||
assert('\0\0\0' >= '\0\0\0')
|
||||
assert(not ('\0\0b' < '\0\0a\0'))
|
||||
print('+')
|
||||
|
||||
assert(string.sub("123456789",2,4) == "234")
|
||||
assert(string.sub("123456789",7) == "789")
|
||||
assert(string.sub("123456789",7,6) == "")
|
||||
assert(string.sub("123456789",7,7) == "7")
|
||||
assert(string.sub("123456789",0,0) == "")
|
||||
assert(string.sub("123456789",-10,10) == "123456789")
|
||||
assert(string.sub("123456789",1,9) == "123456789")
|
||||
assert(string.sub("123456789",-10,-20) == "")
|
||||
assert(string.sub("123456789",-1) == "9")
|
||||
assert(string.sub("123456789",-4) == "6789")
|
||||
assert(string.sub("123456789",-6, -4) == "456")
|
||||
if not _no32 then
|
||||
assert(string.sub("123456789",-2^31, -4) == "123456")
|
||||
assert(string.sub("123456789",-2^31, 2^31 - 1) == "123456789")
|
||||
assert(string.sub("123456789",-2^31, -2^31) == "")
|
||||
end
|
||||
assert(string.sub("\000123456789",3,5) == "234")
|
||||
assert(("\000123456789"):sub(8) == "789")
|
||||
print('+')
|
||||
|
||||
assert(string.find("123456789", "345") == 3)
|
||||
a,b = string.find("123456789", "345")
|
||||
assert(string.sub("123456789", a, b) == "345")
|
||||
assert(string.find("1234567890123456789", "345", 3) == 3)
|
||||
assert(string.find("1234567890123456789", "345", 4) == 13)
|
||||
assert(string.find("1234567890123456789", "346", 4) == nil)
|
||||
assert(string.find("1234567890123456789", ".45", -9) == 13)
|
||||
assert(string.find("abcdefg", "\0", 5, 1) == nil)
|
||||
assert(string.find("", "") == 1)
|
||||
assert(string.find("", "", 1) == 1)
|
||||
assert(not string.find("", "", 2))
|
||||
assert(string.find('', 'aaa', 1) == nil)
|
||||
assert(('alo(.)alo'):find('(.)', 1, 1) == 4)
|
||||
print('+')
|
||||
|
||||
assert(string.len("") == 0)
|
||||
assert(string.len("\0\0\0") == 3)
|
||||
assert(string.len("1234567890") == 10)
|
||||
|
||||
assert(#"" == 0)
|
||||
assert(#"\0\0\0" == 3)
|
||||
assert(#"1234567890" == 10)
|
||||
|
||||
assert(string.byte("a") == 97)
|
||||
assert(string.byte("\xe4") > 127)
|
||||
assert(string.byte(string.char(255)) == 255)
|
||||
assert(string.byte(string.char(0)) == 0)
|
||||
assert(string.byte("\0") == 0)
|
||||
assert(string.byte("\0\0alo\0x", -1) == string.byte('x'))
|
||||
assert(string.byte("ba", 2) == 97)
|
||||
assert(string.byte("\n\n", 2, -1) == 10)
|
||||
assert(string.byte("\n\n", 2, 2) == 10)
|
||||
assert(string.byte("") == nil)
|
||||
assert(string.byte("hi", -3) == nil)
|
||||
assert(string.byte("hi", 3) == nil)
|
||||
assert(string.byte("hi", 9, 10) == nil)
|
||||
assert(string.byte("hi", 2, 1) == nil)
|
||||
assert(string.char() == "")
|
||||
assert(string.char(0, 255, 0) == "\0\255\0")
|
||||
assert(string.char(0, string.byte("\xe4"), 0) == "\0\xe4\0")
|
||||
assert(string.char(string.byte("\xe4l\0óu", 1, -1)) == "\xe4l\0óu")
|
||||
assert(string.char(string.byte("\xe4l\0óu", 1, 0)) == "")
|
||||
assert(string.char(string.byte("\xe4l\0óu", -10, 100)) == "\xe4l\0óu")
|
||||
print('+')
|
||||
|
||||
assert(string.upper("ab\0c") == "AB\0C")
|
||||
assert(string.lower("\0ABCc%$") == "\0abcc%$")
|
||||
assert(string.rep('teste', 0) == '')
|
||||
assert(string.rep('tés\00tê', 2) == 'tés\0têtés\000tê')
|
||||
assert(string.rep('', 10) == '')
|
||||
|
||||
-- repetitions with separator
|
||||
assert(string.rep('teste', 0, 'xuxu') == '')
|
||||
assert(string.rep('teste', 1, 'xuxu') == 'teste')
|
||||
assert(string.rep('\1\0\1', 2, '\0\0') == '\1\0\1\0\0\1\0\1')
|
||||
assert(string.rep('', 10, '.') == string.rep('.', 9))
|
||||
if not _no32 then
|
||||
assert(not pcall(string.rep, "aa", 2^30))
|
||||
assert(not pcall(string.rep, "", 2^30, "aa"))
|
||||
end
|
||||
|
||||
assert(string.reverse"" == "")
|
||||
assert(string.reverse"\0\1\2\3" == "\3\2\1\0")
|
||||
assert(string.reverse"\0001234" == "4321\0")
|
||||
|
||||
for i=0,30 do assert(string.len(string.rep('a', i)) == i) end
|
||||
|
||||
assert(type(tostring(nil)) == 'string')
|
||||
assert(type(tostring(12)) == 'string')
|
||||
assert(''..12 == '12' and type(12 .. '') == 'string')
|
||||
assert(string.find(tostring{}, 'table:'))
|
||||
assert(string.find(tostring(print), 'function:'))
|
||||
assert(tostring(1234567890123) == '1234567890123')
|
||||
assert(#tostring('\0') == 1)
|
||||
assert(tostring(true) == "true")
|
||||
assert(tostring(false) == "false")
|
||||
print('+')
|
||||
|
||||
x = '"ílo"\n\\'
|
||||
assert(string.format('%q%s', x, x) == '"\\"ílo\\"\\\n\\\\""ílo"\n\\')
|
||||
assert(string.format('%q', "\0") == [["\0"]])
|
||||
assert(load(string.format('return %q', x))() == x)
|
||||
x = "\0\1\0023\5\0009"
|
||||
assert(load(string.format('return %q', x))() == x)
|
||||
assert(string.format("\0%c\0%c%x\0", string.byte("\xe4"), string.byte("b"), 140) ==
|
||||
"\0\xe4\0b8c\0")
|
||||
assert(string.format('') == "")
|
||||
assert(string.format("%c",34)..string.format("%c",48)..string.format("%c",90)..string.format("%c",100) ==
|
||||
string.format("%c%c%c%c", 34, 48, 90, 100))
|
||||
assert(string.format("%s\0 is not \0%s", 'not be', 'be') == 'not be\0 is not \0be')
|
||||
assert(string.format("%%%d %010d", 10, 23) == "%10 0000000023")
|
||||
assert(tonumber(string.format("%f", 10.3)) == 10.3)
|
||||
x = string.format('"%-50s"', 'a')
|
||||
assert(#x == 52)
|
||||
assert(string.sub(x, 1, 4) == '"a ')
|
||||
|
||||
assert(string.format("-%.20s.20s", string.rep("%", 2000)) ==
|
||||
"-"..string.rep("%", 20)..".20s")
|
||||
assert(string.format('"-%20s.20s"', string.rep("%", 2000)) ==
|
||||
string.format("%q", "-"..string.rep("%", 2000)..".20s"))
|
||||
|
||||
-- format x tostring
|
||||
assert(string.format("%s %s", nil, true) == "nil true")
|
||||
assert(string.format("%s %.4s", false, true) == "false true")
|
||||
assert(string.format("%.3s %.3s", false, true) == "fal tru")
|
||||
local m = setmetatable({}, {__tostring = function () return "hello" end})
|
||||
assert(string.format("%s %.10s", m, m) == "hello hello")
|
||||
|
||||
|
||||
assert(string.format("%x", 0.3) == "0")
|
||||
assert(string.format("%02x", 0.1) == "00")
|
||||
assert(string.format("%08X", 2^32 - 1) == "FFFFFFFF")
|
||||
assert(string.format("%+08d", 2^31 - 1) == "+2147483647")
|
||||
assert(string.format("%+08d", -2^31) == "-2147483648")
|
||||
|
||||
|
||||
-- longest number that can be formated
|
||||
assert(string.len(string.format('%99.99f', -1e308)) >= 100)
|
||||
|
||||
|
||||
|
||||
if not _nolonglong then
|
||||
print("testing large numbers for format")
|
||||
assert(string.format("%8x", 2^52 - 1) == "fffffffffffff")
|
||||
assert(string.format("%d", -1) == "-1")
|
||||
assert(tonumber(string.format("%u", 2^62)) == 2^62)
|
||||
assert(string.format("%8x", 0xffffffff) == "ffffffff")
|
||||
assert(string.format("%8x", 0x7fffffff) == "7fffffff")
|
||||
assert(string.format("%d", 2^53) == "9007199254740992")
|
||||
assert(string.format("%d", -2^53) == "-9007199254740992")
|
||||
assert(string.format("0x%8X", 0x8f000003) == "0x8F000003")
|
||||
-- maximum integer that fits both in 64-int and (exact) double
|
||||
local x = 2^64 - 2^(64-53)
|
||||
assert(x == 0xfffffffffffff800)
|
||||
assert(tonumber(string.format("%u", x)) == x)
|
||||
assert(tonumber(string.format("0X%x", x)) == x)
|
||||
assert(string.format("%x", x) == "fffffffffffff800")
|
||||
assert(string.format("%d", x/2) == "9223372036854774784")
|
||||
assert(string.format("%d", -x/2) == "-9223372036854774784")
|
||||
assert(string.format("%d", -2^63) == "-9223372036854775808")
|
||||
assert(string.format("%x", 2^63) == "8000000000000000")
|
||||
end
|
||||
|
||||
if not _noformatA then
|
||||
print("testing 'format %a %A'")
|
||||
assert(string.format("%.2a", 0.5) == "0x1.00p-1")
|
||||
assert(string.format("%A", 0x1fffffffffffff) == "0X1.FFFFFFFFFFFFFP+52")
|
||||
assert(string.format("%.4a", -3) == "-0x1.8000p+1")
|
||||
assert(tonumber(string.format("%a", -0.1)) == -0.1)
|
||||
end
|
||||
|
||||
-- errors in format
|
||||
|
||||
local function check (fmt, msg)
|
||||
local s, err = pcall(string.format, fmt, 10)
|
||||
assert(not s and string.find(err, msg))
|
||||
end
|
||||
|
||||
local aux = string.rep('0', 600)
|
||||
check("%100.3d", "too long")
|
||||
check("%1"..aux..".3d", "too long")
|
||||
check("%1.100d", "too long")
|
||||
check("%10.1"..aux.."004d", "too long")
|
||||
check("%t", "invalid option")
|
||||
check("%"..aux.."d", "repeated flags")
|
||||
check("%d %d", "no value")
|
||||
|
||||
|
||||
-- integers out of range
|
||||
assert(not pcall(string.format, "%d", 2^63))
|
||||
assert(not pcall(string.format, "%x", 2^64))
|
||||
assert(not pcall(string.format, "%x", -2^64))
|
||||
assert(not pcall(string.format, "%x", -1))
|
||||
|
||||
|
||||
assert(load("return 1\n--comentário sem EOL no final")() == 1)
|
||||
|
||||
|
||||
assert(table.concat{} == "")
|
||||
assert(table.concat({}, 'x') == "")
|
||||
assert(table.concat({'\0', '\0\1', '\0\1\2'}, '.\0.') == "\0.\0.\0\1.\0.\0\1\2")
|
||||
local a = {}; for i=1,3000 do a[i] = "xuxu" end
|
||||
assert(table.concat(a, "123").."123" == string.rep("xuxu123", 3000))
|
||||
assert(table.concat(a, "b", 20, 20) == "xuxu")
|
||||
assert(table.concat(a, "", 20, 21) == "xuxuxuxu")
|
||||
assert(table.concat(a, "x", 22, 21) == "")
|
||||
assert(table.concat(a, "3", 2999) == "xuxu3xuxu")
|
||||
if not _no32 then
|
||||
assert(table.concat({}, "x", 2^31-1, 2^31-2) == "")
|
||||
assert(table.concat({}, "x", -2^31+1, -2^31) == "")
|
||||
assert(table.concat({}, "x", 2^31-1, -2^31) == "")
|
||||
assert(table.concat({[2^31-1] = "alo"}, "x", 2^31-1, 2^31-1) == "alo")
|
||||
end
|
||||
|
||||
assert(not pcall(table.concat, {"a", "b", {}}))
|
||||
|
||||
a = {"a","b","c"}
|
||||
assert(table.concat(a, ",", 1, 0) == "")
|
||||
assert(table.concat(a, ",", 1, 1) == "a")
|
||||
assert(table.concat(a, ",", 1, 2) == "a,b")
|
||||
assert(table.concat(a, ",", 2) == "b,c")
|
||||
assert(table.concat(a, ",", 3) == "c")
|
||||
assert(table.concat(a, ",", 4) == "")
|
||||
|
||||
if not _port then
|
||||
|
||||
local locales = { "ptb", "ISO-8859-1", "pt_BR" }
|
||||
local function trylocale (w)
|
||||
for i = 1, #locales do
|
||||
if os.setlocale(locales[i], w) then return true end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
if not trylocale("collate") then
|
||||
print("locale not supported")
|
||||
else
|
||||
assert("alo" < "álo" and "álo" < "amo")
|
||||
end
|
||||
|
||||
if not trylocale("ctype") then
|
||||
print("locale not supported")
|
||||
else
|
||||
assert(load("a = 3.4")); -- parser should not change outside locale
|
||||
assert(not load("á = 3.4")); -- even with errors
|
||||
assert(string.gsub("áéíóú", "%a", "x") == "xxxxx")
|
||||
assert(string.gsub("áÁéÉ", "%l", "x") == "xÁxÉ")
|
||||
assert(string.gsub("áÁéÉ", "%u", "x") == "áxéx")
|
||||
assert(string.upper"áÁé{xuxu}ção" == "ÁÁÉ{XUXU}ÇÃO")
|
||||
end
|
||||
|
||||
os.setlocale("C")
|
||||
assert(os.setlocale() == 'C')
|
||||
assert(os.setlocale(nil, "numeric") == 'C')
|
||||
|
||||
end
|
||||
|
||||
print('OK')
|
||||
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc
Normal file
Binary file not shown.
125
luaj-test/src/test/resources/lua5.2.1-tests/vararg.lua
Normal file
125
luaj-test/src/test/resources/lua5.2.1-tests/vararg.lua
Normal file
@@ -0,0 +1,125 @@
|
||||
print('testing vararg')
|
||||
|
||||
_G.arg = nil
|
||||
|
||||
function f(a, ...)
|
||||
local arg = {n = select('#', ...), ...}
|
||||
for i=1,arg.n do assert(a[i]==arg[i]) end
|
||||
return arg.n
|
||||
end
|
||||
|
||||
function c12 (...)
|
||||
assert(arg == nil)
|
||||
local x = {...}; x.n = #x
|
||||
local res = (x.n==2 and x[1] == 1 and x[2] == 2)
|
||||
if res then res = 55 end
|
||||
return res, 2
|
||||
end
|
||||
|
||||
function vararg (...) return {n = select('#', ...), ...} end
|
||||
|
||||
local call = function (f, args) return f(table.unpack(args, 1, args.n)) end
|
||||
|
||||
assert(f() == 0)
|
||||
assert(f({1,2,3}, 1, 2, 3) == 3)
|
||||
assert(f({"alo", nil, 45, f, nil}, "alo", nil, 45, f, nil) == 5)
|
||||
|
||||
assert(c12(1,2)==55)
|
||||
a,b = assert(call(c12, {1,2}))
|
||||
assert(a == 55 and b == 2)
|
||||
a = call(c12, {1,2;n=2})
|
||||
assert(a == 55 and b == 2)
|
||||
a = call(c12, {1,2;n=1})
|
||||
assert(not a)
|
||||
assert(c12(1,2,3) == false)
|
||||
local a = vararg(call(next, {_G,nil;n=2}))
|
||||
local b,c = next(_G)
|
||||
assert(a[1] == b and a[2] == c and a.n == 2)
|
||||
a = vararg(call(call, {c12, {1,2}}))
|
||||
assert(a.n == 2 and a[1] == 55 and a[2] == 2)
|
||||
a = call(print, {'+'})
|
||||
assert(a == nil)
|
||||
|
||||
local t = {1, 10}
|
||||
function t:f (...) local arg = {...}; return self[...]+#arg end
|
||||
assert(t:f(1,4) == 3 and t:f(2) == 11)
|
||||
print('+')
|
||||
|
||||
lim = 20
|
||||
local i, a = 1, {}
|
||||
while i <= lim do a[i] = i+0.3; i=i+1 end
|
||||
|
||||
function f(a, b, c, d, ...)
|
||||
local more = {...}
|
||||
assert(a == 1.3 and more[1] == 5.3 and
|
||||
more[lim-4] == lim+0.3 and not more[lim-3])
|
||||
end
|
||||
|
||||
function g(a,b,c)
|
||||
assert(a == 1.3 and b == 2.3 and c == 3.3)
|
||||
end
|
||||
|
||||
call(f, a)
|
||||
call(g, a)
|
||||
|
||||
a = {}
|
||||
i = 1
|
||||
while i <= lim do a[i] = i; i=i+1 end
|
||||
assert(call(math.max, a) == lim)
|
||||
|
||||
print("+")
|
||||
|
||||
|
||||
-- new-style varargs
|
||||
|
||||
function oneless (a, ...) return ... end
|
||||
|
||||
function f (n, a, ...)
|
||||
local b
|
||||
assert(arg == nil)
|
||||
if n == 0 then
|
||||
local b, c, d = ...
|
||||
return a, b, c, d, oneless(oneless(oneless(...)))
|
||||
else
|
||||
n, b, a = n-1, ..., a
|
||||
assert(b == ...)
|
||||
return f(n, a, ...)
|
||||
end
|
||||
end
|
||||
|
||||
a,b,c,d,e = assert(f(10,5,4,3,2,1))
|
||||
assert(a==5 and b==4 and c==3 and d==2 and e==1)
|
||||
|
||||
a,b,c,d,e = f(4)
|
||||
assert(a==nil and b==nil and c==nil and d==nil and e==nil)
|
||||
|
||||
|
||||
-- varargs for main chunks
|
||||
f = load[[ return {...} ]]
|
||||
x = f(2,3)
|
||||
assert(x[1] == 2 and x[2] == 3 and x[3] == nil)
|
||||
|
||||
|
||||
f = load[[
|
||||
local x = {...}
|
||||
for i=1,select('#', ...) do assert(x[i] == select(i, ...)) end
|
||||
assert(x[select('#', ...)+1] == nil)
|
||||
return true
|
||||
]]
|
||||
|
||||
assert(f("a", "b", nil, {}, assert))
|
||||
assert(f())
|
||||
|
||||
a = {select(3, table.unpack{10,20,30,40})}
|
||||
assert(#a == 2 and a[1] == 30 and a[2] == 40)
|
||||
a = {select(1)}
|
||||
assert(next(a) == nil)
|
||||
a = {select(-1, 3, 5, 7)}
|
||||
assert(a[1] == 7 and a[2] == nil)
|
||||
a = {select(-2, 3, 5, 7)}
|
||||
assert(a[1] == 5 and a[2] == 7 and a[3] == nil)
|
||||
pcall(select, 10000)
|
||||
pcall(select, -10000)
|
||||
|
||||
print('OK')
|
||||
|
||||
BIN
luaj-test/src/test/resources/lua5.2.1-tests/verybig.lc
Normal file
BIN
luaj-test/src/test/resources/lua5.2.1-tests/verybig.lc
Normal file
Binary file not shown.
144
luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua
Normal file
144
luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua
Normal file
@@ -0,0 +1,144 @@
|
||||
print "testing RK"
|
||||
|
||||
-- testing opcodes with RK arguments larger than K limit
|
||||
local function foo ()
|
||||
local dummy = {
|
||||
-- fill first 256 entries in table of constants
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
||||
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
|
||||
33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
|
||||
49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
|
||||
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80,
|
||||
81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,
|
||||
97, 98, 99, 100, 101, 102, 103, 104,
|
||||
105, 106, 107, 108, 109, 110, 111, 112,
|
||||
113, 114, 115, 116, 117, 118, 119, 120,
|
||||
121, 122, 123, 124, 125, 126, 127, 128,
|
||||
129, 130, 131, 132, 133, 134, 135, 136,
|
||||
137, 138, 139, 140, 141, 142, 143, 144,
|
||||
145, 146, 147, 148, 149, 150, 151, 152,
|
||||
153, 154, 155, 156, 157, 158, 159, 160,
|
||||
161, 162, 163, 164, 165, 166, 167, 168,
|
||||
169, 170, 171, 172, 173, 174, 175, 176,
|
||||
177, 178, 179, 180, 181, 182, 183, 184,
|
||||
185, 186, 187, 188, 189, 190, 191, 192,
|
||||
193, 194, 195, 196, 197, 198, 199, 200,
|
||||
201, 202, 203, 204, 205, 206, 207, 208,
|
||||
209, 210, 211, 212, 213, 214, 215, 216,
|
||||
217, 218, 219, 220, 221, 222, 223, 224,
|
||||
225, 226, 227, 228, 229, 230, 231, 232,
|
||||
233, 234, 235, 236, 237, 238, 239, 240,
|
||||
241, 242, 243, 244, 245, 246, 247, 248,
|
||||
249, 250, 251, 252, 253, 254, 255, 256,
|
||||
}
|
||||
assert(24.5 + 0.6 == 25.1)
|
||||
local t = {foo = function (self, x) return x + self.x end, x = 10}
|
||||
t.t = t
|
||||
assert(t:foo(1.5) == 11.5)
|
||||
assert(t.t:foo(0.5) == 10.5) -- bug in 5.2 alpha
|
||||
assert(24.3 == 24.3)
|
||||
assert((function () return t.x end)() == 10)
|
||||
end
|
||||
|
||||
|
||||
foo()
|
||||
foo = nil
|
||||
|
||||
if _soft then return 10 end
|
||||
|
||||
print "testing large programs (>64k)"
|
||||
|
||||
-- template to create a very big test file
|
||||
prog = [[$
|
||||
|
||||
local a,b
|
||||
|
||||
b = {$1$
|
||||
b30009 = 65534,
|
||||
b30010 = 65535,
|
||||
b30011 = 65536,
|
||||
b30012 = 65537,
|
||||
b30013 = 16777214,
|
||||
b30014 = 16777215,
|
||||
b30015 = 16777216,
|
||||
b30016 = 16777217,
|
||||
b30017 = 4294967294,
|
||||
b30018 = 4294967295,
|
||||
b30019 = 4294967296,
|
||||
b30020 = 4294967297,
|
||||
b30021 = -65534,
|
||||
b30022 = -65535,
|
||||
b30023 = -65536,
|
||||
b30024 = -4294967297,
|
||||
b30025 = 15012.5,
|
||||
$2$
|
||||
};
|
||||
|
||||
assert(b.a50008 == 25004 and b["a11"] == 5.5)
|
||||
assert(b.a33007 == 16503.5 and b.a50009 == 25004.5)
|
||||
assert(b["b"..30024] == -4294967297)
|
||||
|
||||
function b:xxx (a,b) return a+b end
|
||||
assert(b:xxx(10, 12) == 22) -- pushself with non-constant index
|
||||
b.xxx = nil
|
||||
|
||||
s = 0; n=0
|
||||
for a,b in pairs(b) do s=s+b; n=n+1 end
|
||||
assert(s==13977183656.5 and n==70001)
|
||||
|
||||
|
||||
a = nil; b = nil
|
||||
print'+'
|
||||
|
||||
function f(x) b=x end
|
||||
|
||||
a = f{$3$} or 10
|
||||
|
||||
assert(a==10)
|
||||
assert(b[1] == "a10" and b[2] == 5 and b[#b-1] == "a50009")
|
||||
|
||||
|
||||
function xxxx (x) return b[x] end
|
||||
|
||||
assert(xxxx(3) == "a11")
|
||||
|
||||
a = nil; b=nil
|
||||
xxxx = nil
|
||||
|
||||
return 10
|
||||
|
||||
]]
|
||||
|
||||
-- functions to fill in the $n$
|
||||
F = {
|
||||
function () -- $1$
|
||||
for i=10,50009 do
|
||||
io.write('a', i, ' = ', 5+((i-10)/2), ',\n')
|
||||
end
|
||||
end,
|
||||
|
||||
function () -- $2$
|
||||
for i=30026,50009 do
|
||||
io.write('b', i, ' = ', 15013+((i-30026)/2), ',\n')
|
||||
end
|
||||
end,
|
||||
|
||||
function () -- $3$
|
||||
for i=10,50009 do
|
||||
io.write('"a', i, '", ', 5+((i-10)/2), ',\n')
|
||||
end
|
||||
end,
|
||||
}
|
||||
|
||||
file = os.tmpname()
|
||||
io.output(file)
|
||||
for s in string.gmatch(prog, "$([^$]+)") do
|
||||
local n = tonumber(s)
|
||||
if not n then io.write(s) else F[n]() end
|
||||
end
|
||||
io.close()
|
||||
result = dofile(file)
|
||||
assert(os.remove(file))
|
||||
print'OK'
|
||||
return result
|
||||
|
||||
277
luaj-test/src/test/resources/luaj3.0-tests/baselib.lua
Normal file
277
luaj-test/src/test/resources/luaj3.0-tests/baselib.lua
Normal file
@@ -0,0 +1,277 @@
|
||||
|
||||
-- tostring replacement that assigns ids
|
||||
local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'}
|
||||
tostring = function(x)
|
||||
if not x or not types[type(x)] then return ts(x) end
|
||||
if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end
|
||||
return id[x]
|
||||
end
|
||||
|
||||
-- wrap pcall to return one result
|
||||
-- error message are tested elsewhere
|
||||
local pc = pcall
|
||||
local pcall = function(...)
|
||||
local s,e = pc(...)
|
||||
if s then return e end
|
||||
return false, type(e)
|
||||
end
|
||||
|
||||
-- print
|
||||
print()
|
||||
print(11)
|
||||
print("abc",123,nil,"pqr")
|
||||
print( nil and 'T' or 'F' )
|
||||
print( false and 'T' or 'F' )
|
||||
print( 0 and 'T' or 'F' )
|
||||
|
||||
-- assert
|
||||
print( 'assert(true)', assert(true) )
|
||||
print( 'pcall(assert,true)', pcall(assert,true) )
|
||||
print( 'pcall(assert,false)', pcall(assert,false) )
|
||||
print( 'pcall(assert,nil)', pcall(assert,nil) )
|
||||
print( 'pcall(assert,true,"msg")', pcall(assert,true,"msg") )
|
||||
print( 'pcall(assert,false,"msg")', pcall(assert,false,"msg") )
|
||||
print( 'pcall(assert,nil,"msg")', pcall(assert,nil,"msg") )
|
||||
print( 'pcall(assert,false,"msg","msg2")', pcall(assert,false,"msg","msg2") )
|
||||
|
||||
-- collectgarbage (not supported)
|
||||
print( 'collectgarbage("count")', type(collectgarbage("count")))
|
||||
print( 'collectgarbage("collect")', type(collectgarbage("collect")))
|
||||
print( 'collectgarbage("count")', type(collectgarbage("count")))
|
||||
|
||||
-- dofile (not supported)
|
||||
-- ipairs
|
||||
print( 'pcall(ipairs)', pcall(ipairs) )
|
||||
print( 'pcall(ipairs,nil)', pcall(ipairs,nil) )
|
||||
print( 'pcall(ipairs,"a")', pcall(ipairs,"a") )
|
||||
print( 'pcall(ipairs,1)', pcall(ipairs,1) )
|
||||
for k,v in ipairs({}) do print('ipairs1',k,v)end
|
||||
for k,v in ipairs({'one','two'}) do print('ipairs2',k,v)end
|
||||
for k,v in ipairs({aa='aaa',bb='bbb'}) do print('ipairs3',k,v)end
|
||||
for k,v in ipairs({aa='aaa',bb='bbb','one','two'}) do print('ipairs4',k,v)end
|
||||
for k,v in ipairs({[30]='30',[20]='20'}) do print('ipairs5',k,v)end
|
||||
|
||||
-- load
|
||||
t = { "print ", "'table ", "loaded'", "", " print'after empty string'" }
|
||||
i = 0
|
||||
f = function() i = i + 1; return t[i]; end
|
||||
c,e = load(f)
|
||||
if c then print('load: ', pcall(c)) else print('load failed:', e) end
|
||||
|
||||
-- loadfile
|
||||
-- load
|
||||
local lst = "print(3+4); return 8"
|
||||
local chunk, err = load( lst )
|
||||
print( 'load("'..lst..'")', chunk, err )
|
||||
print( 'load("'..lst..'")()', chunk() )
|
||||
|
||||
-- pairs
|
||||
print( 'pcall(pairs)', pcall(pairs) )
|
||||
print( 'pcall(pairs,nil)', pcall(pairs,nil) )
|
||||
print( 'pcall(pairs,"a")', pcall(pairs,"a") )
|
||||
print( 'pcall(pairs,1)', pcall(pairs,1) )
|
||||
for k,v in pairs({}) do print('pairs1',k,v)end
|
||||
for k,v in pairs({'one','two'}) do print('pairs2',k,v)end
|
||||
for k,v in pairs({aa='aaa'}) do print('pairs3',k,v)end
|
||||
for k,v in pairs({aa='aaa','one','two'}) do print('pairs4',k,v)end
|
||||
for k,v in pairs({[20]='30',[30]='20'}) do print('pairs5',k,v)end
|
||||
|
||||
-- _G
|
||||
print( '_G["abc"] (before)', _G["abc"] )
|
||||
abc='def'
|
||||
print( '_G["abc"] (after)', _G["abc"] )
|
||||
|
||||
-- type
|
||||
print( 'type(nil)', type(nil) )
|
||||
print( 'type("a")', type("a") )
|
||||
print( 'type(1)', type(1) )
|
||||
print( 'type(1.5)', type(1.5) )
|
||||
print( 'type(function() end)', type(function() end) )
|
||||
print( 'type({})', type({}) )
|
||||
print( 'type(true)', type(true) )
|
||||
print( 'type(false)', type(false) )
|
||||
print( 'pcall(type,type)', pcall(type,type) )
|
||||
print( 'pcall(type)', pcall(type) )
|
||||
print( '(function() return pcall(type) end)()', (function() return pcall(type) end)() )
|
||||
local function la() return pcall(type) end
|
||||
print( 'la()', la() )
|
||||
function ga() return pcall(type) end
|
||||
print( 'ga()', ga() )
|
||||
|
||||
-- getmetatable, setmetatable
|
||||
ta = { aa1="aaa1", aa2="aaa2" }
|
||||
tb = { bb1="bbb1", bb2="bbb2" }
|
||||
print( 'getmetatable(ta)', getmetatable(ta) )
|
||||
print( 'getmetatable(tb)', getmetatable(tb) )
|
||||
print( 'setmetatable(ta),{cc1="ccc1"}', type( setmetatable(ta,{cc1="ccc1"}) ) )
|
||||
print( 'setmetatable(tb),{dd1="ddd1"}', type( setmetatable(tb,{dd1="ddd1"}) ) )
|
||||
print( 'getmetatable(ta)["cc1"]', getmetatable(ta)["cc1"] )
|
||||
print( 'getmetatable(tb)["dd1"]', getmetatable(tb)["dd1"] )
|
||||
print( 'getmetatable(1)', getmetatable(1) )
|
||||
print( 'pcall(setmetatable,1)', pcall(setmetatable,1) )
|
||||
print( 'pcall(setmetatable,nil)', pcall(setmetatable,nil) )
|
||||
print( 'pcall(setmetatable,"ABC")', pcall(setmetatable,"ABC") )
|
||||
print( 'pcall(setmetatable,function() end)', pcall(setmetatable,function() end) )
|
||||
|
||||
-- rawget,rawset
|
||||
local mt = {aa="aaa", bb="bbb"}
|
||||
mt.__index = mt
|
||||
mt.__newindex = mt
|
||||
local s = {cc="ccc", dd="ddd", }
|
||||
local t = {cc="ccc", dd="ddd"}
|
||||
setmetatable(t,mt)
|
||||
print( 'pcall(rawget)', pcall(rawget))
|
||||
print( 'pcall(rawget,"a")', pcall(rawget,"a"))
|
||||
print( 'pcall(rawget,s)', pcall(rawget,s))
|
||||
print( 'pcall(rawget,t)', pcall(rawget,t))
|
||||
|
||||
function printtables()
|
||||
function printtable(name,t)
|
||||
print( ' '..name, t["aa"], t["bb"], t["cc"], t["dd"], t["ee"], t["ff"], t["gg"] )
|
||||
print( ' '..name,
|
||||
rawget(t,"aa"),
|
||||
rawget(t,"bb"),
|
||||
rawget(t,"cc"),
|
||||
rawget(t,"dd"),
|
||||
rawget(t,"ee"),
|
||||
rawget(t,"ff"),
|
||||
rawget(t,"gg") )
|
||||
end
|
||||
printtable( 's', s )
|
||||
printtable( 't', t )
|
||||
printtable( 'mt', mt )
|
||||
end
|
||||
printtables()
|
||||
print( 'pcall(rawset,s,"aa","www")', rawset(s,"aa","www"))
|
||||
printtables()
|
||||
print( 'pcall(rawset,s,"cc","xxx")', rawset(s,"cc","xxx"))
|
||||
printtables()
|
||||
print( 'pcall(rawset,t,"aa","yyy")', rawset(t,"aa","yyy"))
|
||||
printtables()
|
||||
print( 'pcall(rawset,t,"dd","zzz")', rawset(t,"dd","zzz"))
|
||||
printtables()
|
||||
|
||||
-- rawlen
|
||||
print( 'pcall(rawlen, {})', pcall(rawlen, {}))
|
||||
print( 'pcall(rawlen, {"a"})', pcall(rawlen, {'a'}))
|
||||
print( 'pcall(rawlen, {"a","b"})', pcall(rawlen, {'a','b'}))
|
||||
print( 'pcall(rawlen, "")', pcall(rawlen, ""))
|
||||
print( 'pcall(rawlen, "a")', pcall(rawlen, 'a'))
|
||||
print( 'pcall(rawlen, "ab")', pcall(rawlen, 'ab'))
|
||||
print( 'pcall(rawlen, 1)', pcall(rawlen, 1))
|
||||
print( 'pcall(rawlen, nil)', pcall(rawlen, nil))
|
||||
print( 'pcall(rawlen)', pcall(rawlen))
|
||||
|
||||
printtables()
|
||||
print( 's["ee"]="ppp"' ); s["ee"]="ppp"
|
||||
printtables()
|
||||
print( 's["cc"]="qqq"' ); s["cc"]="qqq"
|
||||
printtables()
|
||||
print( 't["ff"]="rrr"' ); t["ff"]="rrr"
|
||||
printtables()
|
||||
print( 't["dd"]="sss"' ); t["dd"]="sss"
|
||||
printtables()
|
||||
print( 'mt["gg"]="ttt"' ); mt["gg"]="ttt"
|
||||
printtables()
|
||||
|
||||
|
||||
-- select
|
||||
print( 'pcall(select)', pcall(select) )
|
||||
print( 'select(1,11,22,33,44,55)', select(1,11,22,33,44,55) )
|
||||
print( 'select(2,11,22,33,44,55)', select(2,11,22,33,44,55) )
|
||||
print( 'select(3,11,22,33,44,55)', select(3,11,22,33,44,55) )
|
||||
print( 'select(4,11,22,33,44,55)', select(4,11,22,33,44,55) )
|
||||
print( 'pcall(select,5,11,22,33,44,55)', pcall(select,5,11,22,33,44,55) )
|
||||
print( 'pcall(select,6,11,22,33,44,55)', pcall(select,6,11,22,33,44,55) )
|
||||
print( 'pcall(select,7,11,22,33,44,55)', pcall(select,7,11,22,33,44,55) )
|
||||
print( 'pcall(select,0,11,22,33,44,55)', pcall(select,0,11,22,33,44,55) )
|
||||
print( 'pcall(select,-1,11,22,33,44,55)', pcall(select,-1,11,22,33,44,55) )
|
||||
print( 'pcall(select,-2,11,22,33,44,55)', pcall(select,-2,11,22,33,44,55) )
|
||||
print( 'pcall(select,-4,11,22,33,44,55)', pcall(select,-4,11,22,33,44,55) )
|
||||
print( 'pcall(select,-5,11,22,33,44,55)', pcall(select,-5,11,22,33,44,55) )
|
||||
print( 'pcall(select,-6,11,22,33,44,55)', pcall(select,-6,11,22,33,44,55) )
|
||||
print( 'pcall(select,1)', pcall(select,1) )
|
||||
print( 'pcall(select,select)', pcall(select,select) )
|
||||
print( 'pcall(select,{})', pcall(select,{}) )
|
||||
print( 'pcall(select,"2",11,22,33)', pcall(select,"2",11,22,33) )
|
||||
print( 'pcall(select,"abc",11,22,33)', pcall(select,"abc",11,22,33) )
|
||||
|
||||
|
||||
-- tonumber
|
||||
print( 'pcall(tonumber)', pcall(tostring) )
|
||||
print( 'pcall(tonumber,nil)', pcall(tonumber,nil) )
|
||||
print( 'pcall(tonumber,"abc")', pcall(tonumber,"abc") )
|
||||
print( 'pcall(tonumber,"123")', pcall(tonumber,"123") )
|
||||
print( 'pcall(tonumber,"123",10)', pcall(tonumber,"123", 10) )
|
||||
print( 'pcall(tonumber,"123",8)', pcall(tonumber,"123", 8) )
|
||||
print( 'pcall(tonumber,"123",6)', pcall(tonumber,"123", 6) )
|
||||
print( 'pcall(tonumber,"10101",4)', pcall(tonumber,"10101", 4) )
|
||||
print( 'pcall(tonumber,"10101",3)', pcall(tonumber,"10101", 3) )
|
||||
print( 'pcall(tonumber,"10101",2)', pcall(tonumber,"10101", 2) )
|
||||
print( 'pcall(tonumber,"1a1",16)', pcall(tonumber,"1a1", 16) )
|
||||
print( 'pcall(tonumber,"1a1",32)', pcall(tonumber,"1a1", 32) )
|
||||
print( 'pcall(tonumber,"1a1",54)', pcall(tonumber,"1a1", 54) )
|
||||
print( 'pcall(tonumber,"1a1",1)', pcall(tonumber,"1a1", 1) )
|
||||
print( 'pcall(tonumber,"1a1",0)', pcall(tonumber,"1a1", 0) )
|
||||
print( 'pcall(tonumber,"1a1",-1)', pcall(tonumber,"1a1", -1) )
|
||||
print( 'pcall(tonumber,"1a1","32")', pcall(tonumber,"1a1", "32") )
|
||||
print( 'pcall(tonumber,"123","456")', pcall(tonumber,"123","456") )
|
||||
print( 'pcall(tonumber,"1a1",10)', pcall(tonumber,"1a1", 10) )
|
||||
print( 'pcall(tonumber,"151",4)', pcall(tonumber,"151", 4) )
|
||||
print( 'pcall(tonumber,"151",3)', pcall(tonumber,"151", 3) )
|
||||
print( 'pcall(tonumber,"151",2)', pcall(tonumber,"151", 2) )
|
||||
print( 'pcall(tonumber,"123",8,8)', pcall(tonumber,"123", 8, 8) )
|
||||
print( 'pcall(tonumber,123)', pcall(tonumber,123) )
|
||||
print( 'pcall(tonumber,true)', pcall(tonumber,true) )
|
||||
print( 'pcall(tonumber,false)', pcall(tonumber,false) )
|
||||
print( 'pcall(tonumber,tonumber)', pcall(tonumber,tonumber) )
|
||||
print( 'pcall(tonumber,function() end)', pcall(tonumber,function() end) )
|
||||
print( 'pcall(tonumber,{"one","two",a="aa",b="bb"})', pcall(tonumber,{"one","two",a="aa",b="bb"}) )
|
||||
print( 'pcall(tonumber,"123.456")', pcall(tonumber,"123.456") )
|
||||
print( 'pcall(tonumber," 123.456")', pcall(tonumber," 123.456") )
|
||||
print( 'pcall(tonumber," 234qwer")', pcall(tonumber," 234qwer") )
|
||||
print( 'pcall(tonumber,"0x20")', pcall(tonumber,"0x20") )
|
||||
print( 'pcall(tonumber," 0x20")', pcall(tonumber," 0x20") )
|
||||
print( 'pcall(tonumber,"0x20 ")', pcall(tonumber,"0x20 ") )
|
||||
print( 'pcall(tonumber," 0x20 ")', pcall(tonumber," 0x20 ") )
|
||||
print( 'pcall(tonumber,"0X20")', pcall(tonumber,"0X20") )
|
||||
print( 'pcall(tonumber," 0X20")', pcall(tonumber," 0X20") )
|
||||
print( 'pcall(tonumber,"0X20 ")', pcall(tonumber,"0X20 ") )
|
||||
print( 'pcall(tonumber," 0X20 ")', pcall(tonumber," 0X20 ") )
|
||||
print( 'pcall(tonumber,"0x20",10)', pcall(tonumber,"0x20",10) )
|
||||
print( 'pcall(tonumber,"0x20",16)', pcall(tonumber,"0x20",16) )
|
||||
print( 'pcall(tonumber,"0x20",8)', pcall(tonumber,"0x20",8) )
|
||||
|
||||
-- tostring
|
||||
print( 'pcall(tostring)', pcall(tostring) )
|
||||
print( 'pcall(tostring,nil)', pcall(tostring,nil) )
|
||||
print( 'pcall(tostring,"abc")', pcall(tostring,"abc") )
|
||||
print( 'pcall(tostring,"abc","def")', pcall(tostring,"abc","def") )
|
||||
print( 'pcall(tostring,123)', pcall(tostring,123) )
|
||||
print( 'pcall(tostring,true)', pcall(tostring,true) )
|
||||
print( 'pcall(tostring,false)', pcall(tostring,false) )
|
||||
print( 'tostring(tostring)', type(tostring(tostring)) )
|
||||
print( 'tostring(function() end)', type(tostring(function() end)) )
|
||||
print( 'tostring({"one","two",a="aa",b="bb"})', type(tostring({"one","two",a="aa",b="bb"})) )
|
||||
|
||||
-- _VERSION
|
||||
print( '_VERSION', type(_VERSION) )
|
||||
|
||||
-- xpcall
|
||||
local errfunc = function( detail )
|
||||
print( ' in errfunc', type(detail) )
|
||||
return 'response-from-xpcall'
|
||||
end
|
||||
local badfunc = function() error( 'error-from-badfunc' ) end
|
||||
local wrappedbad = function() pcall( badfunc ) end
|
||||
print( 'pcall(badfunc)', pcall(badfunc) )
|
||||
print( 'pcall(badfunc,errfunc)', pcall(badfunc,errfunc) )
|
||||
print( 'pcall(badfunc,badfunc)', pcall(badfunc,badfunc) )
|
||||
print( 'pcall(wrappedbad)', pcall(wrappedbad) )
|
||||
print( 'pcall(wrappedbad,errfunc)', pcall(wrappedbad,errfunc) )
|
||||
print( 'pcall(xpcall(badfunc))', pcall(xpcall,badfunc) )
|
||||
print( 'pcall(xpcall(badfunc,errfunc))', pcall(xpcall,badfunc,errfunc) )
|
||||
print( 'pcall(xpcall(badfunc,badfunc))', pcall(xpcall,badfunc,badfunc) )
|
||||
print( 'pcall(xpcall(wrappedbad))', pcall(xpcall,wrappedbad) )
|
||||
print( 'xpcall(wrappedbad,errfunc)', xpcall(wrappedbad,errfunc) )
|
||||
|
||||
126
luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua
Normal file
126
luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua
Normal file
@@ -0,0 +1,126 @@
|
||||
function printrunning()
|
||||
if coroutine.running() == nil then
|
||||
print("running is nil");
|
||||
else
|
||||
print("running is not nil")
|
||||
end
|
||||
end
|
||||
|
||||
function foo (a)
|
||||
print("foo", a)
|
||||
return coroutine.yield(2*a)
|
||||
end
|
||||
|
||||
co = coroutine.create(function (a,b)
|
||||
print("co-body", a, b)
|
||||
local r = foo(a+1)
|
||||
print("co-body", r)
|
||||
local r, s = coroutine.yield(a+b, a-b)
|
||||
print("co-body", r, s)
|
||||
|
||||
printrunning()
|
||||
print("co.status.inside",coroutine.status(co));
|
||||
local co2 = coroutine.create(function()
|
||||
print("co.status.inside2",coroutine.status(co));
|
||||
end)
|
||||
print("co.status.inside",coroutine.status(co));
|
||||
coroutine.resume(co2);
|
||||
|
||||
return b, "end"
|
||||
end)
|
||||
|
||||
function exercise()
|
||||
printrunning()
|
||||
print("co.status",coroutine.status(co));
|
||||
print("main", coroutine.resume(co, 1, 10))
|
||||
print("co.status",coroutine.status(co));
|
||||
print("main", coroutine.resume(co, "r"))
|
||||
print("co.status",coroutine.status(co));
|
||||
print("main", coroutine.resume(co, "x", "y"))
|
||||
print("co.status",coroutine.status(co));
|
||||
print("main", coroutine.resume(co, "x", "y"))
|
||||
print("co.status",coroutine.status(co));
|
||||
end
|
||||
|
||||
exercise();
|
||||
|
||||
co = coroutine.create(function (a,b)
|
||||
print("co-body", a, b)
|
||||
-- TODO: make java and C behave the same for yielding in pcalls
|
||||
-- local status,r = pcall( foo, a+1 )
|
||||
foo(a+1)
|
||||
print("co-body", status,r)
|
||||
local r, s = coroutine.yield(a+b, a-b)
|
||||
print("co-body", r, s)
|
||||
return b, "end"
|
||||
end)
|
||||
|
||||
exercise();
|
||||
|
||||
|
||||
-- wrap test
|
||||
local g = coroutine.wrap(function (a,b)
|
||||
print("co-body", a, b)
|
||||
local r = foo(a+1)
|
||||
print("co-body", r)
|
||||
local r, s = coroutine.yield(a+b, a-b)
|
||||
print("co-body", r, s)
|
||||
return b, "end"
|
||||
end )
|
||||
|
||||
print("g", g(1, 10))
|
||||
print("g", g("r"))
|
||||
print("g", g("x", "y"))
|
||||
local s,e = pcall( g, "x", "y" )
|
||||
print("g", string.match(e,'cannot resume dead coroutine') or 'badmessage: '..tostring(e))
|
||||
|
||||
-- varargs passing
|
||||
local echo = function(msg,...)
|
||||
print( msg, ...)
|
||||
return ...
|
||||
end
|
||||
local echocr = function(...)
|
||||
local arg = table.pack(...)
|
||||
echo('(echocr) first args', table.unpack(arg,1,arg.n))
|
||||
local a = arg
|
||||
while true do
|
||||
a = { echo( '(echoch) yield returns', coroutine.yield( table.unpack(a) ) ) }
|
||||
end
|
||||
end
|
||||
local c = coroutine.create( echocr )
|
||||
local step = function(...)
|
||||
echo( '(main) resume returns',
|
||||
coroutine.resume(c, echo('(main) sending args', ...)) )
|
||||
end
|
||||
step(111,222,333)
|
||||
step()
|
||||
step(111)
|
||||
step(111,222,333)
|
||||
|
||||
-- test loops in resume calls
|
||||
b = coroutine.create( function( arg )
|
||||
while ( true ) do
|
||||
print( ' b-resumed', arg, b == coroutine.running() )
|
||||
print( ' b-b', coroutine.status(b) )
|
||||
print( ' b-c', coroutine.status(c) )
|
||||
print( ' b-resume-b',coroutine.resume( b, 'b-arg-for-b' ) )
|
||||
print( ' b-resume-c',coroutine.resume( c, 'b-arg-for-c' ) )
|
||||
arg = coroutine.yield( 'b-rslt' )
|
||||
end
|
||||
end )
|
||||
c = coroutine.create( function( arg )
|
||||
for i=1,3 do
|
||||
print( ' c-resumed', arg, c == coroutine.running() )
|
||||
print( ' c-b', coroutine.status(b) )
|
||||
print( ' c-c', coroutine.status(c) )
|
||||
print( ' c-resume-b',coroutine.resume( b, 'b-arg-for-b' ) )
|
||||
print( ' c-resume-c',coroutine.resume( c, 'b-arg-for-c' ) )
|
||||
arg = coroutine.yield( 'c-rslt' )
|
||||
end
|
||||
end )
|
||||
for i=1,3 do
|
||||
print( 'main-b', coroutine.status(b) )
|
||||
print( 'main-c', coroutine.status(c) )
|
||||
print( 'main-resume-b',coroutine.resume( b, 'main-arg-for-b' ) )
|
||||
print( 'main-resume-c',coroutine.resume( c, 'main-arg-for-c' ) )
|
||||
end
|
||||
280
luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua
Normal file
280
luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua
Normal file
@@ -0,0 +1,280 @@
|
||||
|
||||
local print,tostring,_G,pcall,ipairs,isnumber = print,tostring,_G,pcall,ipairs,isnumber
|
||||
local e,f,g,h,s
|
||||
print( 'has debug', debug~=nil )
|
||||
if not debug then error( 'no debug' ) end
|
||||
|
||||
|
||||
print( '----- debug.getlocal, debug.setlocal' )
|
||||
h = function(v,i,n)
|
||||
s = 'h-'..v..'-'..i
|
||||
local x1,y1 = debug.getlocal(v,i)
|
||||
local x2,y2 = debug.setlocal(v,i,n)
|
||||
local x3,y3 = debug.getlocal(v,i)
|
||||
return s..' -> '..v..'-'..i..' '..
|
||||
'get='..tostring(x1)..','..tostring(y1)..' '..
|
||||
'set='..tostring(x2)..','..tostring(y2)..' '..
|
||||
'get='..tostring(x3)..','..tostring(y3)..' '
|
||||
end
|
||||
g = function(...)
|
||||
local p,q,r=7,8,9
|
||||
local t = h(...)
|
||||
local b = table.concat({...},',')
|
||||
return t..'\tg locals='..p..','..q..','..r..' tbl={'..b..'}'
|
||||
end
|
||||
f = function(a,b,c)
|
||||
local d,e,f = 4,5,6
|
||||
local t = g(a,b,c)
|
||||
return t..'\tf locals='..','..a..','..b..','..c..','..d..','..e..','..f
|
||||
end
|
||||
for lvl=3,2,-1 do
|
||||
for lcl=0,7 do
|
||||
print( pcall( f, lvl, lcl, '#' ) )
|
||||
end
|
||||
end
|
||||
for lvl=1,1 do
|
||||
for lcl=3,7 do
|
||||
print( pcall( f, lvl, lcl, '#' ) )
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
print( '----- debug.getupvalue, debug.setupvalue' )
|
||||
local m,n,o = 101,102,103
|
||||
f = function(p,q,r)
|
||||
local p,q,r = 104,105,106
|
||||
local g = function(s,t,u)
|
||||
local v,w,x = 107,108,109
|
||||
return function()
|
||||
return m,n,o,p,q,r,v,w,x
|
||||
end
|
||||
end
|
||||
return g
|
||||
end
|
||||
g = f()
|
||||
h = g()
|
||||
local callh = function()
|
||||
local t = {}
|
||||
for i,v in ipairs( { pcall(h) } ) do
|
||||
t[i] = tostring(v)
|
||||
end
|
||||
return table.concat(t,',')
|
||||
end
|
||||
print( 'h', h() )
|
||||
local funs = { f, g, h }
|
||||
local names = { 'f', 'g', 'h' }
|
||||
for i=1,3 do
|
||||
local fun,name = funs[i],names[i]
|
||||
for index=0,10 do
|
||||
local s1,x1,y1 = pcall( debug.getupvalue, fun, index )
|
||||
local s2,x2,y2 = pcall( debug.setupvalue, fun, index, 666000+i*111000+index )
|
||||
local s3,x3,y3 = pcall( debug.getupvalue, fun, index )
|
||||
print( name..' -> '..i..'-'..index..' '..
|
||||
'get='..tostring(s1)..','..tostring(x1)..','..tostring(y1)..' '..
|
||||
'set='..tostring(s2)..','..tostring(x2)..','..tostring(y2)..' '..
|
||||
'get='..tostring(s3)..','..tostring(x3)..','..tostring(y3)..' '..
|
||||
'tbl='..callh() )
|
||||
end
|
||||
end
|
||||
|
||||
print( '----- debug.setmetatable, debug.getmetatable' )
|
||||
local a = {a='bbb'}
|
||||
local b = {}
|
||||
local mt = {__index={b='ccc'}}
|
||||
print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b))
|
||||
local s1,x1,y1 = pcall( debug.getmetatable, a )
|
||||
local s2,x2,y2 = pcall( debug.setmetatable, a, mt )
|
||||
print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b))
|
||||
local s3,x3,y3 = pcall( debug.getmetatable, a ) print(type(s3), type(x3), type(y3), type(getmetatable(a)))
|
||||
local s4,x4,y4 = pcall( debug.getmetatable, b ) print(type(s4), type(x4), type(y4), type(getmetatable(b)))
|
||||
local s5,x5,y5 = pcall( debug.setmetatable, a, nil ) print(type(s5), type(x5), type(y5), type(getmetatable(a)))
|
||||
print( 'a.a='..tostring(a.a)..' a.b='..tostring(a.b)..' b.a='..tostring(b.a)..' b.b='..tostring(b.b))
|
||||
local s6,x6,y6 = pcall( debug.getmetatable, a ) print(type(s6), type(x6), type(y6), type(getmetatable(a)))
|
||||
if not s1 then print( 's1 error', x1 ) end
|
||||
if not s2 then print( 's2 error', x2 ) end
|
||||
if not s3 then print( 's3 error', x3 ) end
|
||||
if not s4 then print( 's4 error', x4 ) end
|
||||
if not s5 then print( 's5 error', x5 ) end
|
||||
if not s6 then print( 's6 error', x6 ) end
|
||||
print( 'get='..tostring(s1)..','..tostring(x1==nil)..','..tostring(y1) )
|
||||
print( 'set='..tostring(s2)..','..tostring(x2==a)..','..tostring(y2) )
|
||||
print( 'get='..tostring(s3)..','..tostring(x3==mt)..','..tostring(y3) )
|
||||
print( 'get='..tostring(s4)..','..tostring(x4==nil)..','..tostring(y4) )
|
||||
print( 'set='..tostring(s5)..','..tostring(x5==a)..','..tostring(y5) )
|
||||
print( 'get='..tostring(s6)..','..tostring(x6==nil)..','..tostring(y6) )
|
||||
print( pcall( debug.getmetatable, 1 ) )
|
||||
print( pcall( debug.setmetatable, 1, {} ) )
|
||||
print( pcall( debug.setmetatable, 1, nil ) )
|
||||
|
||||
print( '----- debug.getinfo' )
|
||||
local printfield = function(tbl, field)
|
||||
local x = tbl[field]
|
||||
if x == nil then return end
|
||||
local typ = type(x)
|
||||
if typ=='table' then
|
||||
x = '{'..table.concat(x,',')..'}'
|
||||
elseif typ=='function' then
|
||||
x = typ
|
||||
end
|
||||
print( ' '..field..': '..tostring(x) )
|
||||
end
|
||||
local fields = { 'source', 'short_src', 'what',
|
||||
'currentline', 'linedefined', 'lastlinedefined',
|
||||
'nups', 'func', 'activelines' }
|
||||
local printinfo = function(...)
|
||||
for i,a in ipairs({...}) do
|
||||
if type(a) == 'table' then
|
||||
for j,field in ipairs(fields) do
|
||||
printfield( a, field)
|
||||
end
|
||||
else
|
||||
print( tostring(a) )
|
||||
end
|
||||
end
|
||||
end
|
||||
function test()
|
||||
local x = 5
|
||||
function f()
|
||||
x = x + 1
|
||||
return x
|
||||
end
|
||||
function g()
|
||||
x = x - 1
|
||||
print( '---' )
|
||||
printinfo( 'debug.getinfo(1)', debug.getinfo(1) )
|
||||
printinfo( 'debug.getinfo(1,"")', debug.getinfo(1, "") )
|
||||
printinfo( 'debug.getinfo(1,"l")', debug.getinfo(1, "l") )
|
||||
printinfo( 'debug.getinfo(1,"fL")', debug.getinfo(1, "fL") )
|
||||
printinfo( 'debug.getinfo(2)', debug.getinfo(2) )
|
||||
printinfo( 'debug.getinfo(2,"l")', debug.getinfo(2, "l") )
|
||||
printinfo( 'debug.getinfo(2,"fL")', debug.getinfo(2, "fL") )
|
||||
printinfo( 'debug.getinfo(10,"")', pcall( debug.getinfo, 10, "" ) )
|
||||
printinfo( 'debug.getinfo(-10,"")', pcall( debug.getinfo, -10, "" ) )
|
||||
print( '---' )
|
||||
return x
|
||||
end
|
||||
print(f())
|
||||
print(g())
|
||||
return f, g
|
||||
end
|
||||
|
||||
local options = "nSlufL"
|
||||
local e,f,g = pcall( test )
|
||||
print( 'e,f,g', e, type(f), type(g) )
|
||||
printinfo( 'debug.getinfo(f)', pcall(debug.getinfo, f) )
|
||||
printinfo( 'debug.getinfo(f,"'..options..'")', pcall(debug.getinfo, f, options) )
|
||||
for j=1,6 do
|
||||
local opts = options:sub(j,j)
|
||||
printinfo( 'debug.getinfo(f,"'..opts..'")', pcall(debug.getinfo, f, opts) )
|
||||
end
|
||||
printinfo( 'debug.getinfo(g)', pcall(debug.getinfo, g) )
|
||||
printinfo( 'debug.getinfo(test)', pcall(debug.getinfo, test) )
|
||||
|
||||
print( '----- debug.sethook, debug.gethook' )
|
||||
f = function(x)
|
||||
g = function(y)
|
||||
return math.min(x,h)
|
||||
end
|
||||
local a = g(x)
|
||||
return a + a
|
||||
end
|
||||
local hook = function(...)
|
||||
print( ' ... in hook', ... )
|
||||
local info = debug.getinfo(2,"Sl")
|
||||
if info then
|
||||
print( ' info[2]='..tostring(info.short_src)..','..tostring(info.currentline) )
|
||||
end
|
||||
end
|
||||
local tryfunc = function(hook,mask,func,arg)
|
||||
local x,f,h,m
|
||||
pcall( function()
|
||||
debug.sethook(hook,mask)
|
||||
x = func(arg)
|
||||
f,h,m = debug.gethook()
|
||||
end )
|
||||
debug.sethook()
|
||||
return x,f,h,m
|
||||
end
|
||||
|
||||
local tryhooks = function(mask)
|
||||
local s1,a1,b1,c1,d1 = pcall( tryfunc, hook, mask, f, 333 )
|
||||
print( 'hook = '..mask..' -> '..
|
||||
'result='..tostring(s1)..','..tostring(a1)..','..
|
||||
type(b1)..','..type(c1)..','..
|
||||
tostring(b1==f)..','..tostring(c1==hook)..','..
|
||||
tostring(d1)..' ' )
|
||||
end
|
||||
|
||||
tryhooks("c")
|
||||
tryhooks("r")
|
||||
tryhooks("l")
|
||||
tryhooks("crl")
|
||||
|
||||
print( '----- debug.traceback' )
|
||||
function test()
|
||||
function a(msg)
|
||||
print((string.gsub(debug.traceback(msg), "%[Java]", "[C]")))
|
||||
end
|
||||
local function b(msg)
|
||||
pcall(a,msg)
|
||||
end
|
||||
c = function(i)
|
||||
if i <= 0 then b('hi') return end
|
||||
return c(i-1)
|
||||
end
|
||||
d = setmetatable({},{__index=function(t,k) v = c(k) return v end})
|
||||
local e = function()
|
||||
return d[0]
|
||||
end
|
||||
local f = {
|
||||
g = function()
|
||||
e()
|
||||
end
|
||||
}
|
||||
h = function()
|
||||
f.g()
|
||||
end
|
||||
local i = h
|
||||
i()
|
||||
end
|
||||
pcall(test)
|
||||
|
||||
|
||||
print( '----- debug.upvalueid' )
|
||||
local x,y = 100,200
|
||||
function a(b,c)
|
||||
local z,w = b,c
|
||||
return function()
|
||||
x,y,z,w = x+1,y+1,z+1,w+1
|
||||
return x,y,z,w
|
||||
end
|
||||
end
|
||||
a1 = a(300,400)
|
||||
a2 = a(500,600)
|
||||
print('debug.getupvalue(a1,1)', debug.getupvalue(a1,1))
|
||||
print('debug.getupvalue(a1,2)', debug.getupvalue(a1,2))
|
||||
print('debug.getupvalue(a2,1)', debug.getupvalue(a2,1))
|
||||
print('debug.getupvalue(a2,2)', debug.getupvalue(a2,2))
|
||||
print('debug.upvalueid(a1,1) == debug.upvalueid(a1,1)', debug.upvalueid(a1,1) == debug.upvalueid(a1,1))
|
||||
print('debug.upvalueid(a1,1) == debug.upvalueid(a2,1)', debug.upvalueid(a1,1) == debug.upvalueid(a2,1))
|
||||
print('debug.upvalueid(a1,1) == debug.upvalueid(a1,2)', debug.upvalueid(a1,1) == debug.upvalueid(a1,2))
|
||||
|
||||
print( '----- debug.upvaluejoin' )
|
||||
print('a1',a1())
|
||||
print('a2',a2())
|
||||
print('debug.upvaluejoin(a1,1,a2,2)', debug.upvaluejoin(a1,1,a2,2))
|
||||
print('debug.upvaluejoin(a1,3,a2,4)', debug.upvaluejoin(a1,3,a2,4))
|
||||
print('a1',a1())
|
||||
print('a2',a2())
|
||||
print('a1',a1())
|
||||
print('a2',a2())
|
||||
for i = 1,4 do
|
||||
print('debug.getupvalue(a1,'..i..')', debug.getupvalue(a1,i))
|
||||
print('debug.getupvalue(a2,'..i..')', debug.getupvalue(a2,i))
|
||||
for j = 1,4 do
|
||||
print('debug.upvalueid(a1,'..i..') == debug.upvalueid(a1,'..j..')', debug.upvalueid(a1,i) == debug.upvalueid(a1,j))
|
||||
print('debug.upvalueid(a1,'..i..') == debug.upvalueid(a2,'..j..')', debug.upvalueid(a1,i) == debug.upvalueid(a2,j))
|
||||
print('debug.upvalueid(a2,'..i..') == debug.upvalueid(a1,'..j..')', debug.upvalueid(a2,i) == debug.upvalueid(a1,j))
|
||||
print('debug.upvalueid(a2,'..i..') == debug.upvalueid(a2,'..j..')', debug.upvalueid(a2,i) == debug.upvalueid(a2,j))
|
||||
end
|
||||
end
|
||||
137
luaj-test/src/test/resources/luaj3.0-tests/errors.lua
Normal file
137
luaj-test/src/test/resources/luaj3.0-tests/errors.lua
Normal file
@@ -0,0 +1,137 @@
|
||||
-- tostring replacement that assigns ids
|
||||
local ts,id,nid,types = tostring,{},0,{table='tbl',thread='thr',userdata='uda',['function']='func'}
|
||||
tostring = function(x)
|
||||
if not x or not types[type(x)] then return ts(x) end
|
||||
if not id[x] then nid=nid+1; id[x]=types[type(x)]..'.'..nid end
|
||||
return id[x]
|
||||
end
|
||||
|
||||
-- test of common types of errors
|
||||
-- local function c(f,...) return f(...) end
|
||||
-- local function b(...) return c(...) end
|
||||
--local function a(...) return (pcall(b,...)) end
|
||||
local function a(...) local s,e=pcall(...) if s then return s,e else return false,type(e) end end
|
||||
s = 'some string'
|
||||
local t = {}
|
||||
-- error message tests
|
||||
print( 'a(error)', a(error) )
|
||||
print( 'a(error,"msg")', a(error,"msg") )
|
||||
print( 'a(error,"msg",0)', a(error,"msg",0) )
|
||||
print( 'a(error,"msg",1)', a(error,"msg",1) )
|
||||
print( 'a(error,"msg",2)', a(error,"msg",2) )
|
||||
print( 'a(error,"msg",3)', a(error,"msg",3) )
|
||||
print( 'a(error,"msg",4)', a(error,"msg",4) )
|
||||
print( 'a(error,"msg",5)', a(error,"msg",5) )
|
||||
print( 'a(error,"msg",6)', a(error,"msg",6) )
|
||||
|
||||
-- call errors
|
||||
print( 'a(nil())', a(function() return n() end) )
|
||||
print( 'a(t()) ', a(function() return t() end) )
|
||||
print( 'a(s()) ', a(function() return s() end) )
|
||||
print( 'a(true())', a(function() local b = true; return b() end) )
|
||||
|
||||
-- arithmetic errors
|
||||
print( 'a(nil+1)', a(function() return nil+1 end) )
|
||||
print( 'a(a+1) ', a(function() return a+1 end) )
|
||||
print( 'a(s+1) ', a(function() return s+1 end) )
|
||||
print( 'a(true+1)', a(function() local b = true; return b+1 end) )
|
||||
|
||||
-- table errors
|
||||
print( 'a(nil.x)', a(function() return n.x end) )
|
||||
print( 'a(a.x) ', a(function() return a.x end) )
|
||||
print( 'a(s.x) ', a(function() return s.x end) )
|
||||
print( 'a(true.x)', a(function() local b = true; return b.x end) )
|
||||
print( 'a(nil.x=5)', a(function() n.x=5 end) )
|
||||
print( 'a(a.x=5) ', a(function() a.x=5 end) )
|
||||
print( 'a(s.x=5) ', a(function() s.x=5 end) )
|
||||
print( 'a(true.x=5)', a(function() local b = true; b.x=5 end) )
|
||||
|
||||
-- len operator
|
||||
print( 'a(#nil) ', a(function() return #n end) )
|
||||
print( 'a(#t) ', a(function() return #t end) )
|
||||
print( 'a(#s) ', a(function() return #s end) )
|
||||
print( 'a(#a) ', a(function() return #a end) )
|
||||
print( 'a(#true)', a(function() local b = true; return #b end) )
|
||||
|
||||
-- comparison errors
|
||||
print( 'a(nil>1)', a(function() return nil>1 end) )
|
||||
print( 'a(a>1) ', a(function() return a>1 end) )
|
||||
print( 'a(s>1) ', a(function() return s>1 end) )
|
||||
print( 'a(true>1)', a(function() local b = true; return b>1 end) )
|
||||
|
||||
-- unary minus errors
|
||||
print( 'a(-nil)', a(function() return -n end) )
|
||||
print( 'a(-a) ', a(function() return -a end) )
|
||||
print( 'a(-s) ', a(function() return -s end) )
|
||||
print( 'a(-true)', a(function() local b = true; return -b end) )
|
||||
|
||||
-- string concatenation
|
||||
local function concatsuite(comparefunc)
|
||||
print( '"a".."b"', comparefunc("a","b") )
|
||||
print( '"a"..nil', comparefunc("a",nil) )
|
||||
print( 'nil.."b"', comparefunc(nil,"b") )
|
||||
print( '"a"..{}', comparefunc("a",{}) )
|
||||
print( '{}.."b"', comparefunc({},"b") )
|
||||
print( '"a"..2', comparefunc("a",2) )
|
||||
print( '2.."b"', comparefunc(2,"b") )
|
||||
print( '"a"..print', comparefunc("a",print) )
|
||||
print( 'print.."b"', comparefunc(print,"b") )
|
||||
print( '"a"..true', comparefunc("a",true) )
|
||||
print( 'true.."b"', comparefunc(true,"b") )
|
||||
print( 'nil..true', comparefunc(nil,true) )
|
||||
print( '"a"..3.5', comparefunc("a",3.5) )
|
||||
print( '3.5.."b"', comparefunc(3.5,"b") )
|
||||
end
|
||||
local function strconcat(a,b)
|
||||
return (pcall( function() return a..b end) )
|
||||
end
|
||||
local function tblconcat(a,b)
|
||||
local t={a,b}
|
||||
return (pcall( function() return table.concat(t,'-',1,2) end ))
|
||||
end
|
||||
|
||||
print( '-------- string concatenation' )
|
||||
concatsuite(strconcat)
|
||||
print( '-------- table concatenation' )
|
||||
concatsuite(tblconcat)
|
||||
|
||||
-- pairs
|
||||
print( '-------- pairs tests' )
|
||||
print( 'a(pairs(nil))', a(function() return pairs(nil,{}) end) )
|
||||
print( 'a(pairs(a)) ', a(function() return pairs(a,{}) end) )
|
||||
print( 'a(pairs(s)) ', a(function() return pairs(s,{}) end) )
|
||||
print( 'a(pairs(t)) ', a(function() return pairs(t,{}) end) )
|
||||
print( 'a(pairs(true))', a(function() local b = true; return pairs(b,{}) end) )
|
||||
|
||||
-- setmetatable
|
||||
print( '-------- setmetatable tests' )
|
||||
function sm(...)
|
||||
return tostring(setmetatable(...))
|
||||
end
|
||||
print( 'a(setmetatable(nil))', a(function() return sm(nil,{}) end) )
|
||||
print( 'a(setmetatable(a)) ', a(function() return sm(a,{}) end) )
|
||||
print( 'a(setmetatable(s)) ', a(function() return sm(s,{}) end) )
|
||||
print( 'a(setmetatable(true))', a(function() local b = true; return sm(b,{}) end) )
|
||||
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
|
||||
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
|
||||
print( 'a(setmetatable(t*)) ', a(function() return sm(t,{__metatable={}}) end) )
|
||||
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
|
||||
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
|
||||
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
|
||||
t = {}
|
||||
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
|
||||
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
|
||||
print( 'a(setmetatable(t*)) ', a(function() return sm(t,{__metatable='some string'}) end) )
|
||||
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
|
||||
print( 'a(setmetatable(t)) ', a(function() return sm(t,{}) end) )
|
||||
print( 'a(getmetatable(t)) ', a(function() return getmetatable(t),type(getmetatable(t)) end) )
|
||||
print( 'a(setmetatable(t,nil)) ', a(function() return sm(t,nil) end) )
|
||||
print( 'a(setmetatable(t)) ', a(function() return sm(t) end) )
|
||||
print( 'a(setmetatable({},"abc")) ', a(function() return sm({},'abc') end) )
|
||||
|
||||
-- bad args to error!
|
||||
print( 'error("msg","arg")', a(function() error('some message', 'some bad arg') end) )
|
||||
|
||||
-- loadfile, dofile on missing files
|
||||
print( 'loadfile("bogus.txt")', a(function() return loadfile("bogus.txt") end) )
|
||||
print( 'dofile("bogus.txt")', a(function() return dofile("bogus.txt") end) )
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user