diff --git a/luaj-test/src/test/resources/baselib.lua b/luaj-test/src/test/resources/compatibility/baselib.lua similarity index 100% rename from luaj-test/src/test/resources/baselib.lua rename to luaj-test/src/test/resources/compatibility/baselib.lua diff --git a/luaj-test/src/test/resources/compatibility/baselib.out b/luaj-test/src/test/resources/compatibility/baselib.out new file mode 100644 index 00000000..c3b5c1da --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/baselib.out @@ -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 diff --git a/luaj-test/src/test/resources/coroutinelib.lua b/luaj-test/src/test/resources/compatibility/coroutinelib.lua similarity index 100% rename from luaj-test/src/test/resources/coroutinelib.lua rename to luaj-test/src/test/resources/compatibility/coroutinelib.lua diff --git a/luaj-test/src/test/resources/compatibility/coroutinelib.out b/luaj-test/src/test/resources/compatibility/coroutinelib.out new file mode 100644 index 00000000..7fff9194 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/coroutinelib.out @@ -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 diff --git a/luaj-test/src/test/resources/debuglib.lua b/luaj-test/src/test/resources/compatibility/debuglib.lua similarity index 100% rename from luaj-test/src/test/resources/debuglib.lua rename to luaj-test/src/test/resources/compatibility/debuglib.lua diff --git a/luaj-test/src/test/resources/compatibility/debuglib.out b/luaj-test/src/test/resources/compatibility/debuglib.out new file mode 100644 index 00000000..663fe0be --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/debuglib.out @@ -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 + [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 + [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 diff --git a/luaj-test/src/test/resources/errors.lua b/luaj-test/src/test/resources/compatibility/errors.lua similarity index 100% rename from luaj-test/src/test/resources/errors.lua rename to luaj-test/src/test/resources/compatibility/errors.lua diff --git a/luaj-test/src/test/resources/compatibility/errors.out b/luaj-test/src/test/resources/compatibility/errors.out new file mode 100644 index 00000000..cc674319 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/errors.out @@ -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 diff --git a/luaj-test/src/test/resources/functions.lua b/luaj-test/src/test/resources/compatibility/functions.lua similarity index 100% rename from luaj-test/src/test/resources/functions.lua rename to luaj-test/src/test/resources/compatibility/functions.lua diff --git a/luaj-test/src/test/resources/compatibility/functions.out b/luaj-test/src/test/resources/compatibility/functions.out new file mode 100644 index 00000000..cdffa68a --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/functions.out @@ -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 diff --git a/luaj-test/src/test/resources/iolib.lua b/luaj-test/src/test/resources/compatibility/iolib.lua similarity index 100% rename from luaj-test/src/test/resources/iolib.lua rename to luaj-test/src/test/resources/compatibility/iolib.lua diff --git a/luaj-test/src/test/resources/compatibility/iolib.out b/luaj-test/src/test/resources/compatibility/iolib.out new file mode 100644 index 00000000..a7b175be --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/iolib.out @@ -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 diff --git a/luaj-test/src/test/resources/compatibility/luajit/debuglib.out b/luaj-test/src/test/resources/compatibility/luajit/debuglib.out new file mode 100644 index 00000000..e03e8d18 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/luajit/debuglib.out @@ -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 + [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 + [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 diff --git a/luaj-test/src/test/resources/manyupvals.lua b/luaj-test/src/test/resources/compatibility/manyupvals.lua similarity index 100% rename from luaj-test/src/test/resources/manyupvals.lua rename to luaj-test/src/test/resources/compatibility/manyupvals.lua diff --git a/luaj-test/src/test/resources/compatibility/manyupvals.out b/luaj-test/src/test/resources/compatibility/manyupvals.out new file mode 100644 index 00000000..391387a3 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/manyupvals.out @@ -0,0 +1,1981 @@ + local f1 + f1 = function() return 1 end + local f2 + f2 = function() return 1 end + local f3 + do + local result + function f3() + if not result then + result = f1() + f2() + end + return result + end + end + local f4 + do + local result + function f4() + if not result then + result = f2() + f3() + end + return result + end + end + local f5 + do + local result + function f5() + if not result then + result = f3() + f4() + end + return result + end + end + local f6 + do + local result + function f6() + if not result then + result = f4() + f5() + end + return result + end + end + local f7 + do + local result + function f7() + if not result then + result = f5() + f6() + end + return result + end + end + local f8 + do + local result + function f8() + if not result then + result = f6() + f7() + end + return result + end + end + local f9 + do + local result + function f9() + if not result then + result = f7() + f8() + end + return result + end + end + local f10 + do + local result + function f10() + if not result then + result = f8() + f9() + end + return result + end + end + local f11 + do + local result + function f11() + if not result then + result = f9() + f10() + end + return result + end + end + local f12 + do + local result + function f12() + if not result then + result = f10() + f11() + end + return result + end + end + local f13 + do + local result + function f13() + if not result then + result = f11() + f12() + end + return result + end + end + local f14 + do + local result + function f14() + if not result then + result = f12() + f13() + end + return result + end + end + local f15 + do + local result + function f15() + if not result then + result = f13() + f14() + end + return result + end + end + local f16 + do + local result + function f16() + if not result then + result = f14() + f15() + end + return result + end + end + local f17 + do + local result + function f17() + if not result then + result = f15() + f16() + end + return result + end + end + local f18 + do + local result + function f18() + if not result then + result = f16() + f17() + end + return result + end + end + local f19 + do + local result + function f19() + if not result then + result = f17() + f18() + end + return result + end + end + local f20 + do + local result + function f20() + if not result then + result = f18() + f19() + end + return result + end + end + local f21 + do + local result + function f21() + if not result then + result = f19() + f20() + end + return result + end + end + local f22 + do + local result + function f22() + if not result then + result = f20() + f21() + end + return result + end + end + local f23 + do + local result + function f23() + if not result then + result = f21() + f22() + end + return result + end + end + local f24 + do + local result + function f24() + if not result then + result = f22() + f23() + end + return result + end + end + local f25 + do + local result + function f25() + if not result then + result = f23() + f24() + end + return result + end + end + local f26 + do + local result + function f26() + if not result then + result = f24() + f25() + end + return result + end + end + local f27 + do + local result + function f27() + if not result then + result = f25() + f26() + end + return result + end + end + local f28 + do + local result + function f28() + if not result then + result = f26() + f27() + end + return result + end + end + local f29 + do + local result + function f29() + if not result then + result = f27() + f28() + end + return result + end + end + local f30 + do + local result + function f30() + if not result then + result = f28() + f29() + end + return result + end + end + local f31 + do + local result + function f31() + if not result then + result = f29() + f30() + end + return result + end + end + local f32 + do + local result + function f32() + if not result then + result = f30() + f31() + end + return result + end + end + local f33 + do + local result + function f33() + if not result then + result = f31() + f32() + end + return result + end + end + local f34 + do + local result + function f34() + if not result then + result = f32() + f33() + end + return result + end + end + local f35 + do + local result + function f35() + if not result then + result = f33() + f34() + end + return result + end + end + local f36 + do + local result + function f36() + if not result then + result = f34() + f35() + end + return result + end + end + local f37 + do + local result + function f37() + if not result then + result = f35() + f36() + end + return result + end + end + local f38 + do + local result + function f38() + if not result then + result = f36() + f37() + end + return result + end + end + local f39 + do + local result + function f39() + if not result then + result = f37() + f38() + end + return result + end + end + local f40 + do + local result + function f40() + if not result then + result = f38() + f39() + end + return result + end + end + local f41 + do + local result + function f41() + if not result then + result = f39() + f40() + end + return result + end + end + local f42 + do + local result + function f42() + if not result then + result = f40() + f41() + end + return result + end + end + local f43 + do + local result + function f43() + if not result then + result = f41() + f42() + end + return result + end + end + local f44 + do + local result + function f44() + if not result then + result = f42() + f43() + end + return result + end + end + local f45 + do + local result + function f45() + if not result then + result = f43() + f44() + end + return result + end + end + local f46 + do + local result + function f46() + if not result then + result = f44() + f45() + end + return result + end + end + local f47 + do + local result + function f47() + if not result then + result = f45() + f46() + end + return result + end + end + local f48 + do + local result + function f48() + if not result then + result = f46() + f47() + end + return result + end + end + local f49 + do + local result + function f49() + if not result then + result = f47() + f48() + end + return result + end + end + local f50 + do + local result + function f50() + if not result then + result = f48() + f49() + end + return result + end + end + local f51 + do + local result + function f51() + if not result then + result = f49() + f50() + end + return result + end + end + local f52 + do + local result + function f52() + if not result then + result = f50() + f51() + end + return result + end + end + local f53 + do + local result + function f53() + if not result then + result = f51() + f52() + end + return result + end + end + local f54 + do + local result + function f54() + if not result then + result = f52() + f53() + end + return result + end + end + local f55 + do + local result + function f55() + if not result then + result = f53() + f54() + end + return result + end + end + local f56 + do + local result + function f56() + if not result then + result = f54() + f55() + end + return result + end + end + local f57 + do + local result + function f57() + if not result then + result = f55() + f56() + end + return result + end + end + local f58 + do + local result + function f58() + if not result then + result = f56() + f57() + end + return result + end + end + local f59 + do + local result + function f59() + if not result then + result = f57() + f58() + end + return result + end + end + local f60 + do + local result + function f60() + if not result then + result = f58() + f59() + end + return result + end + end + local f61 + do + local result + function f61() + if not result then + result = f59() + f60() + end + return result + end + end + local f62 + do + local result + function f62() + if not result then + result = f60() + f61() + end + return result + end + end + local f63 + do + local result + function f63() + if not result then + result = f61() + f62() + end + return result + end + end + local f64 + do + local result + function f64() + if not result then + result = f62() + f63() + end + return result + end + end + local f65 + do + local result + function f65() + if not result then + result = f63() + f64() + end + return result + end + end + local f66 + do + local result + function f66() + if not result then + result = f64() + f65() + end + return result + end + end + local f67 + do + local result + function f67() + if not result then + result = f65() + f66() + end + return result + end + end + local f68 + do + local result + function f68() + if not result then + result = f66() + f67() + end + return result + end + end + local f69 + do + local result + function f69() + if not result then + result = f67() + f68() + end + return result + end + end + local f70 + do + local result + function f70() + if not result then + result = f68() + f69() + end + return result + end + end + local f71 + do + local result + function f71() + if not result then + result = f69() + f70() + end + return result + end + end + local f72 + do + local result + function f72() + if not result then + result = f70() + f71() + end + return result + end + end + local f73 + do + local result + function f73() + if not result then + result = f71() + f72() + end + return result + end + end + local f74 + do + local result + function f74() + if not result then + result = f72() + f73() + end + return result + end + end + local f75 + do + local result + function f75() + if not result then + result = f73() + f74() + end + return result + end + end + local f76 + do + local result + function f76() + if not result then + result = f74() + f75() + end + return result + end + end + local f77 + do + local result + function f77() + if not result then + result = f75() + f76() + end + return result + end + end + local f78 + do + local result + function f78() + if not result then + result = f76() + f77() + end + return result + end + end + local f79 + do + local result + function f79() + if not result then + result = f77() + f78() + end + return result + end + end + local f80 + do + local result + function f80() + if not result then + result = f78() + f79() + end + return result + end + end + local f81 + do + local result + function f81() + if not result then + result = f79() + f80() + end + return result + end + end + local f82 + do + local result + function f82() + if not result then + result = f80() + f81() + end + return result + end + end + local f83 + do + local result + function f83() + if not result then + result = f81() + f82() + end + return result + end + end + local f84 + do + local result + function f84() + if not result then + result = f82() + f83() + end + return result + end + end + local f85 + do + local result + function f85() + if not result then + result = f83() + f84() + end + return result + end + end + local f86 + do + local result + function f86() + if not result then + result = f84() + f85() + end + return result + end + end + local f87 + do + local result + function f87() + if not result then + result = f85() + f86() + end + return result + end + end + local f88 + do + local result + function f88() + if not result then + result = f86() + f87() + end + return result + end + end + local f89 + do + local result + function f89() + if not result then + result = f87() + f88() + end + return result + end + end + local f90 + do + local result + function f90() + if not result then + result = f88() + f89() + end + return result + end + end + local f91 + do + local result + function f91() + if not result then + result = f89() + f90() + end + return result + end + end + local f92 + do + local result + function f92() + if not result then + result = f90() + f91() + end + return result + end + end + local f93 + do + local result + function f93() + if not result then + result = f91() + f92() + end + return result + end + end + local f94 + do + local result + function f94() + if not result then + result = f92() + f93() + end + return result + end + end + local f95 + do + local result + function f95() + if not result then + result = f93() + f94() + end + return result + end + end + local f96 + do + local result + function f96() + if not result then + result = f94() + f95() + end + return result + end + end + local f97 + do + local result + function f97() + if not result then + result = f95() + f96() + end + return result + end + end + local f98 + do + local result + function f98() + if not result then + result = f96() + f97() + end + return result + end + end + local f99 + do + local result + function f99() + if not result then + result = f97() + f98() + end + return result + end + end + local f100 + do + local result + function f100() + if not result then + result = f98() + f99() + end + return result + end + end + local f101 + do + local result + function f101() + if not result then + result = f99() + f100() + end + return result + end + end + local f102 + do + local result + function f102() + if not result then + result = f100() + f101() + end + return result + end + end + local f103 + do + local result + function f103() + if not result then + result = f101() + f102() + end + return result + end + end + local f104 + do + local result + function f104() + if not result then + result = f102() + f103() + end + return result + end + end + local f105 + do + local result + function f105() + if not result then + result = f103() + f104() + end + return result + end + end + local f106 + do + local result + function f106() + if not result then + result = f104() + f105() + end + return result + end + end + local f107 + do + local result + function f107() + if not result then + result = f105() + f106() + end + return result + end + end + local f108 + do + local result + function f108() + if not result then + result = f106() + f107() + end + return result + end + end + local f109 + do + local result + function f109() + if not result then + result = f107() + f108() + end + return result + end + end + local f110 + do + local result + function f110() + if not result then + result = f108() + f109() + end + return result + end + end + local f111 + do + local result + function f111() + if not result then + result = f109() + f110() + end + return result + end + end + local f112 + do + local result + function f112() + if not result then + result = f110() + f111() + end + return result + end + end + local f113 + do + local result + function f113() + if not result then + result = f111() + f112() + end + return result + end + end + local f114 + do + local result + function f114() + if not result then + result = f112() + f113() + end + return result + end + end + local f115 + do + local result + function f115() + if not result then + result = f113() + f114() + end + return result + end + end + local f116 + do + local result + function f116() + if not result then + result = f114() + f115() + end + return result + end + end + local f117 + do + local result + function f117() + if not result then + result = f115() + f116() + end + return result + end + end + local f118 + do + local result + function f118() + if not result then + result = f116() + f117() + end + return result + end + end + local f119 + do + local result + function f119() + if not result then + result = f117() + f118() + end + return result + end + end + local f120 + do + local result + function f120() + if not result then + result = f118() + f119() + end + return result + end + end + local f121 + do + local result + function f121() + if not result then + result = f119() + f120() + end + return result + end + end + local f122 + do + local result + function f122() + if not result then + result = f120() + f121() + end + return result + end + end + local f123 + do + local result + function f123() + if not result then + result = f121() + f122() + end + return result + end + end + local f124 + do + local result + function f124() + if not result then + result = f122() + f123() + end + return result + end + end + local f125 + do + local result + function f125() + if not result then + result = f123() + f124() + end + return result + end + end + local f126 + do + local result + function f126() + if not result then + result = f124() + f125() + end + return result + end + end + local f127 + do + local result + function f127() + if not result then + result = f125() + f126() + end + return result + end + end + local f128 + do + local result + function f128() + if not result then + result = f126() + f127() + end + return result + end + end + local f129 + do + local result + function f129() + if not result then + result = f127() + f128() + end + return result + end + end + local f130 + do + local result + function f130() + if not result then + result = f128() + f129() + end + return result + end + end + local f131 + do + local result + function f131() + if not result then + result = f129() + f130() + end + return result + end + end + local f132 + do + local result + function f132() + if not result then + result = f130() + f131() + end + return result + end + end + local f133 + do + local result + function f133() + if not result then + result = f131() + f132() + end + return result + end + end + local f134 + do + local result + function f134() + if not result then + result = f132() + f133() + end + return result + end + end + local f135 + do + local result + function f135() + if not result then + result = f133() + f134() + end + return result + end + end + local f136 + do + local result + function f136() + if not result then + result = f134() + f135() + end + return result + end + end + local f137 + do + local result + function f137() + if not result then + result = f135() + f136() + end + return result + end + end + local f138 + do + local result + function f138() + if not result then + result = f136() + f137() + end + return result + end + end + local f139 + do + local result + function f139() + if not result then + result = f137() + f138() + end + return result + end + end + local f140 + do + local result + function f140() + if not result then + result = f138() + f139() + end + return result + end + end + local f141 + do + local result + function f141() + if not result then + result = f139() + f140() + end + return result + end + end + local f142 + do + local result + function f142() + if not result then + result = f140() + f141() + end + return result + end + end + local f143 + do + local result + function f143() + if not result then + result = f141() + f142() + end + return result + end + end + local f144 + do + local result + function f144() + if not result then + result = f142() + f143() + end + return result + end + end + local f145 + do + local result + function f145() + if not result then + result = f143() + f144() + end + return result + end + end + local f146 + do + local result + function f146() + if not result then + result = f144() + f145() + end + return result + end + end + local f147 + do + local result + function f147() + if not result then + result = f145() + f146() + end + return result + end + end + local f148 + do + local result + function f148() + if not result then + result = f146() + f147() + end + return result + end + end + local f149 + do + local result + function f149() + if not result then + result = f147() + f148() + end + return result + end + end + local f150 + do + local result + function f150() + if not result then + result = f148() + f149() + end + return result + end + end + local f151 + do + local result + function f151() + if not result then + result = f149() + f150() + end + return result + end + end + local f152 + do + local result + function f152() + if not result then + result = f150() + f151() + end + return result + end + end + local f153 + do + local result + function f153() + if not result then + result = f151() + f152() + end + return result + end + end + local f154 + do + local result + function f154() + if not result then + result = f152() + f153() + end + return result + end + end + local f155 + do + local result + function f155() + if not result then + result = f153() + f154() + end + return result + end + end + local f156 + do + local result + function f156() + if not result then + result = f154() + f155() + end + return result + end + end + local f157 + do + local result + function f157() + if not result then + result = f155() + f156() + end + return result + end + end + local f158 + do + local result + function f158() + if not result then + result = f156() + f157() + end + return result + end + end + local f159 + do + local result + function f159() + if not result then + result = f157() + f158() + end + return result + end + end + local f160 + do + local result + function f160() + if not result then + result = f158() + f159() + end + return result + end + end + local f161 + do + local result + function f161() + if not result then + result = f159() + f160() + end + return result + end + end + local f162 + do + local result + function f162() + if not result then + result = f160() + f161() + end + return result + end + end + local f163 + do + local result + function f163() + if not result then + result = f161() + f162() + end + return result + end + end + local f164 + do + local result + function f164() + if not result then + result = f162() + f163() + end + return result + end + end + local f165 + do + local result + function f165() + if not result then + result = f163() + f164() + end + return result + end + end + local f166 + do + local result + function f166() + if not result then + result = f164() + f165() + end + return result + end + end + local f167 + do + local result + function f167() + if not result then + result = f165() + f166() + end + return result + end + end + local f168 + do + local result + function f168() + if not result then + result = f166() + f167() + end + return result + end + end + local f169 + do + local result + function f169() + if not result then + result = f167() + f168() + end + return result + end + end + local f170 + do + local result + function f170() + if not result then + result = f168() + f169() + end + return result + end + end + local f171 + do + local result + function f171() + if not result then + result = f169() + f170() + end + return result + end + end + local f172 + do + local result + function f172() + if not result then + result = f170() + f171() + end + return result + end + end + local f173 + do + local result + function f173() + if not result then + result = f171() + f172() + end + return result + end + end + local f174 + do + local result + function f174() + if not result then + result = f172() + f173() + end + return result + end + end + local f175 + do + local result + function f175() + if not result then + result = f173() + f174() + end + return result + end + end + local f176 + do + local result + function f176() + if not result then + result = f174() + f175() + end + return result + end + end + local f177 + do + local result + function f177() + if not result then + result = f175() + f176() + end + return result + end + end + local f178 + do + local result + function f178() + if not result then + result = f176() + f177() + end + return result + end + end + local f179 + do + local result + function f179() + if not result then + result = f177() + f178() + end + return result + end + end + local f180 + do + local result + function f180() + if not result then + result = f178() + f179() + end + return result + end + end + local f181 + do + local result + function f181() + if not result then + result = f179() + f180() + end + return result + end + end + local f182 + do + local result + function f182() + if not result then + result = f180() + f181() + end + return result + end + end + local f183 + do + local result + function f183() + if not result then + result = f181() + f182() + end + return result + end + end + local f184 + do + local result + function f184() + if not result then + result = f182() + f183() + end + return result + end + end + local f185 + do + local result + function f185() + if not result then + result = f183() + f184() + end + return result + end + end + local f186 + do + local result + function f186() + if not result then + result = f184() + f185() + end + return result + end + end + local f187 + do + local result + function f187() + if not result then + result = f185() + f186() + end + return result + end + end + local f188 + do + local result + function f188() + if not result then + result = f186() + f187() + end + return result + end + end + local f189 + do + local result + function f189() + if not result then + result = f187() + f188() + end + return result + end + end + local f190 + do + local result + function f190() + if not result then + result = f188() + f189() + end + return result + end + end + local f191 + do + local result + function f191() + if not result then + result = f189() + f190() + end + return result + end + end + local f192 + do + local result + function f192() + if not result then + result = f190() + f191() + end + return result + end + end + local f193 + do + local result + function f193() + if not result then + result = f191() + f192() + end + return result + end + end + local f194 + do + local result + function f194() + if not result then + result = f192() + f193() + end + return result + end + end + local f195 + do + local result + function f195() + if not result then + result = f193() + f194() + end + return result + end + end + local f196 + do + local result + function f196() + if not result then + result = f194() + f195() + end + return result + end + end + local f197 + do + local result + function f197() + if not result then + result = f195() + f196() + end + return result + end + end + local f198 + do + local result + function f198() + if not result then + result = f196() + f197() + end + return result + end + end + local f199 + do + local result + function f199() + if not result then + result = f197() + f198() + end + return result + end + end + print("5th fibonacci number is", f5()) + print("10th fibonacci number is", f10()) + print("199th fibonacci number is", f199()) + +5th fibonacci number is 5 +10th fibonacci number is 55 +199th fibonacci number is 1.734025211728e+41 diff --git a/luaj-test/src/test/resources/mathlib.lua b/luaj-test/src/test/resources/compatibility/mathlib.lua similarity index 100% rename from luaj-test/src/test/resources/mathlib.lua rename to luaj-test/src/test/resources/compatibility/mathlib.lua diff --git a/luaj-test/src/test/resources/compatibility/mathlib.out b/luaj-test/src/test/resources/compatibility/mathlib.out new file mode 100644 index 00000000..b3fb3be1 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/mathlib.out @@ -0,0 +1,842 @@ +---------- miscellaneous tests ---------- +math.sin( 0.0 ) true +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 +math.pi true 3.1415 +---------- unary operator - ---------- +--2.5 true +--2 true +-0 true +-2 true -2 +-2.5 true -2.5 +-'-2.5' true 2.5 +-'-2' true 2 +-'0' true +-'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 +'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 +2.75-2.75 true +'2.75'-'2.75' true +3-'3' true +'3'-3 true +2.75-'2.75' true +'2.75'-2.75 true +-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 +-2.5*0 true +2*1 true 2 +5*2 true 10 +-5*2 true -10 +16*2 true 32 +-16*-2 true 32 +0.5*0 true +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 +2.25*2 true 4.5 +-2*0 true +3*3 true 9 +'2'*'0' true +'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 +'-2.5'^'-1.5' true +'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 +'-2.75'^1.75 true +4.75^'-2.75' true 0.0137 +'2.75'^-1.75 true 0.1702 +---------- binary operator / ---------- +2/0 true +-2.5/0 true +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 +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 +2.25/2 true 1.125 +-2/0 true +3/3 true 1 +'2'/'0' true +'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 +-2.5%0 true +2%1 true +5%2 true 1 +-5%2 true 1 +16%2 true +-16%-2 true +0.5%0 true +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 +2.25%2 true 0.25 +-2%0 true +3%3 true +'2'%'0' true +'2.5'%'3' true 2.5 +'-2'%'1.5' true 1 +'-2.5'%'-1.5' true -1 +'3.0'%'3.0' true +2.75%2.75 true +'2.75'%'2.75' true +3%'3' true +'3'%3 true +2.75%'2.75' true +'2.75'%2.75 true +-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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +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 +math.modf(0) true +math.modf(2) true 2 +math.modf(2.5) true 2 0.5 +math.modf('-2.5') true -2 -0.5 +math.modf('-2') true -2 +math.modf('0') true +math.modf('2') true 2 +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 +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 +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 +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 +math.sin('2') true 0.9092 +math.sin('2.5') true 0.5984 +---------- math.sqrt ---------- +math.sqrt(-2.5) true +math.sqrt(-2) true +math.sqrt(0) true +math.sqrt(2) true 1.4142 +math.sqrt(2.5) true 1.5811 +math.sqrt('-2.5') true +math.sqrt('-2') true +math.sqrt('0') true +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 +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 +math.tan('2') true -2.185 +math.tan('2.5') true -0.747 +---------- math.acos (jse only) ---------- +math.acos(-2.5) true +math.acos(-2) true +math.acos(0) true 1.5707 +math.acos(2) true +math.acos(2.5) true +math.acos('-2.5') true +math.acos('-2') true +math.acos('0') true 1.5707 +math.acos('2') true +math.acos('2.5') true +---------- math.asin (jse only) ---------- +math.asin(-2.5) true +math.asin(-2) true +math.asin(0) true +math.asin(2) true +math.asin(2.5) true +math.asin('-2.5') true +math.asin('-2') true +math.asin('0') true +math.asin('2') true +math.asin('2.5') true +---------- math.atan (jse only) ---------- +math.atan(-2.5) true -1.190 +math.atan(-2) true -1.107 +math.atan(0) true +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 +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 +math.log(-2) true +math.log(0) true +math.log(2) true 0.6931 +math.log(2.5) true 0.9162 +math.log('-2.5') true +math.log('-2') true +math.log('0') true +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 +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 +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 +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 +math.tanh('2') true 0.9640 +math.tanh('2.5') true 0.9866 +---------- math.fmod ---------- +math.fmod(2,0) true +math.fmod(-2.5,0) true +math.fmod(2,1) true +math.fmod(5,2) true 1 +math.fmod(-5,2) true -1 +math.fmod(16,2) true +math.fmod(-16,-2) true +math.fmod(0.5,0) true +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 +math.fmod(2.25,2) true 0.25 +math.fmod(-2,0) true +math.fmod(3,3) true +math.fmod('2','0') true +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 +math.fmod(2.75,2.75) true +math.fmod('2.75','2.75') true +math.fmod(3,'3') true +math.fmod('3',3) true +math.fmod(2.75,'2.75') true +math.fmod('2.75',2.75) true +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 +math.pow('-2.5','-1.5') true +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 +math.pow('-2.75',1.75) true +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 +mz == z true +a[z] == 1 and a[mz] == 1 true diff --git a/luaj-test/src/test/resources/metatags.lua b/luaj-test/src/test/resources/compatibility/metatags.lua similarity index 100% rename from luaj-test/src/test/resources/metatags.lua rename to luaj-test/src/test/resources/compatibility/metatags.lua diff --git a/luaj-test/src/test/resources/compatibility/metatags.out b/luaj-test/src/test/resources/compatibility/metatags.out new file mode 100644 index 00000000..694cb7eb --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/metatags.out @@ -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 diff --git a/luaj-test/src/test/resources/oslib.lua b/luaj-test/src/test/resources/compatibility/oslib.lua similarity index 100% rename from luaj-test/src/test/resources/oslib.lua rename to luaj-test/src/test/resources/compatibility/oslib.lua diff --git a/luaj-test/src/test/resources/compatibility/oslib.out b/luaj-test/src/test/resources/compatibility/oslib.out new file mode 100644 index 00000000..5148663e --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/oslib.out @@ -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 diff --git a/luaj-test/src/test/resources/stringlib.lua b/luaj-test/src/test/resources/compatibility/stringlib.lua similarity index 100% rename from luaj-test/src/test/resources/stringlib.lua rename to luaj-test/src/test/resources/compatibility/stringlib.lua diff --git a/luaj-test/src/test/resources/compatibility/stringlib.out b/luaj-test/src/test/resources/compatibility/stringlib.out new file mode 100644 index 00000000..7ebe326d Binary files /dev/null and b/luaj-test/src/test/resources/compatibility/stringlib.out differ diff --git a/luaj-test/src/test/resources/tablelib.lua b/luaj-test/src/test/resources/compatibility/tablelib.lua similarity index 100% rename from luaj-test/src/test/resources/tablelib.lua rename to luaj-test/src/test/resources/compatibility/tablelib.lua diff --git a/luaj-test/src/test/resources/compatibility/tablelib.out b/luaj-test/src/test/resources/compatibility/tablelib.out new file mode 100644 index 00000000..4f49801c --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/tablelib.out @@ -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 diff --git a/luaj-test/src/test/resources/tailcalls.lua b/luaj-test/src/test/resources/compatibility/tailcalls.lua similarity index 100% rename from luaj-test/src/test/resources/tailcalls.lua rename to luaj-test/src/test/resources/compatibility/tailcalls.lua diff --git a/luaj-test/src/test/resources/compatibility/tailcalls.out b/luaj-test/src/test/resources/compatibility/tailcalls.out new file mode 100644 index 00000000..3f30692c --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/tailcalls.out @@ -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 diff --git a/luaj-test/src/test/resources/upvalues.lua b/luaj-test/src/test/resources/compatibility/upvalues.lua similarity index 100% rename from luaj-test/src/test/resources/upvalues.lua rename to luaj-test/src/test/resources/compatibility/upvalues.lua diff --git a/luaj-test/src/test/resources/compatibility/upvalues.out b/luaj-test/src/test/resources/compatibility/upvalues.out new file mode 100644 index 00000000..c9260f54 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/upvalues.out @@ -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 diff --git a/luaj-test/src/test/resources/vm.lua b/luaj-test/src/test/resources/compatibility/vm.lua similarity index 100% rename from luaj-test/src/test/resources/vm.lua rename to luaj-test/src/test/resources/compatibility/vm.lua diff --git a/luaj-test/src/test/resources/compatibility/vm.out b/luaj-test/src/test/resources/compatibility/vm.out new file mode 100644 index 00000000..79f74754 --- /dev/null +++ b/luaj-test/src/test/resources/compatibility/vm.out @@ -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 diff --git a/luaj-test/src/test/resources/errors/abc.txt b/luaj-test/src/test/resources/errors/args.out similarity index 100% rename from luaj-test/src/test/resources/errors/abc.txt rename to luaj-test/src/test/resources/errors/args.out diff --git a/luaj-test/src/test/resources/errors/baselibargs.out b/luaj-test/src/test/resources/errors/baselibargs.out new file mode 100644 index 00000000..102fe749 --- /dev/null +++ b/luaj-test/src/test/resources/errors/baselibargs.out @@ -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,) true,
+- assert(123,
) 123,
+- assert(true,) true, +- assert(123,) 123, +- assert(true,) true, +- assert(123,) 123, +--- 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(
) ...string expected... +- collectgarbage() ...string expected... +- collectgarbage() ...string expected... +====== dofile ====== +====== error ====== +====== getmetatable ====== +--- checkallpass +- getmetatable('abc')
+- getmetatable(1.25) +- getmetatable(true) +- getmetatable(
) +- getmetatable() +- getmetatable() +--- checkallerrors +- getmetatable() ...bad argument... +====== ipairs ====== +--- checkallpass +- ipairs(
) ,
,0 +--- checkallerrors +- ipairs(nil) ...bad argument... +- ipairs('abc') ...bad argument... +- ipairs(1.25) ...bad argument... +- ipairs(true) ...bad argument... +- ipairs() ...bad argument... +- ipairs() ...bad argument... +====== load ====== +--- checkallpass +- load(,nil) +- load(,'abc') +--- checkallerrors +- load(nil,nil) ...bad argument... +needcheck load('abc',nil) nil +needcheck load(1.25,nil) nil +- load(true,nil) ...bad argument... +- load(
,nil) ...bad argument... +- load(,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(
,'abc') ...bad argument... +- load(,'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(
,1.25) ...bad argument... +- load(,1.25) ...bad argument... +--- checkallerrors +- load(,) ...bad argument... +- load(,
) ...bad argument... +====== loadfile ====== +====== load ====== +--- checkallpass +- load('return') +--- checkallpass +- load('return','mychunk') +--- checkallpass +- load('return a ... b','mychunk') nil,string +--- checkallerrors +- load(nil,nil) ...bad argument... +- load(true,nil) ...bad argument... +- load(
,nil) ...bad argument... +needcheck load(,nil) function: 0x10011ba00 +- load(,nil) ...bad argument... +- load(nil,'abc') ...bad argument... +- load(true,'abc') ...bad argument... +- load(
,'abc') ...bad argument... +needcheck load(,'abc') function: 0x10011c780 +- load(,'abc') ...bad argument... +- load(nil,1.25) ...bad argument... +- load(true,1.25) ...bad argument... +- load(
,1.25) ...bad argument... +needcheck load(,1.25) function: 0x10011d560 +- load(,1.25) ...bad argument... +--- checkallerrors +- load('return',) ...bad argument... +- load('return',
) ...bad argument... +====== next ====== +--- checkallpass +- next(
,'aa') +--- checkallerrors +- next(nil,nil) ...bad argument... +- next('abc',nil) ...bad argument... +- next(1.25,nil) ...bad argument... +- next(true,nil) ...bad argument... +- next(,nil) ...bad argument... +- next(,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(,1) ...bad argument... +- next(,1) ...bad argument... +--- checkallerrors +- next(
,'abc') ...invalid key... +- next(
,1.25) ...invalid key... +- next(
,true) ...invalid key... +- next(
,
) ...invalid key... +- next(
,) ...invalid key... +====== pairs ====== +--- checkallpass +- pairs(
) ,
+--- checkallerrors +- pairs(nil) ...bad argument... +- pairs('abc') ...bad argument... +- pairs(1.25) ...bad argument... +- pairs(true) ...bad argument... +- pairs() ...bad argument... +- pairs() ...bad argument... +====== pcall ====== +--- checkallpass +- pcall('abc',nil) boolean,string +- pcall(1.25,nil) boolean,string +- pcall(true,nil) boolean,string +- pcall(
,nil) boolean,string +- pcall(,nil) boolean +- pcall(,nil) boolean,string +- pcall('abc','abc') boolean,string +- pcall(1.25,'abc') boolean,string +- pcall(true,'abc') boolean,string +- pcall(
,'abc') boolean,string +- pcall(,'abc') boolean +- pcall(,'abc') boolean,string +- pcall('abc',1.25) boolean,string +- pcall(1.25,1.25) boolean,string +- pcall(true,1.25) boolean,string +- pcall(
,1.25) boolean,string +- pcall(,1.25) boolean +- pcall(,1.25) boolean,string +- pcall('abc',true) boolean,string +- pcall(1.25,true) boolean,string +- pcall(true,true) boolean,string +- pcall(
,true) boolean,string +- pcall(,true) boolean +- pcall(,true) boolean,string +- pcall('abc',
) boolean,string +- pcall(1.25,
) boolean,string +- pcall(true,
) boolean,string +- pcall(
,
) boolean,string +- pcall(,
) boolean +- pcall(,
) boolean,string +- pcall('abc',) boolean,string +- pcall(1.25,) boolean,string +- pcall(true,) boolean,string +- pcall(
,) boolean,string +- pcall(,) boolean +- pcall(,) boolean,string +- pcall('abc',) boolean,string +- pcall(1.25,) boolean,string +- pcall(true,) boolean,string +- pcall(
,) boolean,string +- pcall(,) boolean +- pcall(,) 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(
,'abc') false +- rawequal(,'abc') false +- rawequal(,'abc') false +- rawequal('abc',1.25) false +- rawequal(1.25,1.25) true +- rawequal(true,1.25) false +- rawequal(
,1.25) false +- rawequal(,1.25) false +- rawequal(,1.25) false +- rawequal('abc',true) false +- rawequal(1.25,true) false +- rawequal(true,true) true +- rawequal(
,true) false +- rawequal(,true) false +- rawequal(,true) false +- rawequal('abc',
) false +- rawequal(1.25,
) false +- rawequal(true,
) false +- rawequal(
,
) true +- rawequal(,
) false +- rawequal(,
) false +- rawequal('abc',) false +- rawequal(1.25,) false +- rawequal(true,) false +- rawequal(
,) false +- rawequal(,) true +- rawequal(,) false +- rawequal('abc',) false +- rawequal(1.25,) false +- rawequal(true,) false +- rawequal(
,) false +- rawequal(,) false +- rawequal(,) true +--- checkallerrors +- rawequal() ...bad argument... +--- checkallerrors +- rawequal('abc') ...bad argument... +- rawequal(1.25) ...bad argument... +- rawequal(true) ...bad argument... +- rawequal(
) ...bad argument... +- rawequal() ...bad argument... +- rawequal() ...bad argument... +====== rawget ====== +--- checkallpass +- rawget(
,'aa') 456 +--- checkallpass +- rawget(
,'abc') +- rawget(
,1.25) +- rawget(
,true) +- rawget(
,
) +- rawget(
,) +--- checkallerrors +--- checkallerrors +- rawget(nil,'abc') ...bad argument... +- rawget('abc','abc') ...bad argument... +- rawget(1.25,'abc') ...bad argument... +- rawget(true,'abc') ...bad argument... +- rawget(,'abc') ...bad argument... +- rawget(,'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(,1.25) ...bad argument... +- rawget(,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(,true) ...bad argument... +- rawget(,true) ...bad argument... +- rawget(nil,
) ...bad argument... +- rawget('abc',
) ...bad argument... +- rawget(1.25,
) ...bad argument... +- rawget(true,
) ...bad argument... +- rawget(,
) ...bad argument... +- rawget(,
) ...bad argument... +- rawget(nil,) ...bad argument... +- rawget('abc',) ...bad argument... +- rawget(1.25,) ...bad argument... +- rawget(true,) ...bad argument... +- rawget(,) ...bad argument... +- rawget(,) ...bad argument... +--- checkallerrors +- rawget() ...bad argument... +====== rawset ====== +--- checkallpass +- rawset(
,'aa','abc')
+- rawset(
,'aa',1.25)
+- rawset(
,'aa',true)
+- rawset(
,'aa',
)
+- rawset(
,'aa',)
+- rawset(
,'aa',)
+--- checkallpass +- rawset(
,'abc','abc')
+- rawset(
,1.25,'abc')
+- rawset(
,true,'abc')
+- rawset(
,
,'abc')
+- rawset(
,,'abc')
+- rawset(
,'abc',1.25)
+- rawset(
,1.25,1.25)
+- rawset(
,true,1.25)
+- rawset(
,
,1.25)
+- rawset(
,,1.25)
+- rawset(
,'abc',true)
+- rawset(
,1.25,true)
+- rawset(
,true,true)
+- rawset(
,
,true)
+- rawset(
,,true)
+- rawset(
,'abc',
)
+- rawset(
,1.25,
)
+- rawset(
,true,
)
+- rawset(
,
,
)
+- rawset(
,,
)
+- rawset(
,'abc',)
+- rawset(
,1.25,)
+- rawset(
,true,)
+- rawset(
,
,)
+- rawset(
,,)
+- rawset(
,'abc',)
+- rawset(
,1.25,)
+- rawset(
,true,)
+- rawset(
,
,)
+- rawset(
,,)
+--- 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(,'abc','abc') ...bad argument... +- rawset(,'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(,1.25,'abc') ...bad argument... +- rawset(,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(,'abc',1.25) ...bad argument... +- rawset(,'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(,1.25,1.25) ...bad argument... +- rawset(,1.25,1.25) ...bad argument... +--- checkallerrors +- rawset(
,'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,
)
+- select('#',
) 1 +- select(1.25,) +- select('#',) 1 +- select(1.25,) +- select('#',) 1 +--- checkallerrors +- select(nil) ...bad argument... +- select('abc') ...bad argument... +- select(true) ...bad argument... +- select(
) ...bad argument... +- select() ...bad argument... +- select() ...bad argument... +====== setmetatable ====== +--- checkallpass +- setmetatable(
,
)
+--- checkallpass +--- checkallerrors +- setmetatable(nil,
) ...bad argument... +- setmetatable('abc',
) ...bad argument... +- setmetatable(1.25,
) ...bad argument... +- setmetatable(true,
) ...bad argument... +- setmetatable(,
) ...bad argument... +- setmetatable(,
) ...bad argument... +--- checkallerrors +- setmetatable(
,'abc') ...bad argument... +- setmetatable(
,1.25) ...bad argument... +- setmetatable(
,true) ...bad argument... +- setmetatable(
,) ...bad argument... +- setmetatable(
,) ...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(
,nil) +- tonumber(,nil) +- tonumber(,nil) +- tonumber('abc',10) +- tonumber(1.25,10) +fail tonumber(true,10) 'bad argument #1 to '_G.tonumber' (string expected, got boolean)' +fail tonumber(
,10) 'bad argument #1 to '_G.tonumber' (string expected, got table)' +fail tonumber(,10) 'bad argument #1 to '_G.tonumber' (string expected, got function)' +fail tonumber(,10) 'bad argument #1 to '_G.tonumber' (string expected, got thread)' +--- checkallerrors +- tonumber(nil,2) ...bad argument... +- tonumber(,2) ...bad argument... +- tonumber(
,2) ...bad argument... +- tonumber(nil,9) ...bad argument... +- tonumber(,9) ...bad argument... +- tonumber(
,9) ...bad argument... +- tonumber(nil,11) ...bad argument... +- tonumber(,11) ...bad argument... +- tonumber(
,11) ...bad argument... +- tonumber(nil,36) ...bad argument... +- tonumber(,36) ...bad argument... +- tonumber(
,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,
) ...bad argument... +- tonumber('789',
) ...bad argument... +- tonumber(1.25,) ...bad argument... +- tonumber('789',) ...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(
) string +- tostring() string +- tostring() string +--- checkallpass +- tostring('abc','anchor') 'abc' +- tostring(1.25,'anchor') '1.25' +- tostring(true,'anchor') 'true' +--- checkallpass +- tostring(
,'anchor') string +- tostring(,'anchor') string +- tostring(,'anchor') string +--- checkallerrors +- tostring() ...bad argument... +====== type ====== +--- checkallpass +- type('abc') 'string' +- type(1.25) 'number' +- type(true) 'boolean' +- type(
) 'table' +- type() 'function' +- type() 'thread' +--- checkallpass +- type(nil,'anchor') 'nil' +- type('abc','anchor') 'string' +- type(1.25,'anchor') 'number' +- type(true,'anchor') 'boolean' +- type(
,'anchor') 'table' +- type(,'anchor') 'function' +- type(,'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(
,'abc') false,'error in error handling' +- xpcall(,'abc') true +- xpcall(,'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(
,1.25) false,'error in error handling' +- xpcall(,1.25) true +- xpcall(,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(
,true) false,'error in error handling' +- xpcall(,true) true +- xpcall(,true) false,'error in error handling' +- xpcall('abc',
) false,'error in error handling' +- xpcall(1.25,
) false,'error in error handling' +- xpcall(true,
) false,'error in error handling' +- xpcall(
,
) false,'error in error handling' +- xpcall(,
) true +- xpcall(,
) false,'error in error handling' +- xpcall('abc',) false,'error in error handling' +- xpcall(1.25,) false,'error in error handling' +- xpcall(true,) false,'error in error handling' +- xpcall(
,) false,'error in error handling' +- xpcall(,) true +- xpcall(,) false,'error in error handling' +--- checkallpass +- xpcall('abc',) false,'aaa' +- xpcall(1.25,) false,'aaa' +- xpcall(true,) false,'aaa' +- xpcall(
,) false,'aaa' +- xpcall(,) true +- xpcall(,) false,'aaa' +--- checkallerrors +- xpcall(nil) ...bad argument... +- xpcall('abc') ...bad argument... +- xpcall(1.25) ...bad argument... +- xpcall(true) ...bad argument... +- xpcall(
) ...bad argument... +- xpcall() ...bad argument... +- xpcall() ...bad argument... diff --git a/luaj-test/src/test/resources/errors/coroutinelibargs.out b/luaj-test/src/test/resources/errors/coroutinelibargs.out new file mode 100644 index 00000000..331997f2 --- /dev/null +++ b/luaj-test/src/test/resources/errors/coroutinelibargs.out @@ -0,0 +1,65 @@ +====== coroutine.create ====== +--- checkallpass +- coroutine.create() +--- checkallerrors +- coroutine.create(nil) ...bad argument... +- coroutine.create('abc') ...bad argument... +- coroutine.create(1.25) ...bad argument... +- coroutine.create(true) ...bad argument... +- coroutine.create(
) ...bad argument... +- coroutine.create() ...bad argument... +====== coroutine.resume ====== +--- checkallpass +- coroutine.resume(,nil) true +- coroutine.resume(,'abc') true +- coroutine.resume(,1.25) true +- coroutine.resume(,true) true +- coroutine.resume(,
) true +- coroutine.resume(,) true +- coroutine.resume(,) 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(
) ...bad argument... +- coroutine.resume() ...bad argument... +====== coroutine.running ====== +--- checkallpass +- coroutine.running(nil) ,true +- coroutine.running('abc') ,true +- coroutine.running(1.25) ,true +- coroutine.running(true) ,true +- coroutine.running(
) ,true +- coroutine.running() ,true +- coroutine.running() ,true +====== coroutine.status ====== +--- checkallpass +- coroutine.status() '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(
) ...bad argument... +- coroutine.status() ...bad argument... +====== coroutine.wrap ====== +--- checkallpass +- coroutine.wrap() +--- checkallerrors +- coroutine.wrap(nil) ...bad argument... +- coroutine.wrap('abc') ...bad argument... +- coroutine.wrap(1.25) ...bad argument... +- coroutine.wrap(true) ...bad argument... +- coroutine.wrap(
) ...bad argument... +- coroutine.wrap() ...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 diff --git a/luaj-test/src/test/resources/errors/debuglibargs.out b/luaj-test/src/test/resources/errors/debuglibargs.out new file mode 100644 index 00000000..66698f0b --- /dev/null +++ b/luaj-test/src/test/resources/errors/debuglibargs.out @@ -0,0 +1,452 @@ +====== debug.debug - no tests ====== +====== debug.gethook ====== +--- checkallpass +- debug.gethook() nil,'',0 +====== debug.getinfo ====== +--- checkallpass +- debug.getinfo()
+- debug.getinfo(25) +- debug.getinfo('25') +--- checkallpass +- debug.getinfo()
+- debug.getinfo(25) +- debug.getinfo('25') +--- checkallpass +- debug.getinfo(,'')
+- debug.getinfo(25,'') +- debug.getinfo('25','') +- debug.getinfo(,'n')
+- debug.getinfo(25,'n') +- debug.getinfo('25','n') +- debug.getinfo(,'flnStu')
+- 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() ...function or level... +--- checkallerrors +- debug.getinfo(,true) ...string expected... +- debug.getinfo(,
) ...string expected... +- debug.getinfo(,) ...string expected... +- debug.getinfo(,) ...string expected... +--- checkallerrors +- debug.getinfo(nil,) ...string expected... +- debug.getinfo('abc',) ...string expected... +- debug.getinfo(true,) ...string expected... +--- checkallerrors +- debug.getinfo('abc',,'abc') ...string expected... +- debug.getinfo(1.25,,'abc') ...string expected... +- debug.getinfo(true,,'abc') ...string expected... +- debug.getinfo(
,,'abc') ...string expected... +- debug.getinfo(,,'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(,1) 'x' +- debug.getlocal(1,1) '(*temporary)' +- debug.getlocal(,'2') 'y' +- debug.getlocal(1,'2') +--- checkallpass +- debug.getlocal(,,1) 'x' +--- checkallerrors +- debug.getlocal() ...number expected... +--- checkallerrors +- debug.getlocal(,nil) ...number expected... +- debug.getlocal(25,nil) ...number expected... +- debug.getlocal('25',nil) ...number expected... +- debug.getlocal(,'abc') ...number expected... +- debug.getlocal(25,'abc') ...number expected... +- debug.getlocal('25','abc') ...number expected... +- debug.getlocal(,true) ...number expected... +- debug.getlocal(25,true) ...number expected... +- debug.getlocal('25',true) ...number expected... +- debug.getlocal(,
) ...number expected... +- debug.getlocal(25,
) ...number expected... +- debug.getlocal('25',
) ...number expected... +- debug.getlocal(,) ...number expected... +- debug.getlocal(25,) ...number expected... +- debug.getlocal('25',) ...number expected... +- debug.getlocal(,) ...number expected... +- debug.getlocal(25,) ...number expected... +- debug.getlocal('25',) ...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(,1.25) ...number expected... +- debug.getlocal(nil,'789') ...number expected... +- debug.getlocal('abc','789') ...number expected... +- debug.getlocal(true,'789') ...number expected... +- debug.getlocal(,'789') ...number expected... +--- checkallerrors +- debug.getlocal(,) ...got no value... +- debug.getlocal(,25) ...got no value... +- debug.getlocal(,'25') ...got no value... +--- checkallerrors +- debug.getlocal('abc',,1) ...number expected... +- debug.getlocal(1.25,,1) ...number expected... +- debug.getlocal(true,,1) ...number expected... +- debug.getlocal(
,,1) ...number expected... +- debug.getlocal(,,1) ...number expected... +- debug.getlocal('abc',,'2') ...number expected... +- debug.getlocal(1.25,,'2') ...number expected... +- debug.getlocal(true,,'2') ...number expected... +- debug.getlocal(
,,'2') ...number expected... +- debug.getlocal(,,'2') ...number expected... +--- checkallerrors +- debug.getlocal(,100,1) ...level out of range... +====== debug.getmetatable ====== +--- checkallpass +- debug.getmetatable(nil) +- debug.getmetatable('abc')
+- debug.getmetatable(1.25) +- debug.getmetatable(true) +- debug.getmetatable(
) +- debug.getmetatable() +- debug.getmetatable() +--- checkallerrors +- debug.getmetatable() ...value expected... +====== debug.getregistry ====== +--- checkallpass +- debug.getregistry()
+--- checkallpass +- debug.getregistry(nil)
+- debug.getregistry('abc')
+- debug.getregistry(1.25)
+- debug.getregistry(true)
+- debug.getregistry(
)
+- debug.getregistry()
+- debug.getregistry()
+====== debug.getupvalue ====== +--- checkallpass +- debug.getupvalue(,1) '_ENV',
+- debug.getupvalue(,'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(
,1) ...function expected... +- debug.getupvalue(,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(
,'2') ...function expected... +- debug.getupvalue(,'2') ...function expected... +--- checkallerrors +- debug.getupvalue(,nil) ...number expected... +- debug.getupvalue(,'abc') ...number expected... +- debug.getupvalue(,true) ...number expected... +- debug.getupvalue(,
) ...number expected... +- debug.getupvalue(,) ...number expected... +- debug.getupvalue(,) ...number expected... +--- checkallpass +- debug.getuservalue() +--- checkallpass +- debug.getuservalue(nil) +- debug.getuservalue('abc') +- debug.getuservalue(1.25) +- debug.getuservalue(true) +- debug.getuservalue(
) +- debug.getuservalue() +- debug.getuservalue() +--- checkallpass +- debug.sethook() +--- checkallpass +--- checkallpass +- debug.sethook(,'cr') +- debug.sethook(,'l') +--- checkallpass +- debug.sethook(nil,,'cr') +- debug.sethook(,,'cr') +- debug.sethook(nil,,'l') +- debug.sethook(,,'l') +--- checkallerrors +- debug.sethook('abc') ...string expected... +- debug.sethook() ...string expected... +- debug.sethook(true) ...string expected... +--- checkallerrors +- debug.sethook('abc',nil,'cr') ...string expected... +- debug.sethook(,nil,'cr') ...string expected... +- debug.sethook(true,nil,'cr') ...string expected... +- debug.sethook('abc',,'cr') ...string expected... +- debug.sethook(,,'cr') ...string expected... +- debug.sethook(true,,'cr') ...string expected... +- debug.sethook('abc',nil,'l') ...string expected... +- debug.sethook(,nil,'l') ...string expected... +- debug.sethook(true,nil,'l') ...string expected... +- debug.sethook('abc',,'l') ...string expected... +- debug.sethook(,,'l') ...string expected... +- debug.sethook(true,,'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(,1,2,nil) +- debug.setlocal(,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(,1,2) ...value expected... +--- checkallerrors +- debug.setlocal(
,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,
) ...value expected... +- debug.setlocal(1,) ...value expected... +- debug.setlocal(1,) ...value expected... +--- checkallerrors +- debug.setlocal(
,1,1,nil) ...number expected... +- debug.setlocal('abc',1,1,nil) ...number expected... +- debug.setlocal(
,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,
) +- debug.setmetatable('abc',
) 'abc' +- debug.setmetatable(1.25,
) 1.25 +- debug.setmetatable(true,
) true +- debug.setmetatable(
,
)
+- debug.setmetatable(,
) +- debug.setmetatable(,
) +- debug.setmetatable(nil,nil) +- debug.setmetatable('abc',nil) 'abc' +- debug.setmetatable(1.25,nil) 1.25 +- debug.setmetatable(true,nil) true +- debug.setmetatable(
,nil)
+- debug.setmetatable(,nil) +- debug.setmetatable(,nil) +--- 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(
) ...nil or table... +- debug.setmetatable() ...nil or table... +- debug.setmetatable() ...nil or table... +====== debug.setupvalue ====== +--- checkallpass +- debug.setupvalue(,2,nil) 'p' +- debug.setupvalue(,'3',nil) 'q' +- debug.setupvalue(,2,true) 'p' +- debug.setupvalue(,'3',true) 'q' +- debug.setupvalue(,2,'abc') 'p' +- debug.setupvalue(,'3','abc') 'q' +p,q abc abc +--- checkallerrors +- debug.setupvalue() ...value expected... +--- checkallerrors +- debug.setupvalue() ...value expected... +--- checkallerrors +- debug.setupvalue(,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(
,2) ...value expected... +- debug.setupvalue(,2) ...value expected... +--- checkallerrors +- debug.setupvalue(,nil) ...value expected... +- debug.setupvalue(,'abc') ...value expected... +- debug.setupvalue(,true) ...value expected... +- debug.setupvalue(,
) ...value expected... +- debug.setupvalue(,) ...value expected... +- debug.setupvalue(,) ...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(
) ...userdata expected... +- debug.setuservalue() ...userdata expected... +- debug.setuservalue() ...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(
,'abc') ...userdata expected... +- debug.setuservalue(,'abc') ...userdata expected... +- debug.setuservalue(,'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(
,1.25) ...userdata expected... +- debug.setuservalue(,1.25) ...userdata expected... +- debug.setuservalue(,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() '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(,'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(,'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() +- debug.traceback(true) true +- debug.traceback(
)
+--- checkallpass +- debug.traceback(,nil) +- debug.traceback(true,nil) true +- debug.traceback(
,nil)
+- debug.traceback(,'abc') +- debug.traceback(true,'abc') true +- debug.traceback(
,'abc')
+- debug.traceback(,true) +- debug.traceback(true,true) true +- debug.traceback(
,true)
+- debug.traceback(,
) +- debug.traceback(true,
) true +- debug.traceback(
,
)
+- debug.traceback(,) +- debug.traceback(true,) true +- debug.traceback(
,)
+- debug.traceback(,) +- debug.traceback(true,) true +- debug.traceback(
,)
+====== debug.upvalueid ====== +--- checkallpass +- debug.upvalueid(,1) +- debug.upvalueid(,'2') +--- 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(
,1) ...function expected... +- debug.upvalueid(,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(
,'2') ...function expected... +- debug.upvalueid(,'2') ...function expected... +--- checkallerrors +- debug.upvalueid(,nil) ...number expected... +- debug.upvalueid(,'abc') ...number expected... +- debug.upvalueid(,true) ...number expected... +- debug.upvalueid(,
) ...number expected... +- debug.upvalueid(,) ...number expected... +- debug.upvalueid(,) ...number expected... +====== debug.upvaluejoin ====== +--- checkallpass +- debug.upvaluejoin(,1,,1) +- debug.upvaluejoin(,'2',,1) +- debug.upvaluejoin(,1,,'2') +- debug.upvaluejoin(,'2',,'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(
,1) ...function expected... +- debug.upvaluejoin(,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(
,'2') ...function expected... +- debug.upvaluejoin(,'2') ...function expected... +--- checkallerrors +- debug.upvaluejoin(,nil) ...number expected... +- debug.upvaluejoin(,'abc') ...number expected... +- debug.upvaluejoin(,true) ...number expected... +- debug.upvaluejoin(,
) ...number expected... +- debug.upvaluejoin(,) ...number expected... +- debug.upvaluejoin(,) ...number expected... +--- checkallerrors +- debug.upvaluejoin(,1,nil,1) ...function expected... +- debug.upvaluejoin(,1,'abc',1) ...function expected... +- debug.upvaluejoin(,1,1.25,1) ...function expected... +- debug.upvaluejoin(,1,true,1) ...function expected... +- debug.upvaluejoin(,1,
,1) ...function expected... +- debug.upvaluejoin(,1,,1) ...function expected... +- debug.upvaluejoin(,1,nil,'2') ...function expected... +- debug.upvaluejoin(,1,'abc','2') ...function expected... +- debug.upvaluejoin(,1,1.25,'2') ...function expected... +- debug.upvaluejoin(,1,true,'2') ...function expected... +- debug.upvaluejoin(,1,
,'2') ...function expected... +- debug.upvaluejoin(,1,,'2') ...function expected... +--- checkallerrors +- debug.upvaluejoin(,1,,nil) ...number expected... +- debug.upvaluejoin(,1,,'abc') ...number expected... +- debug.upvaluejoin(,1,,true) ...number expected... +- debug.upvaluejoin(,1,,
) ...number expected... +- debug.upvaluejoin(,1,,) ...number expected... +- debug.upvaluejoin(,1,,) ...number expected... diff --git a/luaj-test/src/test/resources/errors/iolibargs.out b/luaj-test/src/test/resources/errors/iolibargs.out new file mode 100644 index 00000000..e0603df4 --- /dev/null +++ b/luaj-test/src/test/resources/errors/iolibargs.out @@ -0,0 +1,202 @@ +====== io.close ====== +--- checkallpass +- io.close() true +--- checkallerrors +- io.close('abc') ...bad argument... +- io.close(1.25) ...bad argument... +- io.close(true) ...bad argument... +- io.close(
) ...bad argument... +- io.close() ...bad argument... +- io.close() ...bad argument... +====== io.input ====== +--- checkallpass +- io.input(nil) +- io.input() +- io.input('abc.txt') +--- checkallerrors +- io.input(true) ...bad argument... +- io.input(
) ...bad argument... +- io.input() ...bad argument... +- io.input() ...bad argument... +====== io.lines ====== +--- checkallpass +- io.lines('abc.txt') +--- checkallerrors +- io.lines() ...bad argument... +--- checkallerrors +needcheck io.lines(nil) function: 0x100112cf0 +- io.lines(true) ...bad argument... +- io.lines(
) ...bad argument... +- io.lines() ...bad argument... +- io.lines() ...bad argument... +====== io.open ====== +--- checkallpass +- io.open('abc.txt',nil) +- io.open('abc.txt','r') +- io.open('abc.txt','w') +- io.open('abc.txt','a') +- io.open('abc.txt','r+') +- io.open('abc.txt','w+') +- io.open('abc.txt','a+') +--- checkallerrors +- io.open(nil) ...bad argument... +- io.open(true) ...bad argument... +- io.open(
) ...bad argument... +- io.open() ...bad argument... +- io.open() ...bad argument... +--- checkallerrors +- io.open('abc.txt',
) ...bad argument... +====== io.output ====== +--- checkallpass +- io.output(nil) +- io.output() +- io.output('abc.txt') +--- checkallerrors +- io.output(true) ...bad argument... +- io.output(
) ...bad argument... +- io.output() ...bad argument... +- io.output() ...bad argument... +====== io.popen ====== +--- checkallerrors +- io.popen(nil) ...bad argument... +- io.popen(true) ...bad argument... +- io.popen(
) ...bad argument... +- io.popen() ...bad argument... +- io.popen() ...bad argument... +--- checkallerrors +- io.popen('hostname',
) ...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() ...bad argument... +- io.read(
) ...bad argument... +- io.read('3') ...bad argument... +====== io.write ====== +--- checkallpass +- io.write() +--- checkallpass +- io.write('abc') +- io.write(1.25) +--- checkallpass +- io.write('abc','abc') +- io.write(1.25,'abc') +- io.write('abc',1.25) +- io.write(1.25,1.25) +--- checkallerrors +- io.write(true) ...bad argument... +- io.write(
) ...bad argument... +- io.write() ...bad argument... +- io.write() ...bad argument... +--- checkallerrors +- io.write('abc',true) ...bad argument... +- io.write(1.25,true) ...bad argument... +- io.write('abc',
) ...bad argument... +- io.write(1.25,
) ...bad argument... +- io.write('abc',) ...bad argument... +- io.write(1.25,) ...bad argument... +- io.write('abc',) ...bad argument... +- io.write(1.25,) ...bad argument... +====== file:write ====== +--- checkallpass +- file.write(,'abc') +- file.write(,1.25) +--- checkallpass +- file.write(,'abc','abc') +- file.write(,1.25,'abc') +- file.write(,'abc',1.25) +- file.write(,1.25,1.25) +--- checkallerrors +- file.write() ...bad argument... +--- checkallerrors +- file.write(,true) ...bad argument... +- file.write(,
) ...bad argument... +- file.write(,) ...bad argument... +- file.write(,) ...bad argument... +--- checkallerrors +- file.write(,'abc',true) ...bad argument... +- file.write(,1.25,true) ...bad argument... +- file.write(,'abc',
) ...bad argument... +- file.write(,1.25,
) ...bad argument... +- file.write(,'abc',) ...bad argument... +- file.write(,1.25,) ...bad argument... +- file.write(,'abc',) ...bad argument... +- file.write(,1.25,) ...bad argument... +====== file:seek ====== +--- checkallpass +- file.seek() 0 +--- checkallpass +- file.seek(,'set') 0 +- file.seek(,'cur') 0 +- file.seek(,'end') 63 +--- checkallpass +- file.seek(,'set',2) 2 +- file.seek(,'cur',2) 4 +- file.seek(,'end',2) 65 +- file.seek(,'set','3') 3 +- file.seek(,'cur','3') 6 +- file.seek(,'end','3') 66 +--- checkallerrors +- file.seek() ...bad argument... +--- checkallerrors +- file.seek(,true) ...bad argument... +- file.seek(,
) ...bad argument... +- file.seek(,) ...bad argument... +- file.seek(,) ...bad argument... +--- checkallerrors +- file.seek(,'set','abc') ...bad argument... +- file.seek(,'cur','abc') ...bad argument... +- file.seek(,'end','abc') ...bad argument... +- file.seek(,'set',true) ...bad argument... +- file.seek(,'cur',true) ...bad argument... +- file.seek(,'end',true) ...bad argument... +- file.seek(,'set',
) ...bad argument... +- file.seek(,'cur',
) ...bad argument... +- file.seek(,'end',
) ...bad argument... +- file.seek(,'set',) ...bad argument... +- file.seek(,'cur',) ...bad argument... +- file.seek(,'end',) ...bad argument... +- file.seek(,'set',) ...bad argument... +- file.seek(,'cur',) ...bad argument... +- file.seek(,'end',) ...bad argument... +====== file:setvbuf ====== +--- checkallpass +- file.setvbuf(,'no') true +- file.setvbuf(,'full') true +- file.setvbuf(,'line') true +--- checkallpass +- file.setvbuf(,'full',1024) true +- file.setvbuf(,'full','512') true +--- checkallerrors +- file.setvbuf() ...bad argument... +--- checkallerrors +- file.setvbuf(,nil) ...bad argument... +- file.setvbuf(,true) ...bad argument... +- file.setvbuf(,
) ...bad argument... +- file.setvbuf(,) ...bad argument... +- file.setvbuf(,) ...bad argument... +--- checkallerrors +- file.setvbuf(,'full','abc') ...bad argument... +- file.setvbuf(,'full',true) ...bad argument... +- file.setvbuf(,'full',
) ...bad argument... +- file.setvbuf(,'full',) ...bad argument... +- file.setvbuf(,'full',) ...bad argument... diff --git a/luaj-test/src/test/resources/errors/mathlibargs.out b/luaj-test/src/test/resources/errors/mathlibargs.out new file mode 100644 index 00000000..5022fccd --- /dev/null +++ b/luaj-test/src/test/resources/errors/mathlibargs.out @@ -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() ...bad argument... +- math.abs(
) ...bad argument... +- math.abs() ...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() ...bad argument... +- math.acos(
) ...bad argument... +- math.acos() ...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() ...bad argument... +- math.asin(
) ...bad argument... +- math.asin() ...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() ...bad argument... +- math.atan(
) ...bad argument... +- math.atan() ...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() ...bad argument... +- math.cos(
) ...bad argument... +- math.cos() ...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() ...bad argument... +- math.cosh(
) ...bad argument... +- math.cosh() ...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() ...bad argument... +- math.deg(
) ...bad argument... +- math.deg() ...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() ...bad argument... +- math.exp(
) ...bad argument... +- math.exp() ...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() ...bad argument... +- math.floor(
) ...bad argument... +- math.floor() ...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() ...bad argument... +- math.rad(
) ...bad argument... +- math.rad() ...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() ...bad argument... +- math.randomseed(
) ...bad argument... +- math.randomseed() ...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() ...bad argument... +- math.sin(
) ...bad argument... +- math.sin() ...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() ...bad argument... +- math.sinh(
) ...bad argument... +- math.sinh() ...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() ...bad argument... +- math.tan(
) ...bad argument... +- math.tan() ...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() ...bad argument... +- math.tanh(
) ...bad argument... +- math.tanh() ...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() ...bad argument... +- math.frexp(
) ...bad argument... +- math.frexp() ...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() ...bad argument... +- math.log(
) ...bad argument... +- math.log() ...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() ...bad argument... +- math.sqrt(
) ...bad argument... +- math.sqrt() ...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() ...bad argument... +- math.ceil(
) ...bad argument... +- math.ceil() ...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() ...bad argument... +- math.atan2(
) ...bad argument... +- math.atan2() ...bad argument... +--- checkallerrors +- math.atan2(nil,1) ...bad argument... +- math.atan2('abc',1) ...bad argument... +- math.atan2(true,1) ...bad argument... +- math.atan2(,1) ...bad argument... +- math.atan2(
,1) ...bad argument... +- math.atan2(,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(,0.75) ...bad argument... +- math.atan2(
,0.75) ...bad argument... +- math.atan2(,0.75) ...bad argument... +- math.atan2(nil,'-1') ...bad argument... +- math.atan2('abc','-1') ...bad argument... +- math.atan2(true,'-1') ...bad argument... +- math.atan2(,'-1') ...bad argument... +- math.atan2(
,'-1') ...bad argument... +- math.atan2(,'-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(,'-0.25') ...bad argument... +- math.atan2(
,'-0.25') ...bad argument... +- math.atan2(,'-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,) ...bad argument... +- math.atan2(0.75,) ...bad argument... +- math.atan2('-1',) ...bad argument... +- math.atan2('-0.25',) ...bad argument... +- math.atan2(1,
) ...bad argument... +- math.atan2(0.75,
) ...bad argument... +- math.atan2('-1',
) ...bad argument... +- math.atan2('-0.25',
) ...bad argument... +- math.atan2(1,) ...bad argument... +- math.atan2(0.75,) ...bad argument... +- math.atan2('-1',) ...bad argument... +- math.atan2('-0.25',) ...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() ...bad argument... +- math.pow(
) ...bad argument... +- math.pow() ...bad argument... +--- checkallerrors +- math.pow(nil,1) ...bad argument... +- math.pow('abc',1) ...bad argument... +- math.pow(true,1) ...bad argument... +- math.pow(,1) ...bad argument... +- math.pow(
,1) ...bad argument... +- math.pow(,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(,0.75) ...bad argument... +- math.pow(
,0.75) ...bad argument... +- math.pow(,0.75) ...bad argument... +- math.pow(nil,'-1') ...bad argument... +- math.pow('abc','-1') ...bad argument... +- math.pow(true,'-1') ...bad argument... +- math.pow(,'-1') ...bad argument... +- math.pow(
,'-1') ...bad argument... +- math.pow(,'-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(,'-0.25') ...bad argument... +- math.pow(
,'-0.25') ...bad argument... +- math.pow(,'-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,) ...bad argument... +- math.pow(0.75,) ...bad argument... +- math.pow('-1',) ...bad argument... +- math.pow('-0.25',) ...bad argument... +- math.pow(1,
) ...bad argument... +- math.pow(0.75,
) ...bad argument... +- math.pow('-1',
) ...bad argument... +- math.pow('-0.25',
) ...bad argument... +- math.pow(1,) ...bad argument... +- math.pow(0.75,) ...bad argument... +- math.pow('-1',) ...bad argument... +- math.pow('-0.25',) ...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() ...bad argument... +- math.fmod(
) ...bad argument... +- math.fmod() ...bad argument... +--- checkallerrors +- math.fmod(nil,1) ...bad argument... +- math.fmod('abc',1) ...bad argument... +- math.fmod(true,1) ...bad argument... +- math.fmod(,1) ...bad argument... +- math.fmod(
,1) ...bad argument... +- math.fmod(,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(,0.75) ...bad argument... +- math.fmod(
,0.75) ...bad argument... +- math.fmod(,0.75) ...bad argument... +- math.fmod(nil,'-1') ...bad argument... +- math.fmod('abc','-1') ...bad argument... +- math.fmod(true,'-1') ...bad argument... +- math.fmod(,'-1') ...bad argument... +- math.fmod(
,'-1') ...bad argument... +- math.fmod(,'-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(,'-0.25') ...bad argument... +- math.fmod(
,'-0.25') ...bad argument... +- math.fmod(,'-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,) ...bad argument... +- math.fmod(0.75,) ...bad argument... +- math.fmod('-1',) ...bad argument... +- math.fmod('-0.25',) ...bad argument... +- math.fmod(1,
) ...bad argument... +- math.fmod(0.75,
) ...bad argument... +- math.fmod('-1',
) ...bad argument... +- math.fmod('-0.25',
) ...bad argument... +- math.fmod(1,) ...bad argument... +- math.fmod(0.75,) ...bad argument... +- math.fmod('-1',) ...bad argument... +- math.fmod('-0.25',) ...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() ...bad argument... +- math.max(
) ...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,) ...bad argument... +- math.max(0.75,) ...bad argument... +- math.max('-1',) ...bad argument... +- math.max('-0.25',) ...bad argument... +- math.max(1,
) ...bad argument... +- math.max(0.75,
) ...bad argument... +- math.max('-1',
) ...bad argument... +- math.max('-0.25',
) ...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() ...bad argument... +- math.min(
) ...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,) ...bad argument... +- math.min(0.75,) ...bad argument... +- math.min('-1',) ...bad argument... +- math.min('-0.25',) ...bad argument... +- math.min(1,
) ...bad argument... +- math.min(0.75,
) ...bad argument... +- math.min('-1',
) ...bad argument... +- math.min('-0.25',
) ...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(
,8) ...bad argument... +- math.random(,8) ...bad argument... +- math.random('abc',9.1) ...bad argument... +- math.random(true,9.1) ...bad argument... +- math.random(
,9.1) ...bad argument... +- math.random(,9.1) ...bad argument... +- math.random('abc','12.34') ...bad argument... +- math.random(true,'12.34') ...bad argument... +- math.random(
,'12.34') ...bad argument... +- math.random(,'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,
) ...bad argument... +- math.random(4.5,
) ...bad argument... +- math.random('6.7',
) ...bad argument... +- math.random(3,) ...bad argument... +- math.random(4.5,) ...bad argument... +- math.random('6.7',) ...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() ...bad argument... +- math.ldexp(
) ...bad argument... +- math.ldexp() ...bad argument... +--- checkallerrors +- math.ldexp(nil,-3) ...bad argument... +- math.ldexp('abc',-3) ...bad argument... +- math.ldexp(true,-3) ...bad argument... +- math.ldexp(,-3) ...bad argument... +- math.ldexp(
,-3) ...bad argument... +- math.ldexp(,-3) ...bad argument... +- math.ldexp(nil,0) ...bad argument... +- math.ldexp('abc',0) ...bad argument... +- math.ldexp(true,0) ...bad argument... +- math.ldexp(,0) ...bad argument... +- math.ldexp(
,0) ...bad argument... +- math.ldexp(,0) ...bad argument... +- math.ldexp(nil,3) ...bad argument... +- math.ldexp('abc',3) ...bad argument... +- math.ldexp(true,3) ...bad argument... +- math.ldexp(,3) ...bad argument... +- math.ldexp(
,3) ...bad argument... +- math.ldexp(,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(,9.1) ...bad argument... +- math.ldexp(
,9.1) ...bad argument... +- math.ldexp(,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(,'12.34') ...bad argument... +- math.ldexp(
,'12.34') ...bad argument... +- math.ldexp(,'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,
) ...bad argument... +- math.ldexp(0.75,
) ...bad argument... +- math.ldexp('-1',
) ...bad argument... +- math.ldexp('-0.25',
) ...bad argument... +- math.ldexp(1,) ...bad argument... +- math.ldexp(0.75,) ...bad argument... +- math.ldexp('-1',) ...bad argument... +- math.ldexp('-0.25',) ...bad argument... diff --git a/luaj-test/src/test/resources/errors/modulelibargs.out b/luaj-test/src/test/resources/errors/modulelibargs.out new file mode 100644 index 00000000..65071399 --- /dev/null +++ b/luaj-test/src/test/resources/errors/modulelibargs.out @@ -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() ...bad argument... +- require(
) ...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(
) ...bad argument... +- package.loadlib() ...bad argument... +- package.loadlib() ...bad argument... +====== package.seeall ====== +--- checkallpass +fail package.seeall(
) '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() template='bad argument' actual='attempt to call a nil value' +badmsg package.seeall() template='bad argument' actual='attempt to call a nil value' diff --git a/luaj-test/src/test/resources/errors/operators.out b/luaj-test/src/test/resources/errors/operators.out new file mode 100644 index 00000000..126f0c69 --- /dev/null +++ b/luaj-test/src/test/resources/errors/operators.out @@ -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(
) ...attempt to perform arithmetic... +- negative() ...attempt to perform arithmetic... +- negative() ...attempt to perform arithmetic... +====== # ====== +--- checkallpass +- lengthop(
) 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() ...attempt to get length of... +- lengthop() ...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(
) false +- notop() false +- notop() false +====== () ====== +--- checkallpass +- funcop() +--- checkallerrors +- funcop(nil) ...attempt to call... +- funcop('abc') ...attempt to call... +- funcop(1.25) ...attempt to call... +- funcop(true) ...attempt to call... +- funcop(
) ...attempt to call... +- funcop() ...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(
,'abc') ...attempt to concatenate... +- concatop(,'abc') ...attempt to concatenate... +- concatop(,'abc') ...attempt to concatenate... +- concatop(nil,1.25) ...attempt to concatenate... +- concatop(true,1.25) ...attempt to concatenate... +- concatop(
,1.25) ...attempt to concatenate... +- concatop(,1.25) ...attempt to concatenate... +- concatop(,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',
) ...attempt to concatenate... +- concatop(1.25,
) ...attempt to concatenate... +- concatop('abc',) ...attempt to concatenate... +- concatop(1.25,) ...attempt to concatenate... +- concatop('abc',) ...attempt to concatenate... +- concatop(1.25,) ...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(
,1.25) ...attempt to perform arithmetic... +- plusop(,1.25) ...attempt to perform arithmetic... +- plusop(,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(
,'789') ...attempt to perform arithmetic... +- plusop(,'789') ...attempt to perform arithmetic... +- plusop(,'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,
) ...attempt to perform arithmetic... +- plusop('789',
) ...attempt to perform arithmetic... +- plusop(1.25,) ...attempt to perform arithmetic... +- plusop('789',) ...attempt to perform arithmetic... +- plusop(1.25,) ...attempt to perform arithmetic... +- plusop('789',) ...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(
,1.25) ...attempt to perform arithmetic... +- minusop(,1.25) ...attempt to perform arithmetic... +- minusop(,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(
,'789') ...attempt to perform arithmetic... +- minusop(,'789') ...attempt to perform arithmetic... +- minusop(,'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,
) ...attempt to perform arithmetic... +- minusop('789',
) ...attempt to perform arithmetic... +- minusop(1.25,) ...attempt to perform arithmetic... +- minusop('789',) ...attempt to perform arithmetic... +- minusop(1.25,) ...attempt to perform arithmetic... +- minusop('789',) ...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(
,1.25) ...attempt to perform arithmetic... +- timesop(,1.25) ...attempt to perform arithmetic... +- timesop(,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(
,'789') ...attempt to perform arithmetic... +- timesop(,'789') ...attempt to perform arithmetic... +- timesop(,'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,
) ...attempt to perform arithmetic... +- timesop('789',
) ...attempt to perform arithmetic... +- timesop(1.25,) ...attempt to perform arithmetic... +- timesop('789',) ...attempt to perform arithmetic... +- timesop(1.25,) ...attempt to perform arithmetic... +- timesop('789',) ...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(
,1.25) ...attempt to perform arithmetic... +- divideop(,1.25) ...attempt to perform arithmetic... +- divideop(,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(
,'789') ...attempt to perform arithmetic... +- divideop(,'789') ...attempt to perform arithmetic... +- divideop(,'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,
) ...attempt to perform arithmetic... +- divideop('789',
) ...attempt to perform arithmetic... +- divideop(1.25,) ...attempt to perform arithmetic... +- divideop('789',) ...attempt to perform arithmetic... +- divideop(1.25,) ...attempt to perform arithmetic... +- divideop('789',) ...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(
,1.25) ...attempt to perform arithmetic... +- modop(,1.25) ...attempt to perform arithmetic... +- modop(,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(
,'789') ...attempt to perform arithmetic... +- modop(,'789') ...attempt to perform arithmetic... +- modop(,'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,
) ...attempt to perform arithmetic... +- modop('789',
) ...attempt to perform arithmetic... +- modop(1.25,) ...attempt to perform arithmetic... +- modop('789',) ...attempt to perform arithmetic... +- modop(1.25,) ...attempt to perform arithmetic... +- modop('789',) ...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(
,3) ...attempt to perform arithmetic... +- powerop(,3) ...attempt to perform arithmetic... +- powerop(,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(
,'3.1') ...attempt to perform arithmetic... +- powerop(,'3.1') ...attempt to perform arithmetic... +- powerop(,'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,
) ...attempt to perform arithmetic... +- powerop('2.1',
) ...attempt to perform arithmetic... +- powerop(2,) ...attempt to perform arithmetic... +- powerop('2.1',) ...attempt to perform arithmetic... +- powerop(2,) ...attempt to perform arithmetic... +- powerop('2.1',) ...attempt to perform arithmetic... +====== == ====== +--- checkallpass +- equalsop(nil,nil) true +- equalsop('abc',nil) false +- equalsop(1.25,nil) false +- equalsop(true,nil) false +- equalsop(
,nil) false +- equalsop(,nil) false +- equalsop(,nil) false +- equalsop(nil,'abc') false +- equalsop('abc','abc') true +- equalsop(1.25,'abc') false +- equalsop(true,'abc') false +- equalsop(
,'abc') false +- equalsop(,'abc') false +- equalsop(,'abc') false +- equalsop(nil,1.25) false +- equalsop('abc',1.25) false +- equalsop(1.25,1.25) true +- equalsop(true,1.25) false +- equalsop(
,1.25) false +- equalsop(,1.25) false +- equalsop(,1.25) false +- equalsop(nil,true) false +- equalsop('abc',true) false +- equalsop(1.25,true) false +- equalsop(true,true) true +- equalsop(
,true) false +- equalsop(,true) false +- equalsop(,true) false +- equalsop(nil,
) false +- equalsop('abc',
) false +- equalsop(1.25,
) false +- equalsop(true,
) false +- equalsop(
,
) true +- equalsop(,
) false +- equalsop(,
) false +- equalsop(nil,) false +- equalsop('abc',) false +- equalsop(1.25,) false +- equalsop(true,) false +- equalsop(
,) false +- equalsop(,) true +- equalsop(,) false +- equalsop(nil,) false +- equalsop('abc',) false +- equalsop(1.25,) false +- equalsop(true,) false +- equalsop(
,) false +- equalsop(,) false +- equalsop(,) true +====== ~= ====== +--- checkallpass +- noteqop(nil,nil) false +- noteqop('abc',nil) true +- noteqop(1.25,nil) true +- noteqop(true,nil) true +- noteqop(
,nil) true +- noteqop(,nil) true +- noteqop(,nil) true +- noteqop(nil,'abc') true +- noteqop('abc','abc') false +- noteqop(1.25,'abc') true +- noteqop(true,'abc') true +- noteqop(
,'abc') true +- noteqop(,'abc') true +- noteqop(,'abc') true +- noteqop(nil,1.25) true +- noteqop('abc',1.25) true +- noteqop(1.25,1.25) false +- noteqop(true,1.25) true +- noteqop(
,1.25) true +- noteqop(,1.25) true +- noteqop(,1.25) true +- noteqop(nil,true) true +- noteqop('abc',true) true +- noteqop(1.25,true) true +- noteqop(true,true) false +- noteqop(
,true) true +- noteqop(,true) true +- noteqop(,true) true +- noteqop(nil,
) true +- noteqop('abc',
) true +- noteqop(1.25,
) true +- noteqop(true,
) true +- noteqop(
,
) false +- noteqop(,
) true +- noteqop(,
) true +- noteqop(nil,) true +- noteqop('abc',) true +- noteqop(1.25,) true +- noteqop(true,) true +- noteqop(
,) true +- noteqop(,) false +- noteqop(,) true +- noteqop(nil,) true +- noteqop('abc',) true +- noteqop(1.25,) true +- noteqop(true,) true +- noteqop(
,) true +- noteqop(,) true +- noteqop(,) 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(
,1.25) ...attempt to compare... +- leop(,1.25) ...attempt to compare... +- leop(,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(
,'abc') ...attempt to compare... +- leop(,'abc') ...attempt to compare... +- leop(,'abc') ...attempt to compare... +- leop(nil,'789') ...attempt to compare... +- leop(true,'789') ...attempt to compare... +- leop(
,'789') ...attempt to compare... +- leop(,'789') ...attempt to compare... +- leop(,'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,
) ...attempt to compare... +- leop(1.25,) ...attempt to compare... +- leop(1.25,) ...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',
) ...attempt to compare... +- leop('789',
) ...attempt to compare... +- leop('abc',) ...attempt to compare... +- leop('789',) ...attempt to compare... +- leop('abc',) ...attempt to compare... +- leop('789',) ...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(
,1.25) ...attempt to compare... +- geop(,1.25) ...attempt to compare... +- geop(,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(
,'abc') ...attempt to compare... +- geop(,'abc') ...attempt to compare... +- geop(,'abc') ...attempt to compare... +- geop(nil,'789') ...attempt to compare... +- geop(true,'789') ...attempt to compare... +- geop(
,'789') ...attempt to compare... +- geop(,'789') ...attempt to compare... +- geop(,'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,
) ...attempt to compare... +- geop(1.25,) ...attempt to compare... +- geop(1.25,) ...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',
) ...attempt to compare... +- geop('789',
) ...attempt to compare... +- geop('abc',) ...attempt to compare... +- geop('789',) ...attempt to compare... +- geop('abc',) ...attempt to compare... +- geop('789',) ...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(
,1.25) ...attempt to compare... +- ltop(,1.25) ...attempt to compare... +- ltop(,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(
,'abc') ...attempt to compare... +- ltop(,'abc') ...attempt to compare... +- ltop(,'abc') ...attempt to compare... +- ltop(nil,'789') ...attempt to compare... +- ltop(true,'789') ...attempt to compare... +- ltop(
,'789') ...attempt to compare... +- ltop(,'789') ...attempt to compare... +- ltop(,'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,
) ...attempt to compare... +- ltop(1.25,) ...attempt to compare... +- ltop(1.25,) ...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',
) ...attempt to compare... +- ltop('789',
) ...attempt to compare... +- ltop('abc',) ...attempt to compare... +- ltop('789',) ...attempt to compare... +- ltop('abc',) ...attempt to compare... +- ltop('789',) ...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(
,1.25) ...attempt to compare... +- gtop(,1.25) ...attempt to compare... +- gtop(,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(
,'abc') ...attempt to compare... +- gtop(,'abc') ...attempt to compare... +- gtop(,'abc') ...attempt to compare... +- gtop(nil,'789') ...attempt to compare... +- gtop(true,'789') ...attempt to compare... +- gtop(
,'789') ...attempt to compare... +- gtop(,'789') ...attempt to compare... +- gtop(,'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,
) ...attempt to compare... +- gtop(1.25,) ...attempt to compare... +- gtop(1.25,) ...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',
) ...attempt to compare... +- gtop('789',
) ...attempt to compare... +- gtop('abc',) ...attempt to compare... +- gtop('789',) ...attempt to compare... +- gtop('abc',) ...attempt to compare... +- gtop('789',) ...attempt to compare... +====== [] ====== +--- checkallpass +- bracketop(
,'abc') +- bracketop(
,1.25) +- bracketop(
,true) +- bracketop(
,
) +- bracketop(
,) +- bracketop(
,) +--- 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(,'abc') ...attempt to index... +- bracketop(,'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(,1.25) ...attempt to index... +- bracketop(,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(,true) ...attempt to index... +- bracketop(,true) ...attempt to index... +- bracketop(nil,
) ...attempt to index... +needcheck bracketop('abc',
) nil +- bracketop(1.25,
) ...attempt to index... +- bracketop(true,
) ...attempt to index... +- bracketop(,
) ...attempt to index... +- bracketop(,
) ...attempt to index... +- bracketop(nil,) ...attempt to index... +needcheck bracketop('abc',) nil +- bracketop(1.25,) ...attempt to index... +- bracketop(true,) ...attempt to index... +- bracketop(,) ...attempt to index... +- bracketop(,) ...attempt to index... +- bracketop(nil,) ...attempt to index... +needcheck bracketop('abc',) nil +- bracketop(1.25,) ...attempt to index... +- bracketop(true,) ...attempt to index... +- bracketop(,) ...attempt to index... +- bracketop(,) ...attempt to index... +--- checkallerrors +needcheck bracketop(
) nil +====== . ====== +--- checkallpass +- dotop(
,'abc') +- dotop(
,1.25) +- dotop(
,true) +- dotop(
,
) +- dotop(
,) +- dotop(
,) +--- 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(,'abc') ...attempt to index... +- dotop(,'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(,1.25) ...attempt to index... +- dotop(,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(,true) ...attempt to index... +- dotop(,true) ...attempt to index... +- dotop(nil,
) ...attempt to index... +needcheck dotop('abc',
) nil +- dotop(1.25,
) ...attempt to index... +- dotop(true,
) ...attempt to index... +- dotop(,
) ...attempt to index... +- dotop(,
) ...attempt to index... +- dotop(nil,) ...attempt to index... +needcheck dotop('abc',) nil +- dotop(1.25,) ...attempt to index... +- dotop(true,) ...attempt to index... +- dotop(,) ...attempt to index... +- dotop(,) ...attempt to index... +- dotop(nil,) ...attempt to index... +needcheck dotop('abc',) nil +- dotop(1.25,) ...attempt to index... +- dotop(true,) ...attempt to index... +- dotop(,) ...attempt to index... +- dotop(,) ...attempt to index... +--- checkallerrors +needcheck dotop(
) nil +====== and ====== +--- checkallpass +- andop(nil,nil) +- andop('abc',nil) +- andop(1.25,nil) +- andop(true,nil) +- andop(
,nil) +- andop(,nil) +- andop(,nil) +- andop(nil,'abc') +- andop('abc','abc') 'abc' +- andop(1.25,'abc') 'abc' +- andop(true,'abc') 'abc' +- andop(
,'abc') 'abc' +- andop(,'abc') 'abc' +- andop(,'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(
,1.25) 1.25 +- andop(,1.25) 1.25 +- andop(,1.25) 1.25 +- andop(nil,true) +- andop('abc',true) true +- andop(1.25,true) true +- andop(true,true) true +- andop(
,true) true +- andop(,true) true +- andop(,true) true +- andop(nil,
) +- andop('abc',
) 'table' +- andop(1.25,
) 'table' +- andop(true,
) 'table' +- andop(
,
) 'table' +- andop(,
) 'table' +- andop(,
) 'table' +- andop(nil,) +- andop('abc',) 'function' +- andop(1.25,) 'function' +- andop(true,) 'function' +- andop(
,) 'function' +- andop(,) 'function' +- andop(,) 'function' +- andop(nil,) +- andop('abc',) 'thread' +- andop(1.25,) 'thread' +- andop(true,) 'thread' +- andop(
,) 'thread' +- andop(,) 'thread' +- andop(,) 'thread' +====== or ====== +--- checkallpass +- orop(nil,nil) +- orop('abc',nil) 'abc' +- orop(1.25,nil) 1.25 +- orop(true,nil) true +- orop(
,nil) 'table' +- orop(,nil) 'function' +- orop(,nil) 'thread' +- orop(nil,'abc') 'abc' +- orop('abc','abc') 'abc' +- orop(1.25,'abc') 1.25 +- orop(true,'abc') true +- orop(
,'abc') 'table' +- orop(,'abc') 'function' +- orop(,'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(
,1.25) 'table' +- orop(,1.25) 'function' +- orop(,1.25) 'thread' +- orop(nil,true) true +- orop('abc',true) 'abc' +- orop(1.25,true) 1.25 +- orop(true,true) true +- orop(
,true) 'table' +- orop(,true) 'function' +- orop(,true) 'thread' +- orop(nil,
) 'table' +- orop('abc',
) 'abc' +- orop(1.25,
) 1.25 +- orop(true,
) true +- orop(
,
) 'table' +- orop(,
) 'function' +- orop(,
) 'thread' +- orop(nil,) 'function' +- orop('abc',) 'abc' +- orop(1.25,) 1.25 +- orop(true,) true +- orop(
,) 'table' +- orop(,) 'function' +- orop(,) 'thread' +- orop(nil,) 'thread' +- orop('abc',) 'abc' +- orop(1.25,) 1.25 +- orop(true,) true +- orop(
,) 'table' +- orop(,) 'function' +- orop(,) '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(
,10,2) ...'for' initial value must be a number... +- forop(,10,2) ...'for' initial value must be a number... +- forop(,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(
,'10.1',2) ...'for' initial value must be a number... +- forop(,'10.1',2) ...'for' initial value must be a number... +- forop(,'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(
,10,'2.1') ...'for' initial value must be a number... +- forop(,10,'2.1') ...'for' initial value must be a number... +- forop(,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(
,'10.1','2.1') ...'for' initial value must be a number... +- forop(,'10.1','2.1') ...'for' initial value must be a number... +- forop(,'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,
,2) ...'for' limit must be a number... +- forop('1.1',
,2) ...'for' limit must be a number... +- forop(1,,2) ...'for' limit must be a number... +- forop('1.1',,2) ...'for' limit must be a number... +- forop(1,,2) ...'for' limit must be a number... +- forop('1.1',,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,
,'2.1') ...'for' limit must be a number... +- forop('1.1',
,'2.1') ...'for' limit must be a number... +- forop(1,,'2.1') ...'for' limit must be a number... +- forop('1.1',,'2.1') ...'for' limit must be a number... +- forop(1,,'2.1') ...'for' limit must be a number... +- forop('1.1',,'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,
) ...'for' step must be a number... +- forop('1.1',10,
) ...'for' step must be a number... +- forop(1,'10.1',
) ...'for' step must be a number... +- forop('1.1','10.1',
) ...'for' step must be a number... +- forop(1,10,) ...'for' step must be a number... +- forop('1.1',10,) ...'for' step must be a number... +- forop(1,'10.1',) ...'for' step must be a number... +- forop('1.1','10.1',) ...'for' step must be a number... +- forop(1,10,) ...'for' step must be a number... +- forop('1.1',10,) ...'for' step must be a number... +- forop(1,'10.1',) ...'for' step must be a number... +- forop('1.1','10.1',) ...'for' step must be a number... diff --git a/luaj-test/src/test/resources/errors/seektest.txt b/luaj-test/src/test/resources/errors/seektest.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/luaj-test/src/test/resources/errors/stringlibargs.out b/luaj-test/src/test/resources/errors/stringlibargs.out new file mode 100644 index 00000000..d02c7bd1 Binary files /dev/null and b/luaj-test/src/test/resources/errors/stringlibargs.out differ diff --git a/luaj-test/src/test/resources/errors/tablelibargs.out b/luaj-test/src/test/resources/errors/tablelibargs.out new file mode 100644 index 00000000..8b881a67 --- /dev/null +++ b/luaj-test/src/test/resources/errors/tablelibargs.out @@ -0,0 +1,283 @@ +====== table.concat ====== +--- checkallpass +- table.concat(
) '87654321' +--- checkallpass +- table.concat(
,',') '8,7,6,5,4,3,2,1' +- table.concat(
,1.23) '81.2371.2361.2351.2341.2331.2321.231' +--- checkallpass +- table.concat(
,'-',2) '7-6-5-4-3-2-1' +- table.concat(
,'-','2') '7-6-5-4-3-2-1' +- table.concat(
,'-','2.2') '7-6-5-4-3-2-1' +--- checkallpass +- table.concat(
,'-',2,4) '7-6-5' +- table.concat(
,'-',2,'4') '7-6-5' +- table.concat(
,'-',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() ...bad argument... +- table.concat() ...bad argument... +--- checkallerrors +- table.concat(
) ...boolean... +--- checkallerrors +- table.concat(
,true) ...bad argument... +- table.concat(
,
) ...bad argument... +- table.concat(
,) ...bad argument... +--- checkallerrors +- table.concat(
,'-','abc') ...bad argument... +- table.concat(
,'-',true) ...bad argument... +- table.concat(
,'-',
) ...bad argument... +- table.concat(
,'-',) ...bad argument... +--- checkallerrors +- table.concat(
,'-',2,'abc') ...bad argument... +- table.concat(
,'-',2,true) ...bad argument... +- table.concat(
,'-',2,
) ...bad argument... +- table.concat(
,'-',2,) ...bad argument... +====== table.insert ====== +--- checkallpass +- table.insert(
,'abc') +- table.insert(
,1.25) +- table.insert(
,true) +- table.insert(
,
) +- table.insert(
,) +- table.insert(
,) +--- checkallpass +- table.insert(
,2,'abc') +- table.insert(
,'2','abc') +- table.insert(
,'2.2','abc') +- table.insert(
,2,1.25) +- table.insert(
,'2',1.25) +- table.insert(
,'2.2',1.25) +- table.insert(
,2,true) +- table.insert(
,'2',true) +- table.insert(
,'2.2',true) +- table.insert(
,2,
) +- table.insert(
,'2',
) +- table.insert(
,'2.2',
) +- table.insert(
,2,) +- table.insert(
,'2',) +- table.insert(
,'2.2',) +- table.insert(
,2,) +- table.insert(
,'2',) +- table.insert(
,'2.2',) +--- 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(,'abc') ...bad argument... +- table.insert(,'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(,1.25) ...bad argument... +- table.insert(,1.25) ...bad argument... +--- checkallerrors +- table.insert(
,'abc','abc') ...bad argument... +- table.insert(
,true,'abc') ...bad argument... +- table.insert(
,
,'abc') ...bad argument... +- table.insert(
,,'abc') ...bad argument... +- table.insert(
,'abc',1.25) ...bad argument... +- table.insert(
,true,1.25) ...bad argument... +- table.insert(
,
,1.25) ...bad argument... +- table.insert(
,,1.25) ...bad argument... +- table.insert(
,'abc',true) ...bad argument... +- table.insert(
,true,true) ...bad argument... +- table.insert(
,
,true) ...bad argument... +- table.insert(
,,true) ...bad argument... +- table.insert(
,'abc',
) ...bad argument... +- table.insert(
,true,
) ...bad argument... +- table.insert(
,
,
) ...bad argument... +- table.insert(
,,
) ...bad argument... +- table.insert(
,'abc',) ...bad argument... +- table.insert(
,true,) ...bad argument... +- table.insert(
,
,) ...bad argument... +- table.insert(
,,) ...bad argument... +- table.insert(
,'abc',) ...bad argument... +- table.insert(
,true,) ...bad argument... +- table.insert(
,
,) ...bad argument... +- table.insert(
,,) ...bad argument... +====== table.remove ====== +--- checkallpass +- table.remove(
) +--- checkallpass +- table.remove(
,2) +- table.remove(
,'2') +- table.remove(
,'2.2') +--- checkallerrors +- table.remove(nil) ...bad argument... +- table.remove('abc') ...bad argument... +- table.remove(1.25) ...bad argument... +- table.remove(true) ...bad argument... +- table.remove() ...bad argument... +- table.remove() ...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(,2) ...bad argument... +- table.remove(,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(,'2') ...bad argument... +- table.remove(,'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(,'2.2') ...bad argument... +- table.remove(,'2.2') ...bad argument... +--- checkallerrors +- table.remove(
,'abc') ...bad argument... +- table.remove(
,true) ...bad argument... +- table.remove(
,
) ...bad argument... +- table.remove(
,) ...bad argument... +====== table.sort ====== +--- checkallpass +- table.sort(
,nil) +- table.sort(
,) +--- checkallerrors +- table.sort(
) ...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(,nil) ...bad argument... +- table.sort(,nil) ...bad argument... +- table.sort(nil,) ...bad argument... +- table.sort('abc',) ...bad argument... +- table.sort(1.25,) ...bad argument... +- table.sort(true,) ...bad argument... +- table.sort(,) ...bad argument... +- table.sort(,) ...bad argument... +--- checkallerrors +- table.sort(
,'abc') ...bad argument... +- table.sort(
,1.25) ...bad argument... +- table.sort(
,true) ...bad argument... +- table.sort(
,
) ...bad argument... +====== table_get - tbl[key] ====== +--- checkallpass +- table_get(
,nil) +- table_get(
,'abc') +- table_get(
,1.25) +- table_get(
,true) +- table_get(
,
) +- table_get(
,) +- table_get(
,) +====== table_set - tbl[key]=val ====== +--- checkallpass +- table_set(
,'abc',nil) +- table_set(
,1.25,nil) +- table_set(
,true,nil) +- table_set(
,
,nil) +- table_set(
,,nil) +- table_set(
,,nil) +- table_set(
,'abc','abc') +- table_set(
,1.25,'abc') +- table_set(
,true,'abc') +- table_set(
,
,'abc') +- table_set(
,,'abc') +- table_set(
,,'abc') +- table_set(
,'abc',1.25) +- table_set(
,1.25,1.25) +- table_set(
,true,1.25) +- table_set(
,
,1.25) +- table_set(
,,1.25) +- table_set(
,,1.25) +- table_set(
,'abc',true) +- table_set(
,1.25,true) +- table_set(
,true,true) +- table_set(
,
,true) +- table_set(
,,true) +- table_set(
,,true) +- table_set(
,'abc',
) +- table_set(
,1.25,
) +- table_set(
,true,
) +- table_set(
,
,
) +- table_set(
,,
) +- table_set(
,,
) +- table_set(
,'abc',) +- table_set(
,1.25,) +- table_set(
,true,) +- table_set(
,
,) +- table_set(
,,) +- table_set(
,,) +- table_set(
,'abc',) +- table_set(
,1.25,) +- table_set(
,true,) +- table_set(
,
,) +- table_set(
,,) +- table_set(
,,) +--- checkallerrors +- table_set_nil_key(
,nil) ...table index... +- table_set_nil_key(
,'abc') ...table index... +- table_set_nil_key(
,1.25) ...table index... +- table_set_nil_key(
,true) ...table index... +- table_set_nil_key(
,
) ...table index... +- table_set_nil_key(
,) ...table index... +- table_set_nil_key(
,) ...table index... +====== table.unpack ====== +--- checkallpass +- table.unpack(
) 'abc',,,,
,
,
,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,
, +--- checkallpass +- table.unpack(
,3) ,,
,
,
,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,
, +- table.unpack(
,'5')
,
,
,true,true,true,1.25,1.25,1.25,'abc','abc','abc',1.25,true,
, +--- checkallpass +- table.unpack(
,3,1.25) +- table.unpack(
,'5',1.25) +- table.unpack(
,3,'7') ,,
,
,
+- table.unpack(
,'5','7')
,
,
+--- 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(,1.25,1.25) ...bad argument... +- table.unpack(,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(,'789',1.25) ...bad argument... +- table.unpack(,'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(,1.25,'789') ...bad argument... +- table.unpack(,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(,'789','789') ...bad argument... +- table.unpack(,'789','789') ...bad argument... +--- checkallerrors +- table.unpack(
,'abc',1.25) ...bad argument... +- table.unpack(
,true,1.25) ...bad argument... +- table.unpack(
,
,1.25) ...bad argument... +- table.unpack(
,,1.25) ...bad argument... +- table.unpack(
,,1.25) ...bad argument... +- table.unpack(
,'abc','789') ...bad argument... +- table.unpack(
,true,'789') ...bad argument... +- table.unpack(
,
,'789') ...bad argument... +- table.unpack(
,,'789') ...bad argument... +- table.unpack(
,,'789') ...bad argument... +--- checkallerrors +- table.unpack(
,1.25,'abc') ...bad argument... +- table.unpack(
,'789','abc') ...bad argument... +- table.unpack(
,1.25,true) ...bad argument... +- table.unpack(
,'789',true) ...bad argument... +- table.unpack(
,1.25,
) ...bad argument... +- table.unpack(
,'789',
) ...bad argument... +- table.unpack(
,1.25,) ...bad argument... +- table.unpack(
,'789',) ...bad argument... +- table.unpack(
,1.25,) ...bad argument... +- table.unpack(
,'789',) ...bad argument... diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/all.lc b/luaj-test/src/test/resources/lua5.2.1-tests/all.lc new file mode 100644 index 00000000..99bea580 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/all.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/all.lua b/luaj-test/src/test/resources/lua5.2.1-tests/all.lua new file mode 100644 index 00000000..99a70649 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/all.lua @@ -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)) diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/api.lc b/luaj-test/src/test/resources/lua5.2.1-tests/api.lc new file mode 100644 index 00000000..ba78d8c5 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/api.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/api.lua b/luaj-test/src/test/resources/lua5.2.1-tests/api.lua new file mode 100644 index 00000000..a367fc8f --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/api.lua @@ -0,0 +1,1009 @@ + +if T==nil then + (Message or print)('\a\n >>> testC not active: skipping API tests <<<\n\a') + return +end + +local debug = require "debug" + +local pack = table.pack + + +function tcheck (t1, t2) + assert(t1.n == (t2.n or #t2) + 1) + for i = 2, t1.n do assert(t1[i] == t2[i - 1]) end +end + + +print('testing C API') + +a = T.testC("pushvalue R; return 1") +assert(a == debug.getregistry()) + + +-- absindex +assert(T.testC("settop 10; absindex -1; return 1") == 10) +assert(T.testC("settop 5; absindex -5; return 1") == 1) +assert(T.testC("settop 10; absindex 1; return 1") == 1) +assert(T.testC("settop 10; absindex R; return 1") < -10) + +-- testing allignment +a = T.d2s(12458954321123) +assert(string.len(a) == 8) -- sizeof(double) +assert(T.s2d(a) == 12458954321123) + +a,b,c = T.testC("pushnum 1; pushnum 2; pushnum 3; return 2") +assert(a == 2 and b == 3 and not c) + +f = T.makeCfunc("pushnum 1; pushnum 2; pushnum 3; return 2") +a,b,c = f() +assert(a == 2 and b == 3 and not c) + +-- test that all trues are equal +a,b,c = T.testC("pushbool 1; pushbool 2; pushbool 0; return 3") +assert(a == b and a == true and c == false) +a,b,c = T.testC"pushbool 0; pushbool 10; pushnil;\ + tobool -3; tobool -3; tobool -3; return 3" +assert(a==false and b==true and c==false) + + +a,b,c = T.testC("gettop; return 2", 10, 20, 30, 40) +assert(a == 40 and b == 5 and not c) + +t = pack(T.testC("settop 5; gettop; return .", 2, 3)) +tcheck(t, {n=4,2,3}) + +t = pack(T.testC("settop 0; settop 15; return 10", 3, 1, 23)) +assert(t.n == 10 and t[1] == nil and t[10] == nil) + +t = pack(T.testC("remove -2; gettop; return .", 2, 3, 4)) +tcheck(t, {n=2,2,4}) + +t = pack(T.testC("insert -1; gettop; return .", 2, 3)) +tcheck(t, {n=2,2,3}) + +t = pack(T.testC("insert 3; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=4,2,5,3,4}) + +t = pack(T.testC("replace 2; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=3,5,3,4}) + +t = pack(T.testC("replace -2; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=3,2,3,5}) + +t = pack(T.testC("remove 3; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=3,2,4,5}) + +t = pack(T.testC("copy 3 4; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=4,2,3,3,5}) + +t = pack(T.testC("copy -3 -1; gettop; return .", 2, 3, 4, 5)) +tcheck(t, {n=4,2,3,4,3}) + + + + +t = pack(T.testC("insert 3; pushvalue 3; remove 3; pushvalue 2; remove 2; \ + insert 2; pushvalue 1; remove 1; insert 1; \ + insert -2; pushvalue -2; remove -3; gettop; return .", + 2, 3, 4, 5, 10, 40, 90)) +tcheck(t, {n=7,2,3,4,5,10,40,90}) + +t = pack(T.testC("concat 5; gettop; return .", "alo", 2, 3, "joao", 12)) +tcheck(t, {n=1,"alo23joao12"}) + +-- testing MULTRET +t = pack(T.testC("call 2,-1; gettop; return .", + function (a,b) return 1,2,3,4,a,b end, "alo", "joao")) +tcheck(t, {n=6,1,2,3,4,"alo", "joao"}) + +do -- test returning more results than fit in the caller stack + local a = {} + for i=1,1000 do a[i] = true end; a[999] = 10 + local b = T.testC([[pcall 1 -1; pop 1; tostring -1; return 1]], + table.unpack, a) + assert(b == "10") +end + + +-- testing globals +_G.a = 14; _G.b = "a31" +local a = {T.testC[[ + getglobal a; + getglobal b; + getglobal b; + setglobal a; + gettop; + return . +]]} +assert(a[2] == 14 and a[3] == "a31" and a[4] == nil and _G.a == "a31") + + +-- testing arith +assert(T.testC("pushnum 10; pushnum 20; arith /; return 1") == 0.5) +assert(T.testC("pushnum 10; pushnum 20; arith -; return 1") == -10) +assert(T.testC("pushnum 10; pushnum -20; arith *; return 1") == -200) +assert(T.testC("pushnum 10; pushnum 3; arith ^; return 1") == 1000) +assert(T.testC("pushnum 10; pushstring 20; arith /; return 1") == 0.5) +assert(T.testC("pushstring 10; pushnum 20; arith -; return 1") == -10) +assert(T.testC("pushstring 10; pushstring -20; arith *; return 1") == -200) +assert(T.testC("pushstring 10; pushstring 3; arith ^; return 1") == 1000) +a,b,c = T.testC([[pushnum 1; + pushstring 10; arith _; + pushstring 5; return 3]]) +assert(a == 1 and b == -10 and c == "5") +mt = {__add = function (a,b) return setmetatable({a[1] + b[1]}, mt) end, + __mod = function (a,b) return setmetatable({a[1] % b[1]}, mt) end, + __unm = function (a) return setmetatable({a[1]* 2}, mt) end} +a,b,c = setmetatable({4}, mt), + setmetatable({8}, mt), + setmetatable({-3}, mt) +x,y,z = T.testC("arith +; return 2", 10, a, b) +assert(x == 10 and y[1] == 12 and z == nil) +assert(T.testC("arith %; return 1", a, c)[1] == 4%-3) +assert(T.testC("arith _; arith +; arith %; return 1", b, a, c)[1] == + 8 % (4 + (-3)*2)) + + +-- testing compare +-- EQ = 0; LT = 1; LE = 2 + +-- testing lessthan and lessequal +assert(T.testC("compare 2 5 1, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare 2 5 2, return 1", 3, 2, 2, 4, 2, 2)) +assert(not T.testC("compare 3 4 1, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare 3 4 2, return 1", 3, 2, 2, 4, 2, 2)) +assert(T.testC("compare 5 2 1, return 1", 4, 2, 2, 3, 2, 2)) +assert(not T.testC("compare 2 -3 1, return 1", "4", "2", "2", "3", "2", "2")) +assert(not T.testC("compare -3 2 1, return 1", "3", "2", "2", "4", "2", "2")) + +-- non-valid indices produce false +assert(not T.testC("compare 1 4 1, return 1")) +assert(not T.testC("compare 9 1 2, return 1")) +assert(not T.testC("compare 9 9 0, return 1")) + +local b = {__lt = function (a,b) return a[1] < b[1] end} +local a1,a3,a4 = setmetatable({1}, b), + setmetatable({3}, b), + setmetatable({4}, b) +assert(T.testC("compare 2 5 1, return 1", a3, 2, 2, a4, 2, 2)) +assert(T.testC("compare 2 5 2, return 1", a3, 2, 2, a4, 2, 2)) +assert(T.testC("compare 5 -6 1, return 1", a4, 2, 2, a3, 2, 2)) +a,b = T.testC("compare 5 -6 1, return 2", a1, 2, 2, a3, 2, 20) +assert(a == 20 and b == false) +a,b = T.testC("compare 5 -6 2, return 2", a1, 2, 2, a3, 2, 20) +assert(a == 20 and b == false) +a,b = T.testC("compare 5 -6 2, return 2", a1, 2, 2, a1, 2, 20) +assert(a == 20 and b == true) + +-- testing length +local t = setmetatable({x = 20}, {__len = function (t) return t.x end}) +a,b,c = T.testC([[ + len 2; + Llen 2; + objsize 2; + return 3 +]], t) +assert(a == 20 and b == 20 and c == 0) + +t.x = "234"; t[1] = 20 +a,b,c = T.testC([[ + len 2; + Llen 2; + objsize 2; + return 3 +]], t) +assert(a == "234" and b == 234 and c == 1) + +t.x = print; t[1] = 20 +a,c = T.testC([[ + len 2; + objsize 2; + return 2 +]], t) +assert(a == print and c == 1) + + +-- testing __concat + +a = setmetatable({x="u"}, {__concat = function (a,b) return a.x..'.'..b.x end}) +x,y = T.testC([[ + pushnum 5 + pushvalue 2; + pushvalue 2; + concat 2; + pushvalue -2; + return 2; +]], a, a) +assert(x == a..a and y == 5) + +-- concat with 0 elements +assert(T.testC("concat 0; return 1") == "") + +-- concat with 1 element +assert(T.testC("concat 1; return 1", "xuxu") == "xuxu") + + + +-- testing lua_is + +function B(x) return x and 1 or 0 end + +function count (x, n) + n = n or 2 + local prog = [[ + isnumber %d; + isstring %d; + isfunction %d; + iscfunction %d; + istable %d; + isuserdata %d; + isnil %d; + isnull %d; + return 8 + ]] + prog = string.format(prog, n, n, n, n, n, n, n, n) + local a,b,c,d,e,f,g,h = T.testC(prog, x) + return B(a)+B(b)+B(c)+B(d)+B(e)+B(f)+B(g)+(100*B(h)) +end + +assert(count(3) == 2) +assert(count('alo') == 1) +assert(count('32') == 2) +assert(count({}) == 1) +assert(count(print) == 2) +assert(count(function () end) == 1) +assert(count(nil) == 1) +assert(count(io.stdin) == 1) +assert(count(nil, 15) == 100) + + +-- testing lua_to... + +function to (s, x, n) + n = n or 2 + return T.testC(string.format("%s %d; return 1", s, n), x) +end + +assert(to("tostring", {}) == nil) +assert(to("tostring", "alo") == "alo") +assert(to("tostring", 12) == "12") +assert(to("tostring", 12, 3) == nil) +assert(to("objsize", {}) == 0) +assert(to("objsize", {1,2,3}) == 3) +assert(to("objsize", "alo\0\0a") == 6) +assert(to("objsize", T.newuserdata(0)) == 0) +assert(to("objsize", T.newuserdata(101)) == 101) +assert(to("objsize", 124) == 0) +assert(to("objsize", true) == 0) +assert(to("tonumber", {}) == 0) +assert(to("tonumber", "12") == 12) +assert(to("tonumber", "s2") == 0) +assert(to("tonumber", 1, 20) == 0) +assert(to("topointer", 10) == 0) +assert(to("topointer", true) == 0) +assert(to("topointer", T.pushuserdata(20)) == 20) +assert(to("topointer", io.read) ~= 0) +assert(to("func2num", 20) == 0) +assert(to("func2num", T.pushuserdata(10)) == 0) +assert(to("func2num", io.read) ~= 0) +a = to("tocfunction", math.deg) +assert(a(3) == math.deg(3) and a == math.deg) + + + +-- testing deep C stack +do + collectgarbage("stop") + local s, msg = pcall(T.testC, "checkstack 1000023 XXXX") -- too deep + assert(not s and string.find(msg, "XXXX")) + s = string.rep("pushnil;checkstack 1 XX;", 1000000) + s, msg = pcall(T.testC, s) + assert(not s and string.find(msg, "XX")) + collectgarbage("restart") +end + +local prog = {"checkstack 30000 msg", "newtable"} +for i = 1,12000 do + prog[#prog + 1] = "pushnum " .. i + prog[#prog + 1] = "pushnum " .. i * 10 +end + +prog[#prog + 1] = "rawgeti R 2" -- get global table in registry +prog[#prog + 1] = "insert " .. -(2*12000 + 2) + +for i = 1,12000 do + prog[#prog + 1] = "settable " .. -(2*(12000 - i + 1) + 1) +end + +prog[#prog + 1] = "return 2" + +prog = table.concat(prog, ";") +local g, t = T.testC(prog) +assert(g == _G) +for i = 1,12000 do assert(t[i] == i*10); t[i] = nil end +assert(next(t) == nil) +prog, g, t = nil + +-- testing errors + +a = T.testC([[ + loadstring 2; pcall 0,1; + pushvalue 3; insert -2; pcall 1, 1; + pcall 0, 0; + return 1 +]], "x=150", function (a) assert(a==nil); return 3 end) + +assert(type(a) == 'string' and x == 150) + +function check3(p, ...) + local arg = {...} + assert(#arg == 3) + assert(string.find(arg[3], p)) +end +check3(":1:", T.testC("loadstring 2; gettop; return .", "x=")) +check3("cannot read", T.testC("loadfile 2; gettop; return .", ".")) +check3("cannot open xxxx", T.testC("loadfile 2; gettop; return .", "xxxx")) + +-- test errors in non protected threads +function checkerrnopro (code, msg) + L = coroutine.create(function () end) + local stt, err = pcall(T.testC, code) + assert(not stt and string.find(err, msg)) +end + +checkerrnopro("pushnum 3; call 0 0", "attempt to call") +function f () f() end +checkerrnopro("getglobal 'f'; call 0 0;", "stack overflow") + + +-- testing table access + +a = {x=0, y=12} +x, y = T.testC("gettable 2; pushvalue 4; gettable 2; return 2", + a, 3, "y", 4, "x") +assert(x == 0 and y == 12) +T.testC("settable -5", a, 3, 4, "x", 15) +assert(a.x == 15) +a[a] = print +x = T.testC("gettable 2; return 1", a) -- table and key are the same object! +assert(x == print) +T.testC("settable 2", a, "x") -- table and key are the same object! +assert(a[a] == "x") + +b = setmetatable({p = a}, {}) +getmetatable(b).__index = function (t, i) return t.p[i] end +k, x = T.testC("gettable 3, return 2", 4, b, 20, 35, "x") +assert(x == 15 and k == 35) +getmetatable(b).__index = function (t, i) return a[i] end +getmetatable(b).__newindex = function (t, i,v ) a[i] = v end +y = T.testC("insert 2; gettable -5; return 1", 2, 3, 4, "y", b) +assert(y == 12) +k = T.testC("settable -5, return 1", b, 3, 4, "x", 16) +assert(a.x == 16 and k == 4) +a[b] = 'xuxu' +y = T.testC("gettable 2, return 1", b) +assert(y == 'xuxu') +T.testC("settable 2", b, 19) +assert(a[b] == 19) + +-- testing next +a = {} +t = pack(T.testC("next; gettop; return .", a, nil)) +tcheck(t, {n=1,a}) +a = {a=3} +t = pack(T.testC("next; gettop; return .", a, nil)) +tcheck(t, {n=3,a,'a',3}) +t = pack(T.testC("next; pop 1; next; gettop; return .", a, nil)) +tcheck(t, {n=1,a}) + + + +-- testing upvalues + +do + local A = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] + t, b, c = A([[pushvalue U0; pushvalue U1; pushvalue U2; return 3]]) + assert(b == 10 and c == 20 and type(t) == 'table') + a, b = A([[tostring U3; tonumber U4; return 2]]) + assert(a == nil and b == 0) + A([[pushnum 100; pushnum 200; replace U2; replace U1]]) + b, c = A([[pushvalue U1; pushvalue U2; return 2]]) + assert(b == 100 and c == 200) + A([[replace U2; replace U1]], {x=1}, {x=2}) + b, c = A([[pushvalue U1; pushvalue U2; return 2]]) + assert(b.x == 1 and c.x == 2) + T.checkmemory() +end + + +-- testing absent upvalues from C-function pointers +assert(T.testC[[isnull U1; return 1]] == true) +assert(T.testC[[isnull U100; return 1]] == true) +assert(T.testC[[pushvalue U1; return 1]] == nil) + +local f = T.testC[[ pushnum 10; pushnum 20; pushcclosure 2; return 1]] +assert(T.upvalue(f, 1) == 10 and + T.upvalue(f, 2) == 20 and + T.upvalue(f, 3) == nil) +T.upvalue(f, 2, "xuxu") +assert(T.upvalue(f, 2) == "xuxu") + + +-- large closures +do + local A = "checkstack 300 msg;" .. + string.rep("pushnum 10;", 255) .. + "pushcclosure 255; return 1" + A = T.testC(A) + for i=1,255 do + assert(A(("pushvalue U%d; return 1"):format(i)) == 10) + end + assert(A("isnull U256; return 1")) + assert(not A("isnil U256; return 1")) +end + + + +-- bug in 5.1.2 +assert(not pcall(debug.setuservalue, 3, {})) +assert(not pcall(debug.setuservalue, nil, {})) +assert(not pcall(debug.setuservalue, T.pushuserdata(1), {})) + +local b = T.newuserdata(0) +local a = {} +assert(debug.getuservalue(b) == nil) +assert(debug.setuservalue(b, a)) +assert(debug.getuservalue(b) == a) +assert(debug.setuservalue(b, nil)) +assert(debug.getuservalue(b) == nil) + +assert(debug.getuservalue(4) == nil) + + + +-- testing locks (refs) + +-- reuse of references +local i = T.ref{} +T.unref(i) +assert(T.ref{} == i) + +Arr = {} +Lim = 100 +for i=1,Lim do -- lock many objects + Arr[i] = T.ref({}) +end + +assert(T.ref(nil) == -1 and T.getref(-1) == nil) +T.unref(-1); T.unref(-1) + +for i=1,Lim do -- unlock all them + T.unref(Arr[i]) +end + +function printlocks () + local f = T.makeCfunc("gettable R; return 1") + local n = f("n") + print("n", n) + for i=0,n do + print(i, f(i)) + end +end + + +for i=1,Lim do -- lock many objects + Arr[i] = T.ref({}) +end + +for i=1,Lim,2 do -- unlock half of them + T.unref(Arr[i]) +end + +assert(type(T.getref(Arr[2])) == 'table') + + +assert(T.getref(-1) == nil) + + +a = T.ref({}) + +collectgarbage() + +assert(type(T.getref(a)) == 'table') + + +-- colect in cl the `val' of all collected userdata +tt = {} +cl = {n=0} +A = nil; B = nil +local F +F = function (x) + local udval = T.udataval(x) + table.insert(cl, udval) + local d = T.newuserdata(100) -- cria lixo + d = nil + assert(debug.getmetatable(x).__gc == F) + assert(load("table.insert({}, {})"))() -- cria mais lixo + collectgarbage() -- forca coleta de lixo durante coleta! + assert(debug.getmetatable(x).__gc == F) -- coleta anterior nao melou isso? + local dummy = {} -- cria lixo durante coleta + if A ~= nil then + assert(type(A) == "userdata") + assert(T.udataval(A) == B) + debug.getmetatable(A) -- just acess it + end + A = x -- ressucita userdata + B = udval + return 1,2,3 +end +tt.__gc = F + +-- test whether udate collection frees memory in the right time +do + collectgarbage(); + collectgarbage(); + local x = collectgarbage("count"); + local a = T.newuserdata(5001) + assert(T.testC("objsize 2; return 1", a) == 5001) + assert(collectgarbage("count") >= x+4) + a = nil + collectgarbage(); + assert(collectgarbage("count") <= x+1) + -- udata without finalizer + x = collectgarbage("count") + collectgarbage("stop") + for i=1,1000 do T.newuserdata(0) end + assert(collectgarbage("count") > x+10) + collectgarbage() + assert(collectgarbage("count") <= x+1) + -- udata with finalizer + x = collectgarbage("count") + collectgarbage() + collectgarbage("stop") + a = {__gc = function () end} + for i=1,1000 do debug.setmetatable(T.newuserdata(0), a) end + assert(collectgarbage("count") >= x+10) + collectgarbage() -- this collection only calls TM, without freeing memory + assert(collectgarbage("count") >= x+10) + collectgarbage() -- now frees memory + assert(collectgarbage("count") <= x+1) + collectgarbage("restart") +end + + +collectgarbage("stop") + +-- create 3 userdatas with tag `tt' +a = T.newuserdata(0); debug.setmetatable(a, tt); na = T.udataval(a) +b = T.newuserdata(0); debug.setmetatable(b, tt); nb = T.udataval(b) +c = T.newuserdata(0); debug.setmetatable(c, tt); nc = T.udataval(c) + +-- create userdata without meta table +x = T.newuserdata(4) +y = T.newuserdata(0) + +assert(not pcall(io.input, a)) +assert(not pcall(io.input, x)) + +assert(debug.getmetatable(x) == nil and debug.getmetatable(y) == nil) + +d=T.ref(a); +e=T.ref(b); +f=T.ref(c); +t = {T.getref(d), T.getref(e), T.getref(f)} +assert(t[1] == a and t[2] == b and t[3] == c) + +t=nil; a=nil; c=nil; +T.unref(e); T.unref(f) + +collectgarbage() + +-- check that unref objects have been collected +assert(#cl == 1 and cl[1] == nc) + +x = T.getref(d) +assert(type(x) == 'userdata' and debug.getmetatable(x) == tt) +x =nil +tt.b = b -- create cycle +tt=nil -- frees tt for GC +A = nil +b = nil +T.unref(d); +n5 = T.newuserdata(0) +debug.setmetatable(n5, {__gc=F}) +n5 = T.udataval(n5) +collectgarbage() +assert(#cl == 4) +-- check order of collection +assert(cl[2] == n5 and cl[3] == nb and cl[4] == na) + +collectgarbage"restart" + + +a, na = {}, {} +for i=30,1,-1 do + a[i] = T.newuserdata(0) + debug.setmetatable(a[i], {__gc=F}) + na[i] = T.udataval(a[i]) +end +cl = {} +a = nil; collectgarbage() +assert(#cl == 30) +for i=1,30 do assert(cl[i] == na[i]) end +na = nil + + +for i=2,Lim,2 do -- unlock the other half + T.unref(Arr[i]) +end + +x = T.newuserdata(41); debug.setmetatable(x, {__gc=F}) +assert(T.testC("objsize 2; return 1", x) == 41) +cl = {} +a = {[x] = 1} +x = T.udataval(x) +collectgarbage() +-- old `x' cannot be collected (`a' still uses it) +assert(#cl == 0) +for n in pairs(a) do a[n] = nil end +collectgarbage() +assert(#cl == 1 and cl[1] == x) -- old `x' must be collected + +-- testing lua_equal +assert(T.testC("compare 2 4 0; return 1", print, 1, print, 20)) +assert(T.testC("compare 3 2 0; return 1", 'alo', "alo")) +assert(T.testC("compare 2 3 0; return 1", nil, nil)) +assert(not T.testC("compare 2 3 0; return 1", {}, {})) +assert(not T.testC("compare 2 3 0; return 1")) +assert(not T.testC("compare 2 3 0; return 1", 3)) + +-- testing lua_equal with fallbacks +do + local map = {} + local t = {__eq = function (a,b) return map[a] == map[b] end} + local function f(x) + local u = T.newuserdata(0) + debug.setmetatable(u, t) + map[u] = x + return u + end + assert(f(10) == f(10)) + assert(f(10) ~= f(11)) + assert(T.testC("compare 2 3 0; return 1", f(10), f(10))) + assert(not T.testC("compare 2 3 0; return 1", f(10), f(20))) + t.__eq = nil + assert(f(10) ~= f(10)) +end + +print'+' + + + +-- testing changing hooks during hooks +_G.t = {} +T.sethook([[ + # set a line hook after 3 count hooks + sethook 4 0 ' + getglobal t; + pushvalue -3; append -2 + pushvalue -2; append -2 + ']], "c", 3) +local a = 1 -- counting +a = 1 -- counting +a = 1 -- count hook (set line hook) +a = 1 -- line hook +a = 1 -- line hook +debug.sethook() +t = _G.t +assert(t[1] == "line") +line = t[2] +assert(t[3] == "line" and t[4] == line + 1) +assert(t[5] == "line" and t[6] == line + 2) +assert(t[7] == nil) + + +------------------------------------------------------------------------- +do -- testing errors during GC + local a = {} + for i=1,20 do + a[i] = T.newuserdata(i) -- creates several udata + end + for i=1,20,2 do -- mark half of them to raise errors during GC + debug.setmetatable(a[i], {__gc = function (x) error("error inside gc") end}) + end + for i=2,20,2 do -- mark the other half to count and to create more garbage + debug.setmetatable(a[i], {__gc = function (x) load("A=A+1")() end}) + end + _G.A = 0 + a = 0 + while 1 do + local stat, msg = pcall(collectgarbage) + if stat then + break -- stop when no more errors + else + a = a + 1 + assert(string.find(msg, "__gc")) + end + end + assert(a == 10) -- number of errors + + assert(A == 10) -- number of normal collections +end +------------------------------------------------------------------------- +-- test for userdata vals +do + local a = {}; local lim = 30 + for i=0,lim do a[i] = T.pushuserdata(i) end + for i=0,lim do assert(T.udataval(a[i]) == i) end + for i=0,lim do assert(T.pushuserdata(i) == a[i]) end + for i=0,lim do a[a[i]] = i end + for i=0,lim do a[T.pushuserdata(i)] = i end + assert(type(tostring(a[1])) == "string") +end + + +------------------------------------------------------------------------- +-- testing multiple states +T.closestate(T.newstate()); +L1 = T.newstate() +assert(L1) + +assert(T.doremote(L1, "X='a'; return 'a'") == 'a') + + +assert(#pack(T.doremote(L1, "function f () return 'alo', 3 end; f()")) == 0) + +a, b = T.doremote(L1, "return f()") +assert(a == 'alo' and b == '3') + +T.doremote(L1, "_ERRORMESSAGE = nil") +-- error: `sin' is not defined +a, _, b = T.doremote(L1, "return sin(1)") +assert(a == nil and b == 2) -- 2 == run-time error + +-- error: syntax error +a, b, c = T.doremote(L1, "return a+") +assert(a == nil and c == 3 and type(b) == "string") -- 3 == syntax error + +T.loadlib(L1) +a, b, c = T.doremote(L1, [[ + string = require'string' + a = require'_G'; assert(a == _G and require("_G") == a) + io = require'io'; assert(type(io.read) == "function") + assert(require("io") == io) + a = require'table'; assert(type(a.insert) == "function") + a = require'debug'; assert(type(a.getlocal) == "function") + a = require'math'; assert(type(a.sin) == "function") + return string.sub('okinama', 1, 2) +]]) +assert(a == "ok") + +T.closestate(L1); + + +L1 = T.newstate() +T.loadlib(L1) +T.doremote(L1, "a = {}") +T.testC(L1, [[getglobal "a"; pushstring "x"; pushnum 1; + settable -3]]) +assert(T.doremote(L1, "return a.x") == "1") + +T.closestate(L1) + +L1 = nil + +print('+') + +------------------------------------------------------------------------- +-- testing memory limits +------------------------------------------------------------------------- +assert(not pcall(T.newuserdata, 2^32-4)) +collectgarbage() +T.totalmem(T.totalmem()+5000) -- set low memory limit (+5k) +assert(not pcall(load"local a={}; for i=1,100000 do a[i]=i end")) +T.totalmem(1000000000) -- restore high limit + +-- test memory errors; increase memory limit in small steps, so that +-- we get memory errors in different parts of a given task, up to there +-- is enough memory to complete the task without errors +function testamem (s, f) + collectgarbage(); collectgarbage() + local M = T.totalmem() + local oldM = M + local a,b = nil + while 1 do + M = M+7 -- increase memory limit in small steps + T.totalmem(M) + a, b = pcall(f) + T.totalmem(1000000000) -- restore high limit + if a and b then break end -- stop when no more errors + collectgarbage() + if not a and not -- `real' error? + (string.find(b, "memory") or string.find(b, "overflow")) then + error(b, 0) -- propagate it + end + end + print("\nlimit for " .. s .. ": " .. M-oldM) + return b +end + + +-- testing memory errors when creating a new state + +b = testamem("state creation", T.newstate) +T.closestate(b); -- close new state + + +-- testing threads + +-- get main thread from registry (at index LUA_RIDX_MAINTHREAD == 1) +mt = T.testC("rawgeti R 1; return 1") +assert(type(mt) == "thread" and coroutine.running() == mt) + + + +function expand (n,s) + if n==0 then return "" end + local e = string.rep("=", n) + return string.format("T.doonnewstack([%s[ %s;\n collectgarbage(); %s]%s])\n", + e, s, expand(n-1,s), e) +end + +G=0; collectgarbage(); a =collectgarbage("count") +load(expand(20,"G=G+1"))() +assert(G==20); collectgarbage(); -- assert(gcinfo() <= a+1) + +testamem("thread creation", function () + return T.doonnewstack("x=1") == 0 -- try to create thread +end) + + +-- testing memory x compiler + +testamem("loadstring", function () + return load("x=1") -- try to do load a string +end) + + +local testprog = [[ +local function foo () return end +local t = {"x"} +a = "aaa" +for i = 1, #t do a=a..t[i] end +return true +]] + +-- testing memory x dofile +_G.a = nil +local t =os.tmpname() +local f = assert(io.open(t, "w")) +f:write(testprog) +f:close() +testamem("dofile", function () + local a = loadfile(t) + return a and a() +end) +assert(os.remove(t)) +assert(_G.a == "aaax") + + +-- other generic tests + +testamem("string creation", function () + local a, b = string.gsub("alo alo", "(a)", function (x) return x..'b' end) + return (a == 'ablo ablo') +end) + +testamem("dump/undump", function () + local a = load(testprog) + local b = a and string.dump(a) + a = b and load(b) + return a and a() +end) + +local t = os.tmpname() +testamem("file creation", function () + local f = assert(io.open(t, 'w')) + assert (not io.open"nomenaoexistente") + io.close(f); + return not loadfile'nomenaoexistente' +end) +assert(os.remove(t)) + +testamem("table creation", function () + local a, lim = {}, 10 + for i=1,lim do a[i] = i; a[i..'a'] = {} end + return (type(a[lim..'a']) == 'table' and a[lim] == lim) +end) + +testamem("constructors", function () + local a = {10, 20, 30, 40, 50; a=1, b=2, c=3, d=4, e=5} + return (type(a) == 'table' and a.e == 5) +end) + +local a = 1 +close = nil +testamem("closure creation", function () + function close (b,c) + return function (x) return a+b+c+x end + end + return (close(2,3)(4) == 10) +end) + +testamem("coroutines", function () + local a = coroutine.wrap(function () + coroutine.yield(string.rep("a", 10)) + return {} + end) + assert(string.len(a()) == 10) + return a() +end) + +print'+' + +-- testing some auxlib functions +local function gsub (a, b, c) + a, b = T.testC("gsub 2 3 4; gettop; return 2", a, b, c) + assert(b == 5) + return a +end + +assert(gsub("alo.alo.uhuh.", ".", "//") == "alo//alo//uhuh//") +assert(gsub("alo.alo.uhuh.", "alo", "//") == "//.//.uhuh.") +assert(gsub("", "alo", "//") == "") +assert(gsub("...", ".", "/.") == "/././.") +assert(gsub("...", "...", "") == "") + + +-- testing luaL_newmetatable +local mt_xuxu, res, top = T.testC("newmetatable xuxu; gettop; return 3") +assert(type(mt_xuxu) == "table" and res and top == 3) +local d, res, top = T.testC("newmetatable xuxu; gettop; return 3") +assert(mt_xuxu == d and not res and top == 3) +d, res, top = T.testC("newmetatable xuxu1; gettop; return 3") +assert(mt_xuxu ~= d and res and top == 3) + +x = T.newuserdata(0); +y = T.newuserdata(0); +T.testC("pushstring xuxu; gettable R; setmetatable 2", x) +assert(getmetatable(x) == mt_xuxu) + +-- testing luaL_testudata +-- correct metatable +local res1, res2, top = T.testC([[testudata -1 xuxu + testudata 2 xuxu + gettop + return 3]], x) +assert(res1 and res2 and top == 4) + +-- wrong metatable +res1, res2, top = T.testC([[testudata -1 xuxu1 + testudata 2 xuxu1 + gettop + return 3]], x) +assert(not res1 and not res2 and top == 4) + +-- non-existent type +res1, res2, top = T.testC([[testudata -1 xuxu2 + testudata 2 xuxu2 + gettop + return 3]], x) +assert(not res1 and not res2 and top == 4) + +-- userdata has no metatable +res1, res2, top = T.testC([[testudata -1 xuxu + testudata 2 xuxu + gettop + return 3]], y) +assert(not res1 and not res2 and top == 4) + +-- erase metatables +do + local r = debug.getregistry() + assert(r.xuxu == mt_xuxu and r.xuxu1 == d) + r.xuxu = nil; r.xuxu1 = nil +end + +print'OK' + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc new file mode 100644 index 00000000..726086dd Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua new file mode 100644 index 00000000..91c2062f --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/attrib.lua @@ -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(ab == 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 + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/big.lc b/luaj-test/src/test/resources/lua5.2.1-tests/big.lc new file mode 100644 index 00000000..6e1829ff Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/big.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/big.lua b/luaj-test/src/test/resources/lua5.2.1-tests/big.lua new file mode 100644 index 00000000..0c8ab201 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/big.lua @@ -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' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc new file mode 100644 index 00000000..d04721a5 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua new file mode 100644 index 00000000..afa158dd --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/bitwise.lua @@ -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' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/calls.lc b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lc new file mode 100644 index 00000000..66a70f3a Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/calls.lua b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lua new file mode 100644 index 00000000..5750ab57 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/calls.lua @@ -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" 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 + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/closure.lc b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lc new file mode 100644 index 00000000..d593f9bd Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/closure.lua b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lua new file mode 100644 index 00000000..738002d2 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/closure.lua @@ -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' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/code.lc b/luaj-test/src/test/resources/lua5.2.1-tests/code.lc new file mode 100644 index 00000000..0fcbe9b8 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/code.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/code.lua b/luaj-test/src/test/resources/lua5.2.1-tests/code.lua new file mode 100644 index 00000000..a0317c55 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/code.lua @@ -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' + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc new file mode 100644 index 00000000..45770976 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua new file mode 100644 index 00000000..6dd77fe2 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/constructs.lua @@ -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' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc new file mode 100644 index 00000000..5118be03 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua new file mode 100644 index 00000000..85086e58 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/coroutine.lua @@ -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' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/db.lc b/luaj-test/src/test/resources/lua5.2.1-tests/db.lc new file mode 100644 index 00000000..258b971b Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/db.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/db.lua b/luaj-test/src/test/resources/lua5.2.1-tests/db.lua new file mode 100644 index 00000000..d3d8c25b --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/db.lua @@ -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" + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/errors.lc b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lc new file mode 100644 index 00000000..92060185 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/errors.lua b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lua new file mode 100644 index 00000000..6d91bdc0 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/errors.lua @@ -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)", "", 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') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/events.lc b/luaj-test/src/test/resources/lua5.2.1-tests/events.lc new file mode 100644 index 00000000..928b4945 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/events.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/events.lua b/luaj-test/src/test/resources/lua5.2.1-tests/events.lua new file mode 100644 index 00000000..b3e5c412 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/events.lua @@ -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 aOp(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 + + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/files.lc b/luaj-test/src/test/resources/lua5.2.1-tests/files.lc new file mode 100644 index 00000000..7deb98d0 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/files.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/files.lua b/luaj-test/src/test/resources/lua5.2.1-tests/files.lua new file mode 100644 index 00000000..0793ec6d --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/files.lua @@ -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)) + + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/gc.lc b/luaj-test/src/test/resources/lua5.2.1-tests/gc.lc new file mode 100644 index 00000000..c07f63d1 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/gc.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/gc.lua b/luaj-test/src/test/resources/lua5.2.1-tests/gc.lua new file mode 100644 index 00000000..8f69c716 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/gc.lua @@ -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') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/goto.lc b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lc new file mode 100644 index 00000000..d12fde70 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/goto.lua b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lua new file mode 100644 index 00000000..d8817156 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/goto.lua @@ -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' diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/literals.lc b/luaj-test/src/test/resources/lua5.2.1-tests/literals.lc new file mode 100644 index 00000000..f7ade8b1 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/literals.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/literals.lua b/luaj-test/src/test/resources/lua5.2.1-tests/literals.lua new file mode 100644 index 00000000..36e2fcf4 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/literals.lua @@ -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 ~= '' 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]]", "") +lexerror("[=[alo]=", "") +lexerror("[=[alo]", "") +lexerror("'alo", "") +lexerror("'alo \\z \n\n", "") +lexerror("'alo \\z", "") +lexerror([['alo \98]], "") + +-- 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') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/locals.lc b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lc new file mode 100644 index 00000000..a1c7e088 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/locals.lua b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lua new file mode 100644 index 00000000..a290e5bc --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/locals.lua @@ -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 + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/main.lc b/luaj-test/src/test/resources/lua5.2.1-tests/main.lc new file mode 100644 index 00000000..f22684fb Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/main.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/main.lua b/luaj-test/src/test/resources/lua5.2.1-tests/main.lua new file mode 100644 index 00000000..fa6bf0e2 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/main.lua @@ -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") diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/math.lc b/luaj-test/src/test/resources/lua5.2.1-tests/math.lc new file mode 100644 index 00000000..2d2b7234 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/math.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/math.lua b/luaj-test/src/test/resources/lua5.2.1-tests/math.lua new file mode 100644 index 00000000..9599209c --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/math.lua @@ -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') diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc b/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc new file mode 100644 index 00000000..a66b5a7a Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lua b/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lua new file mode 100644 index 00000000..c48713e7 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/nextvar.lua @@ -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" diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/pm.lc b/luaj-test/src/test/resources/lua5.2.1-tests/pm.lc new file mode 100644 index 00000000..336d94ce Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/pm.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/pm.lua b/luaj-test/src/test/resources/lua5.2.1-tests/pm.lua new file mode 100644 index 00000000..f3b46bc4 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/pm.lua @@ -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') + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/sort.lc b/luaj-test/src/test/resources/lua5.2.1-tests/sort.lc new file mode 100644 index 00000000..d68d066b Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/sort.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/sort.lua b/luaj-test/src/test/resources/lua5.2.1-tests/sort.lua new file mode 100644 index 00000000..41b865c5 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/sort.lua @@ -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 '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') + + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc b/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc new file mode 100644 index 00000000..e2c7b378 Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lua b/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lua new file mode 100644 index 00000000..a9865207 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/vararg.lua @@ -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') + diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lc b/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lc new file mode 100644 index 00000000..12e1921f Binary files /dev/null and b/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lc differ diff --git a/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua b/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua new file mode 100644 index 00000000..69007482 --- /dev/null +++ b/luaj-test/src/test/resources/lua5.2.1-tests/verybig.lua @@ -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 + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/baselib.lua b/luaj-test/src/test/resources/luaj3.0-tests/baselib.lua new file mode 100644 index 00000000..96c50ce8 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/baselib.lua @@ -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) ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua b/luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua new file mode 100644 index 00000000..468dc1f7 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/coroutinelib.lua @@ -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 diff --git a/luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua b/luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua new file mode 100644 index 00000000..11894486 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/debuglib.lua @@ -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 diff --git a/luaj-test/src/test/resources/luaj3.0-tests/errors.lua b/luaj-test/src/test/resources/luaj3.0-tests/errors.lua new file mode 100644 index 00000000..3ed06c2e --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/errors.lua @@ -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) ) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/functions.lua b/luaj-test/src/test/resources/luaj3.0-tests/functions.lua new file mode 100644 index 00000000..e55f0357 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/functions.lua @@ -0,0 +1,74 @@ + +function f0() print( "f0:" ) end +function f1(a) print( "f1:", a ) end +function f2(a,b) print( "f2:", a, b ) end +function f3(a,b,c) print( "f3:", a, b, c ) end +function f4(a,b,c,d) print( "f4:", a, b, c, d ) end + +f0() f0( "a1/1" ) f0( "a1/2", "a2/2" ) f0( "a1/3", "a2/3", "a3/3" ) f0( "a1/4", "a2/4", "a3/4", "a4/4" ) +f1() f1( "a1/1" ) f1( "a1/2", "a2/2" ) f1( "a1/3", "a2/3", "a3/3" ) f1( "a1/4", "a2/4", "a3/4", "a4/4" ) +f2() f2( "a1/1" ) f2( "a1/2", "a2/2" ) f2( "a1/3", "a2/3", "a3/3" ) f2( "a1/4", "a2/4", "a3/4", "a4/4" ) +f3() f3( "a1/1" ) f3( "a1/2", "a2/2" ) f3( "a1/3", "a2/3", "a3/3" ) f3( "a1/4", "a2/4", "a3/4", "a4/4" ) +f4() f4( "a1/1" ) f4( "a1/2", "a2/2" ) f4( "a1/3", "a2/3", "a3/3" ) f4( "a1/4", "a2/4", "a3/4", "a4/4" ) + +function g0(a,b,c,d) return end +function g1(a,b,c,d) return d end +function g2(a,b,c,d) return c, d end +function g3(a,b,c,d) return b, c, d end +function g4(a,b,c,d) return a, b, c, d end + +z = g0("c0.1/4", "c0.2/4", "c0.3/4", "c0.4/4") +print( "z0:", z ) +z = g2("c2.1/4", "c2.2/4", "c2.3/4", "c2.4/4") +print( "z2:", z ) +z = g4("c4.1/4", "c4.2/4", "c4.3/4", "c4.4/4") +print( "z4:", z ) + +a,b,c,d = g0( "c0.1/4", "c0.2/4", "c0.3/4", "c0.4/4" ) +print( "g0:", a, b, c, d, "(eol)" ) +a,b,c,d = g2( "b2.1/4", "b2.2/4", "b2.3/4", "b2.4/4" ) +print( "g2:", a, b, c, d, "(eol)" ) +a,b,c,d = g4( "b4.1/4", "b4.2/4", "b4.3/4", "b4.4/4" ) +print( "g4:", a, b, c, d, "(eol)" ) + +function func(a,b,c) + return a, b, c +end + +print( func(11, 12, 13) ) +print( func(23, 22, 21) ) +print( func(func(32,33,34), func(45,46,47), func(58,59,50)) ) + +function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +p() +p("q") +p("q","r") +p("q","r","s") + +-- tail call tests +function first(...) + return 'abc', ..., '|', ... +end + +function second(a,...) + return 'def', ..., '|', a, ... +end + +function third( a, b, c ) + print( 'third', first( a, b, c ) ) + print( 'third', second( a, b, c ) ) + return second( a, b, c ) +end + +print( 'third', third() ) +print( 'third', third('p') ) +print( 'third', third('p','q') ) +print( 'third', third('p','q','r') ) +print( 'third', third('p','q','r','s') ) +print( 'third', third() ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/iolib.lua b/luaj-test/src/test/resources/luaj3.0-tests/iolib.lua new file mode 100644 index 00000000..3264b704 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/iolib.lua @@ -0,0 +1,153 @@ +local platform = ... +print( 'platform', platform ) + +-- simple io-library tests +-- +-- C version on Windows will add change \n into \r\n for text files at least +-- +local tostr,files,nfiles = tostring,{},0 +tostring = function(x) + local s = tostr(x) + if s:sub(1,4) ~= 'file' then return s end + if files[s] then return files[s] end + files[s] = 'file.'..nfiles + nfiles = nfiles + 1 + return files[s] +end +print( io ~= nil ) +print( io.open ~= nil ) +print( io.stdin ~= nil ) +print( io.stdout ~= nil ) +print( io.stderr ~= nil ) +print( 'write', io.write() ) +print( 'write', io.write("This") ) +print( 'write', io.write(" is a pen.") ) +print( 'flush', io.flush() ) + +local f = io.open("abc.txt","w") +print( 'f', type(f) ) +print( io.type(f) ) +print( 'write', f:write("abcdef 12345 \t\t 678910 more\aaaaaaa\bbbbthe rest") ) +print( 'type(f)', io.type(f) ) +print( 'close', f:close() ) +print( 'type(f)', io.type(f) ) +print( 'type("f")', io.type("f") ) + +local g = io.open("abc.txt","r") +local t = { g:read(3, 3, "*n", "*n", "*l", "*l", "*a") } +for i,v in ipairs(t) do + print( string.format("%q",tostring(v)), type(v)) + print( '----- ', i ) +end + +local h,s = io.open("abc.txt", "a") +print( 'h', io.type(h), string.sub(tostring(h),1,6), s ) +print( 'write', h:write('and more and more and more text.') ) +print( 'close', h:close() ) + +if platform ~= 'JME' then + local j = io.open( "abc.txt", "r" ) + print( 'j', io.type(j) ) + print( 'seek', j:seek("set", 3) ) + print( 'read', j:read(4), j:read(3) ) + print( 'seek', j:seek("set", 2) ) + print( 'read', j:read(4), j:read(3) ) + print( 'seek', j:seek("cur", -8 ) ) + print( 'read', j:read(4), j:read(3) ) + print( 'seek(cur,0)', j:seek("cur",0) ) + print( 'seek(cur,20)', j:seek("cur",20) ) + print( 'seek(end,-5)', j:seek("end", -5) ) + print( 'read(4)', string.format("%q", tostring(j:read(4))) ) + print( 'read(4)', string.format("%q", tostring(j:read(4))) ) + print( 'read(4)', string.format("%q", tostring(j:read(4))) ) + print( 'close', j:close() ) +end + +-- write a few lines, including a non-terminating one +files = {} +f = io.open("abc.txt","w") +print( 'f.type', io.type(f) ) +print( 'f', f ) +print( 'write', f:write("line one\nline two\n\nafter blank line\nunterminated line") ) +print( 'type(f)', io.type(f) ) +print( 'close', f:close() ) +files = {} + +-- read using io.lines() +for l in io.lines("abc.txt") do + print( string.format('%q',l) ) +end +io.input("abc.txt") +for l in io.lines() do + print( string.format('%q',l) ) +end +io.input(io.open("abc.txt","r")) +for l in io.lines() do + print( string.format('%q',l) ) +end +io.input("abc.txt") +io.input(io.input()) +for l in io.lines() do + print( string.format('%q',l) ) +end + +local count = 0 +io.tmpfile = function() + count = count + 1 + return io.open("tmp"..count..".out","w") +end + +local a = io.tmpfile() +local b = io.tmpfile() +print( io.type(a) ) +print( io.type(b) ) +print( "a:write", a:write('aaaaaaa') ) +print( "b:write", b:write('bbbbbbb') ) +print( "a:setvbuf", a:setvbuf("no") ) +print( "a:setvbuf", a:setvbuf("full",1024) ) +print( "a:setvbuf", a:setvbuf("line") ) +print( "a:write", a:write('ccccc') ) +print( "b:write", b:write('ddddd') ) +print( "a:flush", a:flush() ) +print( "b:flush", b:flush() ) +--[[ +print( "a:read", a:read(7) ) +print( "b:read", b:read(7) ) +print( "a:seek", a:seek("cur",-4) ) +print( "b:seek", b:seek("cur",-4) ) +print( "a:read", ( a:read(7) ) ) +print( "b:read", ( b:read(7) ) ) +print( "a:seek", a:seek("cur",-8) ) +print( "b:seek", b:seek("cur",-8) ) +print( "a:read", ( a:read(7) ) ) +print( "b:read", ( b:read(7) ) ) +--]] + +local pcall = function(...) + local s,e = pcall(...) + if s then return s end + return s,e:match("closed") +end + +print( 'a:close', pcall( a.close, a ) ) +print( 'a:write', pcall( a.write, a, 'eee') ) +print( 'a:flush', pcall( a.flush, a) ) +print( 'a:read', pcall( a.read, a, 5) ) +print( 'a:lines', pcall( a.lines, a) ) +print( 'a:seek', pcall( a.seek, a, "cur", -2) ) +print( 'a:setvbuf', pcall( a.setvbuf, a, "no") ) +print( 'a:close', pcall( a.close, a ) ) +print( 'io.type(a)', pcall( io.type, a ) ) + +print( 'io.close()', pcall( io.close ) ) +print( 'io.close(io.output())', pcall( io.close, io.output() ) ) + +io.output('abc.txt') +print( 'io.close()', pcall( io.close ) ) +print( 'io.write', pcall( io.write, 'eee') ) +print( 'io.flush', pcall( io.flush) ) +print( 'io.close', pcall( io.close ) ) +io.input('abc.txt'):close() +print( 'io.read', pcall( io.read, 5) ) +print( 'io.lines', pcall( io.lines) ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua b/luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua new file mode 100644 index 00000000..e1ae06ce --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/manyupvals.lua @@ -0,0 +1,37 @@ +local t = {} +local template = [[ + local f + do + local result + function f() + if not result then + result = f() + f() + end + return result + end + end +]] +t[1] = [[ + local f1 + f1 = function() return 1 end +]] +t[2] = [[ + local f2 + f2 = function() return 1 end +]] +for i = 3, 199 do + t[i] = template:gsub("<([^>]+)>", function(s) + local c = assert(load('return '..s, 'f'..i, 'bt', { i = i }), 'could not compile: '..s) + return c() + end) +end +t[200] = [[ + print("5th fibonacci number is", f5()) + print("10th fibonacci number is", f10()) + print("199th fibonacci number is", f199()) +]] + +local s = table.concat(t) +print(s) +f = load(s) +f() diff --git a/luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua b/luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua new file mode 100644 index 00000000..5f14e6f6 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/mathlib.lua @@ -0,0 +1,239 @@ +local platform = ... +print( 'platform', platform ) + +local aliases = { + ['0']='', + ['-0']='', + ['nan']='', + ['inf']='', + ['-inf']='', + ['1.#INF']='', + ['-1.#INF']='', + ['1.#IND']='', + ['-1.#IND']='', +} + +local UNOPVALUES = { -2.5, -2, 0, 2, 2.5, "'-2.5'", "'-2'", "'0'", "'2'", "'2.5'" } + +local NUMBERPAIRS = { + { 2, 0 }, { -2.5, 0 }, { 2, 1 }, + { 5, 2 }, {-5, 2 }, {16, 2}, {-16, -2}, + { .5, 0}, {.5, 1}, {.5, 2}, {.5, -1}, {.5, 2}, + {2.25, 0}, {2.25, 2}, {-2, 0}, + { 3, 3 }, +} + +local STRINGPAIRS = { + { "'2'", "'0'" }, { "'2.5'","'3'" }, { "'-2'", "'1.5'" }, { "'-2.5'", "'-1.5'" }, + { "'3.0'", "'3.0'" }, { 2.75, 2.75 }, { "'2.75'", "'2.75'" }, +} + +local MIXEDPAIRS = { + { 3, "'3'" }, { "'3'", 3 }, { 2.75, "'2.75'" }, { "'2.75'", 2.75 }, + { -3, "'-4'" }, { "'-3'", 4 }, { -3, "'4'" }, { "'-3'", -4 }, + { -4.75, "'2.75'" }, { "'-2.75'", 1.75 }, { 4.75, "'-2.75'" }, { "'2.75'", -1.75 }, +} + +local BINOPVALUES = {} + +local RELATIONALOPVALUES = {} + +local function addall( t, s ) + for i,v in ipairs(s) do + t[#t+1] = v + end +end +addall( BINOPVALUES, NUMBERPAIRS ) +addall( BINOPVALUES, STRINGPAIRS ) +addall( BINOPVALUES, MIXEDPAIRS ) +addall( RELATIONALOPVALUES, NUMBERPAIRS ) +addall( RELATIONALOPVALUES, STRINGPAIRS ) + +local VARARGSVALUES = { + { 4, }, { -4.5 }, { "'5.5'" }, { "'-5'" }, + { 4, "'8'" }, { -4.5, "'-8'" }, { "'5.5'", 2.2 }, { "'-5'", -2.2 }, + { 111,222,333 }, { -222,-333,-111 }, { 444,-111,-222 }, +} + +local CONSTANTS = { + "huge", "pi", +} +local UNARYOPS = { + "-", "not ", +} +local BINARYOPS = { + "+", "-", "*", "^", "/", "%", +} +local RELATIONALS = { + "==", "~=", ">", "<", ">=", "<=", +} +local ONEARG_JME = { + "abs", "ceil", "cos", "deg", + "exp", "floor", "frexp", "modf", + "rad", "sin", "sqrt", "tan", +} +local ONEARG_JSE = { + "acos", "asin", "atan", "cosh", + "log", "sinh", "tanh", +} +local TWOARGS_JME = { + "fmod", "ldexp", "pow", +} +local TWOARGS_JSE = { + "atan2", +} +local VARARGSFUNCS = { + "max", "min", +} + +local ts = tostring +tostring = function(x) + local s = ts(x) + if type(x)~='number' then return s end + if aliases[s] then return aliases[s] end + if #s < 7 then return s end + local a,b = string.match(s,'([%-0-9%.]*)([eE]?[%-0-9]*)') + return a and (string.sub(a,1,6)..(b or '')) or s +end + +local function eval( expr, script ) + script = script or ('return '..expr) + local s,a,b = load( script, 'expr' ) + if s then print( expr, pcall( s ) ) + else print( expr, 'load:', a ) end +end + +-- misc tests +print( '---------- miscellaneous tests ----------' ) +eval( 'math.sin( 0.0 )' ) +eval( 'math.cos( math.pi )' ) +eval( 'math.sqrt( 9.0 )' ) +eval( 'math.modf( 5.25 )') +eval( 'math.frexp(0.00625)' ) +eval( '-5 ^ 2' ) +eval( '-5 / 2' ) +eval( '-5 % 2' ) + +-- constants +print( '---------- constants ----------' ) +for i,v in ipairs(CONSTANTS) do + eval( 'math.'..v ) +end + +-- unary operators +for i,v in ipairs(UNARYOPS) do + print( '---------- unary operator '..v..' ----------' ) + for j,a in ipairs(UNOPVALUES) do + eval( v..a, 'return '..v..a ) + end +end + +-- binary operators +for i,v in ipairs(BINARYOPS) do + print( '---------- binary operator '..v..' ----------' ) + for j,xy in ipairs(BINOPVALUES) do + eval( xy[1]..v..xy[2], + 'local x,y='..xy[1]..','..xy[2]..'; return x'..v..'y' ) + end +end + +-- relational operators +for i,v in ipairs(RELATIONALS) do + print( '---------- binary operator '..v..' ----------' ) + for j,xy in ipairs(RELATIONALOPVALUES) do + eval( xy[1]..v..xy[2], + 'local x,y='..xy[1]..','..xy[2]..'; return x'..v..'y' ) + end +end + +-- one-argument math functions +for i,v in ipairs(ONEARG_JME) do + print( '---------- math.'..v..' ----------' ) + for j,x in ipairs(UNOPVALUES) do + eval( 'math.'..v..'('..x..')' ) + end +end +if platform ~= 'JME' then + for i,v in ipairs(ONEARG_JSE) do + print( '---------- math.'..v..' (jse only) ----------' ) + for j,x in ipairs(UNOPVALUES) do + eval( 'math.'..v..'('..x..')' ) + end + end +end + +-- two-argument math functions +for i,v in ipairs(TWOARGS_JME) do + print( '---------- math.'..v..' ----------' ) + for j,x in ipairs(BINOPVALUES) do + eval( 'math.'..v..'('..x[1]..','..x[2]..')' ) + end +end +if platform ~= 'JME' then + for i,v in ipairs(TWOARGS_JSE) do + print( '---------- math.'..v..' (jse only) ----------' ) + for j,x in ipairs(BINOPVALUES) do + eval( 'math.'..v..'('..x[1]..','..x[2]..')' ) + end + end +end + +-- var-arg math functions +for i,v in ipairs(VARARGSFUNCS) do + print( '---------- math.'..v..' ----------' ) + for j,x in ipairs(VARARGSVALUES) do + eval( 'math.'..v..'('..table.concat(x,',')..')' ) + end +end + +-- random tests +print("----------- Random number tests") +local function testrandom(string,lo,hi) + local c,e = load('return '..string) + for i=1,5 do + local s,e = pcall(c) + if s then + print( string, s and type(e) or e, (e>=lo) and (e<=hi) ) + else + print( string, 'error', e ) + end + end +end +testrandom('math.random()',0,1) +testrandom('math.random(5,10)',5,10) +testrandom('math.random(30)',0,30) +testrandom('math.random(-4,-2)',-4,-2) +local t = {} +print( math.randomseed(20) ) +for i=1,20 do + t[i] = math.random() +end +print( '-- comparing new numbers') +for i=1,20 do + print( t[i] == math.random(), t[i] == t[0] ) +end +print( '-- resetting seed') + +print( math.randomseed(20) ) +for i=1,20 do + print( t[i] == math.random() ) +end + +-- tests involving -0, which is folded into 0 for luaj, but not for plain lua +print("----------- Tests involving -0 and NaN") +print('0 == -0', 0 == -0) +t = {[0] = 10, 20, 30, 40, 50} +print('t[-0] == t[0]',t[-0] == t[0]) +local x = -1 +local mz, z = 0/x, 0 -- minus zero, zero +print('mz, z', mz, z) +print('mz == z', mz == z) +local a = {[mz] = 1} +print('a[z] == 1 and a[mz] == 1', a[z] == 1 and a[mz] == 1) +-- 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) + +--]] diff --git a/luaj-test/src/test/resources/luaj3.0-tests/metatags.lua b/luaj-test/src/test/resources/luaj3.0-tests/metatags.lua new file mode 100644 index 00000000..676590be --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/metatags.lua @@ -0,0 +1,286 @@ +local anumber,bnumber = 111,23.45 +local astring,bstring = "abc","def" +local anumstr,bnumstr = tostring(anumber),tostring(bnumber) +local aboolean,bboolean = false,true +local afunction,bfunction = function() end, function() end +local athread,bthead = coroutine.create(afunction),coroutine.create(bfunction) +local atable,btable = {},{} +local values = { anumber, aboolean, afunction, athread, atable } +local groups +local ts = tostring +local tb,count = {},0 + +tostring = function(o) + local t = type(o) + if t~='thread' and t~='function' and t~='table' then return ts(o) end + if not tb[o] then + count = count + 1 + tb[o] = t..'.'..count + end + return tb[o] +end + +local buildop = function(name) + return function(a,b) + print( 'mt.__'..name..'()', a, b ) + return '__'..name..'-result' + end +end +local buildop3 = function(name) + return function(a,b,c) + print( 'mt.__'..name..'()', a, b, c ) + return '__'..name..'-result' + end +end +local buildop1 = function(name) + return function(a) + print( 'mt.__'..name..'()', a ) + return '__'..name..'-result' + end +end + +local mt = { + __call=buildop('call'), + __add=buildop('add'), + __sub=buildop('sub'), + __mul=buildop('mul'), + __div=buildop('div'), + __pow=buildop('pow'), + __mod=buildop('mod'), + __unm=buildop1('unm'), + __len=buildop1('len'), + __lt=buildop('lt'), + __le=buildop('le'), + __index=buildop('index'), + __newindex=buildop3('newindex'), + __concat=buildop('concat'), +} + +-- pcall a function and check for a pattern in the error string +ecall = function(pattern, ...) + local s,e = pcall(...) + if not s then e = string.match(e,pattern) or e end + return s,e +end + +print( '---- __eq same types' ) +local eqmt = { __eq=buildop('eq'), } +groups = { {nil,nil}, {true,false}, {123,456}, {11,5.5}, {afunction,bfunction}, {athread,bthread}, {astring,bstring}, {anumber,anumstr} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', pcall( function() return a==b end ) ) + print( type(a), type(b), 'before', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, eqmt ) ) + print( debug.setmetatable( b, eqmt ) ) + print( type(a), type(b), 'after', pcall( function() return a==b end ) ) + print( type(a), type(b), 'after', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __eq, tables - should invoke metatag comparison' ) +groups = { {atable,btable} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', pcall( function() return a==b end ) ) + print( type(a), type(b), 'before', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, eqmt ) ) + print( debug.setmetatable( b, eqmt ) ) + print( type(a), type(b), 'after-a', pcall( function() return a==b end ) ) + print( type(a), type(b), 'after-a', pcall( function() return a~=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + + +print( 'nilmt', debug.getmetatable(nil) ) +print( 'boolmt', debug.getmetatable(true) ) +print( 'number', debug.getmetatable(1) ) +print( 'function', debug.getmetatable(afunction) ) +print( 'thread', debug.getmetatable(athread) ) + +print( '---- __call' ) +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', ecall( 'attempt to call', function() return a('a','b') end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), 'after', pcall( function() return a() end ) ) + print( type(a), 'after', pcall( function() return a('a') end ) ) + print( type(a), 'after', pcall( function() return a('a','b') end ) ) + print( type(a), 'after', pcall( function() return a('a','b','c') end ) ) + print( type(a), 'after', pcall( function() return a('a','b','c','d') end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __add, __sub, __mul, __div, __pow, __mod' ) +local groups = { {aboolean, aboolean}, {aboolean, athread}, {aboolean, afunction}, {aboolean, "abc"}, {aboolean, atable} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a+b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b+a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a-b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b-a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a*b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b*a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a^b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b^a end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return a%b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to perform arithmetic', function() return b%a end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), type(b), 'after', pcall( function() return a+b end ) ) + print( type(a), type(b), 'after', pcall( function() return b+a end ) ) + print( type(a), type(b), 'after', pcall( function() return a-b end ) ) + print( type(a), type(b), 'after', pcall( function() return b-a end ) ) + print( type(a), type(b), 'after', pcall( function() return a*b end ) ) + print( type(a), type(b), 'after', pcall( function() return b*a end ) ) + print( type(a), type(b), 'after', pcall( function() return a^b end ) ) + print( type(a), type(b), 'after', pcall( function() return b^a end ) ) + print( type(a), type(b), 'after', pcall( function() return a%b end ) ) + print( type(a), type(b), 'after', pcall( function() return b%a end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __len' ) +values = { aboolean, afunction, athread, anumber } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', ecall( 'attempt to get length of ', function() return #a end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), 'after', pcall( function() return #a end ) ) + print( debug.setmetatable( a, amt ) ) +end +-- +print( '---- __neg' ) +values = { aboolean, afunction, athread, "abcd", atable, anumber } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(v), 'before', ecall( 'attempt to perform arithmetic ', function() return -a end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(v), 'after', pcall( function() return -a end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __lt, __le, same types' ) +local bfunction = function() end +local bthread = coroutine.create( bfunction ) +local btable = {} +local groups +groups = { {true, true}, {true, false}, {afunction, bfunction}, {athread, bthread}, {atable, atable}, {atable, btable} } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return ab end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return a>=b end ) ) + print( debug.setmetatable( a, mt ) ) + print( debug.setmetatable( b, mt ) ) + print( type(a), type(b), 'after', pcall( function() return ab end ) ) + print( type(a), type(b), 'after', pcall( function() return a>=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __lt, __le, different types' ) +groups = { {aboolean, athread}, } +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return ab end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to compare', function() return a>=b end ) ) + print( debug.setmetatable( a, mt ) ) + print( debug.setmetatable( b, mt ) ) + print( type(a), type(b), 'after-a', ecall( 'attempt to compare', function() return ab end ) ) + print( type(a), type(b), 'after-a', ecall( 'attempt to compare', function() return a>=b end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __tostring' ) +values = { aboolean, afunction, athread, atable, "abc" } +local strmt = { __tostring=function(a) + return 'mt.__tostring('..type(a)..')' + end, +} +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( debug.setmetatable( a, strmt ) ) + print( type(a), 'after', pcall( function() return ts(a) end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __index, __newindex' ) +values = { aboolean, anumber, afunction, athread } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', ecall( 'attempt to index', function() return a.foo end ) ) + print( type(a), 'before', ecall( 'attempt to index', function() return a[123] end ) ) + print( type(a), 'before', ecall( 'index', function() a.foo = 'bar' end ) ) + print( type(a), 'before', ecall( 'index', function() a[123] = 'bar' end ) ) + print( type(a), 'before', ecall( 'attempt to index', function() return a:foo() end ) ) + print( debug.setmetatable( a, mt ) ) + print( type(a), 'after', pcall( function() return a.foo end ) ) + print( type(a), 'after', pcall( function() return a[123] end ) ) + print( type(a), 'after', pcall( function() a.foo = 'bar' end ) ) + print( type(a), 'after', pcall( function() a[123] = 'bar' end ) ) + print( type(a), 'after', ecall( 'attempt to call', function() return a:foo() end ) ) + print( debug.setmetatable( a, amt ) ) +end + +print( '---- __concat' ) +groups = { {atable, afunction}, {afunction, atable}, {123, nil}, {nil, 123} } +local s,t,u = 'sss',777 +local concatresult = setmetatable( { '__concat-result' }, { + __tostring=function() + return 'concat-string-result' + end } ) +local concatmt = { + __concat=function(a,b) + print( 'mt.__concat('..type(a)..','..type(b)..')', a, b ) + return concatresult + end +} +for i=1,#groups do + local a,b = groups[i][1], groups[i][2] + local amt,bmt = debug.getmetatable(a),debug.getmetatable(b) + print( type(a), type(b), 'before', ecall( 'attempt to concatenate ', function() return a..b end ) ) + print( type(a), type(b), 'before', ecall( 'attempt to concatenate ', function() return b..a end ) ) + print( type(a), type(s), type(t), 'before', ecall( 'attempt to concatenate ', function() return a..s..t end ) ) + print( type(s), type(a), type(t), 'before', ecall( 'attempt to concatenate ', function() return s..a..t end ) ) + print( type(s), type(t), type(a), 'before', ecall( 'attempt to concatenate ', function() return s..t..a end ) ) + print( debug.setmetatable( a, concatmt ) ) + print( type(a), type(b), 'after', pcall( function() return a..b end ) ) + print( type(a), type(b), 'after', pcall( function() return b..a end ) ) + print( type(a), type(s), type(t), 'before', pcall( function() return a..s..t end ) ) + print( type(s), type(a), type(t), 'before', ecall( 'attempt to concatenate ', function() return s..a..t end ) ) + print( type(s), type(t), type(a), 'before', ecall( 'attempt to concatenate ', function() return s..t..a end ) ) + print( debug.setmetatable( a, amt ) ) + print( debug.setmetatable( b, bmt ) ) +end + +print( '---- __metatable' ) +values = { aboolean, afunction, athread, atable, "abc" } +local mtmt = { __metatable={}, } +for i=1,#values do + local a = values[i] + local amt = debug.getmetatable(a) + print( type(a), 'before', pcall( function() return debug.getmetatable(a), getmetatable(a) end ) ) + print( debug.setmetatable( a, mtmt ) ) + print( type(a), 'after', pcall( function() return debug.getmetatable(a), getmetatable(a) end ) ) + print( debug.setmetatable( a, amt ) ) +end diff --git a/luaj-test/src/test/resources/luaj3.0-tests/oslib.lua b/luaj-test/src/test/resources/luaj3.0-tests/oslib.lua new file mode 100644 index 00000000..4ca5da54 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/oslib.lua @@ -0,0 +1,39 @@ +-- simple os-library tests +-- +-- because the nature of the "os" library is to provide os-specific behavior, +-- the compatibility tests must be extremely loose, and can really only +-- compare things like return value type to be meaningful. +-- +-- actual os behavior needs to go in an oslib function test +-- +local pcall = function(...) + local s,e,f = pcall(...) + return s,type(e),type(f) +end +print( 'os', type(os) ) +print( 'os.clock()', pcall( os.clock ) ) +print( 'os.date()', pcall( os.date ) ) +print( 'os.difftime(123000, 21500)', pcall( os.difftime, 123000, 21250 ) ) +print( 'os.getenv()', pcall( os.getenv ) ) +print( 'os.getenv("bogus.key")', pcall( os.getenv, 'bogus.key' ) ) +local s,p = pcall( os.tmpname ) +local s,q = pcall( os.tmpname ) +print( 'os.tmpname()', s, p ) +print( 'os.tmpname()', s, q ) +-- permission denied on windows +--print( 'os.remove(p)', pcall( os.remove, p ) ) +--print( 'os.rename(p,q)', pcall( os.rename, p, q ) ) +local s,f = pcall( io.open, p,"w" ) +print( 'io.open', s, f ) +print( 'write', pcall( f.write, f, "abcdef 12345" ) ) +print( 'close', pcall( f.close, f ) ) +print( 'os.rename(p,q)', pcall( os.rename, p, q ) ) +print( 'os.remove(q)', pcall( os.remove, q ) ) +print( 'os.remove(q)', pcall( os.remove, q ) ) +-- setlocale not supported on jse yet +-- print( 'os.setlocale()', pcall( os.setlocale ) ) +-- print( 'os.setlocale("jp")', pcall( os.setlocale, "jp" ) ) +-- print( 'os.setlocale("us","monetary")', pcall( os.setlocale, "us", "monetary" ) ) +-- print( 'os.setlocale(nil,"all")', pcall( os.setlocale, nil, "all" ) ) +print( 'os.setlocale("C")', pcall( os.setlocale, "C" ) ) +print( 'os.exit', type(os.exit) ) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua b/luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua new file mode 100644 index 00000000..5bf09550 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/stringlib.lua @@ -0,0 +1,189 @@ +print( string.find("1234567890", ".", 0, true) ) +print( string.find( 'alo alx 123 b\0o b\0o', '(..*) %1' ) ) +print( string.find( 'aloALO', '%l*' ) ) +print( string.find( ' \n isto � assim', '%S%S*' ) ) + +print( string.find( "", "" ) ) +print( string.find( "ababaabbaba", "abb" ) ) +print( string.find( "ababaabbaba", "abb", 7 ) ) + +print( string.match( "aabaa", "a*" ) ) +print( string.match( "aabaa", "a*", 3 ) ) +print( string.match( "aabaa", "a*b" ) ) +print( string.match( "aabaa", "a*b", 3 ) ) + +print( string.match( "abbaaababaabaaabaa", "b(a*)b" ) ) + +print( string.match( "abbaaababaabaaabaa", "b(a*)()b" ) ) +print( string.match( "abbaaababaabaaabaa", "b(a*)()b", 3 ) ) +print( string.match( "abbaaababaabaaabaa", "b(a*)()b", 8 ) ) +print( string.match( "abbaaababaabaaabaa", "b(a*)()b", 12 ) ) + +print( string.byte("hi", -3) ) + +print( string.gsub("ABC", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("@123", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123@def", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123@qrs@def@tuv", "@(%x+)", function(s) return "|abcd" end) ) +print( string.gsub("ABC@123@qrs@def@tuv", "@(%x+)", function(s) return "@ab" end) ) + +print( tostring(1234567890123) ) +print( tostring(1234567890124) ) +print( tostring(1234567890125) ) + +function f1(s, p) + print(p) + p = string.gsub(p, "%%([0-9])", function (s) return "%" .. (s+1) end) + print(p) + p = string.gsub(p, "^(^?)", "%1()", 1) + print(p) + p = string.gsub(p, "($?)$", "()%1", 1) + print(p) + local t = {string.match(s, p)} + return string.sub(s, t[1], t[#t] - 1) +end + +print( pcall( f1, 'alo alx 123 b\0o b\0o', '(..*) %1' ) ) + +local function badpat() + print( string.gsub( "alo", "(.)", "%2" ) ) +end + +print( ( pcall( badpat ) ) ) + +for k, v in string.gmatch("w=200&h=150", "(%w+)=(%w+)") do + print(k, v) +end + +-- string.sub +function t(str) + local i = { 0, 1, 2, 8, -1 } + for ki,vi in ipairs(i) do + local s,v = pcall( string.sub, str, vi ) + print( 'string.sub("'..str..'",'..tostring(vi)..')='..tostring(s)..',"'..tostring(v)..'"' ) + local j = { 0, 1, 2, 4, 8, -1 } + for kj,vj in ipairs(j) do + local s,v = pcall( string.sub, str, vi, vj ) + print( 'string.sub("'..str..'",'..tostring(vi)..','..tostring(vj)..')='..tostring(s)..',"'..tostring(v)..'"' ) + end + end +end +t( 'abcdefghijklmn' ) +t( 'abcdefg' ) +t( 'abcd' ) +t( 'abc' ) +t( 'ab' ) +t( 'a' ) +t( '' ) + +print(string.len("Hello, world")) +print(#"Hello, world") +print(string.len("\0\0\0")) +print(#"\0\0\0") +print(string.len("\0\1\2\3")) +print(#"\0\1\2\3") +local s = "My JaCk-O-lAnTeRn CaSe TeXt" +print(s, string.len(s), #s) + + +-- string.format +print(string.format("(%.0d) (%.0d) (%.0d)", 0, -5, 9)) +print(string.format("(%.1d) (%.1d) (%.1d)", 0, -5, 9)) +print(string.format("(%.2d) (%.2d) (%.2d)", 0, -5, 9)) + +print(string.format("(%+.0d) (%+.0d) (%+.0d)", 0, -5, 9)) +print(string.format("(%+.1d) (%+.1d) (%+.1d)", 0, -5, 9)) +print(string.format("(%+.2d) (%+.2d) (%+.2d)", 0, -5, 9)) + +print(string.format("(%+3d) (% 3d) (%+ 3d)", 55, 55, 55)) + +print(string.format("(%-1d) (%-1d) (%-1d)", 1, 12, -12)) +print(string.format("(%-2d) (%-2d) (%-2d)", 1, 12, -12)) +print(string.format("(%-3d) (%-3d) (%-3d)", 1, 12, -12)) + + +print(string.format("(%8x) (%8d) (%8o)", 255, 255, 255)) +print(string.format("(%08x) (%08d) (%08o)", 255, 255, 255)) + +print(string.format("simple%ssimple", " simple ")) + +local testformat = function(message,fmt,...) + local s,e = pcall( string.format, fmt, ... ) + if s then + if string.find(fmt, 'q') then + print(message, e) + end + print( message, string.byte(e,1,#e) ) + else + print( message, 'error', e ) + end +end + +testformat('plain %', "%%") +testformat("specials (%s)", "---%s---", " %% \000 \r \n ") +testformat("specials (%q)", "---%q---", " %% \000 \r \n ") +testformat("specials (%q)", "---%q---", "0%%0\0000\r0\n0") +testformat("controls (%q)", "---%q---", ' \a \b \f \t \v \\ ') +testformat("controls (%q)", "---%q---", '0\a0\b0\f0\t0\v0\\0') +testformat("extended (%q)", "---%q---", ' \222 \223 \224 ') +testformat("extended (%q)", "---%q---", '0\2220\2230\2240') +testformat("embedded newlines", "%s\r%s\n%s", '===', '===', '===') + +-- format long string +print("this is a %s long string", string.rep("really, ", 30)) + +local function pc(...) + local s,e = pcall(...) + return s and e or 'false-'..type(e) +end + +local function strtests(name,func,...) + print(name, 'good', pc( func, ... ) ) + print(name, 'empty', pc( func ) ) + print(name, 'table', pc( func, {} ) ) + print(name, 'nil', pc( func, nil ) ) +end + +strtests('lower', string.lower, s ) +strtests('upper', string.upper, s ) +strtests('reverse', string.reverse, s ) +strtests('char', string.char, 92, 60, 61, 93 ) +print( 'string.dump test:', load(string.dump(function(x) return 'foo->'..x end),'bar')('bat') ) + + +-- floating point formats (not supported yet) +--[==[ +local prefixes = {'','+','-'} +local lengths = {'7','2','0','1',''} +local letters = {'f','e','g'} +local fmt, spec, desc +for i,letter in ipairs(letters) do + for k,before in ipairs(lengths) do + for j,prefix in ipairs(prefixes) do + spec = '(%'..prefix..before..letter..')' + fmt = spec..'\t'..spec..'\t'..spec..'\t'..spec..'\t'..spec..'\t'..spec + print(spec, string.format(fmt, 12.34, -12.34, 1/11, -1/11, 300/11, -300/11) ) + for l,after in ipairs(lengths) do + spec = '(%'..prefix..before..'.'..after..letter..')' + fmt = spec..' '..spec..' '..spec..' '..spec..' '..spec..' '..spec + print(spec, string.format(fmt, 12.34, -12.34, 1/11, -1/11, 300/11, -300/11) ) + end + end + end +end +--]==] + +local function fmterr(...) + local r, s = pcall(...) + if r then + return s + else + s = string.gsub(s, "stdin:%d+:%s*", "") + return s + end +end + +print(fmterr(string.find, "ab%c)0(", "%")) +print(fmterr(string.find, "ab%c)0(", "(")) +print(pcall(string.find, "ab%c)0(", ")")) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua b/luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua new file mode 100644 index 00000000..8f99ca71 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/tablelib.lua @@ -0,0 +1,284 @@ +local func = function(t,...) + return (...) +end +local tbl = setmetatable({},{__index=func}) +print( tbl[2] ) + + +-- 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 + +local t = { "one", "two", "three", a='aaa', b='bbb', c='ccc' } + +table.insert(t,'six'); +table.insert(t,1,'seven'); +table.insert(t,4,'eight'); +table.insert(t,7,'nine'); +table.insert(t,10,'ten'); print( #t ) + +-- concat +print( '-- concat tests' ) +function tryconcat(t) + print( table.concat(t) ) + print( table.concat(t,'--') ) + print( table.concat(t,',',2) ) + print( table.concat(t,',',2,2) ) + print( table.concat(t,',',5,2) ) +end +tryconcat( { "one", "two", "three", a='aaa', b='bbb', c='ccc' } ) +tryconcat( { "one", "two", "three", "four", "five" } ) +function tryconcat(t) + print( table.concat(t) ) + print( table.concat(t,'--') ) + print( table.concat(t,',',2) ) +end +tryconcat( { a='aaa', b='bbb', c='ccc', d='ddd', e='eee' } ) +tryconcat( { [501]="one", [502]="two", [503]="three", [504]="four", [505]="five" } ) +tryconcat( {} ) + +-- print the elements of a table in a platform-independent way +function eles(t,f) + f = f or pairs + all = {} + for k,v in f(t) do + table.insert( all, "["..tostring(k).."]="..tostring(v) ) + end + table.sort( all ) + return "{"..table.concat(all,',').."}" +end + +-- insert, len +print( '-- insert, len tests' ) +local t = { "one", "two", "three", a='aaa', b='bbb', c='ccc' } + +print( eles(t), #t ) +table.insert(t,'six'); print( eles(t), #t ) +table.insert(t,1,'seven'); print( eles(t), #t ) +table.insert(t,4,'eight'); print( eles(t), #t ) +table.insert(t,7,'nine'); print( eles(t), #t ) +table.insert(t,10,'ten'); print( eles(t), #t ) +print( '#{}', #{} ) +print( '#{"a"}', #{"a"} ) +print( '#{"a","b"}', #{"a","b"} ) +print( '#{"a",nil}', #{"a",nil} ) +print( '#{nil,nil}', #{nil,nil} ) +print( '#{nil,"b"}', #{nil,"b"}==0 or #{nil,"b"}==2 ) +print( '#{"a","b","c"}', #{"a","b","c"} ) +print( '#{"a","b",nil}', #{"a","b",nil} ) +print( '#{"a",nil,nil}', #{"a",nil,nil} ) +print( '#{nil,nil,nil}', #{nil,nil,nil} ) +print( '#{nil,nil,"c"}', #{nil,nil,"c"}==0 or #{nil,nil,"c"}==3 ) +print( '#{nil,"b","c"}', #{nil,"b","c"}==0 or #{nil,"b","c"}==3 ) +print( '#{nil,"b",nil}', #{nil,"b",nil}==0 or #{nil,"b",nil}==2 ) +print( '#{"a",nil,"c"}', #{"a",nil,"c"}==1 or #{"a",nil,"c"}==3 ) + +-- remove +print( '-- remove tests' ) +t = { "one", "two", "three", "four", "five", "six", "seven", [10]="ten", a='aaa', b='bbb', c='ccc' } +print( eles(t), #t ) +print( 'table.remove(t)', table.remove(t) ); print( eles(t), #t ) +print( 'table.remove(t,1)', table.remove(t,1) ); print( eles(t), #t ) +print( 'table.remove(t,3)', table.remove(t,3) ); print( eles(t), #t ) +print( 'table.remove(t,5)', table.remove(t,5) ); print( eles(t), #t ) +print( 'table.remove(t,10)', table.remove(t,10) ); print( eles(t), #t ) +print( 'table.remove(t,-1)', table.remove(t,-1) ); print( eles(t), #t ) +print( 'table.remove(t,-1)', table.remove(t,-1) ) ; print( eles(t), #t ) + +-- sort +print( '-- sort tests' ) +function sorttest(t,f) + t = (t) + print( table.concat(t,'-') ) + if f then + table.sort(t,f) + else + table.sort(t) + end + print( table.concat(t,'-') ) +end +sorttest{ "one", "two", "three" } +sorttest{ "www", "vvv", "uuu", "ttt", "sss", "zzz", "yyy", "xxx" } +sorttest( { "www", "vvv", "uuu", "ttt", "sss", "zzz", "yyy", "xxx" }, function(a,b) return b0, returning f2(n-1,n,...)", n-1,n,... ) + return f2(n-1,n,...) +end + +local function f3(n,...) + if n <= 0 then + return sum(...) + end + print( " f3,n-1,n,...", f3,n-1,n,... ) + return pcall(f3,n-1,n,...) +end + +local function all(f) + for n=0,3 do + t = {} + for m=1,5 do + print( "--f, n, table.unpack(t)", f, n, table.unpack(t) ) + print( pcall( f, n, table.unpack(t)) ) + t[m] = m + end + end +end + +all(f1) +all(f2) +all(f3) + + +local function f(x) + -- tailcall to a builtin + return math.abs(x) +end + +local function factorial(i) + local function helper(product, n) + if n <= 0 then + return product + else + -- tail call to a nested Lua function + return helper(n * product, n - 1) + end + end + return helper(1, i) +end + +local result1 = factorial(5) +print(result1) +print(factorial(5)) + +local result2 = f(-1234) +print( result2 ) + +local function fib_bad(n) + local function helper(i, a, b) + if i >= n then + return a + else + -- not recognized by luac as a tailcall! + local result = helper(i + 1, b, a + b) + return result + end + end + return helper(1, 1, 1) +end + +local function fib_good(n) + local function helper(i, a, b) + if i >= n then + return a + else + -- must be a tail call! + return helper(i + 1, b, a + b) + end + end + return helper(1, 1, 1) +end + +local aliases = { + ['1.#INF'] = 'inf', + ['-1.#INF'] = '-inf', + ['1.#IND'] = 'nan', + ['-1.#IND'] = 'nan', +} + +local p = function( s,e ) + print( s, e and aliases[tostring(e)] or e ) +end +p(pcall(fib_bad, 30)) +--p((pcall(fib_bad, 25000))) +p(pcall(fib_good, 30)) +p(pcall(fib_good, 25000)) + +local function fib_all(n, i, a, b) + i = i or 1 + a = a or 1 + b = b or 1 + if i >= n then + return + else + return a, fib_all(n, i+1, b, a+b) + end +end + +print(fib_all(10)) diff --git a/luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua b/luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua new file mode 100644 index 00000000..2c263dd8 --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/upvalues.lua @@ -0,0 +1,97 @@ + +print( '-------- simple upvalues tests --------' ) +local function simpleupvalues() + function test() + local x = 5 + function f() + x = x + 1 + return x + end + function g() + x = x - 1 + return x + end + print(f()) + print(g()) + return f, g + end + + f1, g1 = test() + print("f1()=", f1()) + print("g1()=", g1()) + + f2, g2 = test() + print("f2()=", f2()) + print("g2()=", g2()) + + print("g1()=", g1()) + print("f1()=", f1()) +end +print( 'simplevalues result:', pcall( simpleupvalues ) ) + + +-- The point of this test is that when an upvalue is created, it may +-- need to be inserted in the middle of the list, rather than always +-- appended at the end. Otherwise, it may not be found when it is +-- needed by another closure. +print( '----------- upvalued in middle ------------' ) +local function middleupvaluestest() + local function test() + local x = 3 + local y = 5 + local z = 7 + + local function f() + print("y=", y) + end + + local function g() + print("z=", z) + end + + local function h() + print("x=", x) + end + + local function setter(x1, y1, z1) + x = x1 + y = y1 + z = z1 + end + + return f, g, h, setter + end + + local f, g, h, setter = test() + + h() + f() + g() + + setter("x", "y", "z") + + h() + f() + g() +end +print( pcall( middleupvaluestest ) ) + + +print( '--------- nested upvalues ----------' ) +local function nestedupvaluestest() + local f + do + local x = 10 + function g() + print(x, f()) + end + end + + function f() + return 20 + end + + g() +end +print( 'nestedupvaluestest result:', pcall( nestedupvaluestest ) ) + diff --git a/luaj-test/src/test/resources/luaj3.0-tests/vm.lua b/luaj-test/src/test/resources/luaj3.0-tests/vm.lua new file mode 100644 index 00000000..25e13bec --- /dev/null +++ b/luaj-test/src/test/resources/luaj3.0-tests/vm.lua @@ -0,0 +1,250 @@ + +print( '-------- basic vm tests --------' ) + +print( '-- boolean tests' ) +local function booleantests() + t = true + f = false + n = nil + s = "Hello" + z = 0 + one = 1 + + print(t) + print(f) + + print(not t) + print(not f) + print(not n) + print(not z) + print(not s) + print(not(not(t))) + print(not(not(z))) + print(not(not(n))) + + print(t and f) + print(t or f) + print(f and t) + print(f or t) + + print(f or one) + print(f or z) + print(f or n) + + print(t and one) + print(t and z) + print(t and n) +end +print( 'booleantests result:', pcall( booleantests ) ) + + +print( '------------- varargs' ) +local function varargstest() + function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) + end + function q(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg.n,arg[1],arg[2],arg[3]) + end + function r(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg.n,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) + end + function s(a) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + end + function t(a,...) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) + end + function u(arg) + print( 'arg', arg ) + end + function v(arg,...) + print( 'arg', arg ) + print("...",...) + print("arg,...",arg,...) + end + arg = { "global-1", "global-2", "global-3" } + function tryall(f,name) + print( '---- function '..name..'()' ) + print( '--'..name..'():' ) + print( ' ->', pcall( f ) ) + print( '--'..name..'("q"):' ) + print( ' ->', pcall( f, "q" ) ) + print( '--'..name..'("q","r"):' ) + print( ' ->', pcall( f, "q", "r" ) ) + print( '--'..name..'("q","r","s"):' ) + print( ' ->', pcall( f, "q", "r", "s" ) ) + end + tryall(p,'p') + tryall(q,'q') + tryall(r,'r') + tryall(s,'s') + tryall(t,'t') + tryall(u,'u') + tryall(v,'v') +end +print( 'varargstest result:', pcall( varargstest ) ) + +-- The purpose of this test case is to demonstrate that +-- basic metatable operations on non-table types work. +-- i.e. that s.sub(s,...) could be used in place of string.sub(s,...) +print( '---------- metatable tests' ) +local function metatabletests() + + -- 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 + local results = function(s,e,...) + if s then return e,... end + return false,type(e) + end + local pcall = function(...) + return results( pcall(...) ) + end + + + local s = "hello" + print(s:sub(2,4)) + + local t = {} + function op(name,...) + local a,b = pcall( setmetatable, t, ... ) + print( name, t, getmetatable(t), a, b ) + end + op('set{} ',{}) + op('set-nil',nil) + op('set{} ',{}) + op('set') + op('set{} ',{}) + op('set{} ',{}) + op('set{}{}',{},{}) + op('set-nil',nil) + op('set{__}',{__metatable={}}) + op('set{} ',{}) + op('set-nil',nil) + t = {} + op('set{} ',{}) + op('set-nil',nil) + op('set{__}',{__metatable='abc'}) + op('set{} ',{}) + op('set-nil',nil) + + + local i = 1234 + local t = setmetatable( {}, { + __mode="v", + __index=function(t,k) + local v = i + i = i + 1 + rawset(t,k,v) + return v + end, + } ) + + local l = { 'a', 'b', 'a', 'b', 'c', 'a', 'b', 'c', 'd' } + for i,key in ipairs(l) do + print( 't.'..key, t[key] ) + end +end +print( 'metatabletests result:', pcall( metatabletests ) ) + +-- test tables with more than 50 elements +print( '------------ huge tables' ) +local function hugetables() + local t = { 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, + } + print ("#t=",#t,'t[1,50,51,59]', t[1], t[50], t[51], t[59]) + print (table.concat(t,',')) + + local t2= { 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, + } + + print ("#t2=",#t2,'t[1,50,51,59]', t[1], t[50], t[51], t[59]) + print (table.concat(t2,',')) + + local t = { + [2000]='a', [2001]='b', [2002]='c', [2003]='d', [2004]='e', [2005]='f', [2006]='g', [2007]='h', [2008]='i', [2009]='j', + [3000]='a', [3001]='b', [3002]='c', [3003]='d', [3004]='e', [3005]='f', [3006]='g', [3007]='h', [3008]='i', [3009]='j', + [4000]='a', [4001]='b', [4002]='c', [4003]='d', [4004]='e', [4005]='f', [4006]='g', [4007]='h', [4008]='i', [4009]='j', + [5000]='a', [5001]='b', [5002]='c', [5003]='d', [5004]='e', [5005]='f', [5006]='g', [5007]='h', [5008]='i', [5009]='j', + [6000]='a', [6001]='b', [6002]='c', [6003]='d', [6004]='e', [6005]='f', [6006]='g', [6007]='h', [6008]='i', [6009]='j', + [7000]='a', [7001]='b', [7002]='c', [7003]='d', [7004]='e', [7005]='f', [7006]='g', [7007]='h', [7008]='i', [7009]='j', + [8000]='a', [8001]='b', [8002]='c', [8003]='d', [8004]='e', [8005]='f', [8006]='g', [8007]='h', [8008]='i', [8009]='j', + } + + for i=2000,8000,1000 do + for j=0,9,1 do + print( 't['..tostring(i+j)..']', t[i+j] ) + end + end +end +print( 'hugetables result:', pcall( hugetables ) ) + +print( '--------- many locals' ) +local function manylocals() + -- test program with more than 50 non-sequential integer elements + local t0000='a'; local t0001='b'; local t0002='c'; local t0003='d'; local t0004='e'; local t0005='f'; local t0006='g'; local t0007='h'; local t0008='i'; local t0009='j'; + local t1000='a'; local t1001='b'; local t1002='c'; local t1003='d'; local t1004='e'; local t1005='f'; local t1006='g'; local t1007='h'; local t1008='i'; local t1009='j'; + local t2000='a'; local t2001='b'; local t2002='c'; local t2003='d'; local t2004='e'; local t2005='f'; local t2006='g'; local t2007='h'; local t2008='i'; local t2009='j'; + local t3000='a'; local t3001='b'; local t3002='c'; local t3003='d'; local t3004='e'; local t3005='f'; local t3006='g'; local t3007='h'; local t3008='i'; local t3009='j'; + local t4000='a'; local t4001='b'; local t4002='c'; local t4003='d'; local t4004='e'; local t4005='f'; local t4006='g'; local t4007='h'; local t4008='i'; local t4009='j'; + local t5000='a'; local t5001='b'; local t5002='c'; local t5003='d'; local t5004='e'; local t5005='f'; local t5006='g'; local t5007='h'; local t5008='i'; local t5009='j'; + local t6000='a'; local t6001='b'; local t6002='c'; local t6003='d'; local t6004='e'; local t6005='f'; local t6006='g'; local t6007='h'; local t6008='i'; local t6009='j'; + local t7000='a'; local t7001='b'; local t7002='c'; local t7003='d'; local t7004='e'; local t7005='f'; local t7006='g'; local t7007='h'; local t7008='i'; local t7009='j'; + local t8000='a'; local t8001='b'; local t8002='c'; local t8003='d'; local t8004='e'; local t8005='f'; local t8006='g'; local t8007='h'; local t8008='i'; local t8009='j'; + local t9000='a'; local t9001='b'; local t9002='c'; local t9003='d'; local t9004='e'; local t9005='f'; local t9006='g'; local t9007='h'; local t9008='i'; local t9009='j'; + local t10000='a'; local t10001='b'; local t10002='c'; local t10003='d'; local t10004='e'; local t10005='f'; local t10006='g'; local t10007='h'; local t10008='i'; local t10009='j'; + local t11000='a'; local t11001='b'; local t11002='c'; local t11003='d'; local t11004='e'; local t11005='f'; local t11006='g'; local t11007='h'; local t11008='i'; local t11009='j'; + local t12000='a'; local t12001='b'; local t12002='c'; local t12003='d'; local t12004='e'; local t12005='f'; local t12006='g'; local t12007='h'; local t12008='i'; local t12009='j'; + local t13000='a'; local t13001='b'; local t13002='c'; local t13003='d'; local t13004='e'; local t13005='f'; local t13006='g'; local t13007='h'; local t13008='i'; local t13009='j'; + + -- print the variables + print(t0000,'a'); print(t0001,'b'); print(t0002,'c'); print(t0003,'d'); print(t0004,'e'); print(t0005,'f'); print(t0006,'g'); print(t0007,'h'); print(t0008,'i'); print(t0009,'j'); + print(t1000,'a'); print(t1001,'b'); print(t1002,'c'); print(t1003,'d'); print(t1004,'e'); print(t1005,'f'); print(t1006,'g'); print(t1007,'h'); print(t1008,'i'); print(t1009,'j'); + print(t2000,'a'); print(t2001,'b'); print(t2002,'c'); print(t2003,'d'); print(t2004,'e'); print(t2005,'f'); print(t2006,'g'); print(t2007,'h'); print(t2008,'i'); print(t2009,'j'); + print(t3000,'a'); print(t3001,'b'); print(t3002,'c'); print(t3003,'d'); print(t3004,'e'); print(t3005,'f'); print(t3006,'g'); print(t3007,'h'); print(t3008,'i'); print(t3009,'j'); + print(t4000,'a'); print(t4001,'b'); print(t4002,'c'); print(t4003,'d'); print(t4004,'e'); print(t4005,'f'); print(t4006,'g'); print(t4007,'h'); print(t4008,'i'); print(t4009,'j'); + print(t5000,'a'); print(t5001,'b'); print(t5002,'c'); print(t5003,'d'); print(t5004,'e'); print(t5005,'f'); print(t5006,'g'); print(t5007,'h'); print(t5008,'i'); print(t5009,'j'); + print(t6000,'a'); print(t6001,'b'); print(t6002,'c'); print(t6003,'d'); print(t6004,'e'); print(t6005,'f'); print(t6006,'g'); print(t6007,'h'); print(t6008,'i'); print(t6009,'j'); + print(t7000,'a'); print(t7001,'b'); print(t7002,'c'); print(t7003,'d'); print(t7004,'e'); print(t7005,'f'); print(t7006,'g'); print(t7007,'h'); print(t7008,'i'); print(t7009,'j'); + print(t8000,'a'); print(t8001,'b'); print(t8002,'c'); print(t8003,'d'); print(t8004,'e'); print(t8005,'f'); print(t8006,'g'); print(t8007,'h'); print(t8008,'i'); print(t8009,'j'); + print(t9000,'a'); print(t9001,'b'); print(t9002,'c'); print(t9003,'d'); print(t9004,'e'); print(t9005,'f'); print(t9006,'g'); print(t9007,'h'); print(t9008,'i'); print(t9009,'j'); + print(t10000,'a'); print(t10001,'b'); print(t10002,'c'); print(t10003,'d'); print(t10004,'e'); print(t10005,'f'); print(t10006,'g'); print(t10007,'h'); print(t10008,'i'); print(t10009,'j'); + print(t11000,'a'); print(t11001,'b'); print(t11002,'c'); print(t11003,'d'); print(t11004,'e'); print(t11005,'f'); print(t11006,'g'); print(t11007,'h'); print(t11008,'i'); print(t11009,'j'); + print(t12000,'a'); print(t12001,'b'); print(t12002,'c'); print(t12003,'d'); print(t12004,'e'); print(t12005,'f'); print(t12006,'g'); print(t12007,'h'); print(t12008,'i'); print(t12009,'j'); + print(t13000,'a'); print(t13001,'b'); print(t13002,'c'); print(t13003,'d'); print(t13004,'e'); print(t13005,'f'); print(t13006,'g'); print(t13007,'h'); print(t13008,'i'); print(t13009,'j'); +end +print( 'manylocals result:', pcall( manylocals ) ) diff --git a/luaj-test/src/test/resources/perf/binarytrees.out b/luaj-test/src/test/resources/perf/binarytrees.out new file mode 100644 index 00000000..72654db9 --- /dev/null +++ b/luaj-test/src/test/resources/perf/binarytrees.out @@ -0,0 +1,4 @@ +stretch tree of depth 7 check: -1 +128 trees of depth 4 check: -128 +32 trees of depth 6 check: -32 +long lived tree of depth 6 check: -1 diff --git a/luaj-test/src/test/resources/perf/fannkuch.out b/luaj-test/src/test/resources/perf/fannkuch.out new file mode 100644 index 00000000..3ae262f1 --- /dev/null +++ b/luaj-test/src/test/resources/perf/fannkuch.out @@ -0,0 +1,2 @@ +1 +Pfannkuchen(1) = 0 diff --git a/luaj-test/src/test/resources/perf/nbody.out b/luaj-test/src/test/resources/perf/nbody.out new file mode 100644 index 00000000..1731557c --- /dev/null +++ b/luaj-test/src/test/resources/perf/nbody.out @@ -0,0 +1,2 @@ +-0.169075164 +-0.169087605 diff --git a/luaj-test/src/test/resources/perf/nsieve.out b/luaj-test/src/test/resources/perf/nsieve.out new file mode 100644 index 00000000..bbcb938c --- /dev/null +++ b/luaj-test/src/test/resources/perf/nsieve.out @@ -0,0 +1,3 @@ +Primes up to 20000 2262 +Primes up to 10000 1229 +Primes up to 5000 669 diff --git a/luaj-test/src/test/resources/regressions-mingw/bigattr.lua b/luaj-test/src/test/resources/regressions-mingw/bigattr.lua new file mode 100644 index 00000000..48902056 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/bigattr.lua @@ -0,0 +1,2 @@ +a = {} +a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12; diff --git a/luaj-test/src/test/resources/regressions-mingw/comparators.lua b/luaj-test/src/test/resources/regressions-mingw/comparators.lua new file mode 100644 index 00000000..a60f4c0e --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/comparators.lua @@ -0,0 +1,3 @@ +while i ~= f do + i,v = next(self, i) +end diff --git a/luaj-test/src/test/resources/regressions-mingw/construct.lua b/luaj-test/src/test/resources/regressions-mingw/construct.lua new file mode 100644 index 00000000..de4ff406 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/construct.lua @@ -0,0 +1 @@ +x = {f'alo'} diff --git a/luaj-test/src/test/resources/regressions-mingw/controlchars.lua b/luaj-test/src/test/resources/regressions-mingw/controlchars.lua new file mode 100644 index 00000000..d53fb3b7 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/controlchars.lua @@ -0,0 +1,2 @@ +print( '\a\n >>> testC not active: skipping API tests <<<\n\a' ) +print( '\a\b\f\n\r\v\\\'\"' ) \ No newline at end of file diff --git a/luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua b/luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua new file mode 100644 index 00000000..c83201b6 --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/mathrandomseed.lua @@ -0,0 +1 @@ +math.randomseed(0) diff --git a/luaj-test/src/test/resources/regressions-mingw/modulo.lua b/luaj-test/src/test/resources/regressions-mingw/modulo.lua new file mode 100644 index 00000000..b0203a3b --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/modulo.lua @@ -0,0 +1,4 @@ +a=4%3 +b=-4%3 +c=4%-3 +d=-4%-3 diff --git a/luaj-test/src/test/resources/regressions-mingw/varargs.lua b/luaj-test/src/test/resources/regressions-mingw/varargs.lua new file mode 100644 index 00000000..2d0d04bb --- /dev/null +++ b/luaj-test/src/test/resources/regressions-mingw/varargs.lua @@ -0,0 +1,29 @@ +function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function q(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) +end +function r(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function s(a) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) +end +function t(a,...) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end diff --git a/luaj-test/src/test/resources/regressions/bigattr.lc b/luaj-test/src/test/resources/regressions/bigattr.lc new file mode 100644 index 00000000..fd8c2561 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/bigattr.lc differ diff --git a/luaj-test/src/test/resources/regressions/bigattr.lua b/luaj-test/src/test/resources/regressions/bigattr.lua new file mode 100644 index 00000000..48902056 --- /dev/null +++ b/luaj-test/src/test/resources/regressions/bigattr.lua @@ -0,0 +1,2 @@ +a = {} +a[2^31] = 10; a[2^31+1] = 11; a[-2^31] = 12; diff --git a/luaj-test/src/test/resources/regressions/comparators.lc b/luaj-test/src/test/resources/regressions/comparators.lc new file mode 100644 index 00000000..45fdb875 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/comparators.lc differ diff --git a/luaj-test/src/test/resources/regressions/comparators.lua b/luaj-test/src/test/resources/regressions/comparators.lua new file mode 100644 index 00000000..a60f4c0e --- /dev/null +++ b/luaj-test/src/test/resources/regressions/comparators.lua @@ -0,0 +1,3 @@ +while i ~= f do + i,v = next(self, i) +end diff --git a/luaj-test/src/test/resources/regressions/construct.lc b/luaj-test/src/test/resources/regressions/construct.lc new file mode 100644 index 00000000..3e6334d9 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/construct.lc differ diff --git a/luaj-test/src/test/resources/regressions/construct.lua b/luaj-test/src/test/resources/regressions/construct.lua new file mode 100644 index 00000000..de4ff406 --- /dev/null +++ b/luaj-test/src/test/resources/regressions/construct.lua @@ -0,0 +1 @@ +x = {f'alo'} diff --git a/luaj-test/src/test/resources/regressions/controlchars.lc b/luaj-test/src/test/resources/regressions/controlchars.lc new file mode 100644 index 00000000..7c1315e6 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/controlchars.lc differ diff --git a/luaj-test/src/test/resources/regressions/controlchars.lua b/luaj-test/src/test/resources/regressions/controlchars.lua new file mode 100644 index 00000000..d53fb3b7 --- /dev/null +++ b/luaj-test/src/test/resources/regressions/controlchars.lua @@ -0,0 +1,2 @@ +print( '\a\n >>> testC not active: skipping API tests <<<\n\a' ) +print( '\a\b\f\n\r\v\\\'\"' ) \ No newline at end of file diff --git a/luaj-test/src/test/resources/regressions/mathrandomseed.lc b/luaj-test/src/test/resources/regressions/mathrandomseed.lc new file mode 100644 index 00000000..d7c4e7a1 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/mathrandomseed.lc differ diff --git a/luaj-test/src/test/resources/regressions/mathrandomseed.lua b/luaj-test/src/test/resources/regressions/mathrandomseed.lua new file mode 100644 index 00000000..c83201b6 --- /dev/null +++ b/luaj-test/src/test/resources/regressions/mathrandomseed.lua @@ -0,0 +1 @@ +math.randomseed(0) diff --git a/luaj-test/src/test/resources/regressions/modulo.lc b/luaj-test/src/test/resources/regressions/modulo.lc new file mode 100644 index 00000000..d3149b32 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/modulo.lc differ diff --git a/luaj-test/src/test/resources/regressions/modulo.lua b/luaj-test/src/test/resources/regressions/modulo.lua new file mode 100644 index 00000000..b0203a3b --- /dev/null +++ b/luaj-test/src/test/resources/regressions/modulo.lua @@ -0,0 +1,4 @@ +a=4%3 +b=-4%3 +c=4%-3 +d=-4%-3 diff --git a/luaj-test/src/test/resources/regressions/varargs.lc b/luaj-test/src/test/resources/regressions/varargs.lc new file mode 100644 index 00000000..4f859864 Binary files /dev/null and b/luaj-test/src/test/resources/regressions/varargs.lc differ diff --git a/luaj-test/src/test/resources/regressions/varargs.lua b/luaj-test/src/test/resources/regressions/varargs.lua new file mode 100644 index 00000000..2d0d04bb --- /dev/null +++ b/luaj-test/src/test/resources/regressions/varargs.lua @@ -0,0 +1,29 @@ +function p(a,...) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function q(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) +end +function r(a,...) + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end +function s(a) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) +end +function t(a,...) + local arg = { '1', '2', '3' } + print("a,arg[1],arg[2],arg[3]",a,arg[1],arg[2],arg[3]) + print("a",a) + print("...",...) + print("...,a",...,a) + print("a,...",a,...) +end diff --git a/luaj-test/test/lua/luaj3.0-tests.zip b/luaj-test/test/lua/luaj3.0-tests.zip deleted file mode 100644 index 40b70f02..00000000 Binary files a/luaj-test/test/lua/luaj3.0-tests.zip and /dev/null differ diff --git a/luaj-test/test/lua/repack.sh b/luaj-test/test/lua/repack.sh deleted file mode 100644 index ffece46c..00000000 --- a/luaj-test/test/lua/repack.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -# -# unpack the luaj test archive, compile and run it locally, and repack the results - -# unzip existing archive -unzip -n luaj3.0-tests.zip -rm *.lc *.out */*.lc */*.out - -# compile tests for compiler and save binary files -for DIR in "lua5.2.1-tests" "regressions"; do - cd ${DIR} - FILES=`ls -1 *.lua | awk 'BEGIN { FS="." } ; { print $1 }'` - for FILE in $FILES ; do - echo 'compiling' `pwd` $FILE - luac ${FILE}.lua - mv luac.out ${FILE}.lc - done - cd .. -done - -# run test lua scripts and save output -for DIR in "errors" "perf" "."; do - cd ${DIR} - FILES=`ls -1 *.lua | awk 'BEGIN { FS="." } ; { print $1 }'` - for FILE in $FILES ; do - echo 'executing' `pwd` $FILE - lua ${FILE}.lua JSE > ${FILE}.out - done - cd .. -done -cd lua - -# create new zipfile -rm -f luaj3.0-tests.zip regressions -zip luaj3.0-tests.zip *.lua *.lc *.out */*.lua */*.lc */*.out - -# cleanup -rm *.out */*.lc */*.out -rm -r lua5.2.1-tests